Public API
A self-updating card for your Shikimori profile in one line of BBCode, and an open JSON API for anyone who wants to draw their own. No keys, no sign-up for developers.
01 · Embed
Paste the code into the “About” field of your Shikimori profile. The picture is redrawn from fresh data about once an hour — you never have to touch the description again.
[url=https://shikimatch.com/profile/your%20nickname][img]https://shikimatch.com/api/profile-card/your%20nickname.png?locale=en[/img][/url]Enter a nickname to see the card
themedark · lightformatportrait · landscapelocaleru · en02 · Data
Everything the profile page shows about taste, in a stable format: the viewer class, its mix, favourite genres and list stats. Build your own card, a bot or a widget.
https://shikimatch.com/api/public/v1/profile/<nickname>?locale=ru|enEncode the nickname with encodeURIComponent — nicknames may contain Cyrillic, spaces and emoji.
{
"version": 1,
"nickname": "Nagisa",
"profileUrl": "https://shikimatch.com/profile/Nagisa",
"avatarUrl": "https://shikimori.io/system/users/x160/…png",
"cardImageUrl": "https://shikimatch.com/api/profile-card/Nagisa?locale=ru",
"stats": {
"total": 412, "completed": 301, "scored": 288,
"meanScore": 7.41, "highScorePercent": 47, "nichePercent": 18
},
"viewerClass": {
"slug": "romantic",
"name": "Романтик",
"family": "…",
"quote": "…",
"tags": ["…", "…"],
"rare": false,
"accent": "#d96f91",
"url": "https://shikimatch.com/types/romantic",
"artUrl": "https://shikimatch.com/types/cards/romantic.webp"
},
"spectrum": [
{ "name": "Романтик", "percent": 41, "accent": "#d96f91" }
],
"topGenres": [
{ "name": "Романтика", "meanScore": 8.12, "count": 64, "iconUrl": "…" }
],
"syncedAt": "2026-10-13T09:30:00.000Z"
}nickname, profileUrlavatarUrlcardImageUrlstatsviewerClassspectrumtopGenressyncedAtWe only share profiles of people who signed in to ShikiMatch themselves and accepted the privacy policy.
Responses are cached for an hour. Don't call the API on every page view of your widget — keep a copy.
CORS is open, no keys. Up to 60 requests a minute per IP — enough for any widget.
The format of /v1 won't break. New fields may appear — ignore the ones you don't know.
Show us — we'll gladly share it. Missing a field? Write and we'll add it: maksimhard1@gmail.com
const nickname = "Nagisa";
const response = await fetch(
"https://shikimatch.com/api/public/v1/profile/" + encodeURIComponent(nickname) + "?locale=ru",
);
if (response.ok) {
const profile = await response.json();
console.log(profile.viewerClass?.name, profile.stats.meanScore);
} else {
const { error } = await response.json(); // "not_found" | "not_registered" | …
}not_foundNo such nickname
not_registeredThe person has never signed in to ShikiMatch — their data is not shared
privateThe profile is closed
—More than 60 requests a minute from one IP