Skip to content
v0.3

tenant.store.update

Update a store (partial; omitted fields keep their value). Setting host repoints where the storefront serves it; clearing it takes the store off routing. theme_key re-skins the store — it names a theme folder the storefront resolves, so an unknown name is accepted here and falls back there. notification_sender_name and notification_reply_to are the identity this store’s transactional messages are sent WITH: the display name in front of the instance’s address, and where a reply goes. Both fall back to the instance when unset (the store’s own name, then the tenant’s name), and both are cleared by sending an empty string. The mail transport’s credential is never a field here — it stays in the instance’s environment. reservation_minutes is how long this store holds stock for an order that has not paid yet; it must be positive (a store that reserved nothing would never decrement stock, since committing the hold is what does that), and the hold actually applied is the LONGER of it and the declared payment window of the method the shopper chose. status says whether this store is on the STREET: active (the default — it has a public storefront page, served at /s/<store> and at its public URL) or private (it has no public page, and the storefront answers 404 for it). private never turns the store OFF — its catalogue, prices, stock and orders are unchanged and the port answers for it exactly as before, which is how a counter terminal, a totem or an integration keeps selling for a store that is not on the street.

  • Scope: tenant.store.write
  • System: no
  • Reachable from: POST /v1/commands/tenant.store.update — the tenant data face, with a tenant credential carrying tenant.store.write · MCP tool tenant.store.update · SDK client.call('tenant.store.update', …)
  • Events: tenant.store.updated
{
"properties": {
"guest_checkout_enabled": {
"type": "boolean"
},
"host": {
"type": "string"
},
"id": {
"minLength": 1,
"type": "string"
},
"masked_checkout_enabled": {
"type": "boolean"
},
"name": {
"minLength": 1,
"type": "string"
},
"notification_reply_to": {
"anyOf": [
{
"const": "",
"type": "string"
},
{
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"type": "string"
}
]
},
"notification_sender_name": {
"maxLength": 120,
"type": "string"
},
"reservation_minutes": {
"exclusiveMinimum": 0,
"maximum": 43200,
"type": "integer"
},
"status": {
"enum": [
"active",
"private"
],
"type": "string"
},
"theme_key": {
"minLength": 1,
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
}
{
"additionalProperties": false,
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
}

validation_failed (400) · unauthorized (401) · forbidden (403) · conflict (409) · internal (500)