1 operation. Every schema and example on this page is generated from the platform contract.
Stops BOTH lanes - counter sales and Click & Collect - for the rest of the store-local day, and leaves every order already in progress exactly as promised: no refunds, no cancellations, no messages to those customers. The middle tier between the Pause pill (Click & Collect only) and the emergency close (which refunds everyone). Lifted by the same reopen the emergency close uses. Refused with CLOSURE_IN_PROGRESS when the store is already closed for the day with refunds under way. The merchant's note honours message_visibility: 'internal' keeps it off the storefront's closed line, which every visitor reads.
equipment_failurestaff_unavailablepower_or_watersold_outweatheremergencyotherThe merchant's own words. Whether a customer ever reads them is decided by message_visibility, exactly as for a closure.
Who the merchant's note is for. 'customers' shows it verbatim to affected customers AND on the storefront closed line. 'internal' keeps it on the closure for staff and audit only, both customer surfaces fall back to the neutral per-reason phrase.
customersinternalTrue when a hold was already running - a second tap updates it, never forks a second stop.
curl -X POST "https://www.membber.com/api/v1/trading-hold" \
-H "Authorization: Bearer $MEMBBER_TOKEN" \
-H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
-H "Content-Type: application/json" \
-d '{
"reason_code": "equipment_failure"
}'import { createMembberClient } from "@membber/sdk-ts";
const membber = createMembberClient({
getAccessToken: () => process.env.MEMBBER_TOKEN,
});
const { data, error } = await membber.raw.POST("/api/v1/trading-hold", {
body: {
reason_code: "equipment_failure"
},
headers: { "Idempotency-Key": crypto.randomUUID() },
});
if (error) {
// Typed error envelope: { error: { code, message, requestId } }
throw new Error(`${error.error.code}: ${error.error.message}`);
}
console.log(data);import MembberSwift
let client = MembberClient(
serverURL: MembberClient.productionServerURL,
tokenProvider: { session.accessToken }
)
let response = try await client.api.openTradingHold(
body: .json(.init(
reasonCode: .equipmentFailure
))
).ok.body.json
print(response){
"hold_id": "4112d09b-0000-4000-8000-d0c500000041",
"resumed": true
}