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.

Base URL https://api.thesupersuperanime.lol Auth none (public, read-only)

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.

Who this is for

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 /proxy pass 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/min for /search, 60/min for /info and /episodes, 30/min for /watch, and a high allowance for /proxy (one video fans out into hundreds of segment requests). Over-limit requests get 429 with a Retry-After header. These are the defaults and may be tuned on the live deployment.
  • IDs. /info and /episodes are addressed by numeric AniList ID. Provider-specific IDs (returned by /info and /episodes) are opaque strings — pass them back verbatim.

Error responses

StatusMeaning
400Bad request — missing/invalid query param (e.g. empty q, non-numeric AniList ID).
429Rate limit exceeded for that tier. Body includes tier and retryAfter; a Retry-After header is set.
502An upstream source failed or returned nothing playable (e.g. no sources for sub or dub).
500Unhandled 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:

  1. Search a title → get its AniList ID.
  2. Info on that ID → see which providers have the title (the mappings).
  3. Episodes for that ID → get the episode list (each with a provider-specific episodeId).
  4. 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

GET/

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.

Example response
{
  "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 */ }
}
GET/search?q=<query>&page=1

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.

Query parameters
ParamRequiredDescription
qyesSearch query (title).
pagenoPage number, ≥ 1. Defaults to 1.
Example request
GET https://api.thesupersuperanime.lol/search?q=frieren
Example response (first result of several)
{
  "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

GET/info/:anilistId

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.

Path parameters
ParamDescription
anilistIdNumeric 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.

Example request
GET https://api.thesupersuperanime.lol/info/154587
Example response
{
  "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

GET/episodes/:anilistId?provider=<Provider>

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.

Parameters
ParamInDescription
anilistIdpathNumeric AniList ID.
providerqueryOptional. 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.

Example request
GET https://api.thesupersuperanime.lol/episodes/154587?provider=AnikotoTV
Example response
{
  "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

GET/watch?provider=<Provider>&episodeId=<id>

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:

FieldDescription
sub / dubAn 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.
serverNameName of the server (e.g. HD-1). Optional.
headers, intro, outroOptional. Upstream referer, and intro/outro skip markers (in seconds) where the source provides them.
You do not need to touch the raw URLs

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.

Parameters
ParamRequiredDescription
provideryesProvider name (from /info or /episodes).
episodeIdyesProvider-specific episode ID (the id from /episodes). URL-encode it if it contains /.
Example request
GET https://api.thesupersuperanime.lol/watch?provider=AnikotoTV&episodeId=6351%2F1
Example response (abridged — long proxy URLs truncated)
{
  "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" } ] }
  ]
}
Sub, dub, or both — it varies

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

GET/proxy?url=<encoded>&ref=<encoded>&…

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/Origin they require;
  • fingerprint-gated CDNs are fetched with a browser-like TLS handshake (via curl-impersonate) instead of being 403'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.

#ProviderAccessNotes
1AniNekoplain HTTPBrowser-free. First source with extractable soft English subs for simulcasts.
2AnimeNoSubplain HTTPBrowser-free. Back-catalog serves MegaPlay → soft English subs (+ several other languages).
3AnikotoTVplain HTTPBrowser-free (nekostream backend). HD-1 resolves to MegaPlay (HLS + English soft subs).
4ReAnimeTLS-impersonateBrowser-free REST API with high-quality .ass English subs. Video (FlixCloud) is fingerprint-gated → plays through the proxy.
5Gogoanimeplain HTTPBrowser-free. Legacy fallback catalog.
6AnimeUnityfallbackItalian site. Fallback-only video source — English captions come from an external subtitle layer, not the host. Details ↓
7AniZoneTLS-impersonateBrowser-free, server-rendered; HLS master straight off the page. Japanese audio + rich soft subs (incl. English .ass). CDN is fingerprint-gated → plays via proxy.
8AniDBTLS-impersonateSelf-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.
9UniqueStreamself-hosted APICrunchyroll re-host with a clean API. Genuinely multi-server: one server per audio locale (JP sub + every dub). Signed, short-TTL HLS.
10KickAssAnimeself-hosted APIClean JSON API. Genuinely multi-audio — one HLS master carries both JP (sub) and EN (dub) audio groups.
11Senshiself-hosted APIClean REST API. Multi-server per audio type (HardSub = sub with burned-in English; Dub = English). No special handling needed.
12AnimePaheCloudflare + solverLarge catalog behind Cloudflare's Managed Challenge. Multi-server per episode (sub / dub, each at 360/720/1080p). Details ↓
13MkissaCloudflare + solverAn 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.
What this means for you

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.