Signed API declarations for agent handoffs. Free demo and verification; receipts cost 0.002 USDC.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Return issuer public keys. Establish issuer trust independently before offline verification.
This tool takes no arguments.
Return issuer public keys. Establish issuer trust independently before offline verification.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"additionalProperties": false
}Buy a portable signed commitment to a declared API exchange when a recipient needs independently verifiable receipt integrity: response handoff, archived decision input, or change investigation. Costs 0.002 USDC per receipt via x402 when enabled; verification is free. A local log may suffice for disposable data. Requires caller-approved budget. Keep event, idempotency key and original payment unchanged on retry. Attests a client declaration, not provider origin, content truth or independent observation.
| Argument | Type | Description |
|---|---|---|
| event* | object | Commitment-only HTTP exchange declaration built locally with the SDK. No raw URLs, headers or bodies. |
| idempotencyKey* | string | One stable key per purchase, saved before payment. Keep it, the event and original payment authorization unchanged on retries. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"event",
"idempotencyKey"
],
"properties": {
"event": {
"type": "object",
"required": [
"version",
"attestation",
"apiId",
"exchangeId",
"method",
"status",
"startedAt",
"completedAt",
"targetHash",
"requestBodyHash",
"responseBodyHash",
"requestHeadersHash",
"responseHeadersHash",
"bodyEncoding",
"headerEncoding"
],
"properties": {
"apiId": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$",
"description": "Caller-chosen API identifier; not a certified provider identity."
},
"method": {
"enum": [
"GET",
"HEAD",
"POST",
"PUT",
"PATCH",
"DELETE",
"OPTIONS"
],
"type": "string",
"description": "Actual HTTP method of the locally captured exchange, for example GET."
},
"status": {
"type": "integer",
"maximum": 599,
"minimum": 200,
"description": "Actual HTTP response status, including error responses; for example 200 or 404."
},
"version": {
"type": "string",
"const": "datoka.api.exchange.v1",
"description": "Declaration format version; preserve this literal."
},
"startedAt": {
"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{3}(?:Z))$",
"description": "Declared UTC start with milliseconds, for example 2026-10-07T08:00:00.000Z."
},
"exchangeId": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$",
"description": "Stable identifier for one declared HTTP exchange."
},
"targetHash": {
"type": "object",
"required": [
"algorithm",
"digest"
],
"properties": {
"digest": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"description": "SHA-256 of exact locally captured bytes, encoded as 64 lowercase hexadecimal characters."
},
"algorithm": {
"type": "string",
"const": "sha256",
"description": "Digest algorithm; always sha256."
}
},
"description": "SHA-256 of the exact UTF-8 target URL, computed locally. Never invent a digest or send the URL itself.",
"additionalProperties": false
},
"attestation": {
"type": "string",
"const": "client_declared",
"description": "The caller declares the exchange; Datoka does not independently observe it."
},
"completedAt": {
"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{3}(?:Z))$",
"description": "Declared UTC completion with milliseconds; must be at or after startedAt."
},
"bodyEncoding": {
"type": "string",
"const": "application_bytes",
"description": "Hash application bytes after HTTP decoding, without JSON reserialization."
},
"headerEncoding": {
"type": "string",
"const": "jcs-selected-headers-v1",
"description": "Use the SDK header selection and JCS canonicalization before hashing."
},
"requestBodyHash": {
"anyOf": [
{
"type": "object",
"required": [
"algorithm",
"digest"
],
"properties": {
"digest": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"description": "SHA-256 of exact locally captured bytes, encoded as 64 lowercase hexadecimal characters."
},
"algorithm": {
"type": "string",
"const": "sha256",
"description": "Digest algorithm; always sha256."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "SHA-256 of exact application request bytes; null means no body, not an empty body."
},
"responseBodyHash": {
"anyOf": [
{
"type": "object",
"required": [
"algorithm",
"digest"
],
"properties": {
"digest": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"description": "SHA-256 of exact locally captured bytes, encoded as 64 lowercase hexadecimal characters."
},
"algorithm": {
"type": "string",
"const": "sha256",
"description": "Digest algorithm; always sha256."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "SHA-256 of exact application response bytes after HTTP decoding. Preserve those bytes; do not reserialize JSON."
},
"requestHeadersHash": {
"type": "object",
"required": [
"algorithm",
"digest"
],
"properties": {
"digest": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"description": "SHA-256 of exact locally captured bytes, encoded as 64 lowercase hexadecimal characters."
},
"algorithm": {
"type": "string",
"const": "sha256",
"description": "Digest algorithm; always sha256."
}
},
"description": "SHA-256 of locally canonicalized selected request headers. Never send raw headers.",
"additionalProperties": false
},
"responseHeadersHash": {
"type": "object",
"required": [
"algorithm",
"digest"
],
"properties": {
"digest": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"description": "SHA-256 of exact locally captured bytes, encoded as 64 lowercase hexadecimal characters."
},
"algorithm": {
"type": "string",
"const": "sha256",
"description": "Digest algorithm; always sha256."
}
},
"description": "SHA-256 of locally canonicalized selected response headers.",
"additionalProperties": false
}
},
"description": "Commitment-only HTTP exchange declaration built locally with the SDK. No raw URLs, headers or bodies.",
"additionalProperties": false
},
"idempotencyKey": {
"type": "string",
"pattern": "^[\\x21-\\x7e]{16,200}$",
"description": "One stable key per purchase, saved before payment. Keep it, the event and original payment authorization unchanged on retries."
}
},
"additionalProperties": false
}Free validation before buying a receipt. Supply an event built locally with the SDK from real captured bytes; never fabricate hashes. Returns the commitment without issuing a receipt or paying. Use when retaining verifiable evidence of an API response for a handoff or archive.
| Argument | Type | Description |
|---|---|---|
| event* | object | Commitment-only HTTP exchange declaration built locally with the SDK. No raw URLs, headers or bodies. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"event"
],
"properties": {
"event": {
"type": "object",
"required": [
"version",
"attestation",
"apiId",
"exchangeId",
"method",
"status",
"startedAt",
"completedAt",
"targetHash",
"requestBodyHash",
"responseBodyHash",
"requestHeadersHash",
"responseHeadersHash",
"bodyEncoding",
"headerEncoding"
],
"properties": {
"apiId": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$",
"description": "Caller-chosen API identifier; not a certified provider identity."
},
"method": {
"enum": [
"GET",
"HEAD",
"POST",
"PUT",
"PATCH",
"DELETE",
"OPTIONS"
],
"type": "string",
"description": "Actual HTTP method of the locally captured exchange, for example GET."
},
"status": {
"type": "integer",
"maximum": 599,
"minimum": 200,
"description": "Actual HTTP response status, including error responses; for example 200 or 404."
},
"version": {
"type": "string",
"const": "datoka.api.exchange.v1",
"description": "Declaration format version; preserve this literal."
},
"startedAt": {
"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{3}(?:Z))$",
"description": "Declared UTC start with milliseconds, for example 2026-10-07T08:00:00.000Z."
},
"exchangeId": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$",
"description": "Stable identifier for one declared HTTP exchange."
},
"targetHash": {
"type": "object",
"required": [
"algorithm",
"digest"
],
"properties": {
"digest": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"description": "SHA-256 of exact locally captured bytes, encoded as 64 lowercase hexadecimal characters."
},
"algorithm": {
"type": "string",
"const": "sha256",
"description": "Digest algorithm; always sha256."
}
},
"description": "SHA-256 of the exact UTF-8 target URL, computed locally. Never invent a digest or send the URL itself.",
"additionalProperties": false
},
"attestation": {
"type": "string",
"const": "client_declared",
"description": "The caller declares the exchange; Datoka does not independently observe it."
},
"completedAt": {
"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{3}(?:Z))$",
"description": "Declared UTC completion with milliseconds; must be at or after startedAt."
},
"bodyEncoding": {
"type": "string",
"const": "application_bytes",
"description": "Hash application bytes after HTTP decoding, without JSON reserialization."
},
"headerEncoding": {
"type": "string",
"const": "jcs-selected-headers-v1",
"description": "Use the SDK header selection and JCS canonicalization before hashing."
},
"requestBodyHash": {
"anyOf": [
{
"type": "object",
"required": [
"algorithm",
"digest"
],
"properties": {
"digest": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"description": "SHA-256 of exact locally captured bytes, encoded as 64 lowercase hexadecimal characters."
},
"algorithm": {
"type": "string",
"const": "sha256",
"description": "Digest algorithm; always sha256."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "SHA-256 of exact application request bytes; null means no body, not an empty body."
},
"responseBodyHash": {
"anyOf": [
{
"type": "object",
"required": [
"algorithm",
"digest"
],
"properties": {
"digest": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"description": "SHA-256 of exact locally captured bytes, encoded as 64 lowercase hexadecimal characters."
},
"algorithm": {
"type": "string",
"const": "sha256",
"description": "Digest algorithm; always sha256."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "SHA-256 of exact application response bytes after HTTP decoding. Preserve those bytes; do not reserialize JSON."
},
"requestHeadersHash": {
"type": "object",
"required": [
"algorithm",
"digest"
],
"properties": {
"digest": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"description": "SHA-256 of exact locally captured bytes, encoded as 64 lowercase hexadecimal characters."
},
"algorithm": {
"type": "string",
"const": "sha256",
"description": "Digest algorithm; always sha256."
}
},
"description": "SHA-256 of locally canonicalized selected request headers. Never send raw headers.",
"additionalProperties": false
},
"responseHeadersHash": {
"type": "object",
"required": [
"algorithm",
"digest"
],
"properties": {
"digest": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"description": "SHA-256 of exact locally captured bytes, encoded as 64 lowercase hexadecimal characters."
},
"algorithm": {
"type": "string",
"const": "sha256",
"description": "Digest algorithm; always sha256."
}
},
"description": "SHA-256 of locally canonicalized selected response headers.",
"additionalProperties": false
}
},
"description": "Commitment-only HTTP exchange declaration built locally with the SDK. No raw URLs, headers or bodies.",
"additionalProperties": false
}
},
"additionalProperties": false
}Free signature and declaration verification. To try before buying, read datoka-api://demo-receipt or /demo/receipt.json and pass the returned JSON here. No wallet needed for public verification. Verifies issuer, scope and event commitment; compare original response bytes locally with the SDK or /verify/.
| Argument | Type | Description |
|---|---|---|
| event* | object | Commitment-only HTTP exchange declaration built locally with the SDK. No raw URLs, headers or bodies. |
| receipt* | object | Unmodified signed receipt returned by issuance or the public synthetic demo; verify against trusted issuer keys. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"event",
"receipt"
],
"properties": {
"event": {
"type": "object",
"required": [
"version",
"attestation",
"apiId",
"exchangeId",
"method",
"status",
"startedAt",
"completedAt",
"targetHash",
"requestBodyHash",
"responseBodyHash",
"requestHeadersHash",
"responseHeadersHash",
"bodyEncoding",
"headerEncoding"
],
"properties": {
"apiId": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$",
"description": "Caller-chosen API identifier; not a certified provider identity."
},
"method": {
"enum": [
"GET",
"HEAD",
"POST",
"PUT",
"PATCH",
"DELETE",
"OPTIONS"
],
"type": "string",
"description": "Actual HTTP method of the locally captured exchange, for example GET."
},
"status": {
"type": "integer",
"maximum": 599,
"minimum": 200,
"description": "Actual HTTP response status, including error responses; for example 200 or 404."
},
"version": {
"type": "string",
"const": "datoka.api.exchange.v1",
"description": "Declaration format version; preserve this literal."
},
"startedAt": {
"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{3}(?:Z))$",
"description": "Declared UTC start with milliseconds, for example 2026-10-07T08:00:00.000Z."
},
"exchangeId": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$",
"description": "Stable identifier for one declared HTTP exchange."
},
"targetHash": {
"type": "object",
"required": [
"algorithm",
"digest"
],
"properties": {
"digest": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"description": "SHA-256 of exact locally captured bytes, encoded as 64 lowercase hexadecimal characters."
},
"algorithm": {
"type": "string",
"const": "sha256",
"description": "Digest algorithm; always sha256."
}
},
"description": "SHA-256 of the exact UTF-8 target URL, computed locally. Never invent a digest or send the URL itself.",
"additionalProperties": false
},
"attestation": {
"type": "string",
"const": "client_declared",
"description": "The caller declares the exchange; Datoka does not independently observe it."
},
"completedAt": {
"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{3}(?:Z))$",
"description": "Declared UTC completion with milliseconds; must be at or after startedAt."
},
"bodyEncoding": {
"type": "string",
"const": "application_bytes",
"description": "Hash application bytes after HTTP decoding, without JSON reserialization."
},
"headerEncoding": {
"type": "string",
"const": "jcs-selected-headers-v1",
"description": "Use the SDK header selection and JCS canonicalization before hashing."
},
"requestBodyHash": {
"anyOf": [
{
"type": "object",
"required": [
"algorithm",
"digest"
],
"properties": {
"digest": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"description": "SHA-256 of exact locally captured bytes, encoded as 64 lowercase hexadecimal characters."
},
"algorithm": {
"type": "string",
"const": "sha256",
"description": "Digest algorithm; always sha256."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "SHA-256 of exact application request bytes; null means no body, not an empty body."
},
"responseBodyHash": {
"anyOf": [
{
"type": "object",
"required": [
"algorithm",
"digest"
],
"properties": {
"digest": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"description": "SHA-256 of exact locally captured bytes, encoded as 64 lowercase hexadecimal characters."
},
"algorithm": {
"type": "string",
"const": "sha256",
"description": "Digest algorithm; always sha256."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "SHA-256 of exact application response bytes after HTTP decoding. Preserve those bytes; do not reserialize JSON."
},
"requestHeadersHash": {
"type": "object",
"required": [
"algorithm",
"digest"
],
"properties": {
"digest": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"description": "SHA-256 of exact locally captured bytes, encoded as 64 lowercase hexadecimal characters."
},
"algorithm": {
"type": "string",
"const": "sha256",
"description": "Digest algorithm; always sha256."
}
},
"description": "SHA-256 of locally canonicalized selected request headers. Never send raw headers.",
"additionalProperties": false
},
"responseHeadersHash": {
"type": "object",
"required": [
"algorithm",
"digest"
],
"properties": {
"digest": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"description": "SHA-256 of exact locally captured bytes, encoded as 64 lowercase hexadecimal characters."
},
"algorithm": {
"type": "string",
"const": "sha256",
"description": "Digest algorithm; always sha256."
}
},
"description": "SHA-256 of locally canonicalized selected response headers.",
"additionalProperties": false
}
},
"description": "Commitment-only HTTP exchange declaration built locally with the SDK. No raw URLs, headers or bodies.",
"additionalProperties": false
},
"receipt": {
"type": "object",
"required": [
"body",
"algorithm",
"signature"
],
"properties": {
"body": {
"type": "object",
"required": [
"version",
"id",
"issuer",
"keyId",
"issuedAt",
"request",
"sequence",
"previous"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"keyId": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
},
"issuer": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
},
"request": {
"type": "object",
"required": [
"scope",
"chain",
"eventType",
"subject"
],
"properties": {
"chain": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
},
"scope": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
},
"subject": {
"type": "object",
"required": [
"algorithm",
"encoding",
"digest"
],
"properties": {
"digest": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"encoding": {
"enum": [
"jcs",
"bytes"
],
"type": "string"
},
"algorithm": {
"type": "string",
"const": "sha256"
}
},
"additionalProperties": false
},
"eventType": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
}
},
"additionalProperties": false
},
"version": {
"type": "string",
"const": "datoka.receipt.v1"
},
"issuedAt": {
"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{3}(?:Z))$"
},
"previous": {
"anyOf": [
{
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
{
"type": "null"
}
]
},
"sequence": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
}
},
"additionalProperties": false
},
"algorithm": {
"type": "string",
"const": "Ed25519"
},
"signature": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{86}$"
}
},
"description": "Unmodified signed receipt returned by issuance or the public synthetic demo; verify against trusted issuer keys.",
"additionalProperties": false
}
},
"additionalProperties": false
}