# Gêneros e listas de consulta

> Os endpoints de gêneros e de consulta retornam listas de referência que você carrega uma vez: ids de gênero de filmes e de TV com nomes em 14 idiomas, além de países, idiomas, funções da equipe, classificações e provedores de streaming. Seguem os caminhos do TMDB v3, não têm paginação e mudam pouco, então use cache de um dia.

## Endpoint

`GET /3/genre/movie/list`

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

Resposta:

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

## Obter a lista de gêneros de filmes

`GET /3/genre/movie/list` retorna todos os gêneros de filmes como um `id` e um `name`. Os ids são os números que `genre_ids` traz nos itens de lista e que `with_genres` espera no [discover](https://amodb.dev/pt/discover/). Os nomes seguem o parâmetro `language`.

O exemplo carrega a lista e monta um mapa de id para nome, a primeira coisa de que a maioria dos apps precisa.

```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  | Em       | Obrigatório | Descrição                                                                                   |
| ---------- | -------- | ----------- | ------------------------------------------------------------------------------------------- |
| `api_key`  | consulta | um dos dois | Sua chave. Use este parâmetro ou o header `Authorization: Bearer`.                          |
| `language` | consulta | não         | Tag do TMDB como `en-US`, `ru-RU` ou `pt-BR`. Os nomes voltam nesse idioma. Padrão `en-US`. |

### Campos da resposta

| Campo           | Tipo    | Observações                                        |
| --------------- | ------- | -------------------------------------------------- |
| `genres`        | array   | A lista inteira em uma só resposta, sem paginação. |
| `genres[].id`   | inteiro | Id de gênero estável.                              |
| `genres[].name` | string  | Nome do gênero no idioma pedido.                   |

### Exemplo de resposta

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

A resposta tem 27 gêneros ordenados por id. Esta foi cortada para os 4 primeiros.

## Ids de gênero

Os dois caminhos de gênero retornam estes 27 gêneros, ordenados por id. Os nomes abaixo são os em inglês. Os outros idiomas retornam os mesmos ids com nomes traduzidos.

| Id    | Nome               |
| ----- | ------------------ |
| 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` aceita o mesmo parâmetro `language` e retorna a lista idêntica, então um só mapa de id para nome cobre filmes e TV. Nos dados de listas, os ids `10759` e `10762` a `10768` aparecem só em itens de TV, e ids como `28`, `12` e `878` aparecem em itens de filme. Ao filtrar TV no [discover](https://amodb.dev/pt/discover/), use os ids de TV, por exemplo `10765` para Sci-Fi e Fantasia.

## Listas de consulta

Estes caminhos retornam dados de referência para formulários, filtros e telas de configuração. Todos exigem a chave; nenhum aceita `page`.

| Método e caminho                          | Parâmetros                 | Cada item ou formato                                                             |
| ----------------------------------------- | -------------------------- | -------------------------------------------------------------------------------- |
| `GET /configuration/countries`            | nenhum                     | Array de `{ iso_3166_1, english_name, native_name }`                             |
| `GET /configuration/languages`            | nenhum                     | Array de `{ iso_639_1, english_name, name }`                                     |
| `GET /configuration/primary_translations` | nenhum                     | Array de 14 strings, como `ru-RU`                                                |
| `GET /configuration/jobs`                 | nenhum                     | Array de `{ department, jobs }`, em que `jobs` lista os nomes das funções        |
| `GET /certification/movie/list`           | nenhum                     | `{ certifications }` indexado por código de país, 10 países                      |
| `GET /certification/tv/list`              | nenhum                     | `{ certifications }` indexado por código de país, uma chave por país do catálogo |
| `GET /watch/providers/regions`            | `language`                 | `{ results }` com `{ iso_3166_1, english_name, native_name }`                    |
| `GET /watch/providers/movie`              | `language`, `watch_region` | `{ results }` com provedores                                                     |
| `GET /watch/providers/tv`                 | `language`, `watch_region` | `{ results }` com provedores                                                     |

`/configuration/countries` e `/configuration/languages` ignoram `language` e sempre retornam os mesmos nomes. O `native_name` da lista de regiões segue `language`. O amodb não oferece `/configuration/timezones`.

Uma entrada de classificação indicativa traz o nome da classificação, o que ela significa e a ordem de exibição. As entradas são agrupadas por código de país, então uma só chamada cobre todos os mercados. A lista de filmes tem os textos das classificações. Na lista de TV, `meaning` é uma string vazia.

```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 }
    ]
  }
}
```

O exemplo foi cortado para 2 das 6 entradas dos EUA. A lista de filmes cobre AU, BR, CA, DE, ES, FR, GB, IT, RU e US.

Uma entrada de provedor tem `provider_id`, `provider_name`, `logo_path`, `display_priority` e `display_priorities`, um mapa de código de país para prioridade. Sem `watch_region`, você recebe todos os provedores. Com `watch_region=US`, ficam só os provedores que atendem esse país. Uma região desconhecida retorna um array `results` vazio. Passe um código de `/watch/providers/regions`. Os logos dos provedores carregam do host de imagens, veja [imagens](https://amodb.dev/pt/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 é uma entrada de `/watch/providers/movie?watch_region=US`.

## Erros

| HTTP | status_code | Quando                                                                                              |
| ---- | ----------- | --------------------------------------------------------------------------------------------------- |
| 401  | 7           | A chave está ausente ou incorreta.                                                                  |
| 402  | 36          | O período do plano terminou.                                                                        |
| 404  | 34          | O caminho não existe, por exemplo `/genre/book/list`.                                               |
| 405  | 37          | Você usou um método de escrita em um caminho de consulta.                                           |
| 429  | 25          | Você passou do seu limite de requisições por minuto. Espere os segundos indicados em `Retry-After`. |

Os detalhes de cada código estão em [erros](https://amodb.dev/pt/errors/). Os limites dos planos estão em [limites de requisições](https://amodb.dev/pt/rate-limits/).

## Notas práticas

- Carregue as listas uma vez por idioma na inicialização e mantenha-as na memória ou em um arquivo. A borda guarda em cache os caminhos `/configuration` por 24 horas, então uma atualização diária do seu lado basta.
- Guarde ids de gênero no seu banco de dados, não nomes. O nome muda com o idioma, o id não.
- Os dois caminhos de gênero retornam as mesmas 27 entradas, então um só mapa cobre filmes e TV. Os ids 10759 e 10762 a 10768 aparecem só em itens de TV.
- `with_genres=28,12` no [discover](https://amodb.dev/pt/discover/) significa Ação e Aventura juntos. `with_genres=28|12` significa qualquer um dos dois.
- Os nomes dos gêneros seguem o parâmetro `language`. Uma tag fora dos 14 idiomas base de [idiomas](https://amodb.dev/pt/languages/) volta para o inglês, e alguns nomes ficam em inglês em certos idiomas, por exemplo `10759` em italiano.

## Perguntas e respostas

### Os ids de gênero mudam entre os idiomas?

Não. O id continua o mesmo e só o nome é traduzido. Peça a lista no idioma que você exibe e mantenha no seu app um mapa de id para nome por idioma.

### Filmes e TV usam ids de gênero diferentes?

Eles compartilham um só espaço de ids. Os dois caminhos de gênero retornam os mesmos 27 gêneros. Itens de filme usam ids como 28 e 12, enquanto itens de TV usam ids unificados, como 10759 para Ação e Aventura. Um só mapa cobre os dois.

### Como filtro por dois gêneros ao mesmo tempo?

Passe with_genres ao discover. Uma vírgula entre ids significa todos eles, então 28,12 é Ação e Aventura juntos. Uma barra vertical significa qualquer um. Use without_genres para excluir.

### As listas de consulta precisam de paginação?

Não. Cada caminho de consulta retorna a lista completa em uma só resposta. Carregue-as na inicialização e guarde em cache por um dia. Os caminhos de configuração ficam em cache na borda por 24 horas.

## Páginas relacionadas

- [API Discover](https://amodb.dev/pt/discover/): API Discover com os mesmos filtros do TMDB v3. Liste filmes e séries por gênero, elenco, produtora, palavra-chave, ano, nota, duração e provedor, com ordenação.
- [API de detalhes de filmes](https://amodb.dev/pt/movies/): API de detalhes de filmes com caminhos e JSON do TMDB v3. Busque um filme por id e junte créditos, avaliações e moods com append_to_response, em 14 idiomas.
- [API de séries de TV](https://amodb.dev/pt/tv-series/): API de séries de TV com os mesmos caminhos e JSON do TMDB v3. Busque uma série por id com temporadas, emissoras, próximo episódio e classificações.
- [Idiomas](https://amodb.dev/pt/languages/): O amodb serve títulos, sinopses e nomes em 14 idiomas. Passe uma tag no estilo TMDB como ru-RU ou pt-BR em language; qualquer outra tag volta para o inglês.
- [API de imagens e host de imagens](https://amodb.dev/pt/images-api/): API de imagens de filmes com caminhos do TMDB v3: liste pôsteres, backdrops, logos e stills por título e carregue-os de img.amodb.dev em 10 tamanhos, sem chave.
- [Início rápido](https://amodb.dev/pt/quickstart/): Faça sua primeira chamada ao amodb: obtenha uma chave, peça um filme em curl, JavaScript, Python, PHP ou Go e carregue o pôster. Menos de 2 minutos.

Atualizado: 2026-10-18. Source: https://amodb.dev/pt/genres/
