# 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.

## Endpoint

`GET /3/movie/{movie_id}/translations`

```bash
curl "https://api.amodb.dev/3/movie/550/translations" \
  -H "Authorization: Bearer $AMODB_KEY"
```

Respuesta:

```json
{
  "id": 550,
  "translations": [
    {
      "iso_3166_1": "AR",
      "iso_639_1": "ar",
      "name": "العربية",
      "english_name": "Arabic",
      "data": {
        "title": "نادي القتال",
        "overview": "يعيش موظف مكتبي يعاني من الأرق والملل حياة روتينية فارغة، إلى أن يلتقي بالرجل الغامض تايلر ديردن، الذي يختلف عنه تمامًا ويؤمن بأن التحرر من قيود المجتمع يبدأ برفض الحياة التقليدية. تنشأ بينهما صداقة غريبة تقودهما إلى تأسيس نادٍ سري يتجمع في...",
        "homepage": "",
        "tagline": "نادي القتال هو نادي يوجد في العقل الباطن لكل واحد منا !",
        "runtime": 0
      }
    },
    {
      "iso_3166_1": "AZ",
      "iso_639_1": "az",
      "name": "Azərbaycan",
      "english_name": "Azerbaijani",
      "data": {
        "title": "Döyüş Klubu",
        "overview": "Xəyalları olmayan bir gənc yuxusuzluğa qarşı mübarizə aparır, bəlkə də boz və gündəlik həyatı ilə cansıxıcılığının nəticəsidir. Təyyarə gəzintisində o, çox xüsusi bir fəlsəfəyə sahib olan xarizmatik sabun satıcısı Tyler Durden ilə tanış olu...",
        "homepage": "",
        "tagline": "",
        "runtime": 0
      }
    },
    {
      "iso_3166_1": "BY",
      "iso_639_1": "be",
      "name": "Беларуская",
      "english_name": "Belarusian",
      "data": {
        "title": "Байцоўскі клуб",
        "overview": "A ticking-time-bomb insomniac and a slippery soap salesman channel primal male aggression into a shocking new form of therapy. Their concept catches on, with underground \"fight clubs\" forming in every town, until an eccentric gets in the wa...",
        "homepage": "",
        "tagline": "",
        "runtime": 0
      }
    }
  ]
}
```

## Obtén las traducciones de una película

`GET /3/movie/{movie_id}/translations` 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.

```bash
curl -s "https://api.amodb.dev/3/movie/550/translations" \
  -H "Authorization: Bearer $AMODB_KEY"
```

```js
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');
```

```python
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
<?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;
```

```go
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

| Parámetro  | En       | Obligatorio    | Descripción                                                 |
| ---------- | -------- | -------------- | ----------------------------------------------------------- |
| `movie_id` | ruta     | sí             | ID numérico de la película, por ejemplo `550`.              |
| `api_key`  | consulta | uno de los dos | Tu clave. Usa esta o el encabezado `Authorization: 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_3166_1`   | 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_639_1`    | 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_name` | 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.

```json
{
  "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](https://amodb.dev/es/movies/).

## Endpoints de traducción y sus claves de data

Todas las rutas comparten la base `https://api.amodb.dev/3`. 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 /movie/{movie_id}/translations`                                               | `title`, `overview`, `homepage`, `tagline`, `runtime` (siempre 0) |
| `GET /tv/{series_id}/translations`                                                 | `name`, `overview`, `homepage`, `tagline`                         |
| `GET /tv/{series_id}/season/{season_number}/translations`                          | ninguna, el array siempre está vacío                              |
| `GET /tv/{series_id}/season/{season_number}/episode/{episode_number}/translations` | `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](https://amodb.dev/es/tv-series/) 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.

```js
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](https://amodb.dev/es/languages/). 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](https://amodb.dev/es/errors/) y [límites de solicitudes](https://amodb.dev/es/rate-limits/).

## 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_title` y `original_name` del registro de detalles.
- Para añadir traducciones a una llamada de detalles, pasa `append_to_response=translations` y lee el mismo array de la respuesta. Funciona para películas, series y episodios. El bloque añadido no tiene `id`.

## Preguntas y respuestas

### ¿Cuándo uso translations en lugar del parámetro language?

Usa language cuando muestras un solo idioma a un usuario. Usa translations cuando necesitas varios idiomas de un mismo título a la vez, por ejemplo en una pantalla de edición, en páginas de idiomas alternativos o para revisar la cobertura. También devuelve idiomas que language no sirve, como ja o de.

### ¿Cuál es la diferencia entre iso_639_1 e iso_3166_1?

iso_639_1 es el código de idioma, como pt. iso_3166_1 es el país que lo acompaña, como BR. En los idiomas ajenos a los 14 que se sirven repite el código de idioma en mayúsculas, por ejemplo DA para da, así que haz siempre la coincidencia con iso_639_1.

### ¿Por qué hay un campo vacío dentro de data?

Una cadena vacía o un cero significa que no existe texto para ese campo en ese idioma. No lo muestres. Recurre al siguiente idioma de tu cadena, normalmente inglés, o al título original.

### ¿Qué idiomas cubre el endpoint?

Los registros de películas y series listan todos los idiomas que tiene el catálogo, a menudo de 40 a 80 filas. Eso incluye los 14 que se sirven: en, ru, uk, be, zh, pt, bg, he, cs, ro, fr, pl, it y es. Los episodios listan solo algunos de esos 14.

## Páginas relacionadas

- [API de detalles de película](https://amodb.dev/es/movies/): API de detalles de película con rutas y JSON de TMDB v3. Obtén una película por id y añade créditos, puntuaciones y moods con append_to_response, en 14 idiomas.
- [API de series de TV](https://amodb.dev/es/tv-series/): API de series de TV con las mismas rutas y JSON que TMDB v3. Obtén una serie con temporadas, cadenas y próximo episodio, más clasificaciones y plataformas.
- [API de detalles de persona](https://amodb.dev/es/people/): API de detalles de persona con rutas y JSON de TMDB v3. Obtén un actor o miembro del equipo por id, con biografía, filmografía, ids externos y populares.
- [API de colecciones](https://amodb.dev/es/collections/): API de colecciones de películas con rutas TMDB v3: obtén una saga por id con todas sus partes, lee belongs_to_collection en una película y busca por nombre.
- [Idiomas](https://amodb.dev/es/languages/): amodb sirve títulos, sinopsis y nombres en 14 idiomas. Pasa una etiqueta estilo TMDB como ru-RU o pt-BR en language; cualquier otra etiqueta recurre al inglés.
- [API de metadatos de películas multilingüe](https://amodb.dev/es/multilingual-movie-metadata-api/): API de metadatos de películas multilingüe con 14 idiomas: etiquetas de TMDB, todas las traducciones, respaldo en inglés y hebreo de derecha a izquierda.

Actualizado: 2026-10-18. Source: https://amodb.dev/es/translations/
