REST v1

API reference

135 endpoints across 18 resources. Every entry below is generated from the route handlers themselves, including the permission each one enforces — so this page cannot drift from what the server actually does.

Base URL https://rialingo.cloud. Send Authorization: Bearer <token> and, when you are not using a tenant subdomain, X-Tenant: <slug>. Errors are RFC 7807 problem documents.

How the pieces fit

A tenant owns projects. A project owns keys, each carrying one translation per enabled language. Keys live on a branch; releases group them for shipping; an export turns the published result into an immutable bundle in object storage.

Authenticate

API tokens inherit the issuing user's permissions, intersected with the scopes declared at creation. Each endpoint below lists the permission it requires.

me

Get notified

Subscribe a URL to events and RiaLingo posts an HMAC-signed body when content changes. The webhook tells you something moved, not what.

webhooks

Pull the change

The delta endpoint answers what moved since your last sync — changed values and removed keys — behind one opaque token. That pair is how OTA content updates work.

delta sync

Keeping a client in sync

Ask once with no token to get a snapshot, then replay the token you were handed.

# First run — full snapshot, no cursor
GET /api/v1/projects/{projectId}/delta

# Every run after — only what moved
GET /api/v1/projects/{projectId}/delta?sync_token=<token from last response>

The response carries changes (new values), removals (keys to drop, whether deleted or archived) and a fresh sync_token. Store the token, apply the rest locally, and read from your local copy — no call per lookup. When has_more is true, call again immediately with the new token.

  • Treat the token as opaque. It encodes a position in two streams; parsing it will break when the shape changes.
  • Apply removals. A key that was deleted or archived stops appearing in bundles; skip removals and your client serves a string nobody can edit any more.
  • Drafts never appear. The delta carries published values only, so unreleased copy cannot reach users.

admin

1 read1 write

Tenant-admin surfaces that are not part of the general REST contract.

MethodPathDescriptionRequires
GET/api/v1/admin/metricsAdmin-only operational read-out. Exposes the size of audit-style tablesaudit log:view
POST/api/v1/admin/tenant/branding/assetsmultipart/form-data:user:create

audit

2 reads0 writes

Append-only record of who changed what.

MethodPathDescriptionRequires
GET/api/v1/audittenant audit trail, filterable and cursor-paginated.audit log:view
GET/api/v1/audit/export.zipfull tenant audit export as a single zipaudit log:view

cli

2 reads0 writes

Endpoints the `rialingo` Go CLI depends on, including its own release manifest.

MethodPathDescriptionRequires
GET/api/v1/cli/download/{platform}stream a CLI binary.session
GET/api/v1/cli/releaseslist downloadable CLI binaries with sizessession

exports

1 read0 writes

Bundle builds. An export is an async job that produces an immutable artifact in object storage; poll the job, then fetch the signed URL.

MethodPathDescriptionRequires
GET/api/v1/exports/{jobId}poll a bundle build. Returns the job status and,export bundle:view

health

1 read0 writes

Liveness and queue depth. Unauthenticated.

MethodPathDescriptionRequires
GET/api/v1/healthHealth check.session

imports

2 reads2 writes

The inbound half of exports — upload a bundle or file set and reconcile it against existing keys.

MethodPathDescriptionRequires
GET/api/v1/importslist recent jobs.project:view
POST/api/v1/importsstart a smart import.project:view
GET/api/v1/imports/{jobId}poll an import job's status and per-key results.project:view
POST/api/v1/imports/zip-previewMultipart upload of a Lokalise-shaped zip bundle. Parses andsession

me

1 read1 write

The calling identity — who am I, and what may I do.

MethodPathDescriptionRequires
GET/api/v1/mecurrent caller identity + effective permissions.session
POST/api/v1/me/ws-tokenMint a short-lived JWT for the WebSocket gateway. Authenticatedsession

notifications

1 read2 writes

In-app notification feed.

MethodPathDescriptionRequires
GET/api/v1/notificationsthe caller's in-app inbox plus an unread count.session
POST/api/v1/notifications/{id}/readmark one notification as read.session
POST/api/v1/notifications/read-allmark the caller's whole inbox as read.session

ops

0 reads1 write

Platform-admin only, cross-tenant. Authenticated by a platform bearer token, not a tenant session.

MethodPathDescriptionRequires
POST/api/v1/ops/tenantsplatform-admin-only tenant provisioning.platform: platform:tenant:provision

permissions

1 read0 writes

The catalogue of permission strings the RBAC layer understands.

MethodPathDescriptionRequires
GET/api/v1/permissionsthe catalogue of permission strings the RBAC layersession

projects

35 reads65 writes

A project is the unit of content: it owns keys, the languages those keys are translated into, and everything layered on top (releases, tasks, screenshots, glossary). Almost every other resource hangs off a project id.

MethodPathDescriptionRequires
GET/api/v1/projectslist tenant's projectsproject:view
POST/api/v1/projectscreate a new project (delegates to Server Action)project:view
GET/api/v1/projects/{projectId}/branchesbranches in the project.branch:view
POST/api/v1/projects/{projectId}/branchescut a new branch from the default.branch:view
GET/api/v1/projects/{projectId}/commentsProject-wide list of key comments. Cursor-paginated.comment:view
GET/api/v1/projects/{projectId}/custom-fieldslist (cursor-paginated)custom_field:view
POST/api/v1/projects/{projectId}/custom-fieldscreatecustom_field:view
GET/api/v1/projects/{projectId}/custom-fields/{id}read one custom-field definition.custom_field:view
PATCH/api/v1/projects/{projectId}/custom-fields/{id}update the definition.custom_field:view
DELETE/api/v1/projects/{projectId}/custom-fields/{id}remove the definition.custom_field:view
GET/api/v1/projects/{projectId}/custom-statuseslist (cursor-paginated)custom_status:view
POST/api/v1/projects/{projectId}/custom-statusescreatecustom_status:view
GET/api/v1/projects/{projectId}/custom-statuses/{id}read one custom status.custom_status:view
PATCH/api/v1/projects/{projectId}/custom-statuses/{id}update the status.custom_status:view
DELETE/api/v1/projects/{projectId}/custom-statuses/{id}remove the status.custom_status:view
GET/api/v1/projects/{projectId}/deltaOTA delta sync since last sync.ota bundle:view
GET/api/v1/projects/{projectId}/export-scheduleslistexport schedule:view
POST/api/v1/projects/{projectId}/export-schedulescreateexport schedule:view
GET/api/v1/projects/{projectId}/export-schedules/{id}read one scheduled export.export schedule:view
PUT/api/v1/projects/{projectId}/export-schedules/{id}update its cron expression or bundle params.export schedule:view
DELETE/api/v1/projects/{projectId}/export-schedules/{id}remove the schedule.export schedule:view
GET/api/v1/projects/{projectId}/exportsCursor-paginated list of export jobs. Filterable by status.export bundle:view
DELETE/api/v1/projects/{projectId}/exports/{jobId}Cancel a queued/running export job.export bundle:create
POST/api/v1/projects/{projectId}/exports/{jobId}/retryClone a failed export job's params into a new queued job.export bundle:create
POST/api/v1/projects/{projectId}/figma/frame-manifestAccepts a Figma frame manifest (up to 500 text layers) and returns afigma:link:write
POST/api/v1/projects/{projectId}/figma/frame-screenshotsAccepts a multipart PNG upload + frame metadata JSON, runs the imagescreenshot:create
GET/api/v1/projects/{projectId}/figma/linkslist node→key bindings for a filefigma:link:read
POST/api/v1/projects/{projectId}/figma/linksupsert bindings (partial-batch, per-op savepoints)figma:link:read
PATCH/api/v1/projects/{projectId}/figma/links/{id}update text_hash on a bindingfigma:link:write
DELETE/api/v1/projects/{projectId}/figma/links/{id}remove a bindingfigma:link:write
GET/api/v1/projects/{projectId}/figma/render-packReturns published translations only, keyed by node_id, for a givenfigma:link:read
POST/api/v1/projects/{projectId}/figma/syncAccepts a Figma frame manifest (up to 500 text layers) and returns thefigma:sync
POST/api/v1/projects/{projectId}/files/downloadAsync export trigger; accepts the legacy-flag set so existing CIsession
POST/api/v1/projects/{projectId}/files/uploadSingle-JSON upload (Lokalise legacy-flag-compatible). The body is onesession
GET/api/v1/projects/{projectId}/glossarylist (cursor-paginated, includes translations)glossary term:view
POST/api/v1/projects/{projectId}/glossarycreate term (optional inline translations)glossary term:view
GET/api/v1/projects/{projectId}/glossary/{termId}read one glossary term.glossary term:view
PUT/api/v1/projects/{projectId}/glossary/{termId}update the term.glossary term:view
DELETE/api/v1/projects/{projectId}/glossary/{termId}remove the term.glossary term:view
PUT/api/v1/projects/{projectId}/glossary/{termId}/translations/{lang}set the term's approved wording in one language.glossary term:update
DELETE/api/v1/projects/{projectId}/glossary/{termId}/translations/{lang}`lang` is the language code (e.g. `en_US`). The `corridor` qualifierglossary term:update
GET/api/v1/projects/{projectId}/glossary/export.csvStream the project's glossary as CSV, attaching one column perglossary term:view
GET/api/v1/projects/{projectId}/import-scheduleslistimport schedule:view
POST/api/v1/projects/{projectId}/import-schedulescreateimport schedule:view
GET/api/v1/projects/{projectId}/import-schedules/{id}read one scheduled import.import schedule:view
PUT/api/v1/projects/{projectId}/import-schedules/{id}update its cron expression or source.import schedule:view
DELETE/api/v1/projects/{projectId}/import-schedules/{id}remove the schedule.import schedule:view
GET/api/v1/projects/{projectId}/importsCursor-paginated list of import jobs. Filterable by status.project:view
DELETE/api/v1/projects/{projectId}/imports/{jobId}Cancel a queued/running import job. Phase 4 / M4 Batch 1.2.project:update
POST/api/v1/projects/{projectId}/imports/{jobId}/retryClone a failed import job's params into a new queued job.project:update
POST/api/v1/projects/{projectId}/imports/zipMultipart upload of a Lokalise-shaped zip bundle.session
GET/api/v1/projects/{projectId}/keyslist keys (paginated, filterable)key:view
POST/api/v1/projects/{projectId}/keyscreate a key on the default branchkey:view
PUT/api/v1/projects/{projectId}/keysbulk update (Phase 2 / M2)key:view
DELETE/api/v1/projects/{projectId}/keysbulk hard-delete (Phase 2 / M2)key:view
GET/api/v1/projects/{projectId}/keys/{keyId}single key readkey:view
PUT/api/v1/projects/{projectId}/keys/{keyId}single key updatekey:view
DELETE/api/v1/projects/{projectId}/keys/{keyId}single key hard-deletekey:view
GET/api/v1/projects/{projectId}/keys/{keyId}/commentslist key commentscomment:view
POST/api/v1/projects/{projectId}/keys/{keyId}/commentscreate onecomment:view
DELETE/api/v1/projects/{projectId}/keys/{keyId}/comments/{commentId}Hard-delete a key comment. FK cascade clears thread children.comment:delete
GET/api/v1/projects/{projectId}/keys/{keyId}/segments/{lang}Path-style alias for the per-language translation row.translation:view
PUT/api/v1/projects/{projectId}/keys/{keyId}/segments/{lang}Set the live value (Phase 2 / M2 Batch 5.3). Stub-creates thetranslation:view
GET/api/v1/projects/{projectId}/keys/{keyId}/translationslist translations for a key (one per enabled language).translation:view
GET/api/v1/projects/{projectId}/languageslist enabled languageslanguage:view
POST/api/v1/projects/{projectId}/languagesenable a languagelanguage:view
GET/api/v1/projects/{projectId}/languages/{code}read one enabled language.language:view
PUT/api/v1/projects/{projectId}/languages/{code}enable the language or update its overrides.language:view
DELETE/api/v1/projects/{projectId}/languages/{code}disable the language for this project.language:view
GET/api/v1/projects/{projectId}/releasesreleases for the project.release:view
POST/api/v1/projects/{projectId}/releasesopen a new release.release:view
POST/api/v1/projects/{projectId}/releases/{releaseId}/cancelabandon thesession
POST/api/v1/projects/{projectId}/releases/{releaseId}/checkrun thesession
POST/api/v1/projects/{projectId}/releases/{releaseId}/keysadd keys to therelease:update
POST/api/v1/projects/{projectId}/releases/{releaseId}/shippublish thesession
GET/api/v1/projects/{projectId}/screenshotslist with signed URLs.screenshot:view
POST/api/v1/projects/{projectId}/screenshotsmultipart upload.screenshot:view
GET/api/v1/projects/{projectId}/screenshots/{id}read one screenshot and its key links.screenshot:view
PUT/api/v1/projects/{projectId}/screenshots/{id}rename it or relink keys.screenshot:view
DELETE/api/v1/projects/{projectId}/screenshots/{id}remove it.screenshot:view
GET/api/v1/projects/{projectId}/snapshotslist (cursor-paginated)snapshot:view
POST/api/v1/projects/{projectId}/snapshotscreate (triggers export under hood)snapshot:view
GET/api/v1/projects/{projectId}/snapshots/{id}read one point-in-time snapshot.snapshot:view
DELETE/api/v1/projects/{projectId}/snapshots/{id}remove the snapshot.snapshot:view
POST/api/v1/projects/{projectId}/snapshots/{id}/restoreReplay a snapshot's bundle through the import pipeline.snapshot:restore
GET/api/v1/projects/{projectId}/taskslist (cursor-paginated)task:view
POST/api/v1/projects/{projectId}/taskscreatetask:view
GET/api/v1/projects/{projectId}/tasks/{taskId}read one translation task.task:view
PUT/api/v1/projects/{projectId}/tasks/{taskId}update assignee, due date or status.task:view
DELETE/api/v1/projects/{projectId}/tasks/{taskId}remove the task.task:view
POST/api/v1/projects/{projectId}/tasks/{taskId}/keysAdd key ids to a task. Validates each key belongs to the project;task:update
DELETE/api/v1/projects/{projectId}/tasks/{taskId}/keys/{keyId}Remove one key from a task.task:update
GET/api/v1/projects/{projectId}/translationsproject-wide translation list.translation:view
GET/api/v1/projects/{projectId}/translations/{translationId}Single-translation read (Phase 2 / M2).translation:view
PUT/api/v1/projects/{projectId}/translations/{translationId}Set the live value (Phase 2 / M2). Equivalent to publish with override.translation:view
PATCH/api/v1/projects/{projectId}/translations/{translationId}Save a draft (default), or publish via ?publish=true.translation:view
PUT/api/v1/projects/{projectId}/translations/{translationId}/custom-statusSet or clear the translation's per-project custom status overlay.translation:update
DELETE/api/v1/projects/{projectId}/translations/{translationId}/draftdiscard the staged draft, leaving the live value untouched.session
POST/api/v1/projects/{projectId}/translations/{translationId}/publishpromote the staged draft to the live value.session
POST/api/v1/projects/{projectId}/translations/find-and-replaceBulk literal/regex substitution on `translation.text`.session

role-assignments

0 reads1 write

Binds a role to a user, optionally scoped to one project.

MethodPathDescriptionRequires
POST/api/v1/role-assignmentsbind a role to a user, optionally scoped tosession

roles

1 read1 write

Named permission sets. A role holds `<resource>:<action>` strings; assignments bind them to users.

MethodPathDescriptionRequires
GET/api/v1/rolesroles defined in the calling tenant.role:view
POST/api/v1/rolescreate a custom role from a set of permission strings.role:view

system

1 read0 writes

Platform-level metadata.

MethodPathDescriptionRequires
GET/api/v1/system/languagesread-only system catalog.session

tenant

1 read1 write

Settings for the calling tenant.

MethodPathDescriptionRequires
GET/api/v1/tenantsettings for the calling tenant.tenant settings:view
PATCH/api/v1/tenantupdate SSO config or audit-retention policy.tenant settings:view

users

2 reads2 writes

Tenant members.

MethodPathDescriptionRequires
GET/api/v1/usersmembers of the calling tenant.user:view
GET/api/v1/users/{userId}fetch a single user in the tenantuser:view
PUT/api/v1/users/{userId}toggle disabled (body: { disabled: boolean })user:view
DELETE/api/v1/users/{userId}soft-delete by disabling the useruser:view

webhooks

1 read4 writes

Outbound notifications. Tells a listener that something changed; pair with the delta endpoint to find out what.

MethodPathDescriptionRequires
GET/api/v1/webhookswebhook subscriptions for the calling tenant.webhook:view
POST/api/v1/webhookssubscribe a URL to a set of events.webhook:view
PATCH/api/v1/webhooks/{id}update a subscription's URL or event set.session
DELETE/api/v1/webhooks/{id}remove the subscription.session
POST/api/v1/webhooks/{id}/rotate-secretissue a new HMAC signing secret.session