# Genuri și liste de referință

> Endpoint-urile pentru genuri și liste de referință întorc liste pe care le încarci o dată: ID-uri de gen pentru filme și TV cu nume în 14 limbi, plus țări, limbi, meserii din echipă, clasificări pe vârste și furnizori de streaming. Folosesc căi și structuri TMDB v3, nu cer paginare și se schimbă rar, deci ține-le în cache o zi.

## Endpoint

`GET /3/genre/movie/list`

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

Răspuns:

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

## Obține lista genurilor de filme

`GET /3/genre/movie/list` întoarce fiecare gen de film ca `id` și `name`. ID-urile sunt numerele pe care le poartă `genre_ids` la elementele din liste și pe care le așteaptă `with_genres` în [descoperire](https://amodb.dev/ro/discover/). Numele urmează parametrul `language`.

Exemplul încarcă lista și construiește o hartă de la ID la nume, primul lucru de care au nevoie majoritatea aplicațiilor.

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

### Parametri

| Parametru  | Loc        | Obligatoriu          | Descriere                                                                                                   |
| ---------- | ---------- | -------------------- | ----------------------------------------------------------------------------------------------------------- |
| `api_key`  | interogare | una dintre cele două | Cheia ta. Folosește-o pe aceasta sau antetul `Authorization: Bearer`.                                       |
| `language` | interogare | nu                   | Etichetă TMDB precum `en-US`, `ru-RU` sau `pt-BR`. Numele sunt întoarse în această limbă. Implicit `en-US`. |

### Câmpurile răspunsului

| Câmp            | Tip          | Observații                                         |
| --------------- | ------------ | -------------------------------------------------- |
| `genres`        | array        | Toată lista într-un singur răspuns, fără paginare. |
| `genres[].id`   | număr întreg | ID de gen stabil.                                  |
| `genres[].name` | șir          | Numele genului în limba cerută.                    |

### Exemplu de răspuns

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

Răspunsul conține 27 de genuri sortate după ID. Acesta este tăiat la primele 4.

## ID-uri de gen

Ambele căi de gen întorc aceste 27 de genuri, sortate după ID. Numele de mai jos sunt cele în engleză. Alte limbi întorc aceleași ID-uri cu nume traduse.

| ID    | Nume               |
| ----- | ------------------ |
| 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 genurilor TV

`GET /3/genre/tv/list` primește același parametru `language` și întoarce lista identică, deci o singură hartă de la ID la nume acoperă filmele și TV. În datele din liste, ID-urile `10759` și `10762` până la `10768` apar doar la elementele TV, iar ID-uri precum `28`, `12` și `878` apar la elementele de film. Când filtrezi TV în [descoperire](https://amodb.dev/ro/discover/), folosește ID-urile TV, de exemplu `10765` pentru Sci-Fi and Fantasy.

## Liste de referință

Aceste căi întorc date de referință pentru formulare, filtre și ecrane de setări. Toate cer cheia; niciuna nu primește `page`.

| Metodă și cale                            | Parametri                  | Fiecare element sau structură                                                            |
| ----------------------------------------- | -------------------------- | ---------------------------------------------------------------------------------------- |
| `GET /configuration/countries`            | niciunul                   | Array de `{ iso_3166_1, english_name, native_name }`                                     |
| `GET /configuration/languages`            | niciunul                   | Array de `{ iso_639_1, english_name, name }`                                             |
| `GET /configuration/primary_translations` | niciunul                   | Array de 14 șiruri precum `ru-RU`                                                        |
| `GET /configuration/jobs`                 | niciunul                   | Array de `{ department, jobs }`, unde `jobs` listează titlurile meseriilor               |
| `GET /certification/movie/list`           | niciunul                   | `{ certifications }` indexat după codul de țară, 10 țări                                 |
| `GET /certification/tv/list`              | niciunul                   | `{ certifications }` indexat după codul de țară, o cheie pentru fiecare țară din catalog |
| `GET /watch/providers/regions`            | `language`                 | `{ results }` cu `{ iso_3166_1, english_name, native_name }`                             |
| `GET /watch/providers/movie`              | `language`, `watch_region` | `{ results }` cu furnizori                                                               |
| `GET /watch/providers/tv`                 | `language`, `watch_region` | `{ results }` cu furnizori                                                               |

`/configuration/countries` și `/configuration/languages` ignoră `language` și întorc mereu aceleași nume. `native_name` din lista de regiuni urmează `language`. amodb nu oferă `/configuration/timezones`.

O intrare de clasificare numește calificativul, ce înseamnă și ordinea lui de sortare. Intrările sunt grupate după codul de țară, deci un singur apel acoperă fiecare piață. Lista de filme are textele calificativelor. La lista TV, `meaning` este un șir gol.

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

Exemplul este tăiat la 2 din cele 6 intrări pentru SUA. Lista de filme acoperă AU, BR, CA, DE, ES, FR, GB, IT, RU și US.

O intrare de furnizor are `provider_id`, `provider_name`, `logo_path`, `display_priority` și `display_priorities`, o hartă de la codul de țară la prioritate. Fără `watch_region` primești fiecare furnizor. Cu `watch_region=US` păstrezi doar furnizorii care servesc acea țară. O regiune necunoscută întoarce un array `results` gol. Transmite un cod de la `/watch/providers/regions`. Logourile furnizorilor se încarcă de la gazda de imagini, vezi [imagini](https://amodb.dev/ro/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
}
```

Aceasta este o intrare din `/watch/providers/movie?watch_region=US`.

## Erori

| HTTP | status_code | Când                                                                         |
| ---- | ----------- | ---------------------------------------------------------------------------- |
| 401  | 7           | Cheia lipsește sau este greșită.                                             |
| 402  | 36          | Perioada planului s-a încheiat.                                              |
| 404  | 34          | Calea nu există, de exemplu `/genre/book/list`.                              |
| 405  | 37          | Ai folosit o metodă de scriere pe o cale de referință.                       |
| 429  | 25          | Ai depășit cererile pe minut. Așteaptă numărul de secunde din `Retry-After`. |

Detaliile pentru fiecare cod sunt la [erori](https://amodb.dev/ro/errors/). Limitele planurilor sunt la [limite de cereri](https://amodb.dev/ro/rate-limits/).

## Note practice

- Încarcă listele o dată pe limbă la pornire și ține-le în memorie sau într-un fișier. Marginea ține în cache căile `/configuration` 24 de ore, deci o reîmprospătare zilnică din partea ta ajunge.
- Stochează ID-urile de gen în baza ta de date, nu numele. Un nume se schimbă cu limba, un ID nu.
- Ambele căi de gen întorc aceleași 27 de intrări, deci o singură hartă acoperă filmele și TV. ID-urile 10759 și 10762 până la 10768 apar doar la elementele TV.
- `with_genres=28,12` în [descoperire](https://amodb.dev/ro/discover/) înseamnă acțiune și aventură împreună. `with_genres=28|12` înseamnă oricare dintre ele.
- Numele genurilor urmează parametrul `language`. O etichetă din afara celor 14 limbi de bază de la [limbi](https://amodb.dev/ro/languages/) revine la engleză, iar câteva nume rămân în engleză în unele limbi, de exemplu `10759` în italiană.

## Întrebări și răspunsuri

### Se schimbă ID-urile de gen de la o limbă la alta?

Nu. ID-ul rămâne la fel și se traduce doar numele. Cere lista în limba pe care o afișezi, apoi ține în aplicație câte o hartă de la ID la nume pentru fiecare limbă.

### Folosesc filmele și TV ID-uri de gen diferite?

Împart același spațiu de ID-uri. Ambele căi de gen întorc aceleași 27 de genuri. Elementele de film folosesc ID-uri precum 28 și 12, iar cele de TV folosesc ID-uri îmbinate precum 10759 pentru Action and Adventure. O singură hartă le acoperă pe amândouă.

### Cum filtrez după două genuri deodată?

Transmite with_genres la discover. O virgulă între ID-uri înseamnă toate, deci 28,12 este acțiune și aventură împreună. O bară verticală înseamnă oricare. Folosește without_genres pentru a exclude.

### Au nevoie listele de referință de paginare?

Nu. Fiecare cale de referință întoarce lista completă într-un singur răspuns. Încarcă-le la pornire și ține-le în cache o zi. Căile de configurare sunt ținute în cache la margine 24 de ore.

## Pagini conexe

- [API discover](https://amodb.dev/ro/discover/): API discover cu filtrele TMDB v3. Listează filme și seriale după gen, distribuție, companie, cuvânt-cheie, an, evaluare, durată și furnizor, cu sortare.
- [API detalii film](https://amodb.dev/ro/movies/): API detalii film cu aceleași căi și același JSON ca TMDB v3. Preia un film după ID, adaugă credite, evaluări și atmosferă cu append_to_response, în 14 limbi.
- [API seriale TV](https://amodb.dev/ro/tv-series/): API seriale TV cu căile și JSON-ul TMDB v3. Preia un serial după ID cu sezoane, rețele și următorul episod, plus clasificări de conținut și furnizori.
- [Limbi](https://amodb.dev/ro/languages/): amodb servește titluri, descrieri și nume în 14 limbi. Trimite în language o etichetă în stil TMDB, precum ru-RU sau pt-BR; altă etichetă revine la engleză.
- [API imagini și gazdă de imagini](https://amodb.dev/ro/images-api/): API imagini filme cu căi TMDB v3: listează postere, imagini de fundal, logouri și cadre, apoi încarcă-le de la img.amodb.dev în 10 dimensiuni, fără cheie.
- [Ghid rapid](https://amodb.dev/ro/quickstart/): Fă primul apel amodb: ia o cheie, cere detaliile unui film în curl, JavaScript, Python, PHP sau Go, apoi încarcă posterul de pe img.amodb.dev. Sub 2 minute.

Actualizat: 2026-10-18. Source: https://amodb.dev/ro/genres/
