4 operations. Every schema and example on this page is generated from the platform contract.
Use this when the person wants to know whether one option can be had on a particular date, at a time of day or in a quantity: open collection or appointment times, how many are left, spaces in a class, or when ordering opens or closes. It reads the latest figures at the moment of asking, so use it again just before the person decides. Needs an offering_id from an earlier result, and checks up to 14 days at a time. Do not use to search for new options or for details such as ingredients (use search_local_offerings or get_offering).
The offering.id of one option from search_local_offerings or get_business, e.g. itm_<32 hex>.
First day to check, YYYY-MM-DD, UK date. Default today.
Last day to check, YYYY-MM-DD. For one day send the same date as earliest_date. Default: the 7 days from earliest_date. At most 14 days in all.
Not before this local UK time, HH:MM. 'After work' is usually 17:30.
Not after this local UK time, HH:MM. 'Before work' is usually 08:00.
How many. Send quantity_unit with it.
'people' = people it must serve or who take part; 'items' = things (30 cupcakes).
peopleitemsready_to_buymade_to_orderpreorderappointmentclassmembership_or_passeventbusinessbiz_<32 hex>. Send as business_id to look inside this business.
Plain word for the business, e.g. bakery, cafe, gym, barber.
homepremisesmobileonlineunknownTown and postcode district, never a street, e.g. "South Nutfield, RH1".
The street address, ONLY when the seller chose to publish it. Null for everyone else.
One plain sentence, e.g. "Membber shows 3 left; orders close Fri 9 Oct, 11:00".
"Fri 9 to Sat 10 Oct 2026".
True when no date was given and the default days were used.
confirmedlikelyunknownavailablelimitedopens_latertaking_orderssold_outfully_bookedclosedunknownYYYY-MM-DD, the business’s local date.
HH:MM local time.
HH:MM local time.
Places or items left in this slot, when the seller shows counts.
YYYY-MM-DD, the business’s local date.
HH:MM local time.
HH:MM local time.
Places or items left in this slot, when the seller shows counts.
Say "Membber shows N left", not "stock confirmed": a seller may also sell offline.
ISO instant orders close, when there is a cutoff.
ISO instant ordering or booking opens, when it has not yet.
ISO instant the live figures were read. Null when nothing live was read.
Why availability is unknown, when it is.
Whether the quantity asked for can be had, on live data or the seller’s word. Null: not asked, or not known.
datetimenoticeplacequantitybudgetdietallergensfulfilmentkindwho_forcustomisationaccessWhat was checked, in plain words, e.g. "Collect Sat 10 Oct, 10:00 to 16:00".
livesellermembber_rulesuggesteddatetimenoticeplacequantitybudgetdietallergensfulfilmentkindwho_forcustomisationaccessWhat was checked, in plain words, e.g. "Collect Sat 10 Oct, 10:00 to 16:00".
livesellermembber_rulesuggesteddatetimenoticeplacequantitybudgetdietallergensfulfilmentkindwho_forcustomisationaccessWhy it is not known, e.g. "The seller has not said how many it serves".
What the person can do, e.g. "Ask the seller before ordering".
`suggested` when unconfirmed listing text points one way; null when nothing is recorded at all.
livesellermembber_rulesuggestedopen_to_alldrop_inmembers_onlyPlain words, e.g. "Members only: a membership is needed first".
For members only: the memberships this business sells that include it, the lowest price first.
The plan as an option of its own (pln_<32 hex>), for get_offering. Null when it is not listed on its own.
exactfromrangeper_personper_sessionfreeunknownThe exact price, or the lowest for from/range.
The highest price for a range.
GBPAs a person would say it: "£4.50", "From £55", "£40 a session", "Free".
every_session, or some_sessions when the plan is for some times or days only.
every_sessionsome_sessionsFor example "An introductory offer" or "Some times or days only".
viewpreorderorderbookenquirerequest_custom_orderjoinA Membber page. Carries ?ref= so a later visit can be counted, never tied to a person.
webmembber_appISO instant this answer was put together.
What was skipped to answer quickly. Availability is never invented to fill a gap.
semantic_searchlive_availabilityplace_lookupcachetaxonomytimeoutunavailabledisableddaily_capload_sheddingerrorThis answer’s reference, also carried on every next-action link.
curl -G "https://www.membber.com/api/v1/discovery/availability" \
-H "Authorization: Bearer $MEMBBER_TOKEN" \
--data-urlencode "offering_id=3b791bf4-0000-4000-8000-d0c50000003b"import { createMembberClient } from "@membber/sdk-ts";
const membber = createMembberClient({
getAccessToken: () => process.env.MEMBBER_TOKEN,
});
const { data, error } = await membber.raw.GET("/api/v1/discovery/availability", {
params: { query: { offering_id: "3b791bf4-0000-4000-8000-d0c50000003b" } },
});
if (error) {
// Typed error envelope: { error: { code, message, requestId } }
throw new Error(`${error.error.code}: ${error.error.message}`);
}
console.log(data);import MembberSwift
let client = MembberClient(
serverURL: MembberClient.productionServerURL,
tokenProvider: { session.accessToken }
)
let response = try await client.api.getLocalOfferingAvailability(
query: .init(offeringId: "3b791bf4-0000-4000-8000-d0c50000003b")
).ok.body.json
print(response){
"contract_version": "<contract_version>",
"offering": {
"id": "00000d1b-0000-4000-8000-d0c500000000",
"kind": "ready_to_buy",
"title": "Morning class"
},
"business": {
"id": "00000d1b-0000-4000-8000-d0c500000000",
"name": "Example name",
"kind": "<kind>",
"seller_type": "home",
"area": "<area>",
"postcode_district": "EXAMPLE10",
"address": "<address>",
"canonical_url": "https://example.com/image.jpg"
},
"summary": "<summary>",
"window": {
"earliest": "<earliest>",
"needed_by": "<needed_by>",
"display": "<display>",
"time": {
"after": "<after>",
"before": "<before>"
},
"assumed": true
},
"availability_status": "confirmed",
"availability": {
"state": "available",
"next_available": {
"date": "<date>",
"from": "<from>",
"to": "<to>",
"left": -9007199254740991
},
"slots": [
{
"date": "<date>",
"from": "<from>",
"to": "<to>",
"left": -9007199254740991
}
],
"stock_left": -9007199254740991,
"spaces_left": -9007199254740991,
"order_by": "<order_by>",
"opens_at": "<opens_at>",
"checked_at": "<checked_at>",
"reason": "Added at the front desk"
},
"can_meet_quantity": true,
"constraints_satisfied": [
{
"constraint": "date",
"detail": "<detail>",
"basis": "live"
}
],
"constraints_not_satisfied": [
{
"constraint": "date",
"detail": "<detail>",
"basis": "live"
}
],
"constraints_unknown": [
{
"constraint": "date",
"why": "<why>",
"how_to_check": "<how_to_check>",
"basis": "live"
}
],
"access": {
"status": "open_to_all",
"detail": "<detail>",
"unlocked_by": [
{
"offering_id": "3b791bf4-0000-4000-8000-d0c50000003b",
"title": "Morning class",
"price": {
"type": "exact",
"amount_pence": 1500,
"max_pence": 1500,
"currency": "GBP",
"display": "<display>"
},
"covers": "every_session",
"note": "Added at the front desk"
}
]
},
"next_actions": [
{
"action": "view",
"label": "<label>",
"url": "https://example.com/image.jpg",
"where": "web"
}
],
"checked_at": "<checked_at>",
"degraded": [
{
"stage": "semantic_search",
"reason": "timeout"
}
],
"notes": [
"Added at the front desk"
],
"ref": "<ref>"
}Use this when the person names a business on Membber, or asks about one from earlier results: what it offers, its current and upcoming preorders, whether it is open now, the area it is in and how ordering or collection works. Accepts the business_id from a result, its Membber handle (as in membber.com/<handle>) or its name, with an optional town to tell similar names apart. When a name matches several businesses it lists them so the person can choose. Shows the area, not the street address, unless the business publishes it. Do not use to search across businesses for a need (use search_local_offerings).
The business.id from an earlier result. Wins over handle and name.
The business’s Membber handle, as in membber.com/<handle>, or its store code.
The business name as the person said it, when there is no id or handle.
A UK town to tell apart businesses with similar names, e.g. 'Redhill'.
foundseveral_matchesnot_foundOne plain sentence on what was found.
Null unless result_status is found.
biz_<32 hex>. Send as business_id to look inside this business.
Plain word for the business, e.g. bakery, cafe, gym, barber.
homepremisesmobileonlineunknownTown and postcode district, never a street, e.g. "South Nutfield, RH1".
The street address, ONLY when the seller chose to publish it. Null for everyone else.
The business’s own description, with addresses, postcodes, links and contact details removed.
From its opening hours, in its own timezone. Null: no usable hours.
Today’s hours as a person says them, e.g. "Open today 09:00 to 17:00".
collectiondeliveryat_the_businesscomes_to_youWhat it offers (at most 8). Use get_offering with an offering_id for one in full.
ready_to_buymade_to_orderpreorderappointmentclassmembership_or_passeventbusinessexactfromrangeper_personper_sessionfreeunknownThe exact price, or the lowest for from/range.
The highest price for a range.
GBPAs a person would say it: "£4.50", "From £55", "£40 a session", "Free".
True for a class only members can book.
For a members-only class: the memberships that include it, the lowest price first.
The plan as an option of its own (pln_<32 hex>), for get_offering. Null when it is not listed on its own.
exactfromrangeper_personper_sessionfreeunknownThe exact price, or the lowest for from/range.
The highest price for a range.
GBPAs a person would say it: "£4.50", "From £55", "£40 a session", "Free".
every_session, or some_sessions when the plan is for some times or days only.
every_sessionsome_sessionsFor example "An introductory offer" or "Some times or days only".
How many more it lists beyond these.
Preorders open now or opening soon, read live.
Read live: taking_orders, opens_later, sold_out, closed or unknown.
availablelimitedopens_latertaking_orderssold_outfully_bookedclosedunknownWhen it is collected, e.g. "Sat 10 Oct".
When a name matches several businesses: ask which one, then call again with its business_id.
under_one_mileone_to_two_milestwo_to_five_milesfive_to_ten_milesten_to_twenty_milesover_twenty_milessame_postcode_districtunknown"about 2 to 5 miles". Always approximate unless the seller published their address.
Exact distance, only when the seller chose to publish their full address.
viewpreorderorderbookenquirerequest_custom_orderjoinA Membber page. Carries ?ref= so a later visit can be counted, never tied to a person.
webmembber_appISO instant this answer was put together.
What was skipped to answer quickly. Availability is never invented to fill a gap.
semantic_searchlive_availabilityplace_lookupcachetaxonomytimeoutunavailabledisableddaily_capload_sheddingerrorThis answer’s reference, also carried on every next-action link.
curl -G "https://www.membber.com/api/v1/discovery/business" \
-H "Authorization: Bearer $MEMBBER_TOKEN"import { createMembberClient } from "@membber/sdk-ts";
const membber = createMembberClient({
getAccessToken: () => process.env.MEMBBER_TOKEN,
});
const { data, error } = await membber.raw.GET("/api/v1/discovery/business");
if (error) {
// Typed error envelope: { error: { code, message, requestId } }
throw new Error(`${error.error.code}: ${error.error.message}`);
}
console.log(data);import MembberSwift
let client = MembberClient(
serverURL: MembberClient.productionServerURL,
tokenProvider: { session.accessToken }
)
let response = try await client.api.getLocalBusiness().ok.body.json
print(response){
"contract_version": "<contract_version>",
"result_status": "found",
"summary": "<summary>",
"business": {
"id": "00000d1b-0000-4000-8000-d0c500000000",
"name": "Example name",
"kind": "<kind>",
"seller_type": "home",
"area": "<area>",
"postcode_district": "EXAMPLE10",
"address": "<address>",
"canonical_url": "https://example.com/image.jpg",
"image": {
"url": "https://example.com/image.jpg",
"alt": "<alt>"
}
},
"about": "<about>",
"open_now": true,
"opening_times": "<opening_times>",
"fulfilment_methods": [
"collection"
],
"offerings": [
{
"offering_id": "3b791bf4-0000-4000-8000-d0c50000003b",
"kind": "ready_to_buy",
"title": "Morning class",
"price": {
"type": "exact",
"amount_pence": 1500,
"max_pence": 1500,
"currency": "GBP",
"display": "<display>"
},
"members_only": true,
"unlocked_by": [
{
"offering_id": "3b791bf4-0000-4000-8000-d0c50000003b",
"title": "Morning class",
"price": {
"type": "exact",
"amount_pence": 1500,
"max_pence": 1500,
"currency": "GBP",
"display": "<display>"
},
"covers": "every_session",
"note": "Added at the front desk"
}
]
}
],
"more_offerings": -9007199254740991,
"current_preorders": [
{
"offering_id": "3b791bf4-0000-4000-8000-d0c50000003b",
"title": "Morning class",
"state": "available",
"opens_at": "<opens_at>",
"order_by": "<order_by>",
"collection": "<collection>"
}
],
"candidates": [
{
"business_id": "490799fa-0000-4000-8000-d0c500000049",
"name": "Example name",
"kind": "<kind>",
"area": "<area>",
"distance": {
"band": "under_one_mile",
"display": "<display>",
"approximate": true,
"km": 1
}
}
],
"next_actions": [
{
"action": "view",
"label": "<label>",
"url": "https://example.com/image.jpg",
"where": "web"
}
],
"checked_at": "<checked_at>",
"degraded": [
{
"stage": "semantic_search",
"reason": "timeout"
}
],
"notes": [
"Added at the front desk"
],
"ref": "<ref>"
}Use this when the person asks about one option already found: what it is, what it costs, how it is collected, delivered or attended, whether it is made to order and how much notice it needs, how many it serves, and its diets and allergens. Needs an offering_id from search_local_offerings or get_business. Diet and allergen facts count only when the seller has confirmed them; otherwise the answer says they are not confirmed, so tell the person to ask the seller. For a members-only class it names the membership that includes it. Do not use to check a date, time or quantity (use get_live_availability) or to look for other options (use search_local_offerings).
The offering.id of one option from search_local_offerings or get_business, e.g. itm_<32 hex>.
Stable id for follow-up calls, e.g. itm_<32 hex>.
ready_to_buymade_to_orderpreorderappointmentclassmembership_or_passeventbusinessThe seller’s own words, with links, contact details and addresses removed.
The seller’s own section or category for it, e.g. "Celebration cakes".
The seller’s own photo. Stock photos are never sent.
This offering’s permanent page on Membber. Today it is the business’s shop page.
biz_<32 hex>. Send as business_id to look inside this business.
Plain word for the business, e.g. bakery, cafe, gym, barber.
homepremisesmobileonlineunknownTown and postcode district, never a street, e.g. "South Nutfield, RH1".
The street address, ONLY when the seller chose to publish it. Null for everyone else.
exactfromrangeper_personper_sessionfreeunknownThe exact price, or the lowest for from/range.
The highest price for a range.
GBPAs a person would say it: "£4.50", "From £55", "£40 a session", "Free".
For things the seller makes or sells. Null for classes, plans, appointments and events.
The seller’s own word only. Null: the seller has not said.
Days of notice the seller asks for. Null: not said.
The seller’s own note on what can be changed, e.g. "Colours and a message".
How many it serves, in the seller’s own word. Null: not said.
What the listing only suggests, said as not confirmed by the seller, e.g. "The listing mentions serves 12; the seller has not confirmed it".
Occasions the seller says it is for, e.g. "birthday". Suggestions are never listed.
For food. Null when it is not food.
Diets the seller has confirmed it suits. Halal and kosher are never recorded.
vegetarianvegangluten_freedairy_freehalalkosherseller_confirmednot_confirmed_by_sellernot_statedseller_confirmednone_declared_by_sellernot_confirmed_by_sellernot_statedUK allergen groups it contains, ONLY when the seller confirmed the list. Empty otherwise: then ask the seller.
celeryglutencrustaceanseggsfishlupinmilkmolluscsmustardpeanutssesamesoyasulphitestree_nutsWhat to tell the person, e.g. "The seller lists milk and eggs. Membber cannot rule out traces."
collectiondeliveryat_the_businesscomes_to_youArea only, e.g. "Redhill, RH1 (exact place given when you order)".
confirmedlikelyunknownavailablelimitedopens_latertaking_orderssold_outfully_bookedclosedunknownYYYY-MM-DD, the business’s local date.
HH:MM local time.
HH:MM local time.
Places or items left in this slot, when the seller shows counts.
YYYY-MM-DD, the business’s local date.
HH:MM local time.
HH:MM local time.
Places or items left in this slot, when the seller shows counts.
Say "Membber shows N left", not "stock confirmed": a seller may also sell offline.
ISO instant orders close, when there is a cutoff.
ISO instant ordering or booking opens, when it has not yet.
ISO instant the live figures were read. Null when nothing live was read.
Why availability is unknown, when it is.
For classes and events: who can come, and what opens a members-only one.
open_to_alldrop_inmembers_onlyPlain words, e.g. "Members only: a membership is needed first".
For members only: the memberships this business sells that include it, the lowest price first.
The plan as an option of its own (pln_<32 hex>), for get_offering. Null when it is not listed on its own.
exactfromrangeper_personper_sessionfreeunknownThe exact price, or the lowest for from/range.
The highest price for a range.
GBPAs a person would say it: "£4.50", "From £55", "£40 a session", "Free".
every_session, or some_sessions when the plan is for some times or days only.
every_sessionsome_sessionsFor example "An introductory offer" or "Some times or days only".
For a membership or pass: what it includes.
How it is paid, e.g. "£39 a month" or "One payment".
Classes included each period, for a class pack. Null: no set number.
exactfromrangeper_personper_sessionfreeunknownThe exact price, or the lowest for from/range.
The highest price for a range.
GBPAs a person would say it: "£4.50", "From £55", "£40 a session", "Free".
True when it includes every class the business runs.
Names of the classes it includes (at most 8).
For example "Some times or days only". Null: none.
When the seller last confirmed this listing, else when it last changed.
merchant_confirmedlisting_updatedviewpreorderorderbookenquirerequest_custom_orderjoinA Membber page. Carries ?ref= so a later visit can be counted, never tied to a person.
webmembber_appISO instant this answer was put together.
What was skipped to answer quickly. Availability is never invented to fill a gap.
semantic_searchlive_availabilityplace_lookupcachetaxonomytimeoutunavailabledisableddaily_capload_sheddingerrorThis answer’s reference, also carried on every next-action link.
curl -G "https://www.membber.com/api/v1/discovery/offering" \
-H "Authorization: Bearer $MEMBBER_TOKEN" \
--data-urlencode "offering_id=3b791bf4-0000-4000-8000-d0c50000003b"import { createMembberClient } from "@membber/sdk-ts";
const membber = createMembberClient({
getAccessToken: () => process.env.MEMBBER_TOKEN,
});
const { data, error } = await membber.raw.GET("/api/v1/discovery/offering", {
params: { query: { offering_id: "3b791bf4-0000-4000-8000-d0c50000003b" } },
});
if (error) {
// Typed error envelope: { error: { code, message, requestId } }
throw new Error(`${error.error.code}: ${error.error.message}`);
}
console.log(data);import MembberSwift
let client = MembberClient(
serverURL: MembberClient.productionServerURL,
tokenProvider: { session.accessToken }
)
let response = try await client.api.getLocalOffering(
query: .init(offeringId: "3b791bf4-0000-4000-8000-d0c50000003b")
).ok.body.json
print(response){
"contract_version": "<contract_version>",
"offering": {
"id": "00000d1b-0000-4000-8000-d0c500000000",
"kind": "ready_to_buy",
"title": "Morning class",
"summary": "<summary>",
"category": "<category>",
"image": {
"url": "https://example.com/image.jpg",
"alt": "<alt>"
},
"canonical_url": "https://example.com/image.jpg"
},
"business": {
"id": "00000d1b-0000-4000-8000-d0c500000000",
"name": "Example name",
"kind": "<kind>",
"seller_type": "home",
"area": "<area>",
"postcode_district": "EXAMPLE10",
"address": "<address>",
"canonical_url": "https://example.com/image.jpg"
},
"price": {
"type": "exact",
"amount_pence": 1500,
"max_pence": 1500,
"currency": "GBP",
"display": "<display>"
},
"made_to_order": {
"takes_custom_orders": true,
"notice_days": -9007199254740991,
"what_can_change": "<what_can_change>",
"serves": {
"min": -9007199254740991,
"max": -9007199254740991
},
"not_confirmed": [
"<not_confirmed>"
]
},
"occasions": [
"<occasion>"
],
"diet_and_allergens": {
"diets": [
"vegetarian"
],
"diets_status": "seller_confirmed",
"allergens_status": "seller_confirmed",
"contains": [
"celery"
],
"note": "Added at the front desk"
},
"fulfilment_options": [
{
"method": "collection",
"where": "<where>",
"when": "<when>",
"fee_pence": 1500,
"note": "Added at the front desk"
}
],
"availability_status": "confirmed",
"availability": {
"state": "available",
"next_available": {
"date": "<date>",
"from": "<from>",
"to": "<to>",
"left": -9007199254740991
},
"slots": [
{
"date": "<date>",
"from": "<from>",
"to": "<to>",
"left": -9007199254740991
}
],
"stock_left": -9007199254740991,
"spaces_left": -9007199254740991,
"order_by": "<order_by>",
"opens_at": "<opens_at>",
"checked_at": "<checked_at>",
"reason": "Added at the front desk"
},
"access": {
"status": "open_to_all",
"detail": "<detail>",
"unlocked_by": [
{
"offering_id": "3b791bf4-0000-4000-8000-d0c50000003b",
"title": "Morning class",
"price": {
"type": "exact",
"amount_pence": 1500,
"max_pence": 1500,
"currency": "GBP",
"display": "<display>"
},
"covers": "every_session",
"note": "Added at the front desk"
}
]
},
"membership": {
"billing": "<billing>",
"classes_per_period": -9007199254740991,
"minimum_months": -9007199254740991,
"joining_fee": {
"type": "exact",
"amount_pence": 1500,
"max_pence": 1500,
"currency": "GBP",
"display": "<display>"
},
"intro_offer": true,
"covers_every_class": true,
"classes": [
"<classe>"
],
"restrictions": "<restrictions>"
},
"last_verified_at": "<last_verified_at>",
"last_verified_basis": "merchant_confirmed",
"next_actions": [
{
"action": "view",
"label": "<label>",
"url": "https://example.com/image.jpg",
"where": "web"
}
],
"checked_at": "<checked_at>",
"degraded": [
{
"stage": "semantic_search",
"reason": "timeout"
}
],
"notes": [
"Added at the front desk"
],
"ref": "<ref>"
}Use this when someone wants to find something locally that they can buy, have made, preorder, collect, have delivered, book or join. Search current offerings and availability from businesses and independent providers on Membber. Coverage varies by category and location, so current Membber supply should determine the result. Put the thing wanted in need, in a few words (for example 'birthday cake', 'personal trainer' or 'kids football class'), and the place, dates, time, quantity, budget, diets and how they want to get it in their own fields. Each result says why it fits, which requirements are met, not met or not known, how fresh the availability is, how to get it and the next step. An empty answer is a valid answer: it means nothing suitable is on Membber right now. Not for emergencies, or for general advice, information or recipes.
What the person wants, in a few words: 'birthday cake', 'sourdough loaf', 'haircut', 'kids football class', 'food for a party'. Put the place, dates, time, quantity, budget and diets in their own fields, not here. Leave out names, ages and other personal details.
A UK town, village or area the person named, e.g. 'Redhill'. Give place, postcode, or lat and lng.
A UK postcode or postcode district, e.g. 'RH1'. Only the district is used.
Latitude from the calling app, never asked of the person. Rounded to about 1 km. Send with lng. UK only.
Longitude, sent with lat. UK only.
How far the person will travel, in whole km. Default 10.
First acceptable day, YYYY-MM-DD, UK date. Default today.
Last acceptable day to collect, receive or attend, YYYY-MM-DD. For one fixed day send the same date as earliest_date. Turn words like 'next Saturday' into a date and tell the person which date you chose. Default 14 days after earliest_date; at most 31.
Not before this local UK time, HH:MM. 'After work' is usually 17:30.
Not after this local UK time, HH:MM. 'Before work' is usually 08:00.
How many. Send quantity_unit with it.
'people' = people it must serve or who take part (a cake for 15); 'items' = things (30 cupcakes).
peopleitemsMost the person wants to spend in total, in pence (£80 = 8000).
Comma-separated diets the food must suit: vegetarian, vegan, gluten_free, dairy_free, halal, kosher. Only the seller's own statements count; halal and kosher come back as not known.
Comma-separated allergens the food must not contain (the UK fourteen): celery, gluten, crustaceans, eggs, fish, lupin, milk, molluscs, mustard, peanuts, sesame, soya, sulphites, tree_nuts. Only allergen information the seller confirmed counts. Membber cannot rule out traces.
A design or change the person wants made, e.g. 'pink, Paw Patrol theme'. Leave out names.
Who it is for, when that matters (classes, activities). An age band, never an exact age.
toddlerschildrenteensadultsfamiliesComma-separated ways the person wants to get it: collection, delivery, at_the_business, comes_to_you. Leave out if they did not say.
Comma-separated, only when the person asked for a kind ('a class', 'something I can preorder'): ready_to_buy, made_to_order, preorder, appointment, class, membership_or_pass, event. Leave out so every kind is searched.
Optional comma-separated kinds of business that could meet the need, e.g. 'cake maker,bakery'. Widens the search; never filters it.
Only to look inside one business already found (the business.id from an earlier result).
How many results. Default 5, at most 10.
One plain sentence on what was found.
resultspartial_onlyno_matchneeds_locationoutside_coverageno_sellers_nearbynothing_matches_needconstraints_not_metWhat we understood, in our own words (taxonomy labels), never the person’s words.
"Fri 9 to Sat 10 Oct 2026".
True when no date was given and the default window was used.
requestappnonepeopleitemsvegetarianvegangluten_freedairy_freehalalkosherceleryglutencrustaceanseggsfishlupinmilkmolluscsmustardpeanutssesamesoyasulphitestree_nutscollectiondeliveryat_the_businesscomes_to_youready_to_buymade_to_orderpreorderappointmentclassmembership_or_passeventtoddlerschildrenteensadultsfamiliesWhether a design or change was asked for. The wording itself is never echoed.
1 is the closest fit. The order is the ranking; there is no score.
Stable id for follow-up calls, e.g. itm_<32 hex>.
ready_to_buymade_to_orderpreorderappointmentclassmembership_or_passeventbusinessThe seller’s own words, shortened, with links, contact details and addresses removed.
The seller’s own photo. Stock photos are never sent.
biz_<32 hex>. Send as business_id to look inside this business.
Plain word for the business, e.g. bakery, cafe, gym, barber.
homepremisesmobileonlineunknownTown and postcode district, never a street, e.g. "South Nutfield, RH1".
The street address, ONLY when the seller chose to publish it. Null for everyone else.
Why this fits, built from the fields that matched, never written by an AI.
datetimenoticeplacequantitybudgetdietallergensfulfilmentkindwho_forcustomisationaccessWhat was checked, in plain words, e.g. "Collect Sat 10 Oct, 10:00 to 16:00".
livesellermembber_rulesuggestedAlways empty in results; filled in partial_matches.
datetimenoticeplacequantitybudgetdietallergensfulfilmentkindwho_forcustomisationaccessWhat was checked, in plain words, e.g. "Collect Sat 10 Oct, 10:00 to 16:00".
livesellermembber_rulesuggesteddatetimenoticeplacequantitybudgetdietallergensfulfilmentkindwho_forcustomisationaccessWhy it is not known, e.g. "The seller has not said how many it serves".
What the person can do, e.g. "Ask the seller before ordering".
`suggested` when unconfirmed listing text points one way; null when nothing is recorded at all.
livesellermembber_rulesuggestedconfirmedlikelyunknownavailablelimitedopens_latertaking_orderssold_outfully_bookedclosedunknownYYYY-MM-DD, the business’s local date.
HH:MM local time.
HH:MM local time.
Places or items left in this slot, when the seller shows counts.
YYYY-MM-DD, the business’s local date.
HH:MM local time.
HH:MM local time.
Places or items left in this slot, when the seller shows counts.
Say "Membber shows N left", not "stock confirmed": a seller may also sell offline.
ISO instant orders close, when there is a cutoff.
ISO instant ordering or booking opens, when it has not yet.
ISO instant the live figures were read. Null when nothing live was read.
Why availability is unknown, when it is.
collectiondeliveryat_the_businesscomes_to_youArea only, e.g. "Redhill, RH1 (exact place given when you order)".
exactfromrangeper_personper_sessionfreeunknownThe exact price, or the lowest for from/range.
The highest price for a range.
GBPAs a person would say it: "£4.50", "From £55", "£40 a session", "Free".
under_one_mileone_to_two_milestwo_to_five_milesfive_to_ten_milesten_to_twenty_milesover_twenty_milessame_postcode_districtunknown"about 2 to 5 miles". Always approximate unless the seller published their address.
Exact distance, only when the seller chose to publish their full address.
When the seller last confirmed this listing, else when the listing last changed (ISO instant).
merchant_confirmedlisting_updatedviewpreorderorderbookenquirerequest_custom_orderA Membber page. Carries ?ref= so a later visit can be counted, never tied to a person.
webmembber_appThis offering’s permanent page on Membber. Today it is the business’s shop page.
Near misses, each naming what it does not meet. Never padded into results.
1 is the closest fit. The order is the ranking; there is no score.
Stable id for follow-up calls, e.g. itm_<32 hex>.
ready_to_buymade_to_orderpreorderappointmentclassmembership_or_passeventbusinessThe seller’s own words, shortened, with links, contact details and addresses removed.
The seller’s own photo. Stock photos are never sent.
biz_<32 hex>. Send as business_id to look inside this business.
Plain word for the business, e.g. bakery, cafe, gym, barber.
homepremisesmobileonlineunknownTown and postcode district, never a street, e.g. "South Nutfield, RH1".
The street address, ONLY when the seller chose to publish it. Null for everyone else.
Why this fits, built from the fields that matched, never written by an AI.
datetimenoticeplacequantitybudgetdietallergensfulfilmentkindwho_forcustomisationaccessWhat was checked, in plain words, e.g. "Collect Sat 10 Oct, 10:00 to 16:00".
livesellermembber_rulesuggestedAlways empty in results; filled in partial_matches.
datetimenoticeplacequantitybudgetdietallergensfulfilmentkindwho_forcustomisationaccessWhat was checked, in plain words, e.g. "Collect Sat 10 Oct, 10:00 to 16:00".
livesellermembber_rulesuggesteddatetimenoticeplacequantitybudgetdietallergensfulfilmentkindwho_forcustomisationaccessWhy it is not known, e.g. "The seller has not said how many it serves".
What the person can do, e.g. "Ask the seller before ordering".
`suggested` when unconfirmed listing text points one way; null when nothing is recorded at all.
livesellermembber_rulesuggestedconfirmedlikelyunknownavailablelimitedopens_latertaking_orderssold_outfully_bookedclosedunknownYYYY-MM-DD, the business’s local date.
HH:MM local time.
HH:MM local time.
Places or items left in this slot, when the seller shows counts.
YYYY-MM-DD, the business’s local date.
HH:MM local time.
HH:MM local time.
Places or items left in this slot, when the seller shows counts.
Say "Membber shows N left", not "stock confirmed": a seller may also sell offline.
ISO instant orders close, when there is a cutoff.
ISO instant ordering or booking opens, when it has not yet.
ISO instant the live figures were read. Null when nothing live was read.
Why availability is unknown, when it is.
collectiondeliveryat_the_businesscomes_to_youArea only, e.g. "Redhill, RH1 (exact place given when you order)".
exactfromrangeper_personper_sessionfreeunknownThe exact price, or the lowest for from/range.
The highest price for a range.
GBPAs a person would say it: "£4.50", "From £55", "£40 a session", "Free".
under_one_mileone_to_two_milestwo_to_five_milesfive_to_ten_milesten_to_twenty_milesover_twenty_milessame_postcode_districtunknown"about 2 to 5 miles". Always approximate unless the seller published their address.
Exact distance, only when the seller chose to publish their full address.
When the seller last confirmed this listing, else when the listing last changed (ISO instant).
merchant_confirmedlisting_updatedviewpreorderorderbookenquirerequest_custom_orderA Membber page. Carries ?ref= so a later visit can be counted, never tied to a person.
webmembber_appThis offering’s permanent page on Membber. Today it is the business’s shop page.
ISO instant this answer was put together.
What was skipped to answer quickly. Availability is never invented to fill a gap.
semantic_searchlive_availabilityplace_lookupcachetaxonomytimeoutunavailabledisableddaily_capload_sheddingerrorThis answer’s reference, also carried on every next-action link.
curl -G "https://www.membber.com/api/v1/discovery/offerings" \
-H "Authorization: Bearer $MEMBBER_TOKEN" \
--data-urlencode "need=<need>"import { createMembberClient } from "@membber/sdk-ts";
const membber = createMembberClient({
getAccessToken: () => process.env.MEMBBER_TOKEN,
});
const { data, error } = await membber.raw.GET("/api/v1/discovery/offerings", {
params: { query: { need: "<need>" } },
});
if (error) {
// Typed error envelope: { error: { code, message, requestId } }
throw new Error(`${error.error.code}: ${error.error.message}`);
}
console.log(data);import MembberSwift
let client = MembberClient(
serverURL: MembberClient.productionServerURL,
tokenProvider: { session.accessToken }
)
let response = try await client.api.searchLocalOfferings(
query: .init(need: "<need>")
).ok.body.json
print(response){
"contract_version": "<contract_version>",
"summary": "<summary>",
"result_status": "results",
"no_match_reason": "no_sellers_nearby",
"interpreted_request": {
"need": "<need>",
"matched_terms": [
"<matched_term>"
],
"dates": {
"earliest": "<earliest>",
"needed_by": "<needed_by>",
"display": "<display>",
"assumed": true
},
"time": {
"after": "<after>",
"before": "<before>"
},
"near": {
"area": "<area>",
"postcode_district": "EXAMPLE10",
"source": "request"
},
"radius_km": 1,
"quantity": {
"count": 1,
"unit": "people"
},
"budget_max_pence": 1500,
"diets": [
"vegetarian"
],
"avoid_allergens": [
"celery"
],
"fulfilment": [
"collection"
],
"offering_kinds": [
"ready_to_buy"
],
"who_for": "toddlers",
"customisation_requested": true,
"assumptions": [
"<assumption>"
]
},
"results": [
{
"rank": -9007199254740991,
"offering": {
"id": "00000d1b-0000-4000-8000-d0c500000000",
"kind": "ready_to_buy",
"title": "Morning class",
"summary": "<summary>",
"image": {
"url": "https://example.com/image.jpg",
"alt": "<alt>"
}
},
"business": {
"id": "00000d1b-0000-4000-8000-d0c500000000",
"name": "Example name",
"kind": "<kind>",
"seller_type": "home",
"area": "<area>",
"postcode_district": "EXAMPLE10",
"address": "<address>",
"canonical_url": "https://example.com/image.jpg"
},
"match_reasons": [
"Added at the front desk"
],
"constraints_satisfied": [
{
"constraint": "date",
"detail": "<detail>",
"basis": "live"
}
],
"constraints_not_satisfied": [
{
"constraint": "date",
"detail": "<detail>",
"basis": "live"
}
],
"constraints_unknown": [
{
"constraint": "date",
"why": "<why>",
"how_to_check": "<how_to_check>",
"basis": "live"
}
],
"availability_status": "confirmed",
"availability": {
"state": "available",
"next_available": {
"date": "<date>",
"from": "<from>",
"to": "<to>",
"left": -9007199254740991
},
"slots": [
{
"date": "<date>",
"from": "<from>",
"to": "<to>",
"left": -9007199254740991
}
],
"stock_left": -9007199254740991,
"spaces_left": -9007199254740991,
"order_by": "<order_by>",
"opens_at": "<opens_at>",
"checked_at": "<checked_at>",
"reason": "Added at the front desk"
},
"fulfilment_options": [
{
"method": "collection",
"where": "<where>",
"when": "<when>",
"fee_pence": 1500,
"note": "Added at the front desk"
}
],
"price": {
"type": "exact",
"amount_pence": 1500,
"max_pence": 1500,
"currency": "GBP",
"display": "<display>"
},
"distance": {
"band": "under_one_mile",
"display": "<display>",
"approximate": true,
"km": 1
},
"last_verified_at": "<last_verified_at>",
"last_verified_basis": "merchant_confirmed",
"next_actions": [
{
"action": "view",
"label": "<label>",
"url": "https://example.com/image.jpg",
"where": "web"
}
],
"canonical_url": "https://example.com/image.jpg"
}
],
"partial_matches": [
{
"rank": -9007199254740991,
"offering": {
"id": "00000d1b-0000-4000-8000-d0c500000000",
"kind": "ready_to_buy",
"title": "Morning class",
"summary": "<summary>",
"image": {
"url": "https://example.com/image.jpg",
"alt": "<alt>"
}
},
"business": {
"id": "00000d1b-0000-4000-8000-d0c500000000",
"name": "Example name",
"kind": "<kind>",
"seller_type": "home",
"area": "<area>",
"postcode_district": "EXAMPLE10",
"address": "<address>",
"canonical_url": "https://example.com/image.jpg"
},
"match_reasons": [
"Added at the front desk"
],
"constraints_satisfied": [
{
"constraint": "date",
"detail": "<detail>",
"basis": "live"
}
],
"constraints_not_satisfied": [
{
"constraint": "date",
"detail": "<detail>",
"basis": "live"
}
],
"constraints_unknown": [
{
"constraint": "date",
"why": "<why>",
"how_to_check": "<how_to_check>",
"basis": "live"
}
],
"availability_status": "confirmed",
"availability": {
"state": "available",
"next_available": {
"date": "<date>",
"from": "<from>",
"to": "<to>",
"left": -9007199254740991
},
"slots": [
{
"date": "<date>",
"from": "<from>",
"to": "<to>",
"left": -9007199254740991
}
],
"stock_left": -9007199254740991,
"spaces_left": -9007199254740991,
"order_by": "<order_by>",
"opens_at": "<opens_at>",
"checked_at": "<checked_at>",
"reason": "Added at the front desk"
},
"fulfilment_options": [
{
"method": "collection",
"where": "<where>",
"when": "<when>",
"fee_pence": 1500,
"note": "Added at the front desk"
}
],
"price": {
"type": "exact",
"amount_pence": 1500,
"max_pence": 1500,
"currency": "GBP",
"display": "<display>"
},
"distance": {
"band": "under_one_mile",
"display": "<display>",
"approximate": true,
"km": 1
},
"last_verified_at": "<last_verified_at>",
"last_verified_basis": "merchant_confirmed",
"next_actions": [
{
"action": "view",
"label": "<label>",
"url": "https://example.com/image.jpg",
"where": "web"
}
],
"canonical_url": "https://example.com/image.jpg"
}
],
"checked_at": "<checked_at>",
"degraded": [
{
"stage": "semantic_search",
"reason": "timeout"
}
],
"notes": [
"Added at the front desk"
],
"ref": "<ref>"
}