← InsumerAPICONTENT HISTORY

Update to InsumerAPI

Snapshot Oct 28, 2026 · 18:06 UTC · version 0.2.1

Collection source: downloaded plugin package.

WHAT CHANGED

First saved snapshot

No earlier snapshot is available to establish a change.

Save InsumerAPI and check future changes in Following.

Up to 10 plugins free · no card required.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "description": "InsumerAPI batch wallet trust profiles: the same curated bundle as insumer-trust, for up to 10 wallets in a single call. Use when the user wants InsumerAPI trust profiles for a list of wallets (for example screening an airdrop or allowlist with InsumerAPI). Each wallet's profile is independently signed; the response supports partial success.\n",
  "included_files": [
    {
      "relative_path": "scripts/trust_batch.py",
      "size_in_bytes": 12859
    }
  ],
  "name": "insumer-trust-batch",
  "skill_md_contents": "---\nname: insumer-trust-batch\ndescription: >\n  InsumerAPI batch wallet trust profiles: the same curated bundle as\n  insumer-trust, for up to 10 wallets in a single call. Use when the user wants\n  InsumerAPI trust profiles for a list of wallets (for example screening an\n  airdrop or allowlist with InsumerAPI). Each wallet's profile is independently\n  signed; the response supports partial success.\nmetadata:\n  version: \"0.4.3\"\n  author: InsumerAPI\n---\n\n# InsumerAPI Batch Wallet Trust Profile\n\nSame curated condition-based access bundle as `insumer-trust` (155 base checks across 27 chains in 10 dimensions, up to 176 checks across 29 chains in 14 dimensions with the optional wallets; `conditionSetVersion` `\"2026-10-08\"`), but accepts up to **10 wallets** in one request. Each wallet's profile is independently signed; the response supports partial success: a failure for one wallet does not fail the rest.\n\nEach wallet's profile is signed once, as a whole, by InsumerAPI, and signed twice: ES256 (`sig`, `kid`) and a post-quantum ML-DSA-65 signature (`pqSig`, `pqKid`). The `kid` is `insumer-trust-v2` on v2 keys and `insumer-attest-v1` on v1 keys: read it from each entry, never assume it. There are no per-dimension signatures and no signature over the batch. **Do not add an orchestrator wrap:** carry each signed profile exactly as issued.\n\n## Setup\n\n```bash\nexport INSUMER_API_KEY='insr_live_...'\n```\n\n## Reference values\n\n- **Endpoint**: `POST https://api.insumermodel.com/v1/trust/batch`\n- **Cost**: 3 credits per **successful** wallet (6 with `proof: \"merkle\"`). Failed wallets in the batch don't cost credits.\n- **Max wallets per call**: 10\n- **Profile ID format per wallet**: `TRST-XXXXX`\n\n## Request shape\n\n`wallets` is an **array of objects**, each with a required `wallet` field plus optional cross-chain wallet fields. (Not an array of plain strings.)\n\n```json\n{\n  \"wallets\": [\n    {\n      \"wallet\": \"0x1601843c5E9bC251A3272907010AFa41Fa18347E\",\n      \"solanaWallet\": \"DXK4yMpigbTSqv33nJk1tJucXB4E3rDmTXn3yZmiFAXt\"\n    },\n    { \"wallet\": \"0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb\" }\n  ]\n}\n```\n\n| Field per entry | Required | Notes |\n|---|---|---|\n| `wallet` | yes | EVM address, `0x` + 40 hex chars |\n| `solanaWallet` | optional | Adds the 14-check `solana` dimension to this wallet's profile and evaluates the Solana rows in institutional stablecoins |\n| `xrplWallet` | optional | Adds the `xrpl` dimension (RLUSD, USDC, OUSG) and evaluates the XRPL row in institutional stablecoins |\n| `bitcoinWallet` | optional | Adds the `bitcoin` dimension (native BTC) |\n| `tronWallet` | optional | Adds the `tron` dimension (USDT, USD1, WBTC) |\n| `stellarWallet` | optional | Evaluates the Stellar rows in the institutional stablecoins dimension; adds no dimension |\n| `suiWallet` | optional | Evaluates the Sui rows (USDC in institutional stablecoins, USDY in tokenized treasuries); adds no dimension |\n\nTop-level `proof: \"merkle\"` (optional) applies to all wallets in the batch and costs up to 6 credits per successful wallet (3 for a wallet whose profile carried no proof; a failed wallet costs nothing).\n\n## Response shape\n\nAbbreviated; the profile ids and counts are from real profiles of the two wallets above, and the batch totals are those of a two-wallet call (the first with its Solana wallet, so its profile has 11 dimensions and 169 checks; the second has the 10 base dimensions and 155 checks):\n\n```json\n{\n  \"ok\": true,\n  \"data\": {\n    \"results\": [\n      {\n        \"trust\": {\n          \"id\": \"TRST-74167\",\n          \"wallet\": \"0x1601843c5E9bC251A3272907010AFa41Fa18347E\",\n          \"conditionSetVersion\": \"2026-10-08\",\n          \"dimensions\": { ... },\n          \"summary\": { \"totalChecks\": 169, \"totalPassed\": 17, \"totalFailed\": 147, \"totalNotEvaluated\": 5, \"dimensionsWithActivity\": 4, \"dimensionsChecked\": 11 },\n          \"profiledAt\": \"2026-10-07T21:53:03.720Z\",\n          \"expiresAt\": \"2026-10-07T22:23:03.720Z\"\n        },\n        \"sig\": \"...\",\n        \"kid\": \"insumer-trust-v2\",\n        \"pqSig\": \"...\",\n        \"pqKid\": \"insumer-trust-pq1\"\n      },\n      {\n        \"trust\": {\n          \"id\": \"TRST-C7EA2\",\n          \"wallet\": \"0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb\",\n          \"conditionSetVersion\": \"2026-10-08\",\n          \"dimensions\": { ... },\n          \"summary\": { \"totalChecks\": 155, \"totalPassed\": 30, \"totalFailed\": 118, \"totalNotEvaluated\": 7, \"dimensionsWithActivity\": 7, \"dimensionsChecked\": 10 },\n          \"profiledAt\": \"2026-10-07T21:53:03.495Z\",\n          \"expiresAt\": \"2026-10-07T22:23:03.495Z\"\n        },\n        \"sig\": \"...\",\n        \"kid\": \"insumer-trust-v2\",\n        \"pqSig\": \"...\",\n        \"pqKid\": \"insumer-trust-pq1\"\n      }\n    ],\n    \"summary\": { \"requested\": 2, \"succeeded\": 2, \"failed\": 0 }\n  },\n  \"meta\": {\n    \"creditsCharged\": 6,\n    \"creditsRemaining\": ...\n  }\n}\n```\n\nEach entry in `data.results[]` is **either** a `{trust, sig, kid, pqSig, pqKid}` object (`pqSig` and `pqKid` are optional fields: check them when present) **or** `{error: { wallet, message }}`. Iterate, branch, and verify each `trust` independently with `insumer-jwks-verify`. Every profile lists its dimensions in the same fixed order: `stablecoins`, `governance`, `nfts`, `staking`, `institutional_stablecoins`, `tokenized_treasuries`, `stablecoin_deposits`, `wrapped_bitcoin`, `names`, `account`, then whichever of `solana`, `xrpl`, `bitcoin`, `tron` that wallet switched on, in that order. The `account` dimension (10 rows: contract code and EIP-7702 delegation on Ethereum, Base, Arbitrum, Optimism and Polygon) is a presence check on the wallet's own code state; in proof mode its rows carry `proof.available: false` with a reason pointing at `/v1/attest`.\n\n## Usage\n\n### Example 1: Two EVM wallets\n\n```bash\ncurl -X POST https://api.insumermodel.com/v1/trust/batch \\\n  -H \"X-API-Key: $INSUMER_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"wallets\": [\n      { \"wallet\": \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\" },\n      { \"wallet\": \"0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B\" }\n    ]\n  }'\n```\n\n### Example 2: Mixed cross-chain coverage per wallet\n\n```bash\ncurl -X POST https://api.insumermodel.com/v1/trust/batch \\\n  -H \"X-API-Key: $INSUMER_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"wallets\": [\n      {\n        \"wallet\": \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\",\n        \"solanaWallet\": \"5v9CXTpN3WHbM2jAYty88qDGz7P4yuMv8fnuPRXBPmiB\"\n      },\n      {\n        \"wallet\": \"0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B\",\n        \"xrplWallet\": \"rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH\",\n        \"bitcoinWallet\": \"bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq\"\n      }\n    ]\n  }'\n```\n\n### Example 3: Batch with Merkle proofs\n\n```bash\ncurl -X POST https://api.insumermodel.com/v1/trust/batch \\\n  -H \"X-API-Key: $INSUMER_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"wallets\": [\n      { \"wallet\": \"0x...\" },\n      { \"wallet\": \"0x...\" }\n    ],\n    \"proof\": \"merkle\"\n  }'\n```\n\nCost: up to `successful_wallets * 6` credits; a wallet whose profile carried no proof costs 3. Reveals raw on-chain balances. Only opt in if needed.\n\n## When to use batch vs single\n\n| Situation | Use |\n|---|---|\n| Single wallet | `insumer-trust` |\n| 2–10 wallets, same call | `insumer-trust-batch` |\n| More than 10 wallets | Loop over batches of 10 |\n| Different conditions per wallet | Loop over `insumer-attest` (custom conditions) |\n| Same custom conditions for many wallets | Loop over `insumer-attest` |\n\n## Code emission rules\n\n1. **Read the API key from an env var.** Never inline.\n2. **Iterate `data.results[]` and branch on `trust` vs `error`.** Don't assume every entry succeeded.\n3. **Verify each profile's signature independently.** The batch wrapper does not produce an aggregate signature; each entry in `data.results[]` carries its own `sig` and `kid`.\n4. **Cap at 10 wallets per call.** For larger lists, batch client-side.\n5. **Pre-validate wallet format** before sending. Invalid `wallet` formats fail validation for the entire request.\n6. **Backend only.** The API key is a backend credential.\n7. **Don't cache the verdict.** Wallet state changes.\n\n## Helper script\n\n`scripts/trust_batch.py`: Python helper. Reads `INSUMER_API_KEY` from env, accepts a wallet list via `--wallets-file` (one EVM address or one JSON object per line) or `--wallets w1,w2,w3`. Builds the proper array-of-objects request body.\n\n```bash\npython scripts/trust_batch.py --wallets-file allowlist.txt\n```\n\nThe script prints a summary per wallet (profile ID, held / not held / not evaluated counts, and the checks held in each dimension) and saves the complete signed response to a JSON file named in the summary; `--out PATH` chooses the file. The dimensions print in a fixed order, the same for every wallet: the ten base dimensions (`stablecoins` through `names`, then `account`), then `solana`, `xrpl`, `bitcoin`, `tron` where present. The `account` dimension reads \"present\" rather than \"held\" (its rows are code states at the wallet address, not holdings): for example `account: 5 of 10 present: Contract code on Ethereum, Contract code on Base, ...`. Read the summary to answer the user, and verify each entry of `data.results` in the saved file on the raw `sig` path (for example `verify_trust_profile` from the `insumer-verify` package, or the raw-sig instructions in `insumer-jwks-verify`). The script never overwrites a file; if it cannot save one, it prints the complete response instead, so a paid call is never lost. A full profile is tens of thousands of characters, so ten printed in full are more than an agent can read at once; `--full` prints the complete response as well as saving it. Profiles cannot be fetched again, so keep the saved file rather than calling a second time.\n\nFor per-wallet cross-chain coverage, put one JSON object per line in the `--wallets-file` (for example `{\"wallet\": \"0x...\", \"solanaWallet\": \"...\"}`), or call the API directly with curl.\n\n## Error handling\n\n| Status | Cause | Fix |\n|---|---|---|\n| `400` | Missing `wallets`, exceeds 10, or invalid wallet format | Validate addresses; split into ≤10 batches |\n| `401` | Invalid API key | See `insumer-auth` |\n| `402` | With a key: insufficient credits for the entire batch. With no key at all: a pay-per-call quote, not a credit problem | With a key, top up via Path 4 in `insumer-auth`. With no key, set `INSUMER_API_KEY` and call again |\n| `429` | Daily request limit reached | It resets on a timer, not by slowing down: wait the number of seconds in the `Retry-After` header |\n\nThe batch endpoint does not answer `503` for an upstream data-source failure. A wallet whose chain reads fail is refused on its own: it appears as an `{error: {wallet, message}}` entry in `data.results[]` of a `200` response, is never signed, and does not consume credits. Such an entry is never a `false`: it says the wallet was not read, not that it holds nothing. Retry those wallets later.\n\n## Related skills\n\n| Skill | Purpose |\n|---|---|\n| `insumer-auth` | API key creation, top-up |\n| `insumer-trust` | Single-wallet curated profile |\n| `insumer-attest` | Custom condition (single call, up to 10 conditions) |\n| `insumer-jwks-verify` | Offline signature verification: apply per `data.results[]` entry |\n\n## References\n\n- [InsumerAPI OpenAPI spec](https://insumermodel.com/openapi.yaml)\n- [Public JWKS](https://insumermodel.com/.well-known/jwks.json)\n- [Developer docs: trust profile](https://insumermodel.com/developers/trust/)\n"
}

SHA-256 of public snapshot: a0a44e7f97860560fa29f8f69bfc01d41bf3d33875e916b5185fa99d8abad47f