Documentation API Passpam v1
L’API REST v1 de Passpam permet à vos applications, sites partenaires et outils métier de lire et de créer des événements, des commandes et des billets, de scanner des entrées et de recevoir des webhooks — sans jamais contourner les règles de la plateforme (inventaire, tarification, paiements).
GET https://passpam.com/api/v1/public/events?category=music&per_page=20
URL de base : https://passpam.com/api/v1. La spécification OpenAPI 3.1 est générée depuis le code et toujours à jour : openapi.json.
Authentification
Clés API (serveur à serveur)
Créées dans Organizer › Intégrations. Envoyez la clé dans l’en-tête Authorization (Bearer). Elle n’est affichée qu’une fois.
curl https://passpam.com/api/v1/events \
-H "Authorization: Bearer pp_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
- Chaque clé porte des scopes (events:read, orders:write…) : une route exige le scope indiqué, sinon 403 insufficient_scope.
- Une clé est liée à une organisation (ou à un compte revendeur) : toute ressource d’une autre organisation renvoie 404.
- Une clé pp_test_… est en lecture seule sur les données réelles (403 test_mode_read_only sur toute écriture).
- Rotation : la nouvelle clé est active immédiatement, l’ancienne expire après la période de transition (24 h par défaut). Révocation : immédiate.
Jetons utilisateur (application Passpam)
Pour l’application officielle : POST /auth/login renvoie un access token (1 h) et un refresh token (30 j, à usage unique — chaque refresh en renvoie un nouveau). Les routes /me/* et les routes d’organisation sont accessibles selon les permissions du membre.
POST /api/v1/auth/login
{"email": "…", "password": "…", "device": {"platform": "android", "name": "Pixel 8"}}
→ {"success": true, "data": {"access_token": "pat_…", "refresh_token": "prt_…", "expires_in": 3600, …}}
Conventions
Enveloppe de réponse
{"success": true, "data": { … }, "meta": { … }}
{"success": false, "error": {"code": "validation_error", "message": "…", "details": {"email": "…"}}, "meta": {"request_id": "…"}}
Pagination, filtres et tri
Toutes les collections sont paginées (page, per_page ≤ 100). Les filtres sont explicites (status, event_id, created_after…). Le tri n’accepte que les champs listés (sort, direction), tout autre champ renvoie 422.
GET /api/v1/orders?status=confirmed&event_id=…&sort=created_at&direction=desc&page=2&per_page=50
"meta": {"pagination": {"current_page": 2, "per_page": 50, "total": 1234, "last_page": 25, "next": "/api/v1/orders?page=3&…", "previous": "/api/v1/orders?page=1&…"}}
Formats
- Identifiants : UUID publics uniquement (jamais d’identifiant numérique interne).
- Dates : ISO 8601 avec le fuseau de l’événement, ou UTC (suffixe Z) :
2027-03-20T19:00:00-04:00 - Montants : chaîne décimale + devise, jamais un flottant :
{"amount": "5000.00", "currency": "HTG"} - Corps de requête : application/json uniquement (415 sinon), 1 Mo max.
Idempotence
Sur POST / PATCH / DELETE, envoyez Idempotency-Key (8-190 caractères). La même requête pendant 24 h renvoie la même réponse (en-tête Idempotent-Replayed: true) ; la même clé avec un corps différent renvoie 409 idempotency_key_reused. Indispensable pour la création de commandes.
POST /api/v1/orders
Idempotency-Key: order-2027-000123
Content-Type: application/json
Limites de débit
Par clé (ou par IP pour l’API publique) et par groupe de routes : public (300/min), lecture (600/min), écriture (120/min), sensible — paiement, remboursement, annulation — (30/min), authentification (20/min). Au-delà : 429 rate_limit_exceeded avec Retry-After.
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 597
X-RateLimit-Reset: 1790452740
Retry-After: 12 (429 rate_limit_exceeded)
Versions et dépréciation
Le chemin porte la version (/api/v1). Un changement incompatible sera publié en v2 ; v1 restera disponible avec une période de transition annoncée par les en-têtes Deprecation et Sunset et dans le changelog. Les codes d’erreur sont stables ; les messages peuvent être localisés (Accept-Language).
Codes d’erreur
Basez votre intégration sur error.code, jamais sur le message.
| error.code | HTTP |
|---|---|
validation_error | 422 |
invalid_credentials | 401 |
mfa_required | 401 |
unauthenticated | 401 |
token_expired | 401 |
token_revoked | 401 |
invalid_api_key | 401 |
api_key_revoked | 401 |
api_key_expired | 401 |
ip_not_allowed | 403 |
insufficient_scope | 403 |
permission_denied | 403 |
test_mode_read_only | 403 |
resource_not_found | 404 |
method_not_allowed | 405 |
conflict | 409 |
idempotency_key_reused | 409 |
idempotency_in_progress | 409 |
invalid_state | 409 |
inventory_unavailable | 409 |
ticket_already_used | 409 |
payment_required | 402 |
rate_limit_exceeded | 429 |
unsupported_media_type | 415 |
payload_too_large | 413 |
bad_request | 400 |
organization_suspended | 403 |
event_unavailable | 409 |
internal_error | 500 |
not_implemented | 501 |
device_not_authorized | 403 |
wallet_not_configured | 501 |
update_required | 426 |
maintenance | 503 |
service_unavailable | 503 |
checkout_expired | 410 |
account_unverified | 403 |
ticket_not_active | 409 |
ticket_other_device | 409 |
ticket_not_bound | 409 |
Meta
GET / Informations sur l’API (version, liens, état de dépréciation)
Sans authentification. · débit : public
curl -X GET https://passpam.com/api/v1/
GET /scopes Catalogue des scopes de clés API
Sans authentification. · débit : public
curl -X GET https://passpam.com/api/v1/scopes
GET /ping Vérifie un jeton : renvoie le porteur (type, organisation, scopes, mode)
Clé d’organisation ou jeton utilisateur membre. · débit : default
curl -X GET https://passpam.com/api/v1/ping \
-H "Authorization: Bearer "
Public
GET /public/events Événements publiés (paginés, filtrables)
Sans authentification. · débit : public
Paramètres de requête
categorystring— slug de catégoriecitystringorganizationstring— slug organisateurevent_typestring— physical | online | hybridqstring— recherche textestarts_afterdatetimestarts_beforedatetimecoming_soonboolean— 1 = seulement les « Bientôt » (FEAT-053)sortstring— starts_at | published_at | titledirectionstring— asc | descpageintegerper_pageinteger— max 100
curl -X GET https://passpam.com/api/v1/public/events
GET /public/events/{slug} Détail d’un événement publié (par slug ou uuid) avec types de billets et disponibilités ; features (follow, waitlist, addons) ; waitlist par billet complet
Sans authentification. · débit : public
Paramètres de requête
include_addonsboolean— 1 = inclure les articles en plus (is_addon) — applis 2.3+
curl -X GET https://passpam.com/api/v1/public/events/…
GET /public/events/{slug}/seats Plan de salle (FEAT-057, applis 2.4) : blocs, rangées, places libres ; choix retenu par POST /checkout (seats)
Sans authentification. · débit : public
curl -X GET https://passpam.com/api/v1/public/events/…/seats
POST /public/events/{slug}/waitlist Liste d’attente d’un billet complet (FEAT-054) — même réponse qu’une adresse soit nouvelle ou déjà inscrite
Sans authentification. · débit : public
Corps (JSON)
ticket_type_idstringrequis — uuidemailstringrequisphonestringnamestringquantityintegerlanguagestring— fr | en | ht
curl -X POST https://passpam.com/api/v1/public/events/…/waitlist \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /public/events/{slug}/alert Être prévenu(e) à l’ouverture de la billetterie (événement « Bientôt ») — une seule alerte, coordonnées gardées par Passpam
Sans authentification. · débit : public
Corps (JSON)
emailstring— courriel (ou phone)phonestring— numéro pour un SMS (facultatif)languagestring— fr | en | ht
curl -X POST https://passpam.com/api/v1/public/events/…/alert \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /public/artists Artistes publiés (FEAT-061) — recherche et filtre par genre, paginés
Sans authentification. · débit : public
Paramètres de requête
qstring— nomgenrestring— clé du genre (ex. kompa)pageintegerper_pageinteger— max 100
curl -X GET https://passpam.com/api/v1/public/artists
GET /public/artists/{slug} Profil d’un artiste : photo, bio, genres, réseaux, événements à venir et passés, follow {available, followers}
Sans authentification. · débit : public
curl -X GET https://passpam.com/api/v1/public/artists/…
POST /public/tickets/lookup/start Retrouver mes billets (sans compte) : envoie un code à 6 chiffres SI des billets correspondent — réponse toujours identique (lookup_id, channel, masked, expires_in)
Sans authentification. · débit : sensitive
Corps (JSON)
contactstringrequis — e-mail ou numéro (WhatsApp)languagestring— fr | en | ht
curl -X POST https://passpam.com/api/v1/public/tickets/lookup/start \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /public/tickets/lookup/verify Vérifie le code (5 essais, 10 min) → billets avec leur lien sécurisé (ticket_url, null pour un billet donné), accès 30 min ; 422 invalid_code / code_expired / code_locked
Sans authentification. · débit : sensitive
Corps (JSON)
lookup_idstringrequiscodestringrequis
curl -X POST https://passpam.com/api/v1/public/tickets/lookup/verify \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /public/categories Catégories d’événements
Sans authentification. · débit : public
curl -X GET https://passpam.com/api/v1/public/categories
GET /public/partners Partenaires affichés (nom, logo_url, website_url) — liste vide si aucun
Sans authentification. · débit : public
curl -X GET https://passpam.com/api/v1/public/partners
Cashless
GET /cashless/ping Caisse reliée : événement, devises, plafonds hors ligne (en-tête X-Cashless-Key)
Sans authentification. · débit : cashless
curl -X GET https://passpam.com/api/v1/cashless/ping
POST /cashless/identify Billet ou bracelet scanné : prénom, type, soldes (offert / payé) par devise
Sans authentification. · débit : cashless
Corps (JSON)
codestringrequis — contenu du QR du billet ou du bracelet
curl -X POST https://passpam.com/api/v1/cashless/identify \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /cashless/charge Dépense (crédit offert d’abord) — idempotente par référence
Sans authentification. · débit : cashless
Corps (JSON)
codestringrequisamountnumberrequiscurrencystringrequis — HTG | USDreferencestringrequis — identifiant unique de la vente dans la caissestandstring
curl -X POST https://passpam.com/api/v1/cashless/charge \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /cashless/topup Recharge en espèces encaissée par l’organisateur — idempotente
Sans authentification. · débit : cashless
Corps (JSON)
codestringrequisamountnumberrequiscurrencystringrequis — HTG | USDreferencestringrequis
curl -X POST https://passpam.com/api/v1/cashless/topup \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /cashless/refund Annule une dépense (rend offert et payé)
Sans authentification. · débit : cashless
Corps (JSON)
charge_referencestringrequisreferencestringrequis
curl -X POST https://passpam.com/api/v1/cashless/refund \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /cashless/offline-pack Paquet hors ligne : empreintes des codes, soldes, plafonds
Sans authentification. · débit : cashless
curl -X GET https://passpam.com/api/v1/cashless/offline-pack
POST /cashless/sync Envoie les opérations faites hors ligne (jusqu’à 500)
Sans authentification. · débit : cashless
Corps (JSON)
operationsarrayrequis — [{reference, type: charge
curl -X POST https://passpam.com/api/v1/cashless/sync \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
Auth
POST /auth/login Connexion application : access token (1 h) + refresh token (30 j)
Sans authentification. · débit : auth
Corps (JSON)
emailstringrequispasswordstringrequisdeviceobject— {platform: ios
curl -X POST https://passpam.com/api/v1/auth/login \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /auth/social FEAT-058 : connexion / inscription avec Google, Apple ou Facebook (jeton du SDK natif) → jetons, ou inscription à finaliser (signup_token)
Sans authentification. · débit : auth
Corps (JSON)
providerstringrequis — google | apple | facebooktokenstring— id_token (Google, Apple) ou jeton d’accès (Facebook)noncestringsignup_tokenstringfirst_namestringlast_namestringphonestringcountry_codestringterms_acceptedbooleandeviceobject
curl -X POST https://passpam.com/api/v1/auth/social \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /auth/social/exchange Applis 2.4 : code passpam://auth/social?code=… (connexion Google / Facebook dans le navigateur du téléphone) → jetons
Sans authentification. · débit : auth
Corps (JSON)
codestringrequisdeviceobject
curl -X POST https://passpam.com/api/v1/auth/social/exchange \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /auth/refresh Renouvelle la paire de jetons (refresh token à usage unique)
Sans authentification. · débit : auth
Corps (JSON)
refresh_tokenstringrequis
curl -X POST https://passpam.com/api/v1/auth/refresh \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /auth/logout Déconnexion de l’appareil courant
Jeton utilisateur uniquement. · débit : auth
curl -X POST https://passpam.com/api/v1/auth/logout \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /auth/sessions Appareils connectés
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/auth/sessions \
-H "Authorization: Bearer "
DELETE /auth/sessions/{uuid} Révoque un appareil
Jeton utilisateur uniquement. · débit : auth
curl -X DELETE https://passpam.com/api/v1/auth/sessions/… \
-H "Authorization: Bearer "
Me
GET /me Profil de l’utilisateur du jeton
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/me \
-H "Authorization: Bearer "
PATCH /me Met à jour le profil
Jeton utilisateur uniquement. · débit : write
Corps (JSON)
first_namestringlast_namestringphonestringcountry_codestring— ISO 3166-1 alpha-2 (HT, US…)birth_datestring— AAAA-MM-JJ (13 ans minimum)genderstring— female | male | other | undisclosedcitystringaddress_linestringpreferred_languagestring— fr | ht | entimezonestring
curl -X PATCH https://passpam.com/api/v1/me \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /me/tickets Mes billets (chaque billet : protection FEAT-059 ou null ; la liste ne lie jamais d’appareil)
Jeton utilisateur uniquement. · débit : default
Paramètres de requête
scopestring— upcoming | past | allpageintegerper_pageinteger
curl -X GET https://passpam.com/api/v1/me/tickets \
-H "Authorization: Bearer "
GET /me/tickets/{uuid} Un billet avec son QR (billet valide, événement à venir) ; FEAT-059 protection {state: pending|active|other_device|over, activates_at, bound_here, transfer_locked, screenshot_protection, message} ou null — billet protégé : qr = QR animé (PPD1, 30 s) seulement s’il est actif et lié à cet appareil (lié à l’affichage), sinon null
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/me/tickets/… \
-H "Authorization: Bearer "
GET /me/tickets/{uuid}/dynamic-qr QR dynamique courant (payload signé, svg, expires_at, ttl) — 404 dynamic_qr_unavailable si non activé. FEAT-059 billet protégé : lie l’appareil au 1er appel une fois actif (ttl 30) ; 409 ticket_not_active (details.activates_at) / 409 ticket_other_device
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/me/tickets/…/dynamic-qr \
-H "Authorization: Bearer "
GET /me/tickets/{uuid}/dynamic-qr/batch Billet protégé ACTIF et lié à cet appareil : {ttl:30, tokens:[{payload, valid_from, expires_at}]} de maintenant à maintenant + minutes (≤ prefetch_minutes) ; chaque jeton n’est accepté que dans sa fenêtre. 409 ticket_not_active / ticket_other_device / ticket_not_bound, 429 si trop de demandes ; no-store
Jeton utilisateur uniquement. · débit : sensitive
Paramètres de requête
minutesinteger— 1 à prefetch_minutes (réglage Passpam, 120 par défaut)
curl -X GET https://passpam.com/api/v1/me/tickets/…/dynamic-qr/batch \
-H "Authorization: Bearer "
POST /me/avatar Photo de profil (FEAT-032) — réencodée en WebP carré 400 px + miniature 96 px ; renvoie le profil
Jeton utilisateur uniquement. · débit : sensitive
Corps (JSON)
image_base64stringrequis — JPEG/PNG/WebP en base64 (≤ 5 Mo, ≥ 64 px), redimensionnée côté app
curl -X POST https://passpam.com/api/v1/me/avatar \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
DELETE /me/avatar Retire la photo de profil ; renvoie le profil
Jeton utilisateur uniquement. · débit : write
curl -X DELETE https://passpam.com/api/v1/me/avatar \
-H "Authorization: Bearer "
POST /me/tickets/{uuid}/photo Photo du participant (si demandée par l’organisateur), modifiable jusqu’à la première entrée — image redimensionnée côté app (corps ≤ 1 Mo)
Jeton utilisateur uniquement. · débit : sensitive
Corps (JSON)
image_base64stringrequis — JPEG/PNG/WebP en base64, ≥ 120 px
curl -X POST https://passpam.com/api/v1/me/tickets/…/photo \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /me/tickets/{uuid}/holder Donne le billet à quelqu’un (nouveau QR envoyé, l’ancien ne passe plus) ou corrige le nom — fonction « Transfert de billet » et délai réglés par le super administrateur
Jeton utilisateur uniquement. · débit : sensitive
Corps (JSON)
first_namestringrequislast_namestringrequisemailstring— courriel (ou phone)phonestringmessagestring— 2.53.0 — mot pour le destinataire, ≤ 280 caractères, texte brut
curl -X POST https://passpam.com/api/v1/me/tickets/…/holder \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /me/tickets/{uuid}/live Événement en ligne : lien Zoom / Meet (type link) ou vidéo YouTube (type youtube), seulement pendant la fenêtre d’accès — 409 invalid_state sinon
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/me/tickets/…/live \
-H "Authorization: Bearer "
GET /me/following Organisateurs suivis
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/me/following \
-H "Authorization: Bearer "
GET /me/following/artists Artistes suivis (FEAT-061)
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/me/following/artists \
-H "Authorization: Bearer "
POST /me/following/artists Suivre / ne plus suivre un artiste (FEAT-061) — 403 si « Suivre » est désactivé
Jeton utilisateur uniquement. · débit : write
Corps (JSON)
artiststringrequis — slugfollowbooleanrequis
curl -X POST https://passpam.com/api/v1/me/following/artists \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /me/following Suivre / ne plus suivre un organisateur
Jeton utilisateur uniquement. · débit : write
Corps (JSON)
organizationstringrequis — slugfollowbooleanrequis
curl -X POST https://passpam.com/api/v1/me/following \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /me/orders Mes commandes
Jeton utilisateur uniquement. · débit : default
Paramètres de requête
statusstringpageintegerper_pageinteger
curl -X GET https://passpam.com/api/v1/me/orders \
-H "Authorization: Bearer "
POST /me/orders/{uuid}/give Donne plusieurs billets de SA commande (≤ 20) avec un message commun facultatif ; résultat billet par billet {ticket_id, transferred, recipient_has_account, error}
Jeton utilisateur uniquement. · débit : sensitive
Corps (JSON)
itemsarrayrequis — [{ticket_id, first_name, last_name, email?, phone?}]messagestring— ≤ 280 caractères, texte brut
curl -X POST https://passpam.com/api/v1/me/orders/…/give \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /me/orders/{uuid} Une commande (lignes, billets, paiements)
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/me/orders/… \
-H "Authorization: Bearer "
GET /me/notifications Notifications in-app
Jeton utilisateur uniquement. · débit : default
Paramètres de requête
unreadstring— 0 | 1pageintegerper_pageinteger
curl -X GET https://passpam.com/api/v1/me/notifications \
-H "Authorization: Bearer "
POST /me/notifications/{uuid}/read Marque une notification lue (uuid ou « all »)
Jeton utilisateur uniquement. · débit : write
curl -X POST https://passpam.com/api/v1/me/notifications/…/read \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /me/favorites Événements favoris
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/me/favorites \
-H "Authorization: Bearer "
POST /me/favorites/toggle Ajoute / retire un favori
Jeton utilisateur uniquement. · débit : write
Corps (JSON)
event_idstringrequis — uuid
curl -X POST https://passpam.com/api/v1/me/favorites/toggle \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
Mobile
GET /app/config Configuration des applications : versions minimale / recommandée, maintenance, fonctionnalités, liens
Sans authentification. · débit : public
curl -X GET https://passpam.com/api/v1/app/config
POST /auth/register Création de compte depuis l’application (même politique que le site) + jetons
Sans authentification. · débit : auth
Corps (JSON)
first_namestringrequislast_namestringrequisemailstringrequisphonestringpasswordstringrequislanguagestring— fr | ht | enterms_acceptedbooleanrequisdeviceobject— {platform, name, install_id, app_version}
curl -X POST https://passpam.com/api/v1/auth/register \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /auth/password/forgot Lien de réinitialisation par e-mail (réponse identique que le compte existe ou non)
Sans authentification. · débit : auth
Corps (JSON)
emailstringrequis
curl -X POST https://passpam.com/api/v1/auth/password/forgot \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /me/email/verify/resend Renvoie l’e-mail de vérification
Jeton utilisateur uniquement. · débit : auth
curl -X POST https://passpam.com/api/v1/me/email/verify/resend \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /me/contexts Contextes autorisés : Personnel, Organisateur, Revendeur, Scanner (meta.current)
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/me/contexts \
-H "Authorization: Bearer "
POST /me/context Change de contexte (revalidé par le serveur)
Jeton utilisateur uniquement. · débit : write
Corps (JSON)
idstringrequis — ex. organizer:<uuid>
curl -X POST https://passpam.com/api/v1/me/context \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /me/devices Mes appareils (sessions de l’application, état du push)
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/me/devices \
-H "Authorization: Bearer "
POST /me/delete-account Supprime (anonymise) le compte — mot de passe et confirmation « DELETE »
Jeton utilisateur uniquement. · débit : sensitive
Corps (JSON)
passwordstringrequisconfirmstringrequis — DELETE
curl -X POST https://passpam.com/api/v1/me/delete-account \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /me/tickets/{uuid}/wallet/{kind} FEAT-029 : pass Apple Wallet (pkpass_base64, pour PassKit) ou lien Google Wallet (save_url) — 501 wallet_not_configured si non activé, 409 wallet_unavailable si le billet n’est pas éligible
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/me/tickets/…/wallet/… \
-H "Authorization: Bearer "
GET /me/tickets/{uuid}/share-card/{format} FEAT-048 : carte « J’y serai ! / J’y suis ! / J’y étais ! » (story ou square) en JPEG base64 + textes de partage — sans QR ni numéro de billet ; 409 share_unavailable si le billet ne s’y prête pas
Jeton utilisateur uniquement. · débit : default
Paramètres de requête
nstring— 0 | 1pstring— 0 | 1bstring— 0 | 1lstring— fr | ht | en
curl -X GET https://passpam.com/api/v1/me/tickets/…/share-card/… \
-H "Authorization: Bearer "
POST /devices/push-token Enregistre le jeton push APNs / FCM de l’appareil
Jeton utilisateur uniquement. · débit : write
Corps (JSON)
platformstringrequis — ios | androidtokenstringrequisdevice_idstringrequis — identifiant d’installationapp_versionstringenvironmentstring— production | sandboxlocalestring— fr | ht | endevice_namestring
curl -X POST https://passpam.com/api/v1/devices/push-token \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
DELETE /devices/push-token Désactive le push de l’appareil
Jeton utilisateur uniquement. · débit : write
Corps (JSON)
tokenstringdevice_idstring
curl -X DELETE https://passpam.com/api/v1/devices/push-token \
-H "Authorization: Bearer "
GET /organizer/summary Tableau de bord Organisateur mobile (événements à venir, ventes du jour selon permissions)
Jeton utilisateur uniquement. · débit : default
Paramètres de requête
organization_idstring— uuid
curl -X GET https://passpam.com/api/v1/organizer/summary \
-H "Authorization: Bearer "
Organizer app
GET /organizer/form-options Catégories, devises, fuseaux, pays, moyens de versement (libellés traduits)
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/organizer/form-options \
-H "Authorization: Bearer "
GET /organizer/organizations Mes organisations et mes permissions
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/organizer/organizations \
-H "Authorization: Bearer "
POST /organizer/organizations Crée une organisation (vous en devenez propriétaire)
Jeton utilisateur uniquement. · débit : sensitive
Corps (JSON)
namestringrequiscountry_codestringdefault_currencystring— HTG | USDtimezonestringemailstringphonestringdescriptionstring
curl -X POST https://passpam.com/api/v1/organizer/organizations \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /organizer/organizations/{uuid} Profil de l’organisation
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/organizer/organizations/… \
-H "Authorization: Bearer "
PATCH /organizer/organizations/{uuid} Modifie le profil (champs envoyés seulement)
Jeton utilisateur uniquement. · permission organization.edit · débit : write
curl -X PATCH https://passpam.com/api/v1/organizer/organizations/… \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /organizer/organizations/{uuid}/logo Logo (image_base64, 200 × 200 minimum)
Jeton utilisateur uniquement. · permission organization.edit · débit : sensitive
curl -X POST https://passpam.com/api/v1/organizer/organizations/…/logo \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
DELETE /organizer/organizations/{uuid}/logo Retire le logo
Jeton utilisateur uniquement. · permission organization.edit · débit : write
curl -X DELETE https://passpam.com/api/v1/organizer/organizations/…/logo \
-H "Authorization: Bearer "
GET /organizer/organizations/{uuid}/events Événements de l’organisation
Jeton utilisateur uniquement. · permission event.view · débit : default
Paramètres de requête
statusstring— upcoming | draft | past
curl -X GET https://passpam.com/api/v1/organizer/organizations/…/events \
-H "Authorization: Bearer "
POST /organizer/organizations/{uuid}/events Crée un brouillon (dates en heure locale ; premier billet facultatif)
Jeton utilisateur uniquement. · permission event.create · débit : write
curl -X POST https://passpam.com/api/v1/organizer/organizations/…/events \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /organizer/organizations/{uuid}/team Équipe : membres, invitations, rôles
Jeton utilisateur uniquement. · permission team.manage · débit : default
curl -X GET https://passpam.com/api/v1/organizer/organizations/…/team \
-H "Authorization: Bearer "
POST /organizer/organizations/{uuid}/team/invitations Invite un membre par e-mail
Jeton utilisateur uniquement. · permission team.manage · débit : sensitive
Corps (JSON)
emailstringrequisrole_idintrequis
curl -X POST https://passpam.com/api/v1/organizer/organizations/…/team/invitations \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
DELETE /organizer/organizations/{uuid}/team/invitations/{id} Annule une invitation
Jeton utilisateur uniquement. · permission team.manage · débit : write
curl -X DELETE https://passpam.com/api/v1/organizer/organizations/…/team/invitations/… \
-H "Authorization: Bearer "
PATCH /organizer/organizations/{uuid}/team/members/{id} Change le rôle ou le statut d’un membre
Jeton utilisateur uniquement. · permission team.manage · débit : write
curl -X PATCH https://passpam.com/api/v1/organizer/organizations/…/team/members/… \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /organizer/organizations/{uuid}/payout-methods Moyens de versement (résumés masqués)
Jeton utilisateur uniquement. · permission finance.view · débit : default
curl -X GET https://passpam.com/api/v1/organizer/organizations/…/payout-methods \
-H "Authorization: Bearer "
POST /organizer/organizations/{uuid}/payout-methods Ajoute / modifie un moyen de versement (mot de passe exigé)
Jeton utilisateur uniquement. · permission finance.manage · débit : sensitive
curl -X POST https://passpam.com/api/v1/organizer/organizations/…/payout-methods \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /organizer/organizations/{uuid}/payout-methods/{id}/{action} default | disable (mot de passe exigé)
Jeton utilisateur uniquement. · permission finance.manage · débit : sensitive
curl -X POST https://passpam.com/api/v1/organizer/organizations/…/payout-methods/…/… \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /organizer/events/{uuid} Fiche complète : billets, liste « pour publier », chiffres, actions possibles
Jeton utilisateur uniquement. · permission event.view · débit : default
curl -X GET https://passpam.com/api/v1/organizer/events/… \
-H "Authorization: Bearer "
PATCH /organizer/events/{uuid} Modifie un événement (champs envoyés seulement)
Jeton utilisateur uniquement. · permission event.edit · débit : write
curl -X PATCH https://passpam.com/api/v1/organizer/events/… \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
DELETE /organizer/events/{uuid} Supprime un brouillon jamais publié
Jeton utilisateur uniquement. · permission event.delete · débit : write
curl -X DELETE https://passpam.com/api/v1/organizer/events/… \
-H "Authorization: Bearer "
POST /organizer/events/{uuid}/poster Affiche (image_base64)
Jeton utilisateur uniquement. · permission event.edit · débit : sensitive
curl -X POST https://passpam.com/api/v1/organizer/events/…/poster \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /organizer/events/{uuid}/ticket-types Ajoute un billet
Jeton utilisateur uniquement. · permission ticket.create · débit : write
Corps (JSON)
namestringrequiskindstring— paid | freepricestringquantityintrequis
curl -X POST https://passpam.com/api/v1/organizer/events/…/ticket-types \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /organizer/events/{uuid}/{action} publish | unpublish | cancel {reason} | duplicate
Jeton utilisateur uniquement. · débit : write
curl -X POST https://passpam.com/api/v1/organizer/events/…/… \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
PATCH /organizer/ticket-types/{uuid} Modifie un billet (nom, prix, quantité…)
Jeton utilisateur uniquement. · permission ticket.edit · débit : write
curl -X PATCH https://passpam.com/api/v1/organizer/ticket-types/… \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /organizer/ticket-types/{uuid}/{action} pause | resume
Jeton utilisateur uniquement. · permission ticket.pause · débit : write
curl -X POST https://passpam.com/api/v1/organizer/ticket-types/…/… \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
Checkout
POST /checkout Remplace le panier et réserve le stock ; plan de salle : seats = identifiants des places choisies
Sans authentification. · débit : write
Corps (JSON)
itemsarray— [{ticket_type_id, quantity}]seatsarray— [seat_id…] (GET /public/events/{slug}/seats)event_idstring— uuid de l’événement (obligatoire avec seats)
curl -X POST https://passpam.com/api/v1/checkout \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /checkout/{uuid} Panier : lignes, pricing serveur (fee_lines : frais de service / de traitement), temps restant, moyens de paiement, formulaires participants ; ?provider=code → frais de traitement de ce moyen (2.54.0)
Sans authentification. · débit : write
curl -X GET https://passpam.com/api/v1/checkout/…
POST /checkout/{uuid}/promo Applique un code promo
Sans authentification. · débit : write
Corps (JSON)
codestringrequis
curl -X POST https://passpam.com/api/v1/checkout/…/promo \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
DELETE /checkout/{uuid}/promo Retire le code promo
Sans authentification. · débit : write
curl -X DELETE https://passpam.com/api/v1/checkout/…/promo
POST /checkout/{uuid}/complete Crée la commande (client, participants, conditions)
Sans authentification. · débit : write
Corps (JSON)
customerobjectrequisattendeesobject— {item_id: [{first_name, last_name, email, answers}]}terms_acceptedbooleanrequismarketing_consentbooleanlanguagestringproviderstring— moyen de paiement choisi (frais de traitement, 2.54.0)
curl -X POST https://passpam.com/api/v1/checkout/…/complete \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /checkout/orders/{uuid} Commande (état waiting / processing / confirmed / failed / cancelled)
Sans authentification. · débit : write
curl -X GET https://passpam.com/api/v1/checkout/orders/…
POST /checkout/orders/{uuid}/pay Initie le paiement (PaymentService) — renvoie payment_url à ouvrir ; frais de traitement recalculés pour ce moyen (total et fee_lines à jour)
Sans authentification. · débit : write
Corps (JSON)
providerstringrequis
curl -X POST https://passpam.com/api/v1/checkout/orders/…/pay \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /checkout/orders/{uuid}/status Interroge le fournisseur puis renvoie l’état réel du paiement
Sans authentification. · débit : write
curl -X GET https://passpam.com/api/v1/checkout/orders/…/status
Scanner
GET /scanner/events Événements que je peux scanner (assignations)
Jeton utilisateur uniquement. · débit : write
curl -X GET https://passpam.com/api/v1/scanner/events \
-H "Authorization: Bearer "
GET /scanner/events/{uuid}/context Contexte résolu : porte, zone, session, permissions, compteurs
Jeton utilisateur uniquement. · débit : write
Paramètres de requête
gate_idintegeraccess_zone_idintegerevent_session_idinteger
curl -X GET https://passpam.com/api/v1/scanner/events/…/context \
-H "Authorization: Bearer "
POST /scanner/events/{uuid}/devices Enregistre cet appareil (clé renvoyée une seule fois)
Jeton utilisateur uniquement. · débit : write
Corps (JSON)
namestringrequisplatformstring— ios | android
curl -X POST https://passpam.com/api/v1/scanner/events/…/devices \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /scanner/events/{uuid}/validate Vérifie un billet sans l’enregistrer
Jeton utilisateur uniquement. · débit : write
curl -X POST https://passpam.com/api/v1/scanner/events/…/validate \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /scanner/events/{uuid}/checkin Enregistre une entrée (scan_request_id = idempotence) ; refus = 200 success:false + result (2.53.2 : qr_replaced = ancien QR d’un billet donné / réattribué, not_a_ticket = QR de l’affiche de l’événement) — afficher message
Jeton utilisateur uniquement. · débit : write
Corps (JSON)
payloadstringticket_uuidstringscan_request_idstringgate_idintegeraccess_zone_idintegerevent_session_idinteger
curl -X POST https://passpam.com/api/v1/scanner/events/…/checkin \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /scanner/events/{uuid}/checkout Enregistre une sortie
Jeton utilisateur uniquement. · débit : write
curl -X POST https://passpam.com/api/v1/scanner/events/…/checkout \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /scanner/events/{uuid}/override Entrée forcée (checkin.override, motif obligatoire)
Jeton utilisateur uniquement. · débit : write
curl -X POST https://passpam.com/api/v1/scanner/events/…/override \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /scanner/events/{uuid}/checkins/{checkin}/undo Annule un check-in (checkin.undo)
Jeton utilisateur uniquement. · débit : write
curl -X POST https://passpam.com/api/v1/scanner/events/…/checkins/…/undo \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /scanner/events/{uuid}/search Recherche manuelle (nom, numéro de billet)
Jeton utilisateur uniquement. · débit : write
Paramètres de requête
qstring
curl -X GET https://passpam.com/api/v1/scanner/events/…/search \
-H "Authorization: Bearer "
GET /scanner/events/{uuid}/tickets/{ticket} Statut d’un billet (+ historique selon permission)
Jeton utilisateur uniquement. · débit : write
curl -X GET https://passpam.com/api/v1/scanner/events/…/tickets/… \
-H "Authorization: Bearer "
GET /scanner/events/{uuid}/stats Statistiques de check-in en direct
Jeton utilisateur uniquement. · débit : write
curl -X GET https://passpam.com/api/v1/scanner/events/…/stats \
-H "Authorization: Bearer "
GET /scanner/events/{uuid}/tickets/{ticket}/access État IN / OUT, règles effectives, bracelet, frise des mouvements
Jeton utilisateur uniquement. · débit : write
curl -X GET https://passpam.com/api/v1/scanner/events/…/tickets/…/access \
-H "Authorization: Bearer "
GET /scanner/events/{uuid}/tickets/{ticket}/photo Photo du participant (checkin.photo.view, consultation journalisée)
Jeton utilisateur uniquement. · débit : write
curl -X GET https://passpam.com/api/v1/scanner/events/…/tickets/…/photo \
-H "Authorization: Bearer "
POST /scanner/events/{uuid}/tickets/{ticket}/actions Action superviseur : bloquer, débloquer, sortie forcée, corriger (motif obligatoire)
Jeton utilisateur uniquement. · débit : write
Corps (JSON)
actionstringrequis — block | unblock | force_exit | correctreasonstringrequistarget_statestring— not_checked_in | in | out
curl -X POST https://passpam.com/api/v1/scanner/events/…/tickets/…/actions \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /scanner/events/{uuid}/tickets/{ticket}/wristband Remplacement du bracelet (checkin.wristband.replace, motif obligatoire)
Jeton utilisateur uniquement. · débit : write
Corps (JSON)
codestringrequisreasonstringrequis
curl -X POST https://passpam.com/api/v1/scanner/events/…/tickets/…/wristband \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /scanner/events/{uuid}/offline-package Paquet hors ligne (empreintes des billets, jamais de jeton) — mode hors ligne activé + checkin.offline + appareil enregistré
Jeton utilisateur uniquement. · débit : write
curl -X GET https://passpam.com/api/v1/scanner/events/…/offline-package \
-H "Authorization: Bearer "
POST /scanner/events/{uuid}/offline-sync Synchronise les scans hors ligne (idempotent par identifiant de scan ; conflits enregistrés, jamais écrasés)
Jeton utilisateur uniquement. · débit : write
Corps (JSON)
batch_idstringrequis — uuiditemsarrayrequis — 500 scans maximum
curl -X POST https://passpam.com/api/v1/scanner/events/…/offline-sync \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /scanner/events/{uuid}/access/live Comptage réel : à l’intérieur, sortis, réentrées, bloqués, capacité
Jeton utilisateur uniquement. · débit : write
curl -X GET https://passpam.com/api/v1/scanner/events/…/access/live \
-H "Authorization: Bearer "
Reseller POS
GET /reseller/accounts Mes comptes revendeurs, rôles, permissions, points de vente
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/reseller/accounts \
-H "Authorization: Bearer "
GET /reseller/context Contexte POS (compte + point de vente)
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/reseller/context \
-H "Authorization: Bearer "
GET /reseller/dashboard Tableau de bord revendeur (selon permissions financières)
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/reseller/dashboard \
-H "Authorization: Bearer "
GET /reseller/pos/events Événements autorisés au compte / point de vente
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/reseller/pos/events \
-H "Authorization: Bearer "
GET /reseller/pos/events/{uuid} Types de billets vendables et stock
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/reseller/pos/events/… \
-H "Authorization: Bearer "
POST /reseller/pos/calculate Calcul serveur du total (aperçu)
Jeton utilisateur uniquement. · débit : write
curl -X POST https://passpam.com/api/v1/reseller/pos/calculate \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /reseller/pos/sales Vente rapide atomique (idempotency_key obligatoire)
Jeton utilisateur uniquement. · débit : sensitive
curl -X POST https://passpam.com/api/v1/reseller/pos/sales \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /reseller/pos/sales/status/{key} État d’une vente par sa clé d’idempotence
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/reseller/pos/sales/status/… \
-H "Authorization: Bearer "
GET /reseller/pos/customers/lookup Client existant par téléphone / e-mail
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/reseller/pos/customers/lookup \
-H "Authorization: Bearer "
GET /reseller/stock Stock : alloué, reçu, transféré, vendu, réservé, disponible
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/reseller/stock \
-H "Authorization: Bearer "
GET /reseller/stock/destinations Destinations de transfert autorisées
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/reseller/stock/destinations \
-H "Authorization: Bearer "
POST /reseller/stock/transfer Transfert de stock (confirm: true obligatoire)
Jeton utilisateur uniquement. · débit : sensitive
curl -X POST https://passpam.com/api/v1/reseller/stock/transfer \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /reseller/sales Historique des ventes (filtres période, recherche)
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/reseller/sales \
-H "Authorization: Bearer "
GET /reseller/sales/{uuid} Détail d’une vente
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/reseller/sales/… \
-H "Authorization: Bearer "
POST /reseller/sales/{uuid}/cancel Annule une vente (reseller.sale.cancel)
Jeton utilisateur uniquement. · débit : sensitive
curl -X POST https://passpam.com/api/v1/reseller/sales/…/cancel \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /reseller/sales/{uuid}/send Renvoie les billets (email / sms / whatsapp)
Jeton utilisateur uniquement. · débit : write
curl -X POST https://passpam.com/api/v1/reseller/sales/…/send \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /reseller/sales/{uuid}/receipt Reçu de vente
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/reseller/sales/…/receipt \
-H "Authorization: Bearer "
GET /reseller/cash-register Sessions de caisse
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/reseller/cash-register \
-H "Authorization: Bearer "
GET /reseller/cash-register/current Caisse ouverte du point de vente
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/reseller/cash-register/current \
-H "Authorization: Bearer "
POST /reseller/cash-register/open Ouvre la caisse (fond de caisse)
Jeton utilisateur uniquement. · débit : write
curl -X POST https://passpam.com/api/v1/reseller/cash-register/open \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /reseller/cash-register/{uuid}/close Ferme la caisse (espèces comptées, écart)
Jeton utilisateur uniquement. · débit : write
curl -X POST https://passpam.com/api/v1/reseller/cash-register/…/close \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /reseller/cash-register/{uuid} Une session de caisse
Jeton utilisateur uniquement. · débit : default
curl -X GET https://passpam.com/api/v1/reseller/cash-register/… \
-H "Authorization: Bearer "
Events
GET /events Événements de l’organisation
Clé d’organisation ou jeton utilisateur membre. · scope events:read · permission event.view · débit : default
Paramètres de requête
statusstring— draft | pending_review | published | cancelled | completed | archivedevent_typestringvisibilitystringcategorystringqstringstarts_afterdatetimestarts_beforedatetimeupdated_sincedatetimesortstring— starts_at | created_at | updated_at | titledirectionstring— asc | descpageintegerper_pageinteger
curl -X GET https://passpam.com/api/v1/events \
-H "Authorization: Bearer "
POST /events Crée un événement (brouillon)
Clé d’organisation ou jeton utilisateur membre. · scope events:write · permission event.create · débit : write
Corps (JSON)
titlestringrequiscategory_idintegerrequisevent_typestringrequis — physical | online | hybridtimezonestringrequisstarts_atstringrequis — heure locale AAAA-MM-JJ HH:MM:SSends_atstringshort_descriptionstringdescriptionstring— HTML nettoyévisibilitystring— public | private | unlistedcurrencystringcapacityintegervenue_idintegernew_venueobjecttagsarrayorganization_idstring— uuid — jeton utilisateur uniquement
curl -X POST https://passpam.com/api/v1/events \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /events/{uuid} Détail d’un événement avec ses types de billets
Clé d’organisation ou jeton utilisateur membre. · scope events:read · permission event.view · débit : default
curl -X GET https://passpam.com/api/v1/events/… \
-H "Authorization: Bearer "
PATCH /events/{uuid} Modifie un événement (changement matériel → notifications aux acheteurs)
Clé d’organisation ou jeton utilisateur membre. · scope events:write · permission event.edit · débit : write
Corps (JSON)
titlestringstarts_atstringends_atstringtimezonestringvenue_idintegerdescriptionstringshort_descriptionstringvisibilitystringcapacityinteger
curl -X PATCH https://passpam.com/api/v1/events/… \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /events/{uuid}/publish Publie (ou soumet à modération)
Clé d’organisation ou jeton utilisateur membre. · scope events:write · permission event.publish · débit : write
curl -X POST https://passpam.com/api/v1/events/…/publish \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /events/{uuid}/cancel Annule un événement (acheteurs notifiés par lots)
Clé d’organisation ou jeton utilisateur membre. · scope events:write · permission event.edit · débit : sensitive
Corps (JSON)
reasonstringrequis
curl -X POST https://passpam.com/api/v1/events/…/cancel \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /events/{uuid}/ticket-types Types de billets d’un événement
Clé d’organisation ou jeton utilisateur membre. · scope events:read · permission ticket.view · débit : default
curl -X GET https://passpam.com/api/v1/events/…/ticket-types \
-H "Authorization: Bearer "
POST /events/{uuid}/ticket-types Crée un type de billet
Clé d’organisation ou jeton utilisateur membre. · scope events:write · permission ticket.create · débit : write
Corps (JSON)
namestringrequispricenumberrequisquantity_totalintegerrequisdescriptionstringmin_per_orderintegermax_per_orderintegersales_start_atstringsales_end_atstringvisibilitystring— public | hidden | access_codestatusstring— active | paused | scheduledsession_idstring— uuid de session
curl -X POST https://passpam.com/api/v1/events/…/ticket-types \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /events/{uuid}/availability Disponibilité de tous les types de billets d’un événement
Clé d’organisation ou jeton utilisateur membre. · scope inventory:read · permission inventory.view · débit : default
curl -X GET https://passpam.com/api/v1/events/…/availability \
-H "Authorization: Bearer "
GET /ticket-types/{uuid} Un type de billet
Clé d’organisation ou jeton utilisateur membre. · scope events:read · permission ticket.view · débit : default
curl -X GET https://passpam.com/api/v1/ticket-types/… \
-H "Authorization: Bearer "
PATCH /ticket-types/{uuid} Modifie un type de billet (prix, quantité, fenêtre de vente…)
Clé d’organisation ou jeton utilisateur membre. · scope events:write · permission ticket.edit · débit : write
Corps (JSON)
namestringpricenumberquantity_totalintegerstatusstringvisibilitystringsales_start_atstringsales_end_atstringmax_per_orderinteger
curl -X PATCH https://passpam.com/api/v1/ticket-types/… \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /ticket-types/{uuid}/availability Disponibilité : available, status, sales_start, sales_end
Clé d’organisation ou jeton utilisateur membre. · scope inventory:read · permission inventory.view · débit : default
curl -X GET https://passpam.com/api/v1/ticket-types/…/availability \
-H "Authorization: Bearer "
Orders
GET /orders Commandes (filtrables, paginées)
Clé d’organisation ou jeton utilisateur membre. · scope orders:read · permission order.view · débit : default
Paramètres de requête
statusstring— pending | confirmed | cancelled | expired | refunded | partially_refundedpayment_statusstringsales_channelstring— web | reseller | admin | api | complimentaryevent_idstring— uuidemailstringnumberstringcreated_afterdatetimecreated_beforedatetimeupdated_sincedatetimesortstring— created_at | updated_at | total | numberdirectionstringpageintegerper_pageinteger
curl -X GET https://passpam.com/api/v1/orders \
-H "Authorization: Bearer "
POST /orders Crée une commande (canal api) — Idempotency-Key recommandée
Clé d’organisation ou jeton utilisateur membre. · scope orders:write · permission order.manage · débit : sensitive
Corps (JSON)
event_idstringrequis — uuiditemsarrayrequis — [{ticket_type_id, quantity}]customerobjectrequis — {first_name, last_name, email, phone?}languagestring— fr | ht | enpromo_codestring
curl -X POST https://passpam.com/api/v1/orders \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /orders/{uuid} Une commande : lignes, billets, paiements (payments:read)
Clé d’organisation ou jeton utilisateur membre. · scope orders:read · permission order.view · débit : default
curl -X GET https://passpam.com/api/v1/orders/… \
-H "Authorization: Bearer "
POST /orders/{uuid}/cancel Annule une commande en attente
Clé d’organisation ou jeton utilisateur membre. · scope orders:write · permission order.manage · débit : sensitive
curl -X POST https://passpam.com/api/v1/orders/…/cancel \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /orders/{uuid}/payments Initie un paiement via un fournisseur autorisé (jamais « paid=true ») ; `manual` exige payments:record
Clé d’organisation ou jeton utilisateur membre. · scope payments:initiate · permission order.manage · débit : sensitive
Corps (JSON)
providerstringrequis — code fournisseur (manual, mock_online…)methodstring— cash, mobile_money, bank_transfer, other, onlinereferencestringreturn_urlstring
curl -X POST https://passpam.com/api/v1/orders/…/payments \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /orders/{uuid}/tickets Billets d’une commande (sans jeton sécurisé)
Clé d’organisation ou jeton utilisateur membre. · scope tickets:read · permission ticket.view · débit : default
curl -X GET https://passpam.com/api/v1/orders/…/tickets \
-H "Authorization: Bearer "
POST /orders/{uuid}/tickets/resend Renvoie les billets (email / sms / whatsapp) — 5 renvois par heure
Clé d’organisation ou jeton utilisateur membre. · scope tickets:issue · permission order.manage · débit : sensitive
Corps (JSON)
channelstring— email | sms | whatsapprecipientstring
curl -X POST https://passpam.com/api/v1/orders/…/tickets/resend \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /tickets/{uuid} Un billet
Clé d’organisation ou jeton utilisateur membre. · scope tickets:read · permission ticket.view · débit : default
curl -X GET https://passpam.com/api/v1/tickets/… \
-H "Authorization: Bearer "
Attendees
GET /attendees Participants (données minimisées)
Clé d’organisation ou jeton utilisateur membre. · scope attendees:read · permission attendee.view · débit : default
Paramètres de requête
event_idstring— uuidstatusstringqstringchecked_instring— 0 | 1pageintegerper_pageinteger— max 200
curl -X GET https://passpam.com/api/v1/attendees \
-H "Authorization: Bearer "
PATCH /attendees/{uuid} Renomme le participant d’un billet valide
Clé d’organisation ou jeton utilisateur membre. · scope attendees:write · permission attendee.view · débit : write
Corps (JSON)
first_namestringlast_namestringemailstring
curl -X PATCH https://passpam.com/api/v1/attendees/… \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
Refunds
GET /refunds Remboursements
Clé d’organisation ou jeton utilisateur membre. · scope refunds:read · permission finance.view · débit : default
Paramètres de requête
statusstringorder_idstringpageintegerper_pageinteger
curl -X GET https://passpam.com/api/v1/refunds \
-H "Authorization: Bearer "
POST /refunds Demande un remboursement (workflow d’approbation inchangé)
Clé d’organisation ou jeton utilisateur membre. · scope refunds:write · permission finance.refund · débit : sensitive
Corps (JSON)
order_idstringrequisticket_idsarray— uuids (vide = toute la commande)reasonstringrequis
curl -X POST https://passpam.com/api/v1/refunds \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /refunds/{uuid} Un remboursement
Clé d’organisation ou jeton utilisateur membre. · scope refunds:read · permission finance.view · débit : default
curl -X GET https://passpam.com/api/v1/refunds/… \
-H "Authorization: Bearer "
Check-in
POST /checkins/validate Valide un billet sans l’enregistrer (même moteur que le scanner)
Clé d’organisation ou jeton utilisateur membre. · scope checkins:write · permission checkin.scan · débit : write
Corps (JSON)
event_idstringrequis — uuidpayloadstring— contenu du QRticket_idstring— uuid (alternative au payload)gate_idintegeraccess_zone_idintegersession_idstring
curl -X POST https://passpam.com/api/v1/checkins/validate \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /checkins Enregistre une entrée (409 + code stable si refusée : ticket_already_used, checkin_qr_replaced, checkin_not_a_ticket…)
Clé d’organisation ou jeton utilisateur membre. · scope checkins:write · permission checkin.scan · débit : write
Corps (JSON)
event_idstringrequispayloadstringticket_idstringgate_idintegerscan_request_idstring— idempotence du scan (8-100 car.)
curl -X POST https://passpam.com/api/v1/checkins \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /checkouts Enregistre une sortie
Clé d’organisation ou jeton utilisateur membre. · scope checkins:write · permission checkin.scan · débit : write
Corps (JSON)
event_idstringrequispayloadstringticket_idstringgate_idintegerscan_request_idstring
curl -X POST https://passpam.com/api/v1/checkouts \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /events/{uuid}/checkins Historique des scans
Clé d’organisation ou jeton utilisateur membre. · scope checkins:read · permission checkin.stats.view · débit : default
Paramètres de requête
resultstring— accepted | rejected | duplicate | invalidsincedatetimepageintegerper_pageinteger
curl -X GET https://passpam.com/api/v1/events/…/checkins \
-H "Authorization: Bearer "
GET /events/{uuid}/checkin-stats Statistiques de check-in en direct
Clé d’organisation ou jeton utilisateur membre. · scope checkins:read · permission checkin.stats.view · débit : default
curl -X GET https://passpam.com/api/v1/events/…/checkin-stats \
-H "Authorization: Bearer "
Resellers
GET /resellers Revendeurs de l’organisation
Clé d’organisation ou jeton utilisateur membre. · scope resellers:read · permission reseller.view · débit : default
curl -X GET https://passpam.com/api/v1/resellers \
-H "Authorization: Bearer "
GET /resellers/{uuid}/inventory Allocations d’un revendeur (« me » pour une clé revendeur)
Clé d’organisation ou jeton utilisateur membre. · scope inventory:read · permission reseller.view · débit : default
Paramètres de requête
event_idstring
curl -X GET https://passpam.com/api/v1/resellers/…/inventory \
-H "Authorization: Bearer "
POST /resellers/{uuid}/allocations Alloue du stock à un revendeur (InventoryService)
Clé d’organisation ou jeton utilisateur membre. · scope inventory:write · permission inventory.allocate · débit : sensitive
Corps (JSON)
ticket_type_idstringrequisquantityintegerrequis
curl -X POST https://passpam.com/api/v1/resellers/…/allocations \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /reseller/inventory Clé revendeur : mon stock
Clé de compte revendeur (ou membre revendeur). · scope inventory:read · débit : default
curl -X GET https://passpam.com/api/v1/reseller/inventory \
-H "Authorization: Bearer "
GET /reseller/events Clé revendeur : événements autorisés
Clé de compte revendeur (ou membre revendeur). · scope events:read · débit : default
curl -X GET https://passpam.com/api/v1/reseller/events \
-H "Authorization: Bearer "
GET /reseller/settlements Clé revendeur : mes règlements
Clé de compte revendeur (ou membre revendeur). · scope resellers:read · débit : default
Paramètres de requête
pageintegerper_pageinteger
curl -X GET https://passpam.com/api/v1/reseller/settlements \
-H "Authorization: Bearer "
Reports
GET /reports/sales Ventes : KPI par devise, canaux, courbe, par événement (Phase 16)
Clé d’organisation ou jeton utilisateur membre. · scope reports:read · permission report.view · débit : default
Paramètres de requête
presetstring— today | yesterday | 7d | 30d | month | last_month | year | customfromstring— YYYY-MM-DDtostring— YYYY-MM-DDevent_idstringchannelstringcurrencystring
curl -X GET https://passpam.com/api/v1/reports/sales \
-H "Authorization: Bearer "
GET /reports/tickets Billets : performance par type + inventaire (grand livre)
Clé d’organisation ou jeton utilisateur membre. · scope reports:read · permission ticket.view · débit : default
Paramètres de requête
presetstring— today | yesterday | 7d | 30d | month | last_month | year | customfromstring— YYYY-MM-DDtostring— YYYY-MM-DDevent_idstringchannelstringcurrencystring
curl -X GET https://passpam.com/api/v1/reports/tickets \
-H "Authorization: Bearer "
GET /reports/checkins Check-in : taux, entrées dans le temps, portes, par type
Clé d’organisation ou jeton utilisateur membre. · scope reports:read · permission checkin.stats.view · débit : default
Paramètres de requête
presetstring— today | yesterday | 7d | 30d | month | last_month | year | customfromstring— YYYY-MM-DDtostring— YYYY-MM-DDevent_idstringchannelstringcurrencystringintervalstring— 1m | 5m | 15m | 1h
curl -X GET https://passpam.com/api/v1/reports/checkins \
-H "Authorization: Bearer "
GET /reports/resellers Revendeurs : allocation, ventes, écoulement, points de vente, vendeurs
Clé d’organisation ou jeton utilisateur membre. · scope reports:read · permission reseller.view · débit : default
Paramètres de requête
presetstring— today | yesterday | 7d | 30d | month | last_month | year | customfromstring— YYYY-MM-DDtostring— YYYY-MM-DDevent_idstringchannelstringcurrencystring
curl -X GET https://passpam.com/api/v1/reports/resellers \
-H "Authorization: Bearer "
GET /reports/finance Finance : ventes, remboursements, paiements, solde (finance.view obligatoire)
Clé d’organisation ou jeton utilisateur membre. · scope reports:read · permission finance.view · débit : sensitive
Paramètres de requête
presetstring— today | yesterday | 7d | 30d | month | last_month | year | customfromstring— YYYY-MM-DDtostring— YYYY-MM-DDevent_idstringchannelstringcurrencystring
curl -X GET https://passpam.com/api/v1/reports/finance \
-H "Authorization: Bearer "
GET /events/{uuid}/reports/sales Rapport de ventes d’un événement (par type, par devise, canaux, check-in)
Clé d’organisation ou jeton utilisateur membre. · scope reports:read · permission report.view · débit : default
curl -X GET https://passpam.com/api/v1/events/…/reports/sales \
-H "Authorization: Bearer "
Webhooks
GET /webhooks/events Catalogue des événements de webhook
Sans authentification. · débit : public
curl -X GET https://passpam.com/api/v1/webhooks/events
GET /webhooks Endpoints de webhook
Clé d’organisation ou jeton utilisateur membre. · scope webhooks:manage · permission webhook.manage · débit : default
curl -X GET https://passpam.com/api/v1/webhooks \
-H "Authorization: Bearer "
POST /webhooks Crée un endpoint (le secret n’est renvoyé qu’une fois)
Clé d’organisation ou jeton utilisateur membre. · scope webhooks:manage · permission webhook.manage · débit : write
Corps (JSON)
urlstringrequis — httpseventsarrayrequis — types ou ["*"]namestringdescriptionstring
curl -X POST https://passpam.com/api/v1/webhooks \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /webhooks/deliveries Journal des livraisons
Clé d’organisation ou jeton utilisateur membre. · scope webhooks:manage · permission webhook.manage · débit : default
Paramètres de requête
endpoint_idstringstatusstring— pending | processing | delivered | failed | cancelledevent_typestringpageintegerper_pageinteger
curl -X GET https://passpam.com/api/v1/webhooks/deliveries \
-H "Authorization: Bearer "
GET /webhooks/deliveries/{uuid} Une livraison avec son payload
Clé d’organisation ou jeton utilisateur membre. · scope webhooks:manage · permission webhook.manage · débit : default
curl -X GET https://passpam.com/api/v1/webhooks/deliveries/… \
-H "Authorization: Bearer "
POST /webhooks/deliveries/{uuid}/replay Rejoue une livraison (même event_id, audité)
Clé d’organisation ou jeton utilisateur membre. · scope webhooks:manage · permission webhook.manage · débit : sensitive
curl -X POST https://passpam.com/api/v1/webhooks/deliveries/…/replay \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
GET /webhooks/{uuid} Un endpoint
Clé d’organisation ou jeton utilisateur membre. · scope webhooks:manage · permission webhook.manage · débit : default
curl -X GET https://passpam.com/api/v1/webhooks/… \
-H "Authorization: Bearer "
PATCH /webhooks/{uuid} Modifie un endpoint (url, événements, statut)
Clé d’organisation ou jeton utilisateur membre. · scope webhooks:manage · permission webhook.manage · débit : write
Corps (JSON)
urlstringeventsarraynamestringdescriptionstringstatusstring— active | disabled
curl -X PATCH https://passpam.com/api/v1/webhooks/… \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
DELETE /webhooks/{uuid} Supprime un endpoint
Clé d’organisation ou jeton utilisateur membre. · scope webhooks:manage · permission webhook.manage · débit : write
curl -X DELETE https://passpam.com/api/v1/webhooks/… \
-H "Authorization: Bearer "
POST /webhooks/{uuid}/rotate-secret Nouveau secret (affiché une fois)
Clé d’organisation ou jeton utilisateur membre. · scope webhooks:manage · permission webhook.manage · débit : sensitive
curl -X POST https://passpam.com/api/v1/webhooks/…/rotate-secret \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
POST /webhooks/{uuid}/test Envoie un événement webhook.test
Clé d’organisation ou jeton utilisateur membre. · scope webhooks:manage · permission webhook.manage · débit : sensitive
curl -X POST https://passpam.com/api/v1/webhooks/…/test \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: " \
-d '{…}'
Webhooks
Passpam envoie un POST JSON signé à chaque endpoint abonné (Organizer › Intégrations › Webhooks). Chaque livraison porte un event_id unique : dédupliquez dessus, l’ordre d’arrivée n’est pas garanti.
| Événement | Description |
|---|---|
event.published | Événement publié |
event.updated | Événement modifié (date, lieu…) |
event.cancelled | Événement annulé |
order.created | Commande créée (en attente de paiement) |
order.confirmed | Commande confirmée |
order.cancelled | Commande annulée |
payment.paid | Paiement encaissé |
payment.failed | Paiement échoué |
ticket.issued | Billets émis |
ticket.checked_in | Billet scanné (entrée acceptée) |
refund.requested | Remboursement demandé |
refund.completed | Remboursement effectué |
payout.paid | Versement effectué |
inventory.low | Stock bas |
inventory.sold_out | Type de billet complet |
webhook.test | Événement de test |
Payload et en-têtes
POST https://votre-serveur/webhooks/passpam
Content-Type: application/json
X-Passpam-Event: order.confirmed
X-Passpam-Event-Id: evt_3f2a9c…
X-Passpam-Delivery: 9d1c…-uuid
X-Passpam-Timestamp: 1790452740
X-Passpam-Signature: t=1790452740,v1=5f1b…hex(hmac-sha256)
{"event_id": "evt_3f2a9c…", "type": "order.confirmed", "api_version": "v1", "created_at": "2026-09-26T19:59:00Z", "livemode": true,
"data": {"object": "order", "id": "…uuid…", "number": "PP-2026-…", "status": "confirmed", "total": {"amount": "10000.00", "currency": "HTG"}, "ticket_count": 2, "event": {"id": "…", "title": "…"}},
"links": {"api": "https://passpam.com/api/v1/orders/…uuid…"}}
Vérifier la signature
X-Passpam-Signature = t=<horodatage Unix>,v1=<HMAC-SHA256 hex de « t.corps brut » avec votre secret>. Rejetez toute livraison dont l’horodatage s’écarte de plus de 5 minutes (rejeu) ou dont la signature ne correspond pas (comparaison en temps constant).
// PHP
$sig = $_SERVER['HTTP_X_PASSPAM_SIGNATURE']; // t=…,v1=…
$raw = file_get_contents('php://input');
preg_match('/^t=(\d+),v1=([a-f0-9]{64})$/', $sig, $m);
$ok = abs(time() - (int) $m[1]) <= 300
&& hash_equals(hash_hmac('sha256', $m[1] . '.' . $raw, $secret), $m[2]);
// Node.js
const [t, v1] = sig.split(',').map(p => p.split('=')[1]);
const expected = crypto.createHmac('sha256', secret).update(`${t}.${raw}`).digest('hex');
const ok = Math.abs(Date.now() / 1000 - Number(t)) <= 300 && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
# Python
t, v1 = (p.split('=')[1] for p in sig.split(','))
expected = hmac.new(secret.encode(), f"{t}.{raw}".encode(), hashlib.sha256).hexdigest()
ok = abs(time.time() - int(t)) <= 300 and hmac.compare_digest(expected, v1)
- Nouvelle tentative si votre réponse n’est pas 2xx ou dépasse 10 s : après 1 min, 5 min, 30 min, 2 h, 12 h (6 tentatives), puis statut failed.
- Ordre non garanti : traitez chaque événement de façon idempotente (event_id) et relisez la ressource via links.api si besoin.
- Répondez 2xx rapidement (avant tout traitement long) ; les redirections ne sont pas suivies.
- Après 10 échecs définitifs consécutifs, l’endpoint est désactivé et le propriétaire prévenu ; réactivez-le depuis Organizer › Intégrations.
- Vous pouvez rejouer une livraison (même event_id) et envoyer un événement webhook.test depuis l’interface ou l’API.
Scopes
| Scope | Description | Porteurs |
|---|---|---|
events:read | Lire les événements et leurs types de billets | organization, reseller |
events:write | Créer / modifier / publier / annuler des événements et types de billets | organization |
orders:read | Lire les commandes | organization, reseller |
orders:write | Créer et annuler des commandes | organization |
tickets:read | Lire les billets (sans jeton sécurisé) | organization, reseller |
tickets:issue | Émettre / renvoyer des billets | organization |
attendees:read | Lire les participants (données minimisées) | organization |
attendees:write | Modifier les participants | organization |
checkins:read | Lire les statistiques et l’historique de check-in | organization |
checkins:write | Valider / enregistrer des entrées et sorties | organization |
inventory:read | Lire les disponibilités | organization, reseller |
inventory:write | Allouer du stock à un revendeur (restreint) | organization |
payments:read | Lire les paiements | organization |
payments:initiate | Initier un paiement chez un fournisseur autorisé | organization |
payments:record | Enregistrer un paiement hors ligne (fonds collectés par l’organisateur) | organization |
refunds:read | Lire les remboursements | organization |
refunds:write | Demander un remboursement | organization |
reports:read | Lire les rapports de vente / check-in | organization |
resellers:read | Lire les revendeurs, allocations et règlements | organization, reseller |
webhooks:manage | Gérer les webhooks | organization |
Des SDK PHP, JavaScript et Python sont prévus ; l’API est conçue pour être générée depuis openapi.json.