Skip to content

Verify a receipt's hash and signature (helper; verification also works offline with the JWKS)

POST
/v1/receipts/verify
curl --request POST \
--url https://api.trustysweep.com/v1/receipts/verify \
--header 'Content-Type: application/json' \
--data '{ "receiptVersion": "1", "receiptId": "rcp_01J8Z3K9M2Q4R6S8T0V2W4X6Y8", "executionId": "exe_01J8Z3K9M2Q4R6S8T0V2W4X6Y8", "planId": "pln_01J8Z3K9M2Q4R6S8T0V2W4X6Y8", "planHash": "example", "tenantRef": "example", "actor": { "type": "user", "principalId": "example", "delegatingUserId": "example", "applicationId": "example", "agentId": "example", "grantId": "example" }, "delegatingUserId": "example", "authorization": { "actionDecisionId": "example", "grantId": "example", "commercialAuthorizationId": "example", "policyVersion": "example", "rateCardVersion": "example" }, "intent": "example", "simulated": true, "attempted": 1, "completed": 1, "failed": 1, "objects": [ { "assetId": "example", "providerObjectId": "example", "actions": [ "example" ], "status": "completed", "vaultObjectId": "example", "vaultSha256": "example", "providerResultId": "example", "bytes": 1, "error": "example", "restorable": true } ], "before": [ { "sourceId": "example", "provider": "google_gmail", "usedBytes": 1, "limitBytes": 1, "observedAt": "2026-04-15T12:00:00Z" } ], "after": [ { "sourceId": "example", "provider": "google_gmail", "usedBytes": 1, "limitBytes": 1, "observedAt": "2026-04-15T12:00:00Z" } ], "bytesPreserved": 1, "bytesRemoved": 1, "bytesTransferred": 1, "measuredReclaimBytes": 1, "charges": [ { "meter": "example", "quantity": 1, "unit": "example", "cents": 1, "usageEventId": "example" } ], "startedAt": "2026-04-15T12:00:00Z", "finishedAt": "2026-04-15T12:00:00Z", "restoration": { "capable": true, "until": "2026-04-15T12:00:00Z", "method": "example" }, "errors": [ "example" ], "hash": "example", "signature": { "alg": "Ed25519", "kid": "example", "sig": "example" } }'
Media typeapplication/json

Durable, tamper-evident execution receipt signed with the platform Ed25519 key published at /.well-known/sweep-receipts.json.

object
receiptVersion
required
string
Allowed values: 1
receiptId
required

Prefixed ULID (rcp_…)

string
/^rcp_[0-9A-HJKMNP-TV-Z]{26}$/
executionId
required

Prefixed ULID (exe_…)

string
/^exe_[0-9A-HJKMNP-TV-Z]{26}$/
planId
required

Prefixed ULID (pln_…)

string
/^pln_[0-9A-HJKMNP-TV-Z]{26}$/
planHash
required
string
tenantRef
required
string
actor
required
object
type
required
string
Allowed values: user sweep_automation developer_application external_agent service connector
principalId
required
string
delegatingUserId
One of:
string
applicationId
One of:
string
agentId
One of:
string
grantId
One of:
string
delegatingUserId
One of:
string
authorization
required
object
actionDecisionId
required
string
grantId
One of:
string
commercialAuthorizationId
One of:
string
policyVersion
required
string
rateCardVersion
One of:
string
intent
required
string
simulated
required
boolean
attempted
required
integer
completed
required
integer
failed
required
integer
objects
required
Array<object>
object
assetId
required
string
providerObjectId
required
string
actions
required
Array<string>
status
required
string
Allowed values: completed partial failed skipped
vaultObjectId
One of:
string
vaultSha256
One of:
string
providerResultId
One of:
string
bytes
integer
error
One of:
string
restorable
boolean
before
required
Array<object>
object
sourceId
required
string
provider
required
string
Allowed values: google_gmail google_drive microsoft_outlook microsoft_onedrive dropbox apple_local s3_compatible trusty_vault simulated
usedBytes
One of:
integer
limitBytes
One of:
integer
observedAt
required
string format: date-time
after
required
Array<object>
object
sourceId
required
string
provider
required
string
Allowed values: google_gmail google_drive microsoft_outlook microsoft_onedrive dropbox apple_local s3_compatible trusty_vault simulated
usedBytes
One of:
integer
limitBytes
One of:
integer
observedAt
required
string format: date-time
bytesPreserved
required
integer
bytesRemoved
required
integer
bytesTransferred
required
integer
measuredReclaimBytes
One of:
integer
charges
required
Array<object>
object
meter
required
string
quantity
required
number
unit
required
string
cents
required
integer
usageEventId
required
string
startedAt
required
string format: date-time
finishedAt
required
string format: date-time
restoration
required
object
capable
required
boolean
until
One of:
string format: date-time
method
One of:
string
errors
Array<string>
hash

Sha256 of canonical JSON of the receipt without hash/signature

string
signature
object
alg
required
string
Allowed values: Ed25519
kid
required
string
sig
required

Base64url Ed25519 signature over hash

string

OK

Media typeapplication/json
object
valid
required
boolean
reason
One of:
string
Allowed values: unsigned hash_mismatch unknown_kid bad_signature
kid
One of:
string
Example
{
"reason": "unsigned"
}
RateLimit-Limit
integer

Requests allowed in the current window.

RateLimit-Remaining
integer

Requests remaining in the current window.

RateLimit-Reset
integer

Seconds until the window resets.

Validation failed

Media typeapplication/problem+json

RFC 9457 problem details.

object
type
required
title
required
string
status
required
integer
detail
string
code
required

Machine-readable error code from errors.json

string
request_id
required
string
errors
Array<object>
object
path
required
string
message
required
string
Examplegenerated
{
"type": "https://example.com",
"title": "example",
"status": 1,
"detail": "example",
"code": "example",
"request_id": "example",
"errors": [
{
"path": "example",
"message": "example"
}
]
}

Unauthenticated

Media typeapplication/problem+json

RFC 9457 problem details.

object
type
required
title
required
string
status
required
integer
detail
string
code
required

Machine-readable error code from errors.json

string
request_id
required
string
errors
Array<object>
object
path
required
string
message
required
string
Examplegenerated
{
"type": "https://example.com",
"title": "example",
"status": 1,
"detail": "example",
"code": "example",
"request_id": "example",
"errors": [
{
"path": "example",
"message": "example"
}
]
}

Forbidden / action denied / step-up required

Media typeapplication/problem+json

RFC 9457 problem details.

object
type
required
title
required
string
status
required
integer
detail
string
code
required

Machine-readable error code from errors.json

string
request_id
required
string
errors
Array<object>
object
path
required
string
message
required
string
Examplegenerated
{
"type": "https://example.com",
"title": "example",
"status": 1,
"detail": "example",
"code": "example",
"request_id": "example",
"errors": [
{
"path": "example",
"message": "example"
}
]
}

Not found

Media typeapplication/problem+json

RFC 9457 problem details.

object
type
required
title
required
string
status
required
integer
detail
string
code
required

Machine-readable error code from errors.json

string
request_id
required
string
errors
Array<object>
object
path
required
string
message
required
string
Examplegenerated
{
"type": "https://example.com",
"title": "example",
"status": 1,
"detail": "example",
"code": "example",
"request_id": "example",
"errors": [
{
"path": "example",
"message": "example"
}
]
}

Rate limited

Media typeapplication/problem+json

RFC 9457 problem details.

object
type
required
title
required
string
status
required
integer
detail
string
code
required

Machine-readable error code from errors.json

string
request_id
required
string
errors
Array<object>
object
path
required
string
message
required
string
Examplegenerated
{
"type": "https://example.com",
"title": "example",
"status": 1,
"detail": "example",
"code": "example",
"request_id": "example",
"errors": [
{
"path": "example",
"message": "example"
}
]
}
Retry-After
integer

Seconds to wait before retrying.

RateLimit-Limit
integer

Requests allowed in the current window.

RateLimit-Remaining
integer

Requests remaining in the current window.

RateLimit-Reset
integer

Seconds until the window resets.

Internal error

Media typeapplication/problem+json

RFC 9457 problem details.

object
type
required
title
required
string
status
required
integer
detail
string
code
required

Machine-readable error code from errors.json

string
request_id
required
string
errors
Array<object>
object
path
required
string
message
required
string
Examplegenerated
{
"type": "https://example.com",
"title": "example",
"status": 1,
"detail": "example",
"code": "example",
"request_id": "example",
"errors": [
{
"path": "example",
"message": "example"
}
]
}