API-referens
Fullständig referens för varje slutpunkt, förfrågnings- och svarsschema, felkod och hastighetsbegränsning.
Gränser och beteende
| Objekt | Värde |
|---|---|
| JSON-kroppsstorlek | Upp till 2 MB (express.json({ limit: '2mb' })) |
| Mål per förfrågan | 1–50 språkkoder |
| Batchobjekt | 1–100 objekt per batchförfrågan |
| Modeller | standard (standard) eller advanced (endast betalda nivåer; se nedan) |
Månadsvis tokenkvot (gratisnivå): Innan modellen anropas uppskattar API antalet tokens ungefär som ceil(content_length / 4) × (number_of_targets + 1) och för free-nivån avvisas förfrågan med 429 / token_limit_reached om uppskattningen överstiger kvarvarande månadsgräns (standard 100000). Betalda nivåer blockeras inte av denna förhandskontroll; användningen loggas ändå.
Hastighetsbegränsningar: När Redis är konfigurerat gäller per-minut-gränser per nivå: free 5, starter 30, growth 60, scale 120, enterprise obegränsat. Vid gräns är svaret 429 med error: "rate_limit_reached". Om Redis inte är konfigurerat hoppas hastighetsbegränsningen över.
Lyckade svar med hastighetsbegränsning kan inkludera X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.
GET /health
Ingen autentisering.
Svar 200
{
"status": "ok",
"timestamp": "2025-03-23T12:00:00.000Z"
}
GET /languages
Ingen autentisering.
Returnerar den kanoniska listan över stödda språk (kod, visningsnamn, RTL-flagga). Det finns 43 poster — 36 bas-språk och 7 regionala varianter. Regionala varianter använder BCP-47 regionssubtaggar (t.ex. fr-CA, pt-BR, es-MX). Koder från denna slutpunkt är de enda värden som accepteras i targets på översättningsendpoints.
Svar 200
{
"languages": [
{ "code": "en", "name": "English", "rtl": false },
{ "code": "ar", "name": "Arabic", "rtl": true }
]
}
Den aktuella listan finns också tillgänglig via GET /languages — se nedan.
POST /translate
Kräver Authorization: Bearer <api_key>.
Översätter en enda content-sträng till alla språk som anges i targets. Svaret är ett enda JSON-objekt vars nycklar är exakt de begärda språkkoderna och vars värden är de översatta strängarna.
Begärans kropp
| Fält | Typ | Obligatoriskt | Beskrivning |
|---|---|---|---|
content | string | Ja | Icke-tom sträng att översätta. |
targets | string[] | Ja | Icke-tom array av giltiga språkkoder (max 36). |
format | string | Nej | En av plain, markdown, json, html. Om utelämnat detekteras formatet automatiskt från content. |
source | string | Nej | Källspråksledtråd för modellen; valfritt. |
model | string | Nej | standard (standard) eller advanced. advanced kräver betald nivå (403 på gratisnivå). |
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 och detection_confidence visas endast när format utelämnades och automatisk detektion kördes.
Exempel (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"]
}'
Exempel (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>.
Bearbetar varje objekt sekventiellt (ett modellanrop per objekt). Om något objekt misslyckas returnerar API 500 och returnerar inga delresultat för den förfrågan.
Begärans kropp
| Fält | Typ | Obligatoriskt | Beskrivning |
|---|---|---|---|
items | array | Ja | Varje element: id (string), content (string), valfritt format. |
targets | string[] | Ja | Samma regler som /translate. |
source | string | Nej | Valfri källspråksledtråd. |
model | string | Nej | standard eller advanced (samma 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"
}
}
Exempel
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>.
Lägger in ett översättningsjobb i kö och returnerar omedelbart med ett job_id. Översättningen körs i bakgrunden — ingen risk för HTTP-timeout oavsett innehållets storlek. Polling via GET /jobs/:id för resultatet.
Använd denna slutpunkt istället för POST /translate när du översätter stora dokument (lång Markdown, många mål språk) där förfrågningslängden kan överstiga din HTTP-klients eller proxys timeout.
Begärans kropp
| Fält | Typ | Obligatoriskt | Beskrivning |
|---|---|---|---|
content | string | Ja | Icke-tom sträng att översätta. |
targets | string[] | Ja | Icke-tom array av giltiga språkkoder (max 36). |
format | string | Nej | En av plain, markdown, json, html. Automatiskt detekterat om utelämnat. |
source | string | Nej | Källspråksledtråd; valfritt. |
model | string | Nej | standard (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>.
Pollar status för ett jobb som skickats via POST /jobs. Polling var 5–10 sekund. Jobb ägs av den användare som skickade in dem — andra användare får 404.
Svar (väntande / bearbetar)
{
"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 är pending (väntar på arbetare) eller processing (arbetare har tagit det). queue_position (1-baserad) visar hur många väntande eller bearbetande jobb som skapades strikt före detta — använd för progress UI. Utelämnas om räknefrågan misslyckas.
Svar (avslutat)
{
"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 (misslyckat)
{
"job_id": "a1b2c3d4-...",
"status": "failed",
"error": "Model returned invalid JSON"
}
Exempel (JavaScript)
const API = 'https://api.usepolylingo.com/v1'
const headers = {
'Authorization': `Bearer ${process.env.POLYLINGO_API_KEY}`,
'Content-Type': 'application/json',
}
// 1. Skicka
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) }
// Valfritt: visa framsteg (queue_position är 1-baserad, utelämnas när ej i kö)
if (job.queue_position != null) console.log(`Köposition: ${job.queue_position}`)
}
GET /usage
Kräver Authorization: Bearer <api_key> (standard nyckelsökning — inte intern bypass-väg).
Returnerar tokenanvändning för nuvarande kalendermånad för den autentiserade användaren.
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 och tokens_remaining är null för enterprise (obegränsad kvot i rapportering).
Innehållsformat
Stödda format-värden: plain, markdown, json, html.
| Format | Bevaras | Översätts |
|---|---|---|
plain | Radbrytningar / stycken | All synlig text |
markdown | Syntax, länkar (URL oförändrad), kodblock (verbatim) | Prosa och länktext |
json | Nycklar, struktur, icke-strängtyper | Endast strängvärden |
html | Taggar och attribut | Textnoder och lämpliga attribut (se prompts) |
RTL och riktning i din app
För plain och markdown-utdata returnerar API endast översatt text — det lägger inte till dir="rtl" eller omslutande element. Ställ in textriktning i din UI (CSS direction, en föräldraelements dir-attribut eller ditt ramverks i18n-layout) när du visar arabiska, hebreiska eller persiska.
För html-format kan den översatta markupen inkludera dir="rtl" där det är lämpligt för RTL-mål.
Felresponser
Fel är JSON när möjligt:
{
"error": "invalid_request",
"message": "Mänskligt läsbar detalj"
}
| HTTP | error | När |
|---|---|---|
| 400 | invalid_request | Saknade/ogiltiga kroppsfält (t.ex. tom content, dåliga targets) |
| 400 | invalid_format | format inte i det stödda setet |
| 400 | invalid_language | Okänd kod i targets |
| 401 | invalid_api_key | Saknad/felaktig Authorization, okänd nyckel, återkallad nyckel |
| 403 | advanced_not_available | model: "advanced" på gratisnivå |
| 429 | token_limit_reached | Gratisnivåns månatliga gräns skulle överskridas (förhandskontroll) |
| 429 | rate_limit_reached | RPM-gräns per minut (när Redis är aktiverat) |
| 500 | translation_error | Modell-/nätverksfel; säkert att försöka igen |
| 404 | not_found | GET /jobs/:id — jobbet finns inte eller tillhör annan användare |
| 500 | server_error | POST /jobs — misslyckades att köa; säkert att försöka igen |
GET /usage kan returnera 500 med ett generiskt meddelande om Supabase-frågan misslyckas.