API do MyAnimes

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

JanelaRequisições
Por minuto60
Por dia10,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ó.

ChamadaCusto
/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
Não quebre a chamada para economizar. Pedir a ficha e depois os personagens em duas chamadas custa o mesmo (1 + 1) que pedir tudo numa (2) — e gasta o dobro de ida e volta na rede. Junte o que você precisa junto.

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

VarianteArquivoConté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.

Dados extras (cada um soma 1 crédito)
Campos (nenhum marcado = os básicos)
Sua rota custo: 1 crédito(s)
GET

/anime

Lista com filtros e paginação. Aceita fields e lang, mas não include.

ParâmetroExemploO 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
    }
}
GET

/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"
GET

/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.