# Jikan scrapes MyAnimeList so you do not have to write a parser

> Jikan is a PHP library that scrapes MyAnimeList.net and exposes the missing endpoints as a typed client, with a v5 release candidate on PHP 8.4 and a separate self-hostable REST API project. It suits PHP developers who need anime and manga data, and it is a scraper by design rather than a mirror of the official API.

**jikan-me/jikan** — Unofficial MyAnimeList PHP+REST API which provides functions other than the official API

- Repository: https://github.com/jikan-me/jikan
- Website: https://jikan.moe
- Stars: 1,084 · Forks: 124
- Language: PHP
- License: MIT
- Published: 2026-10-19 · Updated: 2026-10-19 · Language: en
- Canonical page: https://hysenlabs.com/projects/jikan-me-jikan

## The library is the scraper, and the REST API is a separate project

Jikan is a PHP API for MyAnimeList.net. It scrapes the website to satisfy the need for API functionality that MyAnimeList.net lacks.

The stated purpose is worth quoting in substance because it explains the whole design. The raison d'être of Jikan is to assist developers in easily getting the data they need for their apps and projects without having to depend on the lackluster official API, unstable APIs, or sidetracking their projects to develop parsers.

Three things follow from that. First, Jikan is a scraper, so its correctness depends on MyAnimeList's HTML and endpoints staying the same, and a change on their side can break a client library. Second, it does not cover everything: the official API is described as lackluster, and Jikan fills the gaps, which means the two sources overlap only partly. Third, the data has a scraper's characteristic latency and shape, and a project that needs reliability rather than coverage should think about caching the responses rather than calling through on every request.

The name is a small note. Jikan literally translates to Time in Japanese, and that is what the API saves you of, which is a joke about the time you would otherwise spend writing and maintaining a parser.

The split between the library and the service is the other structural fact. Jikan is a PHP library, not a hosted service, and a self-hosted REST API exists as a separate project, jikan-me/jikan-rest. No hosted or public instance of the REST API is provided, so if you want JSON over HTTP you run it yourself.

The project description calls it an unofficial MyAnimeList PHP and REST API which provides functions other than the official API, and the homepage is jikan.moe.

## Every endpoint is one MalClient method taking one request object

The v5 API surface is unusually disciplined, and the README describes it in a way that tells you how the library is meant to be used.

```php
use Jikan\MyAnimeList\MalClient;
use Jikan\Request\Anime\AnimeRequest;
use Jikan\Request\Search\AnimeSearchRequest;

$client = new MalClient(); // or new MalClient(HttpClientInterface $http) to inject the client

$anime = $client->getAnime(new AnimeRequest(1));          // Cowboy Bebop
$results = $client->getAnimeSearch(new AnimeSearchRequest())->getResults();
```

Every public endpoint is one MalClient method taking one Jikan\Request\* value object. The method list, the class-per-endpoint surface, and the conventions each must follow are documented in the readme conceptually, in API-STANDARD.md for the requirements, and in CONTRIBUTING.md section 3 for how to add one.

Two things follow from that shape. The request object is a value object, so an endpoint's parameters are explicit and typed rather than a variadic argument list, and the client is constructed once and reused. The alternative, new MalClient(HttpClientInterface $http), lets you inject the HTTP client, which matters for testing and for adding middleware, retries or a cache without subclassing.

The library also ships a machine-readable catalogue. The full catalog lives in llm.txt and in .backend-suite/endpoints.json, both derived, and regenerated with composer endpoints:write. On every change that touches the surface you run composer endpoints:write and composer endpoints:check.

That last pair of commands is the mechanism that keeps a large endpoint surface honest, and it is worth noting that the surface is large. This is a library whose entire value is coverage, so the risk is not that one endpoint is wrong but that the set drifts. A generated catalogue plus a check in CI is the answer to that, and the same generation is what makes the catalogue usable by tools rather than only by humans.

## The documentation set is unusual for a PHP library, and deliberately so

The repository docs list is the most distinctive thing about the project, and it reads like a project that has been through several maintainers.

There is a Contributing document covering the endpoint spine, the hermetic-fixture workflow and the pre-commit gates. There is a Changelog described as what changed per version, written for consumers. There is an Upgrading from v4 guide, described as what to change in your code, checked against a side-by-side run of both versions. There is a Decision log explaining why things are the way they are. There is a Deprecations file described as the running deprecation ledger. And there is an API standard document with the conventions every public entry point must follow.

The side-by-side run is the detail that shows how seriously the upgrade guide is taken. Rather than describing what changed, the guide is validated by running the old and new versions against the same inputs and comparing, which is the only way to write an upgrade guide that a consumer can trust without reading the whole diff.

A deprecation ledger is unusual and useful. In a library with a large surface, deprecations are where users get stranded, and a running document that lists them lets a consumer check their own code against it.

The decision log serves a different purpose, which is explaining why the surface looks the way it does. When the reasoning is written down, a consumer who thinks the API should be different can see what was considered.

The repository root also carries AGENTS.md and CLAUDE.md, so the working conventions are documented for automated coding assistants, and the tooling around it is thorough: .php-cs-fixer.dist.php for style, grumphp.yml for the pre-commit gates, phpstan.neon.dist and phpstan-baseline.neon for static analysis, phpunit.xml for the test suite, infection.json5 for mutation testing, and an .editorconfig.

## The v5 line is a release candidate, and every older line is dead

The support table in the README is the single most important thing to read before choosing a version.

The v5 line, currently 5.0.0-rc.2, is on master and is marked as a release candidate with the API frozen and bug fixes only. It requires PHP 8.4 and Lumen or Laravel version 11 or 12. The v4 line is end of life and no longer supported, requiring PHP 8.1 with Laravel 9 or 10. v3, v2 and v1 are all marked as no longer maintained or supported, with PHP floors of 8.0, 7.1 and 7.0 respectively and Laravel versions stepping down to 5.5.

That table is a good picture of a library with a long life and a working upgrade path, since the older versions are still documented well enough to know what you had.

The install instruction has a subtlety that the README explains in a comment. You run composer require jikan-me/jikan "^5.0@RC", and the comment says the 5.0.0 line is pre-release, so a plain ^5 has no stable tag to resolve to yet. In other words, you have to opt into the release candidate explicitly with the RC constraint, and once v5.0.0 goes stable the constraint changes back to ^5.

The repository is not archived and the last push was on 2026-10-19, four days after the 5.0.0-rc.2 and 5.0.0-rc.1 tags and the 5.0.0-beta.3 tag on 2026-10-15. Three tags in one day on a release candidate line is a project in its final pre-release push, and it is a reasonable moment to adopt v5 if you were waiting for it, since the API is frozen and only bug fixes remain.

The licence is MIT, with the LICENSE file in the repository as the authoritative text, and this is a licensing statement rather than legal advice.

## No authentication, so list updates are out of scope

There is one hard limitation, and the README states it in a single prominent line: Jikan does not support authenticated requests. You can not update your lists.

That is a structural consequence of the approach. Jikan is a scraper of publicly visible pages, and the personal list features of MyAnimeList require a logged-in session. There is no cookie handling, no OAuth flow, and no token refresh, and therefore no way to read or write your own list.

For most uses this is irrelevant. A recommendation site, a tracker dashboard, a statistics tool or a catalogue all need public data. A project whose whole purpose is to synchronise a user's list with an external service is out of luck, and it would need the official API for that, with its own limitations.

The same reasoning applies to rate limiting and reliability, though the README does not spell that out. A scraper that fetches on demand is one request to MyAnimeList per API call, with none of the caching, throttling or connection reuse a hosted API would handle. The library offers an HttpClientInterface injection point, which is the hook for adding retry, backoff or a local cache in front of the scraper, and a project doing serious volume through Jikan should treat that as required work rather than an optimisation.

The wrapper list also gives a sense of the ecosystem around the library. There are wrappers for JavaScript, Java, Python, Deno, Node.js, TypeScript, PHP, .NET, Go, Ruby, Dart and Kotlin, each maintained by someone else, and the README invites new ones. That is a good sign for a scraper library, because it means the parsing logic is solved once and the community spends its effort on the binding.

## Conclusion

Adopt Jikan if you are building in PHP and need MyAnimeList data the official API does not expose, and you accept that the data comes from scraping a website that can change without notice. Do not adopt it if you need authenticated operations, because the README states plainly that Jikan does not support authenticated requests and you cannot update your lists. Before you install, note that the v5 line is a release candidate with the API frozen and only bug fixes, that v4 and everything older are end of life, and that the 5.0.0 pre-release has to be requested explicitly with the RC constraint.

## FAQ

### What is Jikan and how does it get MyAnimeList data?

Jikan is a PHP API for MyAnimeList.net that scrapes the website to satisfy the need for API functionality that MyAnimeList.net lacks. Its purpose is to let developers get the data they need without depending on the official API or writing and maintaining their own parsers.

### How do I install Jikan?

Run composer require jikan-me/jikan "^5.0@RC". The README notes the 5.0.0 line is pre-release, so a plain ^5 constraint has no stable tag to resolve to yet. Coming from v4, the upgrade guide in UPGRADING.md describes what to change in your code.

### Can Jikan update my MyAnimeList?

No. The README states that Jikan does not support authenticated requests and that you can not update your lists, because it scrapes publicly visible pages rather than using a logged-in session.

### Is there a hosted Jikan REST API?

No. Jikan is a PHP library rather than a hosted service, and the REST API is a separate, self-hostable project, jikan-me/jikan-rest. No hosted or public instance of the REST API is provided.

### Which PHP and Laravel versions does Jikan 5 support?

The v5 line, currently 5.0.0-rc.2, requires PHP 8.4 and Lumen or Laravel version 11 or 12. The v4 line is end of life and no longer supported, and v3, v2 and v1 are all marked as no longer maintained or supported.

## Sources

- [jikan-me/jikan on GitHub](https://github.com/jikan-me/jikan)
- [License: MIT](https://github.com/jikan-me/jikan/blob/master/LICENSE)
- [Project website](https://jikan.moe)
- [README](https://github.com/jikan-me/jikan/blob/master/README.md)
- [Releases](https://github.com/jikan-me/jikan/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/jikan-me-jikan
