Introduction
This guide is for your team to connect your app or website to StadePass and sell stadium seats.
You always send your partner code with every request. When you open an event, you also send the event code we gave you for that match/concert.
Think of it like a shop: list products → open one product → choose items → hold them briefly → customer pays you → you tell StadePass “sold” and we print the tickets.
Your two codes
We give you only two secrets. That is all you need.
| Code | When | Use |
|---|---|---|
Partner code | Your company code (example: YOUR_PARTNER_CODE) | Send it every time you talk to StadePass (like a badge at the door) |
Event code | One code per event we invite you to | Send it only when you open that event (to unlock the map and seats) |
The event code is not a search word. Do not type it in the event list search box.
How it works (simple)
1 — See your events
Ask StadePass for the list of events you are allowed to sell. Pick one event (remember its number / id).
2 — Open that event
Send the event number + your event code. StadePass unlocks the stadium map, sections, and seats for you. Keep the session id it returns.
3 — Choose seats and reserve them
Open a section, pick free seats. Each seat you want must be reserved with one short “hold” (about 12 minutes). Two tickets = two holds.
4 — Customer pays you, then you confirm
Ask StadePass for the total price. You collect the money yourself (we do not charge the card). Then confirm the purchase with all hold ids so seats become sold and tickets are created.
5 — Show the ticket on your app
Purchase reply includes data.tickets[].qr_code (32 hex chars) and place{} (place_id, porte, tribune.couleur, row, seat, route). No QR image — render qr_code on your side.
How you identify yourself
Every request must include your partner code (header name: x-partner-code). The event code is used only when opening an event. For demo, also send x-env: demo (or ?env=demo); default is production.
What to send every time
| Header | Description |
|---|---|
x-partner-code | Your partner code — like showing your badge on every call |
x-env | Optional: set to demo for the demo environment; omit for production |
Prices are in Guinean francs (GNF). Example: 50000 means 50,000 GNF.
Steps for your developers
Follow steps 1 to 8 in order. Details pages show exactly what to send.
What each step does
| Operation |
|---|
|
1. List events
Get the events you can sell. Note the event id. GET /api/v1/public/events |
|
1b. Create event (demo only)
Demo: create an event with partner code only. Send x-env: demo. Saves event_id + access_code for step 2. POST /api/v1/public/events |
|
2. Open event (map appears here)
Send event id + event code. You get zones/sections + counts (map.seats is empty until step 3). POST /api/v1/public/booking-sessions |
|
3. Open a section
Show seats in one section. Each seat includes place_id (number) / place / rangee / porte / tribune / route_texte. Hold with id. GET /api/v1/public/booking-sessions/:id?section_id= |
|
4. Reserve a seat (repeat for each ticket)
One seat at a time. Need 3 tickets? Reserve 3 times. Save each hold id. POST /api/v1/public/booking-sessions/:id/holds |
|
5. See the total to charge
Get the amount before you take payment from the customer. GET /api/v1/public/booking-sessions/:id/checkout |
|
6. Confirm after payment
Confirm sale: seats + amount must match. Response tickets[] include qr_code + place{} (tribune.couleur). No QR image. POST /api/v1/public/purchases |
|
7. List tickets
Tickets for owner_ref. Includes qr_code + place{} (tribune.couleur). GET /api/v1/public/tickets?owner_ref= |
|
8. Fetch one ticket
Same owner_ref. Returns qr_code + place{} (tribune.couleur). No QR image. GET /api/v1/public/tickets/:id?owner_ref= |
Full journey
List events → open event → pick section → reserve each seat → get total → customer pays you → confirm → show ticket place details.
You only see events we invited you to. Seats are shared with other sellers — first confirmed sale wins.
What to show after purchase
Use data.tickets[].qr_code and place{} from purchase (same on GET /tickets/:id). place_id is the unique seeded seat. tribune.couleur is the stand color (#hex). See docs/TICKET-RESPONSE.md and docs/places-restantes.place-shape.sample.json. No QR image is sent.
| Field | Show / usage |
|---|---|
qr_code | 32-char hex QR payload — encode as QR on your app |
place.place_id | UNIQUE seat id — always key on this |
place.place, rangee, numero_place | Human seat label (W16) + row + number |
place.porte | Gate: Ouest 1 / Ouest 2 / Est / Nord / Sud (code + libelle) |
place.tribune.couleur | Stand color (#hex) for UI styling |
place.tribune / route_texte | Stand name + path to seat |
place.code_litige | Dispute code STD-{event}-S{place_id} |
ticket_number | Human-readable ticket id on the pass |
<strong>{ticket.ticket_number}</strong>
<span style="color:{ticket.place.tribune.couleur}">{ticket.place.porte.libelle} · {ticket.place.tribune.nom}</span>
<span>Sector {ticket.place.secteur} · Row {ticket.place.rangee} · Seat {ticket.place.place}</span>
<span>{ticket.place.route_texte}</span>
<span>{ticket.place.code_litige}</span>
<qr value="{ticket.qr_code}" />
Example — open an event
curl -X POST \
"https://book.stadepassgn.com/api/v1/public/booking-sessions" \
-H "Content-Type: application/json" \
-H "x-partner-code: YOUR_PARTNER_CODE" \
-d '{
"event_id": "8",
"access_code": "YOUR_EVENT_SECRET"
}'
{
"success": true,
"message": "Booking session created",
"data": {
"session_id": "6e5e5b33-ab5c-40da-b9f0-19bec7da55dd",
"event_id": "8",
"owner_ref": "YOUR_PARTNER_CODE-user-42",
"status": "ACTIVE",
"expires_at": "2026-09-04T13:30:00.000Z",
"requires_access_code": true,
"event": { "id": "8", "min_price": 35000, "currency": "GNF" },
"map": { "event_id": "8", "zones": [], "sections": [], "seats": [] },
"availability": { "scope": "overview", "remaining": 18894, "zones": [], "sections": [] },
"holds": []
}
}
Postman (for developers)
Download the ready-made collection. Set base_url = https://book.stadepassgn.com, your partner_code, and event_secret. Run the requests from top to bottom.
If something goes wrong
Common problems in plain language.
401— Partner code missing or wrong401 ACCESS_DENIED— Event code missing or wrong when opening the event404— Session or seat not found409— Seat already taken by someone else410— Too slow — session or seat hold expired (try again)
{
"code": "ACCESS_DENIED",
"message": "Invalid or missing event access_code"
}