StadePassPartner guide
FR EN
For partners

StadePass Public API

In plain words: see your events → open one with your event code → pick seats on the map → reserve them → take payment → confirm so tickets are issued.

Website for partners: https://book.stadepassgn.com. Keep your partner code and event code private (on your server only).

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.

CodeWhenUse
Partner codeYour company code (example: YOUR_PARTNER_CODE)Send it every time you talk to StadePass (like a badge at the door)
Event codeOne code per event we invite you toSend 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

HeaderDescription
x-partner-codeYour partner code — like showing your badge on every call
x-envOptional: 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
See details →
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
See details →
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
See details →
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=
See details →
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
See details →
5. See the total to charge

Get the amount before you take payment from the customer.

GET /api/v1/public/booking-sessions/:id/checkout
See details →
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
See details →
7. List tickets

Tickets for owner_ref. Includes qr_code + place{} (tribune.couleur).

GET /api/v1/public/tickets?owner_ref=
See details →
8. Fetch one ticket

Same owner_ref. Returns qr_code + place{} (tribune.couleur). No QR image.

GET /api/v1/public/tickets/:id?owner_ref=
See details →

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.

FieldShow / usage
qr_code32-char hex QR payload — encode as QR on your app
place.place_idUNIQUE seat id — always key on this
place.place, rangee, numero_placeHuman seat label (W16) + row + number
place.porteGate: Ouest 1 / Ouest 2 / Est / Nord / Sud (code + libelle)
place.tribune.couleurStand color (#hex) for UI styling
place.tribune / route_texteStand name + path to seat
place.code_litigeDispute code STD-{event}-S{place_id}
ticket_numberHuman-readable ticket id on the pass
Frontend example
<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

What you send
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"
}'
What you get back
{
  "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 ACCESS_DENIED
{
  "code": "ACCESS_DENIED",
  "message": "Invalid or missing event access_code"
}