# Géneros y listas de consulta

> Los endpoints de géneros y de consulta devuelven listas de referencia pequeñas que cargas una vez: ids de género de películas y TV con nombres en 14 idiomas, más países, idiomas, oficios, clasificaciones por edad y proveedores de streaming. Usan rutas y estructuras de TMDB v3, no se paginan y cambian poco, así que guárdalas en caché un día.

## Endpoint

`GET /3/genre/movie/list`

```bash
curl "https://api.amodb.dev/3/genre/movie/list?language=en-US" \
  -H "Authorization: Bearer $AMODB_KEY"
```

Respuesta:

```json
{
  "genres": [
    {
      "id": 28,
      "name": "Action"
    },
    {
      "id": 12,
      "name": "Adventure"
    },
    {
      "id": 16,
      "name": "Animation"
    }
  ]
}
```

## Obtener la lista de géneros de películas

`GET /3/genre/movie/list` devuelve todos los géneros de películas como un `id` y un `name`. Los ids son los números que `genre_ids` lleva en los elementos de lista y que `with_genres` espera en [discover](https://amodb.dev/es/discover/). Los nombres siguen el parámetro `language`.

El ejemplo carga la lista y construye un mapa de id a nombre, lo primero que necesitan la mayoría de las aplicaciones.

```bash
curl -s "https://api.amodb.dev/3/genre/movie/list?language=en-US" \
  -H "Authorization: Bearer $AMODB_KEY"
```

```js
const url = 'https://api.amodb.dev/3/genre/movie/list?language=en-US';
const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.AMODB_KEY}` } });
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
const { genres } = await res.json();
const names = new Map(genres.map((g) => [g.id, g.name]));
console.log(names.get(878), names.size);
```

```python
import os
import requests

r = requests.get(
    "https://api.amodb.dev/3/genre/movie/list",
    params={"language": "en-US"},
    headers={"Authorization": f"Bearer {os.environ['AMODB_KEY']}"},
    timeout=10,
)
r.raise_for_status()
names = {g["id"]: g["name"] for g in r.json()["genres"]}
print(names[878], len(names))
```

```php
<?php
$url = 'https://api.amodb.dev/3/genre/movie/list?language=en-US';
$ch = curl_init($url);
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");
}
$names = [];
foreach (json_decode($body, true)['genres'] as $g) {
    $names[$g['id']] = $g['name'];
}
echo $names[878], ' ', count($names), PHP_EOL;
```

```go
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"os"
	"time"
)

type Genres struct {
	Genres []struct {
		ID   int    `json:"id"`
		Name string `json:"name"`
	} `json:"genres"`
}

func main() {
	url := "https://api.amodb.dev/3/genre/movie/list?language=en-US"
	req, _ := http.NewRequest("GET", url, 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 g Genres
	if err := json.NewDecoder(res.Body).Decode(&g); err != nil {
		panic(err)
	}
	names := map[int]string{}
	for _, x := range g.Genres {
		names[x.ID] = x.Name
	}
	fmt.Println(names[878], len(names))
}
```

### Parámetros

| Parámetro  | En       | Obligatorio    | Descripción                                                                                                           |
| ---------- | -------- | -------------- | --------------------------------------------------------------------------------------------------------------------- |
| `api_key`  | consulta | uno de los dos | Tu clave. Usa esta o el encabezado `Authorization: Bearer`.                                                           |
| `language` | consulta | no             | Etiqueta de TMDB como `en-US`, `ru-RU` o `pt-BR`. Los nombres se devuelven en este idioma. Valor por defecto `en-US`. |

### Campos de la respuesta

| Campo           | Tipo   | Notas                                                    |
| --------------- | ------ | -------------------------------------------------------- |
| `genres`        | array  | La lista completa en una sola respuesta, sin paginación. |
| `genres[].id`   | entero | Id de género estable.                                    |
| `genres[].name` | texto  | Nombre del género en el idioma pedido.                   |

### Ejemplo de respuesta

```json
{
  "genres": [
    { "id": 12, "name": "Adventure" },
    { "id": 14, "name": "Fantasy" },
    { "id": 16, "name": "Animation" },
    { "id": 18, "name": "Drama" }
  ]
}
```

La respuesta contiene 27 géneros ordenados por id. Esta se corta a los primeros 4.

## Ids de género

Las dos rutas de género devuelven estos 27 géneros, ordenados por id. Los nombres de abajo son los ingleses. Los demás idiomas devuelven los mismos ids con nombres traducidos.

| Id    | Nombre             |
| ----- | ------------------ |
| 12    | Adventure          |
| 14    | Fantasy            |
| 16    | Animation          |
| 18    | Drama              |
| 27    | Horror             |
| 28    | Action             |
| 35    | Comedy             |
| 36    | History            |
| 37    | Western            |
| 53    | Thriller           |
| 80    | Crime              |
| 99    | Documentary        |
| 878   | Science Fiction    |
| 9648  | Mystery            |
| 10402 | Music              |
| 10749 | Romance            |
| 10751 | Family             |
| 10752 | War                |
| 10759 | Action & Adventure |
| 10762 | Kids               |
| 10763 | News               |
| 10764 | Reality            |
| 10765 | Sci-Fi & Fantasy   |
| 10766 | Soap               |
| 10767 | Talk               |
| 10768 | War & Politics     |
| 10770 | TV Movie           |

## Lista de géneros de TV

`GET /3/genre/tv/list` acepta el mismo parámetro `language` y devuelve la lista idéntica, así que un solo mapa de id a nombre cubre películas y TV. En los datos de las listas, los ids `10759` y `10762` a `10768` aparecen solo en elementos de TV, y ids como `28`, `12` y `878` aparecen en elementos de películas. Cuando filtres TV en [discover](https://amodb.dev/es/discover/), usa los ids de TV, por ejemplo `10765` para ciencia ficción y fantasía.

## Listas de consulta

Estas rutas devuelven datos de referencia para formularios, filtros y pantallas de ajustes. Todas aceptan la clave; ninguna acepta `page`.

| Método y ruta                             | Parámetros                 | Cada elemento o estructura                                                             |
| ----------------------------------------- | -------------------------- | -------------------------------------------------------------------------------------- |
| `GET /configuration/countries`            | ninguno                    | Array de `{ iso_3166_1, english_name, native_name }`                                   |
| `GET /configuration/languages`            | ninguno                    | Array de `{ iso_639_1, english_name, name }`                                           |
| `GET /configuration/primary_translations` | ninguno                    | Array de 14 textos como `ru-RU`                                                        |
| `GET /configuration/jobs`                 | ninguno                    | Array de `{ department, jobs }` donde `jobs` lista los nombres de los puestos          |
| `GET /certification/movie/list`           | ninguno                    | `{ certifications }` indexado por código de país, 10 países                            |
| `GET /certification/tv/list`              | ninguno                    | `{ certifications }` indexado por código de país, una clave por cada país del catálogo |
| `GET /watch/providers/regions`            | `language`                 | `{ results }` de `{ iso_3166_1, english_name, native_name }`                           |
| `GET /watch/providers/movie`              | `language`, `watch_region` | `{ results }` de proveedores                                                           |
| `GET /watch/providers/tv`                 | `language`, `watch_region` | `{ results }` de proveedores                                                           |

`/configuration/countries` y `/configuration/languages` ignoran `language` y siempre devuelven los mismos nombres. `native_name` en la lista de regiones sigue `language`. amodb no ofrece `/configuration/timezones`.

Una entrada de clasificación indica la clasificación, lo que significa y su orden. Las entradas se agrupan por código de país, así que una llamada cubre todos los mercados. La lista de películas trae los textos de las clasificaciones. En la lista de TV, `meaning` es una cadena vacía.

```json
{
  "certifications": {
    "US": [
      { "certification": "PG", "meaning": "Some material may not be suitable for children under 10.", "order": 3 },
      { "certification": "R", "meaning": "Under 17 requires accompanying parent or adult guardian.", "order": 5 }
    ]
  }
}
```

El ejemplo se corta a 2 de las 6 entradas de Estados Unidos. La lista de películas cubre AU, BR, CA, DE, ES, FR, GB, IT, RU y US.

Una entrada de proveedor tiene `provider_id`, `provider_name`, `logo_path`, `display_priority` y `display_priorities`, un mapa de código de país a prioridad. Sin `watch_region` obtienes todos los proveedores. Con `watch_region=US` conservas solo los proveedores que sirven a ese país. Una región desconocida devuelve un array `results` vacío. Pasa un código de `/watch/providers/regions`. Los logos de los proveedores se cargan desde el host de imágenes, consulta [imágenes](https://amodb.dev/es/images-api/).

```json
{
  "display_priorities": { "AT": 1, "DE": 1, "GB": 1, "JP": 1, "US": 3 },
  "display_priority": 3,
  "logo_path": "/gMZdpavHmxFNnLpMHwVxfqeux2g.png",
  "provider_name": "Amazon Prime Video",
  "provider_id": 9
}
```

Esta es una entrada de `/watch/providers/movie?watch_region=US`.

## Errores

| HTTP | status_code | Cuándo                                                                      |
| ---- | ----------- | --------------------------------------------------------------------------- |
| 401  | 7           | La clave falta o es incorrecta.                                             |
| 402  | 36          | El periodo del plan ha terminado.                                           |
| 404  | 34          | La ruta no existe, por ejemplo `/genre/book/list`.                          |
| 405  | 37          | Usaste un método de escritura en una ruta de consulta.                      |
| 429  | 25          | Superaste tus solicitudes por minuto. Espera los segundos de `Retry-After`. |

Los detalles de cada código están en [errores](https://amodb.dev/es/errors/). Los límites de cada plan están en [límites de solicitudes](https://amodb.dev/es/rate-limits/).

## Notas prácticas

- Carga las listas una vez por idioma al iniciar y guárdalas en memoria o en un archivo. La caché perimetral guarda las rutas `/configuration` 24 horas, así que basta con una actualización diaria por tu parte.
- Guarda los ids de género en tu base de datos, no los nombres. Un nombre cambia con el idioma, un id no.
- Las dos rutas de género devuelven las mismas 27 entradas, así que un solo mapa cubre películas y TV. Los ids 10759 y 10762 a 10768 aparecen solo en elementos de TV.
- `with_genres=28,12` en [discover](https://amodb.dev/es/discover/) significa Acción y aventura a la vez. `with_genres=28|12` significa cualquiera de los dos.
- Los nombres de género siguen el parámetro `language`. Una etiqueta fuera de los 14 idiomas base de [idiomas](https://amodb.dev/es/languages/) recurre al inglés, y algunos nombres se quedan en inglés en ciertos idiomas, por ejemplo `10759` en italiano.

## Preguntas y respuestas

### ¿Los ids de género cambian entre idiomas?

No. El id se mantiene igual y solo se traduce el nombre. Pide la lista con el idioma que muestras y guarda en tu aplicación un mapa de id a nombre por idioma.

### ¿Las películas y la TV usan ids de género distintos?

Comparten un solo espacio de ids. Las dos rutas de género devuelven los mismos 27 géneros. Los elementos de películas usan ids como 28 y 12, mientras que los de TV usan ids combinados como 10759 para Acción y aventura. Un solo mapa cubre ambos.

### ¿Cómo filtro por dos géneros a la vez?

Pasa with_genres a discover. Una coma entre ids significa todos ellos, así que 28,12 es Acción y aventura a la vez. Una barra vertical significa cualquiera de ellos. Usa without_genres para excluir.

### ¿Las listas de consulta necesitan paginación?

No. Cada ruta de consulta devuelve la lista completa en una sola respuesta. Cárgalas al iniciar y guárdalas en caché un día. Las rutas de configuración se guardan en la caché perimetral 24 horas.

## Páginas relacionadas

- [API Discover](https://amodb.dev/es/discover/): API Discover con los mismos filtros que TMDB v3. Lista películas y series por género, reparto, productora, palabra clave, año, nota, duración y plataforma.
- [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.
- [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 imágenes y host de imágenes](https://amodb.dev/es/images-api/): API de imágenes de películas con rutas TMDB v3: lista pósters, fondos, logos y fotogramas por título y cárgalos desde img.amodb.dev en 10 tamaños sin clave.
- [Inicio rápido](https://amodb.dev/es/quickstart/): Haz tu primera llamada a amodb: consigue una clave, pide los detalles de una película en curl, JavaScript, Python, PHP o Go y carga el póster. En 2 minutos.

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