時間 jikan-edge / changelog

Changelog

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.

Full changelog on GitHub ↗

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.

Nothing recorded before 2026-07-30 — see CHANGELOG.md for exactly what that means and for every release since.