{"openapi":"3.1.0","info":{"title":"API Cinéma","termsOfService":"https://api-cinema.com/en/terms","version":"v1 (0.1.0)","description":"Les séances de cinéma en France et aux États-Unis (filtre `country`). Authentification par clé d’API (`Authorization: Bearer ac_live_…`), créée depuis le tableau de bord. Les heures sont des heures locales, dans le fuseau de chaque cinéma (`cinema.timezone`).\n\nTitres, synopsis, genres et identifiants TMDB des films viennent de [TMDB](https://www.themoviedb.org) une fois le film rapproché (`tmdbId` renseigné) ; `rawTitle` garde le titre tel que publié par le cinéma. *Ce produit utilise l’API TMDB mais n’est ni approuvé ni certifié par TMDB.*\n\nL’usage de l’API est soumis aux [conditions d’utilisation](https://api-cinema.com/fr/terms) : un compte par client, clés d’API gardées côté serveur, pas de revente ni de redistribution en masse des données, pas de contournement des quotas.\n\n## Exemples\n\nChaque appel demande votre clé d’API. Les listes sont paginées (`limit`, `cursor`), et sans `date` ni `from` les séances partent de maintenant, à l’heure locale de chaque cinéma.\n\n### Toutes les séances d’un film en France, à partir de son identifiant Allociné ou TMDB\n\nL’identifiant Allociné est le nombre dans l’URL de la fiche du film (`allocine.fr/film/fichefilm_gen_cfilm=1000013045.html` pour *L’Odyssée*) ; l’identifiant TMDB est celui de `themoviedb.org/movie/1368337`. Inutile de connaître notre identifiant de film :\n\n```bash\ncurl \"https://api.api-cinema.com/v1/showtimes?allocine_id=1000013045&country=FR&limit=100\" -H \"Authorization: Bearer ac_live_…\"\ncurl \"https://api.api-cinema.com/v1/showtimes?tmdb_id=1368337&country=FR&limit=100\" -H \"Authorization: Bearer ac_live_…\"\n```\n\nPour obtenir nos identifiants de film (pour `/v1/movies/{id}`), cherchez le film avec les mêmes identifiants :\n\n```bash\ncurl \"https://api.api-cinema.com/v1/movies?allocine_id=1000013045\" -H \"Authorization: Bearer ac_live_…\"\n# → deux lignes, une par pays, même tmdbId 1368337 :\n#   { \"id\": \"065ec55d-…\", \"title\": \"L'Odyssée\", \"allocineId\": \"1000013045\", \"tmdbId\": 1368337 }\n#   { \"id\": \"e125e88f-…\", \"title\": \"The Odyssey\", \"allocineId\": null, \"tmdbId\": 1368337 }\n```\n\n### Toutes les séances d’un film, à partir de son nom\n\nPas d’identifiant Allociné ou TMDB sous la main ? Cherchez d’abord le film par son nom, puis lisez ses séances :\n\n```bash\n# 1. trouver le film parmi ceux à l’affiche en France\ncurl \"https://api.api-cinema.com/v1/movies?q=spider&playing=true&country=FR\" -H \"Authorization: Bearer ac_live_…\"\n# → { \"id\": \"a1…\", \"title\": \"Spider-Man : Brand New Day\", \"rawTitle\": \"SPIDER-MAN : BRAND NEW DAY\", \"tmdbId\": 969681 }\n#   { \"id\": \"b2…\", \"title\": \"Spider-Man : Brand New Day\", \"rawTitle\": \"SPIDERMAN\", \"tmdbId\": 969681 }\n#   { \"id\": \"c3…\", \"title\": \"Spider-Man : New Generation\", \"rawTitle\": \"Spider-Man : New Generation\", \"tmdbId\": 324857 }\n\n# 2. choisir le film, puis toutes ses séances (les deux premières lignes) par son tmdbId\ncurl \"https://api.api-cinema.com/v1/showtimes?tmdb_id=969681&country=FR&limit=100\" -H \"Authorization: Bearer ac_live_…\"\n```\n\nSi le film choisi n’a pas encore de `tmdbId` (`titleSource: \"raw\"`), lisez plutôt les séances de chaque ligne avec `GET /v1/movies/{id}/showtimes`.\n\n**Comment marche la recherche dans le titre (`q`)**\n\n- Votre texte et les titres sont comparés après la même normalisation : minuscules, accents et ponctuation retirés, article initial supprimé (`le`, `la`, `les`, `l'`, `un`, `une`, `des`, `the`, `a`, `an`). `L'Odyssée`, `l odyssee` et `ODYSSEE` sont la même recherche.\n- C’est une recherche *contient* sur le titre **tel que publié par le cinéma** (`rawTitle`), pas sur le titre TMDB ni le titre original : en France, `q=odyssee` trouve *L’Odyssée* mais `q=the odyssey` ne trouve rien (les lignes américaines portent le titre anglais).\n- Les cinémas écrivent les titres à leur façon (`SPIDERMAN`, `SPIDER-MAN : BRAND NEW DAY`) : cherchez un mot court et distinctif (`spider`) plutôt que le titre complet.\n- Plusieurs films peuvent correspondre (`q=odyssee` renvoie aussi *2001 : L’Odyssée de l’espace*), et un même film peut arriver en plusieurs lignes (une par titre publié ou par pays) : choisissez selon `title`, `year` ou `tmdbId`, jamais aveuglément le premier résultat, puis continuez avec `tmdb_id`.\n- Ajoutez `playing=true` pour ne garder que les films avec des séances à venir, et `country` pour rester dans un pays. Les résultats sont triés par titre et paginés (`limit`, `offset`).\n\n### Ce qui passe à New York\n\n`city` compare exactement le nom de la ville (« New York » exclut « Brooklyn ») : cherchez plutôt autour d’un point. Times Square, 5 km :\n\n```bash\ncurl \"https://api.api-cinema.com/v1/showtimes?country=US&near=40.758,-73.9855&radius_km=5&limit=200\" -H \"Authorization: Bearer ac_live_…\"\n```\n\nAjoutez `date=2026-09-25` pour une seule journée ; chaque séance porte `cinema.distanceKm`. Les cinémas eux-mêmes, du plus proche au plus lointain :\n\n```bash\ncurl \"https://api.api-cinema.com/v1/cinemas?country=US&near=40.758,-73.9855&radius_km=5\" -H \"Authorization: Bearer ac_live_…\"\n```\n\n### Ce soir près de chez moi, en VOST\n\nLa même recherche avec un corps JSON (`POST …/search`), plus simple à construire depuis du code :\n\n```js\nconst res = await fetch('https://api.api-cinema.com/v1/showtimes/search', {\n  method: 'POST',\n  headers: { 'Authorization': 'Bearer ac_live_…', 'Content-Type': 'application/json' },\n  body: JSON.stringify({\n    near: { lat: 45.764, lng: 4.8357, radiusKm: 3 }, // centre de Lyon\n    from: '2026-09-25T18:00', // ce soir, à l’heure locale de chaque cinéma\n    to: '2026-09-25T23:59',\n    version: 'VOST',\n    include: ['movie', 'cinema'],\n    limit: 100,\n  }),\n})\nconst { data } = await res.json()\nfor (const s of data)\n  console.log(s.startsAt.slice(11, 16), s.movie.title, '—', s.cinema.name, `${s.cinema.distanceKm} km`)\n```\n\n### Le programme d’un cinéma pour la semaine\n\nTrouvez le cinéma par son nom, puis lisez ses séances (le chemin accepte son `id` ou son `slug`) :\n\n```bash\ncurl \"https://api.api-cinema.com/v1/cinemas?q=champo&country=FR\" -H \"Authorization: Bearer ac_live_…\"\n# → { \"id\": \"cnc_8422\", \"slug\": \"le-champo-paris-5e-arrondissement\", \"name\": \"Le Champo\", … }\ncurl \"https://api.api-cinema.com/v1/cinemas/le-champo-paris-5e-arrondissement/showtimes?from=2026-09-24&to=2026-09-30\" -H \"Authorization: Bearer ac_live_…\"\n```\n\nSans `from` / `to`, les séances d’un cinéma sont celles du jour. Les séances passées sont gardées 7 jours.\n\nPour choisir parmi les cinémas d’un code postal (ou d’un ZIP code aux États-Unis), passez `zip_code` ; ses premiers chiffres suffisent, `zip_code=69` liste tout un département :\n\n```bash\ncurl \"https://api.api-cinema.com/v1/cinemas?zip_code=75005\" -H \"Authorization: Bearer ac_live_…\"\n```\n\n### Les films à l’affiche dans un pays\n\n```bash\ncurl \"https://api.api-cinema.com/v1/movies?playing=true&country=FR&limit=100\" -H \"Authorization: Bearer ac_live_…\"\ncurl \"https://api.api-cinema.com/v1/movies?q=odyssey&playing=true&country=US\" -H \"Authorization: Bearer ac_live_…\"\n```\n\nRegroupez les films par `tmdbId` : un même film a un `id` par pays, et un par titre publié tant qu’il n’est pas rapproché sur TMDB.\n\n### Tenir une copie locale à jour\n\nImportez tout une fois, puis ne récupérez que les changements avec `updated_since` : voir *Synchronisation incrémentale* plus bas.\n\n## Nouveautés\n\n### 2026-10-30 — Chercher des cinémas par code postal / ZIP code\n\nNouveau filtre sur `/v1/cinemas` : `zip_code` (`zipCode` dans le corps de `POST /v1/cinemas/search`, et sur l’outil MCP `search_cinemas`). Il garde les cinémas dont le `postalCode` commence par les chiffres donnés, de 2 à 5 : `zip_code=75005` pour un code, `zip_code=75` pour tout un département français, `zip_code=100` pour une plage de ZIP codes américains. Il se combine avec les autres filtres. Les cinémas sans `postalCode` connu sont exclus.\n\n**Ce qu’il faut faire si vous utilisez déjà l’API**\n\n- Rien à faire. Si vous convertissiez un code postal en ville ou en point pour chercher, vous pouvez le passer directement.\n\n### 2026-10-29 — Un compte par client : `403 account_suspended`\n\nQuand un compte est créé depuis une connexion qui en a déjà un, son accès à l’API est suspendu : toute requête répond `403` avec le code `account_suspended`, et le compte reçoit un e-mail. Les conditions d’utilisation autorisent un seul compte par client (article 2) ; le compte créé en premier n’est pas concerné.\n\n**Ce qu’il faut faire si vous utilisez déjà l’API**\n\n- Rien à faire avec un seul compte. Si plusieurs personnes ou sociétés partagent une même connexion (un bureau partagé, par exemple), écrivez à support@api-cinema.com.\n\n### 2026-10-22 — Forfait gratuit : 150 requêtes par semaine, usage non commercial\n\nLe forfait Gratuit passe à 150 requêtes par semaine (au lieu de 250), toutes ses clés d’API confondues, et est réservé aux tests et aux projets non commerciaux (conditions d’utilisation, article 4). Un site ou une application qui génère des revenus ou sert une entreprise, y compris le site d’un cinéma, nécessite un forfait payant (Starter, 12 € par mois, 10 000 requêtes par semaine). Les forfaits payants et les comptes sur devis ne changent pas.\n\n**Ce qu’il faut faire si vous utilisez déjà l’API**\n\n- Si vous êtes sur le forfait Gratuit, vérifiez votre consommation hebdomadaire dans le tableau de bord : au-delà de 150 requêtes, l’API répond `429` avec `weekly_quota_exceeded` jusqu’au lundi 00:00 UTC.\n- Si votre usage est commercial, passez à un forfait payant depuis le tableau de bord.\n\n### 2026-10-22 — `city=Paris` trouve tous les arrondissements\n\nLes cinémas parisiens sont classés par arrondissement (`\"city\": \"Paris 5e Arrondissement\"`), donc `city=Paris` ne renvoyait rien. Le filtre couvre désormais Paris et tous ses arrondissements, sur `/v1/cinemas`, `/v1/showtimes` et leurs variantes `search` ; un arrondissement seul (`city=Paris 5e Arrondissement`) marche toujours. Les autres villes gardent une comparaison exacte.\n\n**Ce qu’il faut faire si vous utilisez déjà l’API**\n\n- Si vous contourniez le problème en listant les arrondissements ou en cherchant autour d’un point, vous pouvez passer à `city=Paris`.\n\n### 2026-10-19 — Une semaine de séances passées\n\nLes séances passées sont désormais gardées 7 jours : un `date` ou un `from` antérieur à une semaine ne renvoie rien pour les jours d’avant. Les séances à venir et la synchronisation `updated_since` ne changent pas ; les séances passées disparaissent simplement après une semaine, sans entrée de retrait.\n\n**Ce qu’il faut faire si vous utilisez déjà l’API**\n\n- Si vous avez besoin d’un historique plus long, enregistrez les séances de votre côté au fil de vos imports.\n\n### 2026-09-27 — Réponses plus rapides, nouvelle base de données\n\nL’API tourne maintenant sur une nouvelle base de données. Les requêtes lourdes sont bien plus rapides (films à l’affiche dans un pays, toutes les séances d’un film : de 2 à 7 fois), les autres aussi rapides ou plus. Les réponses ne changent pas, avec deux petites améliorations : la recherche `q` ignore désormais aussi la casse des lettres accentuées (un nom accentué en majuscules trouve son écriture en minuscules), et les films de même titre sont toujours listés dans le même ordre. Une clé d’API révoquée est maintenant refusée dans la minute plutôt qu’immédiatement.\n\n### 2026-09-24 — Conditions d’utilisation\n\nL’API a désormais des conditions d’utilisation publiées, en lien en haut de cette page et dans `info.termsOfService` de l’OpenAPI. Elles formalisent ce qui était déjà attendu : un compte par client, des clés d’API gardées côté serveur et jamais partagées, pas de revente ni de redistribution en masse des données, et pas de contournement des quotas par des clés ou des comptes supplémentaires.\n\n**Ce qu’il faut faire si vous utilisez déjà l’API**\n\n- Vérifiez que vos clés d’API ne servent que côté serveur (jamais dans une page web ou une application mobile).\n- Si vous avez besoin de plus de volume, demandez au support plutôt que d’ajouter des clés ou des comptes.\n\n### 2026-09-24 — Quota hebdomadaire par compte\n\nUn compte peut maintenant avoir un quota de requêtes hebdomadaire (lundi 00:00 UTC → dimanche, toutes ses clés d’API confondues). S’il en a un, les réponses portent `X-Weekly-Quota-Limit`, `X-Weekly-Quota-Remaining` et `X-Weekly-Quota-Reset`, et au-delà du quota l’API répond `429` avec le code `weekly_quota_exceeded`. Rien ne change pour les comptes sans quota hebdomadaire.\n\n**Ce qu’il faut faire si vous utilisez déjà l’API**\n\n- Si vous gérez les réponses `429`, attendez-vous aussi au code `weekly_quota_exceeded` : son `Retry-After` peut durer plusieurs jours.\n\n### 2026-09-23 — Recherche JSON (POST)\n\nChaque liste avec filtres a désormais une jumelle `POST …/search` qui prend ses filtres dans un corps JSON, avec des valeurs typées et des noms en camelCase (`tmdbId`, `near: { lat, lng, radiusKm }`, `include: [\"movie\"]`…) : plus de longues URL à construire. Même réponse, même pagination (`cursor`), même quota ; les clés inconnues sont refusées (400).\n\n| GET (paramètres d’URL) | POST (corps JSON) |\n| --- | --- |\n| `/v1/showtimes` | `/v1/showtimes/search` |\n| `/v1/cinemas` | `/v1/cinemas/search` |\n| `/v1/movies` | `/v1/movies/search` |\n| `/v1/cinemas/{id}/showtimes` | `/v1/cinemas/{id}/showtimes/search` |\n| `/v1/movies/{id}/showtimes` | `/v1/movies/{id}/showtimes/search` |\n\n### 2026-09-23 — Séances par identifiant TMDB ou Allociné\n\n`/v1/showtimes` et `/v1/movies` acceptent `tmdb_id` et `allocine_id` (l’identifiant de `allocine.fr/film/fichefilm_gen_cfilm=<id>.html`) : toutes les séances d’un film, quel que soit le titre publié par chaque cinéma. `allocine_id` trouve aussi les séances lues sur d’autres sources une fois le film rapproché sur TMDB. Les films exposent un nouveau champ `allocineId` (renseigné quand le film a été lu sur Allociné).\n\n### 2026-09-23 — Cinémas aux États-Unis\n\nL’API couvre désormais les cinémas des États-Unis en plus de la France. **Sans paramètre `country`, les listes renvoient les deux pays** : `/v1/cinemas`, `/v1/showtimes`, `/v1/movies` et `/v1/movies/{id}/showtimes` incluent les cinémas et séances américains.\n\n- Nouveau filtre `country` (`FR` ou `US`) sur ces quatre listes, et dans les outils MCP.\n- Nouveaux champs de cinéma : `country` et `timezone` (zone IANA, par exemple `America/New_York`). Aux États-Unis, `region` contient le code de l’État (`NY`) et `postalCode` le ZIP code.\n- `startsAt` reste une heure locale sans décalage, mais c’est désormais **l’heure locale du cinéma** (`cinema.timezone`), et plus toujours Europe/Paris.\n- Sans `date` ni `from`, « maintenant » et « aujourd’hui » sont évalués dans le fuseau de chaque cinéma. `date`, `from` et `to` se lisent à l’heure locale de chaque cinéma.\n- Hors de France, `cncId`, `inseeCode`, `department` et `artEtEssai` valent `null`.\n- Séances américaines : `version` vaut `VO` (version originale) ou `VOST` (sous-titrée), `UNKNOWN` pour une séance doublée.\n- Les films des cinémas américains ont leurs propres lignes, séparées des françaises, avec titre, synopsis et genres TMDB **en anglais**. Un film projeté dans les deux pays a donc un `id` par pays et le même `tmdbId`.\n\n**Ce qu’il faut faire si vous utilisez déjà l’API**\n\n- Pour garder exactement votre périmètre actuel, ajoutez `country=FR` à vos appels de listes (cinémas, séances, films, séances d’un film). Les appels par id (`/v1/cinemas/{id}`, `/v1/movies/{id}`) ne changent pas.\n- Pour convertir `startsAt` en instant (UTC, affichage dans un autre fuseau), utilisez `cinema.timezone` au lieu de supposer Europe/Paris.\n- Si votre code lit `cncId`, `inseeCode`, `department` ou `artEtEssai`, acceptez `null` pour les cinémas hors de France.\n- Si vous regroupez les films, utilisez `tmdbId` plutôt que `id` ou le titre (un `id` par pays).\n- Si vous validez `country` ou `timezone` avec un schéma strict, ajoutez ces deux champs.\n\n## Versions\n\nL’URL porte la version majeure (`/v1/…`) ; le sélecteur en haut de la référence interactive montre la documentation de chaque version, la plus récente par défaut.\n\n- Les **ajouts** (nouvelles routes, nouveaux paramètres facultatifs, nouveaux champs de réponse) arrivent dans toutes les versions maintenues sans changement de version : ignorez les champs que vous ne connaissez pas.\n- Un **changement incompatible** (autre comportement par défaut, champ supprimé ou renommé, validation plus stricte) ouvre une nouvelle version majeure ; votre version actuelle ne change pas.\n- Une version remplacée reste servie au moins 6 mois. Ses réponses portent alors les en-têtes `Deprecation`, `Sunset` (dernier jour de service) et `Link: <…>; rel=\"successor-version\"`.\n\n| Version | Sortie | Statut |\n| --- | --- | --- |\n| `/v1` (cette page) | 2026-09-15 | actuelle |\n\n## Import complet des séances\n\n- Parcourez `GET /v1/showtimes` avec `limit=1000` et `cursor` (le `meta.nextCursor` de la page précédente).\n- `include` choisit les objets embarqués : `movie,cinema` par défaut, `include=movie` ou `include=` (vide) pour des pages bien plus légères. `movieId` et `cinemaId` sont toujours là : chargez films et cinémas une fois, à part.\n- Regroupez un film par `movie.tmdbId` : deux cinémas publiant des titres différents donnent deux `movie.id` pour le même `tmdbId`. `movie.titleSource` vaut `tmdb` ou `raw` ; `GET /v1/movies/unmatched` liste les films à l’affiche encore sans `tmdbId`.\n- `cinema.programmeCheckedAt` est la dernière lecture réussie du programme du cinéma : au-delà de 2 jours, il peut être dépassé.\n- `showtime.id` est stable : une séance garde son id tant que son cinéma, son film, son heure et sa version ne changent pas.\n\n## Recherche JSON\n\nPlutôt qu’une longue URL, envoyez les filtres dans un corps JSON (noms en camelCase, valeurs typées) : chaque liste a sa jumelle `POST …/search` (`/v1/showtimes/search`, `/v1/cinemas/search`, `/v1/movies/search`, `/v1/cinemas/{id}/showtimes/search`, `/v1/movies/{id}/showtimes/search`). Réponse, pagination et quota sont les mêmes qu’avec `GET`.\n\n```js\nconst res = await fetch('https://api.api-cinema.com/v1/showtimes/search', {\n  method: 'POST',\n  headers: { 'Authorization': 'Bearer ac_live_…', 'Content-Type': 'application/json' },\n  body: JSON.stringify({\n    country: 'FR',\n    allocineId: '1000013045',\n    near: { lat: 45.764, lng: 4.8357, radiusKm: 5 },\n    from: '2026-09-25T18:00',\n    to: '2026-09-26',\n    version: 'VOST',\n    include: ['movie'],\n    limit: 100,\n  }),\n})\nconst { data, meta } = await res.json() // page suivante : même corps + cursor: meta.nextCursor\n```\n\n## Synchronisation incrémentale\n\n1. Import complet : parcourez `GET /v1/showtimes` et gardez le `meta.syncedAt` de la **première** page.\n2. Ensuite : `GET /v1/showtimes?updated_since=<syncedAt>` (mêmes filtres `from`/`to`…) ne renvoie que les séances ajoutées, modifiées ou retirées depuis, triées par `updatedAt`, avec le même `cursor`. Gardez à nouveau le `meta.syncedAt` de sa première page.\n3. Une séance avec `removedAt` renseigné n’est plus publiée par le cinéma (annulée ou retirée) : supprimez-la de votre côté. Les listes normales ne renvoient jamais une séance retirée.\n4. `GET /v1/movies?updated_since=…` donne les films modifiés (rapprochement TMDB, titre, synopsis).\n\n`syncedAt` est pris quelques minutes avant la requête : une séance peut arriver deux fois, appliquez les changements par `id`. Les séances retirées sont gardées 30 jours : au-delà sans synchronisation, refaites un import complet.\n\n## Limites de débit\n\nChaque clé d’API a un quota de requêtes par fenêtre de 60 secondes, fixé par son offre. Les fenêtres commencent à chaque minute pleine (hh:mm:00).\n\n| Offre | Requêtes par minute, par clé |\n| --- | --- |\n| Standard | 60 |\n| Pro | 600 |\n\nChaque réponse authentifiée donne le décompte exact de la clé :\n\n```http\nX-RateLimit-Limit: 60\nX-RateLimit-Remaining: 41\nX-RateLimit-Reset: 23\nRateLimit-Policy: \"standard\";q=60;w=60\nRateLimit: \"standard\";r=41;t=23\n```\n\n`X-RateLimit-Remaining` compte la requête en cours ; `X-RateLimit-Reset` est le nombre de secondes avant la fenêtre suivante. Les deux dernières lignes suivent le brouillon IETF *RateLimit header fields*.\n\nAu-delà du quota, l’API répond `429 Too Many Requests` avec `Retry-After` (secondes avant la fenêtre suivante) et `X-RateLimit-Remaining: 0`. Le corps détaille la limite :\n\n```json\n{\n  \"error\": {\n    \"code\": \"rate_limited\",\n    \"message\": \"Rate limit exceeded: 60 requests per 60 s for this API key. Retry in 23 s.\",\n    \"details\": { \"limit\": 60, \"windowSeconds\": 60, \"retryAfterSeconds\": 23, \"plan\": \"standard\" }\n  }\n}\n```\n\nAttendez `Retry-After` avant de réessayer : les requêtes refusées comptent aussi dans la fenêtre. Pour un quota plus élevé, contactez le support depuis le tableau de bord : répartir les requêtes sur plusieurs clés ou comptes pour le contourner enfreint les [conditions d’utilisation](https://api-cinema.com/fr/terms).\n\n### Quota hebdomadaire\n\nCertains comptes ont aussi un quota hebdomadaire, fixé par leur offre : un nombre de requêtes par semaine (lundi 00:00 UTC → dimanche), toutes les clés d’API du compte confondues. Quand votre compte en a un, chaque réponse porte :\n\n```http\nX-Weekly-Quota-Limit: 10000\nX-Weekly-Quota-Remaining: 8412\nX-Weekly-Quota-Reset: 302400\n```\n\n`X-Weekly-Quota-Remaining` compte la requête en cours ; `X-Weekly-Quota-Reset` est le nombre de secondes avant lundi 00:00 UTC. Au-delà du quota, l’API répond `429` avec le code `weekly_quota_exceeded` et un `Retry-After` égal à ce délai ; les requêtes refusées ne comptent pas. Sans quota hebdomadaire, ces en-têtes sont absents.\n\n## Parcourir toutes les séances\n\nLes listes de séances (`/v1/showtimes`, `/v1/cinemas/{id}/showtimes`, `/v1/movies/{id}/showtimes`) acceptent `limit` jusqu’à 1000. Pour tout parcourir, suivez le curseur plutôt qu’`offset` : l’ordre est stable (`startsAt` puis `id`) et chaque page répond aussi vite que la première.\n\n```bash\ncurl \"https://api.api-cinema.com/v1/showtimes?from=2026-09-16&to=2026-09-30&limit=1000\" -H \"Authorization: Bearer ac_live_…\"\n# meta.nextCursor = \"WyIyMDI2LTA5LTE2VDE0OjAwOjAwIiwiLi4uIl0\"\ncurl \"https://api.api-cinema.com/v1/showtimes?from=2026-09-16&to=2026-09-30&limit=1000&cursor=WyIyMDI2LTA5LTE2VDE0OjAwOjAwIiwiLi4uIl0\" -H \"Authorization: Bearer ac_live_…\"\n```\n\nRecommencez avec les mêmes filtres jusqu’à ce que `meta.nextCursor` vaille `null`. `meta.total` n’est calculé que sur la première page (sans curseur). Le curseur ne se combine ni avec `offset` ni avec `near`.\n\n## Serveur MCP\n\nL’API est aussi disponible comme serveur [MCP](https://modelcontextprotocol.io) (Streamable HTTP), pour interroger les séances depuis Claude, Cursor ou tout client compatible. Le serveur prend la même clé d’API que l’API REST ; chaque appel d’outil compte comme une requête et suit la limite de débit de la clé.\n\n**Adresse** : `https://api.api-cinema.com/mcp`\n\n**Claude Code**\n\n```bash\nclaude mcp add --transport http api-cinema https://api.api-cinema.com/mcp --header \"Authorization: Bearer ac_live_…\"\n```\n\n**Claude Desktop, Cursor et clients configurés en JSON**\n\n```json\n{\n  \"mcpServers\": {\n    \"api-cinema\": {\n      \"type\": \"http\",\n      \"url\": \"https://api.api-cinema.com/mcp\",\n      \"headers\": { \"Authorization\": \"Bearer ac_live_…\" }\n    }\n  }\n}\n```\n\n**Outils disponibles** (lecture seule, 20 résultats par défaut)\n\n- `search_showtimes` : Séances de cinéma à venir en France et aux États-Unis, filtrées par pays, par film (movie_id, identifiant TMDB ou Allociné), par ville, par distance autour d’un point, par jour ou plage horaire et par version. Chaque résultat inclut le film et le cinéma.\n- `search_cinemas` : Cinémas en France et aux États-Unis par pays, ville, nom, code postal / ZIP code, ou autour d’un point (triés par distance, avec distanceKm).\n- `get_cinema` : Fiche d’un cinéma (adresse, coordonnées, écrans, site, billetterie) par id ou slug.\n- `cinema_showtimes` : Programme d’un cinéma, par id ou slug. Aujourd’hui par défaut.\n- `search_movies` : Films par titre (sans tenir compte des accents ni de la casse). playing à true pour ne garder que les films avec des séances à venir, et country pour se limiter à un pays.\n- `movie_showtimes` : Séances à venir d’un film, éventuellement dans un pays, une ville ou autour d’un point. Obtenez le movie_id avec search_movies.\n"},"servers":[{"url":"https://api.api-cinema.com"}],"tags":[{"name":"Cinemas","x-displayName":"Cinémas"},{"name":"Showtimes","x-displayName":"Séances"},{"name":"Movies","x-displayName":"Films"},{"name":"Meta","x-displayName":"Méta"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Clé d’API créée depuis le tableau de bord, par exemple `ac_live_…`"}},"schemas":{"CinemaList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Cinema"}},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"Cinema":{"type":"object","properties":{"id":{"type":"string","example":"6b1f…"},"slug":{"type":"string","example":"paris-le-champo"},"name":{"type":"string","example":"Le Champo"},"address":{"type":["string","null"],"example":"51 rue des Écoles"},"city":{"type":"string","example":"Paris"},"country":{"type":"string","enum":["FR","US"],"example":"FR","description":"ISO 3166-1 alpha-2"},"timezone":{"type":"string","example":"Europe/Paris","description":"Fuseau horaire IANA du cinéma : le `startsAt` de ses séances est une heure locale de ce fuseau"},"postalCode":{"type":["string","null"],"example":"75005","description":"Code postal (FR) ou ZIP code (US)"},"inseeCode":{"type":["string","null"],"example":"75105","description":"France uniquement : code INSEE de la commune (CNC) ; renseigné même quand `postalCode` manque"},"department":{"type":["string","null"],"example":"75","description":"France uniquement : code du département (CNC)"},"region":{"type":["string","null"],"example":"Île-de-France","description":"Région (FR) ou code de l’État, par exemple \"NY\" (US)"},"lat":{"type":["number","null"],"example":48.8497},"lng":{"type":["number","null"],"example":2.3437},"website":{"type":["string","null"],"example":"https://www.lechampo.com"},"cncId":{"type":["integer","null"],"example":188341,"description":"France uniquement : identifiant CNC de l’établissement"},"screens":{"type":["integer","null"],"example":3},"seats":{"type":["integer","null"],"example":589},"artEtEssai":{"type":["boolean","null"],"example":true,"description":"France uniquement : classé « Art et Essai »"},"ticketingUrl":{"type":["string","null"],"example":"https://www.lechampo.com/billetterie"},"phone":{"type":["string","null"],"example":"+33 1 43 54 51 60"},"email":{"type":["string","null"],"example":"contact@lechampo.com"},"active":{"type":"boolean"},"programmeCheckedAt":{"type":["string","null"],"example":"2026-09-16T12:15:03.000Z","description":"Dernière lecture réussie du programme du cinéma (ISO 8601, UTC) ; null s’il n’a jamais été lu. Un programme lu il y a plus de 2 jours peut être dépassé"},"distanceKm":{"type":"number","description":"Présent uniquement avec `near`","example":1.2}},"required":["id","slug","name","address","city","country","timezone","postalCode","inseeCode","department","region","lat","lng","website","cncId","screens","seats","artEtEssai","ticketingUrl","phone","email","active","programmeCheckedAt"]},"Meta":{"type":"object","properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"total":{"type":"integer"}},"required":["limit","offset"]},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"not_found"},"message":{"type":"string","example":"Cinema not found"},"details":{}},"required":["code","message"]}},"required":["error"]},"CinemaSearch":{"type":"object","properties":{"country":{"type":"string","enum":["FR","US"],"description":"Facultatif. Uniquement les cinémas de ce pays. Par défaut : tous les pays.","example":"FR"},"city":{"type":"string","minLength":1,"description":"Facultatif. Nom exact de la commune ; `Paris` inclut aussi ses arrondissements.","example":"Lyon"},"q":{"type":"string","minLength":1,"description":"Facultatif. Le nom contient.","example":"champo"},"zipCode":{"type":"string","pattern":"^\\d{2,5}$","description":"Facultatif. Le code postal (FR) ou ZIP code (US) commence par : `75005` pour un code, `75` pour tout un département français, `100` pour une plage de ZIP codes américains. 2 à 5 chiffres.","example":"69002"},"active":{"type":"boolean","default":true,"description":"Facultatif. Cinémas ouverts (par défaut) ou fermés."},"near":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"radiusKm":{"type":"number","exclusiveMinimum":0,"maximum":100,"default":10}},"required":["lat","lng"],"additionalProperties":false,"description":"Facultatif. Point central et rayon (10 km par défaut) ; les résultats portent `distanceKm`.","example":{"lat":45.764,"lng":4.8357,"radiusKm":5}},"limit":{"type":"integer","minimum":1,"maximum":200,"default":50,"example":50,"description":"Facultatif."},"offset":{"type":"integer","minimum":0,"default":0,"example":0,"description":"Facultatif."}},"additionalProperties":false,"example":{"country":"FR","near":{"lat":48.8566,"lng":2.3522,"radiusKm":3}}},"ShowtimeList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Showtime"}},"meta":{"$ref":"#/components/schemas/ShowtimeMeta"}},"required":["data","meta"]},"Showtime":{"type":"object","properties":{"id":{"type":"string"},"cinemaId":{"type":"string","description":"Toujours présent, même quand `include` omet `cinema`"},"movieId":{"type":"string","description":"Toujours présent, même quand `include` omet `movie`"},"startsAt":{"type":"string","description":"Date et heure locales dans le fuseau du cinéma (`cinema.timezone`), sans décalage","example":"2026-09-15T20:30:00"},"version":{"type":"string","enum":["VF","VO","VOST","VFST","UNKNOWN"],"example":"VOST"},"format":{"type":"string","enum":["2D","3D","IMAX","4DX","DOLBY","UNKNOWN"],"example":"2D"},"room":{"type":["string","null"],"example":"Salle 1"},"bookingUrl":{"type":["string","null"]},"updatedAt":{"type":"string","description":"Dernier ajout, modification ou retrait de cette séance (ISO 8601, UTC)","example":"2026-09-16T12:15:03.412Z"},"removedAt":{"type":["string","null"],"description":"Renseigné quand le cinéma ne publie plus cette séance (annulée ou retirée). Renvoyé uniquement avec `updated_since` ; les listes normales masquent les séances retirées","example":null},"movie":{"$ref":"#/components/schemas/Movie"},"cinema":{"allOf":[{"$ref":"#/components/schemas/Cinema"},{"description":"Absent quand `include` ne cite pas `cinema`"}]}},"required":["id","cinemaId","movieId","startsAt","version","format","room","bookingUrl","updatedAt","removedAt"]},"Movie":{"type":"object","properties":{"id":{"type":"string","example":"9a2c…"},"title":{"type":"string","description":"Titre propre issu de TMDB quand le film est rapproché (tmdbId renseigné) : en français pour les cinémas français, en anglais pour les américains ; sinon le titre publié par le premier cinéma","example":"Dune : Deuxième partie"},"rawTitle":{"type":["string","null"],"description":"Titre tel que publié la première fois par un cinéma, avant nettoyage","example":"DUNE 2"},"originalTitle":{"type":["string","null"],"example":"Dune: Part Two"},"year":{"type":["integer","null"],"example":2024},"durationMin":{"type":["integer","null"],"example":166},"director":{"type":["string","null"],"example":"Denis Villeneuve"},"synopsis":{"type":["string","null"],"description":"Synopsis (TMDB), en français ou en anglais comme `title`"},"genres":{"type":"array","items":{"type":"string"},"description":"Noms des genres (TMDB), en français ou en anglais comme `title` ; vide si inconnus","example":["Science-Fiction","Aventure"]},"posterUrl":{"type":["string","null"]},"allocineId":{"type":["string","null"],"description":"Identifiant Allociné du film, quand il a été lu sur Allociné (France) ; filtrez les séances avec `allocine_id`","example":"1000013045"},"tmdbId":{"type":["integer","null"],"description":"Identifiant The Movie Database, renseigné quand le film est rapproché. Regroupez les séances d’un film par `tmdbId` : des cinémas publiant des titres différents (\"SPIDERMAN\", \"Spider-Man : Brand New Day\") donnent des `id` distincts avec le même `tmdbId`, et un film projeté en France et aux États-Unis a un `id` par pays","example":693134},"updatedAt":{"type":"string","description":"Dernière modification du film (rapprochement TMDB, alias, métadonnées), ISO 8601 UTC","example":"2026-09-16T12:15:03.412Z"},"titleSource":{"type":"string","enum":["tmdb","raw"],"description":"`tmdb` : titre, synopsis et genres viennent de TMDB (tmdbId renseigné) ; `raw` : titre tel que publié par le cinéma, pas encore rapproché","example":"tmdb"}},"required":["id","title","rawTitle","originalTitle","year","durationMin","director","synopsis","genres","posterUrl","allocineId","tmdbId","updatedAt","titleSource"],"description":"Absent quand `include` ne cite pas `movie`"},"ShowtimeMeta":{"allOf":[{"$ref":"#/components/schemas/Meta"},{"type":"object","properties":{"total":{"type":"integer","description":"Nombre de séances correspondantes ; absent des pages demandées avec `cursor`"},"nextCursor":{"type":["string","null"],"description":"À passer en `cursor` pour la page suivante ; null sur la dernière page"},"syncedAt":{"type":"string","description":"Gardez la valeur de la première page d’un parcours et passez-la en `updated_since` à votre prochaine synchronisation (quelques minutes avant la requête, pour ne rien manquer de ce qui est écrit pendant le parcours ; certaines lignes peuvent arriver deux fois)","example":"2026-09-16T11:55:00.000Z"}},"required":["nextCursor","syncedAt"]}]},"CinemaShowtimeSearch":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Facultatif. Journée entière, à l’heure locale de chaque cinéma.","example":"2026-09-25"},"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2}(?::\\d{2})?)?$","description":"Facultatif. YYYY-MM-DD ou YYYY-MM-DDTHH:MM, à l’heure locale de chaque cinéma. Par défaut : maintenant, dans le fuseau de chaque cinéma.","example":"2026-09-25T18:00"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2}(?::\\d{2})?)?$","description":"Facultatif. YYYY-MM-DD ou YYYY-MM-DDTHH:MM, à l’heure locale de chaque cinéma.","example":"2026-09-26"},"version":{"type":"string","enum":["VF","VO","VOST","VFST","UNKNOWN"],"example":"VOST","description":"Facultatif."},"include":{"type":"array","items":{"type":"string","enum":["movie","cinema"]},"description":"Facultatif. Objets à embarquer. Par défaut les deux ; `[]` ne renvoie que `movieId` / `cinemaId`.","example":["movie"]},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":50,"example":100,"description":"Facultatif."},"offset":{"type":"integer","minimum":0,"default":0,"example":0,"description":"Facultatif."},"cursor":{"type":"string","maxLength":200,"description":"Facultatif. `meta.nextCursor` de la page précédente."}},"additionalProperties":false,"example":{"date":"2026-09-25","include":["movie"]}},"ShowtimeSearch":{"type":"object","properties":{"country":{"type":"string","enum":["FR","US"],"description":"Facultatif. Uniquement les cinémas de ce pays. Par défaut : tous les pays.","example":"FR"},"city":{"type":"string","minLength":1,"description":"Facultatif. Nom exact de la commune ; `Paris` inclut aussi ses arrondissements.","example":"Lyon"},"cinemaId":{"type":"string","minLength":1,"description":"Facultatif. Un cinéma (id).","example":"cnc_188341"},"movieId":{"type":"string","minLength":1,"description":"Facultatif. Une ligne de film (id)."},"tmdbId":{"type":"integer","exclusiveMinimum":0,"description":"Facultatif. Toutes les séances de ce film TMDB, quels que soient le titre ou le pays.","example":1368337},"allocineId":{"type":"string","pattern":"^\\d{1,12}$","description":"Facultatif. Toutes les séances de ce film Allociné (allocine.fr/film/fichefilm_gen_cfilm=<id>.html).","example":"1000013045"},"near":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"radiusKm":{"type":"number","exclusiveMinimum":0,"maximum":100,"default":10}},"required":["lat","lng"],"additionalProperties":false,"description":"Facultatif. Point central et rayon (10 km par défaut) ; les résultats portent `distanceKm`.","example":{"lat":45.764,"lng":4.8357,"radiusKm":5}},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Facultatif. Journée entière, à l’heure locale de chaque cinéma.","example":"2026-09-25"},"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2}(?::\\d{2})?)?$","description":"Facultatif. YYYY-MM-DD ou YYYY-MM-DDTHH:MM, à l’heure locale de chaque cinéma. Par défaut : maintenant, dans le fuseau de chaque cinéma.","example":"2026-09-25T18:00"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2}(?::\\d{2})?)?$","description":"Facultatif. YYYY-MM-DD ou YYYY-MM-DDTHH:MM, à l’heure locale de chaque cinéma.","example":"2026-09-26"},"version":{"type":"string","enum":["VF","VO","VOST","VFST","UNKNOWN"],"example":"VOST","description":"Facultatif."},"updatedSince":{"type":"string","maxLength":40,"description":"Facultatif. Synchronisation incrémentale, comme `updated_since` de `GET /v1/showtimes`.","example":"2026-09-16T03:00:00Z"},"include":{"type":"array","items":{"type":"string","enum":["movie","cinema"]},"description":"Facultatif. Objets à embarquer. Par défaut les deux ; `[]` ne renvoie que `movieId` / `cinemaId`.","example":["movie"]},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":50,"example":100,"description":"Facultatif."},"offset":{"type":"integer","minimum":0,"default":0,"example":0,"description":"Facultatif."},"cursor":{"type":"string","maxLength":200,"description":"Facultatif. `meta.nextCursor` de la page précédente."}},"additionalProperties":false,"example":{"country":"FR","allocineId":"1000013045","near":{"lat":45.764,"lng":4.8357,"radiusKm":5},"from":"2026-09-25T18:00","include":["movie"],"limit":100}},"MovieList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Movie"}},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"MovieSearch":{"type":"object","properties":{"q":{"type":"string","minLength":1,"description":"Facultatif. Recherche dans le titre (sans tenir compte des accents ni de la casse).","example":"odyssée"},"playing":{"type":"boolean","description":"Facultatif. Uniquement les films avec des séances à venir (dans `country` s’il est donné)."},"country":{"type":"string","enum":["FR","US"],"description":"Facultatif. Uniquement les films projetés dans ce pays.","example":"FR"},"tmdbId":{"type":"integer","exclusiveMinimum":0,"description":"Facultatif. Toutes les lignes de ce film TMDB.","example":1368337},"allocineId":{"type":"string","pattern":"^\\d{1,12}$","description":"Facultatif. Toutes les lignes de ce film Allociné.","example":"1000013045"},"updatedSince":{"type":"string","maxLength":40,"description":"Facultatif. Uniquement les films modifiés depuis cet instant ISO 8601.","example":"2026-09-16T03:00:00Z"},"limit":{"type":"integer","minimum":1,"maximum":200,"default":50,"example":50,"description":"Facultatif."},"offset":{"type":"integer","minimum":0,"default":0,"example":0,"description":"Facultatif."}},"additionalProperties":false,"example":{"q":"odyssée","playing":true,"country":"FR"}},"UnmatchedMovieList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/UnmatchedMovie"}},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"]},"UnmatchedMovie":{"type":"object","properties":{"movie":{"$ref":"#/components/schemas/Movie"},"upcomingShowtimes":{"type":"integer","example":403},"cinemas":{"type":"integer","description":"Cinémas actifs qui le projettent","example":135}},"required":["movie","upcomingShowtimes","cinemas"]},"MovieShowtimeSearch":{"type":"object","properties":{"country":{"type":"string","enum":["FR","US"],"description":"Facultatif. Uniquement les cinémas de ce pays. Par défaut : tous les pays.","example":"FR"},"city":{"type":"string","minLength":1,"description":"Facultatif. Nom exact de la commune ; `Paris` inclut aussi ses arrondissements.","example":"Lyon"},"near":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"radiusKm":{"type":"number","exclusiveMinimum":0,"maximum":100,"default":10}},"required":["lat","lng"],"additionalProperties":false,"description":"Facultatif. Point central et rayon (10 km par défaut) ; les résultats portent `distanceKm`.","example":{"lat":45.764,"lng":4.8357,"radiusKm":5}},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Facultatif. Journée entière, à l’heure locale de chaque cinéma.","example":"2026-09-25"},"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2}(?::\\d{2})?)?$","description":"Facultatif. YYYY-MM-DD ou YYYY-MM-DDTHH:MM, à l’heure locale de chaque cinéma. Par défaut : maintenant, dans le fuseau de chaque cinéma.","example":"2026-09-25T18:00"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2}(?::\\d{2})?)?$","description":"Facultatif. YYYY-MM-DD ou YYYY-MM-DDTHH:MM, à l’heure locale de chaque cinéma.","example":"2026-09-26"},"version":{"type":"string","enum":["VF","VO","VOST","VFST","UNKNOWN"],"example":"VOST","description":"Facultatif."},"include":{"type":"array","items":{"type":"string","enum":["movie","cinema"]},"description":"Facultatif. Objets à embarquer. Par défaut les deux ; `[]` ne renvoie que `movieId` / `cinemaId`.","example":["movie"]},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":50,"example":100,"description":"Facultatif."},"offset":{"type":"integer","minimum":0,"default":0,"example":0,"description":"Facultatif."},"cursor":{"type":"string","maxLength":200,"description":"Facultatif. `meta.nextCursor` de la page précédente."}},"additionalProperties":false,"example":{"country":"FR","near":{"lat":48.8566,"lng":2.3522,"radiusKm":5},"include":["cinema"]}},"Health":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"version":{"type":"string"}},"required":["ok","version"]}},"parameters":{}},"paths":{"/v1/cinemas":{"get":{"tags":["Cinemas"],"summary":"Lister les cinémas","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"description":"Facultatif. Nom exact de la commune ; `Paris` inclut aussi ses arrondissements. Exemple : `Paris`.","name":"city","in":"query"},{"schema":{"type":"string"},"required":false,"description":"Facultatif. Le nom contient. Exemple : `champo`.","name":"q","in":"query"},{"schema":{"type":"string","pattern":"^\\d{2,5}$"},"required":false,"description":"Facultatif. Le code postal (FR) ou ZIP code (US) commence par : `75005` pour un code, `75` pour tout un département français, `100` pour une plage de ZIP codes américains. 2 à 5 chiffres. Exemple : `75005`.","name":"zip_code","in":"query"},{"schema":{"type":"string","enum":["true","false"],"default":"true"},"required":false,"description":"Facultatif. true par défaut.","name":"active","in":"query"},{"schema":{"type":"string","enum":["FR","US"]},"required":false,"description":"Facultatif. Uniquement les cinémas de ce pays (ISO 3166-1 alpha-2). Par défaut : tous les pays. Exemple : `FR`.","name":"country","in":"query"},{"schema":{"type":"string"},"required":false,"description":"Facultatif. Point central \"lat,lng\". Exemple : `48.8566,2.3522`.","name":"near","in":"query"},{"schema":{"type":"number","exclusiveMinimum":0,"maximum":100},"required":false,"description":"Facultatif. Rayon autour de `near`, 10 par défaut. Exemple : `5`.","name":"radius_km","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"required":false,"name":"limit","in":"query","description":"Facultatif. Exemple : `50`."},{"schema":{"type":["integer","null"],"minimum":0,"default":0},"required":false,"name":"offset","in":"query","description":"Facultatif. Exemple : `0`."}],"responses":{"200":{"description":"Cinémas","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CinemaList"}}}},"400":{"description":"Requête invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Clé d’API absente ou invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès à l’API du compte suspendu (`account_suspended`), par exemple quand un autre compte a déjà été créé depuis la même connexion : un seul compte par client (conditions d’utilisation, article 2).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Erreur de validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de débit dépassée pour cette clé d’API (60 requêtes par minute sur l’offre standard, 600 sur pro ; `rate_limited`), ou quota hebdomadaire du compte dépassé (`weekly_quota_exceeded`, s’il en a un). Attendez `Retry-After` secondes.","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}},"Retry-After":{"description":"Secondes à attendre avant de réessayer (fin de la fenêtre en cours).","schema":{"type":"integer","example":23}}},"content":{"application/json":{"example":{"error":{"code":"rate_limited","message":"Rate limit exceeded: 60 requests per 60 s for this API key. Retry in 23 s.","details":{"limit":60,"windowSeconds":60,"retryAfterSeconds":23,"plan":"standard"}}},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/cinemas/search":{"post":{"tags":["Cinemas"],"summary":"Chercher des cinémas avec un corps JSON","description":"Mêmes filtres et résultats que `GET /v1/cinemas`, envoyés dans un corps JSON (valeurs typées, noms en camelCase). Lecture seule.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CinemaSearch"}}}},"responses":{"200":{"description":"Cinémas","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CinemaList"}}}},"400":{"description":"Requête invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Clé d’API absente ou invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès à l’API du compte suspendu (`account_suspended`), par exemple quand un autre compte a déjà été créé depuis la même connexion : un seul compte par client (conditions d’utilisation, article 2).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Erreur de validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de débit dépassée pour cette clé d’API (60 requêtes par minute sur l’offre standard, 600 sur pro ; `rate_limited`), ou quota hebdomadaire du compte dépassé (`weekly_quota_exceeded`, s’il en a un). Attendez `Retry-After` secondes.","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}},"Retry-After":{"description":"Secondes à attendre avant de réessayer (fin de la fenêtre en cours).","schema":{"type":"integer","example":23}}},"content":{"application/json":{"example":{"error":{"code":"rate_limited","message":"Rate limit exceeded: 60 requests per 60 s for this API key. Retry in 23 s.","details":{"limit":60,"windowSeconds":60,"retryAfterSeconds":23,"plan":"standard"}}},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/cinemas/{id}":{"get":{"tags":["Cinemas"],"summary":"Un cinéma par son id ou son slug","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"description":"`id` ou `slug` du cinéma, tels que renvoyés par `GET /v1/cinemas` (ou `cinemaId` / `cinema.id` d’une séance)","example":"cnc_188341"},"required":true,"description":"`id` ou `slug` du cinéma, tels que renvoyés par `GET /v1/cinemas` (ou `cinemaId` / `cinema.id` d’une séance)","name":"id","in":"path"}],"responses":{"200":{"description":"Cinéma","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Cinema"}}}},"400":{"description":"Requête invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Clé d’API absente ou invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès à l’API du compte suspendu (`account_suspended`), par exemple quand un autre compte a déjà été créé depuis la même connexion : un seul compte par client (conditions d’utilisation, article 2).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Introuvable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Erreur de validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de débit dépassée pour cette clé d’API (60 requêtes par minute sur l’offre standard, 600 sur pro ; `rate_limited`), ou quota hebdomadaire du compte dépassé (`weekly_quota_exceeded`, s’il en a un). Attendez `Retry-After` secondes.","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}},"Retry-After":{"description":"Secondes à attendre avant de réessayer (fin de la fenêtre en cours).","schema":{"type":"integer","example":23}}},"content":{"application/json":{"example":{"error":{"code":"rate_limited","message":"Rate limit exceeded: 60 requests per 60 s for this API key. Retry in 23 s.","details":{"limit":60,"windowSeconds":60,"retryAfterSeconds":23,"plan":"standard"}}},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/cinemas/{id}/showtimes":{"get":{"tags":["Cinemas","Showtimes"],"summary":"Les séances d’un cinéma (aujourd’hui par défaut)","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"description":"`id` ou `slug` du cinéma, tels que renvoyés par `GET /v1/cinemas` (ou `cinemaId` / `cinema.id` d’une séance)","example":"cnc_188341"},"required":true,"description":"`id` ou `slug` du cinéma, tels que renvoyés par `GET /v1/cinemas` (ou `cinemaId` / `cinema.id` d’une séance)","name":"id","in":"path"},{"schema":{"type":"string"},"required":false,"description":"Facultatif. Journée entière, YYYY-MM-DD, à l’heure locale de chaque cinéma. Exemple : `2026-09-15`.","name":"date","in":"query"},{"schema":{"type":"string"},"required":false,"description":"Facultatif. YYYY-MM-DD ou YYYY-MM-DDTHH:MM, à l’heure locale de chaque cinéma. Par défaut : maintenant, dans le fuseau de chaque cinéma. Exemple : `2026-09-15T18:00`.","name":"from","in":"query"},{"schema":{"type":"string"},"required":false,"description":"Facultatif. YYYY-MM-DD ou YYYY-MM-DDTHH:MM, à l’heure locale de chaque cinéma. Exemple : `2026-09-16`.","name":"to","in":"query"},{"schema":{"type":"string","enum":["VF","VO","VOST","VFST","UNKNOWN"]},"required":false,"name":"version","in":"query","description":"Facultatif. Exemple : `VOST`."},{"schema":{"type":"string","maxLength":40},"required":false,"description":"Facultatif. Objets à embarquer, séparés par des virgules : `movie`, `cinema`. Par défaut `movie,cinema` ; `include=` (vide) ne renvoie que `movieId` / `cinemaId`, pour des pages bien plus légères lors des imports complets. Exemple : `movie`.","name":"include","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":1000,"default":50},"required":false,"description":"Facultatif. Taille de page, jusqu’à 1000. Exemple : `1000`.","name":"limit","in":"query"},{"schema":{"type":["integer","null"],"minimum":0,"default":0},"required":false,"description":"Facultatif. Lignes à sauter. Pour les pages lointaines, parcourez plutôt avec `cursor`. Exemple : `0`.","name":"offset","in":"query"},{"schema":{"type":"string","maxLength":200},"required":false,"description":"Facultatif. `meta.nextCursor` de la page précédente. Parcourt tout le résultat dans un ordre stable (startsAt, id) ; incompatible avec `offset` et `near`.","name":"cursor","in":"query"}],"responses":{"200":{"description":"Séances","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowtimeList"}}}},"400":{"description":"Requête invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Clé d’API absente ou invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès à l’API du compte suspendu (`account_suspended`), par exemple quand un autre compte a déjà été créé depuis la même connexion : un seul compte par client (conditions d’utilisation, article 2).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Introuvable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Erreur de validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de débit dépassée pour cette clé d’API (60 requêtes par minute sur l’offre standard, 600 sur pro ; `rate_limited`), ou quota hebdomadaire du compte dépassé (`weekly_quota_exceeded`, s’il en a un). Attendez `Retry-After` secondes.","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}},"Retry-After":{"description":"Secondes à attendre avant de réessayer (fin de la fenêtre en cours).","schema":{"type":"integer","example":23}}},"content":{"application/json":{"example":{"error":{"code":"rate_limited","message":"Rate limit exceeded: 60 requests per 60 s for this API key. Retry in 23 s.","details":{"limit":60,"windowSeconds":60,"retryAfterSeconds":23,"plan":"standard"}}},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/cinemas/{id}/showtimes/search":{"post":{"tags":["Cinemas","Showtimes"],"summary":"Les séances d’un cinéma avec un corps JSON (aujourd’hui par défaut)","description":"Mêmes filtres et résultats que `GET /v1/cinemas/{id}/showtimes`, envoyés dans un corps JSON (valeurs typées, noms en camelCase). Lecture seule.","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"description":"`id` ou `slug` du cinéma, tels que renvoyés par `GET /v1/cinemas` (ou `cinemaId` / `cinema.id` d’une séance)","example":"cnc_188341"},"required":true,"description":"`id` ou `slug` du cinéma, tels que renvoyés par `GET /v1/cinemas` (ou `cinemaId` / `cinema.id` d’une séance)","name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CinemaShowtimeSearch"}}}},"responses":{"200":{"description":"Séances","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowtimeList"}}}},"400":{"description":"Requête invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Clé d’API absente ou invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès à l’API du compte suspendu (`account_suspended`), par exemple quand un autre compte a déjà été créé depuis la même connexion : un seul compte par client (conditions d’utilisation, article 2).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Introuvable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Erreur de validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de débit dépassée pour cette clé d’API (60 requêtes par minute sur l’offre standard, 600 sur pro ; `rate_limited`), ou quota hebdomadaire du compte dépassé (`weekly_quota_exceeded`, s’il en a un). Attendez `Retry-After` secondes.","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}},"Retry-After":{"description":"Secondes à attendre avant de réessayer (fin de la fenêtre en cours).","schema":{"type":"integer","example":23}}},"content":{"application/json":{"example":{"error":{"code":"rate_limited","message":"Rate limit exceeded: 60 requests per 60 s for this API key. Retry in 23 s.","details":{"limit":60,"windowSeconds":60,"retryAfterSeconds":23,"plan":"standard"}}},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/showtimes":{"get":{"tags":["Showtimes"],"summary":"Chercher des séances (à venir à partir de maintenant par défaut)","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"description":"Facultatif. Nom exact de la commune ; `Paris` inclut aussi ses arrondissements. Exemple : `Lyon`.","name":"city","in":"query"},{"schema":{"type":"string"},"required":false,"name":"movie_id","in":"query","description":"Facultatif."},{"schema":{"type":"integer","exclusiveMinimum":0},"required":false,"description":"Facultatif. Identifiant The Movie Database : toutes les séances de ce film, quels que soient le titre publié par chaque cinéma ou le pays. Exemple : `1368337`.","name":"tmdb_id","in":"query"},{"schema":{"type":"string","pattern":"^\\d{1,12}$"},"required":false,"description":"Facultatif. Identifiant Allociné du film, comme dans allocine.fr/film/fichefilm_gen_cfilm=<id>.html : toutes les séances de ce film (y compris celles lues sur d’autres sources, une fois le film rapproché sur TMDB). Exemple : `1000013045`.","name":"allocine_id","in":"query"},{"schema":{"type":"string","enum":["FR","US"]},"required":false,"description":"Facultatif. Uniquement les cinémas de ce pays (ISO 3166-1 alpha-2). Par défaut : tous les pays. Exemple : `FR`.","name":"country","in":"query"},{"schema":{"type":"string"},"required":false,"description":"Facultatif. Point central \"lat,lng\". Exemple : `48.8566,2.3522`.","name":"near","in":"query"},{"schema":{"type":"number","exclusiveMinimum":0,"maximum":100},"required":false,"description":"Facultatif. Rayon autour de `near`, 10 par défaut. Exemple : `5`.","name":"radius_km","in":"query"},{"schema":{"type":"string"},"required":false,"description":"Facultatif. Journée entière, YYYY-MM-DD, à l’heure locale de chaque cinéma. Exemple : `2026-09-15`.","name":"date","in":"query"},{"schema":{"type":"string"},"required":false,"description":"Facultatif. YYYY-MM-DD ou YYYY-MM-DDTHH:MM, à l’heure locale de chaque cinéma. Par défaut : maintenant, dans le fuseau de chaque cinéma. Exemple : `2026-09-15T18:00`.","name":"from","in":"query"},{"schema":{"type":"string"},"required":false,"description":"Facultatif. YYYY-MM-DD ou YYYY-MM-DDTHH:MM, à l’heure locale de chaque cinéma. Exemple : `2026-09-16`.","name":"to","in":"query"},{"schema":{"type":"string","enum":["VF","VO","VOST","VFST","UNKNOWN"]},"required":false,"name":"version","in":"query","description":"Facultatif. Exemple : `VOST`."},{"schema":{"type":"string","maxLength":40},"required":false,"description":"Facultatif. Synchronisation incrémentale : uniquement les séances ajoutées, modifiées ou retirées depuis cet instant ISO 8601, retirées comprises (`removedAt` renseigné), triées par (updatedAt, id). Passez le `meta.syncedAt` de la première page de votre parcours précédent. Les séances retirées sont gardées 30 jours : synchronisez au moins aussi souvent, ou refaites un parcours complet. Exemple : `2026-09-16T03:00:00Z`.","name":"updated_since","in":"query"},{"schema":{"type":"string","maxLength":40},"required":false,"description":"Facultatif. Objets à embarquer, séparés par des virgules : `movie`, `cinema`. Par défaut `movie,cinema` ; `include=` (vide) ne renvoie que `movieId` / `cinemaId`, pour des pages bien plus légères lors des imports complets. Exemple : `movie`.","name":"include","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":1000,"default":50},"required":false,"description":"Facultatif. Taille de page, jusqu’à 1000. Exemple : `1000`.","name":"limit","in":"query"},{"schema":{"type":["integer","null"],"minimum":0,"default":0},"required":false,"description":"Facultatif. Lignes à sauter. Pour les pages lointaines, parcourez plutôt avec `cursor`. Exemple : `0`.","name":"offset","in":"query"},{"schema":{"type":"string","maxLength":200},"required":false,"description":"Facultatif. `meta.nextCursor` de la page précédente. Parcourt tout le résultat dans un ordre stable (startsAt, id) ; incompatible avec `offset` et `near`.","name":"cursor","in":"query"}],"responses":{"200":{"description":"Séances","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowtimeList"}}}},"400":{"description":"Requête invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Clé d’API absente ou invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès à l’API du compte suspendu (`account_suspended`), par exemple quand un autre compte a déjà été créé depuis la même connexion : un seul compte par client (conditions d’utilisation, article 2).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Erreur de validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de débit dépassée pour cette clé d’API (60 requêtes par minute sur l’offre standard, 600 sur pro ; `rate_limited`), ou quota hebdomadaire du compte dépassé (`weekly_quota_exceeded`, s’il en a un). Attendez `Retry-After` secondes.","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}},"Retry-After":{"description":"Secondes à attendre avant de réessayer (fin de la fenêtre en cours).","schema":{"type":"integer","example":23}}},"content":{"application/json":{"example":{"error":{"code":"rate_limited","message":"Rate limit exceeded: 60 requests per 60 s for this API key. Retry in 23 s.","details":{"limit":60,"windowSeconds":60,"retryAfterSeconds":23,"plan":"standard"}}},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/showtimes/search":{"post":{"tags":["Showtimes"],"summary":"Chercher des séances avec un corps JSON","description":"Mêmes filtres et résultats que `GET /v1/showtimes`, envoyés dans un corps JSON avec des valeurs typées et des noms en camelCase au lieu d’une longue URL. Lecture seule : rien n’est créé.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowtimeSearch"}}}},"responses":{"200":{"description":"Séances","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowtimeList"}}}},"400":{"description":"Requête invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Clé d’API absente ou invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès à l’API du compte suspendu (`account_suspended`), par exemple quand un autre compte a déjà été créé depuis la même connexion : un seul compte par client (conditions d’utilisation, article 2).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Erreur de validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de débit dépassée pour cette clé d’API (60 requêtes par minute sur l’offre standard, 600 sur pro ; `rate_limited`), ou quota hebdomadaire du compte dépassé (`weekly_quota_exceeded`, s’il en a un). Attendez `Retry-After` secondes.","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}},"Retry-After":{"description":"Secondes à attendre avant de réessayer (fin de la fenêtre en cours).","schema":{"type":"integer","example":23}}},"content":{"application/json":{"example":{"error":{"code":"rate_limited","message":"Rate limit exceeded: 60 requests per 60 s for this API key. Retry in 23 s.","details":{"limit":60,"windowSeconds":60,"retryAfterSeconds":23,"plan":"standard"}}},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/movies":{"get":{"tags":["Movies"],"summary":"Lister les films","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"description":"Facultatif. Recherche dans le titre (sans tenir compte des accents ni de la casse). Exemple : `dune`.","name":"q","in":"query"},{"schema":{"type":"string","enum":["true","false"]},"required":false,"description":"Facultatif. Uniquement les films avec des séances à venir (dans `country` s’il est donné).","name":"playing","in":"query"},{"schema":{"type":"string","maxLength":40},"required":false,"description":"Facultatif. Uniquement les films modifiés depuis cet instant ISO 8601 (rapprochement TMDB, alias, métadonnées). Exemple : `2026-09-16T03:00:00Z`.","name":"updated_since","in":"query"},{"schema":{"type":"integer","exclusiveMinimum":0},"required":false,"description":"Facultatif. Identifiant The Movie Database : toutes les séances de ce film, quels que soient le titre publié par chaque cinéma ou le pays. Exemple : `1368337`.","name":"tmdb_id","in":"query"},{"schema":{"type":"string","pattern":"^\\d{1,12}$"},"required":false,"description":"Facultatif. Identifiant Allociné du film, comme dans allocine.fr/film/fichefilm_gen_cfilm=<id>.html : toutes les séances de ce film (y compris celles lues sur d’autres sources, une fois le film rapproché sur TMDB). Exemple : `1000013045`.","name":"allocine_id","in":"query"},{"schema":{"type":"string","enum":["FR","US"]},"required":false,"description":"Facultatif. Uniquement les cinémas de ce pays (ISO 3166-1 alpha-2). Par défaut : tous les pays. Exemple : `FR`.","name":"country","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"required":false,"name":"limit","in":"query","description":"Facultatif. Exemple : `50`."},{"schema":{"type":["integer","null"],"minimum":0,"default":0},"required":false,"name":"offset","in":"query","description":"Facultatif. Exemple : `0`."}],"responses":{"200":{"description":"Films","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MovieList"}}}},"400":{"description":"Requête invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Clé d’API absente ou invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès à l’API du compte suspendu (`account_suspended`), par exemple quand un autre compte a déjà été créé depuis la même connexion : un seul compte par client (conditions d’utilisation, article 2).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Erreur de validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de débit dépassée pour cette clé d’API (60 requêtes par minute sur l’offre standard, 600 sur pro ; `rate_limited`), ou quota hebdomadaire du compte dépassé (`weekly_quota_exceeded`, s’il en a un). Attendez `Retry-After` secondes.","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}},"Retry-After":{"description":"Secondes à attendre avant de réessayer (fin de la fenêtre en cours).","schema":{"type":"integer","example":23}}},"content":{"application/json":{"example":{"error":{"code":"rate_limited","message":"Rate limit exceeded: 60 requests per 60 s for this API key. Retry in 23 s.","details":{"limit":60,"windowSeconds":60,"retryAfterSeconds":23,"plan":"standard"}}},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/movies/search":{"post":{"tags":["Movies"],"summary":"Chercher des films avec un corps JSON","description":"Mêmes filtres et résultats que `GET /v1/movies`, envoyés dans un corps JSON (valeurs typées, noms en camelCase). Lecture seule.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MovieSearch"}}}},"responses":{"200":{"description":"Films","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MovieList"}}}},"400":{"description":"Requête invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Clé d’API absente ou invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès à l’API du compte suspendu (`account_suspended`), par exemple quand un autre compte a déjà été créé depuis la même connexion : un seul compte par client (conditions d’utilisation, article 2).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Erreur de validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de débit dépassée pour cette clé d’API (60 requêtes par minute sur l’offre standard, 600 sur pro ; `rate_limited`), ou quota hebdomadaire du compte dépassé (`weekly_quota_exceeded`, s’il en a un). Attendez `Retry-After` secondes.","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}},"Retry-After":{"description":"Secondes à attendre avant de réessayer (fin de la fenêtre en cours).","schema":{"type":"integer","example":23}}},"content":{"application/json":{"example":{"error":{"code":"rate_limited","message":"Rate limit exceeded: 60 requests per 60 s for this API key. Retry in 23 s.","details":{"limit":60,"windowSeconds":60,"retryAfterSeconds":23,"plan":"standard"}}},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/movies/unmatched":{"get":{"tags":["Movies"],"summary":"Films à l’affiche sans rapprochement TMDB, les plus programmés d’abord","description":"Films à venir dont le `tmdbId` est encore null, triés par nombre de séances à venir : pour suivre le rapprochement TMDB dans le temps.","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"required":false,"name":"limit","in":"query","description":"Facultatif. Exemple : `50`."},{"schema":{"type":["integer","null"],"minimum":0,"default":0},"required":false,"name":"offset","in":"query","description":"Facultatif. Exemple : `0`."}],"responses":{"200":{"description":"Films non rapprochés","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnmatchedMovieList"}}}},"400":{"description":"Requête invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Clé d’API absente ou invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès à l’API du compte suspendu (`account_suspended`), par exemple quand un autre compte a déjà été créé depuis la même connexion : un seul compte par client (conditions d’utilisation, article 2).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Erreur de validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de débit dépassée pour cette clé d’API (60 requêtes par minute sur l’offre standard, 600 sur pro ; `rate_limited`), ou quota hebdomadaire du compte dépassé (`weekly_quota_exceeded`, s’il en a un). Attendez `Retry-After` secondes.","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}},"Retry-After":{"description":"Secondes à attendre avant de réessayer (fin de la fenêtre en cours).","schema":{"type":"integer","example":23}}},"content":{"application/json":{"example":{"error":{"code":"rate_limited","message":"Rate limit exceeded: 60 requests per 60 s for this API key. Retry in 23 s.","details":{"limit":60,"windowSeconds":60,"retryAfterSeconds":23,"plan":"standard"}}},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/movies/{id}":{"get":{"tags":["Movies"],"summary":"Un film","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"description":"`id` du film (le nôtre), tel que renvoyé par `GET /v1/movies?q=…`, `GET /v1/movies?tmdb_id=…` / `?allocine_id=…`, ou `movieId` d’une séance. Un film peut avoir plusieurs id (un par pays, ou par titre publié tant qu’il n’est pas rapproché sur TMDB) : pour toutes les séances d’un film à partir de son identifiant TMDB ou Allociné, préférez `GET /v1/showtimes?tmdb_id=…` / `?allocine_id=…`","example":"7482dc62-6c35-4c0a-b894-2d2bcf04296f"},"required":true,"description":"`id` du film (le nôtre), tel que renvoyé par `GET /v1/movies?q=…`, `GET /v1/movies?tmdb_id=…` / `?allocine_id=…`, ou `movieId` d’une séance. Un film peut avoir plusieurs id (un par pays, ou par titre publié tant qu’il n’est pas rapproché sur TMDB) : pour toutes les séances d’un film à partir de son identifiant TMDB ou Allociné, préférez `GET /v1/showtimes?tmdb_id=…` / `?allocine_id=…`","name":"id","in":"path"}],"responses":{"200":{"description":"Film","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Movie"}}}},"400":{"description":"Requête invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Clé d’API absente ou invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès à l’API du compte suspendu (`account_suspended`), par exemple quand un autre compte a déjà été créé depuis la même connexion : un seul compte par client (conditions d’utilisation, article 2).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Introuvable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Erreur de validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de débit dépassée pour cette clé d’API (60 requêtes par minute sur l’offre standard, 600 sur pro ; `rate_limited`), ou quota hebdomadaire du compte dépassé (`weekly_quota_exceeded`, s’il en a un). Attendez `Retry-After` secondes.","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}},"Retry-After":{"description":"Secondes à attendre avant de réessayer (fin de la fenêtre en cours).","schema":{"type":"integer","example":23}}},"content":{"application/json":{"example":{"error":{"code":"rate_limited","message":"Rate limit exceeded: 60 requests per 60 s for this API key. Retry in 23 s.","details":{"limit":60,"windowSeconds":60,"retryAfterSeconds":23,"plan":"standard"}}},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/movies/{id}/showtimes":{"get":{"tags":["Movies","Showtimes"],"summary":"Les séances d’un film (à venir à partir de maintenant par défaut)","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"description":"`id` du film (le nôtre), tel que renvoyé par `GET /v1/movies?q=…`, `GET /v1/movies?tmdb_id=…` / `?allocine_id=…`, ou `movieId` d’une séance. Un film peut avoir plusieurs id (un par pays, ou par titre publié tant qu’il n’est pas rapproché sur TMDB) : pour toutes les séances d’un film à partir de son identifiant TMDB ou Allociné, préférez `GET /v1/showtimes?tmdb_id=…` / `?allocine_id=…`","example":"7482dc62-6c35-4c0a-b894-2d2bcf04296f"},"required":true,"description":"`id` du film (le nôtre), tel que renvoyé par `GET /v1/movies?q=…`, `GET /v1/movies?tmdb_id=…` / `?allocine_id=…`, ou `movieId` d’une séance. Un film peut avoir plusieurs id (un par pays, ou par titre publié tant qu’il n’est pas rapproché sur TMDB) : pour toutes les séances d’un film à partir de son identifiant TMDB ou Allociné, préférez `GET /v1/showtimes?tmdb_id=…` / `?allocine_id=…`","name":"id","in":"path"},{"schema":{"type":"string"},"required":false,"description":"Facultatif. Nom exact de la commune ; `Paris` inclut aussi ses arrondissements. Exemple : `Paris`.","name":"city","in":"query"},{"schema":{"type":"string","enum":["FR","US"]},"required":false,"description":"Facultatif. Uniquement les cinémas de ce pays (ISO 3166-1 alpha-2). Par défaut : tous les pays. Exemple : `FR`.","name":"country","in":"query"},{"schema":{"type":"string"},"required":false,"description":"Facultatif. Point central \"lat,lng\". Exemple : `48.8566,2.3522`.","name":"near","in":"query"},{"schema":{"type":"number","exclusiveMinimum":0,"maximum":100},"required":false,"description":"Facultatif. Rayon autour de `near`, 10 par défaut. Exemple : `5`.","name":"radius_km","in":"query"},{"schema":{"type":"string"},"required":false,"description":"Facultatif. Journée entière, YYYY-MM-DD, à l’heure locale de chaque cinéma. Exemple : `2026-09-15`.","name":"date","in":"query"},{"schema":{"type":"string"},"required":false,"description":"Facultatif. YYYY-MM-DD ou YYYY-MM-DDTHH:MM, à l’heure locale de chaque cinéma. Par défaut : maintenant, dans le fuseau de chaque cinéma. Exemple : `2026-09-15T18:00`.","name":"from","in":"query"},{"schema":{"type":"string"},"required":false,"description":"Facultatif. YYYY-MM-DD ou YYYY-MM-DDTHH:MM, à l’heure locale de chaque cinéma. Exemple : `2026-09-16`.","name":"to","in":"query"},{"schema":{"type":"string","enum":["VF","VO","VOST","VFST","UNKNOWN"]},"required":false,"name":"version","in":"query","description":"Facultatif. Exemple : `VOST`."},{"schema":{"type":"string","maxLength":40},"required":false,"description":"Facultatif. Objets à embarquer, séparés par des virgules : `movie`, `cinema`. Par défaut `movie,cinema` ; `include=` (vide) ne renvoie que `movieId` / `cinemaId`, pour des pages bien plus légères lors des imports complets. Exemple : `movie`.","name":"include","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":1000,"default":50},"required":false,"description":"Facultatif. Taille de page, jusqu’à 1000. Exemple : `1000`.","name":"limit","in":"query"},{"schema":{"type":["integer","null"],"minimum":0,"default":0},"required":false,"description":"Facultatif. Lignes à sauter. Pour les pages lointaines, parcourez plutôt avec `cursor`. Exemple : `0`.","name":"offset","in":"query"},{"schema":{"type":"string","maxLength":200},"required":false,"description":"Facultatif. `meta.nextCursor` de la page précédente. Parcourt tout le résultat dans un ordre stable (startsAt, id) ; incompatible avec `offset` et `near`.","name":"cursor","in":"query"}],"responses":{"200":{"description":"Séances","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowtimeList"}}}},"400":{"description":"Requête invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Clé d’API absente ou invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès à l’API du compte suspendu (`account_suspended`), par exemple quand un autre compte a déjà été créé depuis la même connexion : un seul compte par client (conditions d’utilisation, article 2).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Introuvable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Erreur de validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de débit dépassée pour cette clé d’API (60 requêtes par minute sur l’offre standard, 600 sur pro ; `rate_limited`), ou quota hebdomadaire du compte dépassé (`weekly_quota_exceeded`, s’il en a un). Attendez `Retry-After` secondes.","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}},"Retry-After":{"description":"Secondes à attendre avant de réessayer (fin de la fenêtre en cours).","schema":{"type":"integer","example":23}}},"content":{"application/json":{"example":{"error":{"code":"rate_limited","message":"Rate limit exceeded: 60 requests per 60 s for this API key. Retry in 23 s.","details":{"limit":60,"windowSeconds":60,"retryAfterSeconds":23,"plan":"standard"}}},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/movies/{id}/showtimes/search":{"post":{"tags":["Movies","Showtimes"],"summary":"Les séances d’un film avec un corps JSON (à venir à partir de maintenant par défaut)","description":"Mêmes filtres et résultats que `GET /v1/movies/{id}/showtimes`, envoyés dans un corps JSON (valeurs typées, noms en camelCase). Lecture seule.","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"description":"`id` du film (le nôtre), tel que renvoyé par `GET /v1/movies?q=…`, `GET /v1/movies?tmdb_id=…` / `?allocine_id=…`, ou `movieId` d’une séance. Un film peut avoir plusieurs id (un par pays, ou par titre publié tant qu’il n’est pas rapproché sur TMDB) : pour toutes les séances d’un film à partir de son identifiant TMDB ou Allociné, préférez `GET /v1/showtimes?tmdb_id=…` / `?allocine_id=…`","example":"7482dc62-6c35-4c0a-b894-2d2bcf04296f"},"required":true,"description":"`id` du film (le nôtre), tel que renvoyé par `GET /v1/movies?q=…`, `GET /v1/movies?tmdb_id=…` / `?allocine_id=…`, ou `movieId` d’une séance. Un film peut avoir plusieurs id (un par pays, ou par titre publié tant qu’il n’est pas rapproché sur TMDB) : pour toutes les séances d’un film à partir de son identifiant TMDB ou Allociné, préférez `GET /v1/showtimes?tmdb_id=…` / `?allocine_id=…`","name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MovieShowtimeSearch"}}}},"responses":{"200":{"description":"Séances","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowtimeList"}}}},"400":{"description":"Requête invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Clé d’API absente ou invalide","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès à l’API du compte suspendu (`account_suspended`), par exemple quand un autre compte a déjà été créé depuis la même connexion : un seul compte par client (conditions d’utilisation, article 2).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Introuvable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Erreur de validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de débit dépassée pour cette clé d’API (60 requêtes par minute sur l’offre standard, 600 sur pro ; `rate_limited`), ou quota hebdomadaire du compte dépassé (`weekly_quota_exceeded`, s’il en a un). Attendez `Retry-After` secondes.","headers":{"RateLimit-Policy":{"description":"Quota de la clé d’API : `\"standard\";q=60;w=60` (60 requêtes par 60 s) ou `\"pro\";q=600;w=60`.","schema":{"type":"string","example":"\"standard\";q=60;w=60"}},"RateLimit":{"description":"Requêtes restantes (`r`) et secondes avant la nouvelle fenêtre (`t`).","schema":{"type":"string","example":"\"standard\";r=41;t=23"}},"X-RateLimit-Limit":{"description":"Requêtes autorisées par fenêtre de 60 secondes pour cette clé d’API.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requêtes restantes dans la fenêtre en cours, celle-ci comprise.","schema":{"type":"integer","example":41}},"X-RateLimit-Reset":{"description":"Secondes avant la fin de la fenêtre en cours.","schema":{"type":"integer","example":23}},"X-Weekly-Quota-Limit":{"description":"Uniquement si votre compte a un quota hebdomadaire : requêtes autorisées par semaine (lundi 00:00 UTC → dimanche), toutes vos clés d’API confondues.","schema":{"type":"integer","example":10000}},"X-Weekly-Quota-Remaining":{"description":"Uniquement avec un quota hebdomadaire : requêtes restantes cette semaine, celle-ci comprise.","schema":{"type":"integer","example":8412}},"X-Weekly-Quota-Reset":{"description":"Uniquement avec un quota hebdomadaire : secondes avant lundi 00:00 UTC.","schema":{"type":"integer","example":302400}},"Retry-After":{"description":"Secondes à attendre avant de réessayer (fin de la fenêtre en cours).","schema":{"type":"integer","example":23}}},"content":{"application/json":{"example":{"error":{"code":"rate_limited","message":"Rate limit exceeded: 60 requests per 60 s for this API key. Retry in 23 s.","details":{"limit":60,"windowSeconds":60,"retryAfterSeconds":23,"plan":"standard"}}},"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/health":{"get":{"tags":["Meta"],"summary":"Vérification de disponibilité","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}}}}}},"webhooks":{}}