Translate

Translate PowerPoint files while preserving all formatting, fonts, colors, charts, and images. Text-run-level replacement — no regeneration. $0.02 per slide, any deck size. Supports 32 languages: en, de, fr, es, it, pt, nl, sv, da, no, fi, is, pl, cs, sk, hu, ro, hr, sl, et, lt, lv, ru, uk, bg, sr, tr, ca, gl, id, vi, el.

POST/v1/translate

Translate a PPTX file into a target language. Accepts a job_id (from a previous generate/render), a pptx_url, or pptx_base64. Async — returns job_id for polling.

Parameters

NameTypeRequiredDescription
job_idstringrequiredSource slide job ID to translate.
target_languagestringrequiredISO 639-1 code — 32 supported languages across Latin, Cyrillic, and Greek scripts (en, de, fr, es, it, pt, nl, sv, da, no, fi, is, pl, cs, sk, hu, ro, hr, sl, et, lt, lv, ru, uk, bg, sr, tr, ca, gl, id, vi, el).
source_languagestringoptionalSource language or "auto" to detect. Default: auto.
include_notesbooleanoptionalAlso translate speaker notes. Default: false.
include_tablesbooleanoptionalTranslate table cells. Default: true.
concise_modebooleanoptionalPrefer shorter translations for tight text boxes. Default: false.
namestringoptionalHuman-readable job name.

Response

202
{
  "job_id": "tr-a1b2c3d4",
  "status": "queued",
  "name": "Q1 Report — German"
}

Examples

curl -X POST https://api.slideforge.dev/v1/translate \
  -H "Authorization: Bearer sf_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "job_id": "SLIDE_JOB_ID",
    "target_language": "de"
  }'

POST /v1/translate/from-job

Convenience endpoint — translate directly from a generation job ID. Same parameters as POST /v1/translate.

curl
# Translate from a previous generation job
curl -X POST https://api.slideforge.dev/v1/translate/from-job \
  -H "Authorization: Bearer sf_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "job_id": "GENERATE_JOB_ID",
    "target_language": "fr",
    "concise_mode": true
  }'

Translating uploaded files

Pass pptx_base64 to translate a file you already have. Max ~10 MB inline. For larger files, upload first via POST /v1/assets/upload and pass the pptx_url.

curl
# Translate an uploaded .pptx file (base64)
curl -X POST https://api.slideforge.dev/v1/translate \
  -H "Authorization: Bearer sf_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "pptx_base64": "UEsDBBQAAAAIAA...",
    "target_language": "es",
    "include_notes": true
  }'

Overflow warnings

Some languages expand significantly (e.g. English → German ~30%). When translation pushes text beyond its original shape bounds, the response includes overflow warnings per slide. Use concise_mode: true to ask the LLM to prefer shorter translations for tight layouts.