Skip to content

Événements ​

Un événement est une occurrence : une date de spectacle sur un plan donné. C'est à ce niveau que vivent les statuts de sièges — le même siège peut être libre le 12 mars et réservé le 15.

Lister les événements ​

GET /api/events

bash
curl https://api.mitoera.com/api/events \
  -u pk_xxxxxxxx:sk_xxxxxxxx
ts
const events = await client.events.listAll();
php
$events = $client->events->listAll();
json
[
  {
    "id": "01926b1c-5678-7abc-8def-000000000002",
    "title": "Concert 12 mars",
    "identifier": "concert-12-mars",
    "chartId": "01926a3f-1234-7abc-8def-000000000001",
    "chartName": "Salle principale",
    "createdAt": "2025-03-01T10:00:00Z"
  }
]

Créer un événement ​

POST /api/events

ChampTypeRequisDescription
titlestringouiTitre affiché
identifierstringouiSlug unique, utilisable à la place de l'UUID
chartIduuidnonPlan à associer — il doit être publié
bash
curl -X POST https://api.mitoera.com/api/events \
  -u pk_xxxxxxxx:sk_xxxxxxxx \
  -H 'Content-Type: application/json' \
  -d '{"title":"Concert 12 mars","identifier":"concert-12-mars","chartId":"CHART_ID"}'
ts
const event = await client.events.create('Concert 12 mars', 'concert-12-mars', chartId);
php
$event = $client->events->create('Concert 12 mars', 'concert-12-mars', $chartId);

Soignez l'identifier

Il rend vos URLs lisibles (/billetterie/concert-12-mars) et évite de trimballer des UUID dans le front. Le widget accepte indifféremment le slug ou l'UUID.

Obtenir un événement ​

GET /api/events/{eventId}

Par UUID. Pour chercher par slug :

GET /api/events/lookup/{identifier}

bash
curl https://api.mitoera.com/api/events/lookup/concert-12-mars \
  -u pk_xxxxxxxx:sk_xxxxxxxx
ts
const event = await client.events.get(eventId);
const same  = await client.events.findByIdentifier('concert-12-mars');
php
$event = $client->events->get($eventId);
$same  = $client->events->findByIdentifier('concert-12-mars');

Modifier un événement ​

PUT /api/events/{eventId}

ChampTypeRequisDescription
titlestringouiNouveau titre
identifierstringouiNouveau slug

Changer l'identifier casse les liens

Toute URL et tout widget qui référencent l'ancien slug cesseront de résoudre l'événement. Prévoyez une redirection de votre côté.

Associer un plan ​

POST /api/events/{eventId}/link-chart/{chartId}

Un événement n'a qu'un seul plan à la fois. Le plan doit être publié.

bash
curl -X POST https://api.mitoera.com/api/events/EVENT_ID/link-chart/CHART_ID \
  -u pk_xxxxxxxx:sk_xxxxxxxx
ts
await client.events.linkChart(eventId, chartId);
php
$client->events->linkChart($eventId, $chartId);

Statuts des sièges ​

GET /api/events/{eventId}/seats

Retourne l'état de tous les sièges de l'événement.

bash
curl https://api.mitoera.com/api/events/EVENT_ID/seats \
  -u pk_xxxxxxxx:sk_xxxxxxxx
ts
const map = await client.events.listSeats(eventId);
map.available();         // string[]
map.isAvailable('A-1');  // boolean
php
$map = $client->events->listSeats($eventId);
$map->available();         // string[]
$map->isAvailable('A-1');  // bool

La réponse est un objet indexé par clé de siège, enveloppé dans seats — pas un tableau :

json
{
  "seats": {
    "VIP-1-2":          { "status": "available", "holdToken": null,        "zoneType": "table" },
    "GOLD LEFT-E-24":   { "status": "hold",      "holdToken": "hld_9f2c…", "zoneType": "row"   },
    "A-1":              { "status": "booked",    "holdToken": null,        "zoneType": "row"   }
  }
}

Chaque siège expose un champ zoneType qui indique le type de zone auquel il appartient :

zoneTypeDescription
rowRangée classique (numérotée ou en lettres)
tableSection de tables (plan de salle)
freeZone en accès libre (pas de siège attribué)

Utilisez ce champ pour adapter l'affichage dans vos billets et interfaces : une réservation table affichera « Table 3, Siège 2 » là où une row affichera « Rangée C, Siège 12 ».

Deux pièges classiques

La clé de siège n'est pas un identifiant opaque : c'est le libellé du plan, espaces compris (GOLD LEFT-E-24). N'en déduisez aucun format.

seats est un objet, pas un tableau. Un .filter() ou un foreach appliqué directement dessus échoue. Passez par Object.entries() en JavaScript, ou utilisez le SeatStatusMap des SDK qui s'en charge.

Filtrer sur quelques sièges seulement se fait par paramètre de requête répété :

GET /api/events/{eventId}/seats?seatKeys[]=A-1&seatKeys[]=A-2

Ce filtre a un effet de bord utile : un siège du plan publié qui n'a jamais été manipulé n'a pas encore de ligne en base. Le demander explicitement le crée en available plutôt que de l'omettre de la réponse.

StatutSignification
availableLibre, sélectionnable
holdBloqué temporairement
bookedRéservé fermement
canceledRetiré de la vente

À quoi ressemble une clé de siège ​

La règle ci-dessus tient : ne construisez pas les clés vous-même, prenez celles que l'API et le widget vous donnent. Les formes qui suivent sont indicatives — elles servent à lire une clé, à la reconnaître dans un journal, et à repérer une clé manifestement cassée. Elles ne constituent pas un gabarit à reproduire.

Objet du planFormeExemple
Bloc de sièges{section}-{rangée}-{siège}PARTERRE-A-12
Section de tables{section}-{table}-{siège}VIP-3-6
Table isolée{section}-{siège}BAR-4

Quelques propriétés utiles :

  • Les numéros de table et de siège commencent à 1, jamais à 0.
  • Le premier segment est la section de l'objet. Si elle est vide, le libellé prend le relais, puis l'identifiant interne — d'où des clés comme Tables groupées-1-1.
  • Les rangées suivent le format choisi dans l'éditeur : lettres, chiffres ou chiffres romains, dans un sens ou dans l'autre, avec un départ de numérotation éventuellement décalé. PARTERRE-C-14 est donc une clé ordinaire, pas un signe que quelque chose cloche.
  • Les sièges désactivés ou supprimés d'un plan ne produisent aucune clé.
  • Une clé reste stable tant que la section n'est pas renommée et que la numérotation n'est pas retouchée. Renommer une section change toutes ses clés : à éviter sur un plan déjà vendu.

Repérer une clé cassée

Une clé valide contient toujours au moins un segment non vide avant le premier tiret. Une valeur comme --, - ou une chaîne vide n'identifie aucun siège : si vous en rencontrez une, signalez-la plutôt que de la traiter — elle ne correspondra à rien côté serveur, et plusieurs sièges distincts risquent de la partager.

Une réponse vide ne veut pas dire « événement non prêt »

Les sièges d'un événement sont créés à la demande, pas à la publication du plan. Tant que personne n'a rien réservé, GET /api/events/{eventId}/seats renvoie un objet seats vide — c'est l'état normal d'un événement neuf, pas une anomalie.

Les sièges vendables sont ceux du plan publié, que le widget connaît déjà. Ne conditionnez pas l'ouverture de la vente à la présence de lignes dans cette réponse : vous bloqueriez tous vos événements avant leur première vente.

Changer des statuts en masse ​

PATCH /api/events/{eventId}/seats/bulk-status

ChampTypeRequisDescription
seatsstring[]ouiSièges concernés
statusstringouiavailable, hold, booked ou canceled

Utile pour neutraliser une rangée en régie ou rouvrir une zone à la vente.

ts
const n = await client.events.bulkUpdateSeats(eventId, ['A-1', 'A-2'], 'canceled');
php
$n = $client->events->bulkUpdateSeats($eventId, ['A-1', 'A-2'], 'canceled');

La réponse indique le nombre de sièges effectivement modifiés.

Supprimer un événement ​

DELETE /api/events/{eventId}

bash
curl -X DELETE https://api.mitoera.com/api/events/EVENT_ID \
  -u pk_xxxxxxxx:sk_xxxxxxxx
ts
await client.events.delete(eventId);
php
$client->events->delete($eventId);

API, SDK et widget de plans de salle.