# Evaluări pentru filme și TV

> GET /3/movie/{movie_id}/ratings și GET /3/tv/{tv_id}/ratings întorc scorurile IMDb, Kinopoisk, Metacritic, Rotten Tomatoes și TMDB. Fiecare sursă este un obiect cu value și votes, sau null când este necunoscută. IMDb, Kinopoisk și TMDB sunt din 10, celelalte două din 100. Adaugă append_to_response=ratings ca să le îmbini în detalii.

## Endpoint

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

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

Răspuns:

```json
{
  "id": 550,
  "imdb": {
    "value": 8.8,
    "votes": 2669989
  },
  "kinopoisk": {
    "value": 8.7,
    "votes": null
  },
  "metacritic": {
    "value": 67,
    "votes": null
  },
  "rotten_tomatoes": {
    "value": 81,
    "votes": null
  },
  "tmdb": {
    "value": 8.437,
    "votes": 33042
  }
}
```

## Obține evaluările unui film

`GET /3/movie/{movie_id}/ratings` întoarce scorurile pe care le publică sursele de evaluări pentru un film. Răspunsul are `id`-ul filmului și cinci chei de sursă: `imdb`, `kinopoisk`, `metacritic`, `rotten_tomatoes` și `tmdb`. Fiecare cheie de sursă conține un obiect cu `value` și `votes`, sau `null` când acea sursă nu este cunoscută pentru titlu.

Exemplul încarcă Fight Club (ID 550) și afișează fiecare sursă, marcând sursele necunoscute.

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

```js
const res = await fetch('https://api.amodb.dev/3/movie/550/ratings', {
  headers: { Authorization: `Bearer ${process.env.AMODB_KEY}` },
});
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
const ratings = await res.json();
for (const source of ['imdb', 'kinopoisk', 'metacritic', 'rotten_tomatoes', 'tmdb']) {
  const score = ratings[source];
  console.log(source, score ? `${score.value} (votes: ${score.votes ?? 'unknown'})` : 'not known');
}
```

```python
import os
import requests

r = requests.get(
    "https://api.amodb.dev/3/movie/550/ratings",
    headers={"Authorization": f"Bearer {os.environ['AMODB_KEY']}"},
    timeout=10,
)
r.raise_for_status()
ratings = r.json()
for source in ("imdb", "kinopoisk", "metacritic", "rotten_tomatoes", "tmdb"):
    score = ratings[source]
    if score is None:
        print(source, "not known")
    else:
        print(source, score["value"], "votes:", score["votes"] or "unknown")
```

```php
<?php
$ch = curl_init('https://api.amodb.dev/3/movie/550/ratings');
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");
}
$ratings = json_decode($body, true);
foreach (['imdb', 'kinopoisk', 'metacritic', 'rotten_tomatoes', 'tmdb'] as $source) {
    $score = $ratings[$source];
    echo $source, ' ', $score === null ? 'not known' : $score['value'] . ' votes: ' . ($score['votes'] ?? 'unknown'), PHP_EOL;
}
```

```go
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"os"
	"time"
)

type Score struct {
	Value float64 `json:"value"`
	Votes *int    `json:"votes"`
}

type Ratings struct {
	IMDb           *Score `json:"imdb"`
	Kinopoisk      *Score `json:"kinopoisk"`
	Metacritic     *Score `json:"metacritic"`
	RottenTomatoes *Score `json:"rotten_tomatoes"`
	TMDB           *Score `json:"tmdb"`
}

func show(name string, s *Score) {
	if s == nil {
		fmt.Println(name, "not known")
		return
	}
	if s.Votes == nil {
		fmt.Println(name, s.Value, "votes: unknown")
		return
	}
	fmt.Println(name, s.Value, "votes:", *s.Votes)
}

func main() {
	req, _ := http.NewRequest("GET", "https://api.amodb.dev/3/movie/550/ratings", 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 r Ratings
	if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
		panic(err)
	}
	show("imdb", r.IMDb)
	show("kinopoisk", r.Kinopoisk)
	show("metacritic", r.Metacritic)
	show("rotten_tomatoes", r.RottenTomatoes)
	show("tmdb", r.TMDB)
}
```

### Parametri

| Parametru  | Loc        | Obligatoriu          | Descriere                                                             |
| ---------- | ---------- | -------------------- | --------------------------------------------------------------------- |
| `movie_id` | cale       | da                   | ID numeric de film, de exemplu `550`.                                 |
| `api_key`  | interogare | una dintre cele două | Cheia ta. Folosește-o pe aceasta sau antetul `Authorization: Bearer`. |

### Câmpurile răspunsului

| Câmp              | Tip                   | Observații                                                                                                     |
| ----------------- | --------------------- | -------------------------------------------------------------------------------------------------------------- |
| `id`              | număr întreg          | ID-ul filmului. Lipsește când folosești `append_to_response`.                                                  |
| `imdb`            | obiect sau null       | Scorul IMDb, din 10, cu o zecimală.                                                                            |
| `kinopoisk`       | obiect sau null       | Scorul Kinopoisk, din 10, cu o zecimală.                                                                       |
| `metacritic`      | obiect sau null       | Scorul Metacritic, din 100, ca număr întreg.                                                                   |
| `rotten_tomatoes` | obiect sau null       | Scorul Rotten Tomatoes, din 100, ca număr întreg.                                                              |
| `tmdb`            | obiect sau null       | Scorul utilizatorilor TMDB, din 10, cu până la trei zecimale.                                                  |
| `value`           | număr                 | În interiorul fiecărui obiect de sursă. Scorul pe scala proprie a sursei.                                      |
| `votes`           | număr întreg sau null | În interiorul fiecărui obiect de sursă. Numărul de voturi din spatele scorului sau `null` când nu se cunoaște. |

Citește cele cinci chei de sursă după nume și sari peste orice altă cheie. Cheile de sursă vin mereu în aceeași ordine: `imdb`, `kinopoisk`, `metacritic`, `rotten_tomatoes`, `tmdb`.

### Exemplu de răspuns

```json
{
  "id": 550,
  "imdb": { "value": 8.8, "votes": 2669989 },
  "kinopoisk": { "value": 8.7, "votes": null },
  "metacritic": { "value": 67, "votes": null },
  "rotten_tomatoes": { "value": 81, "votes": null },
  "tmdb": { "value": 8.437, "votes": 33039 }
}
```

Doar IMDb și TMDB vin aici cu număr de voturi. Kinopoisk, Metacritic și Rotten Tomatoes au un scor și un număr de voturi `null`.

## Obține evaluările unui serial TV

`GET /3/tv/{tv_id}/ratings` are aceleași chei și aceleași reguli pentru null. Transmite ID-ul serialului, de exemplu `1396` pentru Breaking Bad.

| Metodă și cale                    | Întoarce            | Parametri  |
| --------------------------------- | ------------------- | ---------- |
| `GET /3/movie/{movie_id}/ratings` | `id` și cinci surse | `movie_id` |
| `GET /3/tv/{tv_id}/ratings`       | `id` și cinci surse | `tv_id`    |

```bash
curl -sf "https://api.amodb.dev/3/tv/1396/ratings" -H "Authorization: Bearer $AMODB_KEY"
```

Breaking Bad nu are scor Metacritic, deci acea sursă este `null`:

```json
{
  "id": 1396,
  "imdb": { "value": 9.5, "votes": 2671962 },
  "kinopoisk": { "value": 8.9, "votes": null },
  "metacritic": null,
  "rotten_tomatoes": { "value": 96, "votes": null },
  "tmdb": { "value": 9, "votes": 18863 }
}
```

## Adaugă evaluările la un apel de detalii

`append_to_response=ratings` funcționează la detaliile de film și de TV. Obiectul sosește sub cheia `ratings`, lângă câmpurile obișnuite, fără propriul `id`. O pagină de listă are nevoie de o cerere pe titlu în loc de două.

| Cerere                                          | Unde apar scorurile                       |
| ----------------------------------------------- | ----------------------------------------- |
| `/3/movie/550?append_to_response=ratings`       | `ratings` în fișa filmului                |
| `/3/tv/1396?append_to_response=credits,ratings` | `ratings` și `credits` în fișa serialului |

Vezi [detalii film](https://amodb.dev/ro/movies/) și [seriale TV](https://amodb.dev/ro/tv-series/) pentru celelalte valori pe care le poți atașa.

## Surse și valori null

O sursă null nu este un scor zero. Înseamnă că scorul lipsește pentru titlu.

| Cheie             | Sursă           | Scală         | Eticheta de afișat |
| ----------------- | --------------- | ------------- | ------------------ |
| `imdb`            | IMDb            | 0 până la 10  | IMDb               |
| `kinopoisk`       | Kinopoisk       | 0 până la 10  | Kinopoisk          |
| `metacritic`      | Metacritic      | 0 până la 100 | Metacritic         |
| `rotten_tomatoes` | Rotten Tomatoes | 0 până la 100 | Rotten Tomatoes    |
| `tmdb`            | TMDB            | 0 până la 10  | TMDB               |

Acoperirea variază după titlu, deci scrie codul pentru null, nu pentru o listă fixă de surse. Oricare dintre cele cinci chei poate fi null pentru orice titlu.

## Cum diferă evaluările de vote_average

Câmpurile `vote_average` și `vote_count` din fișa unui film sau serial sunt scorul utilizatorilor TMDB. Cheia `tmdb` poartă același scor în aceeași structură ca celelalte patru, deci un singur apel îți dă toate cele cinci surse într-un singur format.

Fiecare sursă are publicul și scala ei. Nu le face media și nu compara o valoare dintr-o sursă cu numărul de voturi din alta.

## Arată evaluările într-o aplicație

Afișează doar sursele prezente. O listă scurtă de insigne ajunge pentru un card. Adaugă scala, ca un cititor să poată deosebi 8.8 din 10 de 67 din 100.

```js
const labels = {
  imdb: ['IMDb', 10],
  kinopoisk: ['Kinopoisk', 10],
  metacritic: ['Metacritic', 100],
  rotten_tomatoes: ['Rotten Tomatoes', 100],
  tmdb: ['TMDB', 10],
};

function badges(ratings) {
  return Object.entries(labels)
    .filter(([key]) => ratings[key])
    .map(([key, [label, max]]) => `${label} ${ratings[key].value}/${max}`);
}
```

Arată eticheta la fiecare valoare. Când toate cele cinci sunt null, ascunde blocul în loc să arăți insigne goale.

## Erori

Eșecurile păstrează corpul de eroare TMDB, în care `success` este false, iar `status_code` numește problema. Un titlu fără scoruri nu este una dintre ele.

| HTTP | status_code | Când                                                                         |
| ---- | ----------- | ---------------------------------------------------------------------------- |
| 401  | 7           | Cheia lipsește sau este greșită.                                             |
| 402  | 36          | Perioada planului s-a încheiat.                                              |
| 404  | 34          | Niciun film sau serial cu acel ID.                                           |
| 429  | 25          | Ai depășit cererile pe minut. Așteaptă numărul de secunde din `Retry-After`. |

Un scor necunoscut este `null`, nu o eroare. Detaliile sunt la [erori](https://amodb.dev/ro/errors/) și [limite de cereri](https://amodb.dev/ro/rate-limits/).

## Note practice

- Evaluările sunt ținute în cache la margine 6 ore, ca detaliile. O reîmprospătare mai deasă întoarce același corp.
- O cerere cu `append_to_response=ratings` se numără ca o singură cerere din cele 20, 40 sau 120 pe minut.
- Stochează scorurile împreună cu data la care le-ai preluat. Voturile cresc în timp, iar cifrele se mișcă.
- Ca să mapezi mai întâi un ID IMDb sau Kinopoisk la un titlu, folosește [căutare după ID extern](https://amodb.dev/ro/find-by-external-id/). Pentru senzații în loc de scoruri, vezi [atmosfere](https://amodb.dev/ro/moods/).

## Întrebări și răspunsuri

### De ce este o sursă null?

Null înseamnă că scorul lipsește sau este zero pentru acel titlu. O lansare nouă sau un film regional are adesea mai puține surse decât unul faimos, deci tratează mereu null înainte să formatezi un număr. Câmpul votes poate fi și el null.

### Prin ce diferă de vote_average?

Câmpul vote_average dintr-o fișă de detalii este doar scorul utilizatorilor TMDB. Endpoint-ul de evaluări îl întoarce din nou sub cheia tmdb, cu trei zecimale, și adaugă celelalte patru surse, fiecare ca value și votes.

### Pot face media celor cinci scoruri?

Nu. IMDb, Kinopoisk și TMDB sunt din 10, în timp ce Metacritic și Rotten Tomatoes sunt din 100. Fiecare sursă are și publicul ei, iar unele sunt null. Arată sursele pe care le ai una lângă alta, cu etichetele lor.

### Costă apelul de evaluări cereri în plus?

Este o cerere ca oricare alta. Cu append_to_response=ratings scorurile sosesc în interiorul unui apel de detalii, deci folosești un singur loc din cererile pe minut în loc de două.

## Pagini conexe

- [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.
- [Căutare după ID extern](https://amodb.dev/ro/find-by-external-id/): Caută un film, serial sau o persoană după ID IMDb, TVDB, Wikidata sau Kinopoisk cu endpoint-ul find și citește ID-urile externe și faptele Wikidata.
- [Indicatori de atmosferă](https://amodb.dev/ro/moods/): API atmosferă filme cu indicatori de la 0 la 10 pe titlu. Citește atmosferele unui film, îmbină-le cu append_to_response=moods, construiește insigne sau filtre.
- [Limite de cereri](https://amodb.dev/ro/rate-limits/): amodb limitează fiecare cheie în cereri pe minut, în fereastră glisantă de 60 de secunde: 20, 40 sau 120. Citește antetele și tratează 429 cu Retry-After.
- [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/ratings/
