Promítací časy v kinech

GET /3/movie/{movie_id}/showtimes?country=RU vrací kina, která film promítají v jedné zemi, s datovanými časy promítání u každého. Bez country vrací jen počty podle zemí v seznamu countries. Pokrytí se liší podle země a titulu a prázdné pole results znamená, že pro danou dvojici nic není známo.

Aktualizováno Zobrazit jako Markdown

Získání promítacích časů filmu

GET /3/movie/{movie_id}/showtimes?country=RU vrací kina, která film promítají v jedné zemi, s datovanými časy promítání u každého. Parametr country přijímá dvoupísmenný kód, velkými i malými písmeny. Pokrytí se liší podle země a titulu, takže data jsou přítomna tam, kde jsou známa, a chybí tam, kde ne. Vracejí se jen dny od dneška.

Ukázka si vyžádá Fight Club v Rusku a zvládne prázdnou odpověď.

bashjspyphpgo
curl -sf "https://api.amodb.dev/3/movie/550/showtimes?country=RU" \
  -H "Authorization: Bearer $AMODB_KEY"
const url = 'https://api.amodb.dev/3/movie/550/showtimes?country=RU';
const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.AMODB_KEY}` } });
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
const data = await res.json();
if (data.results.length === 0) console.log('no showtimes known');
for (const venue of data.results) {
  for (const s of venue.showtimes) {
    console.log(venue.name, venue.city, s.start, s.formats.join(','), s.booking_url);
  }
}
import os
import requests

r = requests.get(
    "https://api.amodb.dev/3/movie/550/showtimes",
    params={"country": "RU"},
    headers={"Authorization": f"Bearer {os.environ['AMODB_KEY']}"},
    timeout=10,
)
r.raise_for_status()
results = r.json()["results"]
if not results:
    print("no showtimes known")
for venue in results:
    for s in venue["showtimes"]:
        print(venue["name"], venue["city"], s["start"], ",".join(s["formats"]))
<?php
$url = 'https://api.amodb.dev/3/movie/550/showtimes?country=RU';
$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('AMODB_KEY')],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status !== 200) {
    throw new RuntimeException("amodb returned $status");
}
$results = json_decode($body, true)['results'];
if (!$results) {
    echo 'no showtimes known', PHP_EOL;
}
foreach ($results as $venue) {
    foreach ($venue['showtimes'] as $s) {
        echo $venue['name'], ' ', $s['start'], ' ', implode(',', $s['formats']), PHP_EOL;
    }
}
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"os"
	"strings"
	"time"
)

type Venue struct {
	Name      string `json:"name"`
	City      string `json:"city"`
	Showtimes []struct {
		Start      string   `json:"start"`
		Formats    []string `json:"formats"`
		BookingURL string   `json:"booking_url"`
	} `json:"showtimes"`
}

func main() {
	url := "https://api.amodb.dev/3/movie/550/showtimes?country=RU"
	req, _ := http.NewRequest("GET", url, nil)
	req.Header.Set("Authorization", "Bearer "+os.Getenv("AMODB_KEY"))
	client := &http.Client{Timeout: 10 * time.Second}
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	if res.StatusCode != http.StatusOK {
		panic(res.Status)
	}
	var body struct {
		Results []Venue `json:"results"`
	}
	if err := json.NewDecoder(res.Body).Decode(&body); err != nil {
		panic(err)
	}
	if len(body.Results) == 0 {
		fmt.Println("no showtimes known")
	}
	for _, v := range body.Results {
		for _, s := range v.Showtimes {
			fmt.Println(v.Name, v.City, s.Start, strings.Join(s.Formats, ","))
		}
	}
}

Parametry

  • movie_idpathpovinný
    Číselné ID filmu, například 550.
  • countryquery
    Dvoupísmenný kód země, například RU. Bez něj dostanete jen souhrn podle zemí. region je alias.
  • api_keyqueryjeden ze dvou
    Váš klíč. Použijte jej, nebo hlavičku Authorization: Bearer.

Pole odpovědi

PoleTypPoznámky
idintegerID filmu.
countrystring nebo nullKód velkými písmeny, o který jste požádali, nebo null, když country chybí nebo nemá dvě písmena.
resultsarrayJeden objekt na kino, řazeno podle kina. Prázdné, když nic není známo nebo nebyla odeslána země. Celkem nejvýše 1500 promítání.
results[].idintegerID kina.
results[].namestringNázev kina.
results[].chainobjectkey je klíč řetězce, name je název řetězce nebo null.
results[].citystring nebo nullMěsto.
results[].regionstring nebo nullRegion.
results[].addressstring nebo nullUlice a číslo.
results[].postal_codestring nebo nullPSČ.
results[].countrystringKód země kina.
results[].timezonestring nebo nullČasové pásmo IANA, například Europe/Moscow.
results[].latitude, results[].longitudenumber nebo nullPoloha kina.
results[].phonestring nebo nullTelefonní číslo.
results[].urlstring nebo nullStránka kina.
results[].showtimesarrayPromítání v daném kině, řazeno podle začátku.
results[].showtimes[].datestringDen jako 2026-10-18.
results[].showtimes[].startstringZačátek v místním čase kina, například 2026-10-18T21:40, bez posunu UTC.
results[].showtimes[].endstring nebo nullKonec v místním čase kina.
results[].showtimes[].auditoriumstring nebo nullNázev sálu.
results[].showtimes[].formatsarray of stringsFormáty, například 2D.
results[].showtimes[].tagsarray of stringsDalší štítky. Často prázdné.
results[].showtimes[].audio, subtitles, languagestring nebo nullPodrobnosti o zvuku, titulcích a jazyku, když jsou známé.
results[].showtimes[].pricenumber nebo nullCena vstupenky.
results[].showtimes[].currencystring nebo nullMěna price.
results[].showtimes[].pricesany nebo nullPodrobnosti o cenách, když kino má několik.
results[].showtimes[].booking_urlstring nebo nullOdkaz na rezervaci místa.
results[].showtimes[].sold_outbooleantrue, když je promítání vyprodané.
countriesarraySouhrn podle zemí, viz níže.

Klíče, které používáte, čtěte podle názvu a přebytečné klíče uvnitř objektu kina nebo promítání přeskočte. Mnoho polí je dnes null, protože ne každé kino je posílá.

Příklad odpovědi

JSON
{
  "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"
    }
  ]
}

Seznam je zkrácen na 1 ze 2 kin a 2 ze 4 promítání. Promítání existují jen pro dny, které ještě nepominuly, takže se tato odpověď mění každý den.

Získání souhrnu podle zemí

Vynechte country a odpověď obsahuje jen počty. results zůstane prázdné a country je null. Pole countries uvádí až 60 zemí, které mají ještě nějaké promítání, na prvním místě tu s nejvíce promítáními. Použijte je, abyste zjistili, kde se titul promítá, než si vyžádáte kina.

curl
curl -sf "https://api.amodb.dev/3/movie/550/showtimes" \
  -H "Authorization: Bearer $AMODB_KEY"
JSON
{
  "id": 550,
  "country": null,
  "results": [],
  "countries": [
    {
      "country": "RU",
      "name": "Russia",
      "venues": 2,
      "cities": 1,
      "showtimes": 7,
      "first_day": "2026-10-18",
      "last_day": "2026-10-21"
    }
  ]
}
PoleTypPoznámky
countries[].countrystringDvoupísmenný kód, připravený k použití jako parametr country.
countries[].namestringAnglický název země.
countries[].venuesintegerKina s promítáním.
countries[].citiesintegerMěsta s promítáním.
countries[].showtimesintegerPromítání od dneška.
countries[].first_day, countries[].last_daystringPrvní a poslední den s promítáním.

Kód země bez dat, například country=US pro tento film, odpoví country jako US, prázdným results a stejným seznamem countries. Titul bez promítání kdekoli, například seriál 1396, má "countries": [].

Přidání promítacích časů k volání detailů

append_to_response=showtimes sloučí stejný blok do odpovědi detailů pod klíčem showtimes. Kód country pošlete ve stejném požadavku. Blok si ponechává vlastní klíče id, country, results a countries.

PožadavekVýsledek
/3/movie/550?append_to_response=showtimes&country=RUZáznam filmu plus blok showtimes pro Rusko
/3/movie/550?append_to_response=credits,showtimes&country=RUPřidá do stejného volání obsazení

Počítá se jako jeden požadavek, takže stránka filmu, která zobrazuje obsazení i promítání, potřebuje jediné volání. Stejný endpoint existuje pro seriály jako GET /3/tv/{tv_id}/showtimes.

Kombinace s now_playing a region

Seznam now playing dává tituly. Endpoint promítacích časů dává promítání jednoho titulu. Spojte je ve svém kódu.

KrokPožadavekVýsledek
1GET /3/movie/now_playing?region=RU&page=1Až 20 filmů na stránku, cache 30 minut
2GET /3/movie/{id}/showtimes?country=RU pro každé IDKina a časy, kde jsou známé

Smyčka níže jednou nebo dvakrát opakuje pokus, když je dosažen limit tarifu, a čeká počet sekund z Retry-After.

JavaScript
const base = 'https://api.amodb.dev/3';
const headers = { Authorization: `Bearer ${process.env.AMODB_KEY}` };

async function get(path, retries = 2) {
  const res = await fetch(base + path, { headers });
  if (res.status === 429 && retries > 0) {
    const wait = Number(res.headers.get('Retry-After') ?? 60);
    await new Promise((resolve) => setTimeout(resolve, wait * 1000));
    return get(path, retries - 1);
  }
  if (!res.ok) throw new Error(`amodb returned ${res.status} for ${path}`);
  return res.json();
}

const playing = await get('/movie/now_playing?region=RU&page=1');
for (const movie of playing.results) {
  const data = await get(`/movie/${movie.id}/showtimes?country=RU`);
  if (data.results.length > 0) console.log(movie.title, data.results.length, 'venues');
}

Stránka s 20 tituly je 20 požadavků na promítací časy. V tarifu s 20 požadavky za minutu to spotřebuje celé okno, výsledek proto cachujte u sebe. Parametry seznamu viz trendy a seznamy.

Chyby

Tělo chyby se řídí TMDB: success, status_code a status_message. Špatný klíč ukazuje status_code 7.

HTTPstatus_codeKdy
4017Klíč chybí nebo je nesprávný.
40236Platnost tarifu skončila.
40434Film s tímto ID neexistuje.
42925Překročen počet požadavků za minutu. Počkejte tolik sekund, kolik říká Retry-After.

Žádné promítací časy nejsou chyba: počítejte se stavem 200 a prázdným polem results. Chybějící nebo neplatné country také není chyba. Viz chyby a limity požadavků.

Praktické poznámky

  • Pokrytí se liší podle země a titulu. Prázdné pole results berte jako neznámé, ne jako nepromítá se.
  • Zobrazte start přesně tak, jak přišlo. Je to místní čas kina bez posunu UTC a hodiny kina jsou to, co návštěvníci očekávají.
  • Promítací časy se na edge cachují 30 minut. Nevyžadujte je při každém zobrazení stránky a vlastní cache držte krátkou.
  • Jeden seznam now playing znovu použijte pro všechny návštěvníky v regionu. Na edge se také cachuje 30 minut.
  • Použijte booking_url k odeslání návštěvníka na rezervační stránku kina. Je null, když kino odkaz neposkytuje.
  • Přehled případu užití viz API promítacích časů kin a další data filmu viz filmy.