Create merchants, verify domain ownership, configure discount tiers, buy credits with USDC, and publish to the directory. All via API. No dashboard needed.
Configures merchants for the verification and commerce endpoints.
Building this in Claude Code? Install the wallet auth skill and Claude will write correct, signature-verifying integration code on the first try.
smithery skill add douglasborthwick/insumer-skill
Register merchants, prove domain ownership, set up token and NFT discount tiers, and make them discoverable in the public directory. Designed for AI agents that onboard businesses autonomously.
POST /v1/keys/buy (no email needed)POST /v1/attest with any wallet and conditionPOST /v1/merchants with your company namePUT /v1/merchants/:id/tokens with at least one tierPOST /v1/acp/discount with a wallet that qualifiesDomain verification and directory publishing are optional. You can generate discounts as soon as tokens are configured.
POST /v1/merchants with companyName and companyId
POST then PUT /v1/merchants/:id/domain-verification
PUT /v1/merchants/:id/tokens with tiers
PUT /v1/merchants/:id/nfts (optional)
PUT /v1/merchants/:id/settings (discountMode, cap, USDC)
POST /v1/merchants/:id/directory
Creates a new merchant account. Returns 100 free credits and enables API access immediately.
| Parameter | Type | Description |
|---|---|---|
| companyName | string required | Business name. Max 100 characters. |
| companyId | string required | Unique slug. 2-50 characters, alphanumeric, dash, or underscore. |
| location | string optional | Business location. Max 200 characters. |
curl -X POST https://api.insumermodel.com/v1/merchants \ -H "Content-Type: application/json" \ -H "x-api-key: YOUR_API_KEY" \ -d '{ "companyName": "Acme Coffee", "companyId": "acme-coffee", "location": "New York, NY" }'
{
"ok": true,
"data": {
"id": "abc123",
"companyName": "Acme Coffee",
"credits": 100,
"apiAccessEnabled": true
},
"meta": { "version": "1.0", "timestamp": "2026-02-27T12:00:00.000Z" }
}
Generates a verification token and returns instructions for DNS, meta tag, and file-based domain verification.
| Parameter | Type | Description |
|---|---|---|
| domain | string required | Domain to verify. No protocol prefix (e.g. acme.com not https://acme.com). |
curl -X POST https://api.insumermodel.com/v1/merchants/abc123/domain-verification \ -H "Content-Type: application/json" \ -H "x-api-key: YOUR_API_KEY" \ -d '{ "domain": "acme.com" }'
{
"ok": true,
"data": {
"domain": "acme.com",
"token": "abc123xyz",
"methods": {
"dns": {
"type": "TXT",
"host": "acme.com",
"value": "abc123xyz",
"instructions": "Add a TXT record..."
},
"meta": {
"tag": "<meta name=\"insumer-verification\" content=\"abc123xyz\">",
"instructions": "Add this meta tag inside <head>"
},
"file": {
"path": "/insumer-verify.txt",
"content": "abc123xyz",
"instructions": "Host file at /insumer-verify.txt"
}
}
},
"meta": { "version": "1.0", "timestamp": "2026-02-27T12:00:00.000Z" }
}
Checks whether the verification token is present at the domain. Rate limited to 5 attempts per hour.
No request body. Send an empty PUT.
curl -X PUT https://api.insumermodel.com/v1/merchants/abc123/domain-verification \
-H "x-api-key: YOUR_API_KEY"
{
"ok": true,
"data": {
"verified": true,
"domain": "acme.com",
"method": "dns"
},
"meta": { "version": "1.0", "timestamp": "2026-02-27T12:00:00.000Z" }
}
// Response (not verified):
{
"ok": true,
"data": {
"verified": false,
"message": "Token not found",
"attemptsRemaining": 4
},
"meta": { "version": "1.0", "timestamp": "2026-02-27T12:00:00.000Z" }
}
Sets the merchant's own token and partner token discount tiers. Maximum 8 tokens total. Tiers must be in ascending threshold order with discounts between 1% and 50%.
| Parameter | Type | Description |
|---|---|---|
| ownToken | object optional | Merchant's own token: symbol, chainId (number, "solana", or "xrpl"), contractAddress, decimals, tiers array of {name, threshold, discount}. For XRPL trust line tokens, include currency (hex-padded currency code) and use the issuer r-address as contractAddress. For native XRP, use contractAddress: "native". |
| partnerTokens | array optional | Partner tokens. Same structure as ownToken. Combined total max 8. |
curl -X PUT https://api.insumermodel.com/v1/merchants/abc123/tokens \ -H "Content-Type: application/json" \ -H "x-api-key: YOUR_API_KEY" \ -d '{ "ownToken": { "symbol": "ACME", "chainId": 1, "contractAddress": "0x1234...abcd", "decimals": 18, "tiers": [ { "name": "Bronze", "threshold": 100, "discount": 5 }, { "name": "Silver", "threshold": 500, "discount": 10 }, { "name": "Gold", "threshold": 1000, "discount": 15 } ] }, "partnerTokens": [{ "symbol": "USDC", "chainId": 1, "contractAddress": "0xA0b8...eB48", "decimals": 6, "tiers": [ { "name": "Holder", "threshold": 100, "discount": 3 } ] }] }'
{
"ok": true,
"data": {
"ownToken": {
"symbol": "ACME",
"tiersConfigured": 3
},
"partnerTokens": [
{ "symbol": "USDC", "tiersConfigured": 1 }
],
"totalTokens": 2,
"maxTokens": 8
},
"meta": { "version": "1.0", "timestamp": "2026-02-27T12:00:00.000Z" }
}
Sets NFT collection discounts. Maximum 4 collections with discounts between 1% and 50%.
| Parameter | Type | Description |
|---|---|---|
| nftCollections | array required | Array of {name, contractAddress, chainId, discount}. Max 4 collections. chainId accepts a number, "solana", or "xrpl". For XRPL NFTs, use the issuer r-address as contractAddress and optionally include taxon. |
curl -X PUT https://api.insumermodel.com/v1/merchants/abc123/nfts \ -H "Content-Type: application/json" \ -H "x-api-key: YOUR_API_KEY" \ -d '{ "nftCollections": [{ "name": "Acme Members", "contractAddress": "0x5678...efgh", "chainId": 1, "discount": 20 }] }'
{
"ok": true,
"data": {
"nftCollections": [
{
"name": "Acme Members",
"chainId": 1,
"discount": 20
}
],
"totalCollections": 1,
"maxCollections": 4
},
"meta": { "version": "1.0", "timestamp": "2026-02-27T12:00:00.000Z" }
}
Updates merchant discount mode, cap, and USDC payment configuration. All parameters are optional.
| Parameter | Type | Description |
|---|---|---|
| discountMode | string optional | "highest" (best single discount) or "stack" (sum all qualifying discounts). |
| discountCap | number optional | Maximum total discount percentage. 1 to 100. |
| usdcPayment | object optional | {enabled, evmAddress, solanaAddress, preferredChainId}. All sub-fields optional. |
curl -X PUT https://api.insumermodel.com/v1/merchants/abc123/settings \ -H "Content-Type: application/json" \ -H "x-api-key: YOUR_API_KEY" \ -d '{ "discountMode": "highest", "discountCap": 25, "usdcPayment": { "enabled": true, "evmAddress": "0x47aD...14E9", "preferredChainId": 8453 } }'
{
"ok": true,
"data": {
"discountMode": "highest",
"discountCap": 25,
"usdcPayment": {
"enabled": true
}
},
"meta": { "version": "1.0", "timestamp": "2026-02-27T12:00:00.000Z" }
}
Submit a USDC transaction hash to purchase verification credits. Volume discounts: $5–$99 = $0.04/call (25 credits/$1), $100–$499 = $0.03 (33/$1, 25% off), $500+ = $0.02 (50/$1, 50% off). USDC sent on unsupported chains cannot be recovered. Non-refundable.
| Parameter | Type | Description |
|---|---|---|
| txHash | string required | USDC transaction hash. |
| chainId | number | "solana" required | Chain ID (e.g. 1, 8453) or "solana". Supported: ETH, Base, Polygon, Arbitrum, Optimism, BNB, Avalanche, Solana. |
| amount | number required | USDC amount. Minimum 5. |
| updateWallet | boolean optional | Set to true to change the registered sender wallet. |
Sender verification: The first purchase registers the sender wallet to the API key. Subsequent purchases must come from the same sender. To change the registered wallet, include "updateWallet": true—the verified transfer proves ownership.
See platform wallet addresses and supported chains →
curl -X POST https://api.insumermodel.com/v1/merchants/abc123/credits \ -H "Content-Type: application/json" \ -H "x-api-key: YOUR_API_KEY" \ -d '{ "txHash": "0xabc...def", "chainId": 8453, "amount": 10 }'
{
"ok": true,
"data": {
"creditsAdded": 250,
"totalCredits": 350,
"usdcPaid": "10",
"chainName": "Base"
},
"meta": { "version": "1.0", "timestamp": "2026-02-27T12:00:00.000Z" }
}
Publishes the merchant to the public directory, making it discoverable by wallets and agents. No request body needed.
curl -X POST https://api.insumermodel.com/v1/merchants/abc123/directory \
-H "x-api-key: YOUR_API_KEY"
{
"ok": true,
"data": {
"id": "abc123",
"published": true,
"tokensListed": 2,
"nftCollectionsListed": 1
},
"meta": { "version": "1.0", "timestamp": "2026-02-27T12:00:00.000Z" }
}
Returns the full private details of a merchant, including credit balance, directory listing status, token configuration, and discount settings.
curl https://api.insumermodel.com/v1/merchants/abc123/status \
-H "x-api-key: YOUR_API_KEY"
{
"ok": true,
"data": {
"id": "abc123",
"companyName": "Acme Coffee",
"location": "San Francisco, CA",
"credits": 350,
"apiAccessEnabled": true,
"createdAt": "2026-02-20T10:00:00.000Z",
"discountMode": "highest",
"discountCap": 25,
"listedInDirectory": true,
"ownToken": {
"symbol": "ACME",
"chainId": 1,
"tiers": [/* ... */]
},
"partnerTokens": [/* ... */],
"nftCollections": [/* ... */],
"usdcPayment": { "enabled": true },
"verification": { "status": "verified", "domain": "acme.com" }
},
"meta": { "version": "1.0", "timestamp": "2026-02-27T12:00:00.000Z" }
}
See how this endpoint fits the full API → API Topology