Skip to main content
The lingulink CLI wraps the public REST API for the common developer loop — pull translations into your repo, push updates back, and gate CI on coverage. It ships no logic of its own beyond transport; every command calls the same public API documented in this section — GET /api/v1/pull and POST /api/v1/push are named to match the pull and push commands directly.

Install

Or run it without installing:

Setup

Create an API key from the dashboard (API Keys) with the scopes your workflow needs. Don’t know your project’s UUID? List every project your key’s organization owns:
Then initialize a config in your project:
This writes lingulink.json to the current directory:
{language} in paths.pull is replaced per locale when pulling. Set LINGULINK_API_URL to target a non-default deployment.

Required scopes

Scopes are checked literally — admin does not implicitly grant them, so select every scope the command needs when creating the key. See API Keys for the full scope list.

Commands

push accepts JSON files only. Nested objects are flattened into dot-separated keys ({"auth":{"title":"Sign in"}} imports as auth.title); avoid null and array values in files you push — see Import Translations for the exact semantics.

Underlying API Requests

Every command is a thin wrapper around the public API — useful if you need to reproduce a call with curl or reimplement the flow in another language.

pull

Without --lang, pull first resolves the project’s language list:
Then, per language:
environment is only sent when --env is passed.

push

With dryRun: true, the response is an immediate preview — { "dryRun": true, "rowCount", "toCreate", "toUpdate" } — and no job is created. Otherwise it’s 202 Accepted with { "jobId", "runId" }, and the CLI polls the job until it leaves pending/running:

status

Returns { "data": { "projectName", "baseLanguage", "referenceKeyCount", "locales": [{ "language", "coveragePercent", "missingCount", ... }] } }status --min fails the command if any locale’s coveragePercent falls below the threshold.

CI usage

status --min is the building block for a coverage gate:

Exit codes

Next Steps