Skip to main content
POST /v1/localizations
GET  /v1/localizations/jobs/:jobId
Translate and culturally localize an app’s store metadata — title, subtitle, keywords, promotional text, description, and what’s new — into up to 10 languages in a single run. An LLM adapts each field for native speakers (not a word-for-word translation) and respects App Store character limits. The work runs asynchronously on a background job, so POST /v1/localizations returns a jobId immediately (HTTP 202). Poll GET /v1/localizations/jobs/:jobId for the per-locale results.
When the app is connected in your Appeeky account, each translation is saved as an editable draft (visible in the dashboard Localizations tab). Set publish: true to push each translation straight to the live App Store Connect listing after translating. Direct publishing requires a connected App Store Connect key — see App Store Connect.

Create a run

POST /v1/localizations

Request Body

FieldTypeRequiredDefaultDescription
appIdstringYes*App Store numeric id (preferred). Provide this or userAppId.
userAppIdstringYes*Appeeky user_apps row id (uuid). Alternative to appId.
localesstring[]YesBCP-47 target locales, e.g. ["tr","de-DE","ja","pt-BR"]. 1–10 entries.
sourceLocalestringNoen-USLocale to translate from.
publishbooleanNofalseWhen true, publish each translation to the live App Store Connect listing.
sourceobjectNoSource copy override (see below). Falls back to the app’s existing draft / base metadata when omitted.
* Provide either appId or userAppId. source object (all fields optional, all string \| null):
FieldDescription
titleApp name
subtitleSubtitle
descriptionLong description
keywordsComma-separated keyword field
promotional_textPromotional text
whats_newRelease notes / what’s new
Cost is metered at 3 credits per requested locale (one LLM call each). A 5-language run costs 15 credits. The poll endpoint is free.

Code Examples

curl -X POST "https://api.appeeky.com/v1/localizations" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "appId": "913335252",
    "locales": ["tr", "de-DE", "ja", "pt-BR"],
    "sourceLocale": "en-US",
    "publish": false
  }'

Response (202 Accepted)

{
  "data": {
    "jobId": "f3c1a2b4-...",
    "triggerRunId": "run_...",
    "status": "queued",
    "locales": ["tr", "de-DE", "ja", "pt-BR"],
    "publish": false,
    "tracked": true
  }
}
FieldTypeDescription
jobIdstringUse this to poll for results.
triggerRunIdstringUnderlying background run id (for support/debugging).
statusstringAlways queued on creation.
trackedbooleanWhether the app is connected in Appeeky (drafts are saved when true).

Poll for results

GET /v1/localizations/jobs/:jobId

Response

{
  "data": {
    "jobId": "f3c1a2b4-...",
    "status": "completed",
    "appId": "913335252",
    "sourceLocale": "en-US",
    "locales": ["tr", "de-DE", "ja"],
    "publish": false,
    "results": [
      {
        "locale": "tr",
        "status": "translated",
        "saved": true,
        "published": false,
        "fields": {
          "title": "Block Blast! - Blok Bulmaca",
          "subtitle": "Rahatlatıcı blok oyunu",
          "keywords": "blok,bulmaca,puzzle,zeka,rahatlatıcı,oyun",
          "promotional_text": "Milyonlarca oyuncuya katıl!",
          "description": "...",
          "whats_new": null
        }
      },
      {
        "locale": "ja",
        "status": "failed",
        "saved": false,
        "published": false,
        "fields": null,
        "error": "..."
      }
    ],
    "error": null,
    "createdAt": "2026-06-20T21:00:00.000Z",
    "updatedAt": "2026-06-20T21:00:42.000Z"
  }
}

Job Fields

FieldTypeDescription
statusstringqueued | processing | completed | failed
resultsarrayOne entry per locale (see below); null until processing.
errorstringSet only if the whole job failed.

Result Fields (per locale)

FieldTypeDescription
localestringThe target locale.
statusstringtranslated (draft ready) | published (pushed to store) | failed.
fieldsobjectThe localized metadata, or null on failure.
savedbooleanWhether the translation was saved as a draft (only when the app is tracked).
publishedbooleanWhether it was published to the live App Store Connect listing.
errorstringFailure reason for this locale, when applicable.

MCP Tools

ToolDescription
localize_app_metadataStart a batch translation run; returns a jobId.
get_localization_jobPoll status and per-locale results for a run.

Errors

StatusCodeWhen
400BAD_REQUESTlocales empty, or neither appId nor userAppId provided
400TOO_MANY_LOCALESMore than 10 locales requested in one run
400NO_SOURCENo source copy to translate and the app isn’t connected
401UNAUTHORIZEDMissing or invalid credentials
403FORBIDDENPolling a job that belongs to another account
404APP_NOT_FOUNDuserAppId not found for this user
404JOB_NOT_FOUNDUnknown jobId