RECONSUMΣT-TS
A personal, self-hosted anime source-aggregation API — search, info, episode lists and playable stream sources, aggregated across many independently-scraped sources behind one consistent HTTP interface.
Overview
RECONSUMΣT-TS is a maintained fork of Consumet, reshaped into a single-purpose, self-hosted anime API. It does one thing: given a title, it finds that title across a set of public anime streaming sources, maps them onto a common metadata backbone, and hands back episode lists and ready-to-play stream URLs — sub and dub — from whichever source has the show.
Search is powered by AniList's GraphQL API (clean metadata, no scraping), so everything is addressed by AniList ID. Everything downstream of search — mappings, episodes, and stream sources — is scraped live from the individual providers at request time. Stream URLs are returned pre-wrapped through an internal proxy so that hotlink-protected HLS playlists, video segments and subtitle tracks play directly in a browser without any extra header juggling on your side.
This is a personal project, run for the maintainer's own front-end (thesupersuperanime.lol). It is documented publicly because the project is open source — not as a hosted service with any uptime or stability guarantee. Please read the disclaimer.
Base URL
All endpoints are served relative to a single base URL:
https://api.thesupersuperanime.lol
There is no versioned path prefix. Endpoints are called directly, e.g. https://api.thesupersuperanime.lol/search?q=frieren.
Conventions
- Format. All responses are JSON (
application/json). Stream and subtitle bodies served through/proxypass through their upstream content type (e.g.application/vnd.apple.mpegurl). - CORS.
Access-Control-Allow-Origin: *on every route. The API is read-only and uses no cookies or credentials, so it can be called directly from any front-end. - Auth. None by default — every data route is open. (The server supports an optional API-key gate, but it is off on this deployment.)
- Rate limits. Requests are rate-limited per client IP, in tiers, on a rolling 60-second window. Documented defaults:
120/minfor/search,60/minfor/infoand/episodes,30/minfor/watch, and a high allowance for/proxy(one video fans out into hundreds of segment requests). Over-limit requests get429with aRetry-Afterheader. These are the defaults and may be tuned on the live deployment. - IDs.
/infoand/episodesare addressed by numeric AniList ID. Provider-specific IDs (returned by/infoand/episodes) are opaque strings — pass them back verbatim.
Error responses
| Status | Meaning |
|---|---|
400 | Bad request — missing/invalid query param (e.g. empty q, non-numeric AniList ID). |
429 | Rate limit exceeded for that tier. Body includes tier and retryAfter; a Retry-After header is set. |
502 | An upstream source failed or returned nothing playable (e.g. no sources for sub or dub). |
500 | Unhandled internal error. |
Error bodies are JSON of the shape { "error": "<message>" }.
The typical flow
A client almost always walks these four endpoints in order. Each step feeds the next:
- Search a title → get its AniList ID.
- Info on that ID → see which providers have the title (the mappings).
- Episodes for that ID → get the episode list (each with a provider-specific
episodeId). - Watch a provider +
episodeId→ get playable, proxied stream sources for sub and dub.
# the whole chain, end to end
GET /search?q=frieren
→ id 154587
GET /info/154587
→ provider AnikotoTV, mapped id frieren-beyond-journey-s-end-c6fbj
GET /episodes/154587?provider=AnikotoTV
→ episode 1 → episodeId 6351/1
GET /watch?provider=AnikotoTV&episodeId=6351/1
→ { sub: [ … ], dub: [ … ] } # proxied HLS + subtitles
Service metadata
Health check and self-description. Returns the service status, the live provider list in aggregation order, and a short route summary. Useful for confirming the API is up and seeing exactly which providers are currently loaded.
{
"name": "anime-api",
"status": "ok",
"providers": [
"AniNeko", "AnimeNoSub", "AnikotoTV", "ReAnime", "Gogoanime",
"AnimeUnity", "AniZone", "AniDB", "UniqueStream",
"KickAssAnime", "Senshi", "AnimePahe", "Mkissa"
],
"routes": { /* search, info, episodes, watch, proxy */ }
}
Search
Searches AniList for a title. This is the entry point — it returns AniList metadata (including the id you use for every other endpoint). No scraping happens here.
| Param | Required | Description |
|---|---|---|
q | yes | Search query (title). |
page | no | Page number, ≥ 1. Defaults to 1. |
GET https://api.thesupersuperanime.lol/search?q=frieren
{
"results": [
{
"id": "154587",
"malId": 52991,
"title": {
"romaji": "Sousou no Frieren",
"english": "Frieren: Beyond Journey’s End",
"native": "葬送のフリーレン"
},
"image": "https://s4.anilist.co/file/anilistcdn/media/anime/cover/medium/bx154587-….jpg",
"totalEpisodes": 28,
"type": "TV",
"status": "FINISHED"
}
// …more results (sequels, ONAs, etc.)
]
}
Info — provider mappings
Resolves an AniList ID to the best match on each provider — i.e. which sources actually carry this title, and under what provider-specific ID. Think of the mappings array as "the available sources for this show." It's cheap: it does not fetch episode lists.
| Param | Description |
|---|---|
anilistId | Numeric AniList ID (from /search). |
Each mapping carries a score — the raw title-similarity (0–1) that the aggregator matched on. A provider only appears if it has a plausible match.
GET https://api.thesupersuperanime.lol/info/154587
{
"id": "154587",
"mappings": [
{ "provider": "ReAnime", "id": "frieren-beyond-journey-s-end-sousou-no-frieren-yw2a3j", "title": "Frieren: Beyond Journey’s End", "score": 1 },
{ "provider": "Mkissa", "id": "ReHMC7TQnch3C6z8j", "title": "Sousou no Frieren", "score": 1 },
{ "provider": "AnikotoTV", "id": "frieren-beyond-journey-s-end-c6fbj", "title": "Frieren: Beyond Journey's End", "score": 0.92 },
{ "provider": "UniqueStream", "id": "z5T4zQKO", "title": "Frieren: Beyond Journey's End", "score": 0.92 },
{ "provider": "AnimePahe", "id": "141311d8-af7d-5fc3-379b-99c68e0bc866", "title": "Frieren: Beyond Journey's End", "score": 0.92 }
]
}
The set of providers returned varies by title and by what each source has indexed at that moment — it is not fixed. A missing provider just means it had no confident match for that show.
Episodes
Returns the episode list for a title. The optional provider param sets a preference — that provider is tried first; otherwise the aggregator walks providers in its configured order. Either way it verifies the season matches (via leaked ID, season/part ordinal, or episode-count backstop) before returning, so requesting "Season 2" won't silently serve Season 1.
| Param | In | Description |
|---|---|---|
anilistId | path | Numeric AniList ID. |
provider | query | Optional. Preferred provider name (e.g. AnikotoTV). Case-insensitive. |
The id on each episode is the provider-specific episodeId you pass to /watch. If no provider yields a verified match, the response is { "provider": null, "episodes": [], "reason": "…" } rather than a wrong-season guess.
GET https://api.thesupersuperanime.lol/episodes/154587?provider=AnikotoTV
{
"provider": "AnikotoTV",
"providerId": "frieren-beyond-journey-s-end-c6fbj",
"episodes": [
{ "id": "6351/1", "number": 1, "title": "Episode 1", "url": "https://anikototv.to/watch/frieren-beyond-journey-s-end-c6fbj/ep-1" },
{ "id": "6351/2", "number": 2, "title": "Episode 2", "url": "https://anikototv.to/watch/frieren-beyond-journey-s-end-c6fbj/ep-2" }
// …28 episodes total
]
}
Watch — stream sources
The payoff. Given a provider and an episodeId (from /episodes), it fetches every available server for both sub and dub, concurrently, and returns them together. Response shape:
| Field | Description |
|---|---|
sub / dub | An array of per-server results, ordered with the provider's default/auto-play server first. null if that audio type isn't available. (A client that just takes index [0] gets the default server.) |
sources[] | Each has a proxied url (ready to feed an HLS player), the original rawUrl, a quality label, and isM3U8. |
subtitles[] | Each has a proxied url, the original rawUrl, and a lang. |
serverName | Name of the server (e.g. HD-1). Optional. |
headers, intro, outro | Optional. Upstream referer, and intro/outro skip markers (in seconds) where the source provides them. |
Every sources[].url and subtitles[].url already points at the API's /proxy, which injects the correct Referer (and, for fingerprint-gated CDNs, impersonates a browser's TLS handshake). Feed those URLs straight into an HLS player. rawUrl is provided only for reference.
| Param | Required | Description |
|---|---|---|
provider | yes | Provider name (from /info or /episodes). |
episodeId | yes | Provider-specific episode ID (the id from /episodes). URL-encode it if it contains /. |
GET https://api.thesupersuperanime.lol/watch?provider=AnikotoTV&episodeId=6351%2F1
{
"sub": [
{
"serverName": "HD-1",
"sources": [
{
"url": "https://api.thesupersuperanime.lol/proxy?url=https%3A%2F%2Fcdn.mewstream.buzz%2F…",
"rawUrl": "https://cdn.mewstream.buzz/anime/bb6d2babd7797d94d8f4a8600bc9b44e/…",
"quality": "default",
"isM3U8": true
},
{ "url": "…", "rawUrl": "…", "quality": "1080p", "isM3U8": true }
],
"subtitles": [
{ "url": "https://api.thesupersuperanime.lol/proxy?url=…", "rawUrl": "https://1oe.lostproject.club/…", "lang": "English" }
// …Arabic, French, +6 more languages
],
"headers": { "Referer": "https://megaplay.buzz/" },
"intro": { "start": 0, "end": 89 },
"outro": { "start": 1460, "end": 1549 }
},
{ "serverName": "Vidstream-2", /* … */ }
],
"dub": [
{ "serverName": "HD-1", "sources": [ … ], "subtitles": [ { "lang": "English" } ] }
]
}
Whether a title has a dub (or a sub) at all depends on the provider and the show. Either field can be null. A 502 is returned only when both are unavailable. See provider notes.
Proxy
The Referer-injecting HLS / segment / subtitle proxy. You normally don't call this directly — every stream and subtitle URL in a /watch response is already a /proxy link with the right parameters baked in. It exists so that:
- hotlink-protected playlists, segments and subtitle tracks get the correct
Referer/Originthey require; - fingerprint-gated CDNs are fetched with a browser-like TLS handshake (via
curl-impersonate) instead of being403'd; - HLS master/variant playlists are rewritten so their children also route back through the proxy, and CORS is opened for browser playback.
It is not rate-gated the same way the data routes are (a single video fans out into hundreds of segment fetches), and it takes no API key. Treat the url values from /watch as opaque and pass them straight to your player.
Provider list
These are the sources RECONSUMΣT-TS currently aggregates, in aggregation order (the order the API reports at GET / and prefers when you don't name a provider). The list is pulled from the live source — it changes as sources are added, fixed, or retired.
| # | Provider | Access | Notes |
|---|---|---|---|
| 1 | AniNeko | plain HTTP | Browser-free. First source with extractable soft English subs for simulcasts. |
| 2 | AnimeNoSub | plain HTTP | Browser-free. Back-catalog serves MegaPlay → soft English subs (+ several other languages). |
| 3 | AnikotoTV | plain HTTP | Browser-free (nekostream backend). HD-1 resolves to MegaPlay (HLS + English soft subs). |
| 4 | ReAnime | TLS-impersonate | Browser-free REST API with high-quality .ass English subs. Video (FlixCloud) is fingerprint-gated → plays through the proxy. |
| 5 | Gogoanime | plain HTTP | Browser-free. Legacy fallback catalog. |
| 6 | AnimeUnity | fallback | Italian site. Fallback-only video source — English captions come from an external subtitle layer, not the host. Details ↓ |
| 7 | AniZone | TLS-impersonate | Browser-free, server-rendered; HLS master straight off the page. Japanese audio + rich soft subs (incl. English .ass). CDN is fingerprint-gated → plays via proxy. |
| 8 | AniDB | TLS-impersonate | Self-hosted; genuinely multi-server (one server per audio language, e.g. JP + EN). Its metadata host is fingerprint-gated → fetched via impersonation; its video CDN is open. |
| 9 | UniqueStream | self-hosted API | Crunchyroll re-host with a clean API. Genuinely multi-server: one server per audio locale (JP sub + every dub). Signed, short-TTL HLS. |
| 10 | KickAssAnime | self-hosted API | Clean JSON API. Genuinely multi-audio — one HLS master carries both JP (sub) and EN (dub) audio groups. |
| 11 | Senshi | self-hosted API | Clean REST API. Multi-server per audio type (HardSub = sub with burned-in English; Dub = English). No special handling needed. |
| 12 | AnimePahe | Cloudflare + solver | Large catalog behind Cloudflare's Managed Challenge. Multi-server per episode (sub / dub, each at 360/720/1080p). Details ↓ |
| 13 | Mkissa | Cloudflare + solver | An AllAnime / AllManga skin (mkissa.to). Sub + dub. Behind the same Cloudflare challenge as AnimePahe. Details ↓ |
Provider notes & caveats
Written honestly — these are the real behaviours worth knowing before you rely on a given source.
AnimePahe & Mkissa — Cloudflare challenge (cold-start latency)
AnimePahe and Mkissa (mkissa.to, an AllAnime front-end) both sit behind Cloudflare's Managed Challenge — the modern Turnstile / JS-VM tier that hard-403s plain HTTP clients. RECONSUMΣT-TS clears it with a headless-browser-based solver: Byparr, a FlareSolverr-compatible service that drives a real browser to obtain a cf_clearance cookie.
The solver is shared between the two providers (they're behind the identical challenge) and works on a solve-once, reuse-many model:
- The first request to either provider with no cached bypass session — a "cold" request — has to drive the headless browser to solve the challenge. This takes roughly 13–15 seconds.
- The solver caches the resulting
cf_clearance+ User-Agent pair (keyed by host). Every subsequent request reuses that session over plain HTTP/2 and is fast — typically a second or two. - The clearance is re-solved automatically when Cloudflare eventually expires or rotates it (detected by a
403), so there's no manual intervention — just the occasional cold hit.
A call that touches AnimePahe or Mkissa may take up to ~15 seconds if the bypass session is cold, then be quick on repeat. If you have a latency budget, prefer one of the plain-HTTP providers and treat these two as the deep-catalog fallback. Because the project is open source, this is described specifically rather than vaguely — see utils/cf-solver.ts in the source.
Gogoanime, AniNeko, AnikotoTV & AnimeNoSub — plain HTTP
These four are plain HTTP — search, episode lists and stream sources all resolve over ordinary requests with no special handling: no headless browser, no challenge solver, no TLS impersonation. They're the low-latency common path, which is why three of them sit at the top of the aggregation order.
AnimeUnity — intentional fallback-only (Italian)
AnimeUnity is an Italian site and is kept deliberately as a fallback-only video source. It carries no native English subtitles — it was originally the one source that worked out of the box, and it's retained purely because its video stream is reliable. When English captions are shown over an AnimeUnity stream, they come from an external subtitle layer, not from AnimeUnity itself. Don't reach for it first; it's the safety net when nothing else has the title.
Sub vs. dub support varies
Not every provider offers both sub and dub, and it varies per provider and per title. Some sources are genuinely multi-audio — AniDB, UniqueStream, KickAssAnime, Senshi, AnimePahe and Mkissa expose separate sub and dub servers where the show has them. Others are sub-first, with soft English subtitle tracks, and only carry a dub when the underlying source happens to. In a /watch response this surfaces as the sub and dub fields being populated independently — either may be null. If you need a dub specifically, check the dub array rather than assuming it's there.
Disclaimer
RECONSUMET-TS is a fork of Consumet, a personal aggregation project that indexes and provides access to publicly-accessible anime streaming sources. It is not affiliated with, endorsed by, or sponsored by Consumet or any of the third-party sites it aggregates (excluding thesupersuperanime.lol, the maintainer's own site, which is built on top of this API). This API is provided 'as is' for personal, non-commercial, and research use, without warranty of any kind. The maintainer is not responsible for the content, legality, availability, or accuracy of any third-party source this API aggregates or links to. Use of this API, and any content accessed through it, is entirely at your own risk and your own responsibility.
A full Terms of Service and any Privacy Policy are still being finalized and are not yet published.