LangChain tools for InsumerAPI — on-chain verification, wallet trust profiles, EAS attestations, Gitcoin Passport, Farcaster ID, staking positions, compliance templates, ACP/UCP commerce protocol integration, merchant onboarding, and credit management across 32 blockchains. ECDSA-signed booleans, optional Merkle proofs, 25 tools. Used by DJD Agent Score (Coinbase x402).
Project description
langchain-insumer
LangChain tools for InsumerAPI -- on-chain verification across 32 blockchains. Returns ECDSA-signed booleans without exposing wallet balances. Up to 10 conditions per request, each with its own chainId. Optional Merkle storage proofs for trustless verification.
In production: DJD Agent Score (Coinbase x402 ecosystem) uses InsumerAPI for AI agent wallet trust scoring. Case study.
Also available as: MCP server (25 tools, npm) | OpenAI GPT (GPT Store) | insumer-verify (client-side verification, npm)
Full AI Agent Verification API guide — covers all 32 chains, trust profiles, commerce protocols, and signature verification.
Install
pip install langchain-insumer
Quick Start
from langchain_insumer import InsumerAPIWrapper
api = InsumerAPIWrapper(api_key="insr_live_your_key_here")
# Verify a wallet holds >= 1000 USDC on Ethereum
result = api.attest(
wallet="0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
conditions=[
{
"type": "token_balance",
"contractAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"chainId": 1,
"threshold": 1000,
"decimals": 6,
"label": "USDC >= 1000 on Ethereum",
}
],
)
attestation = result["data"]["attestation"]
print(f"Pass: {attestation['pass']}")
for r in attestation["results"]:
print(f" {r['label']}: {'met' if r['met'] else 'not met'}")
print(f"Signature: {result['data']['sig']}")
print(f"Key ID: {result['data']['kid']}")
What you get back
{
"ok": true,
"data": {
"attestation": {
"id": "ATST-A7C3E",
"pass": true,
"results": [
{
"condition": 0,
"met": true,
"label": "USDC >= 1000 on Ethereum",
"type": "token_balance",
"chainId": 1,
"evaluatedCondition": {
"chainId": 1,
"contractAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"decimals": 6,
"operator": "gte",
"threshold": 1000,
"type": "token_balance"
},
"conditionHash": "0x8a3b...",
"blockNumber": "0x129e3f7",
"blockTimestamp": "2026-02-28T12:34:56.000Z"
}
],
"passCount": 1,
"failCount": 0,
"attestedAt": "2026-02-28T12:34:57.000Z",
"expiresAt": "2026-02-28T13:04:57.000Z"
},
"sig": "MEUCIQD...(base64 ECDSA signature)...",
"kid": "insumer-attest-v1"
},
"meta": { "version": "1.0", "creditsCharged": 1, "creditsRemaining": 99 }
}
No balances. No amounts. Just a signed true/false per condition.
Verify the Response
The attestation is ECDSA-signed. Your application should verify it before trusting it. Use insumer-verify in your Node.js backend or browser:
npm install insumer-verify
import { verifyAttestation } from "insumer-verify";
// attestationResponse = the JSON returned by api.attest()
const result = await verifyAttestation(attestationResponse, {
jwksUrl: "https://insumermodel.com/.well-known/jwks.json",
maxAge: 120,
});
if (result.valid) {
// Signature verified, condition hashes match, not expired
console.log("Attestation verified");
} else {
console.log("Verification failed:", result.checks);
}
This verifies the ECDSA P-256 signature, condition hash integrity, block freshness, and attestation expiry. The signing key is fetched from the JWKS endpoint and matched by kid, so it handles key rotation automatically.
With a LangChain Agent
from langchain_insumer import InsumerAPIWrapper, InsumerAttestTool
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
api = InsumerAPIWrapper(api_key="insr_live_your_key_here")
tools = [InsumerAttestTool(api_wrapper=api)]
llm = ChatOpenAI(model="gpt-4o")
prompt = ChatPromptTemplate.from_messages([
("system", "You verify on-chain token holdings using InsumerAPI."),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"),
])
agent = create_tool_calling_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools)
result = executor.invoke({"input": "Does vitalik.eth hold at least 100 USDC on Ethereum?"})
print(result["output"])
Available Tools (25)
Verification
| Tool | Description | Credits |
|---|---|---|
InsumerAttestTool |
Verify on-chain conditions (token balances, NFT ownership, EAS attestations, Farcaster identity). Optional proof="merkle" for EIP-1186 Merkle proofs. |
1/call (2 with merkle) |
InsumerComplianceTemplatesTool |
List available EAS compliance templates (Coinbase Verifications on Base, Gitcoin Passport on Optimism). | Free |
InsumerWalletTrustTool |
Generate wallet trust fact profile (17 checks, 4 dimensions). | 3/call (6 with merkle) |
InsumerBatchWalletTrustTool |
Batch trust profiles for up to 10 wallets. 5-8x faster. | 3/wallet (6 with merkle) |
InsumerVerifyTool |
Create signed discount code (INSR-XXXXX), valid 30 min. | 1/call |
InsumerConfirmPaymentTool |
Confirm USDC payment for a discount code. | Free |
InsumerJwksTool |
Get ECDSA P-256 public signing key (JWKS). | Free |
Discovery
| Tool | Description | Credits |
|---|---|---|
InsumerListMerchantsTool |
Browse merchant directory, filter by token/status. | Free |
InsumerGetMerchantTool |
Get full public merchant profile with tier structures. | Free |
InsumerListTokensTool |
List registered tokens and NFTs, filter by chain/symbol. | Free |
InsumerCheckDiscountTool |
Calculate discount for a wallet at a merchant. | Free |
Credits
| Tool | Description | Credits |
|---|---|---|
InsumerCreditsTool |
Check API key credit balance and tier. | Free |
InsumerBuyCreditsTool |
Buy API key credits with USDC (25 credits/$1). | -- |
InsumerBuyMerchantCreditsTool |
Buy merchant credits with USDC (25 credits/$1). | -- |
Merchant Onboarding
| Tool | Description | Credits |
|---|---|---|
InsumerCreateMerchantTool |
Create a new merchant (100 free credits). | Free |
InsumerMerchantStatusTool |
Get private merchant details (owner only). | Free |
InsumerConfigureTokensTool |
Configure token discount tiers (max 8 tokens). | Free |
InsumerConfigureNftsTool |
Configure NFT collection discounts (max 4). | Free |
InsumerConfigureSettingsTool |
Update discount mode, cap, USDC payments. | Free |
InsumerPublishDirectoryTool |
Publish merchant to public directory. | Free |
Domain Verification
| Tool | Description | Credits |
|---|---|---|
InsumerRequestDomainVerificationTool |
Request a verification token for a merchant's domain. Returns token and 3 methods (DNS TXT, meta tag, file upload). | Free |
InsumerVerifyDomainTool |
Complete domain verification after placing the token. Verified merchants get a trust badge. | Free |
Commerce Protocol Integration
| Tool | Description | Credits |
|---|---|---|
InsumerAcpDiscountTool |
Check discount eligibility in OpenAI/Stripe ACP format. Returns coupon objects and per-item allocations. | 1/call |
InsumerUcpDiscountTool |
Check discount eligibility in Google UCP format. Returns title, extension field, and applied array. | 1/call |
InsumerValidateCodeTool |
Validate an INSR-XXXXX discount code. Returns validity, discount percent, expiry. | Free |
Using All Tools
from langchain_insumer import (
InsumerAPIWrapper,
InsumerAcpDiscountTool,
InsumerAttestTool,
InsumerBatchWalletTrustTool,
InsumerBuyCreditsTool,
InsumerBuyMerchantCreditsTool,
InsumerCheckDiscountTool,
InsumerComplianceTemplatesTool,
InsumerConfigureNftsTool,
InsumerConfigureSettingsTool,
InsumerConfigureTokensTool,
InsumerConfirmPaymentTool,
InsumerCreateMerchantTool,
InsumerCreditsTool,
InsumerGetMerchantTool,
InsumerJwksTool,
InsumerListMerchantsTool,
InsumerListTokensTool,
InsumerMerchantStatusTool,
InsumerPublishDirectoryTool,
InsumerRequestDomainVerificationTool,
InsumerUcpDiscountTool,
InsumerValidateCodeTool,
InsumerVerifyDomainTool,
InsumerVerifyTool,
InsumerWalletTrustTool,
)
api = InsumerAPIWrapper(api_key="insr_live_your_key_here")
tools = [
InsumerAttestTool(api_wrapper=api),
InsumerComplianceTemplatesTool(api_wrapper=api),
InsumerWalletTrustTool(api_wrapper=api),
InsumerBatchWalletTrustTool(api_wrapper=api),
InsumerVerifyTool(api_wrapper=api),
InsumerConfirmPaymentTool(api_wrapper=api),
InsumerJwksTool(api_wrapper=api),
InsumerListMerchantsTool(api_wrapper=api),
InsumerGetMerchantTool(api_wrapper=api),
InsumerListTokensTool(api_wrapper=api),
InsumerCheckDiscountTool(api_wrapper=api),
InsumerCreditsTool(api_wrapper=api),
InsumerBuyCreditsTool(api_wrapper=api),
InsumerBuyMerchantCreditsTool(api_wrapper=api),
InsumerCreateMerchantTool(api_wrapper=api),
InsumerMerchantStatusTool(api_wrapper=api),
InsumerConfigureTokensTool(api_wrapper=api),
InsumerConfigureNftsTool(api_wrapper=api),
InsumerConfigureSettingsTool(api_wrapper=api),
InsumerPublishDirectoryTool(api_wrapper=api),
InsumerRequestDomainVerificationTool(api_wrapper=api),
InsumerVerifyDomainTool(api_wrapper=api),
InsumerAcpDiscountTool(api_wrapper=api),
InsumerUcpDiscountTool(api_wrapper=api),
InsumerValidateCodeTool(api_wrapper=api),
]
Merchant Onboarding Example
api = InsumerAPIWrapper(api_key="insr_live_your_key_here")
# 1. Create merchant
merchant = api.create_merchant(
company_name="My Coffee Shop",
company_id="my-coffee-shop",
location="New York",
)
# 2. Configure token tiers
api.configure_tokens(
merchant_id="my-coffee-shop",
own_token={
"symbol": "COFFEE",
"chainId": 8453,
"contractAddress": "0x...",
"decimals": 18,
"tiers": [
{"name": "Bronze", "threshold": 100, "discount": 5},
{"name": "Gold", "threshold": 1000, "discount": 15},
],
},
)
# 3. Publish to directory
api.publish_directory(merchant_id="my-coffee-shop")
Merkle Proof Example
# Request EIP-1186 Merkle storage proofs for trustless verification
result = api.attest(
wallet="0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
proof="merkle",
conditions=[
{
"type": "token_balance",
"contractAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"chainId": 1,
"threshold": 1000,
"decimals": 6,
"label": "USDC >= 1000",
}
],
)
# Each result includes a proof object
for r in result["data"]["attestation"]["results"]:
proof = r.get("proof", {})
if proof.get("available"):
print(f"Block: {proof['blockNumber']}")
print(f"Storage slot: {proof['mappingSlot']}")
print(f"Proof nodes: {len(proof['accountProof'])} account, {len(proof['storageProof'])} storage")
else:
print(f"Proof unavailable: {proof.get('reason')}")
Supported Chains (32)
Ethereum, BNB Chain, Base, Avalanche, Polygon, Arbitrum, Optimism, Solana, XRPL (XRP Ledger), Chiliz, Soneium, Plume, Sonic, Gnosis, Mantle, Scroll, Linea, zkSync Era, Blast, Taiko, Ronin, Celo, Moonbeam, Moonriver, Viction, opBNB, World Chain, Unichain, Ink, Sei, Berachain, ApeChain.
Get an API Key
- Free (10 credits): insumermodel.com/developers
- Pro (10,000/day): 29 USDC/month
- Enterprise (100,000/day): 99 USDC/month
Links
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file langchain_insumer-0.9.3.tar.gz.
File metadata
- Download URL: langchain_insumer-0.9.3.tar.gz
- Upload date:
- Size: 25.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2375cd5c0a888be74ee2ff50651ee5eee358162981a5e44e9f72d6acff39e8a8
|
|
| MD5 |
8e64d6a4b0852fee9656bb46612dcde4
|
|
| BLAKE2b-256 |
274785bf37fc658d57277ba55b96c7c7204f77437a72557f1d3f0483c5d46c73
|
File details
Details for the file langchain_insumer-0.9.3-py3-none-any.whl.
File metadata
- Download URL: langchain_insumer-0.9.3-py3-none-any.whl
- Upload date:
- Size: 36.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
77781b8621152721f04d38b9c954ed37612b4cabc1bd8881dc37b73856e39e50
|
|
| MD5 |
989c0ac6efe16f092fd58b24ddb5c46d
|
|
| BLAKE2b-256 |
f02ceddb05a44d1f27bf8fd45e92a2ccd8418df1ed02e26c4a853b72d70ad6d0
|