Overview
Every provider in this scraper has its own native id format — animetsu uses 24-char Mongo ObjectIds, anikuro uses numerics, anipm uses a composite anipm:{id}:{slug}, miruro/animex/anilight use AniList IDs natively. End-users never know these — but they DO know the AniList id (visible in every anilist.co URL).
The ID Finder bridges that gap. Pass an AniList ID and (optionally) a provider, get back the native id, the universal id, and a ready-to-use /sources URL. Useful for debugging, caching, building fallback chains, or passing the native id to a non-API consumer.
al:{anilistId} and resolves it automatically. This tool exists for when you want to see the underlying native id explicitly.UI Tool
The interactive UI lives at /animetsu-id (URL kept for backwards compatibility — the page itself is now the universal "Anime ID Finder"). Features:
- Single input box — paste AniList ID or full anilist.co URL.
- Provider dropdown — pick one of 7 providers, or "All Providers".
- Single-provider mode: shows cover image, matched title, native id (with copy button), universal id, ready-to-use
/sourcesURL, resolution trace, and quick-jump buttons to /sources, /info, /episodes. - All-providers mode: shows a per-provider breakdown with availability badges, native ids, and direct links. Includes a "best provider" hint (first provider that resolved in priority order).
- 6 popular AniList IDs as one-click examples (Frieren, One Piece, FMA: Brotherhood, JJK, Solo Leveling, AoT).
https://your-deployment.example.com/animetsu-idWhy Use It
Debug failed resolution
When al:{anilistId} doesn't resolve on a provider, /find-id returns the list of titles that were tried. You can see exactly why it failed — maybe the provider lists it under a synonym you didn't expect.
Cache native ids client-side
If you're hitting /sources many times for the same anime, call /find-id once, cache the native id, and pass it directly to /sources on subsequent calls. Skips the resolution overhead.
Build provider fallback chains
All-providers mode tells you which providers have a given anime. Use this to build a 'try animetsu, fall back to anipm, fall back to miruro' chain in your client.
Pass native id to external tools
If you have a script or tool that doesn't speak the universal al:{id} format, /find-id gives you the raw native id to pass directly.
Inspect provider coverage
All-providers mode shows you exactly which providers have each anime. Useful for analytics: 'what % of my catalog is on animetsu vs anipm?'
Show users the underlying id
For transparency — let users see the actual animetsu Mongo ObjectId or anipm series id, not just the universal form. Builds trust.
Provider ID Formats
Every provider has its own native id format. The table below shows what each one looks like, whether it accepts the universal al:{anilistId} format natively, and an example native id for Frieren (AniList ID 154587).
| Provider | Native ID format | Accepts al:{id} natively? | Example (Frieren) |
|---|---|---|---|
| animetsuAnimetsu | 24-char Mongo ObjectId | No — title-search | 6989b8a029cf95f4eb03b500 |
| anikuroAnikuro | numeric string | No — title-search | 4231 |
| animeyubiAnimeyubi | numeric string | No — title-search | 9821 |
| miruroMiruro | al:{anilistId} | YES — passthrough | al:154587 |
| animexAnimex | al:{anilistId} | YES — passthrough | al:154587 |
| anilightAnilight | al:{anilistId}:{slug} | YES — passthrough | al:154587:sousou-no-frieren |
| anipmAni.pm | anipm:{seriesId}:{slug} | No — title-search | anipm:6351:frieren-beyond-journey-s-end-c6fbj |
al:{anilistId} as a universal id. The backend resolves it to the provider's native format automatically (with a 30-min in-memory cache). You only need this tool if you want to see the native id explicitly.For per-provider deep dives, see the Ani.pm provider docs (other per-provider docs coming soon).
Find ID (single provider)
Resolves an AniList ID to the native id for a specific provider. Returns the native id, universal id, ready-to-use /sources URLs, and the full resolution trace (which title matched, which titles were tried, what strategy was used).
/api/scrape/find-id?anilist={anilistId}&provider={providerId}| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
anilist | number | required | — | AniList ID (e.g. 154587 for Frieren). |
provider | enum | required | — | One of: animetsu, anikuro, animeyubi, miruro, animex, anilight, anipm. Omit for all-providers mode (see next endpoint). |
curl ".../api/scrape/find-id?anilist=154587&provider=animetsu"{
"anilistId": 154587,
"provider": "animetsu",
"anilist": {
"id": 154587,
"idMal": 52991,
"title": {
"romaji": "Sousou no Frieren",
"english": "Frieren: Beyond Journey's End",
"native": "葬送のフリーレン"
},
"coverImage": { "large": "https://s4.anilist.co/..." },
"seasonYear": 2023,
"format": "TV"
},
"resolved": {
"nativeId": "6989b8a029cf95f4eb03b500",
"anilistId": 154587,
"provider": "animetsu",
"matchedTitle": "Frieren: Beyond Journey's End",
"strategy": "title-search",
"triedTitles": [
"Frieren: Beyond Journey's End",
"Sousou no Frieren",
"葬送のフリーレン"
]
},
"nativeId": "6989b8a029cf95f4eb03b500",
"universalId": "al:154587",
"sourcesUrl": "/api/scrape/sources?id=6989b8a029cf95f4eb03b500&provider=animetsu&ep=1",
"universalSourcesUrl": "/api/scrape/sources?id=al%3A154587&provider=animetsu&ep=1"
}{
"anilistId": 154587,
"provider": "anipm",
"resolved": {
"nativeId": "anipm:6351:frieren-beyond-journey-end",
"anilistId": 154587,
"provider": "anipm",
"matchedTitle": "Frieren: Beyond Journey's End",
"strategy": "title-search"
},
"nativeId": "anipm:6351:frieren-beyond-journey-end",
"universalId": "al:154587",
"sourcesUrl": "/api/scrape/sources?id=anipm%3A6351%3Afrieren-beyond-journey-end&provider=anipm&ep=1",
"universalSourcesUrl": "/api/scrape/sources?id=al%3A154587&provider=anipm&ep=1"
}{
"anilistId": 154587,
"provider": "miruro",
"resolved": {
"nativeId": "al:154587",
"anilistId": 154587,
"provider": "miruro",
"strategy": "passthrough"
},
"nativeId": "al:154587",
"universalId": "al:154587",
"sourcesUrl": "/api/scrape/sources?id=al%3A154587&provider=miruro&ep=1",
"universalSourcesUrl": "/api/scrape/sources?id=al%3A154587&provider=miruro&ep=1"
}Find ID (all providers)
Resolves an AniList ID across ALL providers in parallel. Returns a per-provider breakdown showing which providers have the anime, each provider's native id + /sources URL, and a 'best provider' hint (first that resolved in priority order). Use this for fallback chains and availability checks.
/api/scrape/find-id?anilist={anilistId}| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
anilist | number | required | — | AniList ID. |
curl "https://your-deployment.example.com/api/scrape/find-id?anilist=154587"{
"anilistId": 154587,
"anilist": {
"id": 154587,
"title": {
"english": "Frieren: Beyond Journey's End",
"romaji": "Sousou no Frieren"
},
"coverImage": { "large": "https://s4.anilist.co/..." },
"seasonYear": 2023,
"format": "TV"
},
"providers": {
"animetsu": {
"resolved": { "nativeId": "6989b8a029cf95f4eb03b500", "strategy": "title-search", ... },
"nativeId": "6989b8a029cf95f4eb03b500",
"universalId": "al:154587",
"sourcesUrl": "/api/scrape/sources?id=6989b8a029cf95f4eb03b500&provider=animetsu&ep=1",
"universalSourcesUrl": "/api/scrape/sources?id=al%3A154587&provider=animetsu&ep=1",
"label": "Animetsu"
},
"anikuro": { "nativeId": "4231", "label": "Anikuro", ... },
"animeyubi":{ "nativeId": "9821", "label": "Animeyubi", ... },
"miruro": { "nativeId": "al:154587", "strategy": "passthrough", "label": "Miruro", ... },
"animex": { "nativeId": "al:154587", "strategy": "passthrough", "label": "Animex", ... },
"anilight": { "nativeId": "al:154587:sousou-no-frieren", "label": "Anilight", ... },
"anipm": { "nativeId": "anipm:6351:frieren-beyond-journey-end", "label": "Ani.pm", ... }
},
"availableCount": 7,
"bestProvider": "animetsu",
"universalId": "al:154587"
}bestProvider is the first one that resolved — useful as a default for fallback chains. Providers that don't have the anime return null in the providers map.Animetsu ID Finding (legacy)
The original animetsu-only resolver. Kept for backwards compatibility — prefer /api/scrape/find-id?provider=animetsu for new code. Same response shape, just scoped to animetsu.
/api/scrape/animetsu-id?anilist={anilistId}# Legacy (still works)
curl ".../api/scrape/animetsu-id?anilist=154587"
# New (preferred)
curl ".../api/scrape/find-id?anilist=154587&provider=animetsu"The legacy endpoint returns animetsuId instead of nativeId — otherwise identical.
Resolve (low-level)
The low-level resolver that /find-id wraps. Returns a ResolveResult object without the AniList metadata or pre-built /sources URLs. Useful when you want minimal overhead and don't need the extras.
/api/scrape/resolve?anilist={anilistId}&provider={providerId}curl ".../api/scrape/resolve?anilist=154587&provider=animetsu"See the main docs for the full response schema.
Resolution Strategies
The strategy field in the response tells you how the native id was resolved. Three values:
passthroughThe provider natively accepts al:{anilistId} as its id format — no resolution needed. miruro, animex, and anilight all use AniList IDs as their primary key. Zero overhead.
title-searchThe backend fetched the AniList media, collected candidate titles (english, romaji, native, synonyms), searched the provider's catalog with each in priority order, and picked the first hit. Takes 1-3s on cold cache.
cache-hitResolution was served from the in-memory 30-min cache. Subsequent calls on the same provider+anilist combo are instant. The cache is per-process — restarts clear it.
Example AniList IDs
Popular anime to test with. The AniList ID is the number in any anilist.co/anime/<id> URL.
| AniList ID | Title | Notes |
|---|---|---|
| 154587 | Frieren: Beyond Journey's End | 2023 · 28 eps · sub+dub |
| 21 | One Piece | 1999 · 1100+ eps |
| 5114 | Fullmetal Alchemist: Brotherhood | 2009 · 64 eps |
| 101922 | Jujutsu Kaisen | 2020 · 24 eps |
| 113415 | Solo Leveling | 2024 · 12 eps |
| 16498 | Attack on Titan | 2013 · 25 eps |
Errors
Returned when the anilist param is missing or not a positive number. Response includes usage hint.
Returned when the provider param is not one of the 7 valid provider ids. Response lists the valid values.
The anilistId doesn't exist on AniList itself. Double-check the ID — it's the number in the anilist.co/anime/{id} URL.
AniList ID is valid, but the provider doesn't have this anime in its catalog (or lists it under a title we didn't try). Response includes triedTitles so you can see what was searched. Try the universal al:{anilistId} on a different provider.
The provider's upstream site or AniList itself returned an error. Usually transient — retry after a few seconds.