EN
The IFF field guide
Inspect an x402 endpoint
before integration.
Read saved, unpaid x402 v2 evidence before you connect payment logic, then follow the path for your role.
Read an illustrated evidence exampleTeaching sample · · Non-live
Read an illustrated evidence card.
Synthetic, static teaching aid with illustrative values. The resource does not represent a real observed or verified card, and opening this page makes no request to a provider.
- Resource
https://api.example.com/v1/resource- Tier
observedObserved from public sources. Ownership not verified. Not an IFF-verified Evidence Card.- Protocol
valid · x402 v2Passed the protocol checks.- Payment option
exact · eip155:8453 · synthetic token contract 0x…C3 · 1000 atomic units · payTo 0x…A1Synthetic values. Abbreviated identifiers are display-only and are not usable payment instructions.- Freshness
fresh at sample timeA live card shows its observation time and interval; recheck before use.- Requirements
current run: 4 observationsRepeated observations matched; this does not explain why the provider chose those terms.
What you can conclude
In a real card, these fields would mean the monitor recorded a protocol-valid unpaid challenge with the listed payment option, at the observed time.
What remains open
The sample does not establish ownership, payment safety, delivery, settlement or the provider's intent, and has no real report, signature or log proof.
API consumer
Inspect an endpoint before you use it.
See what IFF has observed without a wallet, API key or payment.
- Bring
- The exact API resource URL
- You will get
- A saved public evidence card, when available
Use the resource path, not the website.
Open Live lookup and paste the complete URL into x402 endpoint URL. A provider's homepage does not search every API on its domain.
Example resource URLhttps://api.solmachina.com/v1/epochThis URL had public evidence on Sep 6, 2026. It is an example, not a recommendation.
Select a payment network, then “Inspect evidence.”
Base, BSC, 0G and Robinhood Chain filter mainnet options in the saved challenge; All networks adds testnets and others. Lookup never calls the provider, and a selection cannot change what it accepts or prove settlement.
Read each dimension on its own.
- Ownership
- Has origin control been verified? An
observedcard can still be unverified. - Protocol
- Did the unpaid response pass x402 v2 checks? This is not a test of the paid result.
- Freshness
- When was it observed, and is it still within the monitoring window?
- Availability
- Read the sample count and window. Missing measurements are not a pass.
Agent & app developer
Put evidence before payment logic.
Compare the requirement your client received with IFF's independent observation.
- Bring
- An x402 v2 client and a payment policy
- You will get
- A comparison verdict, not a payment approval
Install the preflight SDK.
Use Node 20+ or a modern browser. No IFF API key needed.
Terminalnpm install @ifandonlyif/x402-preflightPass the checked fetch into your payment client.
The wrapper inspects a 402 before your payment library acts. It holds no wallet key and makes no payment.
TypeScript · integration patternimport { wrapFetch } from "@ifandonlyif/x402-preflight"; const preflightFetch = wrapFetch(fetch, { onDiverged: "throw", onStale: "strict", onUnobserved: "warn", }); // Pass preflightFetch as your payment client's fetch. // Creating this function alone makes no request.Not a complete checkout. Alternatives:
verify(), the HTTP API, or the MCP command.Decide how your application handles uncertainty.
consistent- The comparison matches. Your payment policy still decides whether to proceed.
diverged- The requirement differs. The example throws before payment logic proceeds.
stale- The observation is old.
strictthrows on a stale mismatch, but only warns on a stale match. unobserved- No comparable observation. The example warns; it does not block automatically.
Endpoint owner
Prove control.
Then operate.
An API workflow. You must control the endpoint's origin; no new domain is needed.
- Bring
- An Ethereum EOA wallet with personal-sign support (not a contract wallet), a public x402 v2 endpoint, and access to its well-known file
- You will get
- Owner access after successful verification
Sign the server's login challenge.
Follow wallet authentication: request a challenge, sign its exact message, submit the signature for access and refresh tokens. Keep tokens private; never send IFF a private key.
Register the exact endpoint URL.
Call
POST /api/v3/endpointswith your access token. Save the returnedclaim_attempt_idandownershipdocument. Registration starts a claim; it does not grant owner access.Use public HTTPS on port 443, without credentials, query strings, fragments or redirects.
Publish the ownership file and queue verification.
Serve the returned
ownership.documentat its exactownership.verification_url, normally/.well-known/iff-trust.jsonon the same origin. The challenge expires after 24 hours.For several endpoints on one origin, keep existing claims and append the new one in the documented
claimsformat.Call
POST /api/v3/endpoints/:id/verify-ownership. A202means queued, not verified; checkGET /api/v3/endpointsfor the outcome.Wait for monitoring evidence, then add notifications.
Owner access and public evidence are separate. Verified-tier publication needs ownership plus at least three passing observations. Keep the ownership file online for rechecks.
Once verified, configure a webhook for status or requirement changes. Save its one-time secret, check each delivery's signature and timestamp, and deduplicate retries.
Evidence reviewer
Check what was signed.
Keep trust separate.
Inspect an IFF Service Receipt v2, an experimental signed verification-result envelope.
- Bring
- A receipt JSON or full API response; independently obtained issuer details for pinning
- You will get
- Separate signature, issuer, time, and binding checks
Load JSON, not a URL.
Paste the receipt envelope or full API response, or load a JSON file. For an endpoint URL, use Live lookup. Parsing and signature checks run in your browser; issuer recognition may fetch IFF's public key directory.
No receipt? Ask the developer for an IFF response with
service_receipt; they can request one via the optional direct-API integration. Ordinary responses do not include it.Separate a valid signature from a trusted issuer.
A valid signature means the embedded key signed the subject; a directory match can recognize a key. For independent pinning, supply the exact expected issuer and a full
sha256:key fingerprint from a separate trusted channel, not from the receipt you are checking.Read the signed subject, time window, and binding.
Check that the signed URL and result are what you expected. A valid historical signature can belong to an expired receipt. A standalone receipt cannot establish that a surrounding response matches the signed subject.
A receipt signature alone does not verify the referenced observation, log inclusion or chain anchor.
When something does not fit
Find your next step.
Missing evidence and failed checks need different responses.
Does a passing check mean I should pay?
No. Protocol validity, ownership, freshness, requirement consistency and receipt authenticity answer different questions, and none guarantees the paid service or its result. Keep your own payment policy and risk limits.