Derive a stable idempotency fingerprint from declared identity fields and flag volatile fields

$0.005 USDC per call · Agent infrastructure · POST /api/v1/idempotency-fingerprint · Id idempotency-fingerprint

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

FieldTypeRequiredDescription
requestsarray<any>; max 20 itemsyes
identityarray<string; length 0..300>; max 50 itemsyesJSON Pointers whose values define the operation's identity.
volatilearray<string; length 0..300>; max 50 itemsnoJSON Pointers declared to change per attempt (timestamps, nonces, request ids).
scopestring; length 0..200noMixed 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.

FieldTypeRequiredDescription
statusstring; one of "pass", "fail", "unknown", "unsupported"nopass: 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.
fingerprintsarray<string>no
stablebooleannoAll requests produce the same fingerprint.
undeclaredDifferencesarray<string>noPointers of leaf values that differ across requests and are neither identity nor volatile.
derivationstringno
witnessesarray<object>no
versionsobjectnoEvery semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile).
limitsarray<string>no
deterministicbooleannoAlways 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