ShipEasy Docs

Profiles & Keys API

REST API reference for managing label profiles and label keys — create, list, update, delete, and bulk operations.

Profiles

A profile is a named set of label values for a specific language and environment — e.g. en:prod, fr:staging.

List profiles

GET /v1/profiles
Authorization: Bearer i18n_at_...
{
  "data": [
    {
      "id": "prof_abc123",
      "name": "en:prod",
      "keyCount": 142,
      "publishedAt": "2026-04-10T14:22:00Z",
      "createdAt": "2026-01-01T00:00:00Z"
    },
    {
      "id": "prof_def456",
      "name": "fr:prod",
      "keyCount": 118,
      "publishedAt": "2026-04-10T14:22:00Z",
      "createdAt": "2026-01-15T00:00:00Z"
    }
  ],
  "meta": { "total": 2, "page": 1, "perPage": 50, "hasMore": false }
}

Create a profile

POST /v1/profiles
Authorization: Bearer i18n_at_...
Content-Type: application/json

{
  "name": "de:prod"
}

Profile names must match the pattern [a-z]{2,5}:[a-z0-9_-]+ (language code : environment slug).

{
  "id": "prof_ghi789",
  "name": "de:prod",
  "keyCount": 0,
  "publishedAt": null,
  "createdAt": "2026-04-11T10:00:00Z"
}

Delete a profile

DELETE /v1/profiles/:name
Authorization: Bearer i18n_at_...

Deletes the profile and all its keys. Irreversible — unpublish and back up with i18n export first.

{ "deleted": true }

Label Keys

A key is a dot-separated identifier (e.g. nav.home) with a string value in a given profile.

List keys

GET /v1/profiles/:name/keys
Authorization: Bearer i18n_at_...

Query parameters:

ParameterDefaultDescription
page1Page number
perPage50Results per page (max 200)
chunkFilter by chunk name
qSearch key names and values
missingtrue to return only keys with empty values
{
  "data": [
    {
      "id": "key_abc123",
      "key": "nav.home",
      "value": "Home",
      "description": "Navigation home link",
      "chunk": "index",
      "updatedAt": "2026-04-10T12:00:00Z"
    }
  ],
  "meta": { "total": 142, "page": 1, "perPage": 50, "hasMore": true }
}

Get a key

GET /v1/profiles/:name/keys/:key
Authorization: Bearer i18n_at_...
{
  "id": "key_abc123",
  "key": "nav.home",
  "value": "Home",
  "description": "Navigation home link",
  "chunk": "index",
  "updatedAt": "2026-04-10T12:00:00Z",
  "updatedBy": "user_xyz"
}

Create a key

POST /v1/profiles/:name/keys
Authorization: Bearer i18n_at_...
Content-Type: application/json

{
  "key": "nav.home",
  "value": "Home",
  "description": "Navigation home link",
  "chunk": "index"
}

chunk is optional — defaults to index. description is optional.

Returns 201 Created with the key object. Returns 409 if the key already exists.

Update a key

PATCH /v1/profiles/:name/keys/:key
Authorization: Bearer i18n_at_...
Content-Type: application/json

{
  "value": "Homepage",
  "description": "Updated description"
}

Only the fields provided are updated.

Delete a key

DELETE /v1/profiles/:name/keys/:key
Authorization: Bearer i18n_at_...
{ "deleted": true }

Bulk operations

Bulk upsert

Create or update up to 500 keys in a single request. This is what i18n push uses internally.

POST /v1/profiles/:name/keys/bulk
Authorization: Bearer i18n_at_...
Content-Type: application/json

{
  "keys": [
    { "key": "nav.home", "value": "Home", "chunk": "index" },
    { "key": "nav.signIn", "value": "Sign in", "chunk": "index" },
    { "key": "checkout.submit", "value": "Place order", "chunk": "checkout" }
  ],
  "upsert": true
}
{
  "created": 2,
  "updated": 1,
  "unchanged": 0,
  "errors": []
}

If any key fails validation, it's listed in errors and the rest are still processed.

Bulk delete

DELETE /v1/profiles/:name/keys/bulk
Authorization: Bearer i18n_at_...
Content-Type: application/json

{
  "keys": ["nav.home", "nav.signIn"]
}
{ "deleted": 2 }

Coverage

Get translation coverage for all profiles relative to a source profile.

GET /v1/coverage?source=en:prod
Authorization: Bearer i18n_at_...
{
  "source": "en:prod",
  "sourceKeyCount": 142,
  "profiles": {
    "en:prod": { "count": 142, "coverage": 1.0 },
    "fr:prod": { "count": 118, "coverage": 0.83 },
    "de:prod": { "count": 61,  "coverage": 0.43 },
    "es:prod": { "count": 0,   "coverage": 0.0  }
  }
}