---
title: "Request paid message translation"
method: POST
path: "/v1/messages/{message_id}/translations"
---

# Request paid message translation

`POST /v1/messages/{message_id}/translations`

## Request

- Base URL: `https://api.skysay.ai`
- URL: `https://api.skysay.ai/v1/messages/{message_id}/translations`
- Auth: none declared

Explicitly request translation for any accessible settled source with retained usable text, regardless of its creation date, even when automatic agent translation is disabled. This enrolls only the requested source for revision recovery and never enables automatic translation of other historical sources. $0.02 per 1,000 original words needing translation per target, minimum $0.01 per successfully translated source/target. Matching-language-only text and cached reads cost zero. Failed attempts and platform corrections never double-charge. No funds leaves translation waiting_funds and does not resume calls or SMS.

## Path parameters

- `message_id` string, required

## Request body

- TranslationRequest: Idempotent for the current source revision and target. Repeating the command reuses the saved result; no client-generated idempotency key is needed.
  - `target_language` 'ar' | 'bn' | 'bg' | 'ca' | 'zh' | 'hr' | 'cs' | 'da' | 'nl' | 'en' | 'et' | 'fi' | 'fr' | 'de' | 'el' | 'gu' | 'he' | 'hi' | 'hu' | 'id' | 'it' | 'ja' | 'kn' | 'ko' | 'lv' | 'lt' | 'ms' | 'ml' | 'mr' | 'no' | 'fa' | 'pl' | 'pt' | 'ro' | 'ru' | 'sr' | 'si' | 'sk' | 'sl' | 'es' | 'sw' | 'sv' | 'ta' | 'te' | 'th' | 'tr' | 'uk' | 'ur' | 'vi', required

## Response `202`

Canonical cached translation state. Originals remain readable on every failure.

- CommunicationTranslation
  - `catalog` object, required
    - `max_targets` 6, required
    - `supported_target_languages` string[], required
    - `tariff` object, required
      - `currency` 'USD'
      - `minimum_per_source_target` 0.01
      - `rate_per_1000_words` 0.02
      - `word_count_rule` string
  - `eligible` boolean, required
  - `pagination` object: Selected call translation units follow the original transcript timeline's pages.
    - `has_more` boolean
    - `limit` integer
    - `next_cursor` string, nullable
    - `returned` integer
  - `quote` object: Pre-inference upper bound using all original words. Language detection can reduce the settled price. Absent for unavailable or unquoted summary sources.
    - `currency` string
    - `max_eligible_words` integer
    - `maximum_amount_minor` integer
  - `quote_pending` boolean: The settled source is waiting for its current-revision word-count summary. Poll this pure read; quote is absent until ready.
  - `source_completeness` 'complete' | 'partial' | 'unavailable': Partial indicates interrupted artifact delivery or unsettled source data; any available original text remains readable.
  - `source_id` string, required
  - `source_kind` 'call' | 'message', required
  - `source_revision` integer, required
  - `source_status` 'not_settled' | 'unavailable' | 'empty' | 'unit_too_large' | 'too_large' | 'available', required
  - `translations` object[], required
    - `amount_minor` integer
    - `currency` string
    - `eligible_words` integer
    - `id` string
    - `reason` string
    - `source_revision` integer
    - `status` 'not_requested' | 'queued' | 'running' | 'ready' | 'waiting_funds' | 'failed' | 'stale'
    - `target_language` string
    - `units` object[]
      - `id` string, required: The immutable original turn or message id.
      - `text` string, required

## Other responses

- `400`: Invalid target or ineligible source.
- `403`: Missing content/paid-write scope, suspended source or workspace.
- `404`: Source not in the credential's workspace.

---

[API](https://skmtc.dev/skysay/apis/skysay-api.md) · [All operations](https://skmtc.dev/skysay/apis/skysay-api/llms.txt) · [OpenAPI document](https://skmtc.dev/skysay/apis/skysay-api/revisions/148c7e111260?raw)
