API do MyAnimes (1.0)
Dados de anime em JSON. Há duas formas de pegá-los, e a escolha certa depende do que você vai fazer.
Qual das duas usar
📦 Dump diário
O catálogo inteiro num arquivo, gerado toda madrugada.
Sem token e sem limite. Para espelhar, cruzar ids ou montar índice.
🔎 API de consulta
Pergunta ao banco, com filtros e escolha de campos.
Com token e limite. Para pouco e específico: uma busca, uma ficha.
Vai varrer tudo? Use o dump. Percorrer o catálogo pela API custa mais de mil requisições e esbarra no limite diário. O dump entrega o mesmo em um download.
Autenticação
A API de consulta exige um token, e o token pertence a uma aplicação — não à sua conta. Registre a sua na área do desenvolvedor: você descreve o que ela faz, para que vai usar os dados e quais precisa. Depois de aprovada, o token é gerado ali.
É por aplicação, e não por pessoa, para o limite ser por projeto: se um deles abusar, só ele é bloqueado — os seus outros continuam funcionando.
curl -H "Authorization: Bearer SEU_TOKEN" \
"https://myanimes.online/api/public/v1/anime?limit=5"
O token é secreto: quem tiver o seu consome o seu limite. Não o coloque em código que roda no navegador nem em repositório público.
Limites de uso
| Janela | Requisições |
|---|---|
| Por minuto | 60 |
| Por dia | 10,000 |
Toda resposta traz quanto sobrou, para você se controlar sem levar bloqueio:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 58
X-RateLimit-Daily-Limit: 10000
X-RateLimit-Daily-Left: 9871
Ao estourar, a resposta é 429 com
Retry-After em segundos.
Respeite-o em vez de tentar de novo em laço.
Existe ainda um teto agregado, somando todas as aplicações.
Se ele for atingido você recebe
503 capacidade_esgotada — que não é o
seu limite, e sim a capacidade do site naquele minuto. Ele é folgado o
bastante para não atrapalhar uso normal; existe para um pico não derrubar o
site para todo mundo, você incluído.
Créditos por chamada
O limite acima conta créditos, não requisições. A razão é prática: pedir a ficha de um anime e pedir a mesma ficha com personagens, equipe, episódios e relações é uma requisição para você, mas cinco consultas para o servidor. Cobrar igual premiaria quem junta tudo numa chamada só.
| Chamada | Custo |
|---|---|
/anime/52991 |
1 |
/anime/52991?include=characters |
2 |
/anime/52991?include=characters,staff,episodes,relations |
5 |
/meta |
1 |
A regra é 1 de base + 1 por
include. Escolher campos com
fields não custa nada — é de graça pedir só
o que você usa. E include com nome inválido
não é cobrado, porque também não é entregue.
Cada resposta diz quanto aquela chamada custou, para o saldo nunca cair sem explicação:
X-Credits-Cost: 5
Respostas HTTP
| Status | Código | O que houve |
|---|---|---|
| 200 | — |
Deu certo. |
| 401 | token_ausente |
Faltou o cabeçalho Authorization. |
| 401 | token_invalido |
Token não reconhecido. |
| 401 | token_expirado |
Gere outro no painel. |
| 403 | sem_permissao |
O token não tem a habilidade api:read. |
| 403 | token_nao_e_de_aplicacao |
Use o token de uma aplicação registrada. |
| 403 | aplicacao_indisponivel |
Aplicação em análise, recusada ou suspensa. |
| 404 | nao_encontrado |
Não existe, ou não é público. |
| 422 | — |
Parâmetro inválido. A resposta diz qual. |
| 422 | include_nao_suportado |
A listagem não aceita include; use a ficha. |
| 429 | limite_por_minuto |
Espere o Retry-After. |
| 429 | limite_diario |
Use o dump para varredura. |
| 503 | api_desativada |
A API está pausada. Seu token continua válido; tente mais tarde. |
| 503 | capacidade_esgotada |
Não é o seu limite: é o teto agregado do site. Tente em instantes. |
Formato de erro
Sempre igual, com um codigo estável — para
você tratar por ele, e não casando texto que pode mudar.
{
"erro": {
"codigo": "limite_por_minuto",
"mensagem": "Limite de 60 requisições por minuto. Tente de novo em 42s.",
"docs": "https://myanimes.online/api"
}
}
Dump — variantes
| Variante | Arquivo | Contém |
|---|---|---|
| completo | anime-completo.json |
todos os campos, com sinopse |
| leve | anime-leve.json |
sem sinopse nem histórico — bem menor |
A sinopse responde pela maior parte do peso. Se você só precisa de id, título, nota e datas, o leve baixa numa fração do tempo.
# baixe a versão .gz — mesmo conteúdo, muito menor
curl -O https://myanimes.online/storage/api/dump/anime-leve.json.gz
gunzip anime-leve.json.gz
Dump — formato
{
"gerado_em": "2026-08-29T04:40:00+00:00",
"total": 27216,
"variante": "leve",
"licenca": "Uso livre com atribuicao a myanimes.online",
"data": [
{ "mal_id": 1, "title": "Cowboy Bebop", "type": "TV", "score": 8.75 }
]
}
Campo nulo ou vazio não aparece — encolhe o arquivo sem perder informação. Trate a ausência como “não temos esse dado”.
🛠 Montar minha rota
Marque o que você precisa e a URL sai pronta, com o custo em créditos. Serve para responder “qual rota eu chamo para pegar o anime e os episódios dele” sem ler a página inteira.
/anime
Lista com filtros e paginação. Aceita fields e lang, mas não include.
| Parâmetro | Exemplo | O que faz |
|---|---|---|
q |
frieren |
busca no título, em qualquer idioma |
type |
TV |
TV, Movie, OVA, ONA, Special… |
status |
Currently Airing |
situação de exibição |
season |
fall |
winter, spring, summer ou fall |
year |
2023 |
ano da temporada |
genre |
Action |
um gênero, pelo nome |
min_score |
8 |
nota mínima |
airing |
true |
só o que está no ar |
order_by |
score |
score, members, favorites, year, title, mal_id |
order |
desc |
asc ou desc |
page |
2 |
página |
limit |
50 |
itens por página (máx. 100) |
fields |
mal_id,title,score |
só os campos que você quer |
lang |
pt-BR |
idioma dos textos, quando houver tradução |
curl -H "Authorization: Bearer SEU_TOKEN" \
"https://myanimes.online/api/public/v1/anime?type=TV&year=2023&min_score=8&fields=mal_id,title,score&limit=5"
{
"data": [
{ "mal_id": 52991, "title": "Sousou no Frieren", "score": 9.27 }
],
"paginacao": {
"pagina": 1, "por_pagina": 5, "total": 40,
"ultima": 8, "tem_proxima": true
}
}
/anime/{mal_id}
Uma ficha. Aceita fields e mais
include, para trazer relações — cada uma é
uma consulta a mais, então só vem se você pedir.
Aceita também lang.
O exemplo abaixo custa 3 créditos (1 de base + 2 includes).
curl -H "Authorization: Bearer SEU_TOKEN" \
"https://myanimes.online/api/public/v1/anime/52991?include=genres,episodes"
/meta
Os valores aceitos pelos filtros (tipos, situações, gêneros) e a lista de campos. Consulte uma vez e guarde — assim você não descobre os valores gastando requisição.
Campos disponíveis
Sem fields, você recebe o básico:
mal_id, title, title_english, type, status, score, members, season, year, cover_url .
mal_id
title
title_english
title_japanese
title_synonyms
synopsis
background
cover_url
banner_image
type
format
status
airing
source
duration
season
year
start_date
end_date
score
scored_by
members
favorites
popularity
rank
rating
is_adult
broadcast_day
broadcast_time
broadcast_timezone
trailer_youtube_id
external_links
streaming_links
site_url
next_episode_number
next_episode_at
slug
Campo fora da lista é ignorado, e não vira erro — assim uma coluna renomeada aqui dentro não quebra a sua integração.
Relações (include)
genres
studios
episodes
characters
staff
relations
Cada relação traz no máximo 100 itens. O teto existe porque um anime longo tem mais de mil episódios, e devolver todos numa resposta pedida “de passagem” entrega megabytes que você não esperava.
include vale só em
/anime/{mal_id}. Na listagem ele é recusado
com 422 include_nao_suportado, e não
silenciosamente ignorado: seriam N consultas por página, e você receberia a
lista sem as relações sem saber por quê. Peça a lista, depois a ficha de cada
anime com o que precisar.
Idiomas (lang)
Passe lang para receber os textos traduzidos
quando existir tradução revisada. Aceitos:
pt-BR, en, es, fr, it, ja — o padrão é en.
Campos que mudam com o idioma:
title, synopsis, background .
Os demais (nota, datas, estúdios…) não têm idioma.
curl -H "Authorization: Bearer SEU_TOKEN" \
"https://myanimes.online/api/public/v1/anime/20?lang=pt-BR&fields=mal_id,title,synopsis"
{
"idioma": "pt-BR",
"creditos": 1,
"data": {
"mal_id": 20,
"title": "Naruto",
"synopsis": "Doze anos atrás, uma raposa demônio colossal aterrorizou…"
}
}
A tradução é oportunista: sem tradução para o idioma pedido,
o campo volta no idioma base em vez de vir vazio — meia ficha é pior que uma
ficha em outro idioma. Um lang que não
esteja na lista também cai no padrão, sem erro. Por isso a resposta sempre
traz o campo idioma: é ele que diz o que
você recebeu de fato, sem você ter de adivinhar.
Cache e ETag
Toda resposta traz um ETag. Guarde-o e
devolva em If-None-Match na próxima
consulta à mesma URL: se nada mudou, você recebe
304 sem corpo.
curl -H "Authorization: Bearer SEU_TOKEN" \
-H 'If-None-Match: "0ea066dc9f66a3dbf51d4d6b159894d7"' \
"https://myanimes.online/api/public/v1/anime?limit=100"
HTTP/1.1 304 Not Modified
Medido nessa mesma listagem: 26.298 bytes na primeira chamada, 0 na segunda. Para quem atualiza uma tela de tempos em tempos, é a diferença entre baixar o catálogo de novo e não baixar nada.
O 304 continua custando o mesmo
em créditos, e isso não é pegadinha: a consulta ao banco aconteceu
para descobrir que nada mudou. O que o ETag economiza é a sua rede, não o
trabalho do servidor. Os cabeçalhos de saldo vêm no 304 também, então você
não perde o controle do limite.
As respostas vão com Cache-Control: private,
max-age=60. É private porque o
conteúdo é igual para todos, mas os cabeçalhos de saldo não são — um cache
compartilhado entregaria o saldo de uma aplicação para outra.
Regras de uso
- Cite a fonte. Se os dados aparecem no seu projeto, indique que vieram do MyAnimes, com link.
- Não revenda os dados como produto. Usar num app, site ou pesquisa é livre — inclusive com anúncios.
- Cacheie do seu lado. Pedir a mesma ficha mil vezes por dia gasta o seu limite à toa.
- Uma aplicação por projeto. Se uma abusar, só ela é bloqueada.
- Parte dos dados vem de bases mantidas pela comunidade — veja os créditos em sobre. As condições de lá valem para o que você redistribuir.
A API é oferecida como está, sem garantia de disponibilidade. Endpoints e campos
podem ganhar acréscimos sem aviso; mudanças que quebrem integração nascem numa
versão nova (/v2), e a v1 continua no ar.
Dúvida ou limite maior para um projeto específico? Fale pela página de contato.