Pobieranie seansów filmu
GET / zwraca kina, które grają jeden film w jednym kraju, każde z listą seansów. country to dwuliterowy kod. Bez niego results pozostaje puste i dostajesz tylko liczby według krajów. Pokrycie zależy od kraju i tytułu, a pusta tablica results oznacza, że dla tej pary nic nie wiadomo.
Dostajesz nazwę kina, sieć, adres i strefę czasową, a dla każdego seansu godzinę rozpoczęcia, salę, formaty, etykiety i link do rezerwacji, jeśli są znane. Zwracane są tylko seanse od dziś. Odpowiedź opisuje seanse. To nie jest usługa sprzedaży biletów.
Jakie dane dostajesz
| Endpoint | Zwraca |
|---|---|
GET / | Kina i seanse jednego filmu w country albo, bez niego, liczby według krajów |
GET / | Filmy aktualnie w kinach, zawężone przez region |
GET / z append_ | Szczegóły plus seanse w jednym żądaniu, zobacz seanse |
Pola w odpowiedzi z seansami:
| Pole | Typ | Znaczenie |
|---|---|---|
id | integer | ID filmu |
country | string lub null | Dwuliterowy kod, o który prosisz, null, gdy żaden nie był poprawny |
results | array | Jedna pozycja na kino, puste, gdy nic nie wiadomo lub brakuje country |
countries | array | Liczby według krajów: country, name, venues, cities, showtimes, first_day, last_day |
results[].id, name, city, address | integer, string | ID kina, nazwa, miasto i adres ulicy |
results[].chain | object lub null | key i name sieci kin |
results[].timezone | string lub null | Strefa IANA kina, na przykład Europe/Moscow |
results[].latitude, longitude | number lub null | Pozycja, gdy znana |
results[].region, postal_code, phone, url | string lub null | Dalsze dane kina, często null |
results[].showtimes | array | Seanse w tym kinie |
showtimes[].date | string | Lokalny dzień, na przykład 2026-10-18 |
showtimes[].start | string | Lokalna godzina rozpoczęcia, na przykład 2026-10-18T21:40, bez przesunięcia |
showtimes[].auditorium | string lub null | Nazwa lub numer sali |
showtimes[].formats | array | Formaty seansu, na przykład 2D, IMAX lub Dolby Atmos |
showtimes[].tags | array | Dodatkowe etykiety, na przykład Reserved Seating |
showtimes[].booking_ | string lub null | Link do zakupu biletu, gdy znany |
showtimes[].sold_out | boolean | true, gdy źródło oznacza seans jako wyprzedany |
showtimes[].end, audio, subtitles, language, price, currency, prices | różne, często null | Wypełnione tylko wtedy, gdy źródło kina je podaje |
Odpowiedź zawiera najwyżej 1 500 seansów, uporządkowanych według kina, a potem godziny rozpoczęcia.
Start w 3 krokach
- Otwórz cennik i wybierz plan. Seanse są w każdym planie.
- Utwórz klucz w panelu konta.
- Wywołaj
/z kodem3/ movie/ {movie_ id}/ showtimes countryi przekaż klucz wapi_keyalbo w nagłówku Bearer.
Przykładowe żądanie
Przykład w bashu czyta seanse filmu Fight Club (ID 550) w Rosji, gdzie amodb ma dziś seanse tego filmu. Przykład w JS bierze pierwsze pięć filmów z rosyjskiej listy now_playing i wypisuje do trzech seansów na kino albo notatkę, gdy żadne nie są znane.
curl -s "https://api.amodb.dev/3/movie/550/showtimes?country=RU" \
-H "Authorization: Bearer $AMODB_KEY"const BASE = 'https://api.amodb.dev/3';
const headers = { Authorization: `Bearer ${process.env.AMODB_KEY}` };
async function get(path, params = {}) {
const res = await fetch(`${BASE}${path}?${new URLSearchParams(params)}`, { headers });
if (!res.ok) throw new Error(`amodb returned ${res.status} for ${path}`);
return res.json();
}
const country = 'RU';
const playing = await get('/movie/now_playing', { region: country, page: 1 });
for (const movie of playing.results.slice(0, 5)) {
const { results } = await get(`/movie/${movie.id}/showtimes`, { country });
if (results.length === 0) {
console.log(`${movie.title}: no showtimes known`);
continue;
}
for (const cinema of results) {
const times = cinema.showtimes
.slice(0, 3)
.map((s) => `${s.start.slice(5, 10)} ${s.start.slice(11, 16)} ${s.formats.join('/')}`)
.join(', ');
console.log(`${movie.title} at ${cinema.name}, ${cinema.city}: ${times}`);
}
}Przycięta odpowiedź dla country=RU: pierwsze kino z 2 swoimi seansami.
{
"id": 550,
"country": "RU",
"results": [
{
"id": 1114,
"name": "Мираж Синема НА БОЛЬШОМ",
"chain": {
"key": "mirage-ru",
"name": "Мираж Синема"
},
"city": "Санкт-Петербург",
"region": null,
"address": "Большой пр. П.С., д. 35А",
"postal_code": null,
"country": "RU",
"timezone": "Europe/Moscow",
"latitude": null,
"longitude": null,
"phone": null,
"url": "https://www.mirage.ru/spb/cinema/1/",
"showtimes": [
{
"date": "2026-10-18",
"start": "2026-10-18T21:40",
"end": null,
"auditorium": null,
"formats": [
"2D"
],
"tags": [],
"audio": null,
"subtitles": null,
"language": null,
"price": null,
"currency": null,
"prices": null,
"booking_url": "https://www.mirage.ru/ticket_new/aca7b114-d587-4fc5-9df6-28568e8fa9b3/",
"sold_out": false
},
{
"date": "2026-10-19",
"start": "2026-10-19T22:20",
"end": null,
"auditorium": "Зал №4",
"formats": [
"2D"
],
"tags": [],
"audio": null,
"subtitles": null,
"language": null,
"price": null,
"currency": null,
"prices": null,
"booking_url": "https://www.mirage.ru/ticket_new/0c32e190-890a-4c81-a754-3300fefc4d5e/",
"sold_out": false
}
]
}
],
"countries": [
{
"country": "RU",
"name": "Russia",
"venues": 2,
"cities": 1,
"showtimes": 7,
"first_day": "2026-10-18",
"last_day": "2026-10-21"
}
]
}Pokrycie i puste wyniki
Dane kin nie są dostępne dla każdego kraju ani tytułu. Zaplanuj interfejs z tym na uwadze.
| Sytuacja | Co widzisz | Co zrobić |
|---|---|---|
| Seanse są znane | results ma jedną pozycję na kino | Pokaż listę |
| Dla tego kraju i tytułu nic nie wiadomo | results to pusta tablica, countries wskazuje, gdzie dane istnieją | Pokaż neutralną notatkę, nie pustą tabelę |
Nie wysłano country | results jest puste, country to null, countries ma liczby | Pozwól użytkownikowi wybrać z countries |
| Nieznane ID filmu | 404 z status_code 34 | Sprawdź ID |
| Przekroczony limit | 429 z status_code 25 | Poczekaj tyle sekund, ile podaje Retry-After |
Pusta tablica to nie błąd i nie twierdzenie, że filmu nie ma w kinach. Oznacza, że dane o seansach nie są znane. Pełny format treści odpowiedzi opisuje strona błędy.
Budowanie strony repertuaru bieżących premier
Połącz dwa endpointy. Lista mówi, które filmy są aktualne, a seanse uzupełniają godziny.
| Krok | Żądanie | Uwagi |
|---|---|---|
| 1 | GET / | Do 20 filmów na stronę, w cache przez 30 minut |
| 2 | GET / | Jedno wywołanie na film, w cache przez 30 minut |
| 3 | Filtruj w swoim kodzie | Według city, formats lub tags |
Jedna strona z 20 filmami kosztuje 21 żądań. Odpowiedź dla dużej premiery może mieć kilkaset kilobajtów, bo zawiera do 1 500 seansów. W planie z 20 żądaniami na minutę to cały minutowy budżet, więc pobieraj dane w zadaniu w tle, a odwiedzającym serwuj zapisaną kopię. Plany z 40 i 120 żądaniami na minutę obsłużą to samo zadanie z zapasem. Okno i nagłówki opisują limity żądań, a inne endpointy list trendy i listy.
Utrzymuj kopię w aktualnym stanie
Seanse zmieniają się z dnia na dzień, inaczej niż szczegóły filmu. Zapisuj każdą odpowiedź z ID filmu, krajem i czasem pobrania. Dla większości stron z repertuarem sprawdza się TTL od 30 minut do kilku godzin, a seanse, które już się zaczęły, można ukryć, porównując start z bieżącym czasem w timezone kina. Ponieważ start nie ma przesunięcia, nie przesuwaj go do strefy czasowej odwiedzającego.
Jak wypada w porównaniu
| Możliwość | Scraping stron kin | API metadanych bez seansów | amodb |
|---|---|---|---|
| Konfiguracja | Jeden scraper na stronę kina | Niedostępne | Jeden endpoint, jeden kształt JSON |
| Dopasowanie do ID filmu | Dopasowanie po tekście tytułu | Niedostępne | ID filmu w ścieżce |
| Pokrycie | Cokolwiek uda się zescrapować | Brak | Zależy od kraju i tytułu, pusta tablica, gdy nic nie wiadomo |
| Formaty i rezerwacja | Parsować etykiety i linki | Niedostępne | Pola formats, tags i booking_url |
| Utrzymanie | Psuje się, gdy strona się zmienia | Brak | Jeden kształt JSON dla każdego kraju |
Cennik
Plany przedpłacone trwają 1, 3, 6, 12 lub 24 miesiące, a za dłuższe jest zniżka 0, 10, 20, 30 lub 40 procent. Nic nie odnawia się automatycznie. Plany dopuszczają 20, 40 i 120 żądań na minutę i każdy zawiera seanse razem ze wszystkimi innymi danymi. Strona z repertuarem odświeżana co 30 minut dla kilku krajów mieści się w najmniejszym limicie. Nie ma darmowego planu. Wybierz plan na stronie cennik.