EmnexAnime API

A clean REST API for anime — a full catalog (home, trending, seasonal, search, detail, seasons, episodes, characters, schedule) powered by AniList, plus resolved HLS streams that play in your own player, ad-free and with no iframe.

Base … Auth None Format JSON CORS * Streams HLS

Introduction

EmnexAnime has two layers. Metadata is served from the official AniList GraphQL API (cached) — reliable and unlimited. Streaming resolves a playable HLS master from an AniList/MAL id, decrypts the source, and re-serves it through a referer-aware proxy so browsers can play it directly.

Every list item uses the same compact Card shape. Every id in a path is an AniList id unless the path says mal.

Every endpoint below has a live Try it box — it calls this API for real and shows the actual response.

Base URL & conventions

https://api.emnexanime.site
  • All responses are application/json; charset=utf-8 with Access-Control-Allow-Origin: *.
  • List endpoints accept ?page (default 1) and ?perPage (default 30, max 50) and return a pageInfo object.
  • Metadata responses are cacheable; streaming responses are no-store (signed URLs expire).

Authentication

None. The API is open and read-only — no keys, tokens, or headers to send.

Rate limits & caching

Metadata is cached in-memory (home/listings ~5 min, detail ~10 min), keeping the service well under AniList's ~90 req/min and making repeat calls instant. Please cache on your side and avoid hammering /api/sources (each call resolves a fresh signed stream).

Data models

Card — every catalog item


      

Sources — from /api/sources


      

Season — from …/seasons (relation chain)


    

Player integration

Hand the resolved URLs straight to Vidstack + hls.js. The hls, subtitles[].url and thumbnailsVtt values are already proxied — no extra headers needed.


    

Errors

Errors return { "error": "message" } with an HTTP status:

StatusMeaning
400Bad or missing parameter (e.g. missing query / episode).
404Unknown endpoint.
502Upstream failed (AniList error, or a title/episode couldn't be resolved for that sub/dub).