BlendPartner API
blendapp.ai

Getting started

OverviewQuickstartHow the integration worksAuthenticationAny backend

Catalog

Listing eventsEvent detail & ticketsWhich events you see

Checkout

Buyer sessionsInventory & seat holdsReserving an orderTaking the paymentConfirming & settlement

Mobile apps

Native UI (no webview)Embedding the webviewiOS (Swift)Android (Kotlin)React Native

Reference

ErrorsRate limitsTesting & go-live

Native UI, no webview

Yes, you can render everything yourself. The same API that powers Blend’s own screens is available to you directly, so if you want events to look like the rest of your app rather than a webview inside it, nothing stops you.

This is the same set of credentials and the same catalog. The only difference is who draws the pixels. You can also mix the two: many partners list events natively, because that is the screen their users browse, and hand off to the webview for checkout, because that is the screen with the seat map and the money in it.

What you get, headless

Every one of these takes your x-blend-key and x-blend-secret and needs no buyer session.

EndpointWhat it gives you
GET /v1/channel/eventsYour catalog, paged and filterable. Cards with title, image, venue, date, price from, sold out.
GET /v1/channel/events/:idThe full event: ticket types and prices, add-ons, custom questions, branding, showings.
GET /v1/channel/events/:id/seats/configThe seat map layout, for events that have one.
GET /v1/channel/events/:id/seats/availabilityWhich seats are free right now.
POST /v1/channel/events/:id/seats/hold-tokenOpens a hold session for one buyer.
POST /v1/channel/events/:id/seats/holdHolds specific seats, atomically, all or nothing.
POST /v1/channel/events/:id/seats/hold/:token/extendOne extension, for a payment attempt.
POST /v1/channel/events/:id/seats/releaseGives seats back immediately.
POST /v1/channel/events/:id/quoteServer calculated totals: subtotal, discount, fee, VAT, total.
POST /v1/channel/events/:id/checkoutReserves the order and returns an orderId and amount.
POST /v1/channel/orders/statusThe authoritative amount and paid state.
POST /v1/channel/orders/confirmSigned confirmation once you have taken the money.
POST /v1/channel/events/:id/access/validateChecks an access code for a gated event.

The flow, natively

Identical to the webview flow, minus the webview. Your backend still makes the calls that carry the secret; your app talks to your backend, never to Blend.

Headless lifecycle
1.  Your backend   GET  /v1/channel/events
                    -> render your own list screen

2.  Your backend   GET  /v1/channel/events/:id
                    -> render your own event screen and ticket picker

3.  (seated only)  POST /v1/channel/events/:id/seats/hold-token
                   GET  /v1/channel/events/:id/seats/availability
                   POST /v1/channel/events/:id/seats/hold

4.  Your backend   POST /v1/channel/events/:id/quote
                    -> show the total Blend calculated, never your own

5.  Your backend   POST /v1/channel/events/:id/checkout
                    -> { orderId, amount, currency }

6.  Your app       charge on your own rail
    Your backend   POST /v1/channel/orders/confirm   (signed)
                    -> Blend issues the ticket
GET/v1/channel/events
curl "https://api.blendapp.ai/api/v1/channel/events?limit=20" \
  -H "x-blend-key: ck_live_xxxxxxxxxxxxxxxx" \
  -H "x-blend-secret: cs_live_xxxxxxxxxxxxxxxx"
Powered byBlend

What you take on

Being honest about the trade, because it is a real one. Going headless means you own these, and each is a place a webview would have been correct for free:

You now ownWhy it matters
Price displayAlways show the total from /quote. Never add up line items yourself: discounts, fees and VAT are calculated server side and a total you compute will eventually disagree.
Sold out statesYour list is a snapshot. A card can go stale between render and tap, so handle the 409s in Errors rather than trusting soldOut.
Hold timersA seat hold shows 600 seconds. If your UI does not count it down, buyers lose seats with no explanation.
The seat mapThe layout and availability are yours through the API, but drawing an interactive, zoomable seat map that stays correct under contention is the single biggest piece of work here.
Custom questions and add-onsEvents can require answers or offer extras. In a webview these render themselves; natively you build each form.
Ticket delivery UIBlend still issues the ticket, emails it and makes the wallet pass. If you want it shown in-app, you render it.
The hybrid most partners land on

List events natively, because browsing is your app’s look and feel and the catalog endpoint is easy to render. Hand off to the webview at the point the buyer picks a ticket, because that is where the seat map, the questions, the add-ons and the money live, and all of it stays correct without you maintaining it.

You get your own storefront and none of the checkout surface area.

Buyer identity is yours in this mode

With a webview session, Blend takes the buyer name and email from the server-side session and ignores anything the client sends. Headless, there is no session, so the buyer details on /checkout are whatever your backend sends. Send them from your authenticated user record, never from a field the app controls.

Listing eventsThe catalog endpoint in full.Inventory & seat holdsHold lifetimes and the oversell guard.Any backendSigning samples for every stack.Embedding the webviewThe hosted alternative, for comparison.
Powered byBlend© 2026 Blend · Ticketing & event infrastructure