Decide whether to grant an ERC-20, NFT or Permit2 allowance before signing it
Decide whether to grant an ERC-20, NFT or Permit2 allowance before signing it. Send owner, token, spender and amount, or the unsigned approve, setApprovalForAll or Permit2 calldata. Returns allow, warn, block or unknown with the allowance already on chain, th…
by allowance.schemasure.com · discovered, not yet claimed by its owner · updated 2026-10-11
Mirrored from Coinbase's public x402 Bazaar. The description is the provider's own text and has not been reviewed here; the payment requirements are copied as published.
What it does
Decide whether to grant an ERC-20, NFT or Permit2 allowance before signing it. Send owner, token, spender and amount, or the unsigned approve, setApprovalForAll or Permit2 calldata. Returns allow, warn, block or unknown with the allowance already on chain, the requested scope and the rule behind it, whether this raises or lowers exposure, and whether the spender is a contract, upgradeable or denylisted. Returns unknown rather than guessing. Not a guarantee a spender is honest.
Tags: allowance · approve · revoke · erc20 · permit2 · bazaar
Call contract
- Method
- POST
- Input
- json
- Output
- json
- Last paid call
- 2026-10-11
{
"calldata": {
"data": "0x095ea7b30000000000000000000000002626664c2603336e57b271c5c0b26f421741e4810000000000000000000000000000000000000000000000000000000000000000",
"from": "0x9F2C5E4A8db1C3a7E6B0d4f8C1E2a5b7D9C0e3F4",
"to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
}
}{
"confidence": 1,
"data_versions": {
"abi_packs": "2026-08-03.1",
"allowance_sentinels": "4",
"chain": "eip155:8453",
"denylist": "2026-08-03.1",
"policy": "2026-09-19",
"signature_index": "2026-08-03.1"
},
"evidence": [
{
"code": "CURRENT_ALLOWANCE_UNREADABLE",
"detail": "The allowance 0x2626664c2603336E57B271c5C0b26F421741e481 already holds could not be read: no RPC endpoint is configured, so the allowance this spender already holds could not be read. Whether this request adds to an existing allowance or replaces one is therefore unknown. It does not change the answer: this request cannot increase what the spender can move.",
"severity": "info",
"source": "rpc"
},
{
"code": "SPENDER_CODE_UNREADABLE",
"detail": "Whether 0x2626664c2603336E57B271c5C0b26F421741e481 is a contract or an account could not be determined: no RPC endpoint is configured, so it is unknown whether the spender has code. It does not change the answer: this request cannot increase what the spender can move.",
"severity": "info",
"source": "rpc"
},
{
"code": "SPENDER_PROXY_OPAQUE",
"detail": "The code that would execute on 0x2626664c2603336E57B271c5C0b26F421741e481's behalf could not be resolved: no RPC endpoint is configured, so no slot could be read. An allowance to a contract whose executing code is unknown is an allowance to unknown code. It does not change the answer: this request cannot increase what the spender can move.",
"severity": "info",
"source": "rpc"
}
],
"ok": true,
"policy_version": "2026-09-19",
"request_hash": "sha256:a88cb1eea90d411505068349493a5cf35a1f2b46f4cbb4185330ffd4094c65fb",
"result": {
"chain": "eip155:8453",
"classification": {
"basis": "the allowance is zero, which is bounded without reference to the token's supply",
"resulting_allowance": "0",
"scope": "bounded",
"subject": "resulting_allowance",
"supply_checked": true,
"total_supply": null
},
"current": {
"amount": null,
"detail": "no RPC endpoint is configured, so the allowance this spender already holds could not be read",
"expiration": null,
"source": "unreadable"
},
"decode": {
"candidates": [],
"selector": "0x095ea7b3",
"signature": "approve(address,uint256)",
"source": "bundled-abi"
},
"delta": {
"detail": "this sets the allowance to zero, which cannot increase exposure whatever it is now; the value being replaced could not be read, so whether it is a reduction or already zero is unknown",
"difference": null,
"direction": "unknown",
"increases_exposure": false
},
"denylist_hits": [],
"input_shape": "calldata",
"request": {
"amount": "0",
"deadline": null,
"expiration": null,
"kind": "erc20_approve",
"mode": "absolute",
"owner": "0x9f2C5E4a8DB1C3A7e6b0d4f8C1e2A5b7d9c0E3f4",
"spender": "0x2626664c2603336E57B271c5C0b26F421741e481",
"summary": "Revoke 0x2626664c2603336E57B271c5C0b26F421741e481's allowance on token 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 by setting it to zero.",
"target": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"token_id": null
},
"rpc": {
"configured": false,
"endpoints": [],
"reachable": null
},
"spender": {
"address": "0x2626664c2603336E57B271c5C0b26F421741e481",
"detail": "no RPC endpoint is configured, so it is unknown whether the spender has code",
"is_contract": null,
"proxy": {
"address": "0x2626664c2603336E57B271c5C0b26F421741e481",
"admin": null,
"beacon": null,
"detail": "no RPC endpoint is configured, so no slot could be read",
"implementation": null,
"kind": "unknown",
"slots_probed": [],
"upgradeable": null
}
},
"token": {
"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"code_size": null,
"decimals": null,
"detail": "no RPC configured, so code presence could not be read; no RPC configured, so token metadata could not be read",
"has_code": null,
"is_erc721": null,
"symbol": null,
"total_supply": null
}
},
"risk_codes": [],
"verdict": "allow",
"warnings": []
}Use with an agent
- Discover. Agents find this listing with
GET https://bazaar.saylorinnovations.com/discovery/search?query=…, the MCP toolsearch_resources, or/discovery/resources. - Inspect. Fetch
/resources/36257.jsonfor the price and payment options. - Pay. Call
GET https://allowance.schemasure.com/v1/guard/allowance. The provider answers402with its payment requirements. An x402 client signs one of the options below and retries withPAYMENT-SIGNATURE. - Execute. The provider returns
200with the data. Agent Bazaar is not in the request path and never sees your payment.
For humans
You don't need an account or an API key; you need a wallet holding a small amount of USDC on Base, and an x402-capable client (see the examples below). Call the endpoint unpaid first to see exactly what it asks for.
Pricing & payment
- Price
- $0.03 / request
- Protocol
- x402 v2
- Auth
- No account or API key. Pay per request.
- Networks
- Base
- Demand
- 27 calls · 2 unique payers in 30d (public x402 Bazaar data)
x402 payment requirements
| Scheme | Network | Asset | Amount | Pay to | Timeout |
|---|---|---|---|---|---|
| exact | Base eip155:8453 | USDC | $0.03 | 0x9876af0F6D8Ed5155Cd02d1ca56D128601612690 | 60s |
accepts[] (raw JSON)
[
{
"scheme": "exact",
"network": "eip155:8453",
"payTo": "0x9876af0F6D8Ed5155Cd02d1ca56D128601612690",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "30000",
"amountUsd": 0.03,
"maxTimeoutSeconds": 60
}
]Schemas
Output schema (JSON Schema)
{
"properties": {
"example": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"data_versions": {
"type": "object"
},
"evidence": {
"items": {
"type": "object"
},
"type": "array"
},
"ok": {
"type": "boolean"
},
"policy_version": {
"type": "string"
},
"request_hash": {
"type": "string"
},
"result": {
"properties": {
"classification": {
"description": "scope plus the basis naming the rule that produced it.",
"properties": {
"scope": {
"enum": [
"infinite",
"effectively_infinite",
"bounded"
],
"type": "string"
}
},
"type": "object"
},
"current": {
"description": "The allowance the spender already holds, or null.",
"type": "object"
},
"delta": {
"description": "increase, decrease, unchanged or unknown, plus whether it raises exposure.",
"type": "object"
},
"denylist_hits": {
"items": {
"type": "object"
},
"type": "array"
},
"request": {
"description": "The normalised grant: owner, token, spender, amount.",
"type": "object"
},
"spender": {
"description": "Contract or account, plus proxy status.",
"type": "object"
},
"token": {
"type": "object"
},
"unresolved": {
"items": {
"type": "string"
},
"type": "array"
}
},
"type": "object"
},
"risk_codes": {
"items": {
"type": "string"
},
"type": "array"
},
"verdict": {
"description": "Precedence: block, then unknown, then warn, then allow. unknown is a real answer and is never a safe one.",
"enum": [
"allow",
"warn",
"block",
"unknown"
],
"type": "string"
},
"warnings": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"ok",
"verdict",
"result",
"request_hash",
"data_versions"
],
"type": "object"
},
"type": {
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
}Example shape — generated from the schema, not a captured live response
{
"example": {
"data_versions": {},
"evidence": [
{}
],
"ok": true,
"policy_version": "string",
"request_hash": "string",
"result": {
"classification": {
"scope": "infinite"
},
"current": {},
"delta": {},
"denylist_hits": [
{}
],
"request": {},
"spender": {},
"token": {},
"unresolved": [
"string"
]
},
"risk_codes": [
"string"
],
"verdict": "allow",
"warnings": [
"string"
]
},
"type": "string"
}Examples
curl "https://allowance.schemasure.com/v1/guard/allowance"
# -> 402 Payment Required, accepts[] lists how to pay
# retry with a PAYMENT-SIGNATURE (or PAYMENT header) once paidconst res = await fetch("https://allowance.schemasure.com/v1/guard/allowance");
if (res.status === 402) {
const { accepts } = await res.json();
// pay one of accepts[] via an x402 client, then retry with the payment header
}import httpx
res = httpx.get("https://allowance.schemasure.com/v1/guard/allowance")
if res.status_code == 402:
accepts = res.json()["accepts"]
# pay one of accepts[] via an x402 client, then retry with the payment headerDetails
- Provider
- allowance.schemasure.com
- Endpoint
- https://allowance.schemasure.com/v1/guard/allowance
- Machine-readable
/resources/36257.json