Changelog

New endpoints, SDK releases, chain support, and spec changes. Updated as features ship.

October 7, 2026

Account Code: Plain Key, EIP-7702 Delegation or Contract, as a Signed Boolean

Endpoint Feature Spec
  • Adds the account_code condition type to POST /v1/attest, the tenth. It asks what code sits at the wallet address itself at the anchored block: expect: "none" (no code, a plain key account), "eip7702" (the EIP-7702 delegation designator, a key that has delegated execution to a contract) or "contract" (any other code: a smart-contract wallet, a protocol, a token). The three are exclusive on a chain. With "eip7702", an optional delegate names the address the designator must point at. Any of the 31 EVM chains; a non-EVM chain is a 400. The answer is the boolean: the code and the delegation target are never returned, in any format or mode. 1 credit, 2 in proof mode, the standard 30-minute expiry, JWT format and x402 pay-per-call at the standard rate. The signed evaluatedCondition is {type, chainId, expect, operator: "code_state"}, plus delegate when supplied, and echoes nothing read from the chain.
  • Adds an account proof for the type. With proof: "merkle" the result carries an EIP-1186 account proof, subject: "account_code", whose codeHash is the proven value: keccak256 of empty code means no code, keccak256 of 0xef0100 followed by the 20-byte target means an EIP-7702 delegation to that target, anything else means contract code. Proof subjects are now three: account_balance, account_code and delegation_revocation, beside the subject-less ERC-20 slot proof.
  • Adds the account dimension to POST /v1/trust and POST /v1/trust/batch. Ten rows, two per chain on Ethereum, Base, Arbitrum, Optimism and Polygon: "Contract code on X" and "EIP-7702 delegation on X", exclusive per chain, a plain key reading false on both. Which contract is never named; that question belongs to account_code with delegate. Each row's evaluatedCondition has the attest layout, so its conditionHash equals the equivalent attest condition's. The profile is now 155 base checks across 27 chains in 10 dimensions, up to 176 checks across 29 chains in 14 dimensions with the optional Solana, XRPL, Bitcoin and Tron wallets. conditionSetVersion is "2026-10-08"; readers log it and never reject on it. Account rows carry available: false in proof mode. Pricing is unchanged: 3 credits, 6 with proofs.
  • Dimensions come in a fixed order. The ten base dimensions in the published order, then any of solana, xrpl, bitcoin and tron that were switched on, in that order; the same order for every wallet, in a batch as in a single profile. Readers may still look dimensions up by name. The specification records all three changes in its revision history. No new kid, no change to any signed preimage or to the trust object layout.
October 7, 2026

Batch Trust Profiles Arrive as a Summary a Model Can Read

SDK Endpoint
  • A model reads a summary per wallet. A trust profile lists every check, tens of thousands of characters per wallet, so ten profiles in one tool result were more than a model can read. The batch tools now hand the model a summary per wallet: the profile ID, check set, expiry, the key IDs it names, the held / not held / not evaluated counts, and the checks held in each dimension. The counts are facts about the wallet, not a score. POST /v1/trust/batch and its signed profiles are unchanged.
  • mcp-server-insumer 1.19.0: the text of insumer_batch_wallet_trust is the summary, and the complete signed profiles are in structuredContent, unchanged. detail: "full" puts them in the text as well. The hosted endpoint serves the same version. insumer_list_tokens describes the registry as a directory: an attestation can check any token on a supported chain, and NFTs on EVM chains, Solana and XRPL, whether listed or not.
  • langchain-insumer 0.14.0: InsumerBatchWalletTrustTool returns content and an artifact. The model reads the summary, and the complete response is the tool message's artifact. Called with plain arguments, the tool now returns the summary where it used to return the complete JSON; pass detail="full" for the same output as before. Requires langchain-core 0.2.17 or later.
  • insumer-trust-batch skill 0.3.0: the helper script prints the summary and saves the complete signed response to a JSON file; --full prints the complete response.
  • Choose the full form on the call that needs it. A profile cannot be fetched again, so a second call signs fresh profiles and is charged again.
  • POST /v1/attest: the message for an unsupported chainId names where the supported chain IDs are listed, llms.txt.
October 7, 2026

A Store's Owner Can Pause Its Recognition

Endpoint
  • paused in PUT /v1/merchants/{id}/settings: true pauses a store’s recognition, false resumes it. GET /v1/merchants/{id}/status shows paused and pausedAt.
  • While a store is paused, /v1/verify, /v1/acp/discount, /v1/ucp/discount and /v1/discount/check return 409 “This store’s recognition is paused.” with no credit used and no code created. /v1/pass/verify answers recognized: false with paused: true. The store is left out of GET /v1/merchants, and GET /v1/merchants/{id} returns 404.
  • Resuming restores everything as it was.
October 7, 2026

The Member Pass Is Skye Meta's Bothy Pass

Ecosystem
  • insumermodel.com/pass now redirects to skyemeta.com/pass/, the Bothy Pass, which Skye Meta builds on InsumerAPI. Links keep their query string, so existing invite and tap links still work.
  • Pass codes are still signed by InsumerAPI and checked with POST /v1/pass/verify. Nothing changes for a scanner or an integration that verifies passes.
  • The connect window at insumermodel.com/pass/connect, opened by sites that recognize the pass, stays where it is.
October 6, 2026

One Credit Balance: The Key That Owns a Store Pays for Its Codes

Endpoint
  • There is one kind of credit: your API key's. A store has no balance of its own. A discount code from /v1/verify, /v1/acp/discount or /v1/ucp/discount, or an NFC tap, that carries a discount uses one credit from the API key that owns the store, the key that created it. A 0% result is free. Every in-store scan uses one credit from that key. A caller using another key is not charged; if you call with the owner key, your key pays.
  • Stores run through a licensed platform such as Skye Meta are covered by that platform's license and are not charged per use.
  • New errors on the code endpoints. 402 when the owner key is out of credits: "The API key that owns this store has no credits remaining. Its owner can buy more via POST /v1/credits/buy." Returned only when the result carries a discount. 403 when the store has no active owner key: "This store has no active owner API key, so it cannot issue codes or record scans and taps." No credit is used and no code is created in either case.
  • Hourly limit on paid discount codes. Codes that carry a discount, issued through /v1/verify, /v1/acp/discount or /v1/ucp/discount, with a key other than the store's owner, are subject to an hourly limit (429; the message says when to try again): "The hourly limit on discount codes has been reached. Try again in N minutes." No credit is used and no code is created.
  • Top up with POST /v1/credits/buy, which carries the volume tiers. POST /v1/merchants/{id}/credits is kept for compatibility: same payment flow and flat rate (25 credits per $1), and the credits go to the owner key's regular balance.
  • A new store from POST /v1/merchants starts with no balance of its own. Its credits field, and the one in GET /v1/merchants/{id}/status, is the owner key's current balance.
  • ACP and UCP meta describe the caller's key, and never another key's balance. When the caller owns the store and the code carries a discount, creditsCharged is 1 and creditsRemaining is the caller key's credits after the charge; otherwise creditsCharged is 0 and creditsRemaining is the caller key's credits. Field names and types are unchanged.
  • mcp-server-insumer 1.18.0 describes the one credit balance in its discount tools and lists the core tools (attest, compliance templates and the trust profiles) first. The hosted endpoint serves the same version.
October 6, 2026

Stores Can Recognize a Chain's Own Coin

Feature
  • contractAddress: "native" on EVM chains in PUT /v1/merchants/{id}/tokens: a store can recognize the chain's own coin, such as ETH on Ethereum or Base, as Solana (SOL) and the XRP Ledger (XRP) already allowed. Use decimals: 18.
October 5, 2026

MCP Server 1.17.1 and an Agent Skill for Discounts

Feature
  • The MCP tools cover the discount changes below. insumer_verify, insumer_acp_discount and insumer_ucp_discount take walletProof, with the exact message to sign in the field's description; insumer_configure_settings takes the store's terms; insumer_configure_tokens takes alsoOn. The hosted endpoint at https://api.insumermodel.com/mcp runs 1.17.1.
  • New agent skill insumer-discount in insumer-agent-skills: read the store's terms, check for free, prove the wallet if it pays, create the code. Its helper prints the message to sign and never handles a private key.
October 5, 2026

Discounts: Prove the Wallet, or Take the Store's Terms Without Proof

Feature
  • New optional field walletProof on /v1/verify, /v1/acp/discount and /v1/ucp/discount: an EIP-4361 (Sign-In with Ethereum) message signed by the EVM wallet in wallet, with URI https://api.insumermodel.com/v1/merchants/{merchantId}. A proof that fails is a 401 and uses no credit.
  • A proven wallet gets the full discount its holdings earn, under the store's tiers and cap, without the store's daily limit. Proof never lowers a holdings requirement. It covers the one address in wallet: a proof sent with solanaWallet or xrplWallet is refused (400). Responses and GET /v1/codes/{code} carry walletProven.
  • The store sets the terms for a wallet without proof, in PUT /v1/merchants/{id}/settings: maxUnprovenDiscount (the same discount, the default; a lower one; or 0 for none) and maxDiscountsPerWalletPerDay (1 to 100 discount codes per UTC day, or null for no limit). Over the limit is a 429 with no credit used and no code created; only codes that carry a discount count. Only a daily count is kept for the limit, and it is deleted after the day.
  • Agents can read the terms before calling. GET /v1/merchants, GET /v1/merchants/{id} and GET /v1/discount/check return walletTerms. The check previews what a wallet gets without proof, and discountIfProven when proof would get more.
  • Nothing changes for existing callers. A request without walletProof at a store that has set nothing works exactly as before. The signed result is unchanged; walletProven and discountIfProven sit beside it.
  • Also: GET /v1/merchants/{id}/status returns the new settings and each token's alsoOn networks.
October 5, 2026

Merchant Tokens Can Count on Every Network They Are On

Feature
  • New optional field alsoOn on a token in PUT /v1/merchants/{id}/tokens: the same token on other networks, each as { chainId, contractAddress }, up to 9, on EVM chains and Solana.
  • One tier per token. The discount check and verification (/v1/verify, ACP, UCP) read every network listed plus the token's own, add the balances exactly, and award the token's tier once. A holder with 400 on Ethereum and 600 on Arbitrum reaches a 1,000 threshold. The token appears once in the breakdown and uses one of the 8 token slots.
  • The store decides what counts as the same token. Only the deployments the store lists are added together. Each network's balance is read in that token's own decimals there, and the balances are added exactly.
  • All or nothing. A read that fails on any listed network refuses the whole check (503, rpc_failure, no credit used), never a total from the networks that answered.
  • Nothing changes without it. A token saved without alsoOn is read on its own network only, exactly as before. A network listed twice, or already listed by another token, is a 400.
October 5, 2026

MCP Server 1.16.2: Tool Descriptions and Merchant Tools Match the API

SDK
  • Tool descriptions say what rpc_failure means. In mcp-server-insumer 1.16.2, the attest, trust, verify, discount check, ACP and UCP tools each state that a 503 rpc_failure means a read did not complete, nothing was signed, and the call can be retried. It is never a "no".
  • The merchant tools take the wallets the API reads: wallet, solanaWallet and xrplWallet on verify, discount check, ACP and UCP.
  • The configure tools carry more of the stored configuration. insumer_configure_nfts takes enabled and benefitType, so a collection that was switched off stays off when its configuration is saved again. insumer_configure_tokens takes name and logo, and enabled for the own token.
  • An XRPL taxon is an integer from 0 to 4294967295, and a Sui coin type with type parameters is accepted. The hosted endpoint at api.insumermodel.com/mcp serves this version.
October 5, 2026

Merchant Verification Is Signed Before Any Credit Is Taken; Discounts Are Whole Numbers

Security Endpoint
  • POST /v1/verify signs the result first. The credit is taken and the code is stored together after the signature exists, and a coupon is created only once the code exists. A result that cannot be signed, or a code that cannot be stored, answers 503 in the standard error envelope: no credit used, no code created, safe to retry. A retry after a timeout on the caller's side is a new verification: if the first request completed, it used a credit and created a code, and the retry does both again. /v1/acp/discount and /v1/ucp/discount run the same verification and follow the same order.
  • An own token's enabled is a boolean. On PUT /v1/merchants/{id}/tokens, "ownToken": {"enabled": false} switches the own token off, as null does. true, or leaving it out, saves the token switched on. Any other value is a 400.
  • Discounts are whole numbers. A tier discount and an NFT discount are whole numbers from 1 to 50, and discountCap is a whole number from 1 to 100. A value with a fraction, such as 10.5, is a 400 on the token, NFT and settings saves. Digits such as "10.0" are accepted as 10. The spec already typed these fields as integers.
October 4, 2026

Merchant Token Saves Validated; Two More Refusals on an Incomplete Read

Security Endpoint
  • Merchant token saves are validated. PUT /v1/merchants/{id}/tokens checks a Solana mint address ("native" or base58, 32 to 44 characters), verifies an XRPL issuer's checksum, and checks an XRPL currency by the same rule as an attest condition. The currency is stored as entered, in the letter case given. Anything that fails is a 400.
  • A merchant token's decimals is not used at evaluation. The field is still required on save, from 0 to 18. When a discount is evaluated the token's own decimals are read from the chain.
  • A balance that cannot be stated exactly is a refusal. When a balance was read but has no exact decimal form, the answer is 503 rpc_failure, never a signed met: false.
  • An XRPL trust line whose issuer account cannot be read is a refusal. The answer is 503 rpc_failure: whether the issuer has frozen what it issued is part of the result, so the result is not signed without it.
October 4, 2026

XRPL Currency Codes Are Matched Exactly as Issued

Feature Chains
  • XRPL currency codes are matched exactly as issued. Currency codes are case-sensitive on the XRP Ledger: send USD, not usd, and send a token name in the letter case its issuer used. Trust-line conditions are evaluated the same way for a wallet of any size.
October 4, 2026

XRPL Verification Strengthened: Issuer-Wide Freezes

Security Chains
  • XRPL verification strengthened. A trust line whose issuer has frozen everything it issued is met: false with trustLineState.frozen: true, the same as a line with a freeze set on it, and earns no merchant tier.
  • Merchant NFT configuration extended. PUT /v1/merchants/{id}/nfts verifies an XRPL issuer's checksum and accepts a taxon from 0 to 4294967295; anything else is a 400.
October 4, 2026

MCP Server 1.16.1: XRPL Currency Codes in Every Accepted Form

SDK
  • XRPL currency codes are accepted in every form the API accepts. In mcp-server-insumer 1.16.1, currency takes a 3-character code, a token name of 1 to 20 printable ASCII characters, or a 40-character hex code, and its description states that codes are case-sensitive and sent exactly as issued. The hosted endpoint at api.insumermodel.com/mcp serves this version, and the insumer-attest agent skill carries the same note.
October 4, 2026

Input Validation Extended; Discount Check Refuses on an Incomplete Read

Security Endpoint
  • Input validation extended. On XRPL and Solana, nft_ownership with contractAddress: "native" is a 400, as on the EVM chains. XRP given as an issued currency is a 400: use contractAddress: "native". A decimal string (threshold, multiple, amount, minFraction) is at most 400 characters.
  • GET /v1/discount/check refuses when a read does not complete. It answers 503 rpc_failure, the same refusal as /v1/attest, so a discount answer always rests on completed reads. A frozen XRPL trust line earns no tier on the merchant endpoints.
October 4, 2026

Non-EVM Verification Strengthened

Security Chains
  • Non-EVM verification strengthened. Balances on Solana and Tron are compared digit for digit at any size. XRPL conditions extend to wallets holding many more NFTs. Messages in a 503 refusal use a fixed vocabulary.
October 3, 2026

MCP Server 1.16: Output Schemas and Structured Results

SDK
  • Every tool declares an output schema. In mcp-server-insumer 1.16.0, the 27 tools share one schema describing the response envelope (ok, data, meta, error).
  • Successful results carry structuredContent: the same JSON the text content already held, parsed. The text content is unchanged, so clients that read it see no difference.
  • The HTTP runner answers any non-POST request with 405. The hosted endpoint at api.insumermodel.com/mcp serves this version.
October 2, 2026

Hosted MCP Endpoint; MCP Server 1.15

Endpoint SDK
  • The MCP server is hosted. https://api.insumermodel.com/mcp serves ten of the 27 tools over MCP streamable HTTP: connect by URL, no install and no key, on a shared daily allowance. The ten are the signing keys, attest, compliance templates, wallet trust and batch trust, the merchant and token directories, the discount check and code validation. Run the package locally with your own key for the full set.
  • mcp-server-insumer 1.15.0 can be hosted. createInsumerServer(options) is exported from the package root and builds a configured server for any transport, and HOSTED_TOOLS names the ten-tool subset. The stdio binary is unchanged: npx -y mcp-server-insumer behaves as before.
October 2, 2026

MCP Server 1.14: Every Payment Quote Checked Before Signing

SDK Security
  • Pay-per-call checks the quote before the wallet signs. With INSUMER_PAYMENT_KEY set, mcp-server-insumer 1.14 signs a payment only when the x402 quote pays InsumerAPI's own receiving address, in USDC on Base, under the exact scheme, for no more than a cap: $3.00 per call by default, the price of the largest call today, adjustable with INSUMER_MAX_PAYMENT_USDC. Any other quote is refused and nothing is signed. Proven live: a $0.05 attestation paid and returned signed; the same quote under a lower cap was refused before signing.
  • Every tool says what it does. All 27 tools declare MCP annotations, so an agent host can tell the nine tools that only read from the ones that spend credits, create records, or replace a merchant's configuration. Every free-text input carries a format and a length limit (wallet addresses per chain, contract addresses and coin types, transaction hashes, merchant IDs, domains), so malformed input is refused before any request is sent. Tool descriptions point to llms.txt and pricing for figures that change.
  • The MCP Registry entry is now com.insumermodel/insumer, verified through the insumermodel.com domain (/.well-known/mcp-registry-auth). The npm package name is unchanged, so existing npx -y mcp-server-insumer configurations keep working. The previous registry name is deprecated with a pointer to the new one.
  • insumer-verify 1.9.3 on npm carries the README already on GitHub, including the pointer to the Python package. The built code is byte-identical to 1.9.2, so the Python package stays at 1.9.2.1 and the test vectors' reference version still holds. wdk-protocol-wallet-auth 0.2.9 is likewise documentation only.
October 1, 2026

insumer-verify for Python

Ecosystem Feature
  • The attestation and trust-profile verifier is on PyPI: pip install insumer-verify (Python 3.9+). It is the Python counterpart of the npm package, built in the same repository, and it implements Section 12 check for check: the ECDSA P-256 signature over the preimage the kid selects, condition hashes per scheme, block freshness, expiry bound to the signed attestedAt, the ML-DSA-65 companion (pqSig, and pqJwt bound to jwt by the full claim set), the tokens beside a format: "jwt" response, and trust profiles.
  • Both packages pass all 27 published test vectors, so a verdict from one can be reproduced with the other. The specification, not either implementation, is the source of truth. The Python package reproduces the issuer's JSON.stringify serialization exactly rather than approximating it with json.dumps: ECMAScript number formatting, property order, UTF-16 key sorting, and the v1 condition-hash replacer semantics, each cross-checked against Node.
  • One required dependency (cryptography); install insumer-verify[pq] for the post-quantum companion, which is otherwise reported unverifiable. A saved copy of the JWKS verifies with no network, exactly as in the npm package. Verified against production on a v1 key and a v2 key: raw, JWT format with the companion, and a trust profile.
  • 1.9.2.1 strengthens parity with the npm package beyond the published vectors. An adversarial review ran crafted inputs through both verifiers and compared every verdict. The Python package now reads base64 exactly as the JavaScript runtime reads it, reads timestamps exactly as Date reads them (out-of-range fields invalid, day-of-month rollover, numeric and boolean coercion), refuses hostile shapes inside the signed payload as failed checks rather than passing over them, and accepts the same signature encodings on the JWT path. A parity suite built from those inputs ships with the tests, and the two packages agree on every verdict in that suite. One deliberate strengthening over the npm package, documented in the README: a caller option the verifier cannot read, such as a key set that is not an object or a cutoff date in an unknown form, is an error in the call rather than a silently weaker policy.
  • Nothing signed changes. No new kid, no change to any preimage; the API is untouched. The Python package is one more independent verifier of the signatures, and it goes on the list every key rotation has to clear before it ships.
October 1, 2026

The Trust Profile Expands to Nine Dimensions: 145 Checks Across 27 Chains

Endpoint Feature Spec
  • POST /v1/trust and POST /v1/trust/batch now run 145 base checks across 27 chains in 9 dimensions, up to 166 checks across 29 chains in 13 dimensions with the optional Solana, XRPL, Bitcoin and Tron wallets. The profile was 45 base checks across 26 chains in 5 dimensions, up to 50 across 28 in 9.
  • Four new base dimensions: tokenized_treasuries (16: BUIDL, USYC, OUSG, USTB, USDY), stablecoin_deposits (39: Aave v3 aUSDC and aUSDT receipts, sUSDS, sDAI, listed Morpho USDC vaults), wrapped_bitcoin (12: cbBTC, WBTC, tBTC) and names (2: ENS .eth names and Basenames). The existing dimensions grow too: stablecoins to 52 (adding OUSD, PYUSD, USDG, USD1, RLUSD, USDS, DAI and EURC on their main chains), governance to 8 (adding ENS, LDO, SKY, COMP), staking to 5 (adding wstETH, weETH). The optional solana dimension is now 14 checks, xrpl adds OUSG, and tron adds USD1 and WBTC. Robinhood Chain joins the base chain set.
  • Every row is a presence check: a token balance above zero, or an NFT held. A row is admitted on an official issuer deployment and at least $1M live supply, and each was verified live on its chain by two independent readers before it entered the table. Stellar and Sui still add no dimension: their rows sit inside the base dimensions and carry evaluated: false when the wallet is absent, as before, now including USDY on Sui.
  • conditionSetVersion is now a dated identifier of the check list that was run: "2026-10", the same on every key version, v1 and v2 alike, inside the signed payload. It is bumped whenever a row is added or removed. Readers may log it. Signature verification must not reject a result solely because the condition-set version is unfamiliar; the kid, not this field, selects the signing preimage. An application may still require a particular set for its own policy. The specification Section 11.4 is restated to match. The published test vectors keep the prior value and verify unchanged.
  • With proof: "merkle", EVM token rows carry a storage proof when the token's balance slot can be discovered. Rows whose balance is computed rather than stored (Aave aTokens, BUIDL) and tokens with non-standard storage layouts are declined with available: false and a stated reason, rather than attempting a proof that cannot exist. NFT and non-EVM rows are declined as before; a check that was not evaluated carries no proof key at all; the premium is refunded whenever no proof is delivered.
  • Pricing is unchanged: 3 credits, 6 with proofs; $0.15 and $0.30 per call via x402. No new kid, no change to any signed preimage or to the trust object layout; every existing verifier reads the new profile unchanged.
September 27, 2026

Wallet State Attestation Internet-Draft, Revision 01

Spec Ecosystem
  • Revision 01 of draft-borthwick-wallet-state-attestation is on the IETF Datatracker: individual submission, Informational, 31 pages, expires March 31, 2027. Archived .txt at ietf.org/archive/id.
  • The document states both signing schemes and how the kid selects them: the bare scheme, and the domain-separated scheme whose canonical form is RFC 8785. It defines the post-quantum companion (ML-DSA-65, carried as pqSig and pqKid, and in the JWT format as pqJwt bound to the token by its full claim set) with a four-verdict decision list, and a numbered verification procedure that names the verdict at every branch, including what a verifier reports when the signing key cannot be selected.
  • Written for every implementer, not only ours: the specification, the test vectors and insumer-verify follow the same rules, and a verifier built from the draft text alone reproduces the published attestation vectors. Nothing an issuer signs changes; every attestation ever issued verifies as before.
September 27, 2026

Every Identifier in the Signed Condition Has an Alphabet

Security Spec
  • On POST /v1/attest, the caller-supplied identifiers that are carried inside the signed evaluatedCondition are now checked against their alphabets before any credit is charged. XRPL currency is a 3-character standard code, a token name of 1 to 20 printable ASCII characters, or a 40-character hex code; Stellar assetCode is 1 to 12 characters from a-z, A-Z, 0-9; XRPL taxon is an integer from 0 to 4294967295; a Solana contractAddress is "native" or a base58 mint of 32 to 44 characters; an XRPL or Stellar issuer in contractAddress must pass its address checksum. Anything else is a 400 that names the field.
  • Why: the v2 preimage is RFC 8785 canonical JSON, and RFC 8785 refuses a string that is not well-formed Unicode. Since September 20 a condition label is always well-formed; these identifiers now carry the same guarantee, so no signed bytes can ever hold a value a verifier outside JavaScript cannot rebuild. The canonical serializer itself now refuses such a string as well.
  • Every request that was accepted with a well-formed identifier signs byte-identical output: same evaluatedCondition, same conditionHash, same preimage. No new kid, no change to any verifier.
September 27, 2026

Each Verdict Stands on Its Own When the Key Cannot Be Selected

SDK Spec
  • insumer-verify 1.9.2: each check now reports its own result when the signing key cannot be selected. A kid that is missing, that the key set does not hold, or that cannot be fetched fails the signature verdict alone, with the reason. Condition hashes, freshness and expiry need no key and are computed and reported as before, and the post-quantum companion is absent when none was transmitted and unverifiable when one was, since that kid selects no preimage to rebuild it over. Nothing is checked against a key the response did not name, and valid stays false. Earlier releases reported every check failed and the companion unverifiable once the key failed to resolve, on the attestation, JWT and trust-profile paths alike.
  • Specification Section 12, Check 1 now states the rule for every verifier. Test vectors 11 and 19 are restated to match: their condition hashes reproduce and are published as such, and vector 11, which carries no companion, reports it absent, as vector 23 always has for the same artifact. The set is still 27, and every other vector publishes exactly what it published before.
  • Nothing signed changes, and no accept-or-reject outcome changes anywhere: an artifact whose key cannot be selected was refused before and is refused now. What changes is the report a reader is handed about it.
September 24, 2026

The Token Subject Names the Wallet That Was Evaluated

Security Spec
  • With format: "jwt", the token’s sub is now always a wallet a condition in the request evaluated, in both the ES256 token and its post-quantum companion. A wallet field that no condition reads is ignored and never named. When conditions span chain families, sub names the first evaluated family in the order EVM, Solana, XRPL, Bitcoin, Tron, Stellar, Sui. Specification Section 5.4 states the rule.
  • A solanaWallet a condition reads must be a base58 address of 32 to 44 characters. A request for format: "jwt" needs at least one condition that evaluates a wallet.
  • Requests whose conditions read every wallet they supply get the same sub they got before. No new kid, no change to any preimage, no change to the claim set. Every verifier keeps working unchanged.
September 22, 2026

Rotation Tolerance for the Post-Quantum Companion

Security SDK Spec
  • The companion signs the exact classical preimage the classical kid selects. Specification Section 12, Check 6 now states how a verifier treats a kid it does not recognise: that kid selects no preimage, so the companion is unverifiable rather than refuted, and a verifier MUST NOT fall back to another era’s preimage. A recognised kid naming the other artifact type is a relabelled artifact and stays refuted, as test vector 21 has always said.
  • This strengthens the verifier side of a key rotation. Rotations are two-sided: every verifier has to tolerate a signing kid it has not met before the issuer flips to it, and the specification now says what tolerating one means for the companion verdict. The rule is written for every verifier, not only ours.
  • insumer-verify 1.8.10 enforces it on both the attestation and the trust path. Two further strengthenings ship with it. An absent companion now distinguishes a call that did not supply one from an artifact that does not carry one, since a bare JWT string carries its companion in options.pqJwt rather than in the token. And checks.jwt.pq is reported once the token parses and names the response kid, so the companion verdict stands beside every later outcome instead of only the passing one.
  • Nothing signed changes. No new kid, no change to any preimage, no change to any response. All 27 published test vectors report exactly what they published, vector 21 included. Verifier-side throughout.
September 21, 2026

Gitcoin Passport Verdicts Now Say Which Test They Passed

Security Spec
  • The two Gitcoin Passport templates test different things: gitcoin_passport_score is met when the decoder’s isHuman is true (a score of at least 20), gitcoin_passport_active when getScore returns any score above zero. The signed evaluatedCondition of a decoder-based eas_attestation now carries decoderMethod ("isHuman" or "getScore"), so a verifier can tell from the signed bytes which test a verdict passed.
  • The two templates are distinguished in the signed evaluatedCondition, and therefore in conditionHash. The result’s label is set by the caller, so a relying party gating on either Gitcoin template matches decoderMethod as well as the decoder address to pin the test it means.
  • Additive: no field removed, no new kid, no change to how any preimage is built. A verifier recomputes conditionHash over whatever evaluatedCondition carries, so existing verifiers accept the new responses unchanged. The conditionHash of the two Gitcoin templates changes, which is the point; every other condition type is unchanged. A contract that pinned a Gitcoin conditionHash should re-pin.
  • Verified against production with a v1 key and a v2 key, both templates: signature, condition hashes and the post-quantum companion all verify under insumer-verify 1.8.8 and 1.8.7.
September 21, 2026

USDC on Arc: in the Trust Profile, and a Fifth Way to Pay Per Call

Endpoint Chain
  • POST /v1/trust gains one stablecoin check, USDC on Arc (chain ID 5042). The profile is now 45 base checks across 26 chains in 5 dimensions, up to 50 across 28 chains in 9 with the optional wallets. The check is additive: every existing check, label and conditionHash is unchanged, and conditionSetVersion does not move.
  • Arc’s USDC is the chain’s own asset, so the check reads it as contractAddress: "native" with 18 decimals. With proof: "merkle" it carries an account proof (subject: "account_balance"), which also proves a zero balance.
  • The x402 quote on POST /v1/attest, POST /v1/trust and POST /v1/trust/batch carries a fifth accepts[] entry: USDC on Arc (eip155:5042), listed last so every earlier entry keeps its position. Same price, same exact scheme, same EIP-3009 authorization, gasless for the payer.
  • Sign under the domain the quote gives you. Each EVM entry’s extra carries its token’s EIP-712 name and version, and they differ by network: USD Coin on Base, Polygon and Arbitrum, USDC on Arc. A client that hardcodes the name produces a signature Arc will not accept. As on every EVM network, the server re-derives that domain from the contract and asserts it before verifying a payment.
  • Arc payments settle through Circle’s hosted facilitator; the other four networks settle as before. A settlement that has not confirmed by our deadline is held as unresolved, never reported as uncharged: present the same payment header again and it resolves to the same payment.
  • Nothing signed changes. No new kid, no change to any signed preimage. Verified against production: the 45-check profile, in both modes, checked whole by insumer-verify 1.8.7 including the post-quantum companion; the Arc payment path exercised end to end on Arc’s test network, from quote to on-chain receipt.
September 20, 2026

Merkle Proofs on Ronin, and the Scale Is Always the Token’s Own

Feature Chains
  • Ronin (2020) now carries Merkle proofs: storage proofs for token balances and account proofs for the native coin. Proofs now cover 27 of the 31 EVM chains; the four outside that set are ZKsync Era, Sei, Viction and XDC Network.
  • The token’s own decimals are always the scale. On /v1/attest the scale is read from the chain for every token_balance and ratio_to_amount condition, and a decimals value in the request is a cross-check. Equal to the token’s own value, nothing changes; different, or not an integer from 0 to 100, the API returns 400, and a mismatch message names the token’s own value. A threshold is in display units, so the verdict depends on the scale, and the relying party must be able to trust that the scale is the token’s own. A scale that cannot be read is still the 503 rpc_failure, never a 400.
  • Sui coin types are validated at the door. On Sui, contractAddress must be a coin type (address::module::Name, optionally with type parameters). The short form (0x2::sui::SUI) and the 64-hex long form of an address name the same coin; anything that is not a coin type is a 400.
  • A contract address that is not an address is a 400. On EVM chains and on Tron, a contractAddress that is neither "native" nor a well-formed address is refused at the door with a message that says what to send. nft_ownership requires the NFT contract: "native" names a coin, so to check the native coin use token_balance with "native".
  • Several chain families in one request are read together. A request naming Solana, XRPL, Bitcoin, Tron, Stellar and Sui waits for the slowest of them, not for their sum.
  • Nothing signed changes: no new kid, no change to any signed preimage.
September 20, 2026

Moonbeam and Moonriver Retired — 37 Chains

Chains
  • Both networks stopped producing blocks in August 2026 (the final blocks are dated 2026-08-10) after the Moonbeam Foundation moved GLMR and MOVR to Base as ERC-20s. A signature over state that can never change again is not current state, so chain IDs 1284 and 1285 are retired.
  • A request naming either chain returns 400 with a message that says so and gives the token’s address on Base: GLMR 0xb3846fd356c2149ee8d30b0449088dc74e265459, MOVR 0x43fEB74608334DDa8c1a6500D185cFC3Ea962B83. Both are read with an ordinary token_balance condition on chainId 8453.
  • The engine is now 37 chains: 31 EVM plus Solana, XRPL, Bitcoin, Tron, Stellar and Sui. NFT ownership covers 33; Merkle proofs cover 26 of the 31 EVM chains.
  • EAS attestation conditions are supported on five chains: Ethereum, Optimism, Polygon, Base and Arbitrum.
  • Nothing signed changes: no new kid, no change to any signed preimage.
September 20, 2026

The Post-Quantum Companion Binds the Full Claim Set

Feature SDK Spec
  • With format: "jwt", POST /v1/attest returns pqJwt beside jwt: a second compact JWS (ML-DSA-65) carrying the same claims. A verifier now binds the two by the whole claim set — the same member names, and for every member a deeply equal value — where the check previously named jti, exp and pass. The companion therefore vouches for every claim a relying party reads from the jwt: sub, results, conditionHash and the block anchor included.
  • Any difference — a changed value, a missing member, an extra one on either side — reports the companion as refuted, and the reason names the first differing claim. Comparison is by parsed value, never by bytes, so member order is free to differ between the two tokens.
  • insumer-verify 1.8.6 on npm implements it; the rule is specification Section 12, Check 6. Two new test vectors, 24 and 25, are the refused cases: the genuine pair of vector 17 with one claim edited inside jwt and the pqJwt left untouched. Vectors 26 and 27 are a whole format: "jwt" response, as issued and with a token edited. The set is now 27 vectors.
  • insumer-verify 1.8.7, the same day, verifies a format: "jwt" response whole. The API returns the tokens beside the attestation, and given that whole object the verifier now checks the tokens as well and reports them as a sixth verdict, checks.jwt: the ES256 signature of jwt, its condition hashes, that it is the token of this attestation (jti, pass, results and exp equal the attestation's), and its pqJwt companion. The verdict appears only when the response carries tokens; every other input reports the same five verdicts as before.
  • Nothing signed changes. No new kid, no change to any signed preimage or to any response, and every attestation ever issued verifies as before — both tokens have carried one identical claim set since the companion shipped. Verified against fresh production responses under a v1 key and a v2 key, by 1.8.6 and by the previous release. The raw format is unaffected: there pqSig already covers the exact classical preimage.
September 17, 2026

Arc Joins the Engine — 39 Chains, and Native Balances Become Provable

Chain Feature
  • Arc (chain ID 5042), which opened its public mainnet on September 16, is now a supported chain on POST /v1/attest. Every EVM condition type works from day one: token_balance, nft_ownership, evm_view_call, and the ratio rules. That brings the engine to 39 chains, 33 of them EVM. USDC on Arc sits at the predeploy 0x3600000000000000000000000000000000000000, EURC at 0xbEf5f6d51CB62b58e6A8f77868681825C6fe21c1.
  • Arc's native gas asset is USDC itself — one balance exposed through two interfaces, not two assets. eth_getBalance returns the 18-decimal view of the very same holding the 6-decimal ERC-20 reports, the two differing by exactly 1012. A request pairing contractAddress: "native" with the predeploy on Arc would therefore read one balance twice, and the rule its author believed they wrote would require half of what it says. Such a request is refused with a 400 that names both conditions, before any credit is charged.
  • The same rule applies wherever a chain's gas asset is also an ERC-20. On Celo, Moonbeam and Moonriver the mirror is the chain's own gas token, so pairing the native asset with it reads one balance twice there as well, and is rejected the same way. Use either the native asset or the token address on these chains, never both.
  • Native balances now carry a proof, on every proof-capable chain. A Merkle proof here meant a storage proof, which needs a balance mapping to point at — so a condition with contractAddress: "native" could never carry one, on any chain. Arc made that conspicuous, since its native asset is USDC. Such a condition now returns an account proof (subject: "account_balance"): the account’s own Merkle branch, whose balance field is the value evaluated, against the same block state root used to verify a storage proof. Simpler than the storage path — no slot to discover, and no mapping-slot assumption for a verifier to trust — and it proves a zero balance, which the storage path cannot. Additive throughout: proofs sit outside every signed preimage, so nothing a verifier reads has changed, and ERC-20 storage proofs are untouched.
  • Merkle proofs cover 27 of the 33 EVM chains, Arc among them. Whether a chain can carry a proof is a property of the node read, not of the chain. The six outside that set are ZKsync Era, Sei, Ronin, Moonriver, Viction and XDC Network, whose RPCs decline eth_getProof. A proof: "merkle" request on any of them returns the signed attestation with the proof marked unavailable, and the premium is refunded — as it is now whenever no proof is delivered, whatever the reason.
  • Nothing signed changes. No new kid, no change to any signed preimage, and the post-quantum companion applies on Arc as everywhere else. Verified live against production with both a v1 and a v2 key — pass and fail, block-anchored — and both responses checked end to end by insumer-verify 1.8.4, including the companion.
September 3, 2026

Pay-Per-Call Settles on Base, Polygon, Arbitrum, and Solana

Endpoint Chain
  • The x402 quote on POST /v1/attest, POST /v1/trust, and POST /v1/trust/batch now carries one accepts[] entry per settlement network: USDC on Base (eip155:8453, listed first as before), Polygon (eip155:137), Arbitrum (eip155:42161), and Solana (solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp). Same price on every network; a client that takes the first entry sees exactly what it saw before. x402 moves the money. InsumerAPI checks the conditions.
  • EVM entries advertise each USDC contract's own EIP-712 name and version in extra, and the server re-derives and asserts that domain against the contract on-chain before verifying a payment. The Solana entry advertises the facilitator's fee payer in extra.feePayer; the payer builds a partially signed USDC transfer around it and settlement is gasless there too.
  • The payment header is read under both names: PAYMENT-SIGNATURE (the x402 v2 name) and X-PAYMENT. The settlement receipt is returned as PAYMENT-RESPONSE and X-PAYMENT-RESPONSE. A client sending either name alone is answered the same way.
  • Additive throughout: nothing signed changes. The attestation bytes never contain payment data, and the same kid, JWKS, and post-quantum companion apply regardless of which network paid. Verified live on all four networks with the reference @x402 client and insumer-verify 1.8.4.
September 1, 2026

Post-Quantum Companion Signatures

Spec Endpoint
  • Every POST /v1/attest and POST /v1/trust response now carries a second, post-quantum signature beside the ECDSA one: pqSig and pqKid (ML-DSA-65, FIPS 204) as siblings of sig and kid. With format: "jwt" a sibling pqJwt (a compact JWS with alg: "ML-DSA-65", same claims as jwt) is returned as well. Applies to v1 and v2 keys alike.
  • Additive by design. sig, kid, jwt, every preimage, and every existing JWKS entry are byte-for-byte unchanged. A verifier that does not read the new fields behaves exactly as before; this was checked against the unmodified previous release of insumer-verify before shipping.
  • The companion signs the post-quantum domain tag plus the same classical preimage the response's kid selects, so no new canonicalization is introduced. The public key is published in the JWKS as RFC 9964 AKP entries (insumer-attest-pq1, insumer-trust-pq1), appended after the EC entries.
  • The key binding, signed by both the classical and the post-quantum key and anchored on Base (block 50758053), is published at /.well-known/pq-key-binding.json. Its block time is the public record of when the companion came into existence.
  • The spec gains Check 6: the companion is reported as a fifth, independent verdict (verified, refuted, absent, unverifiable). A refuted companion fails the artifact. An absent one affects a live access decision only under the verifier's own cutoff date, judged by its own clock; an artifact read as evidence after the fact is never refused for lacking a companion.
  • insumer-verify 1.8.0 reports the fifth verdict and takes mode, pqRequiredFrom, and pqActivatedAt options. Published test vectors 12 through 17 exercise the companion on both key eras, a tampered companion, an unresolvable pqKid, a pre-companion artifact under a cutoff, and the JWT envelope.
August 28, 2026

Commerce Discount Responses Track Their Current Releases

Spec Endpoint
  • POST /v1/ucp/discount now returns a dev.ucp.shopping.discount fragment matching Universal Commerce Protocol release 2026-08-25, and the version field reports that release.
  • New optional subtotal request field, an order-level base in minor units for callers that do not send line items. UCP's applied discount carries an absolute amount and has no percentage field, so an applied entry needs either items or subtotal. subtotal is ignored when items is supplied.
  • With neither supplied, the response carries no applied entry and discounts.codes is empty. The verified discount still reaches the caller through the verification object, which always carries the code and signature.
  • Per-item allocations now use largest-remainder distribution, so they sum exactly to the discount amount as the UCP discount extension requires. Allocation order follows the order of the submitted items.
  • POST /v1/acp/discount tracks Agentic Commerce Protocol release 2026-04-17 and takes the same treatment. It also accepts subtotal: ACP's applied discount requires an integer amount in minor units, and coupon.percent_off does not stand in for it.
  • Both responses now describe the discount as what it is: an automatic discount. It follows from what the wallet holds, not from a code anyone entered, so automatic is true and the applied entry carries no code field, which both protocols reserve for a submitted code.
  • Following from that, discounts.codes is always empty — it echoes codes the caller submitted, and this endpoint accepts none — and the ACP rejected array is always empty, since it lists submitted codes that could not be applied. An ineligible wallet is simply an automatic discount that did not apply. The INSR-XXXXX redemption code is returned in verification.code, and on applied[].id on the ACP path; validate it at GET /v1/codes/{code}.
  • Unchanged on both paths: the verification performed, the signed payload, the signature scheme, and the kid. This release changes response formatting only.
August 5, 2026

Client-Side Verification for Trust Profiles

Feature
  • insumer-verify v1.6.0 adds verifyTrustProfile, alongside the existing verifyAttestation. It independently checks the ECDSA P-256 signature, freshness, and expiry on a profile from POST /v1/trust and on each entry of POST /v1/trust/batch.
  • The kid on the response selects the scheme: insumer-trust-v2 (domain-separated canonical preimage) or the legacy insumer-attest-v1 (bare JSON). The public key resolves from GET /v1/jwks.
  • Why it matters: a trust profile carries no score and no opinion, only cryptographically verifiable evidence organized by dimension. A third party can now confirm that evidence came from InsumerAPI and has not been altered, without trusting the caller.
  • For batch, call verifyTrustProfile once per data.results[i]. The function returns the verified profile so a consumer renders the object that was checked. Zero dependencies, the same as the attestation path.
July 28, 2026

Delegation Failures Name the Undeployed Principal

Spec
  • New failReason value on erc7710_delegation: delegator_not_deployed, returned when the principal address holds no contract code at the anchored block.
  • That is the normal state of a smart-contract wallet until its first transaction. Signing a delegation is an off-chain EIP-712 signature, so a principal can grant authority without ever deploying, and the ERC-1271 path treats a counterfactual principal as an undeployed wallet rather than a signature failure.
  • Why it matters: your code can now tell “this principal rejected the signature” from “this principal is not on chain yet.” The first is final; the second is worth retrying once the wallet deploys.
  • The verdict is unchanged and still a signed false. Redemption calls executeFromExecutor on the delegator account, so an undeployed principal cannot exercise the delegation regardless of what it signed. No other failReason changes meaning, and no signed bytes change for any case that was already reported correctly.
  • Documented in the state attestation specification and the OpenAPI failReason enum.
July 27, 2026

Revocation Proofs for erc7710_delegation

Feature
  • proof: "merkle" now works on an erc7710_delegation condition. The result carries an EIP-1186 storage proof of disabledDelegations[delegationHash] in the DelegationManager, against the anchored block's state root.
  • The proof object is tagged subject: "delegation_revocation" (balance proofs carry no subject) and adds contractAddress alongside the usual mappingSlot, storageKey, accountProof, storageProof, and storageHash.
  • Why it matters: a delegation verdict has three parts. Two of them you could already reproduce yourself: the EIP-712 signature check (you hold the delegation) and the caveat decode (you submitted the raw terms). “Not revoked as of block N” was the one part you had to take on our word. Now the whole verdict is checkable.
  • To verify: recompute storageKey = keccak256(abi.encode(delegationHash, mappingSlot)) from the delegationHash in the signed evaluatedCondition and confirm it matches, verify the account and storage proofs against the block header's state root, then read the value: 1 is revoked, 0 is not. A proven 0 is positive proof that no revocation exists, not a report that none was found.
  • Returned only for DelegationManagers whose storage layout has been verified on-chain, which today means the v1.3.0 manager on Base. Other recognized managers return proof.available: false with a reason, and the verdict is signed as normal. An inferred slot would prove the wrong location while still verifying against the header, which is worse than no proof.
  • Costs 2 credits like any proof-mode request, refunded to 1 if a proof cannot be produced for a transient RPC reason. erc8004_agent still does not support proofs.
July 27, 2026

Agent Conditions: Generally Available and on x402 Pay-Per-Call

Feature
  • erc8004_agent and erc7710_delegation on POST /v1/attest are now generally available. The per-key enablement flag is gone from production: every API key can send both types, with no request to make and no gating 403.
  • Both types also work with no API key at all, via x402 pay-per-call: send the request with no credential headers, take the 402 priced quote, sign an EIP-3009 USDC authorization on Base, and retry with the X-PAYMENT header. The facilitator settles gasless (the wallet needs USDC, no ETH) and the signed attestation returns in the same round trip.
  • Price on pay-per-call is $0.05 for both agent types, the standard rate. (Superseded in part: erc7710_delegation later gained Merkle revocation proofs. See the entry above.)
  • Everything else is unchanged: Base (chainId 8453) only at launch, 1 credit when paid with credits, agentId required for erc8004_agent, expectedDelegator required for erc7710_delegation, an unknown caveat enforcer fails the condition, declared limits are reported rather than simulated, and attestations containing a delegation condition expire in 5 minutes.
July 27, 2026

Agent Conditions: erc8004_agent and erc7710_delegation

Feature
  • Added erc8004_agent and erc7710_delegation condition types to POST /v1/attest: off-chain attestation of ERC-8004 agent registration and ERC-7710 delegation validity on Base. Both shipped gated to enabled keys and were opened to everyone the same day. See the general-availability entry above.
  • erc8004_agent: met when the attested wallet owns the agent NFT or is the Identity Registry’s on-chain signature-verified agentWallet binding for the supplied agentId. The signed statement is exactly “registered at agentId N, owned by / bound to this wallet”. Registration is permissionless, so it implies no vetting, no reputation, no endorsement.
  • erc7710_delegation: met when the delegation’s delegate is the attested wallet, the delegator is the caller-asserted expectedDelegator, the EIP-712 signature verifies (EOA or ERC-1271), the delegation is not revoked as of the anchored block, and every caveat uses a recognized enforcer. Declared spend and target limits are reported in declaredLimits; attestations containing a delegation condition expire in 5 minutes.
  • Both types: Base (chainId 8453) only at launch, 1 credit, no Merkle proofs. Gated per key at ship time; that flag was removed the same day.
July 20, 2026

Robinhood Chain — 38 Chains

Feature
  • Robinhood Chain (chainId 4663) added to the EVM family — the Ethereum Layer-2 built on Arbitrum’s stack that Robinhood took to public mainnet on July 1, 2026, home of tokenized equities (Tesla, NVIDIA, Apple, SPY, and more as ERC-20 stock tokens) and the USDG stablecoin. Standard wallet field, standard EVM semantics.
  • Every EVM condition type works on day one: token_balance (including tokenized-stock holdings), nft_ownership, ratio_to_amount, and ratio_to_supply on POST /v1/attest. A wallet can now prove “holds at least N tokenized shares” the same way it proves any other balance condition — signed boolean out, raw balance never exposed.
  • Merkle storage proofs (EIP-1186) supported — Robinhood Chain joins the proof-capable set, now 28 of 32 EVM chains.
  • Total chain coverage: 32 EVM + Solana + XRPL + Bitcoin + Tron + Stellar + Sui = 38 chains.
June 10, 2026

Wallet Auth v2 — Domain-Separated Signing, Decimal-String Thresholds, Ratio Conditions on v2

Security Feature
  • Every newly created API key now signs with a versioned, domain-separated scheme (v2) on POST /v1/attest and POST /v1/trust. Same ECDSA P-256 key, stronger binding: each signature is tagged to its message type, so an attestation signature and a trust-profile signature can’t be replayed across contexts. v1 stays byte-frozen for existing keys — nothing changes for a key issued before today.
  • On v2 keys, agent-supplied quantities are decimal strings, not JSON numbers: token_balance.threshold and the ratio fields multiple / amount / minFraction (e.g. "100", "0.005"). This carries an exact, full-precision value that a JSON float would silently round — the thresholds an agent composes stay lossless. A JSON number returns 400 with a self-correcting message. v1 keys still accept either, and a string is valid on both.
  • GET /v1/jwks now publishes three key IDs — insumer-attest-v1, insumer-attest-v2, and insumer-trust-v2 — all the same public key. The kid on every response tells a verifier which scheme and domain to check against. The signature proves we issued it; the blockchain proves we were correct.
  • ratio_to_amount and ratio_to_supply now sign under v2. On a v2 key their quantities are decimal strings, and ratio_to_supply uses an exact-rational share-of-supply comparison with no float in the signed bytes. Same 1-credit cost, same signed boolean output.
  • Offline verification is unchanged in shape: insumer-verify (npm) checks both insumer-attest-v1 and insumer-attest-v2 signatures and re-derives conditionHash locally.
June 5, 2026

White-Label Scanner — Partner-Run Point-of-Sale on the Merchant API

Endpoint Security
  • New X-API-Key endpoints let a partner run its own branded scanner against merchants it manages — no account of its own. The partner builds only UI; InsumerAPI does all the cryptographic verification.
  • POST/GET /v1/merchants/{id}/scanners — add, remove, and list a merchant's in-person scanner PINs (4–8 digits, a limited number per merchant, never returned). Owner key only.
  • POST /v1/scanner/session — validate a scanner PIN and return the merchant config for a login-less branded scanner. 5 failed attempts / 15 min lockout.
  • POST /v1/pass/verify — verify a scanned pass: checks the InsumerAPI ECDSA signature on the QR, enforces 65-second freshness, then computes the discount against the merchant config. A bad signature is rejected with no discount.
  • POST /v1/registry/submit — submit a token/NFT to the public registry as pending for review (free, no credits; idempotent per chain + address; records a source provenance tag).
  • Merchant API deltas: POST /v1/merchants accepts an optional externalId for idempotent upsert; PUT /v1/merchants/{id}/tokens accepts per-token name/logo for the directory listing; POST /v1/merchants/{id}/directory accepts { "listed": false } to unpublish, and partner-provisioned merchants must pass domain verification before publishing.
  • PUT /v1/merchants/{id}/verification — a designated white-label partner can record that it verified an org's domain in its own branded flow (so the operator never sees an Insumer-branded challenge). Restricted to partner-enabled keys; self-serve merchants keep the DNS/meta/file challenge flow.
  • No pass “sign” endpoint. Signing is the InsumerAPI primitive — it only signs wallet state it computed itself, and signing is never exposed as a public API call. A white-label wrapper scans and verifies passes that InsumerAPI issued; it never mints signatures.
June 1, 2026

Dimensionless Conditions — ratio_to_amount and ratio_to_supply on /v1/attest

Feature
  • Two new condition types on POST /v1/attest express access rules as relationships, not fixed numbers, so a single rule means the same thing on every chain and over time with no re-tuning. Purely additive: the five existing condition types and the ECDSA-signed boolean output are unchanged.
  • ratio_to_amount — met iff balance >= multiple × amount. A self-scaling check for agent spending: “hold at least 10× the size of the transaction the agent intends to make,” which adjusts itself to every payment instead of a flat cap. amount is in token/display units (e.g. 100 for 100 USDC, not base units). RPC EVM chains. The evaluatedCondition carries multiple, amount, and the derived threshold.
  • ratio_to_supply — met iff balance / totalSupply() >= minFraction, a fraction in (0, 1] (e.g. 0.005 for 0.5% of supply). Share-of-supply gating for project and governance tokens, where your slice of supply represents your stake. RPC EVM chains, ERC-20 contracts only. Operator gte_fraction.
  • Reproducible by design. For ratio_to_supply, the result carries the raw totalSupply read and the computed fraction as siblings — inside the ECDSA-signed payload but outside conditionHash, which stays a pure fingerprint of the rule. A verifier re-reads balance and totalSupply at the pinned blockNumber and re-derives the boolean. Decimals cancel in the ratio, so the comparison is exact.
  • No change to the signing path, kid, the conditionHash algorithm, or credit cost (1 credit, same as any attest condition). OpenAPI Condition, EvaluatedCondition, and AttestationResult schemas updated with the new type values and the multiple / amount / minFraction fields plus the totalSupply / fraction result fields.
May 20, 2026

Wallet Auth Default — New Agents Skip the API Key, Scope Widens to Five Endpoints

Feature
  • POST /v1/keys/buy accepts a new optional keyDelivery body field ("wallet" | "apiKey" | "both", default "wallet"). On EVM purchases where the Insumer Access pass mints successfully, the default response omits the API key string entirely — the wallet + pass is the credential and there is nothing for the agent to store or leak. Callers that prefer a bearer key (legacy HTTP clients, cold-storage backup) opt in with keyDelivery: "apiKey". The key is always returned on non-EVM purchases (Solana, BTC, Tron) and on deferred mints so no buyer is ever left without a usable credential. The response now also carries authMethod ("wallet" | "apiKey" | "both") and, on the wallet path, a human-readable authHint.
  • Wallet Auth scope widened from one endpoint to five. Authorization: Wallet is now accepted on POST /v1/attest, POST /v1/trust, POST /v1/trust/batch, GET /v1/credits, and POST /v1/credits/buy. Other endpoints continue to return 501 for this scheme. An SBT-holding agent can now run the full read-side lifecycle — attest against conditions, generate wallet trust profiles, batch-profile counterparties, check own balance, and top up credits — without ever handling an API key.
  • updateWallet: true on POST /v1/credits/buy is ignored for wallet-auth callers. The SIWE signer is already bound to the registered wallet, and the soulbound Insumer Access pass cannot follow a rotation, so honouring the rewrite would silently lock the caller out on the next sign-in. To rotate the registered wallet, use X-API-Key auth.
  • All existing X-API-Key flows are unchanged on every endpoint. Blog post: Your Agent Doesn't Need an API Key.
May 19, 2026

Wallet Auth Goes Live on /v1/attest — Insumer Access Pass Dogfood

Feature
  • The Insumer Access pass collection — non-transferable ERC-721 on Base mainnet (0x3E2a408cc6eceba04FF9d04A5B8B05aBa8DD50ce) — went live on May 18. POST /v1/keys/buy now mints a pass to the EVM sender wallet on every purchase. The pass is the wallet's lifetime membership token, never expires, and cannot follow a rotation.
  • New auth method on POST /v1/attest: an Authorization: Wallet header carrying a SIWE (EIP-4361) envelope from a pass-holding wallet, in place of X-API-Key. The signing wallet must match the wallet that bought the key and must hold the pass on Base. Single-use nonce; Issued At must be within the last 5 minutes. We dogfooded the pattern on our own API first so we could speak from the experience of running it.
  • Wire format: Authorization: Wallet <base64(JSON({message, signature}))> where message is a SIWE string with domain api.insumermodel.com and signature is an EIP-191 personal_sign. Existing X-API-Key auth on /v1/attest is unaffected.
May 14, 2026

Tron, Stellar, Sui, and XDC — 37 Chains, Institutional Stablecoins Expanded

Feature
  • Three new non-EVM chains. POST /v1/attest now accepts tronWallet (T-prefixed base58, 34 chars) with chainId: "tron" for native TRX and TRC-20 tokens including USDT-TRC20; stellarWallet (G-prefixed StrKey, 56 chars) with chainId: "stellar" for native XLM and classic trustlines (use the new assetCode field for trustline assets); and suiWallet (0x + 64 hex) with chainId: "sui" for native SUI and Sui-native tokens via fully-qualified Move type strings.
  • XDC (chainId 50) added to the EVM family. Standard wallet field; xdc... addresses are auto-normalized to 0x... form.
  • New stablecoin coverage in the institutional_stablecoins base dimension on /v1/trust: USDC on Stellar, BENJI (Franklin OnChain U.S. Government Money Fund) on Stellar, and USDC on Sui. All three always run in the base profile.
  • Trust profile expanded to up to 49 checks across 27 chains in 9 dimensions (5 base + 4 optional). New optional dimension Tron (USDT-TRC20) activates when tronWallet is supplied; existing Solana, XRPL, and Bitcoin optional dimensions carry forward.
  • USDT-TRC20 added as a payment chain for /v1/keys/buy and /v1/credits/buy. Send to the Tron platform wallet, submit txHash with chainId: "tron". Stellar and Sui are read-only — not payment chains. Merchant token-tier configuration (/v1/merchants/{id}/tokens, /v1/merchants/{id}/nfts) still covers EVM + Solana + XRPL only (33 chains).
  • Per-chain freshness anchors preserved across all signed payloads. Stellar carries ledgerIndex + ledgerHash (parallel to XRPL); Sui carries checkpointSequence + checkpointDigest.
  • Total chain coverage: 31 EVM + Solana + XRPL + Bitcoin + Tron + Stellar + Sui = 37 chains. Blog post: Wallet Auth Now Reads Tron, Stellar, Sui, and XDC.
May 13, 2026

IETF Internet-Draft — Wallet State Attestation (Individual Submission)

Spec Ecosystem
  • Filed draft-borthwick-wallet-state-attestation-00 to the IETF Datatracker. Individual submission, Informational, 19 pages, expires November 14, 2026. Archived .txt at ietf.org/archive/id.
  • Documents the wallet-state attestation primitive — an issuer reads canonical on-chain state for a specified wallet address, evaluates one or more operator-defined conditions, and returns a cryptographically signed boolean (or structured fact profile) that any verifier can check offline using a published JWKS endpoint. The primitive enables condition-based access without identity presentation, credential exchange, or trust in the issuer at runtime.
  • Profiles existing IETF building blocks (JWT, JWKS, JOSE) for the wallet-state-attestation use case. Defines request/response surface, ES256 signing-algorithm posture, JWKS discovery, JWT format, optional EIP-1186 Merkle proofs, and security and privacy considerations. Solo Informational draft; references the environment.* constraint family Internet-Draft (May 12) and other public adoption artifacts informatively.
May 12, 2026

IETF Internet-Draft — environment.* constraint family (Independent Submission)

Spec Ecosystem
  • Filed draft-borthwick-msebenzi-environment-state-00 to the IETF Datatracker. Independent Submission stream, Informational, 43 pages, expires November 12, 2026. Archived .txt at ietf.org/archive/id.
  • Defines the environment.* constraint family for autonomous-agent mandate vocabulary — membership criterion, family-wide fields, composition discipline, register discipline, security considerations, and IANA registry mechanics. Does not define any individual constraint type.
  • Co-drafted with Michael Msebenzi (Headless Oracle). Each author maintains their own type specification in parallel — InsumerAPI for environment.wallet_state, Headless Oracle for environment.market_state — with the family-definition Internet-Draft the converged parent document. Both type specifications are referenced informatively in Appendix A.
May 7, 2026

mppx adapter upgraded to condition-gate — four condition types (v2.0.0)

Ecosystem
April 24, 2026

ERC-8183 Envelope-in-Action Case Library — Co-maintainer

Spec Ecosystem
  • Publicly-named co-maintainer of the neutral erc-8183-cases GitHub org alongside Raul Jäger (ThoughtProof) and Pablo Lopez (RNWY).
  • Authored InsumerAPI’s case in the library: pre-commit wallet auth via /v1/attest returning a signed-boolean attestation against an ERC-8183 envelope. Also authored Skye Meta’s case.
  • Charter scopes the library to compliance/regulatory how-to material, not spec governance. Announcement: Ethereum Magicians post.
April 21, 2026

Merkle proofs now available on Taiko

Feature
  • Taiko (167000) joins the list of chains where proof: "merkle" returns full EIP-1186 storage proofs. Verified live via a USDC condition against a holder wallet: mappingSlot: 9, 7-node accountProof, storageProof value matches the raw balance.
  • Total: 27 of 31 EVM chains now support Merkle proofs. The three remaining (Ronin, Moonriver, Viction) do not expose eth_getProof.
  • Merkle proofs are available on Taiko, which supports eth_getProof. No backend change; the documentation states it.
  • Storage proofs may be unavailable for tokens with non-standard storage layouts.
April 21, 2026

Bitcoin tip anchor in signed attestation results

Feature
  • Bitcoin condition results now include blockHeight (integer) and blockHash (64-character hex) inside the ECDSA-signed payload — the Bitcoin chain tip at the time of wallet state observation.
  • Semantically different from EVM and Solana anchors: Bitcoin’s UTXO model does not permit reproducible balance-at-block queries, so the anchor is evidence-of-freshness, not a bind to the specific block’s state. Verifiers can confirm the reading was no older than the reported tip.
  • If the tip lookup fails, the API returns 503 instead of signing a partial result — the same “refuse to sign what we can’t verify” invariant that already governs EVM, Solana, and XRPL paths.
  • With this change, every signed InsumerAPI attestation across all 37 chains carries a chain-specific point-in-time anchor: blockNumber+blockTimestamp on EVM, slot on Solana, ledgerIndex+ledgerHash on XRPL, blockHeight+blockHash on Bitcoin.
  • Affected endpoints: POST /v1/attest, POST /v1/trust, POST /v1/trust/batch.
  • No request-shape change. Fields are additive; existing consumers are unaffected.
  • OpenAPI AttestationResult and TrustCheck schemas updated with the new blockHeight and blockHash fields.
April 21, 2026

Block anchor guaranteed on every signed EVM attestation

Feature
  • blockNumber and blockTimestamp are now present on every signed result across all 31 EVM chains. A verifier can rely on the anchor fields being present on every signed result.
  • If either eth_blockNumber or eth_getBlockByNumber fails, the API now returns 503 with a retryable error payload (no credits charged) instead of signing a partial result.
  • Affected endpoints: POST /v1/attest, POST /v1/trust, POST /v1/trust/batch.
  • OpenAPI AttestationResult and TrustCheck schema descriptions updated; the “26 of 31” carve-out for Taiko, Ronin, Moonriver, and Viction no longer applies: those chains return the same anchor fields as every other EVM chain.
April 21, 2026

Solana slot anchors in signed attestation results

Feature
  • Solana condition results now include a slot field (integer) identifying the Solana ledger slot at which the wallet state was read. Parallel to blockNumber on EVM chains and ledgerIndex on XRPL.
  • The slot is inside the ECDSA-signed payload, so verifiers can independently reproduce the read by querying wallet state at the signed slot or later.
  • Affected endpoints: POST /v1/attest, POST /v1/trust, POST /v1/trust/batch.
  • No request-shape change. Field is additive; existing consumers are unaffected.
  • OpenAPI AttestationResult and TrustCheck schemas updated with the new slot field.
April 13, 2026

insumer-skill — Wallet Auth for Claude Code

SDK
  • New Claude Code skill that helps developers add wallet auth to their projects from inside Claude Code. Activates on phrases like "add wallet verification", "gate by token holdings", "token gating", "on-chain eligibility", "condition-based access", or "wallet_state".
  • Emits signature-verifying integration code on the first try. Hard-stop guardrails on inline keys, unverified responses, raw balance leaks, and incorrect USDC decimals (defaults to 18, must be 6).
  • Reference example included: an Express middleware that gates an endpoint by USDC balance on Base, with offline JWKS verification via jose. Verified end-to-end on April 13.
  • Install: smithery skill add douglasborthwick/insumer-skill.
  • Published on Smithery. Source on GitHub.
  • Different surface from the MCP server: this is for writing wallet auth into your own projects at build time; the MCP server is for calling the API at runtime from an agent. Same API underneath.
April 12, 2026

@insumermodel/plugin-eliza v2.0.0 — Scoped Package Rename

SDK
  • ElizaOS plugin renamed from eliza-plugin-insumer to @insumermodel/plugin-eliza to match the elizaOS registry format convention (all entries in index.json use @org/plugin-name).
  • Published to npm: @insumermodel/plugin-eliza@2.0.0. Same 10 actions, same source code, zero functional changes.
  • Old unscoped package eliza-plugin-insumer deprecated on npm pointing to the new name.
  • Install: npm install @insumermodel/plugin-eliza.
April 10, 2026

Multi-Attestation Payload Format v1.1 — Nine issuers, ten signed dimensions

Spec Ecosystem
  • The Multi-Attestation Payload Format defines a composable envelope for nine independent issuers contributing ten signed dimensions: InsumerAPI (wallet state, 37 chains), Revettr (compliance risk), ThoughtProof (reasoning integrity), RNWY (behavioral trust + wallet intelligence — two dimensions), Maiat (job performance), APS (passport grade), AgentID (trust verification), AgentGraph (security posture), and SAR (settlement witness).
  • Skye Meta’s SkyeProfile is the multi-issuer orchestrator product built on this format; InsumerAPI contributes the wallet-state dimension and publishes the spec.
  • Each attestation is self-describing — carries its own algorithm, key identifier, and JWKS discovery endpoint. No shared registry or coordination between issuers required. A relying party selects attestations by type, fetches each issuer’s public key via standard JWKS, and verifies signatures independently.
  • Reference verifier (multi-attest-verify.js) resolves the JWKS, fetches a live attestation, and returns a verified result with no issuer cooperation beyond the published endpoints.
  • Blog post: Would You Trust Your Agent? KYA Is Real.
April 10, 2026

agent-governance-vocabulary — Co-author of vocabulary.yaml

Spec Ecosystem
  • Co-author of vocabulary.yaml and sole author of the insumerapi.yaml crosswalk in aeoess/agent-governance-vocabulary, merged via PR #1.
  • The vocabulary names wallet-auth and condition-based-access primitives unambiguously, so signed attestations from one issuer can be referenced cleanly by another across the agentic-commerce ecosystem.
March 28, 2026

Revettr Integrates /v1/trust for Counterparty Risk Scoring

Ecosystem
  • Revettr integrates POST /v1/trust as the wallet analysis signal in their counterparty risk scoring API. Trust profile dimensions surface at signal_scores.wallet.details.insumer_trust in every Revettr score response
  • Revettr scores wallets, domains, IPs, and company names for x402 agent commerce — “should this agent send money to this counterparty?” Wallet auth provides the on-chain verification layer alongside domain intelligence, IP intelligence, and sanctions screening
March 25, 2026

Native Bitcoin Support (33 Chains)

Feature
  • Native BTC balance checks via bitcoinWallet parameter on POST /v1/attest and GET /v1/trust. Supports P2PKH (1...), P2SH (3...), bech32 (bc1q...), and Taproot (bc1p...) addresses
  • New Bitcoin Holdings dimension in trust profiles — pass bitcoinWallet to add a native BTC balance check alongside stablecoins, governance, NFTs, staking, Solana, and XRPL
  • Confirmed-only balance (no unconfirmed transactions), consistent with XRPL’s validated-ledger pattern. Same ECDSA-signed boolean output — no balances exposed
  • Total chain coverage: 30 EVM + Solana + XRPL + Bitcoin = 33 chains
March 24, 2026

UCP Capability Proposal — dev.ucp.shopping.eligibility

Spec Ecosystem
  • Co-authored Universal Commerce Protocol Discussion #297 with zologic (UCPReady, WooCommerce).
  • Capability adds condition-based access at merchant checkout: wallet state evaluated against merchant-defined conditions, returned as a signed-boolean attestation. Reference implementation pairs InsumerAPI /v1/attest with Skye Meta’s SkyeWoo.
March 23, 2026

MPP Extensions Directory — First Community Package Listed

Ecosystem
  • @insumermodel/mppx-token-gate listed as the first entry on Tempo’s new Extensions page. Wraps any MPP Method.Server to grant free access to token holders — one API call checks ownership across 37 chains and returns a signed receipt
  • Tempo maintainers created the extensions directory specifically to house community-built integrations. MPP is the payment protocol behind Stripe’s crypto payments infrastructure
March 23, 2026

SettlementWitness Integrates /v1/attest for Pre-Transaction Verification

Ecosystem
  • SettlementWitness integrates POST /v1/attest as the pre-transaction verification layer in their Settlement Attestation Record (SAR) flow. Wallet auth qualifies agents going in, SAR verifies delivery coming out
  • Pre/post pattern for x402 agent commerce: InsumerAPI attestation confirms the counterparty holds what they claim before payment, SettlementWitness confirms the deliverable after settlement
March 23, 2026

Multi-Attestation Payload Format — Composable Verification Across Independent Issuers

Feature
  • Published the Multi-Attestation Payload Format spec. Four independent issuers (InsumerAPI, ThoughtProof, RNWY, Maiat) sign attestations across four trust dimensions. One envelope, one verification pass, any combination of issuers.
  • Skye Meta’s SkyeProfile is the multi-issuer orchestrator product built on this format; InsumerAPI contributes the wallet-state dimension and publishes the spec.
  • Reference verifier multi-attest-verify.js shipped in insumer-examples. Zero dependencies, supports ES256 (P-256) and EdDSA (Ed25519), handles both raw P1363 signatures and JWT compact JWS
  • Blog post: Four Issuers, One Verification Pass
March 16, 2026

AgentTalk by Skye Meta — Condition-Gated Agent Communication

Feature
  • AgentTalk by Skye Meta: condition-gated communication layer for AI agents using POST /v1/attest. Agents declare wallet conditions, join channels, and receive per-agent ECDSA-signed attestation JWTs. Sessions re-verify on demand. Sell the token, lose the session
  • Supports composable conditions (up to 10 per channel) across 31 chains. Agents buy their own InsumerAPI keys with USDC via POST /v1/keys/buy. 10 free attestation calls per agent
  • channel parameter added to POST /v1/keys/buy for partner revenue share tracking
March 15, 2026

SkyeWoo WooCommerce Plugin — Token-Gated Products & Wallet-Verified Discounts

Feature
  • SkyeWoo by Skye Meta: WooCommerce plugin for condition-based products using POST /v1/attest. Restrict product visibility and purchases based on wallet conditions. Wallet-verified discounts apply automatically at checkout. No coupon codes to leak
  • Connects MetaMask, Phantom, and Coinbase Wallet simultaneously. 31 chains (30 EVM + Solana). Up to 10 conditions per product. Server-side enforcement
  • Added to homepage Use Cases, For Businesses page, and blog tutorial
March 14, 2026

SkyeGate WordPress Plugin — No-Code Condition-Based Access

Feature
  • SkyeGate by Skye Meta: WordPress plugin for condition-based content access using POST /v1/attest. Gate any page, post, or block with a shortcode. Connects MetaMask, Phantom, and Coinbase Wallet simultaneously
  • No Web3 code required — plugin handles multi-wallet connection, verification via InsumerAPI, and server-side condition-based access. 31 chains supported (30 EVM + Solana). Up to 10 conditions per gate
  • Added to homepage Use Cases, For Businesses page, and blog tutorial
March 14, 2026

Native gas token balance verdicts across 31 EVM chains

Feature
  • POST /v1/attest returns native gas token balance verdicts (ETH, POL, BNB, AVAX, etc.) accurately on all 31 EVM chains when contractAddress: "native" is set. Native balances flow through eth_getBalance lookups, distinct from ERC-20 balanceOf calls used for token balance evaluation.
  • Native SOL balance checks on Solana.
  • Applies to both standard and Merkle proof attestation paths on EVM. XRPL native XRP balance checks operate on a separate code path.
March 13, 2026

UCP Spec Contributions — Signals, Eligibility & Attestation Extension

Feature Docs
  • Contributed to two merged specs in the Universal Commerce Protocol (UCP), the open commerce standard backed by Shopify.
  • #203 — Signals for authorization & abuse: shaped the cryptographic attestation signal pattern (provider_jwks / kid / payload / sig) now in the spec. Suggestions for kid field and full signed payload accepted by spec author.
  • #250 — Eligibility claims & verification contract: contributed the attestation-as-proof model for non-instrument eligibility claims (token holdings, on-chain attestations). Spec author invited a companion attestation extension.
  • #264 — Attestation extension (proposed): submitted capability extension adding cryptographic attestation proofs to eligibility claims. Follows the discount extension pattern. Enables offline verification of claims via JWKS — no callback to the platform or attestation provider required.
  • InsumerAPI is the first production implementation of the UCP attestation pattern — POST /v1/attest output maps directly to the extension wire format.
March 11, 2026

eliza-plugin-insumer v1.2.1 — Full Autonomous Agent Lifecycle (10 Actions)

SDK Feature
  • eliza-plugin-insumer expanded from 4 to 10 actions covering the complete autonomous agent lifecycle — no human required at any step: BUY_API_KEY, CREATE_MERCHANT, CONFIGURE_TOKENS, ADD_CREDITS, VERIFY_WALLET, CHECK_TRUST, CHECK_TRUST_BATCH, ACP_DISCOUNT, UCP_DISCOUNT, CONFIRM_PAYMENT.
  • 6 new actions: merchant onboarding (create, configure tokens, add credits), ACP/UCP commerce protocol integration, and payment confirmation.
  • Adds currency field to token config for XRPL trust line support; refines ACP/UCP discount display to read correct response fields.
March 11, 2026

POST /v1/keys/buy — Agent-Friendly Key Purchase with USDC

Feature SDK Docs
  • New public endpoint POST /v1/keys/buy — buy an API key with USDC, no email or prior authentication required. The sender wallet from the on-chain transaction becomes the key’s identity. One key per wallet.
  • Designed for autonomous AI agents: send USDC to the platform wallet, submit the tx hash, receive an API key with credits. Volume discounts apply ($0.04–$0.02/call).
  • Existing email-based key creation (POST /v1/keys/create) remains unchanged for human developers.
  • mcp-server-insumer v1.8.0: new insumer_buy_key tool.
  • langchain-insumer v0.10.0: new InsumerBuyKeyTool (26 tools total).
  • eliza-plugin-insumer v1.1.0: new BUY_API_KEY action (4 actions total).
  • OpenAPI spec, API reference (26 endpoints), and all SDK READMEs updated.
March 10, 2026

Sender Wallet Verification on USDC Credit Purchases

Feature SDK
  • POST /v1/credits/buy and POST /v1/merchants/{id}/credits now verify the on-chain sender. First purchase registers the sender wallet to the API key. Subsequent purchases must come from the same sender.
  • New optional updateWallet parameter (boolean): set to true to change the registered wallet. The verified USDC transfer from the new address proves ownership.
  • mcp-server-insumer v1.7.14 published to npm with updateWallet on both buy credits tools.
  • langchain-insumer tools updated with update_wallet parameter.
  • OpenAPI spec, GPT specs, LLM specs, API reference, Postman collection, and workbench schema updated.
March 8, 2026

langchain-insumer v0.9.13 — XRPL ledgerHash & trustLineState docs

SDK Docs
  • langchain-insumer v0.9.13 published to PyPI: added XRPL response field documentation to attest() docstring and README — ledgerHash, trustLineState: { frozen }, and frozen trust line behavior (met: false).
  • InsumerChat knowledge base updated with XRPL response field documentation.
March 10, 2026

AsterPay KYA Integration — ERC-8183 Agent Trust Scoring

Feature
  • AsterPay KYA case study published: Know Your Agent trust scoring for ERC-8183 agentic commerce using POST /v1/attest with 4 conditions (USDC balance, Coinbase KYC, country verification, Gitcoin Passport) in a single API call
  • Contracts deployed on Base Sepolia. Open source at github.com/AsterPay/erc8183-kya-hook
March 5, 2026

RPC Failure Handling — “If we can’t verify, we don’t sign”

Feature SDK
  • 5 signing endpoints now return HTTP 503 with error.code: "rpc_failure" when an upstream data source is unavailable after retries. No attestation signed, no JWT issued, no credits charged. Retryable after 2–5 seconds.
  • Response includes failedConditions array identifying which source and chain failed.
  • Affected endpoints: POST /v1/attest, POST /v1/trust, POST /v1/verify, POST /v1/acp/discount, POST /v1/ucp/discount. (POST /v1/trust/batch handles failures per-wallet and always returns 200.)
  • insumer-verify v1.3.0, mcp-server-insumer v1.7.5, langchain-insumer v0.9.7, eliza-plugin-insumer v1.0.4 published with rpc_failure documentation.
  • OpenAPI spec updated with RpcFailureEnvelope schema on all 5 endpoints.
March 4, 2026

Wallet Auth by InsumerAPI

Feature SDK
  • New format: "jwt" parameter on POST /v1/attest returns an ES256-signed JWT bearer token alongside the standard attestation response. No additional cost.
  • JWT claims include pass, results, conditionHash, blockNumber, and blockTimestamp. 30-minute expiry. Verifiable via JWKS at /.well-known/jwks.json or GET /v1/jwks.
  • Compatible with any JWKS-aware API gateway (Kong, Nginx, Cloudflare Access, AWS API Gateway, Azure APIM, Traefik, Envoy).
  • insumer-verify v1.2.0 published to npm: auto-detects JWT string vs attestation object.
  • mcp-server-insumer v1.7.3, langchain-insumer v0.9.5, eliza-plugin-insumer v1.0.2 updated with Wallet Auth support.
March 1, 2026

mcp-server-insumer v1.6.2

SDK
  • mcp-server-insumer v1.6.2 published to npm: updated README with langchain-community PR #549 cross-reference, wallet trust tool descriptions now reflect optional Solana + XRPL dimensions (up to 20 checks), batch wallet trust mentions xrplWallet parameter, aligned version strings in server.json and src/index.ts
March 1, 2026

langchain-insumer v0.9.1, langchain-community PR Updated to 25 Tools, Example Repos XRPL

SDK Feature
  • langchain-insumer v0.9.1 published to PyPI: adds XRPL usage examples to README (native XRP, RLUSD trust line, wallet trust with XRPL dimensions); wallet trust tool description now reflects optional Solana + XRPL dimensions (up to 20 checks)
  • langchain-community PR #549 updated to 25 tools: adds xrpl_wallet to 5 existing tools (attest, wallet_trust, batch_wallet_trust, check_discount, verify), adds 5 new tools (acp_discount, ucp_discount, request_domain_verification, verify_domain, validate_code), exports InsumerComplianceTemplates in __all__, adds World Chain (480) to Merkle proof chain list
  • acp-ucp-onchain-eligibility-example repo: adds XRPL examples across all flows (attest, trust, merchant onboarding, ACP, UCP, credits); full_agent_flow.py now carries auth headers across all flows
  • insumer-examples repo: added XRPL verification to Python, Node.js, and bash examples, added XRPL curl examples to README
March 1, 2026

XRPL Across All SDKs, GPT Upgraded to 25 Actions

SDK Feature Spec
  • mcp-server-insumer v1.6.0 published to npm (updated to v1.6.2 same day): xrplWallet parameter on all 7 wallet-accepting tools, XRPL added to ChainId, OnboardingChainId, and UsdcChainId schemas, new currency field for trust line tokens, taxon field for NFT collections, xrplAddress in USDC payment settings
  • langchain-insumer v0.9.0 published to PyPI: xrpl_wallet parameter on attest, wallet_trust, check_discount, verify, acp_discount, and ucp_discount tools and wrapper methods (updated to v0.9.1 same day)
  • InsumerAPI Verify GPT upgraded from 13 to 25 actions, matching full SDK parity. New actions: merchant onboarding (create, status, tokens, NFTs, settings, directory, domain verification), credit purchases, JWKS, and payment confirmation
  • GPT system instructions updated with guardrails: prompt extraction protection, anti-reverse-engineering, and IP protection while keeping all 25 actions fully usable
  • GPT OpenAPI spec (openapi-gpt.yaml) updated with XRPL parameters across all endpoints and legacy server removed
March 1, 2026

USDC on XRP Ledger; XRPL NFT validation refined

Feature
  • Adds native USDC on XRPL (Circle issuer rGm7WCVp9gb4jZHWTEtGUr4dd74z2XuWhE) as second check in the XRPL trust dimension. Wallet trust profiles now support up to 20 checks across 6 dimensions
  • USDC can now be verified across 9 chains in a single POST /v1/attest call: Ethereum, Base, Polygon, Arbitrum, Optimism, BNB Chain, Avalanche, Solana, and XRP Ledger
  • Adds "xrpl" to OnboardingChainId enum in OpenAPI spec, enabling merchants to configure XRPL tokens via PUT /v1/merchants/:id/tokens
  • Adds xrplWallet parameter documentation to commerce (/v1/acp/discount, /v1/ucp/discount), verification, and API reference developer pages
  • Refines XRPL nft_ownership validation: the currency field is now only required for token_balance conditions on trust line tokens.
March 1, 2026

XRP Ledger Integration (32 Chains)

Chains Endpoint Feature
  • XRP Ledger added as 32nd supported chain (chainId: "xrpl"). Native XRP balance checks, trust line token verification (RLUSD, any issued token), and NFT ownership verification
  • xrplWallet field on all 7 wallet-accepting endpoints: POST /v1/attest, POST /v1/trust, POST /v1/trust/batch, GET /v1/discount/check, POST /v1/verify, POST /v1/acp/discount, POST /v1/ucp/discount
  • New condition fields: currency (XRPL currency code, auto hex-encoded) and taxon (optional NFT filter)
  • XRPL dimension added to wallet trust profiles: RLUSD + USDC checks (up to 20 total checks with Solana + XRPL)
  • Dual RPC with automatic failover across XRPL nodes
  • Large wallets with many trust lines and NFTs are read in full
  • Response includes ledgerIndex and ledgerHash (XRPL equivalent of block number/hash) for freshness and snapshot verification
  • Frozen trust line detection: attestation returns met: false for frozen trust lines even if balance exceeds threshold, with trustLineState: { frozen: true } in the result
  • Updated openapi.yaml, llms.txt, llms-full.txt, and all marketing/blog pages to reflect 32-chain support
February 28, 2026

State Attestation Spec, Custom API Domain, Security Hardening

Spec Feature Security
  • Published State Attestation Specification v1 for integrators
  • Custom API domain live: api.insumermodel.com
  • SRI hashes on all external scripts, redirect validation, admin auth hardening
  • Two-pool credit system documented: API credits (per key) and merchant credits (per merchant)
  • Added version: 1.0.0 to llms.txt and llms-full.txt for agent cache invalidation
  • Developer vertical pages: primitive cohesion notes, onboarding checklist, commerce failure responses
February 27, 2026

EAS Attestations, Compliance Templates, ACP/UCP, Farcaster, Developer Verticals

Endpoint SDK Feature
  • eas_attestation condition type with 5 pre-configured compliance templates: coinbase_verified_account, coinbase_verified_country, coinbase_one, gitcoin_passport_score, gitcoin_passport_active
  • GET /v1/compliance/templates endpoint for listing available templates
  • POST /v1/acp/discount and POST /v1/ucp/discount for OpenAI/Stripe ACP and Google UCP commerce protocol integration
  • farcaster_id condition type for social identity verification via IdRegistry on Optimism
  • Staking dimension added to trust profiles: stETH, rETH, cbETH positions
  • Restructured /developers/ into hub + 6 focused vertical pages: verification, trust, compliance, commerce, onboarding, api-reference
  • mcp-server-insumer v1.2.0 and langchain-insumer v0.5.0 with EAS + compliance tools
  • 26 API endpoints, 26 SDK tools (full parity)
February 26, 2026

Trust Profiles, Batch Trust, /v1/jwks Discovery Endpoint, Condition Hashing, insumer-verify

Endpoint SDK Feature
  • POST /v1/trust for ECDSA-signed wallet trust fact profiles across 4 dimensions (stablecoins, governance, NFTs, staking), 17 checks, 7 chains
  • POST /v1/trust/batch for profiling up to 10 wallets per request. Shared block fetches make batch 5-8x faster than sequential calls
  • GET /v1/jwks endpoint for public key discovery. Static JWKS also at /.well-known/jwks.json
  • kid field added to all signed responses for key rotation support
  • evaluatedCondition and conditionHash (SHA-256) in attestation results for tamper-evidence
  • blockNumber (hex) and blockTimestamp (ISO 8601) in RPC chain results for freshness verification
  • insumer-verify v1.1.3 published on npm: client-side ECDSA signature verification, condition hash checking, block freshness, and expiry validation. Zero dependencies
  • DJD Agent Score architecture pattern published: agent trust scoring in the Coinbase x402 ecosystem
February 25, 2026

Merkle Storage Proofs

Feature Spec
  • Optional proof: "merkle" parameter on POST /v1/attest and POST /v1/trust
  • Returns EIP-1186 Merkle storage proofs anchored to block headers for fully trustless verification without re-querying a chain
  • Available on 26 of 31 EVM chains (not available on Taiko, Ronin, Moonriver, Viction, Solana, or XRPL). 2 credits per attestation (double standard)
  • Privacy policy and terms updated for opt-in balance disclosure
February 24, 2026

Privacy Enforcement, CSP Hardening

Security Spec
  • Removed raw balance amounts from /v1/discount/check and /v1/verify responses. Booleans only by default
  • Removed unsafe-eval from CSP script-src across all pages
  • Added explicit privacy guarantees to Privacy Policy
  • Privacy-by-design language enforced across all docs and discovery files
February 22-23, 2026

Public API Launch, Self-Serve Keys, Agent SDKs, AI Discovery

Feature SDK Endpoint
  • Public API launched with X-API-Key authentication (insr_live_ prefix)
  • Self-serve API key provisioning: Free (10 credits), Pro ($29/mo, 1,000 credits), Enterprise ($99/mo, 5,000 credits)
  • POST /v1/attest, GET /v1/credits, POST /v1/credits/buy, and 8 merchant onboarding endpoints
  • AI agent discovery: llms.txt, llms-full.txt, openapi.yaml, ai-plugin.json
  • mcp-server-insumer published on npm. Listed on Official MCP Registry, awesome-mcp-servers, mcp.so, mcpservers.org
  • langchain-insumer published on PyPI
  • InsumerAPI Verify GPT live in GPT Store
  • GPT-optimized OpenAPI spec and system instructions for Actions
February 21, 2026

Clover POS Integration

Feature
  • Clover POS integration in dashboard: OAuth connect, automatic discount application at point of sale
  • Scanner shows Clover discount names from individual tier breakdown
  • Stripe and Clover positioned as complementary payment channels
February 20, 2026

31-Chain Expansion, Security Hardening

Chains Security
  • Expanded from 8 to 32 supported chains (30 EVM + Solana + XRPL)
  • New chains include Sonic, Gnosis, Mantle, Scroll, Linea, zkSync Era, Blast, Taiko, Ronin, Celo, Moonbeam, Moonriver, Viction, opBNB, World Chain, Unichain, Ink, Sei, Berachain, ApeChain
  • HSTS headers, CSP frame-src, XSS hardening, email validation, rate limiting
  • Removed unsafe-inline from CSP script-src
February 19, 2026

ECDSA Signing, For Foundations Page

Feature Security
  • ECDSA P-256 signatures on QR payloads and scanner verification
  • For Foundations page with chain request form and admin approval pipeline
  • AI crawlers explicitly allowed in robots.txt
  • translate="no" on brand names site-wide
February 15-16, 2026

NFC Tap-to-Verify, FAQ Page, Mailchimp Integration

Feature
  • NFC tap-to-verify flow: merchant programs NFC tag, customer taps, InsumerPass opens and verifies server-side
  • Dedicated FAQ page with 22 questions, JSON-LD schema, accordion expand/collapse
  • Mailchimp subscribe form on book page with customer journey welcome email
  • Organization JSON-LD with contact and social links for Knowledge Panel
February 11-14, 2026

Site Launch

Feature
  • Static site launched on Vercel (migrated from WordPress)
  • 13 marketing pages, 6 app pages, 12 blog articles
  • SEO: OG tags, Twitter Cards, canonical URLs, JSON-LD, sitemap
  • Google Analytics (GA4) across all pages
  • 301 redirects for old WordPress URLs
  • Mobile-responsive breakpoints at 768px and 480px on all pages
← Back to Developers Hub API Reference →