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.codeHTTP
validation_error422
invalid_credentials401
mfa_required401
unauthenticated401
token_expired401
token_revoked401
invalid_api_key401
api_key_revoked401
api_key_expired401
ip_not_allowed403
insufficient_scope403
permission_denied403
test_mode_read_only403
resource_not_found404
method_not_allowed405
conflict409
idempotency_key_reused409
idempotency_in_progress409
invalid_state409
inventory_unavailable409
ticket_already_used409
payment_required402
rate_limit_exceeded429
unsupported_media_type415
payload_too_large413
bad_request400
organization_suspended403
event_unavailable409
internal_error500
not_implemented501
device_not_authorized403
wallet_not_configured501
update_required426
maintenance503
service_unavailable503
checkout_expired410
account_unverified403
ticket_not_active409
ticket_other_device409
ticket_not_bound409

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

  • category string — slug de catégorie
  • city string
  • organization string — slug organisateur
  • event_type string — physical | online | hybrid
  • q string — recherche texte
  • starts_after datetime
  • starts_before datetime
  • coming_soon boolean — 1 = seulement les « Bientôt » (FEAT-053)
  • sort string — starts_at | published_at | title
  • direction string — asc | desc
  • page integer
  • per_page integer — 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_addons boolean — 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_id string requis — uuid
  • email string requis
  • phone string
  • name string
  • quantity integer
  • language string — 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)

  • email string — courriel (ou phone)
  • phone string — numéro pour un SMS (facultatif)
  • language string — 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

  • q string — nom
  • genre string — clé du genre (ex. kompa)
  • page integer
  • per_page integer — 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)

  • contact string requis — e-mail ou numéro (WhatsApp)
  • language string — 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_id string requis
  • code string requis
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)

  • code string requis — 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)

  • code string requis
  • amount number requis
  • currency string requis — HTG | USD
  • reference string requis — identifiant unique de la vente dans la caisse
  • stand string
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)

  • code string requis
  • amount number requis
  • currency string requis — HTG | USD
  • reference string requis
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_reference string requis
  • reference string requis
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)

  • operations array requis — [{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)

  • email string requis
  • password string requis
  • device object — {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)

  • provider string requis — google | apple | facebook
  • token string — id_token (Google, Apple) ou jeton d’accès (Facebook)
  • nonce string
  • signup_token string
  • first_name string
  • last_name string
  • phone string
  • country_code string
  • terms_accepted boolean
  • device object
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)

  • code string requis
  • device object
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_token string requis
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_name string
  • last_name string
  • phone string
  • country_code string — ISO 3166-1 alpha-2 (HT, US…)
  • birth_date string — AAAA-MM-JJ (13 ans minimum)
  • gender string — female | male | other | undisclosed
  • city string
  • address_line string
  • preferred_language string — fr | ht | en
  • timezone string
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

  • scope string — upcoming | past | all
  • page integer
  • per_page integer
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

  • minutes integer — 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_base64 string requis — 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_base64 string requis — 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_name string requis
  • last_name string requis
  • email string — courriel (ou phone)
  • phone string
  • message string — 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)

  • artist string requis — slug
  • follow boolean requis
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)

  • organization string requis — slug
  • follow boolean requis
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

  • status string
  • page integer
  • per_page integer
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)

  • items array requis — [{ticket_id, first_name, last_name, email?, phone?}]
  • message string — ≤ 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

  • unread string — 0 | 1
  • page integer
  • per_page integer
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_id string requis — 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_name string requis
  • last_name string requis
  • email string requis
  • phone string
  • password string requis
  • language string — fr | ht | en
  • terms_accepted boolean requis
  • device object — {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)

  • email string requis
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)

  • id string requis — 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)

  • password string requis
  • confirm string requis — 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

  • n string — 0 | 1
  • p string — 0 | 1
  • b string — 0 | 1
  • l string — 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)

  • platform string requis — ios | android
  • token string requis
  • device_id string requis — identifiant d’installation
  • app_version string
  • environment string — production | sandbox
  • locale string — fr | ht | en
  • device_name string
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)

  • token string
  • device_id string
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_id string — 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)

  • name string requis
  • country_code string
  • default_currency string — HTG | USD
  • timezone string
  • email string
  • phone string
  • description string
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

  • status string — 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)

  • email string requis
  • role_id int requis
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)

  • name string requis
  • kind string — paid | free
  • price string
  • quantity int requis
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)

  • items array — [{ticket_type_id, quantity}]
  • seats array — [seat_id…] (GET /public/events/{slug}/seats)
  • event_id string — 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)

  • code string requis
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)

  • customer object requis
  • attendees object — {item_id: [{first_name, last_name, email, answers}]}
  • terms_accepted boolean requis
  • marketing_consent boolean
  • language string
  • provider string — 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)

  • provider string requis
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_id integer
  • access_zone_id integer
  • event_session_id integer
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)

  • name string requis
  • platform string — 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)

  • payload string
  • ticket_uuid string
  • scan_request_id string
  • gate_id integer
  • access_zone_id integer
  • event_session_id integer
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

  • q string
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)

  • action string requis — block | unblock | force_exit | correct
  • reason string requis
  • target_state string — 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)

  • code string requis
  • reason string requis
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_id string requis — uuid
  • items array requis — 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

  • status string — draft | pending_review | published | cancelled | completed | archived
  • event_type string
  • visibility string
  • category string
  • q string
  • starts_after datetime
  • starts_before datetime
  • updated_since datetime
  • sort string — starts_at | created_at | updated_at | title
  • direction string — asc | desc
  • page integer
  • per_page integer
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)

  • title string requis
  • category_id integer requis
  • event_type string requis — physical | online | hybrid
  • timezone string requis
  • starts_at string requis — heure locale AAAA-MM-JJ HH:MM:SS
  • ends_at string
  • short_description string
  • description string — HTML nettoyé
  • visibility string — public | private | unlisted
  • currency string
  • capacity integer
  • venue_id integer
  • new_venue object
  • tags array
  • organization_id string — 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)

  • title string
  • starts_at string
  • ends_at string
  • timezone string
  • venue_id integer
  • description string
  • short_description string
  • visibility string
  • capacity integer
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)

  • reason string requis
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)

  • name string requis
  • price number requis
  • quantity_total integer requis
  • description string
  • min_per_order integer
  • max_per_order integer
  • sales_start_at string
  • sales_end_at string
  • visibility string — public | hidden | access_code
  • status string — active | paused | scheduled
  • session_id string — 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)

  • name string
  • price number
  • quantity_total integer
  • status string
  • visibility string
  • sales_start_at string
  • sales_end_at string
  • max_per_order integer
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

  • status string — pending | confirmed | cancelled | expired | refunded | partially_refunded
  • payment_status string
  • sales_channel string — web | reseller | admin | api | complimentary
  • event_id string — uuid
  • email string
  • number string
  • created_after datetime
  • created_before datetime
  • updated_since datetime
  • sort string — created_at | updated_at | total | number
  • direction string
  • page integer
  • per_page integer
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_id string requis — uuid
  • items array requis — [{ticket_type_id, quantity}]
  • customer object requis — {first_name, last_name, email, phone?}
  • language string — fr | ht | en
  • promo_code string
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)

  • provider string requis — code fournisseur (manual, mock_online…)
  • method string — cash, mobile_money, bank_transfer, other, online
  • reference string
  • return_url string
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)

  • channel string — email | sms | whatsapp
  • recipient string
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_id string — uuid
  • status string
  • q string
  • checked_in string — 0 | 1
  • page integer
  • per_page integer — 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_name string
  • last_name string
  • email string
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

  • status string
  • order_id string
  • page integer
  • per_page integer
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_id string requis
  • ticket_ids array — uuids (vide = toute la commande)
  • reason string requis
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_id string requis — uuid
  • payload string — contenu du QR
  • ticket_id string — uuid (alternative au payload)
  • gate_id integer
  • access_zone_id integer
  • session_id string
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_id string requis
  • payload string
  • ticket_id string
  • gate_id integer
  • scan_request_id string — 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_id string requis
  • payload string
  • ticket_id string
  • gate_id integer
  • scan_request_id string
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

  • result string — accepted | rejected | duplicate | invalid
  • since datetime
  • page integer
  • per_page integer
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_id string
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_id string requis
  • quantity integer requis
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

  • page integer
  • per_page integer
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

  • preset string — today | yesterday | 7d | 30d | month | last_month | year | custom
  • from string — YYYY-MM-DD
  • to string — YYYY-MM-DD
  • event_id string
  • channel string
  • currency string
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

  • preset string — today | yesterday | 7d | 30d | month | last_month | year | custom
  • from string — YYYY-MM-DD
  • to string — YYYY-MM-DD
  • event_id string
  • channel string
  • currency string
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

  • preset string — today | yesterday | 7d | 30d | month | last_month | year | custom
  • from string — YYYY-MM-DD
  • to string — YYYY-MM-DD
  • event_id string
  • channel string
  • currency string
  • interval string — 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

  • preset string — today | yesterday | 7d | 30d | month | last_month | year | custom
  • from string — YYYY-MM-DD
  • to string — YYYY-MM-DD
  • event_id string
  • channel string
  • currency string
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

  • preset string — today | yesterday | 7d | 30d | month | last_month | year | custom
  • from string — YYYY-MM-DD
  • to string — YYYY-MM-DD
  • event_id string
  • channel string
  • currency string
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)

  • url string requis — https
  • events array requis — types ou ["*"]
  • name string
  • description string
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_id string
  • status string — pending | processing | delivered | failed | cancelled
  • event_type string
  • page integer
  • per_page integer
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)

  • url string
  • events array
  • name string
  • description string
  • status string — 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énementDescription
event.publishedÉvénement publié
event.updatedÉvénement modifié (date, lieu…)
event.cancelledÉvénement annulé
order.createdCommande créée (en attente de paiement)
order.confirmedCommande confirmée
order.cancelledCommande annulée
payment.paidPaiement encaissé
payment.failedPaiement échoué
ticket.issuedBillets émis
ticket.checked_inBillet scanné (entrée acceptée)
refund.requestedRemboursement demandé
refund.completedRemboursement effectué
payout.paidVersement effectué
inventory.lowStock bas
inventory.sold_outType 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

ScopeDescriptionPorteurs
events:readLire les événements et leurs types de billetsorganization, reseller
events:writeCréer / modifier / publier / annuler des événements et types de billetsorganization
orders:readLire les commandesorganization, reseller
orders:writeCréer et annuler des commandesorganization
tickets:readLire les billets (sans jeton sécurisé)organization, reseller
tickets:issueÉmettre / renvoyer des billetsorganization
attendees:readLire les participants (données minimisées)organization
attendees:writeModifier les participantsorganization
checkins:readLire les statistiques et l’historique de check-inorganization
checkins:writeValider / enregistrer des entrées et sortiesorganization
inventory:readLire les disponibilitésorganization, reseller
inventory:writeAllouer du stock à un revendeur (restreint)organization
payments:readLire les paiementsorganization
payments:initiateInitier un paiement chez un fournisseur autoriséorganization
payments:recordEnregistrer un paiement hors ligne (fonds collectés par l’organisateur)organization
refunds:readLire les remboursementsorganization
refunds:writeDemander un remboursementorganization
reports:readLire les rapports de vente / check-inorganization
resellers:readLire les revendeurs, allocations et règlementsorganization, reseller
webhooks:manageGérer les webhooksorganization

Des SDK PHP, JavaScript et Python sont prévus ; l’API est conçue pour être générée depuis openapi.json.