Drops

20 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
27 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
collection_datestringrequired
timezonestringrequired
checkout_ttl_secondsnumberrequired
menu_visible_before_openbooleanrequired
show_stock_countbooleanrequired
max_per_customernumber, nullablerequired
itemsarray of objectrequired
13 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.

remainingnumberrequired

How many are still available. Never negative.

max_per_ordernumber, nullablerequired

null = no limit.

sold_out_atstring, nullablerequired
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
orders_countnumberrequired
units_soldnumberrequired
units_totalnumberrequired
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_paymentsunavailable
reachable_customersinteger, nullablerequired
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,
          "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
        }
      ],
      "orders_count": 1,
      "units_sold": 1,
      "units_total": 1,
      "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
}

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, or null to close when it sells out.

collection_datestringrequired

YYYY-MM-DD in the store timezone.

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
27 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
collection_datestringrequired
timezonestringrequired
checkout_ttl_secondsnumberrequired
menu_visible_before_openbooleanrequired
show_stock_countbooleanrequired
max_per_customernumber, nullablerequired
itemsarray of objectrequired
13 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.

remainingnumberrequired

How many are still available. Never negative.

max_per_ordernumber, nullablerequired

null = no limit.

sold_out_atstring, nullablerequired
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
orders_countnumberrequired
units_soldnumberrequired
units_totalnumberrequired
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,
        "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
      }
    ],
    "orders_count": 1,
    "units_sold": 1,
    "units_total": 1,
    "gross_pence": 1500,
    "blockers": [
      "<blocker>"
    ],
    "created_at": "<created_at>",
    "updated_at": "<updated_at>"
  }
}

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
27 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
collection_datestringrequired
timezonestringrequired
checkout_ttl_secondsnumberrequired
menu_visible_before_openbooleanrequired
show_stock_countbooleanrequired
max_per_customernumber, nullablerequired
itemsarray of objectrequired
13 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.

remainingnumberrequired

How many are still available. Never negative.

max_per_ordernumber, nullablerequired

null = no limit.

sold_out_atstring, nullablerequired
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
orders_countnumberrequired
units_soldnumberrequired
units_totalnumberrequired
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,
        "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
      }
    ],
    "orders_count": 1,
    "units_sold": 1,
    "units_total": 1,
    "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 any item is missing its allergens, and the refusal names the item.

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, or null to close when it sells out.

collection_datestringoptional

YYYY-MM-DD in the store timezone.

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
27 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
collection_datestringrequired
timezonestringrequired
checkout_ttl_secondsnumberrequired
menu_visible_before_openbooleanrequired
show_stock_countbooleanrequired
max_per_customernumber, nullablerequired
itemsarray of objectrequired
13 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.

remainingnumberrequired

How many are still available. Never negative.

max_per_ordernumber, nullablerequired

null = no limit.

sold_out_atstring, nullablerequired
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
orders_countnumberrequired
units_soldnumberrequired
units_totalnumberrequired
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,
        "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
      }
    ],
    "orders_count": 1,
    "units_sold": 1,
    "units_total": 1,
    "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
27 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
collection_datestringrequired
timezonestringrequired
checkout_ttl_secondsnumberrequired
menu_visible_before_openbooleanrequired
show_stock_countbooleanrequired
max_per_customernumber, nullablerequired
itemsarray of objectrequired
13 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.

remainingnumberrequired

How many are still available. Never negative.

max_per_ordernumber, nullablerequired

null = no limit.

sold_out_atstring, nullablerequired
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
orders_countnumberrequired
units_soldnumberrequired
units_totalnumberrequired
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,
        "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
      }
    ],
    "orders_count": 1,
    "units_sold": 1,
    "units_total": 1,
    "gross_pence": 1500,
    "blockers": [
      "<blocker>"
    ],
    "created_at": "<created_at>",
    "updated_at": "<updated_at>"
  },
  "orders_to_refund": 1,
  "people_to_tell": 1,
  "refund_pence": 1500
}

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
4 child fields
menu_item_idstring · uuidrequired
quantityintegerrequired
max_per_orderinteger, nullableoptional
sort_orderintegeroptional

Response, 200

dropobjectrequired
27 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
collection_datestringrequired
timezonestringrequired
checkout_ttl_secondsnumberrequired
menu_visible_before_openbooleanrequired
show_stock_countbooleanrequired
max_per_customernumber, nullablerequired
itemsarray of objectrequired
13 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.

remainingnumberrequired

How many are still available. Never negative.

max_per_ordernumber, nullablerequired

null = no limit.

sold_out_atstring, nullablerequired
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
orders_countnumberrequired
units_soldnumberrequired
units_totalnumberrequired
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,
        "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
      }
    ],
    "orders_count": 1,
    "units_sold": 1,
    "units_total": 1,
    "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
27 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
collection_datestringrequired
timezonestringrequired
checkout_ttl_secondsnumberrequired
menu_visible_before_openbooleanrequired
show_stock_countbooleanrequired
max_per_customernumber, nullablerequired
itemsarray of objectrequired
13 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.

remainingnumberrequired

How many are still available. Never negative.

max_per_ordernumber, nullablerequired

null = no limit.

sold_out_atstring, nullablerequired
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
orders_countnumberrequired
units_soldnumberrequired
units_totalnumberrequired
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,
        "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
      }
    ],
    "orders_count": 1,
    "units_sold": 1,
    "units_total": 1,
    "gross_pence": 1500,
    "blockers": [
      "<blocker>"
    ],
    "created_at": "<created_at>",
    "updated_at": "<updated_at>"
  }
}

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.

Parameters

handlestringpathrequired

Request body

handlestringoptional
emailstringrequired
messagestringrequired
namestring, nullableoptional
phonestring, nullableoptional

Response, 200

okbooleanrequired
expires_atstringrequired
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>"
}

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
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"
}

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
customerobjectrequired
3 child fields
namestringrequired
phonestringrequired
emailstring, nullableoptional
device_fingerprintstring, nullableoptional

Response, 200

order_idstringrequired
order_numberstringrequired
statusstringrequired
requires_paymentbooleanrequired
client_secretstring, nullablerequired
connected_account_idstringrequired
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",
      "phone": "+44 7700 900123"
    }
  }'
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",
  "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
15 child fields
idstringrequired
codestringrequired
namestringrequired
descriptionstring, nullablerequired
image_urlstring, nullablerequired
stateenumrequired
scheduledliveclosedcollectedcancelled
opens_atstringrequired
closes_atstring, nullablerequired
collection_datestringrequired
timezonestringrequired
checkout_ttl_secondsnumberrequired
max_per_customernumber, nullablerequired
itemsarray of objectrequired
16 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
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
15 child fields
codestringrequired
namestringrequired
handlestring, nullablerequired

Their permanent link: /{handle}/drops

logo_urlstring, nullablerequired
banner_urlstring, nullablerequired

The merchant's own banner artwork.

primary_colorstring, nullablerequired
secondary_colorstring, nullablerequired
accent_colorstring, nullablerequired
descriptionstring, nullablerequired
addressstring, nullablerequired
instagramstring, nullablerequired
facebookstring, nullablerequired
tiktokstring, nullablerequired
bg_modestring, nullablerequired

plain | brand | color | image

bg_valuestring, nullablerequired

#RRGGBB when color, a URL when image

curl -G "https://www.membber.com/api/v1/drops/public/EXAMPLE10" \
  -H "Authorization: Bearer $MEMBBER_TOKEN"
Response, 200
{
  "drop": {
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "code": "EXAMPLE10",
    "name": "Example name",
    "description": "Added at the front desk",
    "image_url": "https://example.com/image.jpg",
    "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,
    "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,
        "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",
      "primary_color": "<primary_color>",
      "secondary_color": "<secondary_color>",
      "accent_color": "<accent_color>",
      "description": "Added at the front desk",
      "address": "<address>",
      "instagram": "<instagram>",
      "facebook": "<facebook>",
      "tiktok": "<tiktok>",
      "bg_mode": "<bg_mode>",
      "bg_value": "<bg_value>"
    }
  }
}

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_fullreleased
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
}

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
6 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
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"
  }
}

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

Response, 200

shopobjectrequired
6 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
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"
  }
}

The photos and films on this shop's drops page.

Everything in the shop's hero carousel, in the order the merchant put it.

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

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

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

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
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
}
WhatsApp
Book a Call
Start Free