mikai API

API v1

Публічний API Mikai

Каталог аніме з українськими озвученнями та субтитрами, плеєр із розбивкою по командах, україномовні постери з авторством, розклад і стрічка новинок. Ключ не обовʼязковий — він лише підіймає ліміти.

https://api.mikai.me/public/v1OpenAPI 3.1MarkdownОтримати ключ

Огляд

Публічний API Mikai віддає каталог аніме з українськими озвученнями та субтитрами: назви, зовнішні ідентифікатори, плеєр із розбивкою по командах і провайдерах, україномовні постери з авторством, розклад виходу серій, стрічку новинок і персонажів.

Усі відповіді — JSON у спільному конверті. Успішна відповідь має ok: true і поле result; пагіновані списки додатково повертають total, page і pages, тож рахувати кількість сторінок вручну не треба.

{
  "ok": true,
  "total": 1423,
  "page": 1,
  "pages": 72,
  "result": [ … ]
}

Усі мітки часу — RFC3339 в UTC: addedAt, publishedAt, updatedAt, час виходу серії в розкладі. Дати без часу (startDate, birthday) — YYYY-MM-DD.

Описи аніме — українською. Це наш власний текст, а не синопсис з MAL чи AniList.

У блоці episodes поле total — це заплановане число серій; 0 означає «ще невідомо», а не «серій немає». Скільки вже вийшло, каже aired, скільки озвучено або перекладено — localized.
API читальний: жоден ендпоінт не змінює дані на нашому боці. Ключ не обовʼязковий — він лише підіймає ліміти.

Швидкий старт

Ключ не потрібен, щоб почати. Просто зробіть запит:

curl "https://api.mikai.me/public/v1/anime?limit=5"

Без ключа діють невеликі ліміти — їх вистачає, щоб роздивитись API. Для постійного застосунку створіть ключ у профілі, розділ «Для розробників»: https://mikai.me/user/developers. Повний токен показується один раз, одразу після створення.

curl -H "X-API-Key: mk_xxxxxxxx…" \
  "https://api.mikai.me/public/v1/anime?limit=5"

Які ліміти діють саме для вас, показує /me.

curl "https://api.mikai.me/public/v1/me"

Для коректної роботи дуже бажано передавати валідний User-Agent, який описує ваш застосунок: назву, версію й контакт (сайт або пошту). Так ми бачимо, хто користується API, і можемо звʼязатися з вами, якщо з запитами щось не так, замість того щоб сприйняти їх як невідомого парсера.

User-Agent: MyAnimeApp/1.4 (+https://myanimeapp.example; [email protected])
curl -A "MyAnimeApp/1.4 (+https://myanimeapp.example)" \
  "https://api.mikai.me/public/v1/anime?limit=5"
Стандартний агент бібліотеки (python-requests/2.x, curl/8.x, Go-http-client) або порожній заголовок нічого не каже про ваш застосунок. Замініть його на власний.

Ключ доступу

Ключ необовʼязковий: усі ендпоінти працюють і без нього, просто з меншими лімітами. Ключ підіймає ліміти й дає власний лічильник використання.

Передати його можна двома способами — оберіть той, що зручніший вашому HTTP-клієнту:

X-API-Key: mk_xxxxxxxx…
# або
Authorization: Bearer mk_xxxxxxxx…
Ключ — це секрет. Не вставляйте його у фронтенд-код і в публічні репозиторії: будь-хто, хто його побачить, витрачатиме ваш ліміт.
КодКоли трапляється
401Передано недійсний ключ
403Ключ вимкнено
404Ресурс не знайдено
422Некоректні параметри запиту або посилання на аніме
429Перевищено ліміт запитів за хвилину

Помилки

Помилка приходить у тому ж конверті з ok: false. Поле code — стабільний ідентифікатор, на який можна перемикатись у коді; message — людський текст українською, який ми можемо переформулювати будь-коли.

{
  "ok": false,
  "error": {
    "errorCode": 422,
    "code": "invalid_parameter",
    "message": "invalid parameter: sort=\"popularity\" is not one of mal_rating, name, updated, views, year"
  }
}
codeHTTPЩо сталося
invalid_parameter422Невідоме значення параметра — у повідомленні перелічені допустимі
invalid_reference422Некоректне посилання на аніме у {ref}
too_many_ids422У /resolve передано понад 100 значень
invalid_request400Тіло запиту не є коректним JSON
not_found404Ресурс не знайдено
invalid_api_key401Передано недійсний ключ
api_key_disabled403Ключ вимкнено
rate_limited429Вичерпано ліміт за хвилину
internal_error500Помилка на нашому боці
Невідоме значення фільтра — це 422, а не порожній список. Так помилка в клієнті не виглядає як «нічого не знайдено».

Ліміти

Без ключа запити рахуються по IP, з ключем — по ключу. Обмеження є лише на кількість запитів за хвилину, добової квоти немає.

Спосіб викликуЗа хвилину
Без ключа60
З ключем300

Кожна відповідь містить поточний стан лічильника:

ЗаголовокЗначення
X-RateLimit-LimitЛіміт запитів за хвилину
X-RateLimit-RemainingСкільки лишилось у поточній хвилині
X-RateLimit-ResetЧерез скільки секунд лічильник обнулиться

Після перевищення приходить 429 із заголовком Retry-After. Замість того щоб опитувати каталог по колу, використовуйте /updates?since=… — вона віддає лише те, що зʼявилося після вказаного моменту.

Потрібно більше — напишіть нам, ліміт конкретного ключа можна підняти.

Кешування

Кожна успішна відповідь має ETag і Cache-Control. Надішліть If-None-Match з отриманим раніше тегом — і якщо нічого не змінилось, прийде 304 без тіла.

curl -H 'If-None-Match: "3f2a91c4e0d7"'   "https://api.mikai.me/public/v1/genres"
ЩоЖиве в кеші
/genres, /tags, /studios, /meta1 година
каталог, картка аніме, плеєр, команди5 хвилин
/schedule, /updates, /posters/ua1 хвилина
/me, /health, /anime/randomне кешуються
304 так само коштує один запит за лімітом — економія тут у трафіку й розборі JSON, а не в ліміті.

Ідентифікатори

Скрізь, де у шляху стоїть {ref}, можна підставити будь-який відомий ідентифікатор. Без префікса це id Mikai:

GET /anime/1523                    # id Mikai
GET /anime/mal:21                  # MyAnimeList
GET /anime/al:21                   # AniList
GET /anime/hikka:gasdas-one-piece  # Hikka slug
GET /anime/slug:one-piece          # наш slug

Той самий {ref} працює і для вкладених ресурсів: /anime/mal:21/player, /anime/mal:21/posters.

Кожна відповідь про аніме містить повний блок ids, тож одного запиту досить, щоб дізнатись усі відповідники. IMDb у ньому теж є, але шукати за ним не можна: один IMDb-запис описує всю франшизу, а не окремий сезон.

Рядок без префікса, який не є числом (наприклад one-piece), повертає 422 з підказкою — щоб помилка в клієнті не виглядала як «аніме немає».

Коли треба зіставити багато ідентифікаторів одразу, беріть /resolve: до 100 значень за один запит, і за лімітами це коштує один запит.

Аніме, вкладене в іншу відповідь — у розкладі, стрічці новинок, звʼязаних тайтлах — приходить скорочено: ids, titles і images. Решта полів там просто не читається з бази, тому ми їх і не показуємо; повна картка — за /anime/{ref}.

Зображення

API віддає готові абсолютні посилання — збирати їх вручну не треба. Кожне зображення доступне у трьох розмірах і двох форматах:

{
  "big":    { "webp": "https://images.mikai.me/poster/big/70733847-…webp",
              "jpg":  "https://images.mikai.me/poster/big/70733847-….jpg" },
  "medium": { … },
  "small":  { … }
}
РозмірНайбільша сторона
big1600 px
medium900 px
small400 px

Файли віддаються з Cache-Control: immutable — їх можна безпечно кешувати надовго.

Використання та атрибуція

Дані можна використовувати у власних застосунках, ботах і сайтах. Просимо про три речі:

  • вказуйте джерело — посилання на mikai.me;
  • зберігайте авторство команд озвучення та авторів постерів — воно приходить у полях team та author;
  • не використовуйте API для масового дзеркалювання відео — посилання на плеєри належать провайдерам.

Номер серії — дробове число. Команда, яка озвучує здвоєні (половинчасті) серії окремо, має 1 і 1.5 — це одна канонічна серія. Тому episodesCount рахує канонічні серії й може бути меншим за довжину масиву episodes, а lastEpisode — це найбільший номер, якого команда досягла.

Аніме під жорсткою українською ліцензією повертаються без джерел: licensed: true і порожній releases. Блок license при цьому каже, хто ліцензіат і де дивитись легально — покажіть це замість порожнього плеєра. Інші ліцензії на видачу не впливають.

Версії та сумісність

Версія контракту приходить у /meta як version. У межах /public/v1 ми можемо додавати нові поля й ендпоінти — тому ваш клієнт має ігнорувати незнайомі поля, а не падати на них.

  • нове поле у відповіді або новий необовʼязковий параметр — не ламає сумісність і може зʼявитись будь-коли;
  • видалення чи перейменування поля, зміна типу — тільки в новій версії шляху (/public/v2);
  • стару версію ми тримаємо щонайменше пів року після виходу нової й попереджаємо в контактах.
Значення enum-полів теж можуть поповнюватись. Замість того щоб зашивати списки, звіряйтесь із /meta — там і формати, і статуси, і допустимі поля сортування.

Аніме

Каталог, детальна інформація та схожі тайтли.

GET/public/v1/anime

Список аніме

Пагінований каталог з короткою інформацією. Фільтри збігаються з тими, що працюють на сайті. Якщо передано search, результати впорядковані за релевантністю, а sort і order ігноруються.

Параметри

search stringПошук за назвою (українською, англійською, оригінальною або будь-якою з альтернативних)
genres string[]Жанри через кому — значення поля name з /genres
genresExclude string[]Жанри, яких не має бути
genresMatch string = allall — усі перелічені жанри, any — будь-який із них
tags string[]Теги через кому — значення поля name з /tags
tagsExclude string[]Теги, яких не має бути
tagsMatch string = allall або any
years string[]Конкретні роки через кому, наприклад 1999,2003
yearFrom intРік від
yearTo intРік до
seasons string[]winter, spring, summer, autumn, unknown
formats string[]tv, movie, special, ova, ona, music, other, unknown
statuses string[]finished, ongoing, announce, cancelled, break, unknown
studios string[]Студії через кому
teams int[]ID команд озвучення через кому
sort string = namename, year, updated (за останньою доданою серією), views, mal_rating
order stringasc або desc. За замовчуванням asc для name і desc для решти полів
page int = 1Номер сторінки
limit int = 20Розмір сторінки, максимум 100

Запит

curl "https://api.mikai.me/public/v1/anime?statuses=ongoing&limit=2"

Відповідь

{
  "ok": true,
  "total": 214,
  "page": 1,
  "pages": 107,
  "result": [
    {
      "ids": { "mikai": 1523, "slug": "one-piece", "mal": 21,
               "al": 21, "hikka": "gasdas-one-piece", "imdb": "tt0388629" },
      "titles": { "ua": "Ван Піс", "english": "One Piece", "original": "ワンピース" },
      "images": {
        "poster": { "big": { "webp": "https://images.mikai.me/poster/big/….webp",
                             "jpg":  "https://images.mikai.me/poster/big/….jpg" } }
      },
      "format": "tv",
      "status": "ongoing",
      "season": "autumn",
      "year": 1999,
      "episodes": 0,
      "isAdult": false
    }
  ]
}
GET/public/v1/anime/{ref}

Детальна інформація

Усе про тайтл одним запитом: опис, жанри й теги, оцінки, вікове обмеження, країна, класифікація серій (філери/канон), звʼязані тайтли, схожі, україномовні постери та зведення релізів. Окремо доводиться питати лише список серій — він на /anime/{ref}/player.

Параметри

ref * stringБудь-який ідентифікатор: 1523, mal:21, al:21, hikka:…, slug:…
include string[]Звузити відповідь до потрібних блоків: releases, uaPosters, relations, similar. За замовчуванням приходять усі

Запит

curl "https://api.mikai.me/public/v1/anime/mal:21"

Відповідь

{
  "ok": true,
  "result": {
    "ids": { "mikai": 1523, "slug": "one-piece", "mal": 21, "al": 21 },
    "titles": { "ua": "Ван Піс", "english": "One Piece", "synonyms": ["ワンピース", "One Piece: WE ARE!"] },
    "description": "…",
    "format": "tv",
    "status": "ongoing",
    "startDate": "1999-10-20",
    "source": "manga",
    "studio": "Toei Animation",
    "country": "JP",
    "ageRating": "pg13",
    "episodes": { "total": 0, "aired": 1122, "localized": 640, "durationMin": 24 },
    "scores": { "mikai": 9.1, "mikaiCount": 812, "mal": 8.73, "malCount": 1400000 },
    "genres": [ { "name": "Action", "ua": "Бойовик" } ],
    "tags": [ { "name": "Pirates", "ua": "Пірати" } ],
    "episodeTypes": { "filler": [ { "from": 54, "to": 60 } ] },
    "licensed": false,
    "releases": [
      {
        "id": "t_45:voice",
        "kind": "voice",
        "isCollab": false,
        "teams": [ { "id": 45, "slug": "fanvoxua", "name": "FanVoxUA" } ],
        "episodesCount": 640,
        "lastEpisode": 640,
        "updatedAt": "2026-08-20T10:00:00Z"
      }
    ],
    "uaPosters": [ { "id": 7, "isSelected": true, "author": "Оксана К.", "team": { … }, "images": { … } } ],
    "relations": [ { "kind": "sideStory", "anime": { … } } ],
    "similar": [ { "ids": { "mikai": 902, "mal": 6702 }, "titles": { "ua": "Фейрі Тейл" }, "format": "tv", … } ]
  }
}
GET/public/v1/anime/random

Випадкове аніме

Коротка картка випадкового тайтлу.

Запит

curl "https://api.mikai.me/public/v1/anime/random"
GET/public/v1/resolve

Резолв ідентифікаторів (GET)

Те саме, що POST-версія, але списком у query — зручно перевірити руками або з клієнта, який не вміє слати тіло в GET.

Параметри

source * stringmal, al, hikka, slug або mikai
ids * string[]До 100 значень через кому

Запит

curl "https://api.mikai.me/public/v1/resolve?source=mal&ids=1,21,999999999"
POST/public/v1/resolve

Батч-резолв ідентифікаторів

Зіставляє до 100 зовнішніх ідентифікаторів з нашими за один запит. Значення, яких у нас немає, повертаються як null.

Параметри

source * stringmal, al, hikka, slug або mikai
ids * arrayДо 100 значень

Запит

curl -X POST -H "Content-Type: application/json" \
  -d '{"source":"mal","ids":[1,21,999999999]}' \
  "https://api.mikai.me/public/v1/resolve"

Відповідь

{
  "ok": true,
  "result": {
    "1":  { "mikai": 12, "slug": "cowboy-bebop", "mal": 1, "al": 1 },
    "21": { "mikai": 1523, "slug": "one-piece", "mal": 21, "al": 21 },
    "999999999": null
  }
}

Плеєр

Озвучення та субтитри, згруповані по релізах.

GET/public/v1/anime/{ref}/player

Серії та джерела

Список серій. Реліз — це одна команда (або колаборація) і один трек: озвучення voice чи субтитри sub. Усередині релізу серії лежать плоским списком, а кожна серія містить масив sources з усіма провайдерами, які її хостять. Якщо серії не потрібні, те саме зведення релізів уже є в детальній картці аніме.

Параметри

ref * stringІдентифікатор аніме
episodes bool = truefalse — повернути тільки зведення релізів, без списку серій

Запит

curl "https://api.mikai.me/public/v1/anime/mal:21/player"

Відповідь

{
  "ok": true,
  "result": {
    "anime": { "ids": { "mikai": 1523, "mal": 21 }, "titles": { "ua": "Ван Піс" } },
    "licensed": false,
    "releases": [
      {
        "id": "t_45:voice",
        "kind": "voice",
        "isCollab": false,
        "teams": [ { "id": 45, "slug": "fanvoxua", "name": "FanVoxUA" } ],
        "episodesCount": 640,
        "lastEpisode": 640,
        "updatedAt": "2026-08-20T10:00:00Z",
        "episodes": [
          {
            "number": 640,
            "label": "640",
            "kind": "mangaCanon",
            "addedAt": "2026-08-20T10:00:00Z",
            "sources": [
              { "provider": "ashdi", "embedUrl": "https://…", "addedAt": "2026-08-20T10:00:00Z" },
              { "provider": "moon",  "embedUrl": "https://…", "addedAt": "2026-08-20T10:02:00Z" }
            ]
          }
        ]
      }
    ]
  }
}
GET/public/v1/updates

Стрічка новинок

Щойно опубліковані серії по всьому сайту, найновіші першими. Це найдешевший спосіб тримати дзеркало або канал у Telegram актуальним: передавайте since з часом попереднього запиту. Поле teams влаштоване так само, як у плеєрі: для колаборації воно містить усі команди, що працювали над релізом, і isCollab: true. Одна серія, яку хостять кілька провайдерів, приходить окремим записом на кожного.

Параметри

since stringМітка часу RFC3339 — повернути лише те, що зʼявилось пізніше
page int = 1Номер сторінки
limit int = 20Розмір сторінки, максимум 100

Запит

curl "https://api.mikai.me/public/v1/updates?since=2026-08-25T00:00:00Z&limit=50"

Відповідь

{
  "ok": true,
  "total": 87,
  "result": [
    {
      "anime": { "ids": { "mikai": 1523, "mal": 21 }, "titles": { "ua": "Ван Піс" } },
      "teams": [ { "id": 45, "slug": "fanvoxua", "name": "FanVoxUA" } ],
      "isCollab": false,
      "teamName": "FanVoxUA",
      "kind": "voice",
      "provider": "ashdi",
      "episode": 640,
      "embedUrl": "https://…",
      "publishedAt": "2026-08-25T18:12:00Z"
    }
  ]
}

Постери

Україномовні постери з інформацією про авторство.

GET/public/v1/anime/{ref}/posters

Постери одного аніме

Оригінальна обкладинка плюс усі україномовні постери. Для кожного приходить команда, яка його опублікувала, та особистий автор, якщо він відомий.

Параметри

ref * stringІдентифікатор аніме

Запит

curl "https://api.mikai.me/public/v1/anime/mal:21/posters"

Відповідь

{
  "ok": true,
  "result": {
    "anime": { "ids": { "mikai": 1523, "mal": 21 } },
    "original": { "big": { "webp": "https://images.mikai.me/poster/big/….webp", "jpg": "…" } },
    "uaPosters": [
      {
        "id": 7,
        "isSelected": true,
        "author": "Оксана К.",
        "team": { "id": 45, "slug": "fanvoxua", "name": "FanVoxUA" },
        "images": {
          "big":    { "webp": "https://images.mikai.me/ua_poster/big/70733847-7883-11f1-b061-96742946622a.webp",
                      "jpg":  "https://images.mikai.me/ua_poster/big/70733847-7883-11f1-b061-96742946622a.jpg" },
          "medium": { … },
          "small":  { … }
        }
      }
    ]
  }
}
GET/public/v1/posters/ua

Стрічка всіх постерів

Усі україномовні постери з пагінацією — для дзеркал і галерей. Кожен запис несе аніме, до якого належить.

Параметри

since stringМітка часу RFC3339
page int = 1Номер сторінки
limit int = 20Розмір сторінки, максимум 100

Запит

curl "https://api.mikai.me/public/v1/posters/ua?limit=50"

Команди

Команди озвучення та субтитрування і їхні роботи.

GET/public/v1/teams

Список команд

Параметри

search stringПошук за назвою
haveVoice boolЛише ті, хто озвучує
haveSubs boolЛише ті, хто робить субтитри
sort string = namename, count (кількість тайтлів), updated (за останнім релізом)
order stringasc або desc. За замовчуванням asc для name і desc для решти
page int = 1Номер сторінки
limit int = 20Розмір сторінки, максимум 50

Запит

curl "https://api.mikai.me/public/v1/teams?haveVoice=true&limit=5"
GET/public/v1/teams/{ref}

Інформація про команду

Приймає числовий id або slug команди. views — скільки разів дивилися серії команди на Mikai; серії, випущені в колаборації, зараховуються кожній команді з неї.

Параметри

ref * stringID або slug команди

Запит

curl "https://api.mikai.me/public/v1/teams/fanvoxua"

Відповідь

{
  "ok": true,
  "result": {
    "id": 45,
    "slug": "fanvoxua",
    "name": "FanVoxUA",
    "description": "…",
    "birthday": "2018-04-12",
    "avatar": { "big": { "webp": "…", "jpg": "…" } },
    "links": { "telegram": "https://t.me/…", "youtube": "https://…" },
    "hasVoice": true,
    "hasSubs": false,
    "animeCount": 128,
    "views": { "total": 4210533, "last30Days": 118904 }
  }
}
GET/public/v1/teams/{ref}/anime

Роботи команди

Параметри

ref * stringID або slug команди
page int = 1Номер сторінки
limit int = 20Розмір сторінки, максимум 100

Запит

curl "https://api.mikai.me/public/v1/teams/fanvoxua/anime"

Персонажі

Пошук персонажів за будь-яким із їхніх імен та детальна картка.

GET/public/v1/characters

Пошук персонажів

Шукає за українським, англійським, оригінальним та альтернативними іменами — з поправкою на одруківки, як пошук у каталозі. Якщо збіг слабкий, пробуємо й українське написання запиту (микаса → мікаса). Без search це просто каталог персонажів, упорядкований за популярністю. mainAnime — аніме, яким персонаж найвідоміший: спершу головна роль, потім найновіше; role у ньому — роль персонажа саме там.

Параметри

search stringІмʼя персонажа будь-якою з мов. Потрібно щонайменше дві літери чи цифри; довший за 100 символів обрізається
roles string[]main, supporting, background через кому — лише ті, хто має таку роль хоча б в одному аніме
genders string[]male, female, nonbinary, other через кому
ageFrom intВік від. Вік персонажа — проміжок (17–19), він підходить, якщо перетинається з вашим
ageTo intВік до
birthMonth intМісяць народження, 1–12
birthToday boolЛише ті, в кого день народження сьогодні за київським часом. Має перевагу над birthMonth
withDescription boolЛише з описом українською
anime intID аніме — лише персонажі з нього
sort string = relevancerelevance (потребує search), popularity, name, anime (кількість аніме), birthday (з січня; без дня народження — в кінці)
order stringasc або desc. За замовчуванням asc для name і desc для решти
page int = 1Номер сторінки
limit int = 20Розмір сторінки, максимум 50

Запит

curl "https://api.mikai.me/public/v1/characters?search=луффі&limit=2"

Відповідь

{
  "ok": true,
  "total": 4,
  "page": 1,
  "limit": 2,
  "result": [
    {
      "id": 757,
      "slug": "luffy-monkey-d",
      "names": { "ua": "Монкі Д. Луффі", "en": "Luffy Monkey D.", "native": "モンキー・D・ルフィ" },
      "image": { "webp": "…/character/small/….webp", "jpg": "…/character/small/….jpg" },
      "animeCount": 16,
      "favorites": 185845,
      "mainAnime": { "id": 21, "slug": "van-pis", "name": "Ван Піс", "nameEn": "One Piece", "year": 1999, "format": "tv", "role": "main" }
    },
    {
      "id": 51234,
      "slug": "lufas-mafaal",
      "names": { "ua": "Луфас Мафаагл", "en": "Lufas Maphaahl" },
      "animeCount": 1,
      "favorites": 412,
      "mainAnime": { "id": 7688, "slug": "…", "name": "Зʼявився дикий останній бос!", "year": 2025, "format": "tv", "role": "main" }
    }
  ]
}
GET/public/v1/characters/{ref}

Інформація про персонажа

Приймає числовий id, slug або рядок id-slug з адреси сторінки. Обʼєднаного персонажа віддаємо як того, у кого його обʼєднали. Імена зі спойлерами в altNames не потрапляють.

description — Markdown українською, а якщо українського опису ще немає — англійською. Посилання в ньому ведуть на сторінки Mikai. Спойлери позначені директивами: блоковий — рядками ::spoiler … ::, у реченні — :inline-spoiler[текст]; якщо ваш рендерер їх не знає, сховайте або приберіть цей текст. birthday — ISO-дата, а без відомого року — --MM-DD.

Параметри

ref * stringID, slug або id-slug

Запит

curl "https://api.mikai.me/public/v1/characters/757-luffy-monkey-d"

Відповідь

{
  "ok": true,
  "result": {
    "id": 757,
    "slug": "luffy-monkey-d",
    "names": { "ua": "Монкі Д. Луффі", "en": "Luffy Monkey D.", "native": "モンキー・D・ルフィ" },
    "image": { "webp": "…", "jpg": "…" },
    "animeCount": 16,
    "favorites": 185845,
    "mainAnime": { "id": 21, "slug": "van-pis", "name": "Ван Піс", "nameEn": "One Piece", "year": 1999, "format": "tv", "role": "main" },
    "altNames": ["Бриль", "Муґівара", "Straw Hat Luffy"],
    "description": "Широко відомий як «Бриль Луффі»… Він шукає скарб покійного [Ґол Д. Роджера](https://mikai.me/characters/…).",
    "gender": "male",
    "ageMin": 17,
    "ageMax": 17,
    "birthday": "--05-05",
    "heightCm": 172,
    "externalIds": { "hikka": ["luffy-monkey-d-b6c098"], "mal": ["40"], "anilist": ["40"] },
    "anime": [
      { "id": 21, "slug": "van-pis", "name": "Ван Піс", "nameEn": "One Piece", "year": 1999, "format": "tv", "role": "main" }
    ],
    "updatedAt": "2026-09-18T01:31:55Z"
  }
}

Транслітерація

Українська транслітерація імен і назв: японська за Коваленком, китайська за Кірносовою–Цісар, корейська за Щегелем, західні — за чинним правописом.

GET/public/v1/translit

Транслітерувати текст

Той самий транслітератор, яким ми пишемо імена персонажів і акторів на сайті. Кожен рядок обробляється окремо, розділові знаки й порожні рядки зберігаються. Слово, яке система не може прочитати (ієрогліфи, латинка в корейському режимі), повертається без змін і потрапляє у unresolved. Порядок слів не міняється. Якщо жодне слово не прочиталось, а інша мова читає текст повністю, у відповіді зʼявляється suggest — мова, назва розділу й готове читання там. Для lang=en режим імені розрізняє людей і все інше: mode=text читає будь-що, крім імені людини, як власну назву: и після дж, ж, ч, ш, щ, ц і р (Chicago → Шикаґо, Toshiba → Тошиба), auto і name — як імена (і після приголосного). Імʼя, яке в нашому каталозі щонайменше троє записів пишуть однаково, віддається в цій формі, приведеній до правил (ґ, і): такий рядок має from: catalog і rules із читанням за правилами. Машинні переклади й поодинокі записи в цьому не беруть участі.

Параметри

lang * stringja — ромаджі або кана, zh — піньїнь, ko — ханґиль, en — латинка
text * stringТекст, до 32 КБ. Синонім — q
system stringДруга система мови, якщо вона є. lang=ja: kovalenko (типово) або gojuon — система Ґоджюон (КНУ, 2011), яка не йотує голосний на стику складів (Кейічі замість Кейїчі). lang=zh: ukt (типово) або academic — академічна система НАН 2019 (цзі, чжа, -ун). lang=ko: hikka (типово) — читає слово як воно звучить, або shchegel — академічна система ще зі складами імені через дефіс
mode string = autoЩо саме в тексті. name — кожен рядок є одним особовим імʼям (прізвище, далі імʼя), text — звичайний текст, ніколи не читати слово як імʼя. Діє для lang=ko (межа «прізвище + імʼя») , lang=ja (кінцеві частини імен -ishi, -ura, -izumi, -uchi… як окремі морфеми), lang=zh (складене імʼя зшивається: Mao Ze Dong → Мао Дзедон) та lang=en (імена пишуться з і, а text читає все інше як власну назву: Chicago → Шикаґо)

Запит

curl "https://api.mikai.me/public/v1/translit?lang=ja&text=Gojou%20Satoru"

Відповідь

{
  "ok": true,
  "result": {
    "lang": "ja",
    "system": "Система Коваленка",
    "text": "Ґоджьо Сатору",
    "lines": [
      { "source": "Gojou Satoru", "result": "Ґоджьо Сатору" }
    ]
  }
}
POST/public/v1/translit

Транслітерувати список

Те саме, але тілом запиту. Передайте text з переносами рядків або масив items — відповідь та сама, по рядку на елемент.

Параметри

lang * stringja, zh, ko або en
text stringБагаторядковий текст
items string[]Список рядків замість text
system stringja: kovalenko (типово) або gojuon; zh: ukt (типово) або academic; ko: hikka (типово) або shchegel
mode string = autoauto, name або text — див. GET

Запит

curl -X POST "https://api.mikai.me/public/v1/translit"   -H "Content-Type: application/json"   -d '{"lang":"zh","items":["Xie Wanqian","Mao Zedong"]}'

Відповідь

{
  "ok": true,
  "result": {
    "lang": "zh",
    "system": "Система Кірносової–Цісар (УКТ)",
    "text": "Сє Ваньцянь
Мао Дзедон",
    "lines": [
      { "source": "Xie Wanqian", "result": "Сє Ваньцянь" },
      { "source": "Mao Zedong",  "result": "Мао Дзедон" }
    ]
  }
}
GET/public/v1/translit/systems

Правила та джерела

Опис кожної системи: правила з прикладами, типові русифіковані варіанти, обмеження й посилання на джерела. Якщо в мови є друга, необовʼязкова система, вона приходить у полі alt разом із параметром, який її вмикає (китайська: академічна система 2019; корейська: система Hikka). Поле nameMode каже, що для системи має сенс mode=name. У naming — редакційне правило запису імені (порядок слів тощо): його застосовує людина, сама служба порядок ніколи не міняє. Саме цей опис показує trans.mikai.me.

Запит

curl "https://api.mikai.me/public/v1/translit/systems"

Відповідь

{
  "ok": true,
  "total": 4,
  "result": [
    {
      "lang": "ja",
      "title": "Японська",
      "system": "Система Коваленка",
      "accepts": [ { "name": "Ромаджі (Гепберн)", "example": "Gojou Satoru" }, { "name": "Хіраґана", "example": "しんいち" }, … ],
      "summary": "Практична транскрипція О. Коваленка (2012)…",
      "rules":   [ { "text": "し ち つ ふ じ → ші чі цу фу джі", "example": "Fuji → Фуджі" } ],
      "against": [ { "bad": "Сусі, Тіба, Дзюн", "good": "Суші, Чіба, Джюн", "why": "«Поліванівка»…" } ],
      "limits":  [ "Ієрогліфи не читаються…" ],
      "sources": [ { "title": "Стаття модераторів Hikka", "url": "https://hikka.io/articles/…" } ]
    }
  ]
}

Довідники

Розклад, словники та самоопис API.

GET/public/v1/schedule

Розклад виходу серій

Обʼєкт із сімома ключами — від monday до sunday. Усі дні присутні завжди, навіть порожні. День визначається за київським часом виходу серії, а саме поле airing приходить у UTC.

Запит

curl "https://api.mikai.me/public/v1/schedule"

Відповідь

{
  "ok": true,
  "result": {
    "monday": [
      {
        "anime": { "ids": { "mikai": 1523, "mal": 21 }, "titles": { "ua": "Ван Піс" } },
        "episode": 641,
        "airing": "2026-08-31T06:30:00Z",
        "finished": false
      }
    ],
    "tuesday": []
  }
}
GET/public/v1/genres

Жанри

Канонічні назви жанрів та їхні українські відповідники. Значення поля name — те, що приймає фільтр genres.

Запит

curl "https://api.mikai.me/public/v1/genres"
GET/public/v1/tags

Теги

Канонічні назви тегів та їхні українські відповідники. Значення поля name — те, що приймає фільтр tags.

Запит

curl "https://api.mikai.me/public/v1/tags"
GET/public/v1/studios

Студії

Перелік студій-виробників для фільтра studios.

Запит

curl "https://api.mikai.me/public/v1/studios"
GET/public/v1/meta

Самоопис API

Усі допустимі значення enum-полів і полів сортування, розміри та формати зображень, чинні ліміти й версія контракту. Зручно звіряти клієнт із живим сервером замість того, щоб зашивати списки в код.

Запит

curl "https://api.mikai.me/public/v1/meta"

Відповідь

{
  "ok": true,
  "result": {
    "version": "1.0",
    "formats": [ "tv", "movie", … ],
    "statuses": [ "finished", "ongoing", … ],
    "relationKinds": [ "prequel", "sequel", "sideStory", … ],
    "animeSortFields": [ "mal_rating", "name", "updated", "views", "year" ],
    "teamSortFields": [ "count", "name", "updated" ],
    "sortOrders": [ "asc", "desc" ],
    "matchModes": [ "all", "any" ],
    "detailIncludes": [ "releases", "uaPosters", "relations", "similar" ],
    "limits": {
      "anonymous": { "rateLimitPerMin": 60 },
      "withKey":   { "rateLimitPerMin": 300 }
    },
    "maxPageSize": 100,
    "maxTeamPageSize": 50
  }
}
GET/public/v1/me

Поточні ліміти

Які ліміти діють для цього виклику і скільки з них уже витрачено. Без ключа повертає ліміти анонімного доступу.

Запит

curl "https://api.mikai.me/public/v1/me"
GET/public/v1/health

Перевірка доступності

Запит

curl "https://api.mikai.me/public/v1/health"

Знайшли помилку або бракує ендпоінта? Напишіть нам — контакти.

mikai.me