API de traducciones
Los endpoints de traducciones devuelven todas las versiones de idioma de un registro en una sola respuesta: título o nombre, sinopsis, eslogan y página web en películas y series, y nombre y sinopsis en episodios. Cada fila trae iso_639_1, iso_3166_1 y english_name. Úsalo para leer idiomas que language no sirve o para crear una cadena de respaldo.
Obtén las traducciones de una película
GET / devuelve una fila por cada idioma que tiene texto para la película. Cada fila contiene un objeto data con los campos traducidos. La llamada no acepta ningún parámetro de idioma, porque el objetivo es ver todos los idiomas a la vez.
El ejemplo busca la fila en ruso e imprime su título y el comienzo de su sinopsis.
curl -s "https://api.amodb.dev/3/movie/550/translations" \
-H "Authorization: Bearer $AMODB_KEY"const url = 'https://api.amodb.dev/3/movie/550/translations';
const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.AMODB_KEY}` } });
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
const { translations } = await res.json();
const ru = translations.find((t) => t.iso_639_1 === 'ru');
console.log(ru ? `${ru.data.title}: ${ru.data.overview.slice(0, 80)}` : 'no Russian row');import os
import requests
r = requests.get(
"https://api.amodb.dev/3/movie/550/translations",
headers={"Authorization": f"Bearer {os.environ['AMODB_KEY']}"},
timeout=10,
)
r.raise_for_status()
ru = next((t for t in r.json()["translations"] if t["iso_639_1"] == "ru"), None)
print(f"{ru['data']['title']}: {ru['data']['overview'][:80]}" if ru else "no Russian row")<?php
$ch = curl_init('https://api.amodb.dev/3/movie/550/translations');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('AMODB_KEY')],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status !== 200) {
throw new RuntimeException("amodb returned $status");
}
foreach (json_decode($body, true)['translations'] as $t) {
if ($t['iso_639_1'] === 'ru') {
echo $t['data']['title'], ': ', mb_substr($t['data']['overview'], 0, 80), PHP_EOL;
exit;
}
}
echo 'no Russian row', PHP_EOL;package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
"time"
)
type Translations struct {
Translations []struct {
ISO6391 string `json:"iso_639_1"`
Data struct {
Title string `json:"title"`
Overview string `json:"overview"`
} `json:"data"`
} `json:"translations"`
}
func main() {
req, _ := http.NewRequest("GET", "https://api.amodb.dev/3/movie/550/translations", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("AMODB_KEY"))
client := &http.Client{Timeout: 10 * time.Second}
res, err := client.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
panic(res.Status)
}
var t Translations
if err := json.NewDecoder(res.Body).Decode(&t); err != nil {
panic(err)
}
for _, row := range t.Translations {
if row.ISO6391 == "ru" {
text := []rune(row.Data.Overview)
if len(text) > 80 {
text = text[:80]
}
fmt.Printf("%s: %s\n", row.Data.Title, string(text))
return
}
}
fmt.Println("no Russian row")
}Parámetros
movie_idrutaobligatorioID numérico de la película, por ejemplo550.api_keyconsultauno de los dosTu clave. Usa esta o el encabezadoAuthorization: Bearer.
Campos de la respuesta
| Campo | Tipo | Notas |
|---|---|---|
id | entero | El ID de la película. |
translations | array | Una fila por cada idioma con texto, ordenadas por código de idioma. La película 550 devuelve 50 filas. |
translations[].iso_ | texto | Código de país que acompaña al idioma, como US para en o BR para pt. En los idiomas ajenos a los 14 que se sirven repite el código de idioma en mayúsculas. |
translations[].iso_ | texto | Código de idioma, como ru o pt. Único dentro del array. |
translations[].name | texto | El idioma escrito en ese mismo idioma. |
translations[].english_ | texto | El nombre del idioma en inglés. |
translations[].data | objeto | Los campos traducidos. Las claves dependen del recurso, ver la tabla siguiente. |
Ejemplo de respuesta
Se muestran dos de las 50 filas, y las sinopsis están recortadas.
{
"id": 550,
"translations": [
{
"iso_3166_1": "US",
"iso_639_1": "en",
"name": "English",
"english_name": "English",
"data": {
"title": "Fight Club",
"overview": "A ticking-time-bomb insomniac and a slippery soap salesman channel primal male aggression into a shocking new form of therapy....",
"homepage": "https://www.20thcenturystudios.com/movies/fight-club",
"tagline": "Mischief. Mayhem. Soap.",
"runtime": 0
}
},
{
"iso_3166_1": "RU",
"iso_639_1": "ru",
"name": "Русский",
"english_name": "Russian",
"data": {
"title": "Бойцовский клуб",
"overview": "Сотрудник страховой компании страдает хронической бессонницей и отчаянно пытается вырваться из мучительно скучной жизни. Однажд...",
"homepage": "https://www.20thcenturystudios.com/movies/fight-club",
"tagline": "«Интриги. Хаос. Мыло»",
"runtime": 0
}
}
]
}En amodb runtime siempre es 0 en una fila de traducción. Lee la duración del registro de detalles de la película.
Endpoints de traducción y sus claves de data
Todas las rutas comparten la base https:/. Todas devuelven id y un array translations con la estructura de fila de arriba. Solo cambian las claves dentro de data.
| Método y ruta | Claves de data |
|---|---|
GET / | title, overview, homepage, tagline, runtime (siempre 0) |
GET / | name, overview, homepage, tagline |
GET / | ninguna, el array siempre está vacío |
GET / | name, overview |
Los registros de series listan casi tantos idiomas como los de películas. Las filas de episodios cubren solo los idiomas servidos que tienen texto para ese episodio, de 2 a 14 en las muestras revisadas. Trata una clave ausente como un valor vacío e ignora las claves que no conozcas. Consulta series de TV para los registros principales.
amodb no ofrece traducciones para personas ni colecciones. La biografía de una persona sigue el parámetro language de la llamada de detalles de la persona, y la sinopsis de una colección llega tal como está guardada.
Usa un idioma de respaldo cuando falta el texto
Un título puede existir en 14 idiomas y aun así tener una sinopsis vacía en el que eligió tu usuario. Recorre una cadena de idiomas, toma el primer valor no vacío y recuerda de qué idioma procede.
function pickText(translations, wanted, field) {
for (const code of [...wanted, 'en']) {
const row = translations.find((t) => t.iso_639_1 === code);
const value = row?.data?.[field];
if (value) return { code, value };
}
return null;
}
// Prefer Ukrainian, then Russian, then English.
// const hit = pickText(translations, ['uk', 'ru'], 'overview');Para una serie, pasa 'name' como campo en lugar de 'title'. Marca en tu interfaz el texto que viene de un idioma de respaldo, para que el usuario sepa por qué una página en ucraniano muestra una sinopsis en inglés.
El endpoint de traducciones o el parámetro language
| Necesidad | Qué usar |
|---|---|
| Mostrar un idioma a un usuario | language en la llamada de detalles |
| Listar todos los idiomas de un título en un editor | Este endpoint |
Leer un idioma que language no sirve, como ja | Este endpoint, elige la fila por iso_639_1 |
| Comprobar cuáles de los 14 idiomas servidos tienen texto | Este endpoint, compara iso_639_1 |
| Crear enlaces de idiomas alternativos para una página | Este endpoint, lee los códigos presentes |
Para ver las etiquetas que acepta language, consulta idiomas. Cualquier otra etiqueta recurre al inglés en una llamada de detalles.
Errores
| HTTP | status_code | Cuándo |
|---|---|---|
| 401 | 7 | Falta la clave o es incorrecta. |
| 402 | 36 | El periodo del plan ha terminado. |
| 404 | 34 | No existe la temporada o el episodio con ese id, o el id no es un número. |
| 405 | 37 | Usaste un método de escritura en una ruta de traducciones. |
| 429 | 25 | Superaste tus solicitudes por minuto. Espera los segundos indicados en Retry-After. |
Un id de película o serie que no existe no es un error en esta ruta: responde 200 con "translations": [], mientras que la ruta de detalles responde 404. Más información en errores y límites de solicitudes.
Notas prácticas
- Una llamada sustituye hasta 14 llamadas de detalles. Úsala cuando necesites más de dos idiomas del mismo título.
- Las filas están ordenadas por código de idioma, que no es un orden de prioridad. Elige las filas por
iso_639_1, nunca por la posición en el array. - Las llamadas de tipo detalles se guardan en la caché perimetral 6 horas, así que una caché de cliente de la misma duración no cuesta nada en frescura.
- Los títulos originales en otras escrituras, como japonés o coreano, siempre están disponibles en
original_titleyoriginal_namedel registro de detalles. - Para añadir traducciones a una llamada de detalles, pasa
append_y lee el mismo array de la respuesta. Funciona para películas, series y episodios. El bloque añadido no tieneto_ response= translations id.