Highlights only, curated for people consuming the API. jikan-edge ships by continuous deploy
with no versioned releases, so the source of truth is dated and names the published Cloudflare Workers
version id for each release — that full, unabridged history lives in CHANGELOG.md.
2026-08-27 — an error message that led nowhere
1 release
One line of text and nothing else. The refusal for ?sfw was sending
callers after a parameter this API refuses just as firmly, so taking the advice bought a second
request and the same wall.
Fixed
?sfw recommended a parameter that also fails. The
400 UNSUPPORTED_PARAMETER ended with Use "genres_exclude" or "rating".,
and genres_exclude answers 400 here too — it was withdrawn the day it
was announced. The message now names only rating, and says that it applies to anime
search (GET /v1/anime): MyAnimeList's manga search page carries no classification
field. Error text only — the same requests are accepted and refused as before.
2026-08-18 — an address of its own
9 releases, 3 changes
The API has a proper domain now, and the old one keeps working. Nine releases for
three changes because each shipped twice — a push to main deploys on its own, and these
were deployed by hand as well.
Changed
- New base URL:
https://jikan.lucashdo.com. The documentation, the landing
page and llms.txt all point there now. Nothing breaks:
https://jikan-edge.lucas-hdo.workers.dev still serves the same Worker on the same
cache — no redirect, no deprecation window, nothing to do, and no removal planned. The custom
domain is additive; prefer it for new work so that a later move off *.workers.dev
costs you nothing.
- The API identifies itself to MyAnimeList as
jikan-edge/0.1 (+https://jikan.lucashdo.com). Only MAL sees this; no response
changes.
Fixed
- Self-hosting:
npm run setup now empties the routes list.
A fork was inheriting the maintainer's custom domain, and wrangler deploy then
failed on a zone it could not claim.
2026-08-16 — a backlog that never shipped
3 releases
Written on 2026-08-10, live only today: a stray workspace file made every Cloudflare build
fail while installing dependencies, so production went on serving code from 2026-07-31. These are fixes you
had not been getting yet, not fixes you already had.
Breaking
ClubDetail.staff is { username, url, role }[], where it was strings
shaped like "Name (Role)" — the profile link was in the markup all along, and the
concatenated form was ambiguous whenever a name or role contained parentheses.
Fixed
- Themes came back empty.
GET /v1/anime/:id/full and /themes answered
{ "openings": [], "endings": [] } for titles whose widget MAL has already migrated — Frieren
returned nothing, Fullmetal Alchemist: Brotherhood lost half.
- Staff stopped at the first 80 KB of the page — 80 of One Piece's 542 members, dropped under a
200 with nothing to indicate the list was cut.
background ended with a stray "Edit", the next section's edit link read as the
last word of the text.
GET /health accepted query parameters it documents as invalid; a database blip could
answer with the previous value while the refreshed one was already stored; user search answered
500 instead of 502 on an unrecognised page.
2026-07-30 — content parity sweep
7 releases that day
Every route compared side by side against the official Jikan v4. Nothing was broken —
all 98 answered 200 — but a lot of data was leaving thinner than the source, unusable, or silently wrong.
Breaking
- Genres, studios and authors became objects, not strings —
[{ malId, name, url }] instead of ["Action"], so ?genres=1
finally has an id to filter by that a response also hands back.
aired/published became objects — { from, to, string },
with from/to null when MAL's page doesn't give a full date.
GET /v1/manga?q= returns volumes, not episodes — the
old field name was wrong, not just the label: manga has no episodes.
- An unhonoured query parameter is
400 now, not a silent 200.
Added
url on every entity, and images: { small, medium, large } on
anime/manga/character/person detail — null only where the CDN genuinely has no variant.
meta.pagination on every paginated route.
- Search filters
sort, letter, min_score, start_date,
end_date, magazines; order_by went from 3 accepted values to 9.
Fixed
- 31 routes served a 50×70 thumbnail where a full poster existed —
imageUrl is the
original everywhere now.
- Long text (synopses,
about, moreinfo) had every paragraph break flattened
into a wall of text.
2026-07-30 — user lists & genres
6 releases that day
A day on one theme: data that existed at the source and the API either withheld or got
wrong without saying so — found by sweeping all 98 routes in production, not by a bug report.
Breaking
sourceVersion removed from every response. It was an internal cache-invalidation
token, never the API version — the API version is and remains v1, in the URL path.
Fixed
- User lists answered 502 for any account using MAL's modern list layout — now reads both
layouts, and stopped silently truncating the classic one too (one account was serving 273 of 360
entries with no error).
- An anime titled "86" could take down an entire 2,354-entry list. MAL leaves numeric-looking
titles unquoted in its embedded JSON; one bad row was rejecting the whole page.
- Profile statistics could silently serve a manga number as the anime one — a fixed-size
extraction window let one section bleed into the next.
Added
GET /v1/genres/anime and /manga work — 78 and 79 entries, each
carrying count and type, with a ?filter= to narrow by category.
- New
501 LIST_TOO_LARGE instead of silently truncating a list past what one refresh
reads.