Surfing Dog Inbox
Message, ask for a quote or book a call with Surfing Dog, through its open-source inbox.
Should I use this
Quality & Safety
Findings (1)
- LOWin get_business_profile
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"inbox": {
"url": "https://inbox.surfingdog.ai/mcp"
}
}
}Remote endpoints
https://inbox.surfingdog.ai/mcpstreamable-httpWhat it can do
Tool inventory
Tools (16)
๐ขget_business_profile
Name, time zone, currency, languages and the item types this business accepts.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}๐ขlist_services(cursor, limit)
Bookable services with duration and price. A price per person (price.per = person) is for each person in the booking: send partySize, and the total is the price times it.
Input Schema
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"maxLength": 200
},
"limit": {
"default": 50,
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}๐ขlist_products(cursor, limit, q)
Orderable products with prices in minor units.
Input Schema
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"maxLength": 200
},
"limit": {
"default": 50,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"q": {
"type": "string",
"maxLength": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}๐ขcheck_availability(service_id, from, to, party_size)
Free start times for a service between two instants (at most 14 days). A time that has started, or that starts within the business's minimum notice, is not offered.
Input Schema
{
"type": "object",
"properties": {
"service_id": {
"type": "string",
"minLength": 1
},
"from": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "Start of the window to search, ISO 8601."
},
"to": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "End of the window, at most 14 days after from."
},
"party_size": {
"type": "integer",
"minimum": 1,
"maximum": 1000
}
},
"required": [
"service_id",
"from",
"to"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}โชrequest_quote(payload, contact, message, idempotency_key, pass, ...)
Ask for a price on something custom. Creates a quote_request item.
Input Schema
{
"type": "object",
"properties": {
"payload": {
"type": "object",
"properties": {
"itemOffered": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"sku": {
"type": "string",
"maxLength": 100
},
"serviceId": {
"type": "string"
},
"productId": {
"type": "string"
}
},
"required": [
"name"
]
},
"quantity": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"description": {
"type": "string",
"minLength": 1,
"maxLength": 5000
},
"budget": {
"type": "object",
"properties": {
"value": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"currency": {
"type": "string",
"minLength": 3,
"maxLength": 3
}
},
"required": [
"value",
"currency"
]
},
"requestedFor": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"deliveryAddress": {
"type": "object",
"properties": {
"streetAddress": {
"type": "string",
"maxLength": 200
},
"addressLocality": {
"type": "string",
"maxLength": 100
},
"addressRegion": {
"type": "string",
"maxLength": 100
},
"postalCode": {
"type": "string",
"maxLength": 20
},
"addressCountry": {
"type": "string",
"minLength": 2,
"maxLength": 2
}
}
}
},
"required": [
"itemOffered",
"description"
]
},
"contact": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 200
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"phone": {
"type": "string",
"maxLength": 40
},
"locale": {
"type": "string",
"maxLength": 12
}
}
},
"message": {
"type": "string",
"maxLength": 20000
},
"idempotency_key": {
"description": "Same key + same request = same answer. Required for agents.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"pass": {
"description": "The person's passes (sdpass1_โฆ), space-separated, at most 8: presented to the network that issued each, so the business recognises the customer. Or send them in the Sdi-Pass header. Never stored.",
"type": "string",
"maxLength": 1608
},
"key": {
"description": "The person's key (sdkey1_โฆ), if that is all you have: it is exchanged once for a pass, which comes back in identity.passes โ keep the pass and send it next time instead. Never stored.",
"type": "string",
"maxLength": 200
}
},
"required": [
"payload"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}๐กcreate_booking(payload, contact, message, idempotency_key, pass, ...)
Request a service at a time. Check availability first. A fixed-price service costs the business's price from list_services; a different totalPrice you send is only noted for the business. Returns the item and, if you have no account, an access_token.
Input Schema
{
"type": "object",
"properties": {
"payload": {
"type": "object",
"properties": {
"reservationFor": {
"type": "object",
"properties": {
"serviceId": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"required": [
"serviceId",
"name"
]
},
"startTime": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"endTime": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"partySize": {
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"totalPrice": {
"type": "object",
"properties": {
"value": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"currency": {
"type": "string",
"minLength": 3,
"maxLength": 3
}
},
"required": [
"value",
"currency"
]
},
"resourceId": {
"type": "string"
},
"notes": {
"type": "string",
"maxLength": 5000
}
},
"required": [
"reservationFor",
"startTime",
"endTime"
]
},
"contact": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 200
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"phone": {
"type": "string",
"maxLength": 40
},
"locale": {
"type": "string",
"maxLength": 12
}
}
},
"message": {
"type": "string",
"maxLength": 20000
},
"idempotency_key": {
"description": "Same key + same request = same answer. Required for agents.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"pass": {
"description": "The person's passes (sdpass1_โฆ), space-separated, at most 8: presented to the network that issued each, so the business recognises the customer. Or send them in the Sdi-Pass header. Never stored.",
"type": "string",
"maxLength": 1608
},
"key": {
"description": "The person's key (sdkey1_โฆ), if that is all you have: it is exchanged once for a pass, which comes back in identity.passes โ keep the pass and send it next time instead. Never stored.",
"type": "string",
"maxLength": 200
}
},
"required": [
"payload"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}๐กcreate_order(payload, contact, message, idempotency_key, pass, ...)
Order products. Prices are in minor units. A line naming a product (productId or sku) costs the business's price from list_products, and the total follows; a different price you send is only noted for the business. A line naming no product waits for the business to price it.
Input Schema
{
"type": "object",
"properties": {
"payload": {
"type": "object",
"properties": {
"orderedItem": {
"minItems": 1,
"maxItems": 200,
"type": "array",
"items": {
"type": "object",
"properties": {
"productId": {
"type": "string"
},
"sku": {
"type": "string",
"maxLength": 100
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"quantity": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"price": {
"type": "object",
"properties": {
"value": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"currency": {
"type": "string",
"minLength": 3,
"maxLength": 3
}
},
"required": [
"value",
"currency"
]
}
},
"required": [
"name",
"quantity",
"price"
]
}
},
"totalPrice": {
"type": "object",
"properties": {
"value": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"currency": {
"type": "string",
"minLength": 3,
"maxLength": 3
}
},
"required": [
"value",
"currency"
]
},
"billingAddress": {
"type": "object",
"properties": {
"streetAddress": {
"type": "string",
"maxLength": 200
},
"addressLocality": {
"type": "string",
"maxLength": 100
},
"addressRegion": {
"type": "string",
"maxLength": 100
},
"postalCode": {
"type": "string",
"maxLength": 20
},
"addressCountry": {
"type": "string",
"minLength": 2,
"maxLength": 2
}
}
},
"shippingAddress": {
"type": "object",
"properties": {
"streetAddress": {
"type": "string",
"maxLength": 200
},
"addressLocality": {
"type": "string",
"maxLength": 100
},
"addressRegion": {
"type": "string",
"maxLength": 100
},
"postalCode": {
"type": "string",
"maxLength": 20
},
"addressCountry": {
"type": "string",
"minLength": 2,
"maxLength": 2
}
}
},
"delivery": {
"type": "object",
"properties": {
"method": {
"type": "string",
"enum": [
"pickup",
"delivery",
"digital"
]
},
"when": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"method"
]
},
"paymentMethod": {
"type": "string",
"maxLength": 60
},
"notes": {
"type": "string",
"maxLength": 5000
}
},
"required": [
"orderedItem",
"totalPrice"
]
},
"contact": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 200
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"phone": {
"type": "string",
"maxLength": 40
},
"locale": {
"type": "string",
"maxLength": 12
}
}
},
"message": {
"type": "string",
"maxLength": 20000
},
"idempotency_key": {
"description": "Same key + same request = same answer. Required for agents.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"pass": {
"description": "The person's passes (sdpass1_โฆ), space-separated, at most 8: presented to the network that issued each, so the business recognises the customer. Or send them in the Sdi-Pass header. Never stored.",
"type": "string",
"maxLength": 1608
},
"key": {
"description": "The person's key (sdkey1_โฆ), if that is all you have: it is exchanged once for a pass, which comes back in identity.passes โ keep the pass and send it next time instead. Never stored.",
"type": "string",
"maxLength": 200
}
},
"required": [
"payload"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}๐ขget_item_status(item_id, access_token, pass, key)
The current state of an item you created, in the business's words: what it proposed and waits for your person to answer (offer, with its terms_sha), who it waits on, what they can do next, and the conversation so far (thread: the business's replies and your person's messages).
Input Schema
{
"type": "object",
"properties": {
"item_id": {
"type": "string",
"minLength": 1
},
"access_token": {
"description": "Capability secret returned when the item was created without an account.",
"type": "string",
"minLength": 16,
"maxLength": 200
},
"pass": {
"description": "The person's passes (sdpass1_โฆ), space-separated, at most 8: presented to the network that issued each, so the business recognises the customer. Or send them in the Sdi-Pass header. Never stored.",
"type": "string",
"maxLength": 1608
},
"key": {
"description": "The person's key (sdkey1_โฆ), if that is all you have: it is exchanged once for a pass, which comes back in identity.passes โ keep the pass and send it next time instead. Never stored.",
"type": "string",
"maxLength": 200
}
},
"required": [
"item_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}๐กaccept_offer(item_id, terms_sha, access_token, idempotency_key, pass, ...)
Accept another time the business proposed for a booking, or its quote. This binds your person, so send terms_sha โ offer.terms_sha from get_item_status โ only after they said yes to offer.human. Without terms_sha nothing is booked: you get the terms to show them. An accepted quote becomes a confirmed booking or order (linked).
Input Schema
{
"type": "object",
"properties": {
"item_id": {
"type": "string",
"minLength": 1
},
"terms_sha": {
"description": "The fingerprint of the terms your person said yes to: offer.terms_sha from get_item_status. Leave it out to be told the terms first; nothing is booked without it.",
"type": "string",
"pattern": "^[A-Za-z0-9_-]{43}$"
},
"access_token": {
"description": "Capability secret returned when the item was created without an account.",
"type": "string",
"minLength": 16,
"maxLength": 200
},
"idempotency_key": {
"description": "Same key + same request = same answer. Required for agents.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"pass": {
"description": "The person's passes (sdpass1_โฆ), space-separated, at most 8: presented to the network that issued each, so the business recognises the customer. Or send them in the Sdi-Pass header. Never stored.",
"type": "string",
"maxLength": 1608
},
"key": {
"description": "The person's key (sdkey1_โฆ), if that is all you have: it is exchanged once for a pass, which comes back in identity.passes โ keep the pass and send it next time instead. Never stored.",
"type": "string",
"maxLength": 200
}
},
"required": [
"item_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}๐ดdecline_offer(item_id, reason, access_token, idempotency_key, pass, ...)
Say no to another time the business proposed (the booking request is closed) or to its quote. Add reason for anything your person wants the business to know.
Input Schema
{
"type": "object",
"properties": {
"item_id": {
"type": "string",
"minLength": 1
},
"reason": {
"description": "Anything your person wants the business to know.",
"type": "string",
"maxLength": 2000
},
"access_token": {
"description": "Capability secret returned when the item was created without an account.",
"type": "string",
"minLength": 16,
"maxLength": 200
},
"idempotency_key": {
"description": "Same key + same request = same answer. Required for agents.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"pass": {
"description": "The person's passes (sdpass1_โฆ), space-separated, at most 8: presented to the network that issued each, so the business recognises the customer. Or send them in the Sdi-Pass header. Never stored.",
"type": "string",
"maxLength": 1608
},
"key": {
"description": "The person's key (sdkey1_โฆ), if that is all you have: it is exchanged once for a pass, which comes back in identity.passes โ keep the pass and send it next time instead. Never stored.",
"type": "string",
"maxLength": 200
}
},
"required": [
"item_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}๐ขsuggest_time(item_id, start_time, note, access_token, idempotency_key, ...)
Instead of the time the business proposed, ask for another: start_time must be one of the free times check_availability lists (the end follows the service's length). The business confirms it or proposes again.
Input Schema
{
"type": "object",
"properties": {
"item_id": {
"type": "string",
"minLength": 1
},
"start_time": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"description": "The start your person would like instead: one of the free times check_availability lists. The end follows the service's length."
},
"note": {
"type": "string",
"maxLength": 2000
},
"access_token": {
"description": "Capability secret returned when the item was created without an account.",
"type": "string",
"minLength": 16,
"maxLength": 200
},
"idempotency_key": {
"description": "Same key + same request = same answer. Required for agents.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"pass": {
"description": "The person's passes (sdpass1_โฆ), space-separated, at most 8: presented to the network that issued each, so the business recognises the customer. Or send them in the Sdi-Pass header. Never stored.",
"type": "string",
"maxLength": 1608
},
"key": {
"description": "The person's key (sdkey1_โฆ), if that is all you have: it is exchanged once for a pass, which comes back in identity.passes โ keep the pass and send it next time instead. Never stored.",
"type": "string",
"maxLength": 200
}
},
"required": [
"item_id",
"start_time"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}โชprovide_details(item_id, details, access_token, idempotency_key, pass, ...)
Answer what the business asked about an item (get_item_status says it needs a detail). The item moves on; on any other item your details are kept as a message for the business.
Input Schema
{
"type": "object",
"properties": {
"item_id": {
"type": "string",
"minLength": 1
},
"details": {
"type": "string",
"minLength": 1,
"maxLength": 5000,
"description": "The answer to what the business asked."
},
"access_token": {
"description": "Capability secret returned when the item was created without an account.",
"type": "string",
"minLength": 16,
"maxLength": 200
},
"idempotency_key": {
"description": "Same key + same request = same answer. Required for agents.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"pass": {
"description": "The person's passes (sdpass1_โฆ), space-separated, at most 8: presented to the network that issued each, so the business recognises the customer. Or send them in the Sdi-Pass header. Never stored.",
"type": "string",
"maxLength": 1608
},
"key": {
"description": "The person's key (sdkey1_โฆ), if that is all you have: it is exchanged once for a pass, which comes back in identity.passes โ keep the pass and send it next time instead. Never stored.",
"type": "string",
"maxLength": 200
}
},
"required": [
"item_id",
"details"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}๐ดcancel_item(item_id, reason, access_token, idempotency_key, pass, ...)
Cancel an item you created. After the business's cancellation window, a confirmed booking is cancelled late where the business records late cancellations (it may count against the customer), and refused where it does not.
Input Schema
{
"type": "object",
"properties": {
"item_id": {
"type": "string",
"minLength": 1
},
"reason": {
"type": "string",
"maxLength": 2000
},
"access_token": {
"description": "Capability secret returned when the item was created without an account.",
"type": "string",
"minLength": 16,
"maxLength": 200
},
"idempotency_key": {
"description": "Same key + same request = same answer. Required for agents.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"pass": {
"description": "The person's passes (sdpass1_โฆ), space-separated, at most 8: presented to the network that issued each, so the business recognises the customer. Or send them in the Sdi-Pass header. Never stored.",
"type": "string",
"maxLength": 1608
},
"key": {
"description": "The person's key (sdkey1_โฆ), if that is all you have: it is exchanged once for a pass, which comes back in identity.passes โ keep the pass and send it next time instead. Never stored.",
"type": "string",
"maxLength": 200
}
},
"required": [
"item_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}๐กsend_message(item_id, subject, body, contact, message_id, ...)
Start a conversation, or reply on an item you own.
Input Schema
{
"type": "object",
"properties": {
"item_id": {
"description": "Reply on an existing item; omit to start a new conversation.",
"type": "string",
"minLength": 1
},
"subject": {
"type": "string",
"maxLength": 500
},
"body": {
"type": "string",
"minLength": 1,
"maxLength": 20000
},
"contact": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 200
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"phone": {
"type": "string",
"maxLength": 40
},
"locale": {
"type": "string",
"maxLength": 12
}
}
},
"message_id": {
"type": "string",
"minLength": 1,
"maxLength": 998
},
"access_token": {
"description": "Capability secret returned when the item was created without an account.",
"type": "string",
"minLength": 16,
"maxLength": 200
},
"idempotency_key": {
"description": "Same key + same request = same answer. Required for agents.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"pass": {
"description": "The person's passes (sdpass1_โฆ), space-separated, at most 8: presented to the network that issued each, so the business recognises the customer. Or send them in the Sdi-Pass header. Never stored.",
"type": "string",
"maxLength": 1608
},
"key": {
"description": "The person's key (sdkey1_โฆ), if that is all you have: it is exchanged once for a pass, which comes back in identity.passes โ keep the pass and send it next time instead. Never stored.",
"type": "string",
"maxLength": 200
}
},
"required": [
"body"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}๐กacknowledge_receipt(item_id, counter_signature, receipt_id, receipt, access_token, ...)
Counter-sign a receipt this item earned, so both sides hold it. Read the item to find its receipts; then send a compact JWS signed with your own Ed25519 key โ header {alg:'EdDSA', typ:'sdi-receipt-ack+jws', jwk:<your public jwk>}, payload {rcp:<receipt id>, sha:<base64url(SHA-256(receipt jws))>, iat:<unix seconds>}. The instance verifies it against the key you carry and keeps it. Acknowledging twice is harmless.
Input Schema
{
"type": "object",
"properties": {
"item_id": {
"type": "string",
"minLength": 1
},
"counter_signature": {
"description": "A compact JWS by the customer's agent, EdDSA, header carrying its Ed25519 public `jwk`, payload `{\"rcp\": \"<receipt id>\", \"sha\": \"<base64url(SHA-256(receipt JWS))>\", \"iat\": <unix seconds>}`. Or, for an agent that signs its requests instead (sdi-agent/1) and carries a pass reference, `receipt_id` alone.",
"type": "string",
"minLength": 1,
"maxLength": 8192
},
"receipt_id": {
"description": "The receipt to acknowledge, for an agent that signs this request (sdi-agent/1) with a key delegated to the pass reference it sends: the inbox forwards the signature to the network (ADR-017 ยง3.4). Send this or counter_signature.",
"type": "string",
"minLength": 1,
"maxLength": 64
},
"receipt": {
"description": "The receipt JWS being acknowledged, if you want the instance to check it is the one it holds.",
"type": "string",
"minLength": 1,
"maxLength": 8192
},
"access_token": {
"description": "Capability secret returned when the item was created without an account.",
"type": "string",
"minLength": 16,
"maxLength": 200
},
"pass": {
"description": "The person's passes (sdpass1_โฆ), space-separated, at most 8: presented to the network that issued each, so the business recognises the customer. Or send them in the Sdi-Pass header. Never stored.",
"type": "string",
"maxLength": 1608
},
"key": {
"description": "The person's key (sdkey1_โฆ), if that is all you have: it is exchanged once for a pass, which comes back in identity.passes โ keep the pass and send it next time instead. Never stored.",
"type": "string",
"maxLength": 200
}
},
"required": [
"item_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}โชverify_customer(item_id, access_token, code)
When a result says identity.recognised is weak, the person gave the email of a customer the business knows. Call this with item_id and access_token to email them six digits; ask the person for the code and call it again with code. Then the business recognises them.
Input Schema
{
"type": "object",
"properties": {
"item_id": {
"type": "string",
"minLength": 1
},
"access_token": {
"description": "Capability secret returned when the item was created without an account.",
"type": "string",
"minLength": 16,
"maxLength": 200
},
"code": {
"description": "The six digits the customer received. Omit to have them sent.",
"type": "string",
"pattern": "^[0-9]{6}$"
}
},
"required": [
"item_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence