# Альтернатива TVmaze API

> TVmaze охоплює лише серіали, безкоштовний у використанні, обмежений за IP-адресою, а його дані діють за ліцензією з атрибуцією. Деталі дивіться в їхній документації. amodb це платний API для серіалів, фільмів і персон з лімітами за ключем і шляхами TMDB v3. Обирайте за охопленням і бюджетом.

## Обирайте за охопленням і бюджетом

TVmaze охоплює лише серіали. Це безкоштовний публічний API з лімітами запитів за IP-адресою, а його дані діють за ліцензією з атрибуцією, тож подробиці дивіться в їхній документації. amodb платний і охоплює серіали, фільми та персон. Якщо ваш застосунок це трекер серіалів і безкоштовне джерело вам підходить, TVmaze є розумним початком. Якщо ви ще й показуєте фільми, сторінки акторів чи постери кількома мовами, один ключ amodb замінює кілька джерел.

## Що означає кожне охоплення для вашого застосунку

| Ваш застосунок показує    | TVmaze                     | amodb                                          |
| ------------------------- | -------------------------- | ---------------------------------------------- |
| Сторінку серіалу          | Так                        | `GET /3/tv/{series_id}`                        |
| Список епізодів           | Так                        | `GET /3/tv/{series_id}/season/{season_number}` |
| Сторінку фільму           | Фільмів немає              | `GET /3/movie/{movie_id}`                      |
| Сторінку актора           | Дивіться їхню документацію | `GET /3/person/{person_id}` і combined credits |
| Шоу, що виходять сьогодні | Дивіться їхню документацію | `GET /3/tv/airing_today`                       |
| Перекладений опис         | Дивіться їхню документацію | параметр `language`, 14 мов                    |
| Оцінки з кількох сайтів   | Дивіться їхню документацію | розширення `/ratings`                          |

Рядок про фільми вирішує більшість випадків. Якщо сторінок фільмів у вас немає, додаткове охоплення вам нічого не дає.

## Що перевірити перед переходом

Ендпоінти сезонів і епізодів мають форму TMDB, і кілька їхніх частин повертаються порожніми. Протестуйте екрани, що їх використовують.

- **Акторський склад епізоду.** В епізоді `cast` це порожній масив. `guest_stars` і `crew` заповнені, а виклик `/credits` серіалу містить основний акторський склад.
- **Додаткові дані сезону.** `images`, `videos` і `translations` сезону порожні, тож постер сезону береться із запису сезону, а не зі списку зображень.
- **Зовнішні id.** Усі `external_ids` сезонів та епізодів дорівнюють null. Зіставляйте епізоди зі своїми записами за `season_number` і `episode_number`.
- **Автори.** `created_by` у серіалі порожнє для більшості шоу.
- **Немає стрічки змін.** В amodb немає ендпоінта, що перелічує шоу, змінені від певної дати.

## Порівняння можливостей

| Можливість              | TVmaze                                                     | amodb                                                     |
| ----------------------- | ---------------------------------------------------------- | --------------------------------------------------------- |
| Модель цін              | Безкоштовний у використанні публічний API                  | Передплата, від 1 до 24 місяців за покупку                |
| Безкоштовний тариф      | Так, увесь публічний API                                   | Немає, пробного періоду теж немає                         |
| Автентифікація          | Дивіться їхню документацію                                 | `api_key` або заголовок Bearer                            |
| Формат відповіді        | JSON, дивіться їхню документацію                           | JSON у формі TMDB v3                                      |
| Мови                    | Дивіться їхню документацію                                 | 14 мов інтерфейсу                                         |
| Фільми                  | Ні                                                         | Так                                                       |
| Серіали                 | Так, це його єдиний фокус                                  | Так                                                       |
| Персони                 | Дивіться їхню документацію                                 | Так                                                       |
| Зображення              | Дивіться їхню документацію                                 | `img.amodb.dev`, десять токенів розмірів                  |
| Рейтинги                | Дивіться їхню документацію                                 | П'ять джерел, де вони відомі                              |
| Ліміт запитів           | За IP-адресою, числа дивіться в їхній документації         | 20, 40 або 120 на хвилину на ключ                         |
| Комерційне використання | Дані за ліцензією з атрибуцією, дивіться їхню документацію | Платні тарифи, див. [ціни](https://amodb.dev/uk/pricing/) |
| Сумісність              | Власний API                                                | Читання TMDB v3 та OMDb                                   |

## Чим відрізняється amodb

- **Ліміт іде за ключем.** Усі ваші сервери ділять один лічильник у ковзному вікні на 60 секунд, а відповіді містять `X-RateLimit-Remaining`. Ніщо не залежить від того, з якої адреси йде запит.
- **Фільми, серіали й персони в одному місці.** Один клієнт, один формат помилок і один набір заголовків покривають увесь застосунок.
- **Мови.** Назви й описи повертаються будь-якою з 14 мов, а `original_name` зберігає рідну назву.
- **Усталений протокол.** Бібліотеки, написані для читання TMDB v3, працюють з новим базовим URL. Ендпоінти серіалів дивіться на сторінці [API серіалів](https://amodb.dev/uk/tv-show-api/).

## Коли TVmaze підходить краще

- **Немає бюджету.** Він безкоштовний у використанні, тож студентському проєкту чи трекеру на вихідні платити не потрібно. В amodb немає ні безкоштовного тарифу, ні пробного періоду.
- **Лише серіали, без ускладнень.** Якщо ваша модель даних має шоу та епізоди й більше нічого, API, зосереджений на серіалах, їй відповідає.
- **Власні конвенції.** Застосунки, уже побудовані навколо моделі TVmaze, економлять зусилля, якщо залишаються.

Якщо ви лишаєтеся, дотримуйтеся його ліцензії з атрибуцією. Формулювання дивіться в їхній документації.

## Міграція на amodb

Почніть із завдання зіставлення. Прочитайте зовнішні id, які перелічують ваші збережені записи TVmaze (назви полів дивіться в їхній документації), і розпізнайте їх через `/3/find`. Програма нижче зіставляє один id IMDb із серіалом і друкує дату наступного епізоду.

```go
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"os"
	"time"
)

type findResult struct {
	TVResults []struct {
		ID   int    `json:"id"`
		Name string `json:"name"`
	} `json:"tv_results"`
}

type episode struct {
	AirDate       string `json:"air_date"`
	SeasonNumber  int    `json:"season_number"`
	EpisodeNumber int    `json:"episode_number"`
}

type series struct {
	Name        string   `json:"name"`
	Status      string   `json:"status"`
	NextEpisode *episode `json:"next_episode_to_air"`
}

var client = &http.Client{Timeout: 10 * time.Second}

func get(path string, out any) error {
	req, err := http.NewRequest(http.MethodGet, "https://api.amodb.dev/3"+path, nil)
	if err != nil {
		return err
	}
	req.Header.Set("Authorization", "Bearer "+os.Getenv("AMODB_KEY"))
	res, err := client.Do(req)
	if err != nil {
		return err
	}
	defer res.Body.Close()
	if res.StatusCode != http.StatusOK {
		return fmt.Errorf("amodb returned %s", res.Status)
	}
	return json.NewDecoder(res.Body).Decode(out)
}

func main() {
	var found findResult
	if err := get("/find/tt0903747?external_source=imdb_id", &found); err != nil {
		fmt.Println(err)
		return
	}
	if len(found.TVResults) == 0 {
		fmt.Println("no match")
		return
	}
	var s series
	if err := get(fmt.Sprintf("/tv/%d", found.TVResults[0].ID), &s); err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(s.Name, s.Status)
	if s.NextEpisode != nil {
		fmt.Println("next episode:", s.NextEpisode.AirDate)
	}
}
```

Тип-вказівник для `NextEpisode` обробляє `null`, який повертають завершені шоу. Виконайте зіставлення один раз, збережіть id amodb до кожного свого запису й надалі викликайте `/3/tv/{id}`. На 429 приходить `Retry-After`, а інші джерела id перелічено на сторінці [пошук за зовнішнім ID](https://amodb.dev/uk/find-by-external-id/).

## Розрахунок нічної синхронізації

Припустімо, ви щоночі оновлюєте 300 шоу. Це 300 запитів, адже один виклик серіалу повертає одне шоу. За 20 запитів на хвилину завдання триває 15 хвилин, за 40 це 7.5 хвилини, а за 120 це 2.5 хвилини. Додайте `append_to_response=credits,ratings` до кожного виклику, щоб акторський склад і оцінки надходили в тому самому запиті, а не коштували ще двох на кожне шоу. Читайте `X-RateLimit-Remaining` і робіть паузу, коли він сягне нуля, а потім продовжуйте за `X-RateLimit-Reset` секунд.

## Ціни

amodb працює за передплатою й ніколи не продовжується сам. Оберіть 1, 3, 6, 12 або 24 місяці та тариф на 20, 40 або 120 запитів на хвилину. Довші періоди дешевші на 10, 20, 30 або 40 відсотків, а кожен тариф містить усі дані. Суми дивіться на сторінці [ціни](https://amodb.dev/uk/pricing/).

## Запитання й відповіді

### Чи безкоштовний TVmaze API?

TVmaze пропонує безкоштовний публічний API з лімітами за IP-адресою, а його дані діють за ліцензією з атрибуцією. Актуальні ліміти й текст ліцензії дивіться в їхній документації. amodb платний і не має безкоштовного тарифу.

### Чи охоплює amodb і фільми, і серіали?

Так. Фільми, серіали, сезони, епізоди та персони доступні з тим самим ключем і базовим URL. TVmaze охоплює лише серіали, тож для сторінки фільму в застосунку знадобиться друге джерело.

### Як зіставити шоу TVmaze з id amodb?

Записи шоу TVmaze містять id для інших баз, як-от IMDb (точні поля дивіться в їхній документації). Викличте ендпоінт find з id IMDb і external_source=imdb_id, а потім збережіть id з tv_results.

### Чому важливий ліміт за IP?

Ліміт, прив'язаний до IP-адреси, ділять усі, хто за нею стоїть, наприклад пул серверів або офісна мережа. amodb рахує запити за ключем у ковзному вікні на 60 секунд, звідки б не надходили виклики.

### Чи можна показати дату наступного епізоду шоу?

Так. Деталі серіалу повертають next_episode_to_air з air_date, season_number і episode_number або null, якщо нічого не заплановано. Edge кешує деталі на 6 годин, тож оновлюйте їх кілька разів на день.

## Пов'язані сторінки

- [API серіалів з даними про сезони та серії](https://amodb.dev/uk/tv-show-api/): API серіалів зі статусом, телемережами, сезонами, серіями та next_episode_to_air. JSON, сумісний із TMDB v3, 14 мовами, від 20 запитів на хвилину.
- [API довідника серій](https://amodb.dev/uk/episode-guide-api/): API довідника серій на ендпоінтах сезонів і серій TMDB v3: назви, дати виходу, тривалість, кадри та списки груп серій для будь-якого серіалу, 14 мов.
- [API сезонів і серій серіалів](https://amodb.dev/uk/tv-seasons-episodes/): API сезонів і серій серіалів з тими самими шляхами та JSON, що в TMDB v3. Читайте сезон з усіма серіями або одну серію з датою виходу, тривалістю та кадром.
- [Пошук за зовнішнім ID](https://amodb.dev/uk/find-by-external-id/): Знайдіть фільм, серіал чи персону за id IMDb, TVDB, Wikidata або Kinopoisk через find TMDB, а також прочитайте зовнішні id і факти Wikidata про проєкт.
- [Ліміти запитів](https://amodb.dev/uk/rate-limits/): amodb обмежує кожен ключ запитами на хвилину в ковзному вікні 60 секунд: 20, 40 або 120 за тарифом. Читайте заголовки ліміту й обробляйте 429 із Retry-After.
- [Ціни](https://amodb.dev/uk/pricing/): Тарифи amodb різняться лише запитами на хвилину: 20, 40 або 120. Кожен дає всі дані, сумісні з TMDB v3 та OMDb. Передплата, без поновлення й пробного періоду.

Оновлено: 2026-10-18. Source: https://amodb.dev/uk/tvmaze-api-alternative/
