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

Listing events

One request returns the events you are allowed to sell, ready to render as a list.

Every partner has a catalog: the set of events Blend has switched on for them. This endpoint returns that catalog as a list of compact cards, twenty at a time, each with enough information to draw a tile in your app: a title, a cover image, the date, the venue, and the lowest ticket price. Nothing appears here that you have not been granted, and nothing appears that a customer could not actually buy today.

When a customer taps a card, fetch the full event with Event detail & tickets. To understand how the catalog itself is decided, see Which events you see.

GET/v1/channel/events

Requires the catalog.read scope. Send both credentials on every call; the base URL is https://api.blendapp.ai/api/v1.

HeaderTypeDescription
x-blend-key
required
stringYour partner key, ck_live_….
x-blend-secret
required
stringYour partner secret, cs_live_…. Never ship this in a mobile app or browser bundle.

Query parameters

All parameters are optional. With none, you get the first twenty upcoming events in catalog order.

Query parameterTypeDescription
pageintegerPage number, starting at 1. Default 1.
limitintegerCards per page. Default 20, maximum 50.
searchstringFree text, up to 120 characters. Matches against the event title, location and venue.
citystringUp to 80 characters. Restricts results to a city.
categorystringUp to 60 characters. An exact match on the event category, as returned in each card.
fromISO dateOnly events on or after this date, e.g. 2026-10-01. Filters on the event date.
toISO dateOnly events on or before this date. Combine with from for a window.

Request

curl "https://api.blendapp.ai/api/v1/channel/events?page=1&limit=20" \
  -H "x-blend-key: ck_live_xxxxxxxx" \
  -H "x-blend-secret: cs_live_xxxxxxxx"

Response

A successful call returns 200 with the standard envelope. The cards live in data.events; paging information sits alongside in pagination. Values below are illustrative.

200 OK
{
  "success": true,
  "code": null,
  "message": null,
  "data": {
    "events": [
      {
        "id": "8fK3qLp",
        "shortId": "8fK3qLp",
        "slug": "beirut-jazz-night",
        "title": "Beirut Jazz Night",
        "coverImageUrl": "https://images.example.com/8fK3qLp/cover.jpg",
        "startDate": "2026-10-03T00:00:00.000Z",
        "endDate": "2026-10-03T00:00:00.000Z",
        "startTime": "20:00",
        "timezone": "Asia/Beirut",
        "venue": "Music Hall, Beirut",
        "category": "Music",
        "currency": "USD",
        "priceFrom": 25,
        "soldOut": false,
        "lowStock": false
      }
    ]
  },
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 37,
    "pages": 2
  }
}

The event card

Each entry in data.events has exactly these fields. The card is deliberately small: it is what you need to draw a list, not the full event, so the list stays fast even at fifty cards a page.

FieldTypeDescription
idstringThe identifier to use when fetching the event. This is the event’s short ID where one exists, otherwise its ObjectId. Either form is accepted by the detail endpoint.
shortIdstringThe event’s short, URL-friendly identifier.
slugstringThe human-readable slug from the event’s public page. Also accepted by the detail endpoint.
titlestringThe event title.
coverImageUrlstringAbsolute URL of the cover image.
startDatestringThe date the event starts.
endDatestringThe date the event ends.
startTimestringThe local start time, for display.
timezonestring | nullThe event’s time zone. May be null when the organiser has not set one; treat the time as local to the venue in that case.
venuestringThe venue name.
categorystringThe event category. Pass it back verbatim as the category filter.
currencystringThe currency every price for this event is quoted in.
priceFromnumberThe lowest effective price across the event’s enabled ticket types, in currency. Use it for “From $25” labels.
soldOutbooleantrue when no ticket type has stock left. Show the card, but do not offer a purchase.
lowStockbooleantrue when the event is nearly sold out. Show a short status such as “Almost gone”. Blend publishes no stock counts; see stock status.

Pagination

FieldTypeDescription
pageintegerThe page you received.
limitintegerThe page size that was applied.
totalintegerTotal events matching your filters across all pages.
pagesintegerTotal number of pages at this limit.
Fetching every page
// Walk every page of the catalog. Stop when pagination.pages is reached.
async function fetchAllEvents() {
  const headers = {
    'x-blend-key': 'ck_live_xxxxxxxx',
    'x-blend-secret': 'cs_live_xxxxxxxx',
  };
  const events = [];
  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();

    events.push(...body.data.events);
    pages = body.pagination.pages;
    page += 1;
  } while (page <= pages);

  return events;
}

Filtering

Filters combine: a request with city, from and to returns only events in that city inside that date window. search is the only fuzzy parameter; category is an exact match, so use the value you were given in a card rather than a guess.

# Everything in Beirut during October, 50 per page
curl "https://api.blendapp.ai/api/v1/channel/events?city=Beirut&from=2026-10-01&to=2026-10-31&limit=50" \
  -H "x-blend-key: ck_live_xxxxxxxx" \
  -H "x-blend-secret: cs_live_xxxxxxxx"

What is included

An event has to clear every one of these before it can appear in your list. There is no parameter to bypass any of them.

  • It is in your catalog and switched on (see Which events you see).
  • Its visibility is Public.
  • It has been approved by Blend.
  • It has not been cancelled.
  • It has not been deleted.
  • It is upcoming: on or after the start of today.
Past events drop out on their own

The “upcoming” rule is evaluated on every request from the start of the current day, so yesterday’s event disappears from the list without any change on Blend’s side. If you cache the list, expect it to shrink overnight.

Ordering

A curated catalog is returned in the order Blend arranged it for you, which is what you should show. The sort is, in priority order:

  1. Featured events first.
  2. Then the sort order a Blend admin set for your listing.
  3. Then event date, soonest first.

The response does not carry a separate featured flag; the position in the list is the signal. If you re-sort client-side (by date, say), you lose the arrangement Blend made for you.

Powered byBlend

Caching

Every response carries two headers that you should leave alone.

Response headers
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: private, no-store
Vary: x-blend-key

The reason is simple: the list is yours. Two partners calling the same URL with different keys receive different catalogs. A CDN, a corporate proxy or a shared application cache that keyed on the URL alone would hand one partner’s catalog to another.

  • Cache-Control: private, no-store tells every shared cache between you and Blend not to store the body at all.
  • Vary: x-blend-key tells any cache that does store it that the key is part of the identity of the response, so one partner’s copy can never satisfy another’s request.
Cache in your own service, not in front of it

If you want to avoid calling Blend on every screen load, cache the parsed result inside your backend, keyed by your own partner identity, and refresh it on a short interval. Do not put a caching proxy between your servers and api.blendapp.ai and do not strip these headers.

Rate limit

This endpoint allows 600 requests per minute per key. A list of fifty cards is a single request, so a full crawl of even a large catalog is a handful of calls; a per-user poll on every app launch is not what the limit is for. See Rate limits for how a limit is signalled.

Next

Event detail & ticketsFetch a single event by ID, short ID or slug, with tickets and add-ons.Which events you seeHow Blend decides your catalog, and what your code sees when it changes.AuthenticationWhere keys come from and how to keep the secret out of client code.ErrorsThe envelope, error codes and how to handle each.
Powered byBlend© 2026 Blend · Ticketing & event infrastructure