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
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: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 withcurl or reimplement the flow
in another language.
pull
Without --lang, pull first resolves the project’s language list:
environment is only sent when --env is passed.
push
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
{ "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
- Bring data in via Import Translations
- Wire raw API calls instead in Integration Examples