curl "https://win.oneshotagent.com/v1/analytics/receipts?period=7&category=communication" \
-H "X-Agent-ID: 0xYourWalletAddress"
{
"receipts": [
{
"receipt_id": "rcpt_01HGW2HB4V4T0PZGJ8PFDRCHQM",
"agent_id": "23e2aef0-6fcb-4cc0-99aa-b82b0dd0de16",
"soul_agent_id": null,
"category": "communication",
"subcategory": "email",
"amount_usdc": "0.150000",
"service_fee": "0.030000",
"status": "settled",
"execution_status": "completed",
"goal_id": null,
"revision": 1,
"signature": "<base64url Ed25519 signature>",
"digest": "<SHA-256 hex digest of canonical receipt>",
"key_id": "receipt-key-1",
"alg": "Ed25519",
"settlement_tx": "0x1a2b3c...",
"memo": "Following up on demo request from yesterday's webinar",
"decisionContext": {
"goal": "Convert webinar leads to discovery calls",
"confidence": 0.78,
"campaign": "webinar-q2"
},
"value_tag": null,
"job_id": "0cbb87ee-1f2a-4c3d-9e8b-7a6f5d4c3b2a",
"created_at": "2026-03-09T14:30:00Z",
"settled_at": "2026-03-09T14:30:01Z"
}
],
"count": 1,
"has_more": false
}
Receipts & Analytics
List Receipts
List receipts with filters by period, category, and pagination
GET
/
v1
/
analytics
/
receipts
curl "https://win.oneshotagent.com/v1/analytics/receipts?period=7&category=communication" \
-H "X-Agent-ID: 0xYourWalletAddress"
{
"receipts": [
{
"receipt_id": "rcpt_01HGW2HB4V4T0PZGJ8PFDRCHQM",
"agent_id": "23e2aef0-6fcb-4cc0-99aa-b82b0dd0de16",
"soul_agent_id": null,
"category": "communication",
"subcategory": "email",
"amount_usdc": "0.150000",
"service_fee": "0.030000",
"status": "settled",
"execution_status": "completed",
"goal_id": null,
"revision": 1,
"signature": "<base64url Ed25519 signature>",
"digest": "<SHA-256 hex digest of canonical receipt>",
"key_id": "receipt-key-1",
"alg": "Ed25519",
"settlement_tx": "0x1a2b3c...",
"memo": "Following up on demo request from yesterday's webinar",
"decisionContext": {
"goal": "Convert webinar leads to discovery calls",
"confidence": 0.78,
"campaign": "webinar-q2"
},
"value_tag": null,
"job_id": "0cbb87ee-1f2a-4c3d-9e8b-7a6f5d4c3b2a",
"created_at": "2026-03-09T14:30:00Z",
"settled_at": "2026-03-09T14:30:01Z"
}
],
"count": 1,
"has_more": false
}
Lists the calling agent’s receipts, paginated. Free; requires only
X-Agent-ID.
Query Parameters
number
default:"all"
Last N days (1 to 365). Omit for all receipts.
string
One of
data, verification, communication, commerce, infrastructure, agent_to_agent. The overview maps tools to categories.number
default:"50"
Results per page. Maximum 100; larger values are clamped to 100.
number
default:"0"
Pagination offset
string
Inclusive lower bound on
created_at (ISO 8601, e.g. 2026-05-01T00:00:00Z). With until, pages through a fixed window, which reaches receipts older than the 100-row cap when you tag value weeks later.string
Inclusive upper bound on
created_at (ISO 8601).curl "https://win.oneshotagent.com/v1/analytics/receipts?period=7&category=communication" \
-H "X-Agent-ID: 0xYourWalletAddress"
{
"receipts": [
{
"receipt_id": "rcpt_01HGW2HB4V4T0PZGJ8PFDRCHQM",
"agent_id": "23e2aef0-6fcb-4cc0-99aa-b82b0dd0de16",
"soul_agent_id": null,
"category": "communication",
"subcategory": "email",
"amount_usdc": "0.150000",
"service_fee": "0.030000",
"status": "settled",
"execution_status": "completed",
"goal_id": null,
"revision": 1,
"signature": "<base64url Ed25519 signature>",
"digest": "<SHA-256 hex digest of canonical receipt>",
"key_id": "receipt-key-1",
"alg": "Ed25519",
"settlement_tx": "0x1a2b3c...",
"memo": "Following up on demo request from yesterday's webinar",
"decisionContext": {
"goal": "Convert webinar leads to discovery calls",
"confidence": 0.78,
"campaign": "webinar-q2"
},
"value_tag": null,
"job_id": "0cbb87ee-1f2a-4c3d-9e8b-7a6f5d4c3b2a",
"created_at": "2026-03-09T14:30:00Z",
"settled_at": "2026-03-09T14:30:01Z"
}
],
"count": 1,
"has_more": false
}
Signature
The signature coversmemo and decisionContext along with amounts and statuses. The signed payload is the receipt’s public fields plus revision and a SHA-256 digest of metadata. The private provider cost is never signed. The signature and digest in the example are placeholders. revision starts at 1 and increments on every re-sign (status change, settlement, refund, reconciliation), so two signed copies of a receipt can be ordered from the signed bytes alone. The payload has no version field: the SDK’s canonicalizeReceipt defines the format, and verifyReceipt / oneshot-verify-receipt recompute it from exactly the fields this endpoint returns.
Audit fields
Each receipt carries the audit metadata the caller attached, plus thejob_id that links it back to the call:
string | null
The job that produced this receipt. Equals the
request_id returned by the originating tool call (result.request_id). job_id is not unique across receipts: one job can produce several (typically the email worker loop, which writes one receipt per message sent). The PATCH Tag Receipt Value request resolves a request_id or job_id to the most recently created receipt for that job. This GET endpoint only lists receipts and doesn’t accept those lookup parameters. To target a specific receipt, store its rcpt_… id. The caller’s memo / decisionContext are also copied into the receipt and can serve as match keys.job_id is a correlation handle, not an idempotency key, and does not deduplicate calls. Idempotency uses a separate client-supplied Idempotency-Key header. Where an endpoint applies it, the same key with a different body is rejected with 422. Replay and conflict checks don’t apply to access-token enrichment requests. Rules by endpoint:email.send: optional. The response is cached in Redis for 24h; the same key and body replays the original 2xx.enrichProfile/findEmail/verifyEmail: honored only when durable enrichment is enabled server-side and the caller is a wallet session, not anaccess_tokensession (see Remote MCP). On these three routes an access-token session skips the durable-replay check and always dispatches a fresh job, even with durable enrichment enabled. Wallet sessions get an auto-generated key when the caller doesn’t supply one. Replay is stored in a durable Postgres row, not a 24h cache, and does not expire.POST /v1/tools/physical-mail/send: mandatory. Also stored in a durable Postgres row with no expiry; a same-key request with a different body is rejected, not replayed.
idempotencyKey option.string | null
Human-readable reason for the call, up to 1000 chars. Set with the SDK’s
memo option or memo in the JSON body. See Audit Trail.object | null
Machine-readable decision metadata for supervisor and auditor agents. Open schema; known fields include
goal, goalId, alternatives, confidence (0-1).A non-null
value_tag counts toward RoCS only when its status is "confirmed". To tag, see Tag Receipt Value.