{"openapi":"3.1.0","info":{"title":"E-Ticket — API organisateurs","version":"1.0.0","description":"API de l’espace organisateur d’E-Ticket, la billetterie de l’Association E-Cosplay.\n\n**Authentification** : `Authorization: Bearer etk_live_…`. Les clés se créent depuis\n« Mon offre » de l’espace organisateur ; elles font partie des offres payantes.\nChaque clé porte des droits : `read` (lecture), `write` (tarifs, codes promo,\naccréditations, renvoi de commande), `scan` (contrôle des entrées).\n\n**Conventions** : montants en centimes hors taxe, dates ISO 8601 (UTC), listes\npaginées par `page` et `limit` (100 au plus). Une erreur renvoie `{ \"error\": \"code\" }`.\n\n**Limites** : 600 requêtes par minute et par clé (`X-RateLimit-*`).","contact":{"name":"Association E-Cosplay","email":"contact@e-cosplay.fr","url":"https://www.e-cosplay.fr"}},"servers":[{"url":"https://ticket.e-cosplay.fr/api/public/v1"}],"tags":[{"name":"Compte"},{"name":"Événements"},{"name":"Tarifs"},{"name":"Commandes"},{"name":"Billets"},{"name":"Codes promo"},{"name":"Accréditations"},{"name":"Contrôle"}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"Clé `etk_live_…` créée dans l’espace organisateur. `X-Api-Key` est aussi accepté."},"oauth":{"type":"oauth2","description":"Compte lié (§4.2.12) : l’utilisateur autorise l’application, qui repart avec une clé `etk_live_…` qui lui est propre. Le jeton d’accès **est** la clé : les deux modes s’utilisent pareil. PKCE (S256) obligatoire pour une application sans secret.","flows":{"authorizationCode":{"authorizationUrl":"https://ticket.e-cosplay.fr/api/oauth/authorize","tokenUrl":"https://ticket.e-cosplay.fr/api/oauth/token","scopes":{"identity":"Nom, adresse email et type de compte.","read":"Lire événements, tarifs, commandes et billets.","write":"Créer et modifier événements, tarifs, invitations.","scan":"Contrôler les entrées et lire le journal des passages."}}}}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Code stable, en snake_case : `invalid_input`, `event_not_found`, `offer_limit`…"},"fields":{"type":"object","description":"Erreurs par champ pour `invalid_input`."}}},"Attendance":{"type":"object","properties":{"ticketsSold":{"type":"integer","description":"Billets valides émis (ventes, invitations, accréditations)."},"ticketsScanned":{"type":"integer","description":"Billets passés au moins une fois."},"expected":{"type":"integer","description":"Personnes attendues : somme des capacités `admits`."},"present":{"type":"integer","description":"Personnes entrées."}}},"Event":{"type":"object","properties":{"id":{"type":"integer","description":"Identifiant."},"title":{"type":"string","description":"Titre."},"slug":{"type":"string","description":"Segment du lien public, fixé à la création."},"shortId":{"type":"string","description":"Identifiant court, imprimé sur les billets."},"description":{"type":"string","description":"Description, texte brut.","nullable":true},"status":{"type":"string","description":"`DRAFT`, `PUBLISHED`, `CANCELLED`, `ARCHIVED`."},"isPublished":{"type":"boolean","description":"Visible dans la liste publique."},"isSecret":{"type":"boolean","description":"Accessible uniquement par son lien."},"isPrivate":{"type":"boolean","description":"Réservé (billetterie fermée au public)."},"dateEvent":{"type":"string","format":"date-time","description":"Début."},"dateEventEnd":{"type":"string","format":"date-time","description":"Fin.","nullable":true},"timezone":{"type":"string","description":"Fuseau IANA, `Europe/Paris` par défaut."},"dateOpenTicket":{"type":"string","format":"date-time","description":"Ouverture de la billetterie."},"dateCloseTicket":{"type":"string","format":"date-time","description":"Fermeture de la billetterie."},"venueName":{"type":"string","description":"Nom du lieu.","nullable":true},"address":{"type":"string","description":"Adresse."},"zipcode":{"type":"string","description":"Code postal."},"city":{"type":"string","description":"Ville."},"country":{"type":"string","description":"Pays, ISO 3166-1 alpha-2."},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"refundDeadlineHours":{"type":"integer","description":"Délai de remboursement accordé, en heures avant l’événement.","nullable":true},"waitingRoom":{"type":"string","description":"Salle d’attente : `OFF`, `AUTO`, `ALWAYS` (§4.2.10)."},"waitingRoomCapacity":{"type":"integer","description":"Acheteurs simultanés admis, `null` = valeur de la plateforme.","nullable":true},"attendance":{"$ref":"#/components/schemas/Attendance"},"categories":{"type":"array","items":{"$ref":"#/components/schemas/Category"}},"publishedAt":{"type":"string","format":"date-time","description":"Publication.","nullable":true},"createdAt":{"type":"string","format":"date-time","description":"Création."},"updatedAt":{"type":"string","format":"date-time","description":"Dernière modification."}}},"EventPatch":{"type":"object","description":"Champs modifiables par l’API. Le titre, les dates, l’adresse et le lien se modifient depuis l’espace organisateur.","properties":{"description":{"type":"string","description":"Texte brut, 20 000 caractères au plus.","nullable":true},"venueName":{"type":"string","description":"Nom du lieu.","nullable":true},"refundDeadlineHours":{"type":"integer","description":"0 à 2160.","nullable":true},"isSecret":{"type":"boolean","description":"Événement accessible par lien seulement."},"waitingRoom":{"type":"string","description":"`OFF`, `AUTO` ou `ALWAYS`."},"waitingRoomCapacity":{"type":"integer","description":"1 à 100 000.","nullable":true}}},"Category":{"type":"object","properties":{"id":{"type":"integer","description":"Identifiant."},"name":{"type":"string","description":"Nom."},"position":{"type":"integer","description":"Ordre d’affichage."},"tickets":{"type":"array","items":{"$ref":"#/components/schemas/Ticket"}}}},"CategoryInput":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"1 à 120 caractères."},"position":{"type":"integer","description":"Ordre, 0 par défaut."}}},"Ticket":{"type":"object","description":"Un tarif (ce qui est mis en vente), à ne pas confondre avec un billet émis.","properties":{"id":{"type":"integer","description":"Identifiant."},"categoryId":{"type":"integer","description":"Catégorie."},"name":{"type":"string","description":"Nom."},"description":{"type":"string","description":"Description.","nullable":true},"type":{"type":"string","description":"Nature : `TICKET`, `TABLE_BOOKING`, `VOTE`, `STAFF`, `BENEVOLE`, `EXPOSANT`, `PRESTATAIRE`, `RESERVATION` (§4.6.3)."},"priceHT":{"type":"integer","description":"Prix unitaire en centimes, hors taxe."},"quantity":{"type":"integer","description":"Stock total."},"remaining":{"type":"integer","description":"Stock restant (commandes payées et en cours déduites)."},"admits":{"type":"integer","description":"Personnes admises par billet."},"hasDefinedExit":{"type":"boolean","description":"Entrées et sorties libres."},"notBuyable":{"type":"boolean","description":"Retiré de la vente publique."},"position":{"type":"integer","description":"Ordre d’affichage."},"unitLabel":{"type":"string","description":"Réservation : l’unité vendue (« m² », « table »).","nullable":true},"maxPerOrder":{"type":"integer","description":"Plafond par commande (§4.2.9).","nullable":true},"maxPerAccount":{"type":"integer","description":"Plafond par compte acheteur (§4.2.9).","nullable":true},"createdAt":{"type":"string","format":"date-time","description":"Création."},"updatedAt":{"type":"string","format":"date-time","description":"Dernière modification."}}},"TicketInput":{"type":"object","required":["name","priceHT","quantity"],"properties":{"name":{"type":"string","description":"1 à 120 caractères."},"description":{"type":"string","description":"2 000 caractères au plus."},"priceHT":{"type":"integer","description":"Centimes hors taxe, 0 pour un tarif gratuit."},"quantity":{"type":"integer","description":"Stock, 0 à 100 000."},"type":{"type":"string","description":"Nature du tarif, `TICKET` par défaut. Gelée dès qu’un billet est émis."},"hasDefinedExit":{"type":"boolean","description":"Entrées et sorties libres."},"admits":{"type":"integer","description":"1 à 50, gelé dès qu’un billet est émis."},"notBuyable":{"type":"boolean","description":"Retiré de la vente publique."},"position":{"type":"integer","description":"Ordre."},"unitLabel":{"type":"string","description":"Réservation seulement.","nullable":true},"maxPerOrder":{"type":"integer","description":"1 à 1 000.","nullable":true},"maxPerAccount":{"type":"integer","description":"1 à 1 000.","nullable":true}}},"OrderItem":{"type":"object","properties":{"ticketId":{"type":"integer","description":"Tarif."},"ticketName":{"type":"string","description":"Nom du tarif au moment de la commande."},"quantity":{"type":"integer","description":"Quantité."},"unitPriceHT":{"type":"integer","description":"Prix unitaire en centimes."}}},"Order":{"type":"object","properties":{"id":{"type":"integer","description":"Identifiant."},"orderNumber":{"type":"string","description":"Numéro lisible, `CMD-2026-000123`."},"reference":{"type":"string","description":"Référence interne."},"eventId":{"type":"integer","description":"Événement."},"status":{"type":"string","description":"`PENDING`, `PAID`, `CANCELLED`, `EXPIRED`, `REFUNDED`, `PARTIALLY_REFUNDED`."},"firstName":{"type":"string","description":"Prénom de l’acheteur."},"lastName":{"type":"string","description":"Nom de l’acheteur."},"email":{"type":"string","description":"Adresse de l’acheteur."},"locale":{"type":"string","description":"`fr` ou `en`."},"totalHT":{"type":"integer","description":"Total en centimes après remise."},"discountHT":{"type":"integer","description":"Remise appliquée, en centimes."},"promoCode":{"type":"string","description":"Code promo utilisé.","nullable":true},"platformFee":{"type":"integer","description":"Commission de la plateforme, en centimes."},"refundedAmount":{"type":"integer","description":"Montant remboursé, en centimes."},"paymentMethod":{"type":"string","description":"`card`, `accreditation`, `invitation`…","nullable":true},"paidAt":{"type":"string","format":"date-time","description":"Paiement.","nullable":true},"expiresAt":{"type":"string","format":"date-time","description":"Expiration d’une commande en attente.","nullable":true},"createdAt":{"type":"string","format":"date-time","description":"Création."},"items":{"type":"array","items":{"$ref":"#/components/schemas/OrderItem"}},"tickets":{"type":"array","items":{"$ref":"#/components/schemas/IssuedTicket"}}}},"IssuedTicket":{"type":"object","description":"Un billet émis — ce que porte l’acheteur. La clé de sécurité du QR n’est jamais exposée.","properties":{"reference":{"type":"string","description":"Référence imprimée sur le billet."},"orderId":{"type":"integer","description":"Commande."},"orderNumber":{"type":"string","description":"Numéro de commande."},"ticketId":{"type":"integer","description":"Tarif."},"ticketName":{"type":"string","description":"Nom du tarif."},"type":{"type":"string","description":"Nature."},"state":{"type":"string","description":"`VALID`, `USED`, `CANCELLED`, `REFUNDED`."},"admits":{"type":"integer","description":"Personnes admises."},"units":{"type":"integer","description":"Réservation : unités réservées."},"unitLabel":{"type":"string","description":"Réservation : unité.","nullable":true},"unitPriceHT":{"type":"integer","description":"Prix payé, en centimes."},"isInvitation":{"type":"boolean","description":"Invitation offerte par l’organisateur."},"hasDefinedExit":{"type":"boolean","description":"Entrées et sorties libres."},"scanCount":{"type":"integer","description":"Passages enregistrés."},"firstScannedAt":{"type":"string","format":"date-time","description":"Premier passage.","nullable":true},"holder":{"type":"string","description":"Nom du porteur."},"createdAt":{"type":"string","format":"date-time","description":"Émission."}}},"PromoCode":{"type":"object","properties":{"id":{"type":"integer","description":"Identifiant."},"code":{"type":"string","description":"Code, normalisé en majuscules."},"label":{"type":"string","description":"Libellé interne.","nullable":true},"kind":{"type":"string","description":"`PERCENT` ou `AMOUNT`."},"value":{"type":"integer","description":"Pourcentage (1–100) ou montant en centimes."},"scope":{"type":"string","description":"`ORDER` (sur le total) ou `TICKET` (par billet éligible)."},"maxUses":{"type":"integer","description":"Utilisations maximales.","nullable":true},"maxPerOrder":{"type":"integer","description":"Billets remisés par commande.","nullable":true},"minAmount":{"type":"integer","description":"Minimum de commande, en centimes.","nullable":true},"startsAt":{"type":"string","format":"date-time","description":"Début de validité.","nullable":true},"endsAt":{"type":"string","format":"date-time","description":"Fin de validité.","nullable":true},"isActive":{"type":"boolean","description":"Actif."},"uses":{"type":"integer","description":"Utilisations."},"remaining":{"type":"integer","description":"Utilisations restantes.","nullable":true},"ticketIds":{"type":"array","items":{"type":"integer","description":"Tarifs éligibles ; vide = tous."}}}},"PromoCodeInput":{"type":"object","required":["code","kind","value"],"properties":{"code":{"type":"string","description":"3 à 32 caractères ; ne se modifie plus après création."},"label":{"type":"string","description":"Libellé interne."},"kind":{"type":"string","description":"`PERCENT` ou `AMOUNT`."},"value":{"type":"integer","description":"Pourcentage ou centimes."},"scope":{"type":"string","description":"`ORDER` par défaut, ou `TICKET`."},"ticketIds":{"type":"array","items":{"type":"integer","description":"Tarifs éligibles."}},"maxUses":{"type":"integer","description":"Utilisations maximales.","nullable":true},"maxPerOrder":{"type":"integer","description":"Billets remisés par commande.","nullable":true},"minAmount":{"type":"integer","description":"Minimum de commande, en centimes.","nullable":true},"startsAt":{"type":"string","format":"date-time","description":"Début.","nullable":true},"endsAt":{"type":"string","format":"date-time","description":"Fin.","nullable":true},"isActive":{"type":"boolean","description":"Actif, vrai par défaut."}}},"AccreditationInput":{"type":"object","required":["kind","firstName","lastName","quantity"],"properties":{"kind":{"type":"string","description":"`STAFF`, `BENEVOLE`, `EXPOSANT`, `PRESTATAIRE` ou `INVITATION`."},"ticketId":{"type":"integer","description":"Tarif support d’une invitation (obligatoire pour `INVITATION`)."},"firstName":{"type":"string","description":"Prénom du porteur."},"lastName":{"type":"string","description":"Nom du porteur."},"email":{"type":"string","description":"Adresse du porteur ; obligatoire si `send` est vrai."},"quantity":{"type":"integer","description":"1 à 50 billets."},"admits":{"type":"integer","description":"Personnes admises par billet (accréditations), 1 par défaut."},"label":{"type":"string","description":"Mention libre reportée sur le billet (« Accueil samedi »)."},"send":{"type":"boolean","description":"Envoyer les billets par email au porteur."}}},"AccreditationResult":{"type":"object","properties":{"order":{"type":"object","properties":{"id":{"type":"integer","description":"Commande."},"orderNumber":{"type":"string","description":"Numéro."},"token":{"type":"string","description":"Jeton d’accès à l’espace commande."}}},"kind":{"type":"string","description":"Nature."},"holder":{"type":"string","description":"Porteur."},"sent":{"type":"boolean","description":"Email envoyé."},"tickets":{"type":"array","items":{"type":"object","properties":{"reference":{"type":"string","description":"Référence."},"ticketName":{"type":"string","description":"Nom."}}}},"bundleUrl":{"type":"string","description":"PDF des billets (session organisateur requise)."},"badgesUrl":{"type":"string","description":"PDF des badges, accréditations seulement.","nullable":true}}},"ScanInput":{"type":"object","required":["code"],"properties":{"code":{"type":"string","description":"Contenu du QR (`RÉFÉRENCE|CLÉ`) ou la seule référence saisie à la main."},"force":{"type":"boolean","description":"Passage forcé d’un billet déjà utilisé, assumé par le contrôleur."},"scannedAt":{"type":"string","format":"date-time","description":"Horodatage réel, pour un scan différé (hors-ligne)."}}},"ScanResult":{"type":"object","properties":{"result":{"type":"string","description":"`accepted`, `already_used`, `unknown`, `invalid_key`, `wrong_event`, `refunded`, `cancelled`."},"reference":{"type":"string","description":"Référence lue."},"ticketName":{"type":"string","description":"Nom du tarif."},"holder":{"type":"string","description":"Porteur."},"orderNumber":{"type":"string","description":"Commande."},"admits":{"type":"integer","description":"Personnes à laisser entrer."},"units":{"type":"integer","description":"Réservation : unités."},"unitLabel":{"type":"string","description":"Réservation : unité.","nullable":true},"multiPass":{"type":"boolean","description":"Billet à passages illimités."},"forced":{"type":"boolean","description":"Passage forcé."},"scanCount":{"type":"integer","description":"Passages cumulés."},"firstScannedAt":{"type":"string","format":"date-time","description":"Premier passage, pour un refus `already_used`.","nullable":true}}},"Scan":{"type":"object","properties":{"id":{"type":"integer","description":"Identifiant."},"reference":{"type":"string","description":"Référence lue.","nullable":true},"ticketName":{"type":"string","description":"Tarif.","nullable":true},"result":{"type":"string","description":"Verdict."},"forced":{"type":"boolean","description":"Passage forcé."},"scannedAt":{"type":"string","format":"date-time","description":"Instant."}}}}},"paths":{"/me":{"get":{"summary":"Le compte et la clé","description":"Vérifie une clé et renvoie le compte qui la porte, son offre et ses limites.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Compte"]}},"/events":{"get":{"summary":"Lister mes événements","description":"Événements du compte, du plus récent au plus ancien, avec leur fréquentation.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Event"}},"page":{"type":"integer","description":"Page."},"limit":{"type":"integer","description":"Taille de page."},"total":{"type":"integer","description":"Total."}}}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Événements"],"parameters":[{"name":"status","in":"query","schema":{"type":"string","enum":["DRAFT","PUBLISHED","CANCELLED","ARCHIVED"]}},{"name":"when","in":"query","schema":{"type":"string","enum":["upcoming","past"]}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}}]}},"/events/{id}":{"get":{"summary":"Un événement","description":"Avec ses catégories, ses tarifs et leur stock restant.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object","properties":{"event":{"$ref":"#/components/schemas/Event"}}}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Événements"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."}]},"patch":{"summary":"Modifier un événement","description":"Description, lieu, délai de remboursement, salle d’attente. Droit `write`.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object","properties":{"event":{"$ref":"#/components/schemas/Event"}}}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Événements"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventPatch"}}}}}},"/events/{id}/attendance":{"get":{"summary":"Fréquentation","description":"Vendus, passés, attendus, présents — et le détail par tarif.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Attendance"}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Événements"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."}]}},"/events/{id}/categories":{"get":{"summary":"Catégories et tarifs","description":"Toutes les catégories, avec leurs tarifs et le stock restant.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object","properties":{"categories":{"type":"array","items":{"$ref":"#/components/schemas/Category"}}}}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Tarifs"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."}]},"post":{"summary":"Créer une catégorie","description":"Soumise aux limites de l’offre (`offer_limit`). Droit `write`.","security":[{"apiKey":[]}],"responses":{"201":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object","properties":{"category":{"$ref":"#/components/schemas/Category"}}}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Tarifs"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryInput"}}}}}},"/events/{id}/categories/{categoryId}":{"patch":{"summary":"Renommer ou réordonner une catégorie","description":"Droit `write`.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object","properties":{"category":{"$ref":"#/components/schemas/Category"}}}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Tarifs"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."},{"name":"categoryId","in":"path","required":true,"schema":{"type":"integer"},"description":"Catégorie."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryInput"}}}}},"delete":{"summary":"Supprimer une catégorie vide","description":"Refusé (`category_not_empty`) tant qu’elle porte des tarifs. Droit `write`.","security":[{"apiKey":[]}],"responses":{"204":{"description":"Supprimée."},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Non vide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Tarifs"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."},{"name":"categoryId","in":"path","required":true,"schema":{"type":"integer"},"description":"Catégorie."}]}},"/events/{id}/categories/{categoryId}/tickets":{"post":{"summary":"Créer un tarif","description":"Soumis aux limites de l’offre. Droit `write`.","security":[{"apiKey":[]}],"responses":{"201":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object","properties":{"ticket":{"$ref":"#/components/schemas/Ticket"}}}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Tarifs"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."},{"name":"categoryId","in":"path","required":true,"schema":{"type":"integer"},"description":"Catégorie."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketInput"}}}}}},"/events/{id}/tickets/{ticketId}":{"patch":{"summary":"Modifier un tarif","description":"Mêmes gels que l’interface : `type_frozen` et `admits_frozen` dès qu’un billet est émis, `quantity_below_sold` si le stock descend sous le vendu. `categoryId` déplace le tarif. Droit `write`.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object","properties":{"ticket":{"$ref":"#/components/schemas/Ticket"}}}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Gel.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Tarifs"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."},{"name":"ticketId","in":"path","required":true,"schema":{"type":"integer"},"description":"Tarif."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketInput"}}}}},"delete":{"summary":"Supprimer un tarif jamais commandé","description":"Sinon `ticket_in_use` : passez-le `notBuyable`. Droit `write`.","security":[{"apiKey":[]}],"responses":{"204":{"description":"Supprimé."},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Déjà commandé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Tarifs"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."},{"name":"ticketId","in":"path","required":true,"schema":{"type":"integer"},"description":"Tarif."}]}},"/events/{id}/orders":{"get":{"summary":"Commandes d’un événement","description":"`since` (ISO 8601) renvoie ce qui a changé depuis : de quoi synchroniser un outil tiers.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Order"}},"page":{"type":"integer","description":"Page."},"limit":{"type":"integer","description":"Taille de page."},"total":{"type":"integer","description":"Total."}}}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Commandes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."},{"name":"status","in":"query","schema":{"type":"string"}},{"name":"since","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"email","in":"query","schema":{"type":"string","format":"email"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}}]}},"/orders/{orderNumber}":{"get":{"summary":"Une commande","description":"Par son numéro, avec ses lignes et ses billets émis.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object","properties":{"order":{"$ref":"#/components/schemas/Order"}}}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Commandes"],"parameters":[{"name":"orderNumber","in":"path","required":true,"schema":{"type":"string"}}]}},"/orders/{orderNumber}/resend":{"post":{"summary":"Renvoyer la confirmation","description":"Billets et facture, à l’adresse d’origine ou à `email`. Droit `write`.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Commande non payée (`not_paid`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Commandes"],"parameters":[{"name":"orderNumber","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","description":"Autre destinataire."}}}}}}}},"/events/{id}/issued-tickets":{"get":{"summary":"Billets émis","description":"Tous les billets d’un événement, filtrables par état et par tarif.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IssuedTicket"}},"page":{"type":"integer","description":"Page."},"limit":{"type":"integer","description":"Taille de page."},"total":{"type":"integer","description":"Total."}}}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Billets"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."},{"name":"state","in":"query","schema":{"type":"string","enum":["VALID","USED","CANCELLED","REFUNDED"]}},{"name":"ticketId","in":"query","schema":{"type":"integer"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}}]}},"/issued-tickets/{reference}":{"get":{"summary":"Un billet par sa référence","description":"Avec ses vingt derniers passages.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object","properties":{"ticket":{"$ref":"#/components/schemas/IssuedTicket"}}}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Billets"],"parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string"}}]}},"/events/{id}/promo-codes":{"get":{"summary":"Codes promo","description":"Tous les codes de l’événement.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object","properties":{"codes":{"type":"array","items":{"$ref":"#/components/schemas/PromoCode"}}}}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Codes promo"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."}]},"post":{"summary":"Créer un code promo","description":"`code_taken` si le code existe déjà sur l’événement. Droit `write`.","security":[{"apiKey":[]}],"responses":{"201":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"$ref":"#/components/schemas/PromoCode"}}}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Codes promo"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCodeInput"}}}}}},"/events/{id}/promo-codes/{promoId}":{"patch":{"summary":"Modifier un code promo","description":"Tout sauf le code lui-même. Droit `write`.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"$ref":"#/components/schemas/PromoCode"}}}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Codes promo"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."},{"name":"promoId","in":"path","required":true,"schema":{"type":"integer"},"description":"Code."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCodeInput"}}}}},"delete":{"summary":"Supprimer un code promo","description":"Un code déjà utilisé n’est pas supprimé mais désactivé (`promo_used_deactivated`). Droit `write`.","security":[{"apiKey":[]}],"responses":{"204":{"description":"Supprimé."},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Désactivé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Codes promo"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."},{"name":"promoId","in":"path","required":true,"schema":{"type":"integer"},"description":"Code."}]}},"/events/{id}/accreditations":{"get":{"summary":"Accréditations et invitations émises","description":"Chaque émission est une commande gratuite, avec ses billets.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Order"}},"page":{"type":"integer","description":"Page."},"limit":{"type":"integer","description":"Taille de page."},"total":{"type":"integer","description":"Total."}}}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Accréditations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}}]},"post":{"summary":"Émettre des accréditations ou des invitations","description":"Mêmes billets que l’interface : QR, clé, PDF archivé, email si `send`. Les invitations exigent l’offre Basic (`offer_feature`). Droit `write`.","security":[{"apiKey":[]}],"responses":{"201":{"description":"Succès.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccreditationResult"}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Accréditations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccreditationInput"}}}}}},"/events/{id}/scan":{"post":{"summary":"Contrôler un billet","description":"Le même verdict que l’application de contrôle, journalisé de la même façon. Droit `scan`.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanResult"}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Contrôle"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanInput"}}}}}},"/events/{id}/scans":{"get":{"summary":"Historique des passages","description":"Du plus récent au plus ancien, refus compris.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Scan"}},"page":{"type":"integer","description":"Page."},"limit":{"type":"integer","description":"Taille de page."},"total":{"type":"integer","description":"Total."}}}}}},"401":{"description":"Clé absente, invalide, révoquée ou expirée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Offre insuffisante, droit (`scope`) manquant ou compte indisponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource inconnue ou appartenant à un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Entrée invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop de requêtes pour cette clé : lire `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Contrôle"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifiant de l’événement."},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}}]}}}}