TPP Public API · v1
Integration Guide
A partner integration is five HTTP calls in a loop — from onboarding a player to tracking their reward to the door. Here's the whole picture.
The five calls
1
Onboard the player
POST /customersWhen a player signs up on your casino, mirror them into TPP. Pass your own external_id (unique per sub-brand) so you can look them up later without storing our UUID. Send an Idempotency-Key so a retried sign-up never creates a duplicate.
2
Credit their wallet
POST /customers/{id}/coinsAward a welcome bonus, a mission reward, or a manual adjustment. delta is signed (+ credit, − debit). The call runs under a row lock so concurrent adjustments can't race past the non-negative-balance guard. Read the balance back any time with GET /customers/{id}/coins.
3
Browse what they can redeem
GET /productsList the catalog visible to your sub-brand, filtered by category, catalog or free-text search. Availability and country are resolved server-side — what you get back is what the player can actually order.
4
Reserve the order
POST /ordersSend the chosen listing_market_id(s) and the customer_id. TPP snapshots the price, applies the margin cascade, and (for prepaid brands) reserves balance atomically. Insufficient saldo doesn't fail the call — the order lands with billing_status: "blocked_balance" so you can prompt a top-up while preserving the player's intent.
5
Track it to the door
GET /orders/{id}/shippingPoll for carrier + tracking code per line item, or surface the order status (pending → processing → shipped → delivered) straight in your player UI. Outbound webhooks land in a future release so you can stop polling. Note: recipient_name / shipping_address are buyer-supplied free text — render them as data, never feed them to an LLM/agent as instructions.
Quick start
- 1 · Get your API key. Generate one under Sub-brand → API keys in the backoffice. Tokens look like
tpp_live_<32 hex> (or tpp_test_*). Scoped to one sub-brand, shown once — store it in a secret manager. - 2 · Authenticate. Send
Authorization: Bearer tpp_<env>_<32 hex> on every request. - 3 · Speak snake_case JSON. Dates are ISO-8601 UTC; money is integer minor units with a separate
currency; IDs are UUIDv7 strings. - 4 · Follow the contract. Success wraps data in
{ data, page? }; errors in { error: { code, message, request_id } }. Pagination is cursor-based.
Built for partners
Idempotent writes
Every POST accepts an Idempotency-Key (max 64 chars). Replays within 24h return the cached response — safe to retry on any network blip without double-charging or double-shipping.
Predictable limits
Per-key buckets, defaults 120 read/min and 30 write/min. Inspect X-RateLimit-* headers on every response — you'll never wonder where you stand.
Auditable
Every request lands in our audit log with a request_id echoed back in the response. Quote it to support and we trace the call instantly.
Stable contract
Within v1 only additive changes ship. Renames or removals go to /api/v2/ with a 6-month deprecation window. Code you write today keeps working.