Anime API with discover filters

amodb has no separate anime endpoint. List anime with /3/discover/tv or /3/discover/movie using genre 16 and with_original_language=ja, then narrow it with the anime keyword id from /3/search/keyword. Japanese is not a served interface language, but original_name keeps the Japanese title.

Find anime with genre 16 and original language ja

amodb has no separate anime endpoint. Anime is a filter on GET /3/discover/tv and GET /3/discover/movie: with_genres=16 (Animation) plus with_original_language=ja. Add the id of the anime keyword, which you look up with GET /3/search/keyword, to keep only titles tagged as anime.

One honest limit: Japanese is not one of the 14 interface languages amodb serves. Titles and overviews come back in the language you request, or in English. The Japanese title stays in original_name for series and original_title for movies.

What you get:

  • Anime series and anime films from the same discover filters.
  • Original Japanese titles next to the localized ones.
  • Season and episode lists for every series you pick.
  • Posters and backdrops from https://img.amodb.dev/t/p/{size}/{file}.

What data you get

You needCall or fieldNotes
Anime seriesGET /3/discover/tv with with_genres=16 and with_original_language=jaresults carry name, original_name, first_air_date, genre_ids
Anime filmsGET /3/discover/movie with the same two filterstitle, original_title, release_date
The anime keyword idGET /3/search/keyword?query=animeresults array of id and name
Episode listGET /3/tv/{series_id}/season/{season_number}One call per season
Japanese titleoriginal_name or original_titleOriginal script, as stored
Posterposter_pathAppend to the image host, no key needed

Start in 3 steps

  1. Pick a plan on pricing. All data is on every plan, only the rate differs: 20, 40 or 120 requests per minute.
  2. Create a key in your account dashboard.
  3. Look up the keyword id once, then call discover with it and the two filters.

Example request

The Python script finds the anime keyword id, then lists the most popular Japanese animated series tagged with it. The curl call below it skips the keyword and lists a single broadcast season by date window.

curl -s "https://api.amodb.dev/3/discover/tv?with_genres=16&with_original_language=ja&first_air_date.gte=2026-10-01&first_air_date.lte=2026-12-31&sort_by=popularity.desc" \
  -H "Authorization: Bearer $AMODB_KEY"
import os
import requests

BASE = "https://api.amodb.dev/3"
session = requests.Session()
session.headers["Authorization"] = f"Bearer {os.environ['AMODB_KEY']}"


def get(path, **params):
    r = session.get(BASE + path, params=params, timeout=10)
    r.raise_for_status()
    return r.json()


keywords = get("/search/keyword", query="anime")["results"]
anime_id = next((k["id"] for k in keywords if k["name"].lower() == "anime"), None)
if anime_id is None:
    raise SystemExit("anime keyword not found")

page = get(
    "/discover/tv",
    with_genres=16,
    with_original_language="ja",
    with_keywords=anime_id,
    sort_by="popularity.desc",
    language="en-US",
    page=1,
)
for show in page["results"]:
    print(show.get("first_air_date"), show["name"], "/", show["original_name"])

A trimmed reply for the Python call above: 2 of the 19 results on page 1, with arrays cut to 2 items.

JSON
{
  "page": 1,
  "results": [
    {
      "adult": false,
      "backdrop_path": "/dmptwhmqxcMrCKgyvBlTt18PgDu.jpg",
      "first_air_date": "2005-04-22",
      "genre_ids": [
        10759,
        16
      ],
      "id": 65733,
      "name": "Doraemon",
      "origin_country": [
        "JP"
      ],
      "original_language": "ja",
      "original_name": "ドラえもん",
      "overview": "Robotic cat Doraemon is sent back in time from the 22nd century to protect 10-year-old...",
      "popularity": 301.2214,
      "poster_path": "/9ZN1P32SHviL3SV51qLivxycvcx.jpg",
      "vote_average": 8.089,
      "vote_count": 252
    },
    {
      "adult": false,
      "backdrop_path": "/mFKys64gbDQrFqwUheGwXQwo2JK.jpg",
      "first_air_date": "2004-10-05",
      "genre_ids": [
        10759,
        16
      ],
      "id": 30984,
      "name": "Bleach",
      "origin_country": [
        "JP"
      ],
      "original_language": "ja",
      "original_name": "BLEACH",
      "overview": "For as long as he can remember, Ichigo Kurosaki has been able to see ghosts. But when h...",
      "popularity": 190.3257,
      "poster_path": "/2EewmxXe72ogD0EaWM8gqa0ccIw.jpg",
      "vote_average": 8.4,
      "vote_count": 2295
    }
  ],
  "total_pages": 216,
  "total_results": 4302
}

Filters that shape an anime list

FilterValueEffect
with_genres16Animation. A comma means AND, so 16,35 is animation and comedy.
without_genresgenre idDrops titles that carry that genre.
with_original_languagejaJapanese originals only.
with_keywordskeyword idOnly titles tagged with the keyword. Titles without the tag are missed.
first_air_date.gte, first_air_date.lteYYYY-MM-DDA broadcast window for series. Movies use primary_release_date.gte and .lte.
sort_bypopularity.desc, vote_average.desc, first_air_date.descOrder. Pair vote_average.desc with vote_count.gte so tiny samples do not rank first.
page1 to 500Up to 20 results per page.

Keyword tagging is partial. If a list looks short, drop with_keywords and keep the genre and language filters for a wider net. The full filter list is on discover, and keyword ids are explained on keywords.

Anime films and long series

Films use the same two filters on the movie endpoint. This call lists well rated Japanese animated films, and vote_count.gte keeps out titles with a handful of votes.

curl
curl -s "https://api.amodb.dev/3/discover/movie?with_genres=16&with_original_language=ja&sort_by=vote_average.desc&vote_count.gte=200" \
  -H "Authorization: Bearer $AMODB_KEY"

Each result has title, original_title, release_date and poster_path. Long running series are often split into several seasons in the catalog. GET /3/tv/{series_id}/episode_groups lists other orderings with their names and episode counts where they are known, but amodb does not serve the groups themselves, and number_of_episodes on the series gives the total. Season calls are described on TV show API.

Titles and languages

Anime is the case where the original title matters most, so keep both fields.

FieldHoldsUse
nameTitle in the language you requestedMain label in your UI
original_nameTitle in the original language, Japanese script for Japanese originalsSecondary label, useful for fans who know the Japanese title
original_languagejaFilter on your side if you mix sources
overviewLocalized text, empty when no translation existsRe-request with language=en-US when empty

GET /3/tv/{series_id}/alternative_titles lists other titles by country where known. The 14 served languages are listed on languages.

How it compares

CapabilityScrape fan sitesAnime-only database APIamodb
ScopeWhatever the site coversAnime only, check the docs for depthMovies and TV in one catalog, anime chosen by filters
Anime selectionSite categoriesCheck the docsGenre 16, with_original_language=ja, anime keyword
Original-language titleVariesCheck the docsoriginal_name and original_title
Episode listsParsed from pagesCheck the docsSeason call with an episodes array
Japanese interface languageDepends on the siteCheck the docsNot served, original titles only
Access termsThe terms of each siteFree and paid tiers varyPaid, prepaid, no free tier

Pricing

An anime list is a few discover calls, and discover results stay in the edge cache for 30 minutes, so 20 requests per minute is enough for many apps. Plans come as 20, 40 or 120 requests per minute with the same data. Pay for 1, 3, 6, 12 or 24 months, with 0, 10, 20, 30 and 40 percent off, and no automatic renewal. There is no free tier. Choose a plan on pricing.

Questions and answers

Does amodb have a dedicated anime endpoint?

No. Anime is a filter on the normal discover endpoints: with_genres=16 for Animation and with_original_language=ja for Japanese originals. Add the anime keyword id for a tighter list.

Can I get Japanese titles and overviews?

Japanese originals keep their Japanese title in original_name for series and original_title for movies. Japanese is not one of the 14 served interface languages, so name and overview follow your language tag or English.

How do I find the anime keyword id?

Call /3/search/keyword?query=anime and read the id of the result named anime. Pass it as with_keywords on discover. Store the id after the first lookup, because keyword searches are cached for 10 minutes only.

Does genre 16 return only anime?

No. Genre 16 is Animation, which also covers cartoons from other countries. Adding with_original_language=ja removes most of them, and the anime keyword narrows the list further.

How deep can I page an anime list?

Pages run from 1 to 500 with up to 20 results each, so one query reaches about 10,000 results. Split larger lists into first_air_date.gte and first_air_date.lte windows. Discover results are cached for 30 minutes.