Reference
Library API
Search anime, manga and games from one endpoint, then fetch any result as a profile that follows the same schema.
The API is public and read-only. All endpoints return JSON and accept GET only.
Search
GET/api/search?q={text}&limit={n}
Searches every media type at once and returns a separate list for each. Searching does not save anything.
Query parameters
qstringrequired- Search text, 1–100 characters. Leading and trailing whitespace is trimmed.
limitinteger- Results per type. Defaults to 5, clamped between 1 and 10.
Example
curl '/api/search?q=frieren&limit=3'{
"query": "frieren",
"results": {
"anime": [
{
"id": "ANIME_154587",
"type": "ANIME",
"sourceId": "154587",
"title": "Sousou no Frieren",
"altTitles": ["Frieren: Beyond Journey's End"],
"coverImage": "https://…/cover.jpg",
"bannerImage": "https://…/banner.jpg",
"year": 2023,
"score": 9.1,
"source": { "provider": "…", "url": "https://…" },
"details": { "malId": 52991, "format": "TV", "episodes": 28, … }
}
],
"manga": [ … ],
"game": [ … ]
}
}Partial results
Each provider is searched independently. If one fails, the other lists are still returned, the failed list is empty, and an errors object names the type that failed. Partial responses are only cached for a minute.
{
"query": "frieren",
"results": { "anime": [ … ], "manga": [ … ], "game": [] },
"errors": { "game": "Search failed" }
}Profile
GET/api/{type}/{id}
Returns a single item. The first request for an item fetches it from the provider and saves it to Firestore. Later requests are served from the saved copy, which is refreshed once it is older than 30 days.
Path parameters
typestringrequired- One of anime, manga or game.
idintegerrequired- The sourceId of a search result.
Example
curl /api/anime/154587{
"id": "ANIME_154587",
"type": "ANIME",
"title": "Sousou no Frieren",
…
"createdAt": "2026-10-10T08:00:00.000Z",
"updatedAt": "2026-10-10T08:00:00.000Z"
}Use the type and sourceId of a search result to build the profile URL, e.g. ANIME and 154587 become /api/anime/154587.
Media schema
Search results and profiles share the same shape for every type.
| Field | Type | Description |
|---|---|---|
id | string | Type and source id joined, e.g. ANIME_154587. Also the Firestore document id. |
type | "ANIME" | "MANGA" | "GAME" | Media type. |
sourceId | string | Id at the source provider. |
title | string | Primary title. |
altTitles | string[] | Other known titles. |
synopsis | string | null | Plot summary or description. |
coverImage | string | null | Cover art URL. |
bannerImage | string | null | Wide banner or artwork URL. |
year | number | null | Year of first release. |
status | string | null | Release status as reported by the provider. |
genres | string[] | Genres and themes. |
score | number | null | Rating normalized to 0–10. |
source | { provider, url } | The data provider and a link to the original page. |
details | object | Type-specific fields, listed below. |
createdAt | string | Profile only. ISO date the item was first saved. |
updatedAt | string | Profile only. ISO date the item was last refreshed. |
Details by type
| Type | Fields |
|---|---|
ANIME | malId, format, episodes, duration, season, studios, airedFrom, airedTo |
MANGA | malId, format, chapters, volumes, authors, publishedFrom, publishedTo |
GAME | platforms, developers, publishers, releaseDate |
Caching
There are two layers of caching.
- CDN, 7 days. Successful responses are cached at the edge for 7 days, keyed by the full URL. Note that
q=Narutoandq=narutoare cached separately. - Firestore, 30 days. Profiles are refreshed from the provider once the saved copy is older than 30 days. If the provider is unavailable, the older copy is returned instead.
Data can therefore be up to about 37 days old.
Errors
Errors return a JSON body of the form { "error": "…" }.
| Status | When |
|---|---|
400 | Search was called without q, or q is longer than 100 characters. |
404 | Unknown type, non-numeric id, or the provider has no item with that id. |
502 | The provider or database failed and no saved copy could be returned. |