Model B
You already have a batch of codes. Give them to Brizz once — by CSV in the dashboard, or one API call — and checkout matches them locally with no live dependency on your systems.
You build a CSV, or one API call
Keys are issued per partner in the Brizz admin. The secret is shown once at creation and never again — Brizz stores only HMAC-SHA256(pepper, secret), so a database leak never yields a usable key. Keys are independently rotatable and revocable.
# Base URL
https://api.brizz.me/api/partner/v1
# Every request — bearer only, no alternative header accepted
Authorization: Bearer brz_partner_<credential_id>.<secret>Each key carries an explicit least-privilege scope set. A key with only codes:read can never mint.
| Scope | Grants |
|---|---|
| campaigns:read | List your campaigns and their state |
| codes:read | Check the status of a single code |
| codes:write | Mint or import codes into a campaign |
| redemptions:read | Pull redemptions for reconciliation |
Error responses are deliberately uninformative
A missing key, a wrong key, a revoked key and an insufficient scope all return the same response. Nothing distinguishes them, so a caller probing for valid keys or scopes learns nothing.
| Endpoint | Scope | Rate limit | Purpose |
|---|---|---|---|
| GET /campaigns | campaigns:read | 300/min | Your campaigns |
| POST /codes/status | codes:read | 300/min | One code's state |
| POST /campaigns/{uuid}/codes | codes:write | 10/min | Mint or import |
| GET /campaigns/{uuid}/redemptions | redemptions:read | 30/min | Paginated redemptions |
A shared ceiling of 600/min per partner applies across all endpoints, plus 60/min per IP before authentication. Exceeding a limit returns 429.
Same endpoint as Model A's mint — the request body decides which happens.
# scope: codes:write
Authorization: Bearer brz_partner_<credential_id>.<secret>
Idempotency-Key: 9a1b…
{
"codes": [
"PARTNER-AB12",
"PARTNER-CD34"
]
}The response reports imported and skipped counts, so duplicates in your batch are visible rather than silently dropped. Idempotency-Key is required and a replay returns the original result.
# →
{ "code": "PARTNER-AB12" }
# ← 200
{
"code": {
"status": "REDEEMED",
"redeemed_at": "2026-07-22T18:04:11+00:00",
"campaign_uuid": "…"
}
}A code moves AVAILABLE → RESERVED → REDEEMED, and REFUNDED if the booking is refunded. No buyer identity is ever returned — status, timestamp and owning campaign only.
Rather than poll, subscribe. Brizz pushes code.redeemed to your URL, signed so you can verify authenticity. Delivery is at-least-once with retry and backoff — dedupe on the event id.
X-Brizz-Timestamp: 1784654651 # unix seconds
X-Brizz-Event-Id: <uuid> # dedupe key
X-Brizz-Signature: v1=<hex>[,v1=<hex>]
# HMAC-SHA256 over the exact transmitted bytes:
# "{timestamp}.{event_id}.{raw_body}"The dual v1=,v1= form appears only during a signing-secret rotation: the previous secret stays valid for a 24-hour grace window, so you can switch over with no dropped deliveries.
Every campaign produces a report of what was redeemed and what is owed — downloadable from the dashboard at any time, and optionally emailed to you monthly plus a final one when the campaign closes.
# ?from=&to=&cursor=&limit=
# from + to are REQUIRED (UTC; a date-only value expands to the whole day)
# keyset-paginated by (redeemed_at, id) · limit default 100, max 500Every row carries code, status, redeemed_at and event, alongside invoice_total_eur, redeemed_count and refunded_count.
Brizz uses cookies to improve your experience and measure site usage. You can manage your preferences at any time.