Warming up the decks…
Warming up the decks…
BlendPartner APIblendapp.aiYour catalog is chosen by Blend, event by event. You never have to police it.
Blend hosts thousands of events for many organisers. Not all of them belong in your app, and deciding which ones do is not a job you should have to do yourself. So Blend does it: a member of our team adds each event to your listing, orders the list, marks the ones worth featuring, and switches any event off the moment it should no longer be sold through you. The API simply reflects those decisions.
The first half of this page is for whoever owns the commercial relationship: what control exists and where it is exercised. The second half is for whoever writes the integration: precisely what the API returns before, during and after a change.
Every partner account has a catalogScope. It is set by Blend and takes one of two values.
| catalogScope | Type | Description |
|---|---|---|
| curated | default | You see only the events a Blend admin has explicitly added to your listing and switched on. This is the production setting. |
| all_events | staging only | You see every event that clears Blend’s general visibility rules, with no per-partner selection. It exists so that a staging integration has data to work with; it is not used for a live storefront. |
In the Blend admin console, under Channel Partners → your partner → Events, each event that has been added to your listing carries three controls. Together they are the whole of your catalog.
| Control | Type | Description |
|---|---|---|
| On / off switch | enabled | Whether the event is currently offered through you. Off means the event is invisible to your integration in every way. |
| Feature star | featured | Pins the event to the top of your list, ahead of everything that is not featured. |
| Drag to reorder | sortOrder | The position of the event within your list. This is the order the API returns and the order your app should show. |
The organiser creates it, sets it to Public, and Blend approves it. This is the same bar every event on Blend must clear; nothing partner-specific yet.
Until this happens the event does not exist as far as your integration is concerned. There is no “public by default”: an event with no row in your listing is denied, not merely unsorted.
It now appears in your list in the position the admin chose, and its detail page resolves.
It vanishes from your list and its detail page returns the same not-found response as an event that never existed. Nothing on your side needs to change.
There is no endpoint for a partner to add, remove, reorder or feature events. The catalog is controlled entirely by Blend, which means you are never in the position of having to notice that an organiser pulled an event, or that a show was postponed, and then act on it. When the facts change, your list changes with them.
To ask for an event to be added, removed, featured or moved, contact your Blend account manager. Changes made in the console take effect on the API without any action from you.
The rules above reduce to a small table. In each row, “list” is GET /v1/channel/events and “detail” is GET /v1/channel/events/:id.
| Listing state | Type | Description |
|---|---|---|
| No row in your listing | denied | List: absent. Detail: 404 EVENT_NOT_FOUND, byte-identical to a non-existent identifier. |
| enabled: false | denied | List: absent. Detail: the same 404 EVENT_NOT_FOUND. Turning an event off is indistinguishable from it never having existed. |
| enabled: true | visible | List: present, subject to the general visibility rules below. Detail: 200 with the full payload. |
| featured: true | ordering | List: sorted ahead of every non-featured event. Detail: unchanged. The card carries no featured field; position is the signal. |
| sortOrder | ordering | List: the position among events with the same featured value. Detail: unchanged. |
A listing row makes an event eligible. It is only returned if it also clears the platform-wide checks that apply under both scopes: the event is Public, approved by Blend, not cancelled, not deleted, and upcoming from the start of today. An enabled event that has passed, for example, is absent from the list even though its row is still switched on. Under all_events these checks are the only filter, which is why that scope is confined to staging.
For a curated catalog the list is sorted by:
featured, featured first;sortOrder, as set by the admin;Render the list in the order you receive it. The admin’s arrangement is the product; a client-side re-sort discards it.
There is no field on any response that says “this partner may see this event”. Permission is expressed only by presence: an event you can sell is in your list and its detail resolves; one you cannot sell is not in your list and its detail is a 404. This is why the detail endpoint refuses to distinguish “not yours” from “does not exist”: doing so would leak the existence of every event you were not granted. The full reasoning is on Event detail & tickets.
curl "https://api.blendapp.ai/api/v1/channel/events" \
-H "x-blend-key: ck_live_xxxxxxxx" \
-H "x-blend-secret: cs_live_xxxxxxxx"404 as a normal outcome, not an incident.Cache-Control: private, no-store and Vary: x-blend-key for that reason. Keep any cache inside your own service.// Re-read the catalog on a schedule and reconcile your own store against it.
// Anything missing from the list has been switched off, cancelled, or has passed.
async function syncCatalog(store) {
const headers = {
'x-blend-key': 'ck_live_xxxxxxxx',
'x-blend-secret': 'cs_live_xxxxxxxx',
};
const seen = new Set();
let page = 1;
let pages = 1;
do {
const url = new URL('https://api.blendapp.ai/api/v1/channel/events');
url.searchParams.set('page', String(page));
url.searchParams.set('limit', '50');
const res = await fetch(url, { headers });
const body = await res.json();
for (const card of body.data.events) {
seen.add(card.id);
store.upsert(card); // keep the position: the list is already in Blend's order
}
pages = body.pagination.pages;
page += 1;
} while (page <= pages);
store.removeWhere((card) => !seen.has(card.id));
}A staging partner is usually scoped all_events, so its list is long and unordered by any admin. Do not let a staging integration assume the production catalog will look the same; in production you will see only what has been curated for you.