Drops

30 operations. Every schema and example on this page is generated from the platform contract.

A store's batch drops.

Every drop for the authenticated store, newest first, each with its items, windows and live counters. Also returns whether the store can run a drop at all, and if not, why.

Parameters

store_idstring · uuidqueryrequired
include_pastbooleanqueryoptional

Include drops whose collection date has passed.

limitintegerqueryoptional

Response, 200

dropsarray of objectrequired
29 child fields
idstringrequired
store_idstringrequired
codestringrequired

The short code that identifies this drop.

shop_urlstring, nullablerequired

The shop's permanent drops page: /{handle}/drops

image_urlstring, nullablerequired
share_urlstringrequired

The link to this specific drop.

namestringrequired
descriptionstring, nullablerequired
statusenumrequired
draftscheduledcancelled
stateenumrequired

Computed at read time. Never sent by a client.

draftscheduledliveclosedcollectedcancelled
opens_atstringrequired
closes_atstring, nullablerequired

Null only while a draft has no closing time yet. A scheduled drop always has one.

collection_datestringrequired
timezonestringrequired
checkout_ttl_secondsnumberrequired
menu_visible_before_openbooleanrequired
show_stock_countbooleanrequired
max_per_customernumber, nullablerequired
itemsarray of objectrequired
15 child fields
idstringrequired
menu_item_idstringrequired
namestringrequired

Copied from the menu item at read time, never stored twice.

price_pencenumber, nullablerequired
image_urlstring, nullablerequired
quantitynumberrequired

How many were put up. Meaningless when is_unlimited.

remainingnumberrequired

How many are still available. Never negative. Mirrors quantity when is_unlimited.

is_unlimitedbooleanrequired
soldnumberrequired
max_per_ordernumber, nullablerequired

null = no limit.

sold_out_atstring, nullablerequired

Always null for an unlimited item.

sort_ordernumberrequired
allergensarray of stringrequired
allergens_declared_nonebooleanrequired
allergens_missingbooleanrequired
windowsarray of objectrequired
5 child fields
idstringrequired
starts_atstringrequired
ends_atstringrequired
max_ordersnumber, nullablerequired

null = no cap on orders in this window.

orders_remainingnumber, nullablerequired
buyersarray of objectoptional
9 child fields
idstringrequired
order_numberstring, nullablerequired
namestring, nullablerequired
emailstring, nullablerequired
total_penceintegerrequired
paid_atstring, nullablerequired
collected_atstring, nullablerequired
fulfilment_statusstring, nullablerequired
collection_atstring, nullablerequired
orders_countnumberrequired
units_soldnumberrequired
units_totalnumberrequired

Sum of the counted items only; an unlimited item adds nothing.

has_unlimitedbooleanrequired
gross_pencenumberrequired
blockersarray of stringrequired
created_atstringrequired
updated_atstringrequired
live_drop_idstring, nullablerequired
drops_livebooleanrequired
blocked_reasonenumrequired

Why a drop cannot open. Say this to the merchant, do not refuse blankly.

no_addoncollect_offno_paymentspayments_destinationunavailable
reachable_customersinteger, nullablerequired
page_viewsobjectrequired

Visits to this shop's public drops pages. Null only when the count could not be read.

4 child fields
shop_todayintegerrequired
shop_last_7_daysintegerrequired
drops_todayintegerrequired
drops_last_7_daysintegerrequired
curl -G "https://www.membber.com/api/v1/drops" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  --data-urlencode "store_id=6659c139-0000-4000-8000-d0c500000066"
Response, 200
{
  "drops": [
    {
      "id": "00000d1b-0000-4000-8000-d0c500000000",
      "store_id": "6659c139-0000-4000-8000-d0c500000066",
      "code": "EXAMPLE10",
      "shop_url": "https://example.com/image.jpg",
      "image_url": "https://example.com/image.jpg",
      "share_url": "https://example.com/image.jpg",
      "name": "Example name",
      "description": "Added at the front desk",
      "status": "draft",
      "state": "draft",
      "opens_at": "<opens_at>",
      "closes_at": "<closes_at>",
      "collection_date": "<collection_date>",
      "timezone": "Europe/London",
      "checkout_ttl_seconds": 1,
      "menu_visible_before_open": true,
      "show_stock_count": true,
      "max_per_customer": 1,
      "items": [
        {
          "id": "00000d1b-0000-4000-8000-d0c500000000",
          "menu_item_id": "ca65a6e7-0000-4000-8000-d0c5000000ca",
          "name": "Example name",
          "price_pence": 1500,
          "image_url": "https://example.com/image.jpg",
          "quantity": 1,
          "remaining": 1,
          "is_unlimited": true,
          "sold": 1,
          "max_per_order": 1,
          "sold_out_at": "<sold_out_at>",
          "sort_order": 1,
          "allergens": [
            "<allergen>"
          ],
          "allergens_declared_none": true,
          "allergens_missing": true
        }
      ],
      "windows": [
        {
          "id": "00000d1b-0000-4000-8000-d0c500000000",
          "starts_at": "<starts_at>",
          "ends_at": "<ends_at>",
          "max_orders": 1,
          "orders_remaining": 1
        }
      ],
      "buyers": [
        {
          "id": "00000d1b-0000-4000-8000-d0c500000000",
          "order_number": "<order_number>",
          "name": "Example name",
          "email": "alex@example.com",
          "total_pence": 1500,
          "paid_at": "<paid_at>",
          "collected_at": "<collected_at>",
          "fulfilment_status": "<fulfilment_status>",
          "collection_at": "<collection_at>"
        }
      ],
      "orders_count": 1,
      "units_sold": 1,
      "units_total": 1,
      "has_unlimited": true,
      "gross_pence": 1500,
      "blockers": [
        "<blocker>"
      ],
      "created_at": "<created_at>",
      "updated_at": "<updated_at>"
    }
  ],
  "live_drop_id": "68f0d418-0000-4000-8000-d0c500000068",
  "drops_live": true,
  "blocked_reason": "no_addon",
  "reachable_customers": -9007199254740991,
  "page_views": {
    "shop_today": -9007199254740991,
    "shop_last_7_days": -9007199254740991,
    "drops_today": -9007199254740991,
    "drops_last_7_days": -9007199254740991
  }
}

Create a drop.

Creates a DRAFT drop for the authenticated store. A draft is invisible to customers and has no link until it is scheduled. Send a `client_token` to make the create idempotent.

Request body

store_idstring · uuidrequired
client_tokenstringoptional

Send the same token on a retry to get the SAME drop back instead of a duplicate.

namestringrequired
descriptionstring, nullableoptional
opens_atstringrequired

ISO instant. The drop opens itself at this minute.

closes_atstring, nullableoptional

ISO instant. Null is allowed on a DRAFT (nothing is on sale yet, so nothing closes), but a drop cannot be scheduled without a closing time. It may be sent in the same PATCH as status=scheduled.

collection_datestringrequired

YYYY-MM-DD in the store timezone.

bundle_price_penceinteger, nullableoptional

What the whole box costs, in pence. Null means this is not a box drop.

bundle_totalinteger, nullableoptional

How many boxes exist. Null means this is not a box drop.

timezonestringoptional
checkout_ttl_secondsanyoptional

Basket hold, in seconds. Defaults to 300 (5 minutes).

menu_visible_before_openbooleanoptional
show_stock_countbooleanoptional
max_per_customerinteger, nullableoptional

null = no limit.

image_urlstring, nullableoptional

Response, 200

dropobjectrequired
29 child fields
idstringrequired
store_idstringrequired
codestringrequired

The short code that identifies this drop.

shop_urlstring, nullablerequired

The shop's permanent drops page: /{handle}/drops

image_urlstring, nullablerequired
share_urlstringrequired

The link to this specific drop.

namestringrequired
descriptionstring, nullablerequired
statusenumrequired
draftscheduledcancelled
stateenumrequired

Computed at read time. Never sent by a client.

draftscheduledliveclosedcollectedcancelled
opens_atstringrequired
closes_atstring, nullablerequired

Null only while a draft has no closing time yet. A scheduled drop always has one.

collection_datestringrequired
timezonestringrequired
checkout_ttl_secondsnumberrequired
menu_visible_before_openbooleanrequired
show_stock_countbooleanrequired
max_per_customernumber, nullablerequired
itemsarray of objectrequired
15 child fields
idstringrequired
menu_item_idstringrequired
namestringrequired

Copied from the menu item at read time, never stored twice.

price_pencenumber, nullablerequired
image_urlstring, nullablerequired
quantitynumberrequired

How many were put up. Meaningless when is_unlimited.

remainingnumberrequired

How many are still available. Never negative. Mirrors quantity when is_unlimited.

is_unlimitedbooleanrequired
soldnumberrequired
max_per_ordernumber, nullablerequired

null = no limit.

sold_out_atstring, nullablerequired

Always null for an unlimited item.

sort_ordernumberrequired
allergensarray of stringrequired
allergens_declared_nonebooleanrequired
allergens_missingbooleanrequired
windowsarray of objectrequired
5 child fields
idstringrequired
starts_atstringrequired
ends_atstringrequired
max_ordersnumber, nullablerequired

null = no cap on orders in this window.

orders_remainingnumber, nullablerequired
buyersarray of objectoptional
9 child fields
idstringrequired
order_numberstring, nullablerequired
namestring, nullablerequired
emailstring, nullablerequired
total_penceintegerrequired
paid_atstring, nullablerequired
collected_atstring, nullablerequired
fulfilment_statusstring, nullablerequired
collection_atstring, nullablerequired
orders_countnumberrequired
units_soldnumberrequired
units_totalnumberrequired

Sum of the counted items only; an unlimited item adds nothing.

has_unlimitedbooleanrequired
gross_pencenumberrequired
blockersarray of stringrequired
created_atstringrequired
updated_atstringrequired
curl -X POST "https://www.membber.com/api/v1/drops" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "name": "Example name",
    "opens_at": "<opens_at>",
    "collection_date": "<collection_date>"
  }'
Response, 200
{
  "drop": {
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "code": "EXAMPLE10",
    "shop_url": "https://example.com/image.jpg",
    "image_url": "https://example.com/image.jpg",
    "share_url": "https://example.com/image.jpg",
    "name": "Example name",
    "description": "Added at the front desk",
    "status": "draft",
    "state": "draft",
    "opens_at": "<opens_at>",
    "closes_at": "<closes_at>",
    "collection_date": "<collection_date>",
    "timezone": "Europe/London",
    "checkout_ttl_seconds": 1,
    "menu_visible_before_open": true,
    "show_stock_count": true,
    "max_per_customer": 1,
    "items": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "menu_item_id": "ca65a6e7-0000-4000-8000-d0c5000000ca",
        "name": "Example name",
        "price_pence": 1500,
        "image_url": "https://example.com/image.jpg",
        "quantity": 1,
        "remaining": 1,
        "is_unlimited": true,
        "sold": 1,
        "max_per_order": 1,
        "sold_out_at": "<sold_out_at>",
        "sort_order": 1,
        "allergens": [
          "<allergen>"
        ],
        "allergens_declared_none": true,
        "allergens_missing": true
      }
    ],
    "windows": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "starts_at": "<starts_at>",
        "ends_at": "<ends_at>",
        "max_orders": 1,
        "orders_remaining": 1
      }
    ],
    "buyers": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "order_number": "<order_number>",
        "name": "Example name",
        "email": "alex@example.com",
        "total_pence": 1500,
        "paid_at": "<paid_at>",
        "collected_at": "<collected_at>",
        "fulfilment_status": "<fulfilment_status>",
        "collection_at": "<collection_at>"
      }
    ],
    "orders_count": 1,
    "units_sold": 1,
    "units_total": 1,
    "has_unlimited": true,
    "gross_pence": 1500,
    "blockers": [
      "<blocker>"
    ],
    "created_at": "<created_at>",
    "updated_at": "<updated_at>"
  }
}

Delete a drop that has never taken money.

Scoped to the calling store. Refused with a reason when the drop has paid orders or reviews (cancel those instead), or while somebody has its stock in a basket right now.

Parameters

dropIdstringpathrequired
drop_idstring · uuidqueryoptional

Supplied by the URL PATH.

Response, 200

deletedbooleanrequired
codestring, nullablerequired
namestring, nullablerequired
curl -X DELETE "https://www.membber.com/api/v1/drops/b11f386a-0000-4000-8000-d0c5000000b1" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678"
Response, 200
{
  "deleted": true,
  "code": "EXAMPLE10",
  "name": "Example name"
}

One drop, in full.

The drop with its items, windows, live counters and anything blocking it going live.

Parameters

dropIdstringpathrequired
store_idstring · uuidqueryrequired
drop_idstring · uuidqueryoptional

Response, 200

dropobjectrequired
29 child fields
idstringrequired
store_idstringrequired
codestringrequired

The short code that identifies this drop.

shop_urlstring, nullablerequired

The shop's permanent drops page: /{handle}/drops

image_urlstring, nullablerequired
share_urlstringrequired

The link to this specific drop.

namestringrequired
descriptionstring, nullablerequired
statusenumrequired
draftscheduledcancelled
stateenumrequired

Computed at read time. Never sent by a client.

draftscheduledliveclosedcollectedcancelled
opens_atstringrequired
closes_atstring, nullablerequired

Null only while a draft has no closing time yet. A scheduled drop always has one.

collection_datestringrequired
timezonestringrequired
checkout_ttl_secondsnumberrequired
menu_visible_before_openbooleanrequired
show_stock_countbooleanrequired
max_per_customernumber, nullablerequired
itemsarray of objectrequired
15 child fields
idstringrequired
menu_item_idstringrequired
namestringrequired

Copied from the menu item at read time, never stored twice.

price_pencenumber, nullablerequired
image_urlstring, nullablerequired
quantitynumberrequired

How many were put up. Meaningless when is_unlimited.

remainingnumberrequired

How many are still available. Never negative. Mirrors quantity when is_unlimited.

is_unlimitedbooleanrequired
soldnumberrequired
max_per_ordernumber, nullablerequired

null = no limit.

sold_out_atstring, nullablerequired

Always null for an unlimited item.

sort_ordernumberrequired
allergensarray of stringrequired
allergens_declared_nonebooleanrequired
allergens_missingbooleanrequired
windowsarray of objectrequired
5 child fields
idstringrequired
starts_atstringrequired
ends_atstringrequired
max_ordersnumber, nullablerequired

null = no cap on orders in this window.

orders_remainingnumber, nullablerequired
buyersarray of objectoptional
9 child fields
idstringrequired
order_numberstring, nullablerequired
namestring, nullablerequired
emailstring, nullablerequired
total_penceintegerrequired
paid_atstring, nullablerequired
collected_atstring, nullablerequired
fulfilment_statusstring, nullablerequired
collection_atstring, nullablerequired
orders_countnumberrequired
units_soldnumberrequired
units_totalnumberrequired

Sum of the counted items only; an unlimited item adds nothing.

has_unlimitedbooleanrequired
gross_pencenumberrequired
blockersarray of stringrequired
created_atstringrequired
updated_atstringrequired
curl -G "https://www.membber.com/api/v1/drops/b11f386a-0000-4000-8000-d0c5000000b1" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  --data-urlencode "store_id=6659c139-0000-4000-8000-d0c500000066"
Response, 200
{
  "drop": {
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "code": "EXAMPLE10",
    "shop_url": "https://example.com/image.jpg",
    "image_url": "https://example.com/image.jpg",
    "share_url": "https://example.com/image.jpg",
    "name": "Example name",
    "description": "Added at the front desk",
    "status": "draft",
    "state": "draft",
    "opens_at": "<opens_at>",
    "closes_at": "<closes_at>",
    "collection_date": "<collection_date>",
    "timezone": "Europe/London",
    "checkout_ttl_seconds": 1,
    "menu_visible_before_open": true,
    "show_stock_count": true,
    "max_per_customer": 1,
    "items": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "menu_item_id": "ca65a6e7-0000-4000-8000-d0c5000000ca",
        "name": "Example name",
        "price_pence": 1500,
        "image_url": "https://example.com/image.jpg",
        "quantity": 1,
        "remaining": 1,
        "is_unlimited": true,
        "sold": 1,
        "max_per_order": 1,
        "sold_out_at": "<sold_out_at>",
        "sort_order": 1,
        "allergens": [
          "<allergen>"
        ],
        "allergens_declared_none": true,
        "allergens_missing": true
      }
    ],
    "windows": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "starts_at": "<starts_at>",
        "ends_at": "<ends_at>",
        "max_orders": 1,
        "orders_remaining": 1
      }
    ],
    "buyers": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "order_number": "<order_number>",
        "name": "Example name",
        "email": "alex@example.com",
        "total_pence": 1500,
        "paid_at": "<paid_at>",
        "collected_at": "<collected_at>",
        "fulfilment_status": "<fulfilment_status>",
        "collection_at": "<collection_at>"
      }
    ],
    "orders_count": 1,
    "units_sold": 1,
    "units_total": 1,
    "has_unlimited": true,
    "gross_pence": 1500,
    "blockers": [
      "<blocker>"
    ],
    "created_at": "<created_at>",
    "updated_at": "<updated_at>"
  }
}

Change a drop.

Edits a drop, including one that is currently selling: adding stock, reordering items, adding a window or closing early are all expected mid-drop. Moving `status` from draft to scheduled is what makes it go live at its opening minute; that is refused while anything is still missing (an item's allergens or price, a collection window, the closing time) and the refusal says what. The check reads the drop as this PATCH leaves it, so the closing time may arrive in the same request as the status.

Parameters

dropIdstringpathrequired

Request body

store_idstring · uuidrequired
drop_idstring · uuidoptional
statusenumoptional
draftscheduled
namestringoptional
descriptionstring, nullableoptional
opens_atstringoptional

ISO instant. The drop opens itself at this minute.

closes_atstring, nullableoptional

ISO instant. Null is allowed on a DRAFT (nothing is on sale yet, so nothing closes), but a drop cannot be scheduled without a closing time. It may be sent in the same PATCH as status=scheduled.

collection_datestringoptional

YYYY-MM-DD in the store timezone.

bundle_price_penceinteger, nullableoptional

What the whole box costs, in pence. Null means this is not a box drop.

bundle_totalinteger, nullableoptional

How many boxes exist. Null means this is not a box drop.

timezonestringoptional
checkout_ttl_secondsanyoptional

Basket hold, in seconds. Defaults to 300 (5 minutes).

menu_visible_before_openbooleanoptional
show_stock_countbooleanoptional
max_per_customerinteger, nullableoptional

null = no limit.

image_urlstring, nullableoptional

Response, 200

dropobjectrequired
29 child fields
idstringrequired
store_idstringrequired
codestringrequired

The short code that identifies this drop.

shop_urlstring, nullablerequired

The shop's permanent drops page: /{handle}/drops

image_urlstring, nullablerequired
share_urlstringrequired

The link to this specific drop.

namestringrequired
descriptionstring, nullablerequired
statusenumrequired
draftscheduledcancelled
stateenumrequired

Computed at read time. Never sent by a client.

draftscheduledliveclosedcollectedcancelled
opens_atstringrequired
closes_atstring, nullablerequired

Null only while a draft has no closing time yet. A scheduled drop always has one.

collection_datestringrequired
timezonestringrequired
checkout_ttl_secondsnumberrequired
menu_visible_before_openbooleanrequired
show_stock_countbooleanrequired
max_per_customernumber, nullablerequired
itemsarray of objectrequired
15 child fields
idstringrequired
menu_item_idstringrequired
namestringrequired

Copied from the menu item at read time, never stored twice.

price_pencenumber, nullablerequired
image_urlstring, nullablerequired
quantitynumberrequired

How many were put up. Meaningless when is_unlimited.

remainingnumberrequired

How many are still available. Never negative. Mirrors quantity when is_unlimited.

is_unlimitedbooleanrequired
soldnumberrequired
max_per_ordernumber, nullablerequired

null = no limit.

sold_out_atstring, nullablerequired

Always null for an unlimited item.

sort_ordernumberrequired
allergensarray of stringrequired
allergens_declared_nonebooleanrequired
allergens_missingbooleanrequired
windowsarray of objectrequired
5 child fields
idstringrequired
starts_atstringrequired
ends_atstringrequired
max_ordersnumber, nullablerequired

null = no cap on orders in this window.

orders_remainingnumber, nullablerequired
buyersarray of objectoptional
9 child fields
idstringrequired
order_numberstring, nullablerequired
namestring, nullablerequired
emailstring, nullablerequired
total_penceintegerrequired
paid_atstring, nullablerequired
collected_atstring, nullablerequired
fulfilment_statusstring, nullablerequired
collection_atstring, nullablerequired
orders_countnumberrequired
units_soldnumberrequired
units_totalnumberrequired

Sum of the counted items only; an unlimited item adds nothing.

has_unlimitedbooleanrequired
gross_pencenumberrequired
blockersarray of stringrequired
created_atstringrequired
updated_atstringrequired
curl -X PATCH "https://www.membber.com/api/v1/drops/b11f386a-0000-4000-8000-d0c5000000b1" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066"
  }'
Response, 200
{
  "drop": {
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "code": "EXAMPLE10",
    "shop_url": "https://example.com/image.jpg",
    "image_url": "https://example.com/image.jpg",
    "share_url": "https://example.com/image.jpg",
    "name": "Example name",
    "description": "Added at the front desk",
    "status": "draft",
    "state": "draft",
    "opens_at": "<opens_at>",
    "closes_at": "<closes_at>",
    "collection_date": "<collection_date>",
    "timezone": "Europe/London",
    "checkout_ttl_seconds": 1,
    "menu_visible_before_open": true,
    "show_stock_count": true,
    "max_per_customer": 1,
    "items": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "menu_item_id": "ca65a6e7-0000-4000-8000-d0c5000000ca",
        "name": "Example name",
        "price_pence": 1500,
        "image_url": "https://example.com/image.jpg",
        "quantity": 1,
        "remaining": 1,
        "is_unlimited": true,
        "sold": 1,
        "max_per_order": 1,
        "sold_out_at": "<sold_out_at>",
        "sort_order": 1,
        "allergens": [
          "<allergen>"
        ],
        "allergens_declared_none": true,
        "allergens_missing": true
      }
    ],
    "windows": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "starts_at": "<starts_at>",
        "ends_at": "<ends_at>",
        "max_orders": 1,
        "orders_remaining": 1
      }
    ],
    "buyers": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "order_number": "<order_number>",
        "name": "Example name",
        "email": "alex@example.com",
        "total_pence": 1500,
        "paid_at": "<paid_at>",
        "collected_at": "<collected_at>",
        "fulfilment_status": "<fulfilment_status>",
        "collection_at": "<collection_at>"
      }
    ],
    "orders_count": 1,
    "units_sold": 1,
    "units_total": 1,
    "has_unlimited": true,
    "gross_pence": 1500,
    "blockers": [
      "<blocker>"
    ],
    "created_at": "<created_at>",
    "updated_at": "<updated_at>"
  }
}

Call a drop off and refund everyone.

Cancels the drop. Any paid order is refunded and every affected person is told once, however many orders they hold. A drop with paid orders requires `confirm_refunds: true`, so nobody cancels fifty people without being shown the number first. Requires the refund permission.

Parameters

dropIdstringpathrequired

Request body

store_idstring · uuidrequired
drop_idstring · uuidoptional
reasonstring, nullableoptional
confirm_refundsbooleanoptional

Response, 200

dropobjectrequired
29 child fields
idstringrequired
store_idstringrequired
codestringrequired

The short code that identifies this drop.

shop_urlstring, nullablerequired

The shop's permanent drops page: /{handle}/drops

image_urlstring, nullablerequired
share_urlstringrequired

The link to this specific drop.

namestringrequired
descriptionstring, nullablerequired
statusenumrequired
draftscheduledcancelled
stateenumrequired

Computed at read time. Never sent by a client.

draftscheduledliveclosedcollectedcancelled
opens_atstringrequired
closes_atstring, nullablerequired

Null only while a draft has no closing time yet. A scheduled drop always has one.

collection_datestringrequired
timezonestringrequired
checkout_ttl_secondsnumberrequired
menu_visible_before_openbooleanrequired
show_stock_countbooleanrequired
max_per_customernumber, nullablerequired
itemsarray of objectrequired
15 child fields
idstringrequired
menu_item_idstringrequired
namestringrequired

Copied from the menu item at read time, never stored twice.

price_pencenumber, nullablerequired
image_urlstring, nullablerequired
quantitynumberrequired

How many were put up. Meaningless when is_unlimited.

remainingnumberrequired

How many are still available. Never negative. Mirrors quantity when is_unlimited.

is_unlimitedbooleanrequired
soldnumberrequired
max_per_ordernumber, nullablerequired

null = no limit.

sold_out_atstring, nullablerequired

Always null for an unlimited item.

sort_ordernumberrequired
allergensarray of stringrequired
allergens_declared_nonebooleanrequired
allergens_missingbooleanrequired
windowsarray of objectrequired
5 child fields
idstringrequired
starts_atstringrequired
ends_atstringrequired
max_ordersnumber, nullablerequired

null = no cap on orders in this window.

orders_remainingnumber, nullablerequired
buyersarray of objectoptional
9 child fields
idstringrequired
order_numberstring, nullablerequired
namestring, nullablerequired
emailstring, nullablerequired
total_penceintegerrequired
paid_atstring, nullablerequired
collected_atstring, nullablerequired
fulfilment_statusstring, nullablerequired
collection_atstring, nullablerequired
orders_countnumberrequired
units_soldnumberrequired
units_totalnumberrequired

Sum of the counted items only; an unlimited item adds nothing.

has_unlimitedbooleanrequired
gross_pencenumberrequired
blockersarray of stringrequired
created_atstringrequired
updated_atstringrequired
orders_to_refundnumberrequired

How many orders will be refunded.

people_to_tellnumberrequired

How many PEOPLE, which is fewer if anyone ordered twice.

refund_pencenumberrequired
curl -X POST "https://www.membber.com/api/v1/drops/b11f386a-0000-4000-8000-d0c5000000b1/cancel" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066"
  }'
Response, 200
{
  "drop": {
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "code": "EXAMPLE10",
    "shop_url": "https://example.com/image.jpg",
    "image_url": "https://example.com/image.jpg",
    "share_url": "https://example.com/image.jpg",
    "name": "Example name",
    "description": "Added at the front desk",
    "status": "draft",
    "state": "draft",
    "opens_at": "<opens_at>",
    "closes_at": "<closes_at>",
    "collection_date": "<collection_date>",
    "timezone": "Europe/London",
    "checkout_ttl_seconds": 1,
    "menu_visible_before_open": true,
    "show_stock_count": true,
    "max_per_customer": 1,
    "items": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "menu_item_id": "ca65a6e7-0000-4000-8000-d0c5000000ca",
        "name": "Example name",
        "price_pence": 1500,
        "image_url": "https://example.com/image.jpg",
        "quantity": 1,
        "remaining": 1,
        "is_unlimited": true,
        "sold": 1,
        "max_per_order": 1,
        "sold_out_at": "<sold_out_at>",
        "sort_order": 1,
        "allergens": [
          "<allergen>"
        ],
        "allergens_declared_none": true,
        "allergens_missing": true
      }
    ],
    "windows": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "starts_at": "<starts_at>",
        "ends_at": "<ends_at>",
        "max_orders": 1,
        "orders_remaining": 1
      }
    ],
    "buyers": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "order_number": "<order_number>",
        "name": "Example name",
        "email": "alex@example.com",
        "total_pence": 1500,
        "paid_at": "<paid_at>",
        "collected_at": "<collected_at>",
        "fulfilment_status": "<fulfilment_status>",
        "collection_at": "<collection_at>"
      }
    ],
    "orders_count": 1,
    "units_sold": 1,
    "units_total": 1,
    "has_unlimited": true,
    "gross_pence": 1500,
    "blockers": [
      "<blocker>"
    ],
    "created_at": "<created_at>",
    "updated_at": "<updated_at>"
  },
  "orders_to_refund": 1,
  "people_to_tell": 1,
  "refund_pence": 1500
}

Run that drop again.

Copies a drop's name, description, photo, items and quantities, collection windows and settings onto a new date, as a DRAFT. With no dates supplied it moves forward in whole weeks from the original, keeping the weekday and the time of day. Orders, sales and announcements are never copied, and the original keeps its link.

Parameters

dropIdstringpathrequired

Request body

store_idstring · uuidrequired
drop_idstring · uuidoptional
client_tokenstringoptional

Send the same token on a retry to get the SAME drop back instead of a duplicate.

namestringoptional
opens_atstringoptional
closes_atstring, nullableoptional

Defaults to the source's closing time, moved with the date. Null leaves the copy without one: it is a draft, and cannot be scheduled until a closing time is set.

collection_datestringoptional

Response, 200

dropobjectrequired
29 child fields
idstringrequired
store_idstringrequired
codestringrequired

The short code that identifies this drop.

shop_urlstring, nullablerequired

The shop's permanent drops page: /{handle}/drops

image_urlstring, nullablerequired
share_urlstringrequired

The link to this specific drop.

namestringrequired
descriptionstring, nullablerequired
statusenumrequired
draftscheduledcancelled
stateenumrequired

Computed at read time. Never sent by a client.

draftscheduledliveclosedcollectedcancelled
opens_atstringrequired
closes_atstring, nullablerequired

Null only while a draft has no closing time yet. A scheduled drop always has one.

collection_datestringrequired
timezonestringrequired
checkout_ttl_secondsnumberrequired
menu_visible_before_openbooleanrequired
show_stock_countbooleanrequired
max_per_customernumber, nullablerequired
itemsarray of objectrequired
15 child fields
idstringrequired
menu_item_idstringrequired
namestringrequired

Copied from the menu item at read time, never stored twice.

price_pencenumber, nullablerequired
image_urlstring, nullablerequired
quantitynumberrequired

How many were put up. Meaningless when is_unlimited.

remainingnumberrequired

How many are still available. Never negative. Mirrors quantity when is_unlimited.

is_unlimitedbooleanrequired
soldnumberrequired
max_per_ordernumber, nullablerequired

null = no limit.

sold_out_atstring, nullablerequired

Always null for an unlimited item.

sort_ordernumberrequired
allergensarray of stringrequired
allergens_declared_nonebooleanrequired
allergens_missingbooleanrequired
windowsarray of objectrequired
5 child fields
idstringrequired
starts_atstringrequired
ends_atstringrequired
max_ordersnumber, nullablerequired

null = no cap on orders in this window.

orders_remainingnumber, nullablerequired
buyersarray of objectoptional
9 child fields
idstringrequired
order_numberstring, nullablerequired
namestring, nullablerequired
emailstring, nullablerequired
total_penceintegerrequired
paid_atstring, nullablerequired
collected_atstring, nullablerequired
fulfilment_statusstring, nullablerequired
collection_atstring, nullablerequired
orders_countnumberrequired
units_soldnumberrequired
units_totalnumberrequired

Sum of the counted items only; an unlimited item adds nothing.

has_unlimitedbooleanrequired
gross_pencenumberrequired
blockersarray of stringrequired
created_atstringrequired
updated_atstringrequired
curl -X POST "https://www.membber.com/api/v1/drops/b11f386a-0000-4000-8000-d0c5000000b1/duplicate" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066"
  }'
Response, 200
{
  "drop": {
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "code": "EXAMPLE10",
    "shop_url": "https://example.com/image.jpg",
    "image_url": "https://example.com/image.jpg",
    "share_url": "https://example.com/image.jpg",
    "name": "Example name",
    "description": "Added at the front desk",
    "status": "draft",
    "state": "draft",
    "opens_at": "<opens_at>",
    "closes_at": "<closes_at>",
    "collection_date": "<collection_date>",
    "timezone": "Europe/London",
    "checkout_ttl_seconds": 1,
    "menu_visible_before_open": true,
    "show_stock_count": true,
    "max_per_customer": 1,
    "items": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "menu_item_id": "ca65a6e7-0000-4000-8000-d0c5000000ca",
        "name": "Example name",
        "price_pence": 1500,
        "image_url": "https://example.com/image.jpg",
        "quantity": 1,
        "remaining": 1,
        "is_unlimited": true,
        "sold": 1,
        "max_per_order": 1,
        "sold_out_at": "<sold_out_at>",
        "sort_order": 1,
        "allergens": [
          "<allergen>"
        ],
        "allergens_declared_none": true,
        "allergens_missing": true
      }
    ],
    "windows": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "starts_at": "<starts_at>",
        "ends_at": "<ends_at>",
        "max_orders": 1,
        "orders_remaining": 1
      }
    ],
    "buyers": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "order_number": "<order_number>",
        "name": "Example name",
        "email": "alex@example.com",
        "total_pence": 1500,
        "paid_at": "<paid_at>",
        "collected_at": "<collected_at>",
        "fulfilment_status": "<fulfilment_status>",
        "collection_at": "<collection_at>"
      }
    ],
    "orders_count": 1,
    "units_sold": 1,
    "units_total": 1,
    "has_unlimited": true,
    "gross_pence": 1500,
    "blockers": [
      "<blocker>"
    ],
    "created_at": "<created_at>",
    "updated_at": "<updated_at>"
  }
}

Set what is in the drop.

Replaces the drop menu with the given items, chosen from the store menu that already exists. Raising a quantity mid-drop puts stock back on sale immediately. Lowering it can never go below what is already sold, and the refusal says how many that is. An item omitted here is removed from the drop, which is refused if any of it has sold.

Parameters

dropIdstringpathrequired

Request body

store_idstring · uuidrequired
drop_idstring · uuidoptional
itemsarray of objectrequired
5 child fields
menu_item_idstring · uuidrequired
quantityintegerrequired
is_unlimitedbooleanoptional
max_per_orderinteger, nullableoptional
sort_orderintegeroptional

Response, 200

dropobjectrequired
29 child fields
idstringrequired
store_idstringrequired
codestringrequired

The short code that identifies this drop.

shop_urlstring, nullablerequired

The shop's permanent drops page: /{handle}/drops

image_urlstring, nullablerequired
share_urlstringrequired

The link to this specific drop.

namestringrequired
descriptionstring, nullablerequired
statusenumrequired
draftscheduledcancelled
stateenumrequired

Computed at read time. Never sent by a client.

draftscheduledliveclosedcollectedcancelled
opens_atstringrequired
closes_atstring, nullablerequired

Null only while a draft has no closing time yet. A scheduled drop always has one.

collection_datestringrequired
timezonestringrequired
checkout_ttl_secondsnumberrequired
menu_visible_before_openbooleanrequired
show_stock_countbooleanrequired
max_per_customernumber, nullablerequired
itemsarray of objectrequired
15 child fields
idstringrequired
menu_item_idstringrequired
namestringrequired

Copied from the menu item at read time, never stored twice.

price_pencenumber, nullablerequired
image_urlstring, nullablerequired
quantitynumberrequired

How many were put up. Meaningless when is_unlimited.

remainingnumberrequired

How many are still available. Never negative. Mirrors quantity when is_unlimited.

is_unlimitedbooleanrequired
soldnumberrequired
max_per_ordernumber, nullablerequired

null = no limit.

sold_out_atstring, nullablerequired

Always null for an unlimited item.

sort_ordernumberrequired
allergensarray of stringrequired
allergens_declared_nonebooleanrequired
allergens_missingbooleanrequired
windowsarray of objectrequired
5 child fields
idstringrequired
starts_atstringrequired
ends_atstringrequired
max_ordersnumber, nullablerequired

null = no cap on orders in this window.

orders_remainingnumber, nullablerequired
buyersarray of objectoptional
9 child fields
idstringrequired
order_numberstring, nullablerequired
namestring, nullablerequired
emailstring, nullablerequired
total_penceintegerrequired
paid_atstring, nullablerequired
collected_atstring, nullablerequired
fulfilment_statusstring, nullablerequired
collection_atstring, nullablerequired
orders_countnumberrequired
units_soldnumberrequired
units_totalnumberrequired

Sum of the counted items only; an unlimited item adds nothing.

has_unlimitedbooleanrequired
gross_pencenumberrequired
blockersarray of stringrequired
created_atstringrequired
updated_atstringrequired
curl -X PUT "https://www.membber.com/api/v1/drops/b11f386a-0000-4000-8000-d0c5000000b1/items" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "items": [
      {
        "menu_item_id": "ca65a6e7-0000-4000-8000-d0c5000000ca",
        "quantity": 1
      }
    ]
  }'
Response, 200
{
  "drop": {
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "code": "EXAMPLE10",
    "shop_url": "https://example.com/image.jpg",
    "image_url": "https://example.com/image.jpg",
    "share_url": "https://example.com/image.jpg",
    "name": "Example name",
    "description": "Added at the front desk",
    "status": "draft",
    "state": "draft",
    "opens_at": "<opens_at>",
    "closes_at": "<closes_at>",
    "collection_date": "<collection_date>",
    "timezone": "Europe/London",
    "checkout_ttl_seconds": 1,
    "menu_visible_before_open": true,
    "show_stock_count": true,
    "max_per_customer": 1,
    "items": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "menu_item_id": "ca65a6e7-0000-4000-8000-d0c5000000ca",
        "name": "Example name",
        "price_pence": 1500,
        "image_url": "https://example.com/image.jpg",
        "quantity": 1,
        "remaining": 1,
        "is_unlimited": true,
        "sold": 1,
        "max_per_order": 1,
        "sold_out_at": "<sold_out_at>",
        "sort_order": 1,
        "allergens": [
          "<allergen>"
        ],
        "allergens_declared_none": true,
        "allergens_missing": true
      }
    ],
    "windows": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "starts_at": "<starts_at>",
        "ends_at": "<ends_at>",
        "max_orders": 1,
        "orders_remaining": 1
      }
    ],
    "buyers": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "order_number": "<order_number>",
        "name": "Example name",
        "email": "alex@example.com",
        "total_pence": 1500,
        "paid_at": "<paid_at>",
        "collected_at": "<collected_at>",
        "fulfilment_status": "<fulfilment_status>",
        "collection_at": "<collection_at>"
      }
    ],
    "orders_count": 1,
    "units_sold": 1,
    "units_total": 1,
    "has_unlimited": true,
    "gross_pence": 1500,
    "blockers": [
      "<blocker>"
    ],
    "created_at": "<created_at>",
    "updated_at": "<updated_at>"
  }
}

Set the collection windows.

Replaces the drop collection windows. A drop owns its own windows for one date rather than inheriting the store's standing weekly hours. Windows can be added while the drop is selling. Removing a window that people have already booked into is refused, and the refusal says how many.

Parameters

dropIdstringpathrequired

Request body

store_idstring · uuidrequired
drop_idstring · uuidoptional
windowsarray of objectrequired
3 child fields
starts_atstringrequired
ends_atstringrequired
max_ordersinteger, nullableoptional

Response, 200

dropobjectrequired
29 child fields
idstringrequired
store_idstringrequired
codestringrequired

The short code that identifies this drop.

shop_urlstring, nullablerequired

The shop's permanent drops page: /{handle}/drops

image_urlstring, nullablerequired
share_urlstringrequired

The link to this specific drop.

namestringrequired
descriptionstring, nullablerequired
statusenumrequired
draftscheduledcancelled
stateenumrequired

Computed at read time. Never sent by a client.

draftscheduledliveclosedcollectedcancelled
opens_atstringrequired
closes_atstring, nullablerequired

Null only while a draft has no closing time yet. A scheduled drop always has one.

collection_datestringrequired
timezonestringrequired
checkout_ttl_secondsnumberrequired
menu_visible_before_openbooleanrequired
show_stock_countbooleanrequired
max_per_customernumber, nullablerequired
itemsarray of objectrequired
15 child fields
idstringrequired
menu_item_idstringrequired
namestringrequired

Copied from the menu item at read time, never stored twice.

price_pencenumber, nullablerequired
image_urlstring, nullablerequired
quantitynumberrequired

How many were put up. Meaningless when is_unlimited.

remainingnumberrequired

How many are still available. Never negative. Mirrors quantity when is_unlimited.

is_unlimitedbooleanrequired
soldnumberrequired
max_per_ordernumber, nullablerequired

null = no limit.

sold_out_atstring, nullablerequired

Always null for an unlimited item.

sort_ordernumberrequired
allergensarray of stringrequired
allergens_declared_nonebooleanrequired
allergens_missingbooleanrequired
windowsarray of objectrequired
5 child fields
idstringrequired
starts_atstringrequired
ends_atstringrequired
max_ordersnumber, nullablerequired

null = no cap on orders in this window.

orders_remainingnumber, nullablerequired
buyersarray of objectoptional
9 child fields
idstringrequired
order_numberstring, nullablerequired
namestring, nullablerequired
emailstring, nullablerequired
total_penceintegerrequired
paid_atstring, nullablerequired
collected_atstring, nullablerequired
fulfilment_statusstring, nullablerequired
collection_atstring, nullablerequired
orders_countnumberrequired
units_soldnumberrequired
units_totalnumberrequired

Sum of the counted items only; an unlimited item adds nothing.

has_unlimitedbooleanrequired
gross_pencenumberrequired
blockersarray of stringrequired
created_atstringrequired
updated_atstringrequired
curl -X PUT "https://www.membber.com/api/v1/drops/b11f386a-0000-4000-8000-d0c5000000b1/windows" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "windows": [
      {
        "starts_at": "<starts_at>",
        "ends_at": "<ends_at>"
      }
    ]
  }'
Response, 200
{
  "drop": {
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "code": "EXAMPLE10",
    "shop_url": "https://example.com/image.jpg",
    "image_url": "https://example.com/image.jpg",
    "share_url": "https://example.com/image.jpg",
    "name": "Example name",
    "description": "Added at the front desk",
    "status": "draft",
    "state": "draft",
    "opens_at": "<opens_at>",
    "closes_at": "<closes_at>",
    "collection_date": "<collection_date>",
    "timezone": "Europe/London",
    "checkout_ttl_seconds": 1,
    "menu_visible_before_open": true,
    "show_stock_count": true,
    "max_per_customer": 1,
    "items": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "menu_item_id": "ca65a6e7-0000-4000-8000-d0c5000000ca",
        "name": "Example name",
        "price_pence": 1500,
        "image_url": "https://example.com/image.jpg",
        "quantity": 1,
        "remaining": 1,
        "is_unlimited": true,
        "sold": 1,
        "max_per_order": 1,
        "sold_out_at": "<sold_out_at>",
        "sort_order": 1,
        "allergens": [
          "<allergen>"
        ],
        "allergens_declared_none": true,
        "allergens_missing": true
      }
    ],
    "windows": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "starts_at": "<starts_at>",
        "ends_at": "<ends_at>",
        "max_orders": 1,
        "orders_remaining": 1
      }
    ],
    "buyers": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "order_number": "<order_number>",
        "name": "Example name",
        "email": "alex@example.com",
        "total_pence": 1500,
        "paid_at": "<paid_at>",
        "collected_at": "<collected_at>",
        "fulfilment_status": "<fulfilment_status>",
        "collection_at": "<collection_at>"
      }
    ],
    "orders_count": 1,
    "units_sold": 1,
    "units_total": 1,
    "has_unlimited": true,
    "gross_pence": 1500,
    "blockers": [
      "<blocker>"
    ],
    "created_at": "<created_at>",
    "updated_at": "<updated_at>"
  }
}

Turn a paid order into a chat key, so a buyer is not asked to prove themselves twice.

Authorised by the PaymentIntent's client_secret, which only the browser that paid holds. Never minted from a remembered email: that is typed, never verified.

Request body

client_secretstringrequired

Response, 200

okbooleanrequired
chat_tokenstringrequired
handlestringrequired
curl -X POST "https://www.membber.com/api/v1/drops/chat/claim" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "client_secret": "<client_secret>"
  }'
Response, 200
{
  "ok": true,
  "chat_token": "<chat_token>",
  "handle": "<handle>"
}

Ask a shop a question.

Holds a question from someone with no account and emails them a code. PUBLIC. Nothing reaches the merchant and no customer record is created until the code is confirmed, so an unverified address cannot put a row in her book or a message in her inbox. One exception, chosen by the founder: an address already on this shop’s drop list with no existing thread posts straight away and receives a chat key, a drop signup already handed over that address, and a brand-new conversation exposes nothing that needs proof.

Parameters

handlestringpathrequired

Request body

handlestringoptional
emailstringrequired
messagestringrequired
namestring, nullableoptional
phonestring, nullableoptional

Response, 200

okbooleanrequired
expires_atstringoptional
conversation_idstringoptional
chat_tokenstringoptional
curl -X POST "https://www.membber.com/api/v1/drops/message/<handle>" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "alex@example.com",
    "message": "Added at the front desk"
  }'
Response, 200
{
  "ok": true,
  "expires_at": "<expires_at>",
  "conversation_id": "e701a257-0000-4000-8000-d0c5000000e7",
  "chat_token": "<chat_token>"
}

Read a buyer's own conversation with a shop.

Requires the chat key issued when their emailed code was accepted. Marks the shop's replies as read.

Parameters

handlestringpathrequired
handlestringqueryoptional

Supplied by the URL PATH.

tokenstringqueryrequired

The key issued when their code was accepted.

sincestring, nullablequeryoptional

ISO instant, poll for anything newer.

Response, 200

messagesarray of objectrequired
12 child fields
idstringrequired
fromenumrequired
youshop
bodystringrequired
atstringrequired
readbooleanrequired
kindenumrequired
textimagevideofilesystemcta
mediaUrlstring, nullablerequired
mediaThumbnailUrlstring, nullablerequired
mediaWidthnumber, nullablerequired
mediaHeightnumber, nullablerequired
mediaMimeTypestring, nullablerequired
mediaFileNamestring, nullablerequired
curl -G "https://www.membber.com/api/v1/drops/message/<handle>/chat" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  --data-urlencode "token=<token>"
Response, 200
{
  "messages": [
    {
      "id": "00000d1b-0000-4000-8000-d0c500000000",
      "from": "you",
      "body": "<body>",
      "at": "<at>",
      "read": true,
      "kind": "text",
      "mediaUrl": "https://example.com/image.jpg",
      "mediaThumbnailUrl": "https://example.com/image.jpg",
      "mediaWidth": 1,
      "mediaHeight": 1,
      "mediaMimeType": "<mediaMimeType>",
      "mediaFileName": "<mediaFileName>"
    }
  ]
}

Say something else, with no code and no form.

Requires the chat key. Posts into the same conversation the merchant already sees.

Parameters

handlestringpathrequired

Request body

handlestringoptional

Supplied by the URL PATH.

tokenstringrequired
messagestringrequired

Response, 200

okbooleanrequired
curl -X POST "https://www.membber.com/api/v1/drops/message/<handle>/chat" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "token": "<token>",
    "message": "Added at the front desk"
  }'
Response, 200
{
  "ok": true
}

Send a photo into the same conversation, from the same composer.

Sent as `multipart/form-data` with fields `file`, `token` and `client_message_id`. Requires the chat key, exactly as the text send does: the key names the conversation, so there is no id in the body for a caller to swap. Goes through the same upload path as the app: the per-shop block is checked BEFORE the bytes are buffered, images are capped at 10MB and videos at 50MB, and the message is deduped on `client_message_id` so a double-tap posts once. Unlike the app upload this needs no complete customer profile, a drop buyer proves themselves with a code or a receipt, and the text send asks for nothing more either.

Parameters

handlestringpathrequired

Response, 200

okbooleanrequired
curl -X POST "https://www.membber.com/api/v1/drops/message/<handle>/chat/media" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678"
Response, 200
{
  "ok": true
}

Send a code to open the chat.

Emails a verification code for an address the page already holds, so somebody who signed up to the shop another way does not retype it to start a conversation. No question is attached: the code opens the chat and they type once inside. PUBLIC, and rate limited like the question route, because it sends mail to a caller-supplied address. An unexpired code for the same address is REUSED rather than re-sent, so reopening the sheet cannot burn the limit or leave the person reading an older email.

Parameters

handlestringpathrequired

Request body

handlestringoptional
emailstringrequired
namestringoptional
phonestringoptional

Response, 200

okbooleanrequired
expires_atstringrequired
reusedbooleanrequired
curl -X POST "https://www.membber.com/api/v1/drops/message/<handle>/open" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "alex@example.com"
  }'
Response, 200
{
  "ok": true,
  "expires_at": "<expires_at>",
  "reused": true
}

Confirm the code and send the question.

Checks the emailed code and, only then, creates the lightweight customer and the conversation and posts the held question into the merchant's existing Messages tab. A wrong, missing or expired code all answer identically, so the endpoint cannot be used to discover whether a request is outstanding for an address.

Parameters

handlestringpathrequired

Request body

handlestringoptional
emailstringrequired
codestringrequired

Response, 200

okbooleanrequired
conversation_idstringrequired
chat_tokenstringrequired
curl -X POST "https://www.membber.com/api/v1/drops/message/<handle>/verify" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "alex@example.com",
    "code": "EXAMPLE10"
  }'
Response, 200
{
  "ok": true,
  "conversation_id": "e701a257-0000-4000-8000-d0c5000000e7",
  "chat_token": "<chat_token>"
}

Add a mobile to an order bought in one tap.

Writes a UK mobile onto a paid order that has none, so the shop can reach the buyer about collection. Authorised by the PaymentIntent client_secret from the return URL. Only ever fills a blank: an order that already carries a number is left untouched and answers success.

Request body

client_secretstringrequired
phonestringrequired

Response, 200

okbooleanrequired
savedbooleanrequired
curl -X POST "https://www.membber.com/api/v1/drops/order-phone" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "client_secret": "<client_secret>",
    "phone": "+44 7700 900123"
  }'
Response, 200
{
  "ok": true,
  "saved": true
}

Start a payment for a drop order.

Creates the PaymentIntent for an anonymous drop purchase and returns its client secret, so the card is taken on the shop's own page rather than on a hosted Stripe page. PUBLIC: the buyer has no account. Deliberately the SAME service call the customer app uses, so stock banking, receipts and the sold-out auto-refund all keep hanging off payment_intent.succeeded.

Request body

store_codestringrequired
idempotency_keystringrequired
batch_drop_idstring · uuidrequired
cart_tokenstringrequired
slot_idstring · uuid, nullableoptional
order_typestringrequired
collection_modestringrequired
itemsarray of objectrequired
2 child fields
menu_item_idstring · uuidrequired
quantityintegerrequired
express_walletbooleanoptional
customerobjectrequired
3 child fields
namestringrequired
phonestring, nullableoptional
emailstring, nullableoptional
device_fingerprintstring, nullableoptional

Response, 200

order_idstringrequired
order_numberstringrequired
statusstringrequired
requires_paymentbooleanrequired
client_secretstring, nullablerequired
connected_account_idstringrequired
publishable_keystring, nullablerequired
charge_modelenumrequired
destinationdirect
amount_pencenumberrequired
currencystringrequired
merchant_namestringrequired
curl -X POST "https://www.membber.com/api/v1/drops/payment" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_code": "EXAMPLE10",
    "idempotency_key": "1f0e2d3c-4b5a-4678-9abc-def012345678",
    "batch_drop_id": "63a4cc66-0000-4000-8000-d0c500000063",
    "cart_token": "<cart_token>",
    "order_type": "<order_type>",
    "collection_mode": "<collection_mode>",
    "items": [
      {
        "menu_item_id": "ca65a6e7-0000-4000-8000-d0c5000000ca",
        "quantity": 1
      }
    ],
    "customer": {
      "name": "Example name"
    }
  }'
Response, 200
{
  "order_id": "4991ffac-0000-4000-8000-d0c500000049",
  "order_number": "<order_number>",
  "status": "<status>",
  "requires_payment": true,
  "client_secret": "<client_secret>",
  "connected_account_id": "231b6f63-0000-4000-8000-d0c500000023",
  "publishable_key": "<publishable_key>",
  "charge_model": "destination",
  "amount_pence": 1500,
  "currency": "GBP",
  "merchant_name": "<merchant_name>"
}

A drop, as a buyer sees it.

Public. Everything a buyer needs to decide: what is in it, how many are left, when it opens, when to collect, and the allergens the seller declared. Returns the drop even before it opens so the page can count down; the menu itself is withheld while the seller has chosen to hide it.

Parameters

dropCodestringpathrequired
drop_codestringqueryoptional
cart_tokenstringqueryoptional

Response, 200

dropobjectrequired
18 child fields
stripeobjectrequired
3 child fields
publishable_keystring, nullablerequired
connected_account_idstring, nullablerequired
currencystringrequired
idstringrequired
codestringrequired
namestringrequired
descriptionstring, nullablerequired
image_urlstring, nullablerequired
galleryarray of objectrequired
4 child fields
urlstringrequired
typestringrequired

image | video

titlestring, nullablerequired
posterstring, nullablerequired

Still frame for a film.

stateenumrequired
scheduledliveclosedcollectedcancelled
opens_atstringrequired
closes_atstring, nullablerequired
collection_datestringrequired
timezonestringrequired
checkout_ttl_secondsnumberrequired
max_per_customernumber, nullablerequired
buyer_fee_percentnumber, nullablerequired
itemsarray of objectrequired
17 child fields
idstringrequired
menu_item_idstringrequired
namestringrequired
descriptionstring, nullablerequired
price_pencenumber, nullablerequired
image_urlstring, nullablerequired
sold_outbooleanrequired
remainingnumber, nullablerequired
in_other_basketsnumber, nullablerequired
max_per_ordernumber, nullablerequired
batch_totalnumber, nullablerequired
categorystring, nullablerequired
emojistring, nullablerequired
dietary_tagsarray of stringrequired
allergensarray of stringrequired
allergens_declared_nonebooleanrequired
ingredientsstring, nullablerequired
windowsarray of objectrequired
5 child fields
idstringrequired
starts_atstringrequired
ends_atstringrequired
fullbooleanrequired
places_leftinteger, nullablerequired
storeobjectrequired
26 child fields
codestringrequired
namestringrequired
handlestring, nullablerequired

Their permanent link: /{handle}/drops

logo_urlstring, nullablerequired
banner_urlstring, nullablerequired

The merchant's own banner artwork.

wordmark_urlstring, nullablerequired
texture_urlstring, nullablerequired
primary_colorstring, nullablerequired
secondary_colorstring, nullablerequired
accent_colorstring, nullablerequired
descriptionstring, nullablerequired
addressstring, nullablerequired
legal_namestring, nullablerequired

The trader as the law knows them, printed as "{name}, run by {legal_name}".

emailstring, nullablerequired

The business email the law wants on the page, shown as a mailto link.

vat_numberstring, nullablerequired

Printed as "VAT {vat_number}" only when the trader is VAT registered.

instagramstring, nullablerequired
facebookstring, nullablerequired
tiktokstring, nullablerequired
bg_modestring, nullablerequired

plain | brand | color | image

bg_valuestring, nullablerequired

#RRGGBB when color, a URL when image

ribbon_styleenumrequired
solidstripes
cta_labelstring, nullablerequired
cta_colorstring, nullablerequired
empty_titlestring, nullablerequired
empty_bodystring, nullablerequired
earns_stampsbooleanrequired

True only when a drop order here will earn a stamp at collection (loyalty_on_drops, off by default).

curl -G "https://www.membber.com/api/v1/drops/public/EXAMPLE10" \
  -H "Authorization: Bearer $MEMBBER_TOKEN"
Response, 200
{
  "drop": {
    "stripe": {
      "publishable_key": "<publishable_key>",
      "connected_account_id": "231b6f63-0000-4000-8000-d0c500000023",
      "currency": "GBP"
    },
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "code": "EXAMPLE10",
    "name": "Example name",
    "description": "Added at the front desk",
    "image_url": "https://example.com/image.jpg",
    "gallery": [
      {
        "url": "https://example.com/image.jpg",
        "type": "<type>",
        "title": "Morning class",
        "poster": "<poster>"
      }
    ],
    "state": "scheduled",
    "opens_at": "<opens_at>",
    "closes_at": "<closes_at>",
    "collection_date": "<collection_date>",
    "timezone": "Europe/London",
    "checkout_ttl_seconds": 1,
    "max_per_customer": 1,
    "buyer_fee_percent": 1,
    "items": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "menu_item_id": "ca65a6e7-0000-4000-8000-d0c5000000ca",
        "name": "Example name",
        "description": "Added at the front desk",
        "price_pence": 1500,
        "image_url": "https://example.com/image.jpg",
        "sold_out": true,
        "remaining": 1,
        "in_other_baskets": 1,
        "max_per_order": 1,
        "batch_total": 1,
        "category": "<category>",
        "emoji": "<emoji>",
        "dietary_tags": [
          "<dietary_tag>"
        ],
        "allergens": [
          "<allergen>"
        ],
        "allergens_declared_none": true,
        "ingredients": "<ingredients>"
      }
    ],
    "windows": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "starts_at": "<starts_at>",
        "ends_at": "<ends_at>",
        "full": true,
        "places_left": -9007199254740991
      }
    ],
    "store": {
      "code": "EXAMPLE10",
      "name": "Example name",
      "handle": "<handle>",
      "logo_url": "https://example.com/image.jpg",
      "banner_url": "https://example.com/image.jpg",
      "wordmark_url": "https://example.com/image.jpg",
      "texture_url": "https://example.com/image.jpg",
      "primary_color": "<primary_color>",
      "secondary_color": "<secondary_color>",
      "accent_color": "<accent_color>",
      "description": "Added at the front desk",
      "address": "<address>",
      "legal_name": "<legal_name>",
      "email": "alex@example.com",
      "vat_number": "<vat_number>",
      "instagram": "<instagram>",
      "facebook": "<facebook>",
      "tiktok": "<tiktok>",
      "bg_mode": "<bg_mode>",
      "bg_value": "<bg_value>",
      "ribbon_style": "solid",
      "cta_label": "<cta_label>",
      "cta_color": "<cta_color>",
      "empty_title": "<empty_title>",
      "empty_body": "<empty_body>",
      "earns_stamps": true
    }
  }
}

Hold something in your basket.

Public. Holds stock the moment it goes in the basket, not at payment, and starts the countdown. Sets the basket to the given quantity rather than adding to it, so a retry or a double tap converges instead of stacking. Send 0 to remove. Returns which limit bound if you got less than you asked for.

Parameters

dropCodestringpathrequired

Request body

drop_codestringoptional
cart_tokenstringrequired
item_idstring · uuidrequired
quantityintegerrequired
buyer_emailstring · email, nullableoptional
collection_slot_idstring · uuid, nullableoptional

Response, 200

grantednumberrequired
bound_byenumrequired
nonestockmax_per_ordermax_per_customerwindow_fullwindow_not_foundreleased
remainingnumber, nullablerequired
expires_atstring, nullablerequired
curl -X POST "https://www.membber.com/api/v1/drops/public/EXAMPLE10/hold" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "cart_token": "<cart_token>",
    "item_id": "7e22b9c7-0000-4000-8000-d0c50000007e",
    "quantity": 1
  }'
Response, 200
{
  "granted": 1,
  "bound_by": "none",
  "remaining": 1,
  "expires_at": "<expires_at>"
}

Give the basket back.

Public. Releases everything this basket holds, so it goes back on sale immediately rather than waiting for the countdown. Called when someone empties their basket or leaves.

Parameters

dropCodestringpathrequired

Request body

drop_codestringrequired
cart_tokenstringrequired

Response, 200

releasednumberrequired
curl -X POST "https://www.membber.com/api/v1/drops/public/EXAMPLE10/release" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "drop_code": "EXAMPLE10",
    "cart_token": "<cart_token>"
  }'
Response, 200
{
  "released": 1
}

Be reminded about this one drop.

Sets a per-drop reminder: the day before it opens, at open, and before it closes. PUBLIC, no account needed. Does NOT join the shop's general list; a second submission re-confirms rather than duplicating.

Parameters

dropCodestringpathrequired

Request body

phonestring, nullableoptional
emailstring, nullableoptional
consent_textstring, nullableoptional

Response, 200

okbooleanrequired
viaenumrequired
phoneemail
alreadybooleanrequired
on_listbooleanrequired
curl -X POST "https://www.membber.com/api/v1/drops/remind/EXAMPLE10" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "+44 7700 900123",
    "email": "alex@example.com",
    "consent_text": "<consent_text>"
  }'
Response, 200
{
  "ok": true,
  "via": "phone",
  "already": true,
  "on_list": true
}

Leave a review for a drop you collected.

PUBLIC, authorised entirely by the emailed token. Called twice for one review by design: the star tapped in the email records the rating, then the page adds words to the SAME row. The underlying function refuses an order that was never collected and a token that does not exist, so a review cannot exist without a purchase behind it.

Request body

tokenstring · uuidrequired
ratingintegerrequired
bodystring, nullableoptional
display_modeenumrequired
nameanonymous

Response, 200

review_idstringrequired
ratingnumberrequired
has_bodybooleanrequired
itemsarray of stringrequired
curl -X POST "https://www.membber.com/api/v1/drops/review" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "token": "0696b9f9-0000-4000-8000-d0c500000006",
    "rating": 1,
    "display_mode": "name"
  }'
Response, 200
{
  "review_id": "1d631b62-0000-4000-8000-d0c50000001d",
  "rating": 1,
  "has_body": true,
  "items": [
    "<item>"
  ]
}

How this shop's drops page looks.

Returns the merchant's own choices for her permanent drops page, plus the two things the picker needs to offer real options rather than invented ones: her brand colour and the shop photo she has already uploaded.

Parameters

store_idstring · uuidqueryrequired

Response, 200

shopobjectrequired
11 child fields
handlestring, nullablerequired

Their permanent name in the link, once claimed.

shop_urlstring, nullablerequired

The page this styles: /{handle}/drops

bg_modeenumrequired
plainbrandcolorimage
bg_valuestring, nullablerequired
brand_colorstring, nullablerequired
photo_urlstring, nullablerequired
descriptionstring, nullablerequired
cta_labelstring, nullablerequired
cta_colorstring, nullablerequired
empty_titlestring, nullablerequired
empty_bodystring, nullablerequired
curl -G "https://www.membber.com/api/v1/drops/shop" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  --data-urlencode "store_id=6659c139-0000-4000-8000-d0c500000066"
Response, 200
{
  "shop": {
    "handle": "<handle>",
    "shop_url": "https://example.com/image.jpg",
    "bg_mode": "plain",
    "bg_value": "<bg_value>",
    "brand_color": "<brand_color>",
    "photo_url": "https://example.com/image.jpg",
    "description": "Added at the front desk",
    "cta_label": "<cta_label>",
    "cta_color": "<cta_color>",
    "empty_title": "<empty_title>",
    "empty_body": "<empty_body>"
  }
}

Choose how the drops page looks.

Sets the background of the shop's permanent drops page. `color` requires a #RRGGBB and `image` requires a URL; both are refused without one rather than silently falling back, because a picker that quietly ignores the choice is worse than one that says no.

Request body

store_idstring · uuidrequired
bg_modeenumrequired
plainbrandcolorimage
bg_valuestring, nullableoptional
descriptionstringoptional
cta_labelstringoptional
cta_colorstringoptional

#RRGGBB, or empty for the brand-derived colour.

empty_titlestringoptional
empty_bodystringoptional

Response, 200

shopobjectrequired
11 child fields
handlestring, nullablerequired

Their permanent name in the link, once claimed.

shop_urlstring, nullablerequired

The page this styles: /{handle}/drops

bg_modeenumrequired
plainbrandcolorimage
bg_valuestring, nullablerequired
brand_colorstring, nullablerequired
photo_urlstring, nullablerequired
descriptionstring, nullablerequired
cta_labelstring, nullablerequired
cta_colorstring, nullablerequired
empty_titlestring, nullablerequired
empty_bodystring, nullablerequired
curl -X PUT "https://www.membber.com/api/v1/drops/shop" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "bg_mode": "plain"
  }'
Response, 200
{
  "shop": {
    "handle": "<handle>",
    "shop_url": "https://example.com/image.jpg",
    "bg_mode": "plain",
    "bg_value": "<bg_value>",
    "brand_color": "<brand_color>",
    "photo_url": "https://example.com/image.jpg",
    "description": "Added at the front desk",
    "cta_label": "<cta_label>",
    "cta_color": "<cta_color>",
    "empty_title": "<empty_title>",
    "empty_body": "<empty_body>"
  }
}

The photos and films on this shop's drops page, or on one drop's.

Everything in the carousel, in the order the merchant put it. Pass `drop_id` for ONE drop's own pictures; omit it for the shop's own page. The two are separate carousels sharing one table.

Parameters

drop_idstring · uuid, nullablequeryoptional

The drop whose own photos these are. Omitted means the shop's own page.

Response, 200

mediaarray of objectrequired
7 child fields
idstringrequired
urlstringrequired
media_typeenumrequired
imagevideo
titlestring, nullablerequired
thumbnail_urlstring, nullablerequired
sort_ordernumberrequired
is_publishedbooleanrequired
curl -G "https://www.membber.com/api/v1/drops/shop/media" \
  -H "Authorization: Bearer $MEMBBER_TOKEN"
Response, 200
{
  "media": [
    {
      "id": "00000d1b-0000-4000-8000-d0c500000000",
      "url": "https://example.com/image.jpg",
      "media_type": "image",
      "title": "Morning class",
      "thumbnail_url": "https://example.com/image.jpg",
      "sort_order": 1,
      "is_published": true
    }
  ]
}

Add a photo or film to the shop's carousel.

Records an ALREADY-UPLOADED file against the shop. The file itself goes up through the existing store-image uploader, so there is one uploader rather than two. New pieces are appended, never inserted at the front.

Request body

urlstringrequired
media_typeenumrequired
imagevideo
titlestring, nullableoptional
thumbnail_urlstring, nullableoptional
drop_idstring · uuid, nullableoptional

The drop whose own photos these are. Omitted means the shop's own page.

Response, 200

mediaarray of objectrequired
7 child fields
idstringrequired
urlstringrequired
media_typeenumrequired
imagevideo
titlestring, nullablerequired
thumbnail_urlstring, nullablerequired
sort_ordernumberrequired
is_publishedbooleanrequired
curl -X POST "https://www.membber.com/api/v1/drops/shop/media" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/image.jpg",
    "media_type": "image"
  }'
Response, 200
{
  "media": [
    {
      "id": "00000d1b-0000-4000-8000-d0c500000000",
      "url": "https://example.com/image.jpg",
      "media_type": "image",
      "title": "Morning class",
      "thumbnail_url": "https://example.com/image.jpg",
      "sort_order": 1,
      "is_published": true
    }
  ]
}

Remove a photo or film from the shop's carousel.

Scoped to the calling store, so one shop can never remove another's media.

Parameters

mediaIdstringpathrequired
mediaIdstring · uuidqueryrequired
drop_idstring · uuid, nullablequeryoptional

The drop whose own photos these are. Omitted means the shop's own page.

Response, 200

mediaarray of objectrequired
7 child fields
idstringrequired
urlstringrequired
media_typeenumrequired
imagevideo
titlestring, nullablerequired
thumbnail_urlstring, nullablerequired
sort_ordernumberrequired
is_publishedbooleanrequired
curl -X DELETE "https://www.membber.com/api/v1/drops/shop/media/3813101f-0000-4000-8000-d0c500000038?mediaId=3813101f-0000-4000-8000-d0c500000038" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678"
Response, 200
{
  "media": [
    {
      "id": "00000d1b-0000-4000-8000-d0c500000000",
      "url": "https://example.com/image.jpg",
      "media_type": "image",
      "title": "Morning class",
      "thumbnail_url": "https://example.com/image.jpg",
      "sort_order": 1,
      "is_published": true
    }
  ]
}

Reorder the shop's carousel.

Every id is checked against this store before anything moves.

Request body

idsarray of string · uuidrequired
drop_idstring · uuid, nullableoptional

The drop whose own photos these are. Omitted means the shop's own page.

Response, 200

mediaarray of objectrequired
7 child fields
idstringrequired
urlstringrequired
media_typeenumrequired
imagevideo
titlestring, nullablerequired
thumbnail_urlstring, nullablerequired
sort_ordernumberrequired
is_publishedbooleanrequired
curl -X PUT "https://www.membber.com/api/v1/drops/shop/media/order" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "ids": [
      "00000d1b-0000-4000-8000-d0c500000000"
    ]
  }'
Response, 200
{
  "media": [
    {
      "id": "00000d1b-0000-4000-8000-d0c500000000",
      "url": "https://example.com/image.jpg",
      "media_type": "image",
      "title": "Morning class",
      "thumbnail_url": "https://example.com/image.jpg",
      "sort_order": 1,
      "is_published": true
    }
  ]
}

Be told when this shop opens a drop.

Adds a phone number or email to a shop's drop list. PUBLIC, the person has no account and does not need one. A second submission re-subscribes rather than duplicating.

Parameters

handlestringpathrequired

Request body

handlestringoptional
phonestring, nullableoptional
emailstring, nullableoptional
consent_textstring, nullableoptional

Response, 200

okbooleanrequired
viaenumrequired
phoneemail
alreadybooleanrequired
welcomeenumrequired
textemailnone
curl -X POST "https://www.membber.com/api/v1/drops/subscribe/<handle>" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "handle": "<handle>",
    "phone": "+44 7700 900123",
    "email": "alex@example.com",
    "consent_text": "<consent_text>"
  }'
Response, 200
{
  "ok": true,
  "via": "phone",
  "already": true,
  "welcome": "text"
}
WhatsApp
Book a Call
Start Free