Warming up the decks…
Warming up the decks…
BlendPartner APIblendapp.aiEverything needed to render an event page and start a purchase, in one request.
The catalog list gives you a card. This endpoint gives you the whole event: the ticket types and their prices, optional add-ons, the questions a buyer must answer, the organiser’s branding, and the payment methods that apply. It is the same payload that powers the event page on Blend itself, so what your customer sees in your app matches what they would see on ours.
You can address an event three ways and they all resolve to the same record. Once you have the payload, the next step is to open a buyer session and reserve an order.
Requires the catalog.read scope and the same two headers as every other call; the base URL is https://api.blendapp.ai/api/v1.
:id accepts any of the three identifiers you receive on a catalog card. You do not need to tell the API which one you are sending.
| Accepted form | Type | Description |
|---|---|---|
| ObjectId | string | Blend’s internal 24-character hexadecimal identifier. |
| shortId | string | The short identifier from the card’s shortId field. The card’s id field carries this where one exists. |
| slug | string | The human-readable slug from the card’s slug field, the same one that appears in the event’s public URL. |
The simplest integration passes id from the list response straight into this path. It is always one of the accepted forms, so you never need to inspect it.
curl "https://api.blendapp.ai/api/v1/channel/events/8fK3qLp" \
-H "x-blend-key: ck_live_xxxxxxxx" \
-H "x-blend-secret: cs_live_xxxxxxxx"A successful call returns 200 with the standard envelope and the full event page payload in data. The payload is large by design; the keys below are the ones an integration typically depends on. The list is representative rather than exhaustive, and your code should ignore keys it does not recognise rather than reject the response.
{
"success": true,
"code": null,
"message": null,
"data": {
"tickets": [ ... ],
"addonItems": [ ... ],
"customQuestions": [ ... ],
"sponsors": [ ... ],
"showings": [ ... ],
"branding": { ... },
"whishAvailable": ...,
"blockedPaymentMethods": [ ... ],
"codOffered": ...,
"membership": ...,
"metaPixelIds": [ ... ],
"organizerId": ...,
"allowedDomains": [ ... ],
"lotteryEntryCount": ...
}
}tickets: the ticket types on sale. This is what you render as the price list and what a buyer chooses from at checkout.addonItems: optional extras that can be added to an order alongside tickets.customQuestions: questions the organiser requires a buyer to answer before purchase.showings: the individual showings or sessions, for events that run more than once.branding: the organiser’s presentation settings for the event page.sponsors: sponsor entries to display with the event.whishAvailable: whether Whish is offered for this event.codOffered: whether cash on delivery is offered for this event.blockedPaymentMethods: payment methods the organiser has switched off for this event.membership: membership settings attached to the event.organizerId: the organiser that owns the event.metaPixelIds: the organiser’s Meta pixel identifiers.allowedDomains: domains the organiser has permitted for the event.lotteryEntryCount: the entry count for events that run a lottery.The per-field shape of tickets, addonItems and the checkout inputs is documented where you use them, on Reserving an order.
Three outcomes other than success are possible. Each is signalled by the HTTP status and, in the body, by code.
| Status · code | Type | Description |
|---|---|---|
| 404 · EVENT_NOT_FOUND | not found | No event with that identifier is available to you. Returned both when the event does not exist and when it exists but is not in your catalog; see below. |
| 403 · EVENT_CANCELLED | forbidden | The event exists but has been cancelled. Do not offer tickets; a cancelled event is also removed from the list. |
| 403 · EVENT_NOT_AVAILABLE | forbidden | The event exists but is embargoed and cannot be shown yet. |
HTTP/1.1 404 Not Found
Content-Type: application/json
{
"success": false,
"code": "EVENT_NOT_FOUND",
"message": "Event not found."
}The general envelope and every other code the API can return are on the Errors page.
Blend hosts events for many organisers and many partners. Your catalog is the subset Blend has granted to you. When you request an event that exists on Blend but is not in your catalog, the API returns a 404 EVENT_NOT_FOUND that is byte-identical to the one for an identifier that has never existed: same status, same headers, same body.
This is deliberate. If a hidden event answered differently from a non-existent one, even by a single character or a few milliseconds of latency in the body, the endpoint could be used as an existence oracle: a script could walk short IDs or guess slugs and build a map of every event on the platform, including ones an organiser has not announced. Making the two cases indistinguishable closes that door for every partner, including you.
# An event that does not exist anywhere on Blend
curl -i "https://api.blendapp.ai/api/v1/channel/events/does-not-exist" \
-H "x-blend-key: ck_live_xxxxxxxx" \
-H "x-blend-secret: cs_live_xxxxxxxx"
# A real event that Blend has not added to your catalog
curl -i "https://api.blendapp.ai/api/v1/channel/events/someone-elses-event" \
-H "x-blend-key: ck_live_xxxxxxxx" \
-H "x-blend-secret: cs_live_xxxxxxxx"
# Both print the same status line, the same headers and the same body,
# byte for byte. Diff them if you like.You cannot tell, and should not try to tell, whether a 404 means “deleted” or “not granted”. Treat every EVENT_NOT_FOUND the same way: remove the event from anything you have cached and show the customer a not-found state.
Use tickets for the price list and addonItems for extras. Honour blockedPaymentMethods when you build the payment step.
It is either gone or was never yours. Drop it from your cache and from any deep link you were about to open. The catalog list will already have stopped returning it.
The event is real and the customer may have heard of it, so a “this event has been cancelled” state is more helpful than a generic error.
The event is embargoed. Do not show its details; it will become available when the organiser lifts the embargo, and it will appear in the list at that point.