API reference

Komplet reference for hver endpoint, anmodnings- og svarform, fejlkode og hastighedsgrænse.

Grænser og adfærd

ElementVærdi
JSON body-størrelseOp til 2 MB (express.json({ limit: '2mb' }))
Mål pr. anmodning1–50 sprogkoder
Batch-elementer1–100 elementer pr. batch-anmodning
Modellerstandard (standard) eller advanced (kun betalte niveauer; se nedenfor)

Månedligt token-tillæg (gratis niveau): Før kald til modellen estimerer API tokens som cirka ceil(content_length / 4) × (number_of_targets + 1) og for free niveauet alene afviser anmodningen med 429 / token_limit_reached, hvis estimatet overstiger den resterende månedlige bevilling (standard 100000). Betalte niveauer blokeres ikke af denne forudgående kontrol; brugen logges stadig.

Hastighedsgrænser: Når Redis er konfigureret, gælder minutgrænser pr. niveau: free 5, starter 30, growth 60, scale 120, enterprise ubegrænset. Ved grænseoverskridelse er svaret 429 med error: "rate_limit_reached". Hvis Redis ikke er konfigureret, springes hastighedsbegrænsning over.

Succesfulde hastighedsbegrænsede svar kan inkludere X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.


GET /health

Ingen autentificering.

Svar 200

{
  "status": "ok",
  "timestamp": "2025-03-23T12:00:00.000Z"
}

GET /languages

Ingen autentificering.

Returnerer den kanoniske liste over understøttede sprog (kode, visningsnavn, RTL-flag). Der er 43 poster — 36 basiske sprog og 7 regionale varianter. Regionale varianter bruger BCP-47 regionsundertags (f.eks. fr-CA, pt-BR, es-MX). Koder fra denne endpoint er de eneste værdier, der accepteres i targets på oversættelsesendpoints.

Svar 200

{
  "languages": [
    { "code": "en", "name": "Engelsk", "rtl": false },
    { "code": "ar", "name": "Arabisk", "rtl": true }
  ]
}

Den live liste er også tilgængelig via GET /languages — se nedenfor.


POST /translate

Kræver Authorization: Bearer <api_key>.

Oversætter en enkelt content-streng til hvert sprog, der er angivet i targets. Svaret er et enkelt JSON-objekt, hvis nøgler er præcis de ønskede sprogkoder, og hvis værdier er de oversatte strenge.

Anmodningsbody

FeltTypePåkrævetBeskrivelse
contentstringJaIkke-tom streng til oversættelse.
targetsstring[]JaIkke-tom array af gyldige sprogkoder (max 36).
formatstringNejEn af plain, markdown, json, html. Hvis udeladt, er formatet automatisk detekteret fra content.
sourcestringNejKildesprogstips til modellen; valgfrit.
modelstringNejstandard (standard) eller advanced. advanced kræver betalt niveau (403 på gratis).

Svar 200

{
  "translations": {
    "es": "...",
    "fr": "..."
  },
  "usage": {
    "input_tokens": 120,
    "output_tokens": 340,
    "total_tokens": 460,
    "model": "standard",
    "detected_format": "markdown",
    "detection_confidence": 0.95
  }
}

detected_format og detection_confidence vises kun, når format blev udeladt, og automatisk detektion kørte.

Eksempel (cURL)

curl -sS -X POST "https://api.usepolylingo.com/v1/translate" \
  -H "Authorization: Bearer $POLYLINGO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "{\"title\":\"Hello\"}",
    "format": "json",
    "targets": ["fr", "de"]
  }'

Eksempel (Python 3)

pip install requests
import os, requests

url = "https://api.usepolylingo.com/v1/translate"
headers = {
    "Authorization": f"Bearer {os.environ['POLYLINGO_API_KEY']}",
    "Content-Type": "application/json",
}
r = requests.post(url, json={
    "content": "<p>Hello <strong>world</strong></p>",
    "format": "html",
    "targets": ["es"],
}, timeout=120)
r.raise_for_status()
print(r.json()["translations"]["es"])

POST /translate/batch

Kræver Authorization: Bearer <api_key>.

Behandler hvert element sekventielt (et modelkald pr. element). Hvis et element fejler, returnerer API 500 og returnerer ikke delvise resultater for den anmodning.

Anmodningsbody

FeltTypePåkrævetBeskrivelse
itemsarrayJaHvert element: id (string), content (string), valgfri format.
targetsstring[]JaSamme regler som /translate.
sourcestringNejValgfrit kildesprogstips.
modelstringNejstandard eller advanced (samme regler som /translate).

Svar 200

{
  "results": [
    { "id": "welcome", "translations": { "fr": "...", "de": "..." } },
    { "id": "goodbye", "translations": { "fr": "...", "de": "..." } }
  ],
  "usage": {
    "total_tokens": 900,
    "input_tokens": 400,
    "output_tokens": 500,
    "model": "standard"
  }
}

Eksempel

curl -sS -X POST "https://api.usepolylingo.com/v1/translate/batch" \
  -H "Authorization: Bearer $POLYLINGO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      { "id": "a", "content": "Hello", "format": "plain" },
      { "id": "b", "content": "## Title", "format": "markdown" }
    ],
    "targets": ["es", "it"]
  }'

POST /jobs

Kræver Authorization: Bearer <api_key>.

Sætter en oversættelsesopgave i kø og returnerer straks med et job_id. Oversættelsen kører i baggrunden — ingen risiko for HTTP timeout uanset indholdets størrelse. Poll GET /jobs/:id for resultatet.

Brug denne endpoint i stedet for POST /translate ved oversættelse af store dokumenter (lang Markdown, mange målsprog), hvor anmodningens varighed kan overstige din HTTP-klients eller proxy's timeout.

Anmodningsbody

FeltTypePåkrævetBeskrivelse
contentstringJaIkke-tom streng til oversættelse.
targetsstring[]JaIkke-tom array af gyldige sprogkoder (max 36).
formatstringNejEn af plain, markdown, json, html. Automatisk detekteret, hvis udeladt.
sourcestringNejKildesprogstips; valgfrit.
modelstringNejstandard (standard) eller advanced.

Svar 202

{
  "job_id": "a1b2c3d4-...",
  "status": "pending",
  "created_at": "2025-03-23T12:00:00.000Z"
}

GET /jobs/:id

Kræver Authorization: Bearer <api_key>.

Poller status for en opgave indsendt via POST /jobs. Poll hvert 5–10 sekund. Opgaver ejes af den indsendende bruger — andre brugere får 404.

Svar (afventer / behandler)

{
  "job_id": "a1b2c3d4-...",
  "status": "pending",
  "created_at": "2025-03-23T12:00:00.000Z",
  "updated_at": "2025-03-23T12:00:00.000Z",
  "completed_at": null,
  "queue_position": 3
}

status er pending (venter på en worker) eller processing (worker har overtaget). queue_position (1-baseret) er hvor mange ventende eller behandlede opgaver, der blev oprettet strengt før denne — brug det til progress UI. Udeladt når tælleforespørgslen fejler.

Svar (fuldført)

{
  "job_id": "a1b2c3d4-...",
  "status": "completed",
  "created_at": "2025-03-23T12:00:00.000Z",
  "updated_at": "2025-03-23T12:00:02.000Z",
  "completed_at": "2025-03-23T12:00:02.000Z",
  "translations": {
    "es": "...",
    "fr": "..."
  },
  "usage": {
    "input_tokens": 120,
    "output_tokens": 340,
    "total_tokens": 460,
    "model": "standard"
  }
}

Svar (fejlet)

{
  "job_id": "a1b2c3d4-...",
  "status": "failed",
  "error": "Model returned invalid JSON"
}

Eksempel (JavaScript)

const API = 'https://api.usepolylingo.com/v1'
const headers = {
  'Authorization': `Bearer ${process.env.POLYLINGO_API_KEY}`,
  'Content-Type': 'application/json',
}

// 1. Indsend
const submit = await fetch(`${API}/jobs`, {
  method: 'POST',
  headers,
  body: JSON.stringify({ content: longMarkdown, format: 'markdown', targets: ['de', 'fr'] }),
})
const { job_id } = await submit.json()

// 2. Poll
while (true) {
  await new Promise(r => setTimeout(r, 10_000))
  const poll = await fetch(`${API}/jobs/${job_id}`, { headers })
  const job = await poll.json()
  if (job.status === 'completed') { console.log(job.translations); break }
  if (job.status === 'failed')    { throw new Error(job.error) }
  // Valgfrit: vis fremdrift (queue_position er 1-baseret, udeladt når ikke i kø)
  if (job.queue_position != null) console.log(`Køposition: ${job.queue_position}`)
}

GET /usage

Kræver Authorization: Bearer <api_key> (standard nøgleopslag — ikke den interne bypass-only sti).

Returnerer tokenbrug for den nuværende kalender måned for den autentificerede bruger.

Svar 200

{
  "period_start": "2025-03-01T00:00:00.000Z",
  "period_end": "2025-03-31T23:59:59.000Z",
  "tokens_used": 12000,
  "tokens_included": 100000,
  "tokens_remaining": 88000,
  "overage_tokens": 0,
  "tier": "free"
}

tokens_included og tokens_remaining er null for enterprise (ubegrænset bevilling i rapportering).


Indholdsformater

Understøttede format værdier: plain, markdown, json, html.

FormatBevaresOversættes
plainLinjeskift / afsnitAl synlig tekst
markdownSyntax, links (URL uændret), fenced code (ordret)Prosa og linktekst
jsonNøgler, struktur, ikke-streng typerKun strengværdier
htmlTags og attributterTekstnoder og passende attributter (se prompts)

RTL og retning i din app

For plain og markdown output returnerer API kun oversat tekst — det tilføjer ikke dir="rtl" eller wrapper-elementer. Indstil tekstretning i din UI (CSS direction, en overordnet elements dir-attribut eller dit frameworks i18n-layout), når du viser arabisk, hebraisk eller persisk.

For html format kan oversat markup inkludere dir="rtl" hvor det er passende for RTL-mål.


Fejlsvar

Fejl er JSON, når det er muligt:

{
  "error": "invalid_request",
  "message": "Menneskelæselig detalje"
}
HTTPerrorHvornår
400invalid_requestManglende/ugyldige body-felter (f.eks. tom content, dårlige targets)
400invalid_formatformat ikke i det understøttede sæt
400invalid_languageUkendt kode i targets
401invalid_api_keyManglende/fejlbehæftet Authorization, ukendt nøgle, tilbagekaldt nøgle
403advanced_not_availablemodel: "advanced" på gratis niveau
429token_limit_reachedGratis månedsgrænse ville blive overskredet (forudgående kontrol)
429rate_limit_reachedRPM-grænse pr. minut (når Redis er aktiveret)
500translation_errorModel-/netværksfejl; sikkert at prøve igen
404not_foundGET /jobs/:id — job findes ikke eller tilhører en anden bruger
500server_errorPOST /jobs — fejlede i at sætte i kø; sikkert at prøve igen

GET /usage kan returnere 500 med en generisk besked, hvis Supabase-forespørgslen fejler.

API-reference | PolyLingo | PolyLingo