# Medidores de mood

> GET /3/movie/{movie_id}/moods e GET /3/tv/{tv_id}/moods retornam uma source e uma lista results. Cada resultado tem o nome de um mood, como fear ou humor, um avg numa escala de 0 a 10 e os valores por trás dele. Adicione append_to_response=moods a uma chamada de detalhes para juntar os medidores sem uma segunda requisição.

## Endpoint

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

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

Resposta:

```json
{
  "id": 155,
  "source": "measured",
  "results": [
    {
      "name": "action",
      "avg": 3.9,
      "values": [
        3.6,
        3.4,
        4.2
      ]
    },
    {
      "name": "fear",
      "avg": 5.2,
      "values": [
        3.6,
        6,
        4.8
      ]
    },
    {
      "name": "humor",
      "avg": 0.9,
      "values": [
        2.4,
        1.8,
        0.4
      ]
    }
  ]
}
```

## Obter os medidores de mood de um filme

`GET /3/movie/{movie_id}/moods` retorna os medidores de mood (clima emocional) de um filme. Um medidor de mood é um nome e uma média numa escala de 0 a 10. A resposta traz o `id` do filme, um `source` e um array `results`. Cada resultado contém `name`, `avg` e `values`.

O exemplo carrega os medidores de The Dark Knight (id 155) e os exibe do mais forte ao mais fraco.

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

```js
const res = await fetch('https://api.amodb.dev/3/movie/155/moods', {
  headers: { Authorization: `Bearer ${process.env.AMODB_KEY}` },
});
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
const { source, results } = await res.json();
console.log('source:', source);
for (const m of [...results].sort((a, b) => b.avg - a.avg)) {
  console.log(m.name.padEnd(10), m.avg);
}
```

```python
import os
import requests

r = requests.get(
    "https://api.amodb.dev/3/movie/155/moods",
    headers={"Authorization": f"Bearer {os.environ['AMODB_KEY']}"},
    timeout=10,
)
r.raise_for_status()
data = r.json()
print("source:", data.get("source"))
for m in sorted(data["results"], key=lambda m: m["avg"], reverse=True):
    print(f"{m['name']:<10} {m['avg']}")
```

```php
<?php
$ch = curl_init('https://api.amodb.dev/3/movie/155/moods');
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");
}
$data = json_decode($body, true);
echo 'source: ', $data['source'] ?? 'none', PHP_EOL;
$results = $data['results'];
usort($results, fn ($a, $b) => $b['avg'] <=> $a['avg']);
foreach ($results as $m) {
    printf("%-10s %.1f\n", $m['name'], $m['avg']);
}
```

```go
package main

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

type Mood struct {
	Name   string    `json:"name"`
	Avg    float64   `json:"avg"`
	Values []float64 `json:"values"`
}

func main() {
	req, _ := http.NewRequest("GET", "https://api.amodb.dev/3/movie/155/moods", 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 body struct {
		Source  string `json:"source"`
		Results []Mood `json:"results"`
	}
	if err := json.NewDecoder(res.Body).Decode(&body); err != nil {
		panic(err)
	}
	fmt.Println("source:", body.Source)
	sort.Slice(body.Results, func(i, j int) bool { return body.Results[i].Avg > body.Results[j].Avg })
	for _, m := range body.Results {
		fmt.Printf("%-10s %.1f\n", m.Name, m.Avg)
	}
}
```

### Parâmetros

| Parâmetro  | Em       | Obrigatório | Descrição                                                          |
| ---------- | -------- | ----------- | ------------------------------------------------------------------ |
| `movie_id` | caminho  | sim         | Id numérico do filme, por exemplo `155`.                           |
| `api_key`  | consulta | um dos dois | Sua chave. Use este parâmetro ou o header `Authorization: Bearer`. |

### Campos da resposta

| Campo              | Tipo             | Observações                                                                                                           |
| ------------------ | ---------------- | --------------------------------------------------------------------------------------------------------------------- |
| `id`               | inteiro          | Id do filme.                                                                                                          |
| `source`           | string ou null   | `measured` para dados de espectadores, `estimated` quando derivado dos gêneros, `null` quando o título não tem dados. |
| `results`          | array            | Medidores de mood ordenados por `name`. Vazio quando nada é conhecido.                                                |
| `results[].name`   | string           | Palavra curta em minúsculas, como `fear`.                                                                             |
| `results[].avg`    | número           | Média numa escala de 0 a 10. Uma casa decimal em títulos medidos, número inteiro nos estimados.                       |
| `results[].values` | array de números | Até 24 leituras na mesma escala de 0 a 10. Os títulos medidos vistos têm 6, os estimados têm 5.                       |

Os nomes vistos hoje são `action`, `fear`, `humor`, `pace`, `profanity`, `romance`, `sadness`, `sex` e `violence`. Nem todo título tem os nove, então exiba os nomes a partir dos dados e não de uma lista fixa.

### Exemplo de resposta

```json
{
  "id": 155,
  "source": "measured",
  "results": [
    { "name": "action", "avg": 3.9, "values": [3.6, 3.4, 4.2, 4.2, 4.8, 3] },
    { "name": "fear", "avg": 5.2, "values": [3.6, 6, 4.8, 6.4, 6.4, 3.8] },
    { "name": "humor", "avg": 0.9, "values": [2.4, 1.8, 0.4, 0.4, 0, 0.5] }
  ]
}
```

A lista foi cortada para 3 dos 9 resultados.

### Títulos medidos e estimados

Fight Club (id 550) ainda não tem dados de espectadores, então seus medidores são derivados dos gêneros. Todo `avg` é um número inteiro e `values` tem 5 entradas.

```json
{
  "id": 550,
  "source": "estimated",
  "results": [
    { "name": "action", "avg": 4, "values": [3, 4, 5, 4, 3] },
    { "name": "fear", "avg": 7, "values": [6, 7, 8, 7, 6] }
  ]
}
```

Verifique `source` se quiser tratar os medidores estimados de forma diferente dos medidos.

## Obter os medidores de mood de uma série

`GET /3/tv/{tv_id}/moods` tem o mesmo formato de resposta, com o id da série em `id`. Para Breaking Bad use `1396`.

| Método e caminho              | Retorna                          | Parâmetros                                         |
| ----------------------------- | -------------------------------- | -------------------------------------------------- |
| `GET /movie/{movie_id}/moods` | `id`, `source` e `results`       | `movie_id`                                         |
| `GET /tv/{tv_id}/moods`       | `id`, `source` e `results`       | `tv_id`                                            |
| `append_to_response=moods`    | `source` e `results` sob `moods` | Adicionado aos detalhes de filme ou de série de TV |

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

Quando você acrescenta `moods` a uma chamada de detalhes, a chave `moods` fica no nível superior do registro, ao lado de `title` ou `name`. Ela contém `source` e `results` e não tem `id` próprio. Isso custa uma requisição, enquanto duas chamadas separadas custam duas.

## Como ler a escala

O campo `avg` é uma intensidade de 0 a 10. Um número maior significa que o mood é mais forte no título.

| Faixa   | Leitura                    |
| ------- | -------------------------- |
| 0 a 2.9 | O mood é fraco ou ausente. |
| 3 a 5.9 | O mood está presente.      |
| 6 a 7.9 | O mood é nítido.           |
| 8 a 10  | O mood define o título.    |

As faixas são uma sugestão para a sua interface, não um campo da resposta. O array `values` contém as leituras por trás da média, na mesma escala.

## Criar selos e filtros

Os moods servem a três padrões comuns de interface. Escolha valores de corte que combinem com o seu catálogo e ajuste-os.

| Padrão           | Regra                                                         | Observações                                         |
| ---------------- | ------------------------------------------------------------- | --------------------------------------------------- |
| Selo             | Mostre até 3 moods com `avg` 6 ou mais                        | Ordene primeiro por `avg`.                          |
| Barra de medidor | Defina a largura da barra como `avg` vezes 10, em porcentagem | A escala vai de 0 a 10.                             |
| Chip de filtro   | Selecione os títulos em que o mood escolhido é 7 ou mais      | Busque os medidores por título e filtre localmente. |

```js
function topMoods(results, min = 6, limit = 3) {
  return results
    .filter((m) => m.avg >= min)
    .sort((a, b) => b.avg - a.avg)
    .slice(0, limit)
    .map((m) => m.name);
}

function matchesMood(results, name, min = 7) {
  return results.some((m) => m.name === name && m.avg >= min);
}
```

Um array `results` vazio deve aparecer como nenhum selo, não como um erro.

## Erros

O corpo do erro tem `success`, `status_code` e `status_message`, os mesmos campos que o TMDB usa.

| HTTP | status_code | Quando                                                                                        |
| ---- | ----------- | --------------------------------------------------------------------------------------------- |
| 401  | 7           | A chave está ausente ou incorreta.                                                            |
| 402  | 36          | O período do plano terminou.                                                                  |
| 429  | 25          | Acima do seu limite de requisições por minuto. Espere os segundos indicados em `Retry-After`. |

O endpoint de moods não responde 404 para um id desconhecido. Ele responde 200 com um array `results` vazio, e `source` é `null` ou fica ausente. Quando acrescentado aos detalhes, um id desconhecido gera 404 na chamada de detalhes. A lista completa está em [erros](https://amodb.dev/pt/errors/), e os limites estão em [limites de requisições](https://amodb.dev/pt/rate-limits/).

## Notas práticas

- Como os demais dados de detalhes, os medidores de mood ficam em cache de borda por 6 horas. Buscá-los com mais frequência retorna o mesmo corpo.
- Uma lista de 20 títulos exige 20 requisições de moods. Se você já chama os detalhes de cada título, acrescente `moods` e economize a segunda chamada.
- Verifique `source` antes de comparar títulos. Valores medidos e estimados usam a mesma escala, mas não a mesma precisão.
- Se você filtra com frequência, guarde `name` e `avg` junto com o id do título no seu próprio banco de dados. Um filtro local vence uma requisição por título.
- Combine os medidores com as [avaliações](https://amodb.dev/pt/ratings/) para ter uma nota e com as [trilhas sonoras](https://amodb.dev/pt/soundtracks/) para a música do mesmo título.

## Perguntas e respostas

### O que significa o valor de um mood?

O campo avg é uma intensidade numa escala de 0 a 10, com uma casa decimal em títulos medidos. Um avg de 7 em fear indica que o título é assustador, e 0 indica que o mood está ausente. Não é uma porcentagem nem uma nota de avaliação.

### A lista de nomes de mood é fixa?

Não presuma que seja. Os nomes vistos hoje são action, fear, humor, pace, profanity, romance, sadness, sex e violence, e um título pode ter menos de nove. Exiba as strings de nome que receber, para que um nome novo também apareça.

### O que significam measured e estimated em source?

Measured quer dizer que os medidores vêm de dados de espectadores e trazem decimais. Estimated quer dizer que foram derivados dos gêneros do título, então avg é um número inteiro. Um título sem dados tem um array results vazio e source igual a null.

### Como filtro uma lista de títulos por mood?

Busque os medidores de cada título da sua lista, pelo endpoint de moods ou com append_to_response nos detalhes, e mantenha os títulos em que o mood escolhido passa do seu valor mínimo. O filtro roda no seu código.

### As séries também têm moods?

Sim. Use GET /3/tv/{tv_id}/moods, por exemplo com o id de série 1396. A resposta tem o mesmo formato do endpoint de filmes.

## Páginas relacionadas

- [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.
- [Avaliações de filmes e séries](https://amodb.dev/pt/ratings/): API de avaliações de filmes com as notas do IMDb, Kinopoisk, Metacritic, Rotten Tomatoes e TMDB em uma só chamada, com null se a fonte for desconhecida.
- [Trilhas sonoras](https://amodb.dev/pt/soundtracks/): API de trilha sonora de filmes: retorna o álbum de um filme ou série com a lista de faixas. Chame o endpoint ou use append_to_response=soundtracks.
- [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.
- [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/moods/
