{"openapi":"3.1.0","info":{"title":"DubByMeow API","version":"1.0.0","description":"Что озвучила студия DubByMeow и что выйдет дальше: тайтлы, вышедшие серии со ссылкой на видео и титрами, план выходов. Только чтение. Тайтл называется номером AniList или MyAnimeList — тем же, что на любом аниме-сайте."},"servers":[{"url":"https://api.meowhub.lol/v1"}],"security":[{"bearer":[]}],"paths":{"/titles":{"get":{"operationId":"listTitles","summary":"Тайтлы студии","description":"Все тайтлы, которые студия озвучивает или озвучила, по алфавиту. Многоголосая и одноголосая озвучка одного аниме — один тайтл; какие виды уже вышли, видно в `voices`.","parameters":[{"name":"status","in":"query","description":"Только с этим состоянием","schema":{"type":"string","enum":["planned","in_progress","paused","done"]}}],"responses":{"200":{"description":"Список тайтлов","content":{"application/json":{"schema":{"type":"object","required":["titles"],"properties":{"titles":{"type":"array","description":"Тайтлы","items":{"$ref":"#/components/schemas/Title"}}}},"example":{"titles":[{"ref":"anilist-154587","ids":{"anilist":154587,"mal":52991},"name":"Провожающая в последний путь Фрирен","originalName":"Sousou no Frieren","status":"in_progress","poster":"https://animeow.org/covers/9926.webp","episodesTotal":28,"episodesReleased":2,"voices":["multi"],"lastReleaseAt":"2026-10-08T15:00:00.000Z"}]}}}},"400":{"description":"Неизвестное значение `status`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Нет ключа или он неверный","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Слишком много запросов; заголовок `Retry-After` — через сколько секунд повторить","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/titles/{ref}":{"get":{"operationId":"getTitle","summary":"Тайтл и его вышедшие серии","description":"Серии — только вышедшие, по номеру. Если у серии есть обе озвучки, она встречается дважды: с `voice: multi` и `voice: solo`.","parameters":[{"name":"ref","in":"path","required":true,"description":"Ссылка на тайтл: номер AniList (`anilist-154587`) или MyAnimeList / Shikimori (`mal-52991`)","schema":{"type":"string","pattern":"^(anilist|mal)-[1-9][0-9]*$"},"example":"anilist-154587"}],"responses":{"200":{"description":"Тайтл и серии","content":{"application/json":{"schema":{"type":"object","required":["title","episodes"],"properties":{"title":{"$ref":"#/components/schemas/Title"},"episodes":{"type":"array","description":"Вышедшие серии","items":{"$ref":"#/components/schemas/Episode"}}}},"example":{"title":{"ref":"anilist-154587","ids":{"anilist":154587,"mal":52991},"name":"Провожающая в последний путь Фрирен","originalName":"Sousou no Frieren","status":"in_progress","poster":"https://animeow.org/covers/9926.webp","episodesTotal":28,"episodesReleased":2,"voices":["multi"],"lastReleaseAt":"2026-10-08T15:00:00.000Z"},"episodes":[{"number":1,"voice":"multi","releasedAt":"2026-10-01T15:00:00.000Z","video":"https://drive.google.com/file/d/1AbCdEfGhIjKlMnOpQrStUvWxYz012345/view","credits":{"cast":[{"character":"Фрирен","actor":"Маря"},{"character":"Ферн","actor":"Кира"}],"additionalVoices":["Мекс"],"translation":["Алекс"],"timing":["Мекс"],"mixing":["Мекс"],"qc":["Кира"]}},{"number":2,"voice":"multi","releasedAt":"2026-10-08T15:00:00.000Z","video":"https://drive.google.com/file/d/1AbCdEfGhIjKlMnOpQrStUvWxYz012345/view","credits":{"cast":[{"character":"Фрирен","actor":"Маря"},{"character":"Ферн","actor":"Кира"}],"additionalVoices":["Мекс"],"translation":["Алекс"],"timing":["Мекс"],"mixing":["Мекс"],"qc":["Кира"]}}]}}}},"400":{"description":"Ссылка не похожа на `anilist-N` или `mal-N`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Нет ключа или он неверный","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Студия этот тайтл не озвучивает","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Слишком много запросов; заголовок `Retry-After` — через сколько секунд повторить","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/releases":{"get":{"operationId":"listReleases","summary":"Лента релизов","description":"Вышедшие серии всех тайтлов, свежие первыми. Чтобы получать только новое, передавайте в `since` время последней серии, которую вы уже видели.","parameters":[{"name":"limit","in":"query","description":"Сколько серий вернуть","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"since","in":"query","description":"Только серии, вышедшие позже этого момента (ISO 8601)","schema":{"type":"string","format":"date-time"},"example":"2026-10-01T00:00:00Z"}],"responses":{"200":{"description":"Серии","content":{"application/json":{"schema":{"type":"object","required":["releases"],"properties":{"releases":{"type":"array","description":"Вышедшие серии","items":{"$ref":"#/components/schemas/Release"}}}},"example":{"releases":[{"title":{"ref":"anilist-154587","name":"Провожающая в последний путь Фрирен","originalName":"Sousou no Frieren","poster":"https://animeow.org/covers/9926.webp"},"number":2,"voice":"multi","releasedAt":"2026-10-08T15:00:00.000Z","video":"https://drive.google.com/file/d/1AbCdEfGhIjKlMnOpQrStUvWxYz012345/view","credits":{"cast":[{"character":"Фрирен","actor":"Маря"},{"character":"Ферн","actor":"Кира"}],"additionalVoices":["Мекс"],"translation":["Алекс"],"timing":["Мекс"],"mixing":["Мекс"],"qc":["Кира"]}}]}}}},"400":{"description":"Неверный `limit` или `since`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Нет ключа или он неверный","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Слишком много запросов; заголовок `Retry-After` — через сколько секунд повторить","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/schedule":{"get":{"operationId":"getSchedule","summary":"План выходов","description":"Невышедшие серии с плановой датой выхода, ближайшие первыми. Дата — планы студии, а не обещание: серия может выйти позже.","parameters":[{"name":"days","in":"query","description":"На сколько дней вперёд","schema":{"type":"integer","minimum":1,"maximum":90,"default":30}}],"responses":{"200":{"description":"План","content":{"application/json":{"schema":{"type":"object","required":["schedule"],"properties":{"schedule":{"type":"array","description":"Плановые выходы","items":{"$ref":"#/components/schemas/ScheduleItem"}}}},"example":{"schedule":[{"title":{"ref":"anilist-154587","name":"Провожающая в последний путь Фрирен","originalName":"Sousou no Frieren","poster":"https://animeow.org/covers/9926.webp"},"number":3,"releaseDate":"2026-10-15","stage":"recording"}]}}}},"400":{"description":"Неверный `days`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Нет ключа или он неверный","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Слишком много запросов; заголовок `Retry-After` — через сколько секунд повторить","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Ключ выдаёт студия. Передаётся в заголовке `Authorization: Bearer <ключ>`"}},"schemas":{"Title":{"type":"object","required":["ref","ids","name","originalName","status","poster","episodesTotal","episodesReleased","voices","lastReleaseAt"],"properties":{"ref":{"type":"string","description":"Ссылка на тайтл: номер AniList (`anilist-154587`) или MyAnimeList / Shikimori (`mal-52991`)"},"ids":{"type":"object","required":["anilist","mal"],"properties":{"anilist":{"type":["integer","null"],"description":"Номер на AniList"},"mal":{"type":["integer","null"],"description":"Номер на MyAnimeList, он же на Shikimori"}}},"name":{"type":"string","description":"Название по-русски"},"originalName":{"type":["string","null"],"description":"Название в оригинале, латиницей"},"status":{"type":"string","description":"Состояние работы над тайтлом","enum":["planned","in_progress","paused","done"]},"poster":{"type":["string","null"],"description":"Адрес обложки","format":"uri"},"episodesTotal":{"type":["integer","null"],"description":"Сколько серий в сезоне"},"episodesReleased":{"type":"integer","description":"Сколько серий вышло в озвучке студии"},"voices":{"type":"array","description":"Какие виды озвучки уже вышли: многоголосая, одноголосая (до двух голосов)","items":{"type":"string","enum":["multi","solo"]}},"lastReleaseAt":{"type":["string","null"],"description":"Когда вышла последняя серия","format":"date-time"}}},"Episode":{"type":"object","required":["number","voice","releasedAt","video","credits"],"properties":{"number":{"type":"integer","description":"Номер серии"},"voice":{"type":"string","description":"Вид озвучки","enum":["multi","solo"]},"releasedAt":{"type":["string","null"],"description":"Когда серия вышла","format":"date-time"},"video":{"type":["string","null"],"description":"Ссылка на видео: Google Диск или прямой адрес. `null` — серия вышла, но ссылку не указали","format":"uri"},"credits":{"$ref":"#/components/schemas/Credits"}}},"Credits":{"type":"object","required":["cast","additionalVoices","translation","timing","mixing","qc"],"properties":{"cast":{"type":"array","description":"Роли","items":{"type":"object","required":["character","actor"],"properties":{"character":{"type":"string","description":"Персонаж"},"actor":{"type":"string","description":"Актёр озвучки"}}}},"additionalVoices":{"type":"array","description":"Актёры без отдельной роли: массовка, эпизоды","items":{"type":"string"}},"translation":{"type":"array","description":"Перевод","items":{"type":"string"}},"timing":{"type":"array","description":"Укладка текста","items":{"type":"string"}},"mixing":{"type":"array","description":"Сведение","items":{"type":"string"}},"qc":{"type":"array","description":"Контроль качества","items":{"type":"string"}}}},"TitleBrief":{"type":"object","required":["ref","name","originalName","poster"],"properties":{"ref":{"type":"string","description":"Ссылка на тайтл: номер AniList (`anilist-154587`) или MyAnimeList / Shikimori (`mal-52991`)"},"name":{"type":"string","description":"Название по-русски"},"originalName":{"type":["string","null"],"description":"Название в оригинале"},"poster":{"type":["string","null"],"description":"Адрес обложки","format":"uri"}}},"Release":{"allOf":[{"type":"object","required":["title"],"properties":{"title":{"$ref":"#/components/schemas/TitleBrief"}}},{"$ref":"#/components/schemas/Episode"}],"description":"Серия и тайтл, к которому она относится"},"ScheduleItem":{"type":"object","required":["title","number","releaseDate","stage"],"properties":{"title":{"$ref":"#/components/schemas/TitleBrief"},"number":{"type":"integer","description":"Номер серии"},"releaseDate":{"type":"string","description":"Плановый день выхода по Москве","format":"date"},"stage":{"type":"string","description":"На каком этапе серия сейчас","enum":["translation","timing","recording","mixing","qc","publish"]}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Код ошибки для программы","enum":["unauthorized","rate_limited","bad_request","not_found","internal"]},"message":{"type":"string","description":"Пояснение для человека"}}}}}}},"x-rate-limit":{"requestsPerMinute":120}}