Derive a stable idempotency fingerprint from declared identity fields and flag volatile fields
Hashes the fields you declare as the identity of an operation (JSON Pointers into each request) with RFC 8785 canonical JSON and SHA-256, so retries of the same operation get the same fingerprint regardless of key order, and flags the ways that breaks: an identity field missing, an identity field also declared volatile, identity values that look like timestamps, epoch times or UUIDs (heuristic), and undeclared fields that differ between attempts. For an agent that must choose an Idempotency-Key for a retried write. Does not know any provider's key rules, length limits or scope, and does not send anything.
What you get
A key built from the wrong fields either double-charges (key changes per retry) or silently drops a different request (key collides).
Call it
Send the JSON body below to https://agents.writerslogic.com/api/v1/idempotency-fingerprint. An unpaid request answers 402 with the price and how to pay; a request that fails with a 5xx status is not charged.
curl -i -X POST https://agents.writerslogic.com/api/v1/idempotency-fingerprint \
-H 'content-type: application/json' \
-d '{"requests":[{"amount":500,"currency":"USD","customer":"c_1","sentAt":"2026-11-04T10:00:00Z"},{"amount":500,"currency":"USD","customer":"c_1","sentAt":"2026-11-04T10:00:07Z"}],"identity":["/amount","/currency","/customer"],"volatile":["/sentAt"],"scope":"charge:acct_9"}'
Input
| Field | Type | Required | Description |
|---|---|---|---|
requests | array<any>; max 20 items | yes | |
identity | array<string; length 0..300>; max 50 items | yes | JSON Pointers whose values define the operation's identity. |
volatile | array<string; length 0..300>; max 50 items | no | JSON Pointers declared to change per attempt (timestamps, nonces, request ids). |
scope | string; length 0..200 | no | Mixed into the hash (for example operation name and tenant) so equal bodies in different scopes get different fingerprints. |
Example request body
{
"requests": [
{
"amount": 500,
"currency": "USD",
"customer": "c_1",
"sentAt": "2026-11-04T10:00:00Z"
},
{
"amount": 500,
"currency": "USD",
"customer": "c_1",
"sentAt": "2026-11-04T10:00:07Z"
}
],
"identity": [
"/amount",
"/currency",
"/customer"
],
"volatile": [
"/sentAt"
],
"scope": "charge:acct_9"
}
Result
The response is { "data": ..., "_provenance": ... }. data carries these fields; _provenance is a signed W3C Verifiable Credential with a C2PA-style manifest, checked free at POST /api/v1/verify-provenance.
| Field | Type | Required | Description |
|---|---|---|---|
status | string; one of "pass", "fail", "unknown", "unsupported" | no | pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass. |
fingerprints | array<string> | no | |
stable | boolean | no | All requests produce the same fingerprint. |
undeclaredDifferences | array<string> | no | Pointers of leaf values that differ across requests and are neither identity nor volatile. |
derivation | string | no | |
witnesses | array<object> | no | |
versions | object | no | Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile). |
limits | array<string> | no | |
deterministic | boolean | no | Always true: pure code, no model. |
Pay and connect
Available through: x402 (USDC on Base), MCP. MCP clients reach it through the execution-safety-kit package.
Machine-readable
- This agent as JSON (schemas, example, OpenAPI operation)
- Free signed sample response
- OpenAPI 3.1 · Catalog · Index of every agent