BYTETOOLS

AnimeThemes API

AnimeThemes is a free, key-free API for anime opening and ending themes: series, songs, artists and hosted video and audio files, cross-linked and filterable. Live example included.

No API key requiredCORS enabledHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the AnimeThemes API?

AnimeThemes is a free, key-free REST API cataloguing anime opening and ending themes. It links anime to their themes, themes to songs, songs to performing artists, and each theme to hosted WebM video and audio files, with filtering, sparse fieldsets and includes across the whole graph.

Most anime APIs stop at series metadata. This one goes down a level that nothing else covers well: the actual songs. A single anime record can be expanded to its opening and ending themes, each theme to its song, each song to the artists who performed it, and each theme entry to the video files AnimeThemes hosts — which means you can go from a series title to a playable, correctly-timed opening in one request chain.

The API borrows JSON:API conventions without being strict about them. You get `include` for eager-loading relationships, `fields[anime]` for sparse fieldsets, `filter[...]` for narrowing and `page[size]` and `page[number]` for paging, so a well-constructed request returns exactly the graph you need and nothing else. Rate limiting is real and published in headers — 90 requests per minute — which is generous but easy to blow through if you fan out one request per series. Fetch broader pages with includes instead of looping over ids.

Quick facts

Base URL
https://api.animethemes.moe
Authentication
No key or account for public read access.
Rate limit
90 requests per minute, reported in `X-RateLimit-Limit` and `X-RateLimit-Remaining` on every response.
Pricing
Free. Community-run and open source.
CORS
Enabled — callable directly from browser JavaScript
Official docs
Read the docs

How to use the AnimeThemes API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. Fetch two anime records

GET https://api.animethemes.moe/anime?page%5Bsize%5D=2

curl
curl 'https://api.animethemes.moe/anime?page%5Bsize%5D=2'
JavaScript (fetch)
const res = await fetch("https://api.animethemes.moe/anime?page%5Bsize%5D=2");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://api.animethemes.moe/anime?page%5Bsize%5D=2", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "anime": [
    {
      "id": 1,
      "name": ".hack//Liminality",
      "media_format": "OVA",
      "season": "Spring",
      "slug": "hackliminality",
      "synopsis": "While playing the newly released MMORPG ‘The World’, Minase Mai and Tomonari Kasumi collapsed in the real world and were sent to the hospital after hearing a mysterious sound. Only Mai had recovered while her friend Kasumi had slipped into a mysterious coma. Mai is later approached by the creator of ‘The World’, Tokuoka Junichiro, who unveils to her that, just like her friend, six other players across the country had also collapsed while playing ‘The World’ and are now in mysterious comas. What exactly is ‘The World’, what is this mysterious sound Mai keeps on hearing, and why are people slipping into comas from this game? Minase, Junichiro and their acquaintances set off to get to the bottom of this problem before any further harm happens.\n\n[Written by MAL Rewrite]",
      "year": 2002
    },
    {
      "id": 2,
      "name": ".hack//roots",
      "media_format": "TV",
      "season": "Spring",
      "slug": "hackroots",
      "synopsis": "After the destruction of \"The World\" in 2015, CC Corporation rebuilt the game using data from what was previously to be another game. \"The World R:2\" was then released in 2016. A newcomer to the game, Haseo, is instantly PKed and then revived by a mysterious man known as Ovan. With the problem of PKs occupying the game, Haseo soon after receives help from a female Harvest known as Shino. Amidst curiosity and c

Parameters

ParameterTypeRequiredDescription
page[size]integerOptionalRecords per page. 2
page[number]integerOptionalWhich page to fetch. 2
includestringOptionalComma-separated relationships to eager-load, e.g. `animethemes.song.artists`. This is how you get from a series to its music in one call. animethemes.song
fields[anime]stringOptionalSparse fieldset — return only the listed attributes for that resource type. name,season,year
filter[season]stringOptionalNarrow by season, year, media format and other attributes. Spring
qstringOptionalFree-text search across the resource. cowboy bebop
sortstringOptionalAttribute to sort by; prefix with `-` to reverse. -year

Response fields

anime[]array
The requested records. The top-level key is named after the resource, not a generic `data`.
anime[].idinteger
Stable numeric id.
anime[].namestring
Series title.
anime[].slugstring
URL-safe identifier used on the AnimeThemes site.
anime[].media_formatstring
`TV`, `OVA`, `Movie` and similar.
anime[].season / yearstring / integer
Broadcast season and year — the two fields most people filter on.
anime[].synopsisstring
Series synopsis. Contains HTML entities, so decode before rendering.
links / metaobject
Cursor-style paging links and totals, returned alongside the records.

What you can build with the AnimeThemes API

  • Build an anime opening quiz that plays real audio
  • Add theme song credits to an anime tracker or database
  • Find every opening performed by a particular artist
  • Assemble a seasonal playlist of new openings
  • Practise sparse fieldsets and relationship includes against a real graph API

Common errors and how to fix them

429

You exceeded 90 requests in a minute.

Fix: Watch `X-RateLimit-Remaining`. Use `include` to fetch related records in one request rather than looping over ids.

Huge responses

You used `include` without `fields[...]`.

Fix: Combine them: include the relationship you need, then restrict each type's fields. Eager-loading everything is expensive on both ends.

HTML entities in text

Synopsis fields carry encoded entities such as `‘`.

Fix: Decode entities before rendering, or the apostrophes will show as literal escape sequences.

404 on a slug

Slugs are site identifiers and can change.

Fix: Prefer numeric ids for anything you store; treat slugs as display values.

AnimeThemes API — frequently asked questions

Is the AnimeThemes API free?

Yes, free with no key or account, limited to 90 requests per minute per IP. It is a community project and the limit is published in response headers so you can pace yourself.

Can I get the actual opening video files?

Yes. Theme entries link to video resources hosted by AnimeThemes, typically WebM, along with audio-only versions. That is the point of the project — it is a media archive with an API in front, not just a metadata list.

How do I get a series and its songs in one request?

Use `include`, for example `include=animethemes.song.artists`. Combine it with `fields[...]` for each type so the eager-loaded graph does not balloon the response.

How is this different from Jikan or Kitsu?

Those cover anime metadata broadly — synopses, ratings, episode lists. AnimeThemes covers the music specifically, down to individual openings, endings, performing artists and the hosted files themselves.

Tools that pair with this API

AnimeThemes is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.