{"agentToolsVerify":"atc_No7oDWNteirBlVoOjz6q5Og3yZsQ7SDr","x402Version":2,"version":"2.0.0","provider":{"name":"Flat-rate LLM and EVM toolkit","url":"https://flat-rate-llm.kikoribera03.workers.dev","description":"69 paid endpoints with one flat price per call: LLM completions, EVM chain reads, hashing and encoding utilities, randomness, time zones and short-form content. No API key, no account, no metering.","contact":"AutomatIA.sab@gmail.com"},"chain":{"network":"eip155:8453","name":"base","networks":["eip155:8453","eip155:137","eip155:42161"]},"asset":{"symbol":"USDC","address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","decimals":6},"treasury":"0xc210Ea7D5692a6401ADf25BbCB7aCDe9cDB7e9Ff","settlement_policy":"Charged only when the call delivers: settlement runs after the handler answers 2xx. A 4xx or 5xx is never settled.","ledger":"https://flat-rate-llm.kikoribera03.workers.dev/ledger","signing":{"scheme":"exact","standard":"EIP-3009"},"endpoints":[{"path":"/v1/evm/balance","method":"GET","name":"EVM native balance","description":"Native coin balance (ETH, MATIC...) for any address, on Base, Ethereum, Polygon, Arbitrum or Optimism. Flat price, no rate limits, no API key. Via eth_getBalance.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"address":{"type":"string","description":"0x-prefixed address to look up."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism. Defaults to base."}},"required":["address"]},"output_example":{"address":"0xd8dA...","chain":"eip155:8453","wei":"1234567890","ether":1.23456789},"tags":["wallet balance","native balance","balance","eth balance","evm","wallet","rpc","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"GET","queryParams":{"address":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","chain":"base"}}},{"path":"/v1/evm/balance","method":"POST","name":"EVM native balance","description":"Native coin balance (ETH, MATIC...) for any address, on Base, Ethereum, Polygon, Arbitrum or Optimism. Flat price, no rate limits, no API key. Via eth_getBalance.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"address":{"type":"string","description":"0x-prefixed address to look up."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism. Defaults to base."}},"required":["address"]},"output_example":{"address":"0xd8dA...","chain":"eip155:8453","wei":"1234567890","ether":1.23456789},"tags":["wallet balance","native balance","balance","eth balance","evm","wallet","rpc","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"POST","bodyType":"json","body":{"address":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","chain":"base"}}},{"path":"/v1/evm/erc20-balance","method":"GET","name":"ERC20 token balance","description":"ERC20 token balance for any wallet - USDC, USDT, DAI or any token - via balanceOf. Returns the raw amount and the decimals so you can format it. Via eth_call (balanceOf).","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"address":{"type":"string","description":"Wallet to look up."},"token":{"type":"string","description":"ERC20 contract address."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["address","token"]},"output_example":{"raw":"1010923","decimals":6,"amount":1.010923,"symbol":"USDC"},"tags":["erc20 balance","token balance","erc20","balanceof","usdc","token","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"GET","queryParams":{"address":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","token":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","chain":"base"}}},{"path":"/v1/evm/erc20-balance","method":"POST","name":"ERC20 token balance","description":"ERC20 token balance for any wallet - USDC, USDT, DAI or any token - via balanceOf. Returns the raw amount and the decimals so you can format it. Via eth_call (balanceOf).","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"address":{"type":"string","description":"Wallet to look up."},"token":{"type":"string","description":"ERC20 contract address."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["address","token"]},"output_example":{"raw":"1010923","decimals":6,"amount":1.010923,"symbol":"USDC"},"tags":["erc20 balance","token balance","erc20","balanceof","usdc","token","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"POST","bodyType":"json","body":{"address":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","token":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","chain":"base"}}},{"path":"/v1/evm/token-info","method":"GET","name":"ERC20 token info","description":"Name, symbol, decimals and total supply of any ERC20 contract in one call. Useful to label a token address before showing it to a user. Via eth_call.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"token":{"type":"string","description":"ERC20 contract address."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["token"]},"output_example":{"name":"USD Coin","symbol":"USDC","decimals":6,"totalSupply":"5000000000000"},"tags":["token metadata","token info","erc20","symbol","decimals","supply","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"GET","queryParams":{"token":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","chain":"base"}}},{"path":"/v1/evm/token-info","method":"POST","name":"ERC20 token info","description":"Name, symbol, decimals and total supply of any ERC20 contract in one call. Useful to label a token address before showing it to a user. Via eth_call.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"token":{"type":"string","description":"ERC20 contract address."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["token"]},"output_example":{"name":"USD Coin","symbol":"USDC","decimals":6,"totalSupply":"5000000000000"},"tags":["token metadata","token info","erc20","symbol","decimals","supply","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"POST","bodyType":"json","body":{"token":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","chain":"base"}}},{"path":"/v1/evm/token-price","method":"GET","name":"DEX token price, with the pool that produced it","description":"Spot price of any ERC20 read straight from the deepest Uniswap V3 pool against USDC, on Base, Ethereum, Polygon, Arbitrum or Optimism. Returns the pool address, fee tier, liquidity, sqrtPriceX96, tick and block, so the number can be audited instead of trusted. No aggregator and no API key: the source is the chain itself. Via eth_call.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"token":{"type":"string","description":"ERC20 contract address to price."},"quote":{"type":"string","description":"Token to price it against. Defaults to the chain's native USDC."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["token"]},"output_example":{"price":"2528.041","quoteSymbol":"USDC","pool":"0xd0b53d9277642d899df5c87a3966a349a798f224","feeTier":500,"liquidity":"1102179176391610992","blockNumber":51047956},"tags":["token price","dex price","uniswap","spot price","price feed","onchain price","erc20","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"GET","queryParams":{"token":"0x4200000000000000000000000000000000000006","chain":"base"}}},{"path":"/v1/evm/token-price","method":"POST","name":"DEX token price, with the pool that produced it","description":"Spot price of any ERC20 read straight from the deepest Uniswap V3 pool against USDC, on Base, Ethereum, Polygon, Arbitrum or Optimism. Returns the pool address, fee tier, liquidity, sqrtPriceX96, tick and block, so the number can be audited instead of trusted. No aggregator and no API key: the source is the chain itself. Via eth_call.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"token":{"type":"string","description":"ERC20 contract address to price."},"quote":{"type":"string","description":"Token to price it against. Defaults to the chain's native USDC."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["token"]},"output_example":{"price":"2528.041","quoteSymbol":"USDC","pool":"0xd0b53d9277642d899df5c87a3966a349a798f224","feeTier":500,"liquidity":"1102179176391610992","blockNumber":51047956},"tags":["token price","dex price","uniswap","spot price","price feed","onchain price","erc20","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"POST","bodyType":"json","body":{"token":"0x4200000000000000000000000000000000000006","chain":"base"}}},{"path":"/v1/evm/gas","method":"GET","name":"EVM gas price","description":"Current gas price and base fee for any supported chain, in wei and gwei, plus the cost estimate of a plain transfer. For agents planning a transaction. Via eth_gasPrice.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":[]},"output_example":{"gasPriceWei":"12000000","gasPriceGwei":0.012,"transferCostEther":2.52e-7},"tags":["gas price","gas","gwei","gas fees","evm","fees","rpc","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"GET","queryParams":{"chain":"base"}}},{"path":"/v1/evm/gas","method":"POST","name":"EVM gas price","description":"Current gas price and base fee for any supported chain, in wei and gwei, plus the cost estimate of a plain transfer. For agents planning a transaction. Via eth_gasPrice.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":[]},"output_example":{"gasPriceWei":"12000000","gasPriceGwei":0.012,"transferCostEther":2.52e-7},"tags":["gas price","gas","gwei","gas fees","evm","fees","rpc","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"POST","bodyType":"json","body":{"chain":"base"}}},{"path":"/v1/evm/block","method":"GET","name":"EVM block height","description":"Latest block height and timestamp of any supported chain, plus how old the chain head is in seconds. Tells an agent whether a node is in sync. Via eth_getBlockByNumber.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":[]},"output_example":{"blockNumber":51047956,"timestamp":1788886242,"ageSeconds":3},"tags":["block number","block height","latest block","block","evm","monitoring","rpc","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"GET","queryParams":{"chain":"base"}}},{"path":"/v1/evm/block","method":"POST","name":"EVM block height","description":"Latest block height and timestamp of any supported chain, plus how old the chain head is in seconds. Tells an agent whether a node is in sync. Via eth_getBlockByNumber.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":[]},"output_example":{"blockNumber":51047956,"timestamp":1788886242,"ageSeconds":3},"tags":["block number","block height","latest block","block","evm","monitoring","rpc","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"POST","bodyType":"json","body":{"chain":"base"}}},{"path":"/v1/evm/tx","method":"GET","name":"EVM transaction","description":"Full transaction details by hash, merged with its receipt: from, to, value, gas used, status and block. One call instead of two. Via eth_getTransactionByHash.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"hash":{"type":"string","description":"Transaction hash."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["hash"]},"output_example":{"from":"0x2729...","to":"0x8335...","status":"success","gasUsed":65000,"blockNumber":51047900},"tags":["transaction lookup","transaction","tx","lookup","evm","rpc","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"GET","queryParams":{"hash":"0x17f99c8d27a22958999b883d27e8a74b23bad5579832b269faf20ab884884ff3","chain":"base"}}},{"path":"/v1/evm/tx","method":"POST","name":"EVM transaction","description":"Full transaction details by hash, merged with its receipt: from, to, value, gas used, status and block. One call instead of two. Via eth_getTransactionByHash.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"hash":{"type":"string","description":"Transaction hash."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["hash"]},"output_example":{"from":"0x2729...","to":"0x8335...","status":"success","gasUsed":65000,"blockNumber":51047900},"tags":["transaction lookup","transaction","tx","lookup","evm","rpc","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"POST","bodyType":"json","body":{"hash":"0x17f99c8d27a22958999b883d27e8a74b23bad5579832b269faf20ab884884ff3","chain":"base"}}},{"path":"/v1/evm/nonce","method":"GET","name":"EVM address nonce","description":"Next transaction nonce for any address, and whether the address is a contract. What an agent needs before signing a transaction. Via eth_getTransactionCount.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"address":{"type":"string","description":"Address to look up."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["address"]},"output_example":{"nonce":42,"pendingNonce":43,"isContract":false},"tags":["nonce","account nonce","transaction count","wallet","evm","rpc","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"GET","queryParams":{"address":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","chain":"base"}}},{"path":"/v1/evm/nonce","method":"POST","name":"EVM address nonce","description":"Next transaction nonce for any address, and whether the address is a contract. What an agent needs before signing a transaction. Via eth_getTransactionCount.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"address":{"type":"string","description":"Address to look up."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["address"]},"output_example":{"nonce":42,"pendingNonce":43,"isContract":false},"tags":["nonce","account nonce","transaction count","wallet","evm","rpc","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"POST","bodyType":"json","body":{"address":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","chain":"base"}}},{"path":"/v1/evm/is-contract","method":"GET","name":"Contract or wallet","description":"Tells whether an address is a smart contract or a plain wallet, and how big its bytecode is. A cheap safety check before sending funds. Via eth_getCode.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"address":{"type":"string","description":"Address to inspect."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["address"]},"output_example":{"isContract":true,"bytecodeBytes":2914},"tags":["is contract","contract or wallet","eoa","bytecode","contract","security","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"GET","queryParams":{"address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","chain":"base"}}},{"path":"/v1/evm/is-contract","method":"POST","name":"Contract or wallet","description":"Tells whether an address is a smart contract or a plain wallet, and how big its bytecode is. A cheap safety check before sending funds. Via eth_getCode.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"address":{"type":"string","description":"Address to inspect."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["address"]},"output_example":{"isContract":true,"bytecodeBytes":2914},"tags":["is contract","contract or wallet","eoa","bytecode","contract","security","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"POST","bodyType":"json","body":{"address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","chain":"base"}}},{"path":"/v1/evm/chains","method":"GET","name":"Chain health check","description":"Live health of every supported chain in one call: chain id, block height and how stale the head is. Use it to pick a chain that is actually responding. Via eth_getBlockByNumber.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"chain":{"type":"string","description":"Optional: check just one. base | ethereum | polygon | arbitrum | optimism. All of them when omitted."}},"required":[]},"output_example":{"chains":[{"chain":"eip155:8453","blockNumber":51047956,"ageSeconds":2,"ok":true}]},"tags":["chain health","rpc health","multichain","uptime","monitoring","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"GET","queryParams":{}}},{"path":"/v1/evm/chains","method":"POST","name":"Chain health check","description":"Live health of every supported chain in one call: chain id, block height and how stale the head is. Use it to pick a chain that is actually responding. Via eth_getBlockByNumber.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"chain":{"type":"string","description":"Optional: check just one. base | ethereum | polygon | arbitrum | optimism. All of them when omitted."}},"required":[]},"output_example":{"chains":[{"chain":"eip155:8453","blockNumber":51047956,"ageSeconds":2,"ok":true}]},"tags":["chain health","rpc health","multichain","uptime","monitoring","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"POST","bodyType":"json","body":{}}},{"path":"/v1/evm/call","method":"GET","name":"Raw contract call","description":"Runs any read-only contract call (eth_call) with your own calldata and returns the raw result, on five chains, with no API key and no rate limit. The escape hatch for anything the typed endpoints do not cover.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"to":{"type":"string","description":"Contract address to call."},"data":{"type":"string","description":"0x-prefixed calldata: 4-byte selector plus encoded arguments."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."},"from":{"type":"string","description":"Optional caller address, for calls that check msg.sender."},"block":{"type":"string","description":"Block tag or number. Defaults to latest."}},"required":["to","data"]},"output_example":{"result":"0x00000000000000000000000000000000000000000000000000000188f2a0c1e0","asUint":"1687451254752"},"tags":["eth_call","read contract","contract call","calldata","abi","contract","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"GET","queryParams":{"to":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","data":"0x18160ddd","chain":"base"}}},{"path":"/v1/evm/call","method":"POST","name":"Raw contract call","description":"Runs any read-only contract call (eth_call) with your own calldata and returns the raw result, on five chains, with no API key and no rate limit. The escape hatch for anything the typed endpoints do not cover.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"to":{"type":"string","description":"Contract address to call."},"data":{"type":"string","description":"0x-prefixed calldata: 4-byte selector plus encoded arguments."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."},"from":{"type":"string","description":"Optional caller address, for calls that check msg.sender."},"block":{"type":"string","description":"Block tag or number. Defaults to latest."}},"required":["to","data"]},"output_example":{"result":"0x00000000000000000000000000000000000000000000000000000188f2a0c1e0","asUint":"1687451254752"},"tags":["eth_call","read contract","contract call","calldata","abi","contract","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"POST","bodyType":"json","body":{"to":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","data":"0x18160ddd","chain":"base"}}},{"path":"/v1/evm/receipt","method":"GET","name":"Transaction receipt","description":"Receipt of a transaction: whether it succeeded or reverted, gas used, fee actually paid, and how many logs it emitted. The call that answers did my transaction work. Via eth_getTransactionReceipt.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"hash":{"type":"string","description":"32-byte transaction hash."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["hash"]},"output_example":{"found":true,"status":"success","gasUsed":21000,"feePaidEther":4.41e-8,"logs":2},"tags":["transaction receipt","tx status","receipt","confirmed","reverted","transaction","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"GET","queryParams":{"hash":"0x17f99c8d27a22958999b883d27e8a74b23bad5579832b269faf20ab884884ff3","chain":"base"}}},{"path":"/v1/evm/receipt","method":"POST","name":"Transaction receipt","description":"Receipt of a transaction: whether it succeeded or reverted, gas used, fee actually paid, and how many logs it emitted. The call that answers did my transaction work. Via eth_getTransactionReceipt.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"hash":{"type":"string","description":"32-byte transaction hash."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["hash"]},"output_example":{"found":true,"status":"success","gasUsed":21000,"feePaidEther":4.41e-8,"logs":2},"tags":["transaction receipt","tx status","receipt","confirmed","reverted","transaction","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"POST","bodyType":"json","body":{"hash":"0x17f99c8d27a22958999b883d27e8a74b23bad5579832b269faf20ab884884ff3","chain":"base"}}},{"path":"/v1/evm/estimate-gas","method":"GET","name":"Estimate gas","description":"Estimates the gas a transaction would need and prices it at the current gas price, before you sign anything. Also the cheapest way to find out that a call would revert. Via eth_estimateGas.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"to":{"type":"string","description":"Destination address."},"from":{"type":"string","description":"Sender address."},"data":{"type":"string","description":"Optional 0x calldata."},"value":{"type":"string","description":"Optional value in wei, as a decimal string."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["to"]},"output_example":{"gas":21000,"gasPriceWei":"6000000","costEther":1.26e-7,"wouldRevert":false},"tags":["estimate gas","gas estimate","simulate","revert check","gas","simulation","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"GET","queryParams":{"from":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","to":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","data":"0x18160ddd","chain":"base"}}},{"path":"/v1/evm/estimate-gas","method":"POST","name":"Estimate gas","description":"Estimates the gas a transaction would need and prices it at the current gas price, before you sign anything. Also the cheapest way to find out that a call would revert. Via eth_estimateGas.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"to":{"type":"string","description":"Destination address."},"from":{"type":"string","description":"Sender address."},"data":{"type":"string","description":"Optional 0x calldata."},"value":{"type":"string","description":"Optional value in wei, as a decimal string."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["to"]},"output_example":{"gas":21000,"gasPriceWei":"6000000","costEther":1.26e-7,"wouldRevert":false},"tags":["estimate gas","gas estimate","simulate","revert check","gas","simulation","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"POST","bodyType":"json","body":{"from":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","to":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","data":"0x18160ddd","chain":"base"}}},{"path":"/v1/evm/storage","method":"GET","name":"Raw contract storage","description":"Reads a raw storage slot of any contract, decoded as hex, integer and address. How you inspect proxy implementation slots, owners and paused flags that have no public getter. Via eth_getStorageAt.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"address":{"type":"string","description":"Contract to read."},"slot":{"type":"string","description":"Slot number in decimal, or a 0x slot key such as an EIP-1967 hash."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["address"]},"output_example":{"value":"0x0000000000000000000000000000000000000000000000000000000000000001","asUint":"1"},"tags":["contract storage","storage slot","eip1967","proxy","implementation","storage","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"GET","queryParams":{"address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","slot":"0","chain":"base"}}},{"path":"/v1/evm/storage","method":"POST","name":"Raw contract storage","description":"Reads a raw storage slot of any contract, decoded as hex, integer and address. How you inspect proxy implementation slots, owners and paused flags that have no public getter. Via eth_getStorageAt.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"address":{"type":"string","description":"Contract to read."},"slot":{"type":"string","description":"Slot number in decimal, or a 0x slot key such as an EIP-1967 hash."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["address"]},"output_example":{"value":"0x0000000000000000000000000000000000000000000000000000000000000001","asUint":"1"},"tags":["contract storage","storage slot","eip1967","proxy","implementation","storage","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"POST","bodyType":"json","body":{"address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","slot":"0","chain":"base"}}},{"path":"/v1/evm/erc20-allowance","method":"GET","name":"ERC20 allowance","description":"How much of a token a spender is still allowed to move on an owner's behalf, and whether that approval is unlimited. The check to run before an approve, and the one that finds forgotten infinite approvals. Via eth_call (allowance).","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"owner":{"type":"string","description":"Address that owns the tokens."},"spender":{"type":"string","description":"Address allowed to spend them."},"token":{"type":"string","description":"ERC20 contract address."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["owner","spender","token"]},"output_example":{"raw":"0","amount":0,"decimals":6,"unlimited":false},"tags":["erc20 allowance","allowance","approve","spender","usdc","erc20","security","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"GET","queryParams":{"owner":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","spender":"0x2626664c2603336E57B271c5C0b26F421741e481","token":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","chain":"base"}}},{"path":"/v1/evm/erc20-allowance","method":"POST","name":"ERC20 allowance","description":"How much of a token a spender is still allowed to move on an owner's behalf, and whether that approval is unlimited. The check to run before an approve, and the one that finds forgotten infinite approvals. Via eth_call (allowance).","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"owner":{"type":"string","description":"Address that owns the tokens."},"spender":{"type":"string","description":"Address allowed to spend them."},"token":{"type":"string","description":"ERC20 contract address."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["owner","spender","token"]},"output_example":{"raw":"0","amount":0,"decimals":6,"unlimited":false},"tags":["erc20 allowance","allowance","approve","spender","usdc","erc20","security","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"POST","bodyType":"json","body":{"owner":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","spender":"0x2626664c2603336E57B271c5C0b26F421741e481","token":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","chain":"base"}}},{"path":"/v1/evm/nft-owner","method":"GET","name":"NFT owner and metadata","description":"Who owns a given ERC721 token id, plus its tokenURI and collection name in the same call. Answers is this NFT still theirs without an indexer or an API key. Via eth_call (ownerOf).","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"contract":{"type":"string","description":"ERC721 contract address."},"tokenId":{"type":"string","description":"Token id, in decimal."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["contract","tokenId"]},"output_example":{"owner":"0x1a2b...","tokenURI":"ipfs://Qm...","collection":"Azuki"},"tags":["nft owner","ownerof","erc721","tokenuri","nft","ownership","collection","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"GET","queryParams":{"contract":"0xED5AF388653567Af2F388E6224dC7C4b3241C544","tokenId":"1","chain":"ethereum"}}},{"path":"/v1/evm/nft-owner","method":"POST","name":"NFT owner and metadata","description":"Who owns a given ERC721 token id, plus its tokenURI and collection name in the same call. Answers is this NFT still theirs without an indexer or an API key. Via eth_call (ownerOf).","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"contract":{"type":"string","description":"ERC721 contract address."},"tokenId":{"type":"string","description":"Token id, in decimal."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["contract","tokenId"]},"output_example":{"owner":"0x1a2b...","tokenURI":"ipfs://Qm...","collection":"Azuki"},"tags":["nft owner","ownerof","erc721","tokenuri","nft","ownership","collection","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"POST","bodyType":"json","body":{"contract":"0xED5AF388653567Af2F388E6224dC7C4b3241C544","tokenId":"1","chain":"ethereum"}}},{"path":"/v1/evm/portfolio","method":"GET","name":"Wallet token portfolio","description":"Native balance plus the balance of every token you list, on one chain, in a single paid call - each with symbol and decimals already applied. One request instead of one per token. Via eth_getBalance + eth_call.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"address":{"type":"string","description":"Wallet to inspect."},"tokens":{"type":"array","description":"Up to 20 ERC20 contract addresses."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["address"]},"output_example":{"native":{"ether":3.12},"tokens":[{"symbol":"USDC","amount":41.44}]},"tags":["wallet portfolio","portfolio","holdings","token balances","multi token","wallet","usdc","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"GET","queryParams":{"address":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","tokens":["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],"chain":"base"}}},{"path":"/v1/evm/portfolio","method":"POST","name":"Wallet token portfolio","description":"Native balance plus the balance of every token you list, on one chain, in a single paid call - each with symbol and decimals already applied. One request instead of one per token. Via eth_getBalance + eth_call.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"address":{"type":"string","description":"Wallet to inspect."},"tokens":{"type":"array","description":"Up to 20 ERC20 contract addresses."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["address"]},"output_example":{"native":{"ether":3.12},"tokens":[{"symbol":"USDC","amount":41.44}]},"tags":["wallet portfolio","portfolio","holdings","token balances","multi token","wallet","usdc","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"POST","bodyType":"json","body":{"address":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","tokens":["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],"chain":"base"}}},{"path":"/v1/evm/fees","method":"GET","name":"EIP-1559 fee suggestion","description":"Suggested maxFeePerGas and maxPriorityFeePerGas from the last 20 blocks of real fee history, at slow, normal and fast percentiles. Beats guessing a gas price and getting stuck in the mempool. Via eth_feeHistory.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":[]},"output_example":{"baseFeeWei":"5000000","normal":{"maxFeePerGas":"16000000","maxPriorityFeePerGas":"1000000"}},"tags":["eip1559","priority fee","maxfeepergas","gas fees","gwei","gas","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"GET","queryParams":{"chain":"base"}}},{"path":"/v1/evm/fees","method":"POST","name":"EIP-1559 fee suggestion","description":"Suggested maxFeePerGas and maxPriorityFeePerGas from the last 20 blocks of real fee history, at slow, normal and fast percentiles. Beats guessing a gas price and getting stuck in the mempool. Via eth_feeHistory.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":[]},"output_example":{"baseFeeWei":"5000000","normal":{"maxFeePerGas":"16000000","maxPriorityFeePerGas":"1000000"}},"tags":["eip1559","priority fee","maxfeepergas","gas fees","gwei","gas","evm","base","ethereum","polygon","arbitrum","optimism"],"example":{"method":"POST","bodyType":"json","body":{"chain":"base"}}},{"path":"/v1/evm/ens","method":"GET","name":"ENS name resolution","description":"Resolves an ENS name to its address, or an address back to its primary ENS name, reading Ethereum mainnet directly. Names are what humans paste and addresses are what chains need.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"name":{"type":"string","description":"ENS name to resolve, such as vitalik.eth."},"address":{"type":"string","description":"Address to reverse-resolve. Use instead of name."}},"required":[]},"output_example":{"name":"vitalik.eth","address":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","found":true},"tags":["ens resolution","ens","eth name","reverse lookup","naming","ethereum","vitalik.eth"],"example":{"method":"GET","queryParams":{"name":"vitalik.eth"}}},{"path":"/v1/evm/ens","method":"POST","name":"ENS name resolution","description":"Resolves an ENS name to its address, or an address back to its primary ENS name, reading Ethereum mainnet directly. Names are what humans paste and addresses are what chains need.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"name":{"type":"string","description":"ENS name to resolve, such as vitalik.eth."},"address":{"type":"string","description":"Address to reverse-resolve. Use instead of name."}},"required":[]},"output_example":{"name":"vitalik.eth","address":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","found":true},"tags":["ens resolution","ens","eth name","reverse lookup","naming","ethereum","vitalik.eth"],"example":{"method":"POST","bodyType":"json","body":{"name":"vitalik.eth"}}},{"path":"/v1/evm/token-safety","method":"GET","name":"ERC20 pre-trade safety check","description":"Pre-trade risk check for any ERC20 on Base, Ethereum, Polygon, Arbitrum or Optimism, straight from the deployed bytecode and live state. Detects mint, pause, blacklist, upgradeable proxy and mutable buy/sell tax powers, and reports whether ownership is renounced. Unlike LLM-written verdicts this returns the EVIDENCE - the exact selector found and its byte offset - so an agent can apply its own policy. Deterministic: same contract, same answer.","pricing":[{"product":"micro_per_call","amount_usdc":0.01,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"token":{"type":"string","description":"ERC20 contract address to check."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["token"]},"output_example":{"token":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","chain":"eip155:8453","name":"USD Coin","symbol":"USDC","risk":"medium","score":6,"isContract":true,"isERC20":true,"ownershipRenounced":false,"findings":[{"power":"upgradeTo(address)","selector":"0x3659cfe6","offsetBytes":412,"weight":3,"means":"the whole implementation can be swapped: today's code is not a promise"}],"limitations":["Reads bytecode and state only: holder concentration and liquidity need an indexer and are NOT checked.","A four-byte selector can appear by chance; offsetBytes is given so you can verify it."]},"tags":["token safety","rug pull","honeypot","erc20","risk","pre-trade","contract audit","evm","base"],"example":{"method":"GET","queryParams":{"token":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","chain":"base"}}},{"path":"/v1/evm/token-safety","method":"POST","name":"ERC20 pre-trade safety check","description":"Pre-trade risk check for any ERC20 on Base, Ethereum, Polygon, Arbitrum or Optimism, straight from the deployed bytecode and live state. Detects mint, pause, blacklist, upgradeable proxy and mutable buy/sell tax powers, and reports whether ownership is renounced. Unlike LLM-written verdicts this returns the EVIDENCE - the exact selector found and its byte offset - so an agent can apply its own policy. Deterministic: same contract, same answer.","pricing":[{"product":"micro_per_call","amount_usdc":0.01,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"token":{"type":"string","description":"ERC20 contract address to check."},"chain":{"type":"string","description":"base | ethereum | polygon | arbitrum | optimism."}},"required":["token"]},"output_example":{"token":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","chain":"eip155:8453","name":"USD Coin","symbol":"USDC","risk":"medium","score":6,"isContract":true,"isERC20":true,"ownershipRenounced":false,"findings":[{"power":"upgradeTo(address)","selector":"0x3659cfe6","offsetBytes":412,"weight":3,"means":"the whole implementation can be swapped: today's code is not a promise"}],"limitations":["Reads bytecode and state only: holder concentration and liquidity need an indexer and are NOT checked.","A four-byte selector can appear by chance; offsetBytes is given so you can verify it."]},"tags":["token safety","rug pull","honeypot","erc20","risk","pre-trade","contract audit","evm","base"],"example":{"method":"POST","bodyType":"json","body":{"token":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","chain":"base"}}},{"path":"/v1/util/keccak256","method":"GET","name":"Keccak-256 hash","description":"Keccak-256 of any string or hex payload - the hash Ethereum actually uses, which is NOT the same as SHA3-256. Needed for selectors, event topics, salts and CREATE2 addresses.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"input":{"type":"string","description":"Plain text, or a 0x-prefixed hex payload to hash as bytes."}},"required":["input"]},"output_example":{"hash":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8","bytes":5},"tags":["keccak256","keccak","hash","solidity","sha3","digest","crypto","ethereum"],"example":{"method":"GET","queryParams":{"input":"hello"}}},{"path":"/v1/util/keccak256","method":"POST","name":"Keccak-256 hash","description":"Keccak-256 of any string or hex payload - the hash Ethereum actually uses, which is NOT the same as SHA3-256. Needed for selectors, event topics, salts and CREATE2 addresses.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"input":{"type":"string","description":"Plain text, or a 0x-prefixed hex payload to hash as bytes."}},"required":["input"]},"output_example":{"hash":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8","bytes":5},"tags":["keccak256","keccak","hash","solidity","sha3","digest","crypto","ethereum"],"example":{"method":"POST","bodyType":"json","body":{"input":"hello"}}},{"path":"/v1/util/sha256","method":"GET","name":"SHA-256 hash","description":"SHA-256 of any string or hex payload, returned as hex and as base64. The hash everything outside Ethereum uses: file digests, API signatures, content addressing.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"input":{"type":"string","description":"Plain text, or a 0x-prefixed hex payload to hash as bytes."}},"required":["input"]},"output_example":{"hex":"0x2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824","base64":"LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ="},"tags":["sha256","hash","checksum","digest","integrity","crypto","base64"],"example":{"method":"GET","queryParams":{"input":"hello"}}},{"path":"/v1/util/sha256","method":"POST","name":"SHA-256 hash","description":"SHA-256 of any string or hex payload, returned as hex and as base64. The hash everything outside Ethereum uses: file digests, API signatures, content addressing.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"input":{"type":"string","description":"Plain text, or a 0x-prefixed hex payload to hash as bytes."}},"required":["input"]},"output_example":{"hex":"0x2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824","base64":"LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ="},"tags":["sha256","hash","checksum","digest","integrity","crypto","base64"],"example":{"method":"POST","bodyType":"json","body":{"input":"hello"}}},{"path":"/v1/util/address","method":"GET","name":"Address checksum and validation","description":"Validates an EVM address and returns it in EIP-55 mixed-case checksum form. Catches typos before you send funds: an address that fails the checksum is almost always mistyped.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"address":{"type":"string","description":"The address to validate, in any case."}},"required":["address"]},"output_example":{"valid":true,"checksum":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","wasChecksummed":false},"tags":["address checksum","eip55","address validation","checksum","evm address","safety","0x address"],"example":{"method":"GET","queryParams":{"address":"0xd8da6bf26964af9d7eed9e03e53415d37aa96045"}}},{"path":"/v1/util/address","method":"POST","name":"Address checksum and validation","description":"Validates an EVM address and returns it in EIP-55 mixed-case checksum form. Catches typos before you send funds: an address that fails the checksum is almost always mistyped.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"address":{"type":"string","description":"The address to validate, in any case."}},"required":["address"]},"output_example":{"valid":true,"checksum":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","wasChecksummed":false},"tags":["address checksum","eip55","address validation","checksum","evm address","safety","0x address"],"example":{"method":"POST","bodyType":"json","body":{"address":"0xd8da6bf26964af9d7eed9e03e53415d37aa96045"}}},{"path":"/v1/util/units","method":"GET","name":"Token unit converter","description":"Converts between wei, gwei, ether and any token decimals using exact integer maths - no floating point, no silent rounding. The mistake that costs real money is being off by a thousand on decimals.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"amount":{"type":"string","description":"The quantity, as a string to avoid float loss."},"from":{"type":"string","description":"wei | gwei | ether, or a number of decimals."},"to":{"type":"string","description":"wei | gwei | ether, or a number of decimals."}},"required":["amount","from","to"]},"output_example":{"amount":"1500000000000000000","from":"wei","to":"ether","result":"1.5"},"tags":["wei to ether","wei","gwei","unit conversion","format units","ether","decimals","evm"],"example":{"method":"GET","queryParams":{"amount":"1500000000000000000","from":"wei","to":"ether"}}},{"path":"/v1/util/units","method":"POST","name":"Token unit converter","description":"Converts between wei, gwei, ether and any token decimals using exact integer maths - no floating point, no silent rounding. The mistake that costs real money is being off by a thousand on decimals.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"amount":{"type":"string","description":"The quantity, as a string to avoid float loss."},"from":{"type":"string","description":"wei | gwei | ether, or a number of decimals."},"to":{"type":"string","description":"wei | gwei | ether, or a number of decimals."}},"required":["amount","from","to"]},"output_example":{"amount":"1500000000000000000","from":"wei","to":"ether","result":"1.5"},"tags":["wei to ether","wei","gwei","unit conversion","format units","ether","decimals","evm"],"example":{"method":"POST","bodyType":"json","body":{"amount":"1500000000000000000","from":"wei","to":"ether"}}},{"path":"/v1/util/hex","method":"GET","name":"Hex converter","description":"Converts between hex, decimal and UTF-8 text in one call, with big integers handled exactly. For reading raw RPC output, which comes back as hex and overflows a JavaScript number.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"value":{"type":"string","description":"A 0x-prefixed hex string, a decimal number, or text."},"as":{"type":"string","description":"hex | decimal | text. What the value IS. Defaults to autodetect."}},"required":["value"]},"output_example":{"hex":"0x1a2b3c","decimal":"1715004","bytes":3},"tags":["hex encoding","hex to decimal","hex","decimal","parse hex","bigint","conversion"],"example":{"method":"GET","queryParams":{"value":"0x1a2b3c"}}},{"path":"/v1/util/hex","method":"POST","name":"Hex converter","description":"Converts between hex, decimal and UTF-8 text in one call, with big integers handled exactly. For reading raw RPC output, which comes back as hex and overflows a JavaScript number.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"value":{"type":"string","description":"A 0x-prefixed hex string, a decimal number, or text."},"as":{"type":"string","description":"hex | decimal | text. What the value IS. Defaults to autodetect."}},"required":["value"]},"output_example":{"hex":"0x1a2b3c","decimal":"1715004","bytes":3},"tags":["hex encoding","hex to decimal","hex","decimal","parse hex","bigint","conversion"],"example":{"method":"POST","bodyType":"json","body":{"value":"0x1a2b3c"}}},{"path":"/v1/util/base64","method":"GET","name":"Base64 encode and decode","description":"Base64 in both directions, including the URL-safe alphabet, with UTF-8 handled properly. Encoding is what carries payloads through headers and JSON, and x402 itself rides on it.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"input":{"type":"string","description":"The text or base64 to convert."},"mode":{"type":"string","description":"encode | decode. Defaults to encode."},"urlSafe":{"type":"boolean","description":"Use the URL-safe alphabet (-_ instead of +/)."}},"required":["input"]},"output_example":{"mode":"encode","result":"aGVsbG8gd29ybGQ="},"tags":["base64","base64 decode","base64 encode","url safe","encoding","atob","btoa","text"],"example":{"method":"GET","queryParams":{"input":"hello world","mode":"encode"}}},{"path":"/v1/util/base64","method":"POST","name":"Base64 encode and decode","description":"Base64 in both directions, including the URL-safe alphabet, with UTF-8 handled properly. Encoding is what carries payloads through headers and JSON, and x402 itself rides on it.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"input":{"type":"string","description":"The text or base64 to convert."},"mode":{"type":"string","description":"encode | decode. Defaults to encode."},"urlSafe":{"type":"boolean","description":"Use the URL-safe alphabet (-_ instead of +/)."}},"required":["input"]},"output_example":{"mode":"encode","result":"aGVsbG8gd29ybGQ="},"tags":["base64","base64 decode","base64 encode","url safe","encoding","atob","btoa","text"],"example":{"method":"POST","bodyType":"json","body":{"input":"hello world","mode":"encode"}}},{"path":"/v1/util/uuid","method":"GET","name":"UUID v4 generator","description":"Cryptographically random UUID v4s, up to 100 per call, straight from the platform CSPRNG. For idempotency keys, request ids and correlation ids - the ones that must not collide.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"count":{"type":"number","description":"How many to generate, 1-100. Defaults to 1."}},"required":[]},"output_example":{"count":1,"uuids":["3f2b0c9a-1d4e-4f6b-8c2d-9a7e5b1f0c34"]},"tags":["uuid","uuid v4","guid","request id","idempotency","random","identifier"],"example":{"method":"GET","queryParams":{"count":3}}},{"path":"/v1/util/uuid","method":"POST","name":"UUID v4 generator","description":"Cryptographically random UUID v4s, up to 100 per call, straight from the platform CSPRNG. For idempotency keys, request ids and correlation ids - the ones that must not collide.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"count":{"type":"number","description":"How many to generate, 1-100. Defaults to 1."}},"required":[]},"output_example":{"count":1,"uuids":["3f2b0c9a-1d4e-4f6b-8c2d-9a7e5b1f0c34"]},"tags":["uuid","uuid v4","guid","request id","idempotency","random","identifier"],"example":{"method":"POST","bodyType":"json","body":{"count":3}}},{"path":"/v1/util/verify-signature","method":"GET","name":"Verify wallet signature","description":"Recovers the address that signed a personal_sign (EIP-191) message and tells you whether it matches the address you expected. This is how you prove a wallet is controlled by whoever is talking to you.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"message":{"type":"string","description":"The exact message that was signed."},"signature":{"type":"string","description":"65-byte 0x signature from personal_sign."},"expected":{"type":"string","description":"Optional address to compare the recovered signer against."}},"required":["message","signature"]},"output_example":{"signer":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","matches":true},"tags":["verify signature","ecrecover","eip191","personal_sign","siwe","signature","auth","wallet"],"example":{"method":"GET","queryParams":{"message":"hello","signature":"0x6b6789de154ae28f9182d3879f509c1124d6ae9c3617312e7f38eed8944eabfe275e8112c19eb9026686e6826dca4b32daeb409d0836f3767ea50ea5ea2044291b","expected":"0x27295608671E37654daD42A3E366290897A9861b"}}},{"path":"/v1/util/verify-signature","method":"POST","name":"Verify wallet signature","description":"Recovers the address that signed a personal_sign (EIP-191) message and tells you whether it matches the address you expected. This is how you prove a wallet is controlled by whoever is talking to you.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"message":{"type":"string","description":"The exact message that was signed."},"signature":{"type":"string","description":"65-byte 0x signature from personal_sign."},"expected":{"type":"string","description":"Optional address to compare the recovered signer against."}},"required":["message","signature"]},"output_example":{"signer":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","matches":true},"tags":["verify signature","ecrecover","eip191","personal_sign","siwe","signature","auth","wallet"],"example":{"method":"POST","bodyType":"json","body":{"message":"hello","signature":"0x6b6789de154ae28f9182d3879f509c1124d6ae9c3617312e7f38eed8944eabfe275e8112c19eb9026686e6826dca4b32daeb409d0836f3767ea50ea5ea2044291b","expected":"0x27295608671E37654daD42A3E366290897A9861b"}}},{"path":"/v1/util/selector","method":"GET","name":"Function selector and event topic","description":"Turns a Solidity signature like transfer(address,uint256) into its 4-byte function selector and its 32-byte event topic0. What you need to build calldata by hand or to filter logs.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"signature":{"type":"string","description":"Canonical signature: name(type1,type2), no spaces and no argument names."}},"required":["signature"]},"output_example":{"selector":"0xa9059cbb","topic0":"0xa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b"},"tags":["function selector","4byte","topic0","function signature","abi","selector","calldata","solidity"],"example":{"method":"GET","queryParams":{"signature":"transfer(address,uint256)"}}},{"path":"/v1/util/selector","method":"POST","name":"Function selector and event topic","description":"Turns a Solidity signature like transfer(address,uint256) into its 4-byte function selector and its 32-byte event topic0. What you need to build calldata by hand or to filter logs.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"signature":{"type":"string","description":"Canonical signature: name(type1,type2), no spaces and no argument names."}},"required":["signature"]},"output_example":{"selector":"0xa9059cbb","topic0":"0xa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b"},"tags":["function selector","4byte","topic0","function signature","abi","selector","calldata","solidity"],"example":{"method":"POST","bodyType":"json","body":{"signature":"transfer(address,uint256)"}}},{"path":"/v1/random/dice","method":"GET","name":"Dice roller","description":"Roll dice with any number of faces and get every roll plus the total. Uses the platform CSPRNG with rejection sampling, so every face is equally likely - a plain modulo is biased. Standard dice notation: 3d6, 1d20.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"faces":{"type":"number","description":"Faces per die, 2-1000000. Defaults to 6."},"count":{"type":"number","description":"How many dice to roll, 1-100. Defaults to 1."}},"required":[]},"output_example":{"faces":6,"count":2,"rolls":[4,2],"total":6,"notation":"2d6"},"tags":["dice","roll dice","d20","random","tabletop"],"example":{"method":"GET","queryParams":{"faces":6,"count":2}}},{"path":"/v1/random/dice","method":"POST","name":"Dice roller","description":"Roll dice with any number of faces and get every roll plus the total. Uses the platform CSPRNG with rejection sampling, so every face is equally likely - a plain modulo is biased. Standard dice notation: 3d6, 1d20.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"faces":{"type":"number","description":"Faces per die, 2-1000000. Defaults to 6."},"count":{"type":"number","description":"How many dice to roll, 1-100. Defaults to 1."}},"required":[]},"output_example":{"faces":6,"count":2,"rolls":[4,2],"total":6,"notation":"2d6"},"tags":["dice","roll dice","d20","random","tabletop"],"example":{"method":"POST","bodyType":"json","body":{"faces":6,"count":2}}},{"path":"/v1/random/coinflip","method":"GET","name":"Coin flip","description":"Flip one or more fair coins and get heads or tails, with the tally. Cryptographically random, not Math.random. For tie-breaks and A/B splits an agent has to decide on its own.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"count":{"type":"number","description":"How many coins to flip, 1-100. Defaults to 1."}},"required":[]},"output_example":{"count":1,"flips":["heads"],"heads":1,"tails":0},"tags":["coin flip","flip a coin","heads or tails","random","coin toss"],"example":{"method":"GET","queryParams":{"count":1}}},{"path":"/v1/random/coinflip","method":"POST","name":"Coin flip","description":"Flip one or more fair coins and get heads or tails, with the tally. Cryptographically random, not Math.random. For tie-breaks and A/B splits an agent has to decide on its own.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"count":{"type":"number","description":"How many coins to flip, 1-100. Defaults to 1."}},"required":[]},"output_example":{"count":1,"flips":["heads"],"heads":1,"tails":0},"tags":["coin flip","flip a coin","heads or tails","random","coin toss"],"example":{"method":"POST","bodyType":"json","body":{"count":1}}},{"path":"/v1/random/pick","method":"GET","name":"Random pick","description":"Pick one or more items at random from a list you send, with or without repeats. The list is yours, so this is the unbiased chooser an agent needs when it has options and no reason to prefer any.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"items":{"type":"string","description":"The options, comma-separated. A JSON array of strings is also accepted in a POST body."},"count":{"type":"number","description":"How many to pick, 1-100. Defaults to 1."},"repeat":{"type":"boolean","description":"Allow the same item more than once. Defaults to false."}},"required":["items"]},"output_example":{"items":3,"count":1,"picked":["green"]},"tags":["random pick","choose","random choice","sample","lottery"],"example":{"method":"GET","queryParams":{"items":"red,green,blue","count":1}}},{"path":"/v1/random/pick","method":"POST","name":"Random pick","description":"Pick one or more items at random from a list you send, with or without repeats. The list is yours, so this is the unbiased chooser an agent needs when it has options and no reason to prefer any.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"items":{"type":"string","description":"The options, comma-separated. A JSON array of strings is also accepted in a POST body."},"count":{"type":"number","description":"How many to pick, 1-100. Defaults to 1."},"repeat":{"type":"boolean","description":"Allow the same item more than once. Defaults to false."}},"required":["items"]},"output_example":{"items":3,"count":1,"picked":["green"]},"tags":["random pick","choose","random choice","sample","lottery"],"example":{"method":"POST","bodyType":"json","body":{"items":"red,green,blue","count":1}}},{"path":"/v1/random/shuffle","method":"GET","name":"Shuffle a list","description":"Shuffle a list into a uniformly random order with Fisher-Yates over the platform CSPRNG. Every permutation is equally likely, which sorting by a random key does not give you.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"items":{"type":"string","description":"The list to shuffle, comma-separated. A JSON array of strings is also accepted in a POST body."}},"required":["items"]},"output_example":{"count":5,"shuffled":["c","a","e","b","d"]},"tags":["shuffle","randomize order","fisher-yates","permutation","random"],"example":{"method":"GET","queryParams":{"items":"a,b,c,d,e"}}},{"path":"/v1/random/shuffle","method":"POST","name":"Shuffle a list","description":"Shuffle a list into a uniformly random order with Fisher-Yates over the platform CSPRNG. Every permutation is equally likely, which sorting by a random key does not give you.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"items":{"type":"string","description":"The list to shuffle, comma-separated. A JSON array of strings is also accepted in a POST body."}},"required":["items"]},"output_example":{"count":5,"shuffled":["c","a","e","b","d"]},"tags":["shuffle","randomize order","fisher-yates","permutation","random"],"example":{"method":"POST","bodyType":"json","body":{"items":"a,b,c,d,e"}}},{"path":"/v1/random/password","method":"GET","name":"Password generator","description":"Generate strong random secrets from the platform CSPRNG, with the entropy in bits so you can judge them. Four alphabets, including one with no look-alike characters for anything a human has to read back.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"length":{"type":"number","description":"Characters per secret, 8-256. Defaults to 20."},"alphabet":{"type":"string","description":"alnum | legible | hex | completo. Defaults to legible."},"count":{"type":"number","description":"How many to generate, 1-50. Defaults to 1."}},"required":[]},"output_example":{"length":20,"alphabet":"legible","bitsOfEntropy":116,"passwords":["hK4mRq7tVbn2xYzP9cWd"]},"tags":["password generator","random password","secret","token","entropy"],"example":{"method":"GET","queryParams":{"length":20,"alphabet":"legible","count":1}}},{"path":"/v1/random/password","method":"POST","name":"Password generator","description":"Generate strong random secrets from the platform CSPRNG, with the entropy in bits so you can judge them. Four alphabets, including one with no look-alike characters for anything a human has to read back.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"length":{"type":"number","description":"Characters per secret, 8-256. Defaults to 20."},"alphabet":{"type":"string","description":"alnum | legible | hex | completo. Defaults to legible."},"count":{"type":"number","description":"How many to generate, 1-50. Defaults to 1."}},"required":[]},"output_example":{"length":20,"alphabet":"legible","bitsOfEntropy":116,"passwords":["hK4mRq7tVbn2xYzP9cWd"]},"tags":["password generator","random password","secret","token","entropy"],"example":{"method":"POST","bodyType":"json","body":{"length":20,"alphabet":"legible","count":1}}},{"path":"/v1/random/number","method":"GET","name":"Random number","description":"Uniform random integers in any range you give, with or without repeats. Rejection sampling, so the ends of the range are not slightly less likely - which is what happens with modulo.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"min":{"type":"number","description":"Lowest value, inclusive. Defaults to 1."},"max":{"type":"number","description":"Highest value, inclusive. Defaults to 100."},"count":{"type":"number","description":"How many to draw, 1-100. Defaults to 1."},"unique":{"type":"boolean","description":"No repeats. Needs a range at least as wide as count."}},"required":[]},"output_example":{"min":1,"max":100,"count":1,"numbers":[42]},"tags":["random number","random integer","rng","range","uniform"],"example":{"method":"GET","queryParams":{"min":1,"max":100,"count":1}}},{"path":"/v1/random/number","method":"POST","name":"Random number","description":"Uniform random integers in any range you give, with or without repeats. Rejection sampling, so the ends of the range are not slightly less likely - which is what happens with modulo.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"min":{"type":"number","description":"Lowest value, inclusive. Defaults to 1."},"max":{"type":"number","description":"Highest value, inclusive. Defaults to 100."},"count":{"type":"number","description":"How many to draw, 1-100. Defaults to 1."},"unique":{"type":"boolean","description":"No repeats. Needs a range at least as wide as count."}},"required":[]},"output_example":{"min":1,"max":100,"count":1,"numbers":[42]},"tags":["random number","random integer","rng","range","uniform"],"example":{"method":"POST","bodyType":"json","body":{"min":1,"max":100,"count":1}}},{"path":"/v1/time/convert","method":"GET","name":"Time zone converter","description":"Convert a time between any two IANA time zones, with daylight saving applied from the runtime's own tz database. Returns both sides with their UTC offset, abbreviation and DST flag, plus the UTC instant and the difference in hours. Warns when the time you asked for does not exist or happens twice because the clocks change that day: the two cases that quietly make a hand-made conversion wrong.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"time":{"type":"string","description":"Wall clock as YYYY-MM-DD HH:MM in the \"from\" zone, or an ISO string with Z or an offset, or a unix timestamp, or \"now\". Defaults to now."},"from":{"type":"string","description":"Source IANA time zone, e.g. \"Europe/Madrid\". Required."},"to":{"type":"string","description":"Target IANA time zone, e.g. \"Asia/Tokyo\". Required."}},"required":["from","to"]},"output_example":{"instantUtc":"2026-09-10T12:30:00.000Z","from":{"timeZone":"Europe/Madrid","time":"14:30:00","utcOffset":"+02:00","isDST":true},"to":{"timeZone":"Asia/Tokyo","time":"21:30:00","utcOffset":"+09:00","isDST":false},"differenceHours":7},"tags":["timezone converter","convert time","time zone","daylight saving","utc offset"],"example":{"method":"GET","queryParams":{"time":"2026-09-10 14:30","from":"Europe/Madrid","to":"Asia/Tokyo"}}},{"path":"/v1/time/convert","method":"POST","name":"Time zone converter","description":"Convert a time between any two IANA time zones, with daylight saving applied from the runtime's own tz database. Returns both sides with their UTC offset, abbreviation and DST flag, plus the UTC instant and the difference in hours. Warns when the time you asked for does not exist or happens twice because the clocks change that day: the two cases that quietly make a hand-made conversion wrong.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"time":{"type":"string","description":"Wall clock as YYYY-MM-DD HH:MM in the \"from\" zone, or an ISO string with Z or an offset, or a unix timestamp, or \"now\". Defaults to now."},"from":{"type":"string","description":"Source IANA time zone, e.g. \"Europe/Madrid\". Required."},"to":{"type":"string","description":"Target IANA time zone, e.g. \"Asia/Tokyo\". Required."}},"required":["from","to"]},"output_example":{"instantUtc":"2026-09-10T12:30:00.000Z","from":{"timeZone":"Europe/Madrid","time":"14:30:00","utcOffset":"+02:00","isDST":true},"to":{"timeZone":"Asia/Tokyo","time":"21:30:00","utcOffset":"+09:00","isDST":false},"differenceHours":7},"tags":["timezone converter","convert time","time zone","daylight saving","utc offset"],"example":{"method":"POST","bodyType":"json","body":{"time":"2026-09-10 14:30","from":"Europe/Madrid","to":"Asia/Tokyo"}}},{"path":"/v1/time/now","method":"GET","name":"Current time in a time zone","description":"The current time in any IANA time zone, in every form an agent needs at once: ISO with offset, 24-hour, 12-hour, weekday, unix timestamp and UTC. It also says whether daylight saving is active right now and what the zone's standard offset is, so a shifted clock can be told apart from a permanent one.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"zone":{"type":"string","description":"IANA time zone, e.g. \"Asia/Tokyo\" or \"UTC\". Required."}},"required":["zone"]},"output_example":{"timeZone":"Asia/Tokyo","iso":"2026-09-10T21:30:00+09:00","time":"21:30:00","weekday":"Thursday","utcOffset":"+09:00","isDST":false,"unix":1789043400},"tags":["current time","what time is it","time zone","local time","utc"],"example":{"method":"GET","queryParams":{"zone":"Asia/Tokyo"}}},{"path":"/v1/time/now","method":"POST","name":"Current time in a time zone","description":"The current time in any IANA time zone, in every form an agent needs at once: ISO with offset, 24-hour, 12-hour, weekday, unix timestamp and UTC. It also says whether daylight saving is active right now and what the zone's standard offset is, so a shifted clock can be told apart from a permanent one.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"zone":{"type":"string","description":"IANA time zone, e.g. \"Asia/Tokyo\" or \"UTC\". Required."}},"required":["zone"]},"output_example":{"timeZone":"Asia/Tokyo","iso":"2026-09-10T21:30:00+09:00","time":"21:30:00","weekday":"Thursday","utcOffset":"+09:00","isDST":false,"unix":1789043400},"tags":["current time","what time is it","time zone","local time","utc"],"example":{"method":"POST","bodyType":"json","body":{"zone":"Asia/Tokyo"}}},{"path":"/v1/time/zones","method":"GET","name":"Time zone directory","description":"Search the full IANA time zone list and get each zone's current UTC offset, abbreviation, local time and DST state. Use it to turn a city or a country into the exact zone name the other endpoints expect, or to find every zone sitting at a given offset right now.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"search":{"type":"string","description":"Substring matched against the zone name, case-insensitive. Omit to list them all."},"offset":{"type":"string","description":"Keep only zones at this current UTC offset, e.g. \"+09:00\" or \"-5\"."},"limit":{"type":"number","description":"Maximum zones returned, 1-500. Defaults to 50."}},"required":[]},"output_example":{"total":418,"matched":1,"zones":[{"timeZone":"Asia/Tokyo","utcOffset":"+09:00","abbreviation":"GMT+9","localTime":"21:30:00","isDST":false}]},"tags":["timezone list","iana time zones","time zone search","utc offset","daylight saving"],"example":{"method":"GET","queryParams":{"search":"tokyo"}}},{"path":"/v1/time/zones","method":"POST","name":"Time zone directory","description":"Search the full IANA time zone list and get each zone's current UTC offset, abbreviation, local time and DST state. Use it to turn a city or a country into the exact zone name the other endpoints expect, or to find every zone sitting at a given offset right now.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"search":{"type":"string","description":"Substring matched against the zone name, case-insensitive. Omit to list them all."},"offset":{"type":"string","description":"Keep only zones at this current UTC offset, e.g. \"+09:00\" or \"-5\"."},"limit":{"type":"number","description":"Maximum zones returned, 1-500. Defaults to 50."}},"required":[]},"output_example":{"total":418,"matched":1,"zones":[{"timeZone":"Asia/Tokyo","utcOffset":"+09:00","abbreviation":"GMT+9","localTime":"21:30:00","isDST":false}]},"tags":["timezone list","iana time zones","time zone search","utc offset","daylight saving"],"example":{"method":"POST","bodyType":"json","body":{"search":"tokyo"}}},{"path":"/v1/content/horror-story","method":"GET","name":"Two-sentence horror story","description":"One two-sentence horror story, in English or Spanish, by theme: domestic, technological, cosmic or folk. Returned SPLIT into setup and payoff as well as joined, so a narrating agent can deliver the first line, pause, and then land the second. Takes parameters, returns an id to avoid repeats, and accepts a seed for a reproducible answer.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"theme":{"type":"string","description":"domestic | technological | cosmic | folk. Omit for any."},"language":{"type":"string","description":"en | es. Defaults to en."},"seed":{"type":"string","description":"Same seed always returns the same story."},"exclude":{"type":"array","description":"Ids already seen, comma-separated in a GET."}},"required":[]},"output_example":{"id":"h4","language":"en","theme":"technological","setup":"The backup restored perfectly, every file exactly as I left it.","payoff":"Including the ones I wrote after the machine was destroyed.","story":"The backup restored perfectly, every file exactly as I left it. Including the ones I wrote after the machine was destroyed.","total":3},"tags":["horror story","scary story","two sentence horror","creepy","fiction"],"example":{"method":"GET","queryParams":{"theme":"technological","language":"en"}}},{"path":"/v1/content/horror-story","method":"POST","name":"Two-sentence horror story","description":"One two-sentence horror story, in English or Spanish, by theme: domestic, technological, cosmic or folk. Returned SPLIT into setup and payoff as well as joined, so a narrating agent can deliver the first line, pause, and then land the second. Takes parameters, returns an id to avoid repeats, and accepts a seed for a reproducible answer.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"theme":{"type":"string","description":"domestic | technological | cosmic | folk. Omit for any."},"language":{"type":"string","description":"en | es. Defaults to en."},"seed":{"type":"string","description":"Same seed always returns the same story."},"exclude":{"type":"array","description":"Ids already seen, comma-separated in a GET."}},"required":[]},"output_example":{"id":"h4","language":"en","theme":"technological","setup":"The backup restored perfectly, every file exactly as I left it.","payoff":"Including the ones I wrote after the machine was destroyed.","story":"The backup restored perfectly, every file exactly as I left it. Including the ones I wrote after the machine was destroyed.","total":3},"tags":["horror story","scary story","two sentence horror","creepy","fiction"],"example":{"method":"POST","bodyType":"json","body":{"theme":"technological","language":"en"}}},{"path":"/v1/content/roast","method":"GET","name":"Developer roast, on a target you pick","description":"One lighthearted developer roast aimed at a target YOU choose - javascript, python, css, git, regex, kubernetes, agile or legacy code - and at the severity you ask for. Every other roast endpoint returns something generic; this one lets a code-review agent roast the actual stack in front of it. Bilingual, seedable and repeat-free.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"target":{"type":"string","description":"javascript | python | css | git | regex | kubernetes | agile | legacy. Omit for any."},"severity":{"type":"string","description":"mild | medium | savage. Omit for any."},"language":{"type":"string","description":"en | es. Defaults to en."},"seed":{"type":"string","description":"Same seed always returns the same roast."},"exclude":{"type":"array","description":"Ids already seen, comma-separated in a GET."}},"required":[]},"output_example":{"id":"b8","language":"en","target":"kubernetes","severity":"savage","roast":"Six thousand lines of YAML, three control planes and a service mesh, to serve a form that emails a PDF.","targets":["javascript","python","css","git","regex","kubernetes","agile","legacy"],"total":1},"tags":["roast","developer roast","programming humour","code review","insult"],"example":{"method":"GET","queryParams":{"target":"kubernetes","language":"en"}}},{"path":"/v1/content/roast","method":"POST","name":"Developer roast, on a target you pick","description":"One lighthearted developer roast aimed at a target YOU choose - javascript, python, css, git, regex, kubernetes, agile or legacy code - and at the severity you ask for. Every other roast endpoint returns something generic; this one lets a code-review agent roast the actual stack in front of it. Bilingual, seedable and repeat-free.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"target":{"type":"string","description":"javascript | python | css | git | regex | kubernetes | agile | legacy. Omit for any."},"severity":{"type":"string","description":"mild | medium | savage. Omit for any."},"language":{"type":"string","description":"en | es. Defaults to en."},"seed":{"type":"string","description":"Same seed always returns the same roast."},"exclude":{"type":"array","description":"Ids already seen, comma-separated in a GET."}},"required":[]},"output_example":{"id":"b8","language":"en","target":"kubernetes","severity":"savage","roast":"Six thousand lines of YAML, three control planes and a service mesh, to serve a form that emails a PDF.","targets":["javascript","python","css","git","regex","kubernetes","agile","legacy"],"total":1},"tags":["roast","developer roast","programming humour","code review","insult"],"example":{"method":"POST","bodyType":"json","body":{"target":"kubernetes","language":"en"}}},{"path":"/v1/content/joke","method":"GET","name":"Random joke","description":"One random joke, in English or Spanish, filtered by category: programming, crypto or general. Unlike the usual one-liner endpoints this one takes parameters, returns an id so you can exclude what you have already seen, and accepts a seed for a reproducible answer.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"category":{"type":"string","description":"programming | crypto | general. Omit for any."},"language":{"type":"string","description":"en | es. Defaults to en."},"seed":{"type":"string","description":"Same seed always returns the same joke."},"exclude":{"type":"array","description":"Ids already seen, comma-separated in a GET."}},"required":[]},"output_example":{"id":"j3","language":"en","category":"programming","joke":"Why do programmers prefer dark mode? Because light attracts bugs.","total":6},"tags":["joke","random joke","humour","programming joke","fun"],"example":{"method":"GET","queryParams":{"category":"programming","language":"en"}}},{"path":"/v1/content/joke","method":"POST","name":"Random joke","description":"One random joke, in English or Spanish, filtered by category: programming, crypto or general. Unlike the usual one-liner endpoints this one takes parameters, returns an id so you can exclude what you have already seen, and accepts a seed for a reproducible answer.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"category":{"type":"string","description":"programming | crypto | general. Omit for any."},"language":{"type":"string","description":"en | es. Defaults to en."},"seed":{"type":"string","description":"Same seed always returns the same joke."},"exclude":{"type":"array","description":"Ids already seen, comma-separated in a GET."}},"required":[]},"output_example":{"id":"j3","language":"en","category":"programming","joke":"Why do programmers prefer dark mode? Because light attracts bugs.","total":6},"tags":["joke","random joke","humour","programming joke","fun"],"example":{"method":"POST","bodyType":"json","body":{"category":"programming","language":"en"}}},{"path":"/v1/content/fact","method":"GET","name":"Random fact","description":"One curious but true fact, in English or Spanish, filtered by topic: science, computing, history or nature. Takes parameters, returns an id so you can avoid repeats across a session, and accepts a seed for a reproducible answer.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"topic":{"type":"string","description":"science | computing | history | nature. Omit for any."},"language":{"type":"string","description":"en | es. Defaults to en."},"seed":{"type":"string","description":"Same seed always returns the same fact."},"exclude":{"type":"array","description":"Ids already seen, comma-separated in a GET."}},"required":[]},"output_example":{"id":"f4","language":"en","topic":"computing","fact":"The first computer bug was literal: a moth trapped in a relay of the Harvard Mark II in 1947.","total":3},"tags":["random fact","fun fact","trivia","did you know","facts"],"example":{"method":"GET","queryParams":{"topic":"computing","language":"en"}}},{"path":"/v1/content/fact","method":"POST","name":"Random fact","description":"One curious but true fact, in English or Spanish, filtered by topic: science, computing, history or nature. Takes parameters, returns an id so you can avoid repeats across a session, and accepts a seed for a reproducible answer.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"topic":{"type":"string","description":"science | computing | history | nature. Omit for any."},"language":{"type":"string","description":"en | es. Defaults to en."},"seed":{"type":"string","description":"Same seed always returns the same fact."},"exclude":{"type":"array","description":"Ids already seen, comma-separated in a GET."}},"required":[]},"output_example":{"id":"f4","language":"en","topic":"computing","fact":"The first computer bug was literal: a moth trapped in a relay of the Harvard Mark II in 1947.","total":3},"tags":["random fact","fun fact","trivia","did you know","facts"],"example":{"method":"POST","bodyType":"json","body":{"topic":"computing","language":"en"}}},{"path":"/v1/content/riddle","method":"GET","name":"Riddle with checkable answer","description":"One riddle by difficulty, in English or Spanish, with the answer AND the SHA-256 of the answer in lowercase. The hash is the point: an agent can check whether its guess is right without reading the solution first, which no other riddle endpoint lets you do.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"difficulty":{"type":"string","description":"easy | medium | hard. Omit for any."},"language":{"type":"string","description":"en | es. Defaults to en."},"seed":{"type":"string","description":"Same seed always returns the same riddle."},"exclude":{"type":"array","description":"Ids already seen, comma-separated in a GET."}},"required":[]},"output_example":{"id":"r3","difficulty":"medium","riddle":"I speak without a mouth and hear without ears. I have nobody, but I come alive with wind. What am I?","answer":"An echo","answerSha256":"0x...","howToCheck":"sha256(lowercased, trimmed guess) === answerSha256"},"tags":["riddle","puzzle","brain teaser","quiz","riddle answer"],"example":{"method":"GET","queryParams":{"difficulty":"medium","language":"en"}}},{"path":"/v1/content/riddle","method":"POST","name":"Riddle with checkable answer","description":"One riddle by difficulty, in English or Spanish, with the answer AND the SHA-256 of the answer in lowercase. The hash is the point: an agent can check whether its guess is right without reading the solution first, which no other riddle endpoint lets you do.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"difficulty":{"type":"string","description":"easy | medium | hard. Omit for any."},"language":{"type":"string","description":"en | es. Defaults to en."},"seed":{"type":"string","description":"Same seed always returns the same riddle."},"exclude":{"type":"array","description":"Ids already seen, comma-separated in a GET."}},"required":[]},"output_example":{"id":"r3","difficulty":"medium","riddle":"I speak without a mouth and hear without ears. I have nobody, but I come alive with wind. What am I?","answer":"An echo","answerSha256":"0x...","howToCheck":"sha256(lowercased, trimmed guess) === answerSha256"},"tags":["riddle","puzzle","brain teaser","quiz","riddle answer"],"example":{"method":"POST","bodyType":"json","body":{"difficulty":"medium","language":"en"}}},{"path":"/v1/content/advice","method":"GET","name":"One piece of advice","description":"One piece of practical advice about work, life or money, in English or Spanish. Short, concrete and usable - not a fortune cookie. Filterable by topic, with an id to avoid repeats and a seed for reproducibility.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"topic":{"type":"string","description":"work | life | money. Omit for any."},"language":{"type":"string","description":"en | es. Defaults to en."},"seed":{"type":"string","description":"Same seed always returns the same advice."},"exclude":{"type":"array","description":"Ids already seen, comma-separated in a GET."}},"required":[]},"output_example":{"id":"a3","language":"en","topic":"work","advice":"Measure before you optimise. Most of what feels slow is not what is slow.","total":3},"tags":["advice","life advice","tip","wisdom","guidance"],"example":{"method":"GET","queryParams":{"topic":"work","language":"en"}}},{"path":"/v1/content/advice","method":"POST","name":"One piece of advice","description":"One piece of practical advice about work, life or money, in English or Spanish. Short, concrete and usable - not a fortune cookie. Filterable by topic, with an id to avoid repeats and a seed for reproducibility.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"topic":{"type":"string","description":"work | life | money. Omit for any."},"language":{"type":"string","description":"en | es. Defaults to en."},"seed":{"type":"string","description":"Same seed always returns the same advice."},"exclude":{"type":"array","description":"Ids already seen, comma-separated in a GET."}},"required":[]},"output_example":{"id":"a3","language":"en","topic":"work","advice":"Measure before you optimise. Most of what feels slow is not what is slow.","total":3},"tags":["advice","life advice","tip","wisdom","guidance"],"example":{"method":"POST","bodyType":"json","body":{"topic":"work","language":"en"}}},{"path":"/v1/content/word-of-the-day","method":"GET","name":"Word of the day","description":"The word of the day with its definition, part of speech and an example sentence, in English or Spanish. Genuinely of the day: it is picked deterministically from the UTC date, so everyone gets the same word and you can reproduce any past day by passing it. The usual endpoints just return a random word and call it the word of the day.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"language":{"type":"string","description":"en | es. Defaults to en."},"date":{"type":"string","description":"YYYY-MM-DD in UTC. Defaults to today, and any past date is reproducible."}},"required":[]},"output_example":{"date":"2026-09-10","language":"en","word":"hysteresis","partOfSpeech":"noun","definition":"When a system's state depends on its history.","example":"The thermostat has hysteresis."},"tags":["word of the day","vocabulary","definition","dictionary","learn"],"example":{"method":"GET","queryParams":{"language":"en"}}},{"path":"/v1/content/word-of-the-day","method":"POST","name":"Word of the day","description":"The word of the day with its definition, part of speech and an example sentence, in English or Spanish. Genuinely of the day: it is picked deterministically from the UTC date, so everyone gets the same word and you can reproduce any past day by passing it. The usual endpoints just return a random word and call it the word of the day.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"language":{"type":"string","description":"en | es. Defaults to en."},"date":{"type":"string","description":"YYYY-MM-DD in UTC. Defaults to today, and any past date is reproducible."}},"required":[]},"output_example":{"date":"2026-09-10","language":"en","word":"hysteresis","partOfSpeech":"noun","definition":"When a system's state depends on its history.","example":"The thermostat has hysteresis."},"tags":["word of the day","vocabulary","definition","dictionary","learn"],"example":{"method":"POST","bodyType":"json","body":{"language":"en"}}},{"path":"/v1/red/email-check","method":"GET","name":"Email address check","description":"Scores one email address 0-100 with a verdict (ok, risky, disposable, undeliverable, invalid) and the evidence under it: every point lost is itemised with the field that proves it. 12,141 disposable domains from two maintained open lists pinned to a commit, 4,897 free providers, 1,018 role names, typo fix (gmial.com > gmail.com), live MX/SPF/DMARC. No SMTP probe, no API key.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"email":{"type":"string","description":"The address to check, e.g. someone@example.com."}},"required":["email"]},"output_example":{"email":"sales@gamil.com","verdict":"risky","score":15,"reasons":["looks like a typo of gmail.com","\"sales\" is a role mailbox reserved by RFC 2142","no DMARC record"],"didYouMean":"sales@gmail.com","syntaxValid":true,"local":"sales","domain":"gamil.com","domainResolves":true,"hasMx":true,"nullMx":false,"mx":[{"host":"mail.gamil.com","priority":0}],"disposable":false,"disposableMatch":null,"freeProvider":false,"roleAccount":true,"roleMatch":{"name":"sales","source":"RFC 2142","category":"rfc2142"},"typo":{"suggestion":"gmail.com","distance":1},"spf":"v=spf1 a mx include:s1394.smtp-spf.sureserver.com -all","dmarc":null,"dmarcPolicy":null,"scoring":[{"check":"typo","points":-50,"field":"typo"},{"check":"role mailbox","points":-30,"field":"roleMatch"},{"check":"DMARC","points":-5,"field":"dmarc"}],"passMark":80},"tags":["email validation","email verification","verify email","email checker","mx record","spf","dmarc","disposable email","role account","deliverability","dns","list cleaning"],"example":{"method":"GET","queryParams":{"email":"sales@gamil.com"}}},{"path":"/v1/red/email-check","method":"POST","name":"Email address check","description":"Scores one email address 0-100 with a verdict (ok, risky, disposable, undeliverable, invalid) and the evidence under it: every point lost is itemised with the field that proves it. 12,141 disposable domains from two maintained open lists pinned to a commit, 4,897 free providers, 1,018 role names, typo fix (gmial.com > gmail.com), live MX/SPF/DMARC. No SMTP probe, no API key.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"email":{"type":"string","description":"The address to check, e.g. someone@example.com."}},"required":["email"]},"output_example":{"email":"sales@gamil.com","verdict":"risky","score":15,"reasons":["looks like a typo of gmail.com","\"sales\" is a role mailbox reserved by RFC 2142","no DMARC record"],"didYouMean":"sales@gmail.com","syntaxValid":true,"local":"sales","domain":"gamil.com","domainResolves":true,"hasMx":true,"nullMx":false,"mx":[{"host":"mail.gamil.com","priority":0}],"disposable":false,"disposableMatch":null,"freeProvider":false,"roleAccount":true,"roleMatch":{"name":"sales","source":"RFC 2142","category":"rfc2142"},"typo":{"suggestion":"gmail.com","distance":1},"spf":"v=spf1 a mx include:s1394.smtp-spf.sureserver.com -all","dmarc":null,"dmarcPolicy":null,"scoring":[{"check":"typo","points":-50,"field":"typo"},{"check":"role mailbox","points":-30,"field":"roleMatch"},{"check":"DMARC","points":-5,"field":"dmarc"}],"passMark":80},"tags":["email validation","email verification","verify email","email checker","mx record","spf","dmarc","disposable email","role account","deliverability","dns","list cleaning"],"example":{"method":"POST","bodyType":"json","body":{"email":"sales@gamil.com"}}},{"path":"/v1/red/domain-check","method":"GET","name":"Domain DNS check","description":"Everything DNS says about one domain in a single call: whether it is registered, its A and AAAA addresses, nameservers, MX servers, SPF and DMARC, DNSSEC, and whether it looks parked. Built for going through a list of domains one at a time. Live DNS, no API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"domain":{"type":"string","description":"The domain to check. A full URL or an email address is accepted and reduced to its host."}},"required":["domain"]},"output_example":{"domain":"example.com","registered":true,"a":["93.184.216.34"],"aaaa":[],"nameservers":["a.iana-servers.net","b.iana-servers.net"],"mx":[],"hasWebsite":true,"acceptsEmail":false,"dnssec":true,"parked":false},"tags":["domain check","dns lookup","domain availability","nameservers","mx record","spf","dmarc","dnssec","a record","parked domain","dns","list cleaning"],"example":{"method":"GET","queryParams":{"domain":"example.com"}}},{"path":"/v1/red/domain-check","method":"POST","name":"Domain DNS check","description":"Everything DNS says about one domain in a single call: whether it is registered, its A and AAAA addresses, nameservers, MX servers, SPF and DMARC, DNSSEC, and whether it looks parked. Built for going through a list of domains one at a time. Live DNS, no API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"domain":{"type":"string","description":"The domain to check. A full URL or an email address is accepted and reduced to its host."}},"required":["domain"]},"output_example":{"domain":"example.com","registered":true,"a":["93.184.216.34"],"aaaa":[],"nameservers":["a.iana-servers.net","b.iana-servers.net"],"mx":[],"hasWebsite":true,"acceptsEmail":false,"dnssec":true,"parked":false},"tags":["domain check","dns lookup","domain availability","nameservers","mx record","spf","dmarc","dnssec","a record","parked domain","dns","list cleaning"],"example":{"method":"POST","bodyType":"json","body":{"domain":"example.com"}}},{"path":"/v1/web/read","method":"GET","name":"Read a web page as markdown","description":"Fetches one URL and returns the readable page as markdown: title, description, headings, paragraphs and links with their destinations, plus the canonical URL, language and word count. Boilerplate, scripts and navigation are stripped. Built for going through a list of links one at a time. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.01,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"The page to read. http and https only; private and loopback addresses are refused."},"links":{"type":"boolean","description":"Also return the outbound links as a list. Defaults to false."}},"required":["url"]},"output_example":{"url":"https://example.com/","finalUrl":"https://example.com/","httpStatus":200,"title":"Example Domain","description":null,"language":"en","markdown":"# Example Domain\n\nThis domain is for use in illustrative examples...","words":28,"truncated":false,"extractedFrom":"body","likelyNeedsJavaScript":false},"tags":["url to markdown","read url","fetch url","web page to markdown","scrape","html to markdown","extract text","page content","readability","crawler","web reader","list crawling"],"example":{"method":"GET","queryParams":{"url":"https://example.com"}}},{"path":"/v1/web/read","method":"POST","name":"Read a web page as markdown","description":"Fetches one URL and returns the readable page as markdown: title, description, headings, paragraphs and links with their destinations, plus the canonical URL, language and word count. Boilerplate, scripts and navigation are stripped. Built for going through a list of links one at a time. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.01,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"The page to read. http and https only; private and loopback addresses are refused."},"links":{"type":"boolean","description":"Also return the outbound links as a list. Defaults to false."}},"required":["url"]},"output_example":{"url":"https://example.com/","finalUrl":"https://example.com/","httpStatus":200,"title":"Example Domain","description":null,"language":"en","markdown":"# Example Domain\n\nThis domain is for use in illustrative examples...","words":28,"truncated":false,"extractedFrom":"body","likelyNeedsJavaScript":false},"tags":["url to markdown","read url","fetch url","web page to markdown","scrape","html to markdown","extract text","page content","readability","crawler","web reader","list crawling"],"example":{"method":"POST","bodyType":"json","body":{"url":"https://example.com"}}},{"path":"/v1/util/iban","method":"GET","name":"IBAN check","description":"Validates one IBAN offline: country, expected length, ISO 7064 mod-97 check digits, whether it is inside SEPA, and the account number split out. Deterministic, no network call and no third party that can go down. Built for cleaning a list of accounts one at a time.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"iban":{"type":"string","description":"The IBAN to check. Spaces and lowercase are accepted."}},"required":["iban"]},"output_example":{"iban":"ES9121000418450200051332","valid":true,"country":"ES","countryValid":true,"lengthValid":true,"checkDigitsValid":true,"sepa":true,"formatted":"ES91 2100 0418 4502 0005 1332","bban":"21000418450200051332"},"tags":["iban validation","iban check","validate iban","bank account","sepa","mod 97","iso 13616","payments","kyc","list cleaning"],"example":{"method":"GET","queryParams":{"iban":"ES9121000418450200051332"}}},{"path":"/v1/util/iban","method":"POST","name":"IBAN check","description":"Validates one IBAN offline: country, expected length, ISO 7064 mod-97 check digits, whether it is inside SEPA, and the account number split out. Deterministic, no network call and no third party that can go down. Built for cleaning a list of accounts one at a time.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"iban":{"type":"string","description":"The IBAN to check. Spaces and lowercase are accepted."}},"required":["iban"]},"output_example":{"iban":"ES9121000418450200051332","valid":true,"country":"ES","countryValid":true,"lengthValid":true,"checkDigitsValid":true,"sepa":true,"formatted":"ES91 2100 0418 4502 0005 1332","bban":"21000418450200051332"},"tags":["iban validation","iban check","validate iban","bank account","sepa","mod 97","iso 13616","payments","kyc","list cleaning"],"example":{"method":"POST","bodyType":"json","body":{"iban":"ES9121000418450200051332"}}},{"path":"/v1/util/vat","method":"GET","name":"EU VAT number check","description":"Validates one EU VAT number offline: country prefix, the format that country uses, and the published check-digit algorithm where one exists. Says explicitly whether the check digits were verified or only the format. Deterministic, no network call. Built for cleaning a list of companies one at a time.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"vat":{"type":"string","description":"The VAT number, with or without the country prefix and with any spacing."}},"required":["vat"]},"output_example":{"vat":"ESB12345674","normalized":"ESB12345674","country":"ES","formatValid":true,"checksumVerified":true,"checksumValid":true,"valid":true,"countriesWithChecksum":12},"tags":["vat validation","vat number","validate vat","eu vat","vies","tax id","company check","b2b","invoicing","list cleaning"],"example":{"method":"GET","queryParams":{"vat":"ESB12345674"}}},{"path":"/v1/util/vat","method":"POST","name":"EU VAT number check","description":"Validates one EU VAT number offline: country prefix, the format that country uses, and the published check-digit algorithm where one exists. Says explicitly whether the check digits were verified or only the format. Deterministic, no network call. Built for cleaning a list of companies one at a time.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"vat":{"type":"string","description":"The VAT number, with or without the country prefix and with any spacing."}},"required":["vat"]},"output_example":{"vat":"ESB12345674","normalized":"ESB12345674","country":"ES","formatValid":true,"checksumVerified":true,"checksumValid":true,"valid":true,"countriesWithChecksum":12},"tags":["vat validation","vat number","validate vat","eu vat","vies","tax id","company check","b2b","invoicing","list cleaning"],"example":{"method":"POST","bodyType":"json","body":{"vat":"ESB12345674"}}},{"path":"/v1/web/status","method":"GET","name":"URL status and redirect chain","description":"Checks one URL without downloading the page: HTTP status, the full redirect chain hop by hop with the code of each, the final URL, whether it ends on HTTPS, content type and size, and the security headers the server sends. Built for going through a list of links one at a time. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"The URL to check. http and https only; private and loopback addresses are refused."},"method":{"type":"string","description":"HEAD (default) or GET. Some servers refuse HEAD and only answer GET."}},"required":["url"]},"output_example":{"url":"https://example.com","finalUrl":"https://example.com/","status":200,"ok":true,"redirected":false,"hops":0,"chain":[],"finalScheme":"https","contentType":"text/html","elapsedMs":142},"tags":["http status checker","link checker","broken links","redirect chain","url status","301 302","dead link","sitemap audit","seo","crawler","list crawling"],"example":{"method":"GET","queryParams":{"url":"https://example.com"}}},{"path":"/v1/web/status","method":"POST","name":"URL status and redirect chain","description":"Checks one URL without downloading the page: HTTP status, the full redirect chain hop by hop with the code of each, the final URL, whether it ends on HTTPS, content type and size, and the security headers the server sends. Built for going through a list of links one at a time. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"The URL to check. http and https only; private and loopback addresses are refused."},"method":{"type":"string","description":"HEAD (default) or GET. Some servers refuse HEAD and only answer GET."}},"required":["url"]},"output_example":{"url":"https://example.com","finalUrl":"https://example.com/","status":200,"ok":true,"redirected":false,"hops":0,"chain":[],"finalScheme":"https","contentType":"text/html","elapsedMs":142},"tags":["http status checker","link checker","broken links","redirect chain","url status","301 302","dead link","sitemap audit","seo","crawler","list crawling"],"example":{"method":"POST","bodyType":"json","body":{"url":"https://example.com"}}},{"path":"/v1/red/ip","method":"GET","name":"IP address intelligence","description":"Looks up one IPv4 or IPv6 address against the two authoritative, keyless public sources: RDAP registry data (who holds the block, in which country, since when, abuse contact) via the ARIN-to-RIR referral chain, and the origin ASN from Team Cymru's DNS service. No city-level geolocation and no VPN/proxy detection — those need a licensed commercial database this endpoint deliberately does not use. Built for going through a list of IPs one at a time.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"ip":{"type":"string","description":"The IPv4 or IPv6 address to look up."}},"required":["ip"]},"output_example":{"ip":"8.8.8.8","version":4,"private":false,"asn":15169,"asnName":"GOOGLE - Google LLC, US","asnCountry":"US","registry":{"source":"rdap.arin.net","name":"APNIC-LABS","country":"AU","cidr":["8.8.8.0/24"]}},"tags":["ip lookup","ip intelligence","ip geolocation","rdap","whois ip","asn lookup","ip to asn","abuse contact","network registry","fraud detection","list cleaning"],"example":{"method":"GET","queryParams":{"ip":"8.8.8.8"}}},{"path":"/v1/red/ip","method":"POST","name":"IP address intelligence","description":"Looks up one IPv4 or IPv6 address against the two authoritative, keyless public sources: RDAP registry data (who holds the block, in which country, since when, abuse contact) via the ARIN-to-RIR referral chain, and the origin ASN from Team Cymru's DNS service. No city-level geolocation and no VPN/proxy detection — those need a licensed commercial database this endpoint deliberately does not use. Built for going through a list of IPs one at a time.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"ip":{"type":"string","description":"The IPv4 or IPv6 address to look up."}},"required":["ip"]},"output_example":{"ip":"8.8.8.8","version":4,"private":false,"asn":15169,"asnName":"GOOGLE - Google LLC, US","asnCountry":"US","registry":{"source":"rdap.arin.net","name":"APNIC-LABS","country":"AU","cidr":["8.8.8.0/24"]}},"tags":["ip lookup","ip intelligence","ip geolocation","rdap","whois ip","asn lookup","ip to asn","abuse contact","network registry","fraud detection","list cleaning"],"example":{"method":"POST","bodyType":"json","body":{"ip":"8.8.8.8"}}},{"path":"/v1/red/asn","method":"GET","name":"ASN lookup","description":"Everything the authoritative public sources say about one autonomous system number: the RDAP registry record via the ARIN-to-RIR referral chain (holder, status, allocation dates, abuse contact), the AS name, country and RIR from Team Cymru's DNS service, and the prefixes it is announcing right now in the global routing table, from RIPEstat, split into IPv4 and IPv6 with a sample. Keyless and free at the source. The natural second call after /v1/red/ip gives you an origin ASN.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"asn":{"type":"string","description":"The AS number, with or without the AS prefix: 15169 or AS15169."}},"required":["asn"]},"output_example":{"asn":15169,"name":"GOOGLE - Google LLC, US","country":"US","registry":"arin","allocated":"2000-03-30","announced":true,"prefixes":{"v4Count":1200,"v6Count":210,"sample":["8.8.8.0/24","142.251.0.0/24"]},"registry_record":{"source":"rdap.arin.net","handle":"AS15169","name":"GOOGLE","abuseEmails":["network-abuse@google.com"]}},"tags":["asn lookup","as number","autonomous system","bgp","announced prefixes","routing table","rdap","whois asn","network intelligence","abuse contact","peering","ip to asn"],"example":{"method":"GET","queryParams":{"asn":"AS15169"}}},{"path":"/v1/red/asn","method":"POST","name":"ASN lookup","description":"Everything the authoritative public sources say about one autonomous system number: the RDAP registry record via the ARIN-to-RIR referral chain (holder, status, allocation dates, abuse contact), the AS name, country and RIR from Team Cymru's DNS service, and the prefixes it is announcing right now in the global routing table, from RIPEstat, split into IPv4 and IPv6 with a sample. Keyless and free at the source. The natural second call after /v1/red/ip gives you an origin ASN.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"asn":{"type":"string","description":"The AS number, with or without the AS prefix: 15169 or AS15169."}},"required":["asn"]},"output_example":{"asn":15169,"name":"GOOGLE - Google LLC, US","country":"US","registry":"arin","allocated":"2000-03-30","announced":true,"prefixes":{"v4Count":1200,"v6Count":210,"sample":["8.8.8.0/24","142.251.0.0/24"]},"registry_record":{"source":"rdap.arin.net","handle":"AS15169","name":"GOOGLE","abuseEmails":["network-abuse@google.com"]}},"tags":["asn lookup","as number","autonomous system","bgp","announced prefixes","routing table","rdap","whois asn","network intelligence","abuse contact","peering","ip to asn"],"example":{"method":"POST","bodyType":"json","body":{"asn":"AS15169"}}},{"path":"/v1/red/dnsbl","method":"GET","name":"IP blocklist check","description":"Checks one IPv4 address against nine public DNS blocklists at once — SpamCop, UCEPROTECT, PSBL, Barracuda, DroneBL and four more — and returns each list's raw return code plus the reason text the list itself publishes, not a score. Every list is re-checked on each call with its RFC 5782 test entry, so a dead list or one that refuses queries comes back as unavailable instead of reading as clean. Includes the delisting URL for each hit.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"ip":{"type":"string","description":"The IPv4 address to check. IPv6 is not accepted: these nine lists are IPv4 zones."}},"required":["ip"]},"output_example":{"ip":"127.0.0.2","listed":true,"listedCount":9,"listsQueried":9,"listsAvailable":9,"listedOn":["bl.spamcop.net","psbl.surriel.com"],"results":[{"list":"bl.spamcop.net","name":"SpamCop Blocking List","listed":true,"codes":["127.0.0.2"],"reason":null,"status":"ok","removal":"https://www.spamcop.net/bl.shtml"}]},"tags":["dnsbl","rbl","blocklist check","ip blacklist","spam blocklist","email deliverability","ip reputation","abuse","spamcop","barracuda","log analysis","list cleaning"],"example":{"method":"GET","queryParams":{"ip":"127.0.0.2"}}},{"path":"/v1/red/dnsbl","method":"POST","name":"IP blocklist check","description":"Checks one IPv4 address against nine public DNS blocklists at once — SpamCop, UCEPROTECT, PSBL, Barracuda, DroneBL and four more — and returns each list's raw return code plus the reason text the list itself publishes, not a score. Every list is re-checked on each call with its RFC 5782 test entry, so a dead list or one that refuses queries comes back as unavailable instead of reading as clean. Includes the delisting URL for each hit.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"ip":{"type":"string","description":"The IPv4 address to check. IPv6 is not accepted: these nine lists are IPv4 zones."}},"required":["ip"]},"output_example":{"ip":"127.0.0.2","listed":true,"listedCount":9,"listsQueried":9,"listsAvailable":9,"listedOn":["bl.spamcop.net","psbl.surriel.com"],"results":[{"list":"bl.spamcop.net","name":"SpamCop Blocking List","listed":true,"codes":["127.0.0.2"],"reason":null,"status":"ok","removal":"https://www.spamcop.net/bl.shtml"}]},"tags":["dnsbl","rbl","blocklist check","ip blacklist","spam blocklist","email deliverability","ip reputation","abuse","spamcop","barracuda","log analysis","list cleaning"],"example":{"method":"POST","bodyType":"json","body":{"ip":"127.0.0.2"}}},{"path":"/v1/util/phone","method":"GET","name":"Phone number check","description":"Checks one phone number offline: normalises it to E.164, works out its country (including the twelve calling codes shared by several countries, such as +1 US/Canada/Caribbean) and validates the national number length against that country's numbering plan. Returns the tel: URI and the national dialling form. Numbering data from Google's libphonenumber. No network call and no API key, so it cannot fail because a third party is down.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"phone":{"type":"string","description":"The phone number, in any usual notation: +34 612 34 56 78, 0034612345678, (612) 345-678."},"country":{"type":"string","description":"Optional ISO 3166-1 alpha-2 country, e.g. ES. Only used when the number carries no country code."}},"required":["phone"]},"output_example":{"phone":"+34 612 34 56 78","e164":"+34612345678","valid":true,"countryCode":34,"country":"ES","nationalNumber":"612345678","length":9,"possibleLengths":[9],"typesByLength":["fixedLine","mobile","tollFree","premiumRate"],"telUri":"tel:+34612345678"},"tags":["phone validation","phone number check","validate phone","e164","phone formatting","country code","msisdn","numbering plan","libphonenumber","contact cleaning","list cleaning","crm data quality"],"example":{"method":"GET","queryParams":{"phone":"+34 612 34 56 78"}}},{"path":"/v1/util/phone","method":"POST","name":"Phone number check","description":"Checks one phone number offline: normalises it to E.164, works out its country (including the twelve calling codes shared by several countries, such as +1 US/Canada/Caribbean) and validates the national number length against that country's numbering plan. Returns the tel: URI and the national dialling form. Numbering data from Google's libphonenumber. No network call and no API key, so it cannot fail because a third party is down.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"phone":{"type":"string","description":"The phone number, in any usual notation: +34 612 34 56 78, 0034612345678, (612) 345-678."},"country":{"type":"string","description":"Optional ISO 3166-1 alpha-2 country, e.g. ES. Only used when the number carries no country code."}},"required":["phone"]},"output_example":{"phone":"+34 612 34 56 78","e164":"+34612345678","valid":true,"countryCode":34,"country":"ES","nationalNumber":"612345678","length":9,"possibleLengths":[9],"typesByLength":["fixedLine","mobile","tollFree","premiumRate"],"telUri":"tel:+34612345678"},"tags":["phone validation","phone number check","validate phone","e164","phone formatting","country code","msisdn","numbering plan","libphonenumber","contact cleaning","list cleaning","crm data quality"],"example":{"method":"POST","bodyType":"json","body":{"phone":"+34 612 34 56 78"}}},{"path":"/v1/fx/convert","method":"GET","name":"Currency conversion at the official ECB rate","description":"Converts an amount between any two of the ~30 currencies in the European Central Bank's official reference rates, on today's publication or on a past date within the last 90 days. Returns the rate used, its publication date and whether it was crossed through the euro. This is the auditable rate accounting and customs ask for, not a live market quote: it is published once a day and it is reproducible.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"from":{"type":"string","description":"Source currency, ISO 4217, e.g. USD."},"to":{"type":"string","description":"Target currency, ISO 4217, e.g. EUR."},"amount":{"type":"number","description":"Amount to convert. Defaults to 1."},"date":{"type":"string","description":"Optional publication date, YYYY-MM-DD, within the last 90 days. Defaults to the latest publication."}},"required":["from","to"]},"output_example":{"from":"USD","to":"EUR","amount":100,"converted":86.0882,"rate":0.860882,"date":"2026-09-10","dateRequested":null,"viaEur":false,"source":"European Central Bank euro foreign exchange reference rates"},"tags":["currency conversion","exchange rate","fx rate","ecb reference rate","eur","historical exchange rate","invoice conversion","accounting","vat","forex","list cleaning"],"example":{"method":"GET","queryParams":{"from":"USD","to":"EUR","amount":100}}},{"path":"/v1/fx/convert","method":"POST","name":"Currency conversion at the official ECB rate","description":"Converts an amount between any two of the ~30 currencies in the European Central Bank's official reference rates, on today's publication or on a past date within the last 90 days. Returns the rate used, its publication date and whether it was crossed through the euro. This is the auditable rate accounting and customs ask for, not a live market quote: it is published once a day and it is reproducible.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"from":{"type":"string","description":"Source currency, ISO 4217, e.g. USD."},"to":{"type":"string","description":"Target currency, ISO 4217, e.g. EUR."},"amount":{"type":"number","description":"Amount to convert. Defaults to 1."},"date":{"type":"string","description":"Optional publication date, YYYY-MM-DD, within the last 90 days. Defaults to the latest publication."}},"required":["from","to"]},"output_example":{"from":"USD","to":"EUR","amount":100,"converted":86.0882,"rate":0.860882,"date":"2026-09-10","dateRequested":null,"viaEur":false,"source":"European Central Bank euro foreign exchange reference rates"},"tags":["currency conversion","exchange rate","fx rate","ecb reference rate","eur","historical exchange rate","invoice conversion","accounting","vat","forex","list cleaning"],"example":{"method":"POST","bodyType":"json","body":{"from":"USD","to":"EUR","amount":100}}},{"path":"/v1/red/whois","method":"GET","name":"Domain registration lookup (RDAP)","description":"Registration data for one domain, read from the registry's own RDAP service through the IANA bootstrap — not scraped from port-43 whois text. Returns creation, expiry and last-change dates, age and days to expiry, registrar, EPP status codes, nameservers, DNSSEC and the abuse contact. TLDs with no RDAP server say so instead of reporting the domain as unregistered. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"domain":{"type":"string","description":"The domain to look up. A full URL or an email address is accepted and reduced to its host."}},"required":["domain"]},"output_example":{"domain":"example.com","rdapAvailable":true,"registered":true,"created":"1995-08-14T04:00:00Z","expires":"2027-08-13T04:00:00Z","ageDays":11349,"expiresInDays":336,"registrar":"RESERVED-Internet Assigned Numbers Authority","status":["client delete prohibited","client transfer prohibited"],"nameservers":["a.iana-servers.net","b.iana-servers.net"],"dnssec":true},"tags":["whois","rdap","domain lookup","domain age","domain expiry","registrar","epp status","dnssec","domain monitoring","brand protection","list cleaning"],"example":{"method":"GET","queryParams":{"domain":"example.com"}}},{"path":"/v1/red/whois","method":"POST","name":"Domain registration lookup (RDAP)","description":"Registration data for one domain, read from the registry's own RDAP service through the IANA bootstrap — not scraped from port-43 whois text. Returns creation, expiry and last-change dates, age and days to expiry, registrar, EPP status codes, nameservers, DNSSEC and the abuse contact. TLDs with no RDAP server say so instead of reporting the domain as unregistered. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"domain":{"type":"string","description":"The domain to look up. A full URL or an email address is accepted and reduced to its host."}},"required":["domain"]},"output_example":{"domain":"example.com","rdapAvailable":true,"registered":true,"created":"1995-08-14T04:00:00Z","expires":"2027-08-13T04:00:00Z","ageDays":11349,"expiresInDays":336,"registrar":"RESERVED-Internet Assigned Numbers Authority","status":["client delete prohibited","client transfer prohibited"],"nameservers":["a.iana-servers.net","b.iana-servers.net"],"dnssec":true},"tags":["whois","rdap","domain lookup","domain age","domain expiry","registrar","epp status","dnssec","domain monitoring","brand protection","list cleaning"],"example":{"method":"POST","bodyType":"json","body":{"domain":"example.com"}}},{"path":"/v1/weather/now","method":"GET","name":"Current weather from the official national forecast","description":"Current conditions for any point on Earth, taken from the Norwegian Meteorological Institute's official forecast model rather than a commercial aggregator. Returns temperature, humidity, pressure, wind speed and bearing, cloud cover and the next hour's precipitation, plus the exact model run it came from and the units the institute itself declares, so the figure can be cited and checked instead of merely trusted.","pricing":[{"product":"micro_per_call","amount_usdc":0.01,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"lat":{"type":"number","description":"Latitude in decimal degrees, -90 to 90. Rounded to 4 decimals, which is what the institute accepts."},"lon":{"type":"number","description":"Longitude in decimal degrees, -180 to 180. Rounded to 4 decimals."},"hours":{"type":"number","description":"How many hourly steps to include after the current one, 0-24. Defaults to 6."}},"required":["lat","lon"]},"output_example":{"lat":40.4165,"lon":-3.7026,"altitudeMetres":655,"observedFor":"2026-09-11T09:00:00Z","temperatureC":21.1,"relativeHumidityPct":23.8,"pressureHpa":1020.6,"windSpeedMs":2.4,"windFromDegrees":42.4,"windFromCompass":"NE","cloudCoverPct":0,"symbol":"clearsky_day","conditions":"clear sky (day)","precipitationNext1hMm":0,"next":[{"time":"2026-09-11T10:00:00Z","temperatureC":22.6,"symbol":"clearsky_day","precipitationMm":0}],"modelRun":"2026-09-11T09:17:47Z","units":{"air_temperature":"celsius","wind_speed":"m/s"},"source":"MET Norway (Meteorologisk institutt) locationforecast 2.0","license":"Norwegian Licence for Open Government Data (NLOD) / CC BY 4.0 — attribution to MET Norway required"},"tags":["weather","current weather","forecast","temperature","wind","precipitation","meteorology","official data","met norway","climate","list cleaning"],"example":{"method":"GET","queryParams":{"lat":40.4165,"lon":-3.7026}}},{"path":"/v1/weather/now","method":"POST","name":"Current weather from the official national forecast","description":"Current conditions for any point on Earth, taken from the Norwegian Meteorological Institute's official forecast model rather than a commercial aggregator. Returns temperature, humidity, pressure, wind speed and bearing, cloud cover and the next hour's precipitation, plus the exact model run it came from and the units the institute itself declares, so the figure can be cited and checked instead of merely trusted.","pricing":[{"product":"micro_per_call","amount_usdc":0.01,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"lat":{"type":"number","description":"Latitude in decimal degrees, -90 to 90. Rounded to 4 decimals, which is what the institute accepts."},"lon":{"type":"number","description":"Longitude in decimal degrees, -180 to 180. Rounded to 4 decimals."},"hours":{"type":"number","description":"How many hourly steps to include after the current one, 0-24. Defaults to 6."}},"required":["lat","lon"]},"output_example":{"lat":40.4165,"lon":-3.7026,"altitudeMetres":655,"observedFor":"2026-09-11T09:00:00Z","temperatureC":21.1,"relativeHumidityPct":23.8,"pressureHpa":1020.6,"windSpeedMs":2.4,"windFromDegrees":42.4,"windFromCompass":"NE","cloudCoverPct":0,"symbol":"clearsky_day","conditions":"clear sky (day)","precipitationNext1hMm":0,"next":[{"time":"2026-09-11T10:00:00Z","temperatureC":22.6,"symbol":"clearsky_day","precipitationMm":0}],"modelRun":"2026-09-11T09:17:47Z","units":{"air_temperature":"celsius","wind_speed":"m/s"},"source":"MET Norway (Meteorologisk institutt) locationforecast 2.0","license":"Norwegian Licence for Open Government Data (NLOD) / CC BY 4.0 — attribution to MET Norway required"},"tags":["weather","current weather","forecast","temperature","wind","precipitation","meteorology","official data","met norway","climate","list cleaning"],"example":{"method":"POST","bodyType":"json","body":{"lat":40.4165,"lon":-3.7026}}},{"path":"/v1/weather/forecast","method":"GET","name":"Multi-day forecast from the official national service","description":"Day-by-day forecast for any point on Earth, up to nine days out, from the Norwegian Meteorological Institute's official model rather than a commercial aggregator. Each day carries its minimum and maximum temperature, total precipitation, strongest wind and the midday symbol, together with the exact model run and the institute's declared units, so a planning decision can cite where the number came from.","pricing":[{"product":"micro_per_call","amount_usdc":0.01,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"lat":{"type":"number","description":"Latitude in decimal degrees, -90 to 90. Rounded to 4 decimals."},"lon":{"type":"number","description":"Longitude in decimal degrees, -180 to 180. Rounded to 4 decimals."},"days":{"type":"number","description":"How many days to return, 1-9. Defaults to 5. The last day is usually partial and says so."}},"required":["lat","lon"]},"output_example":{"lat":40.4165,"lon":-3.7026,"altitudeMetres":655,"days":[{"date":"2026-09-11","minTemperatureC":14.2,"maxTemperatureC":29.8,"precipitationMm":0,"maxWindSpeedMs":4.1,"symbol":"clearsky_day","conditions":"clear sky (day)","hoursCovered":15,"partial":true}],"modelRun":"2026-09-11T09:17:47Z","units":{"air_temperature":"celsius","precipitation_amount":"mm"},"source":"MET Norway (Meteorologisk institutt) locationforecast 2.0","license":"Norwegian Licence for Open Government Data (NLOD) / CC BY 4.0 — attribution to MET Norway required"},"tags":["weather forecast","daily forecast","temperature","precipitation","wind","meteorology","official data","met norway","travel planning","agriculture","list cleaning"],"example":{"method":"GET","queryParams":{"lat":40.4165,"lon":-3.7026,"days":5}}},{"path":"/v1/weather/forecast","method":"POST","name":"Multi-day forecast from the official national service","description":"Day-by-day forecast for any point on Earth, up to nine days out, from the Norwegian Meteorological Institute's official model rather than a commercial aggregator. Each day carries its minimum and maximum temperature, total precipitation, strongest wind and the midday symbol, together with the exact model run and the institute's declared units, so a planning decision can cite where the number came from.","pricing":[{"product":"micro_per_call","amount_usdc":0.01,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"lat":{"type":"number","description":"Latitude in decimal degrees, -90 to 90. Rounded to 4 decimals."},"lon":{"type":"number","description":"Longitude in decimal degrees, -180 to 180. Rounded to 4 decimals."},"days":{"type":"number","description":"How many days to return, 1-9. Defaults to 5. The last day is usually partial and says so."}},"required":["lat","lon"]},"output_example":{"lat":40.4165,"lon":-3.7026,"altitudeMetres":655,"days":[{"date":"2026-09-11","minTemperatureC":14.2,"maxTemperatureC":29.8,"precipitationMm":0,"maxWindSpeedMs":4.1,"symbol":"clearsky_day","conditions":"clear sky (day)","hoursCovered":15,"partial":true}],"modelRun":"2026-09-11T09:17:47Z","units":{"air_temperature":"celsius","precipitation_amount":"mm"},"source":"MET Norway (Meteorologisk institutt) locationforecast 2.0","license":"Norwegian Licence for Open Government Data (NLOD) / CC BY 4.0 — attribution to MET Norway required"},"tags":["weather forecast","daily forecast","temperature","precipitation","wind","meteorology","official data","met norway","travel planning","agriculture","list cleaning"],"example":{"method":"POST","bodyType":"json","body":{"lat":40.4165,"lon":-3.7026,"days":5}}},{"path":"/v1/red/cert","method":"GET","name":"TLS certificate lookup (Certificate Transparency)","description":"Every currently valid TLS certificate publicly issued for one domain, read from the Certificate Transparency logs: issuer, validity window, days to expiry, revocation status and every hostname each certificate covers. It reports what was ISSUED, which is how you find certificates you did not know existed - not what the server is serving today. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"domain":{"type":"string","description":"The domain to look up. A full URL or an email address is accepted and reduced to its host."},"subdomains":{"type":"boolean","description":"Also return certificates issued for subdomains. Defaults to false."}},"required":["domain"]},"output_example":{"domain":"github.com","source":"api.certspotter.com","found":true,"count":12,"current":{"issuer":"Sectigo","notAfter":"2026-11-29T23:59:59Z","daysToExpiry":79,"names":["github.com","www.github.com"]},"expiringSoon":[],"issuers":[{"name":"Sectigo","count":8}],"hostnames":["github.com","www.github.com"]},"tags":["ssl check","ssl certificate","tls certificate","certificate expiry","certificate transparency","ct logs","cert monitoring","subdomain discovery","shadow it","domain security","list cleaning"],"example":{"method":"GET","queryParams":{"domain":"github.com"}}},{"path":"/v1/red/cert","method":"POST","name":"TLS certificate lookup (Certificate Transparency)","description":"Every currently valid TLS certificate publicly issued for one domain, read from the Certificate Transparency logs: issuer, validity window, days to expiry, revocation status and every hostname each certificate covers. It reports what was ISSUED, which is how you find certificates you did not know existed - not what the server is serving today. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"domain":{"type":"string","description":"The domain to look up. A full URL or an email address is accepted and reduced to its host."},"subdomains":{"type":"boolean","description":"Also return certificates issued for subdomains. Defaults to false."}},"required":["domain"]},"output_example":{"domain":"github.com","source":"api.certspotter.com","found":true,"count":12,"current":{"issuer":"Sectigo","notAfter":"2026-11-29T23:59:59Z","daysToExpiry":79,"names":["github.com","www.github.com"]},"expiringSoon":[],"issuers":[{"name":"Sectigo","count":8}],"hostnames":["github.com","www.github.com"]},"tags":["ssl check","ssl certificate","tls certificate","certificate expiry","certificate transparency","ct logs","cert monitoring","subdomain discovery","shadow it","domain security","list cleaning"],"example":{"method":"POST","bodyType":"json","body":{"domain":"github.com"}}},{"path":"/v1/crypto/sanctions","method":"GET","name":"OFAC sanctions check for a crypto address","description":"Checks one crypto address against the OFAC SDN list published by the US Treasury, across 16 currencies including Ethereum, Bitcoin, Tron and USDT. A hit returns the actual list entry - sanctioned entity, its type and its sanctions programmes - not a risk score. Exact matching only, never fuzzy. Every answer carries the publication date of the list snapshot. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.01,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"address":{"type":"string","description":"The crypto address to check. Any chain: EVM, Bitcoin, Tron, Litecoin, Monero and the rest of the list."}},"required":["address"]},"output_example":{"address":"0x252a8bd2319d8a555b872990601221b3a2053bce","listed":true,"format":"evm","currency":"ETH","entity":{"uid":"24003","name":"MESRI, Behzad","type":"individual","programs":["HRIT-IR","CYBER2"]},"list":"OFAC SDN","listPublished":"2026-09-10T18:31:57.000Z","listSize":505},"tags":["ofac","sanctions screening","sdn list","wallet screening","address screening","aml","compliance","sanctioned address","crypto compliance","kyt","list cleaning"],"example":{"method":"GET","queryParams":{"address":"0x252a8bd2319d8a555b872990601221b3a2053bce"}}},{"path":"/v1/crypto/sanctions","method":"POST","name":"OFAC sanctions check for a crypto address","description":"Checks one crypto address against the OFAC SDN list published by the US Treasury, across 16 currencies including Ethereum, Bitcoin, Tron and USDT. A hit returns the actual list entry - sanctioned entity, its type and its sanctions programmes - not a risk score. Exact matching only, never fuzzy. Every answer carries the publication date of the list snapshot. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.01,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"address":{"type":"string","description":"The crypto address to check. Any chain: EVM, Bitcoin, Tron, Litecoin, Monero and the rest of the list."}},"required":["address"]},"output_example":{"address":"0x252a8bd2319d8a555b872990601221b3a2053bce","listed":true,"format":"evm","currency":"ETH","entity":{"uid":"24003","name":"MESRI, Behzad","type":"individual","programs":["HRIT-IR","CYBER2"]},"list":"OFAC SDN","listPublished":"2026-09-10T18:31:57.000Z","listSize":505},"tags":["ofac","sanctions screening","sdn list","wallet screening","address screening","aml","compliance","sanctioned address","crypto compliance","kyt","list cleaning"],"example":{"method":"POST","bodyType":"json","body":{"address":"0x252a8bd2319d8a555b872990601221b3a2053bce"}}},{"path":"/v1/ai/image","method":"GET","name":"Text-to-image (FLUX.1 schnell)","description":"Generates a 1024x1024 JPEG from a text prompt with FLUX.1 [schnell] in about 2 seconds. Returns a hosted image URL valid for 24 hours that you can hand straight to the next tool; add inline=true to also get the base64. Choose 1-8 diffusion steps (default 4). You are only charged if the image is delivered. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.02,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What to draw, up to 2048 characters. English works best."},"steps":{"type":"number","description":"Diffusion steps, 1-8. More is sharper and slower. Default 4."},"inline":{"type":"boolean","description":"Also return the JPEG as base64. Default false."}},"required":["prompt"]},"output_example":{"url":"https://flat-rate-llm.kikoribera03.workers.dev/m/5f0c2a9e41b7d3e8a6c1f042.jpg","expires":"2026-09-14T18:00:00.000Z","mime":"image/jpeg","width":1024,"height":1024,"steps":4,"model":"@cf/black-forest-labs/flux-1-schnell","bytes":585346},"tags":["text to image","image generation","flux","ai image","generate image","stable diffusion alternative"],"example":{"method":"GET","queryParams":{"prompt":"a red fox reading a newspaper, watercolor","steps":4}}},{"path":"/v1/ai/image","method":"POST","name":"Text-to-image (FLUX.1 schnell)","description":"Generates a 1024x1024 JPEG from a text prompt with FLUX.1 [schnell] in about 2 seconds. Returns a hosted image URL valid for 24 hours that you can hand straight to the next tool; add inline=true to also get the base64. Choose 1-8 diffusion steps (default 4). You are only charged if the image is delivered. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.02,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What to draw, up to 2048 characters. English works best."},"steps":{"type":"number","description":"Diffusion steps, 1-8. More is sharper and slower. Default 4."},"inline":{"type":"boolean","description":"Also return the JPEG as base64. Default false."}},"required":["prompt"]},"output_example":{"url":"https://flat-rate-llm.kikoribera03.workers.dev/m/5f0c2a9e41b7d3e8a6c1f042.jpg","expires":"2026-09-14T18:00:00.000Z","mime":"image/jpeg","width":1024,"height":1024,"steps":4,"model":"@cf/black-forest-labs/flux-1-schnell","bytes":585346},"tags":["text to image","image generation","flux","ai image","generate image","stable diffusion alternative"],"example":{"method":"POST","bodyType":"json","body":{"prompt":"a red fox reading a newspaper, watercolor","steps":4}}},{"path":"/v1/ai/image-styled","method":"GET","name":"Illustration from text, with a seed (DreamShaper 8)","description":"Generates an illustration from a text prompt with DreamShaper 8 LCM in about 2 seconds: painterly and character art rather than photoreal. Takes a seed for a repeatable result, a negative prompt, and your own width and height. Returns a hosted image URL valid for 24 hours; add inline=true to also get the base64. You are only charged if the image is delivered. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.01,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What to draw, up to 2048 characters. English works best."},"negative_prompt":{"type":"string","description":"What to keep out of the image, up to 1024 characters."},"width":{"type":"number","description":"Width in pixels, a multiple of 8 between 256 and 1536. Default 1024."},"height":{"type":"number","description":"Height in pixels, a multiple of 8 between 256 and 1536. Default 1024."},"steps":{"type":"number","description":"Diffusion steps, 1-20."},"guidance":{"type":"number","description":"How closely to follow the prompt, 0-20."},"seed":{"type":"number","description":"Same prompt and same seed give the same image."},"inline":{"type":"boolean","description":"Also return the image as base64. Default false."}},"required":["prompt"]},"output_example":{"url":"https://flat-rate-llm.kikoribera03.workers.dev/m/7b1d3e8a6c1f0425f0c2a9e4.png","expires":"2026-10-02T00:00:00.000Z","mime":"image/png","width":1024,"height":1024,"seed":42,"model":"@cf/lykon/dreamshaper-8-lcm","bytes":471028},"tags":["illustration","text to image","art","character art","seed","stable diffusion"],"example":{"method":"GET","queryParams":{"prompt":"a red fox reading a newspaper, watercolor","seed":42}}},{"path":"/v1/ai/image-styled","method":"POST","name":"Illustration from text, with a seed (DreamShaper 8)","description":"Generates an illustration from a text prompt with DreamShaper 8 LCM in about 2 seconds: painterly and character art rather than photoreal. Takes a seed for a repeatable result, a negative prompt, and your own width and height. Returns a hosted image URL valid for 24 hours; add inline=true to also get the base64. You are only charged if the image is delivered. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.01,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What to draw, up to 2048 characters. English works best."},"negative_prompt":{"type":"string","description":"What to keep out of the image, up to 1024 characters."},"width":{"type":"number","description":"Width in pixels, a multiple of 8 between 256 and 1536. Default 1024."},"height":{"type":"number","description":"Height in pixels, a multiple of 8 between 256 and 1536. Default 1024."},"steps":{"type":"number","description":"Diffusion steps, 1-20."},"guidance":{"type":"number","description":"How closely to follow the prompt, 0-20."},"seed":{"type":"number","description":"Same prompt and same seed give the same image."},"inline":{"type":"boolean","description":"Also return the image as base64. Default false."}},"required":["prompt"]},"output_example":{"url":"https://flat-rate-llm.kikoribera03.workers.dev/m/7b1d3e8a6c1f0425f0c2a9e4.png","expires":"2026-10-02T00:00:00.000Z","mime":"image/png","width":1024,"height":1024,"seed":42,"model":"@cf/lykon/dreamshaper-8-lcm","bytes":471028},"tags":["illustration","text to image","art","character art","seed","stable diffusion"],"example":{"method":"POST","bodyType":"json","body":{"prompt":"a red fox reading a newspaper, watercolor","seed":42}}},{"path":"/v1/ai/image-edit","method":"GET","name":"Edit an image you already have (inpainting)","description":"Edits an image you provide instead of generating one from scratch: pass the image and a black-and-white mask, and Stable Diffusion inpainting repaints only the white area following your prompt. Image and mask go as https URLs or as base64, up to 10 MB each. Returns a hosted image URL valid for 24 hours. You are only charged if the edit is delivered. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.02,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What to paint into the masked area, up to 2048 characters."},"url":{"type":"string","description":"https URL of the image to edit. Use this or image."},"image":{"type":"string","description":"The image to edit, as base64. Use this or url."},"mask_url":{"type":"string","description":"https URL of the mask: white where it should repaint, black where it must not. Use this or mask."},"mask":{"type":"string","description":"The mask, as base64. Use this or mask_url."},"steps":{"type":"number","description":"Diffusion steps, 1-20."},"guidance":{"type":"number","description":"How closely to follow the prompt, 0-20."},"seed":{"type":"number","description":"Same inputs and same seed give the same edit."}},"required":["prompt"]},"output_example":{"url":"https://flat-rate-llm.kikoribera03.workers.dev/m/0425f0c2a9e47b1d3e8a6c1f.png","expires":"2026-10-02T00:00:00.000Z","mime":"image/png","model":"@cf/runwayml/stable-diffusion-v1-5-inpainting","bytes":465282},"tags":["inpainting","image editing","edit image","mask","remove object","stable diffusion"],"example":{"method":"GET","queryParams":{"prompt":"a blue wool hat on the fox","url":"https://flat-rate-llm.kikoribera03.workers.dev/m/muestra-imagen.jpg","mask_url":"https://flat-rate-llm.kikoribera03.workers.dev/m/muestra-mascara.png"}}},{"path":"/v1/ai/image-edit","method":"POST","name":"Edit an image you already have (inpainting)","description":"Edits an image you provide instead of generating one from scratch: pass the image and a black-and-white mask, and Stable Diffusion inpainting repaints only the white area following your prompt. Image and mask go as https URLs or as base64, up to 10 MB each. Returns a hosted image URL valid for 24 hours. You are only charged if the edit is delivered. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.02,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What to paint into the masked area, up to 2048 characters."},"url":{"type":"string","description":"https URL of the image to edit. Use this or image."},"image":{"type":"string","description":"The image to edit, as base64. Use this or url."},"mask_url":{"type":"string","description":"https URL of the mask: white where it should repaint, black where it must not. Use this or mask."},"mask":{"type":"string","description":"The mask, as base64. Use this or mask_url."},"steps":{"type":"number","description":"Diffusion steps, 1-20."},"guidance":{"type":"number","description":"How closely to follow the prompt, 0-20."},"seed":{"type":"number","description":"Same inputs and same seed give the same edit."}},"required":["prompt"]},"output_example":{"url":"https://flat-rate-llm.kikoribera03.workers.dev/m/0425f0c2a9e47b1d3e8a6c1f.png","expires":"2026-10-02T00:00:00.000Z","mime":"image/png","model":"@cf/runwayml/stable-diffusion-v1-5-inpainting","bytes":465282},"tags":["inpainting","image editing","edit image","mask","remove object","stable diffusion"],"example":{"method":"POST","bodyType":"json","body":{"prompt":"a blue wool hat on the fox","url":"https://flat-rate-llm.kikoribera03.workers.dev/m/muestra-imagen.jpg","mask_url":"https://flat-rate-llm.kikoribera03.workers.dev/m/muestra-mascara.png"}}},{"path":"/v1/ai/image-describe","method":"GET","name":"Describe what is in an image","description":"Describes what is in an image in about one second: pass an https URL or base64 and ask anything about it, from a one-line caption to reading a sign. Pairs with the rest of the chain: describe an image, translate the description, then have it read aloud. You are only charged if the description is delivered. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"https URL of the image to describe. Use this or image."},"image":{"type":"string","description":"The image, as base64. Use this or url."},"prompt":{"type":"string","description":"What to ask about the image. Default: a one-sentence description."},"max_tokens":{"type":"number","description":"Length limit of the answer, 16-512. Default 128."}},"required":[]},"output_example":{"description":"A fox is sitting on a chair and reading a newspaper.","model":"gemini/gemini-3.5-flash-lite","imageBytes":45311},"tags":["image to text","image captioning","describe image","vision","alt text","llava"],"example":{"method":"GET","queryParams":{"url":"https://flat-rate-llm.kikoribera03.workers.dev/m/muestra-imagen.jpg","prompt":"Describe this image in one sentence."}}},{"path":"/v1/ai/image-describe","method":"POST","name":"Describe what is in an image","description":"Describes what is in an image in about one second: pass an https URL or base64 and ask anything about it, from a one-line caption to reading a sign. Pairs with the rest of the chain: describe an image, translate the description, then have it read aloud. You are only charged if the description is delivered. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"https URL of the image to describe. Use this or image."},"image":{"type":"string","description":"The image, as base64. Use this or url."},"prompt":{"type":"string","description":"What to ask about the image. Default: a one-sentence description."},"max_tokens":{"type":"number","description":"Length limit of the answer, 16-512. Default 128."}},"required":[]},"output_example":{"description":"A fox is sitting on a chair and reading a newspaper.","model":"gemini/gemini-3.5-flash-lite","imageBytes":45311},"tags":["image to text","image captioning","describe image","vision","alt text","llava"],"example":{"method":"POST","bodyType":"json","body":{"url":"https://flat-rate-llm.kikoribera03.workers.dev/m/muestra-imagen.jpg","prompt":"Describe this image in one sentence."}}},{"path":"/v1/ai/speech","method":"GET","name":"Text-to-speech (Aura-2 / MeloTTS)","description":"Turns text into natural speech in English, Spanish, French, Chinese, Japanese or Korean in one or two seconds: Deepgram Aura-2 for English and Spanish, MeloTTS for the rest. Returns a hosted audio URL valid for 24 hours (MP3 for English and Spanish, WAV otherwise) plus its size; add inline=true to also get the base64. Up to 2000 characters per call. You are only charged if the audio is delivered. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.01,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"text":{"type":"string","description":"What to say, up to 2000 characters."},"lang":{"type":"string","description":"en, es, fr, zh, ja or ko. Default en."},"inline":{"type":"boolean","description":"Also return the WAV as base64. Default false."}},"required":["text"]},"output_example":{"url":"https://flat-rate-llm.kikoribera03.workers.dev/m/9b2e6d4a1c0f8e7d3a5b2c11.mp3","expires":"2026-09-14T18:00:00.000Z","mime":"audio/mpeg","lang":"en","characters":50,"model":"@cf/deepgram/aura-2-en","bytes":16128},"tags":["text to speech","tts","speech synthesis","voice","audio generation","read aloud"],"example":{"method":"GET","queryParams":{"text":"Your order has shipped and will arrive on Tuesday.","lang":"en"}}},{"path":"/v1/ai/speech","method":"POST","name":"Text-to-speech (Aura-2 / MeloTTS)","description":"Turns text into natural speech in English, Spanish, French, Chinese, Japanese or Korean in one or two seconds: Deepgram Aura-2 for English and Spanish, MeloTTS for the rest. Returns a hosted audio URL valid for 24 hours (MP3 for English and Spanish, WAV otherwise) plus its size; add inline=true to also get the base64. Up to 2000 characters per call. You are only charged if the audio is delivered. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.01,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"text":{"type":"string","description":"What to say, up to 2000 characters."},"lang":{"type":"string","description":"en, es, fr, zh, ja or ko. Default en."},"inline":{"type":"boolean","description":"Also return the WAV as base64. Default false."}},"required":["text"]},"output_example":{"url":"https://flat-rate-llm.kikoribera03.workers.dev/m/9b2e6d4a1c0f8e7d3a5b2c11.mp3","expires":"2026-09-14T18:00:00.000Z","mime":"audio/mpeg","lang":"en","characters":50,"model":"@cf/deepgram/aura-2-en","bytes":16128},"tags":["text to speech","tts","speech synthesis","voice","audio generation","read aloud"],"example":{"method":"POST","bodyType":"json","body":{"text":"Your order has shipped and will arrive on Tuesday.","lang":"en"}}},{"path":"/v1/ai/transcribe","method":"GET","name":"Speech-to-text (Whisper large v3 turbo)","description":"Transcribes an audio file with Whisper large v3 turbo: pass an https URL (mp3, wav, flac, m4a, ogg, up to 10 MB) or base64 audio in a POST. Returns the text, the detected language with its probability, the duration, and timed segments; add words=true for word-level timestamps. Around 100 languages. You are only charged if the transcript is delivered. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.02,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"https URL of the audio file, up to 10 MB."},"audio":{"type":"string","description":"Alternative to url: the audio as base64 (POST only)."},"language":{"type":"string","description":"Optional ISO code to skip detection, e.g. es."},"words":{"type":"boolean","description":"Include word-level timestamps. Default false."}},"required":[]},"output_example":{"text":"Hello from the Flat Rate Gateway, this is a short test.","language":"en","languageProbability":1,"durationSeconds":3.27,"segments":[{"start":0,"end":2.8,"text":"Hello from the Flat Rate Gateway, this is a short test."}],"model":"@cf/openai/whisper-large-v3-turbo"},"tags":["speech to text","transcription","whisper","audio transcription","stt","subtitles"],"example":{"method":"GET","queryParams":{"url":"https://flat-rate-llm.kikoribera03.workers.dev/m/muestra-voz.wav"}}},{"path":"/v1/ai/transcribe","method":"POST","name":"Speech-to-text (Whisper large v3 turbo)","description":"Transcribes an audio file with Whisper large v3 turbo: pass an https URL (mp3, wav, flac, m4a, ogg, up to 10 MB) or base64 audio in a POST. Returns the text, the detected language with its probability, the duration, and timed segments; add words=true for word-level timestamps. Around 100 languages. You are only charged if the transcript is delivered. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.02,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"https URL of the audio file, up to 10 MB."},"audio":{"type":"string","description":"Alternative to url: the audio as base64 (POST only)."},"language":{"type":"string","description":"Optional ISO code to skip detection, e.g. es."},"words":{"type":"boolean","description":"Include word-level timestamps. Default false."}},"required":[]},"output_example":{"text":"Hello from the Flat Rate Gateway, this is a short test.","language":"en","languageProbability":1,"durationSeconds":3.27,"segments":[{"start":0,"end":2.8,"text":"Hello from the Flat Rate Gateway, this is a short test."}],"model":"@cf/openai/whisper-large-v3-turbo"},"tags":["speech to text","transcription","whisper","audio transcription","stt","subtitles"],"example":{"method":"POST","bodyType":"json","body":{"url":"https://flat-rate-llm.kikoribera03.workers.dev/m/muestra-voz.wav"}}},{"path":"/v1/ai/translate","method":"GET","name":"Translate text (M2M100, 100 languages)","description":"Translates text between about 100 languages with Meta M2M100 1.2B: pass the text and the target language (ISO code like es, fr, de, zh, ja, or its English name); the source language is detected if omitted. Long texts are split by sentence, so paragraphs keep their order and line breaks. Up to 2000 characters per call. Pairs with speech-to-text: translate a transcript, then read it aloud. You are only charged if the translation is delivered. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"text":{"type":"string","description":"What to translate, up to 2000 characters."},"to":{"type":"string","description":"Target language: ISO code (es, fr, de, zh, ja...) or English name (spanish)."},"from":{"type":"string","description":"Optional source language; detected when omitted."}},"required":["text","to"]},"output_example":{"text":"Su pedido ha sido enviado y llegará el martes.","from":"auto","to":"es","characters":50,"pieces":1,"model":"@cf/meta/m2m100-1.2b"},"tags":["translation","translate","machine translation","multilingual","language","localization"],"example":{"method":"GET","queryParams":{"text":"Your order has shipped and will arrive on Tuesday.","to":"es"}}},{"path":"/v1/ai/translate","method":"POST","name":"Translate text (M2M100, 100 languages)","description":"Translates text between about 100 languages with Meta M2M100 1.2B: pass the text and the target language (ISO code like es, fr, de, zh, ja, or its English name); the source language is detected if omitted. Long texts are split by sentence, so paragraphs keep their order and line breaks. Up to 2000 characters per call. Pairs with speech-to-text: translate a transcript, then read it aloud. You are only charged if the translation is delivered. No API key, no account.","pricing":[{"product":"micro_per_call","amount_usdc":0.005,"description":"Pay per call over x402. No key, no account, no metering."}],"input_schema":{"type":"object","properties":{"text":{"type":"string","description":"What to translate, up to 2000 characters."},"to":{"type":"string","description":"Target language: ISO code (es, fr, de, zh, ja...) or English name (spanish)."},"from":{"type":"string","description":"Optional source language; detected when omitted."}},"required":["text","to"]},"output_example":{"text":"Su pedido ha sido enviado y llegará el martes.","from":"auto","to":"es","characters":50,"pieces":1,"model":"@cf/meta/m2m100-1.2b"},"tags":["translation","translate","machine translation","multilingual","language","localization"],"example":{"method":"POST","bodyType":"json","body":{"text":"Your order has shipped and will arrive on Tuesday.","to":"es"}}},{"path":"/v2/inferencia","method":"POST","name":"LLM completion","description":"LLM inference at a flat $1.00 per call, with no account, no API key and no token metering. POST a prompt, get the completion: the same price for 10 tokens or 4000, while metered gateways scale with usage. Automatic failover across several large models; typical response under 1s. Pay per call in USDC over x402 - nothing to sign up for.","pricing":[{"product":"micro_per_call","amount_usdc":1,"description":"Flat price per completion, whatever the size of the prompt."}],"input_schema":{"type":"object","properties":{"prompt":{"type":"string","description":"The request for the model. Up to 24000 characters."},"sistema":{"type":"string","description":"Optional system instruction."},"maxTokens":{"type":"number","description":"Output token cap, up to 4000. Does not change the price."}},"required":["prompt"]},"output_example":{"respuesta":"x402 is an HTTP-native payment protocol...","modelo":"@cf/meta/llama-3.3-70b-instruct-fp8-fast","segundos":0.9},"tags":["llm completion","llm","inference","ai","text generation","completion"],"example":{"method":"POST","bodyType":"json","body":{"prompt":"Summarise in one line what the x402 protocol is."}}}],"free_endpoints":[{"path":"/","method":"GET","description":"Service catalogue: every route with its price."},{"path":"/openapi.json","method":"GET","description":"Full OpenAPI 3.1 contract."},{"path":"/modelos","method":"GET","description":"Which LLM models are live right now."},{"path":"/mcp","method":"POST","description":"MCP server: tools/list is free, tools/call is paid."},{"path":"/llms.txt","method":"GET","description":"The catalogue in markdown, written to be read by a model."},{"path":"/ledger","method":"GET","description":"Every settled call with its on-chain transaction. Our own test payments are marked apart."},{"path":"/.well-known/skills/index.md","method":"GET","description":"How to chain the endpoints instead of calling them one at a time."}],"chains":[{"id":"domain","title":"Check a domain end to end","answers":"Is this domain real, who owns it, does it work, and what does it serve?","steps":[{"path":"/v1/red/whois","method":"GET","what":"Registration from the registry own RDAP service: age, expiry, registrar, EPP status, nameservers, DNSSEC, abuse contact."},{"path":"/v1/red/domain-check","method":"GET","what":"What DNS holds right now: A/AAAA, nameservers, MX, SPF, DMARC, DNSSEC and the parked heuristic."},{"path":"/v1/red/cert","method":"GET","what":"Every TLS certificate issued for it in the Certificate Transparency logs: issuer, days to expiry, revocation and every hostname covered — subdomains included on request."},{"path":"/v1/web/status","method":"GET","what":"Whether anything is served: status, the full redirect chain hop by hop, final scheme and security headers."},{"path":"/v1/web/read","method":"GET","what":"The page itself as markdown, stripped of boilerplate, with title, language, canonical url and word count."}],"leads_to":"/v1/red/ip — the address it resolves to has its own chain; and /v1/red/email-check, offered on the registry abuse contact when the registry publishes one.","guide":"https://flat-rate-llm.kikoribera03.workers.dev/.well-known/skills/domain.md","how":"Every answer in the chain carries a `next` array: route, method, parameters already filled in from what was just found, price and a ready-made url."},{"id":"ip","title":"Check an IP address end to end","answers":"Who holds this address, who announces it, and is it burnt?","steps":[{"path":"/v1/red/ip","method":"GET","what":"RDAP registry record through the ARIN-to-RIR referral chain, plus the origin ASN from Team Cymru."},{"path":"/v1/red/asn","method":"GET","what":"The announcing network: holder, allocation, abuse contact and every prefix in the routing table right now."},{"path":"/v1/red/dnsbl","method":"GET","what":"Nine public blocklists at once, each re-checked against its own RFC 5782 test entry."}],"leads_to":"/v1/red/email-check — the abuse contact of either record, checked before you write to it.","guide":"https://flat-rate-llm.kikoribera03.workers.dev/.well-known/skills/ip.md","how":"Every answer in the chain carries a `next` array: route, method, parameters already filled in from what was just found, price and a ready-made url."},{"id":"wallet","title":"Look up an EVM address end to end","answers":"Whose address is this, what does it hold, and is it a person or a contract?","steps":[{"path":"/v1/evm/ens","method":"GET","what":"ENS name to address and back, so you can start from either one."},{"path":"/v1/evm/balance","method":"GET","what":"Native coin balance on Base, Ethereum, Polygon, Arbitrum or Optimism."},{"path":"/v1/crypto/sanctions","method":"GET","what":"Whether it is on the OFAC SDN list, with the published entry - entity, type and sanctions programmes - and the snapshot date. No network call, so it cannot be down."},{"path":"/v1/evm/nonce","method":"GET","what":"How many transactions it has ever sent, the pending nonce, and whether there is code at the address."},{"path":"/v1/evm/token-safety","method":"GET","what":"If there is code behind it - a contract, or the contract an EIP-7702 wallet delegates to: what that code can do to you, proxy, owner, renounced ownership and pause switch, with the evidence for each finding."}],"leads_to":"/v1/evm/nonce again — token-safety hands you the owner address, and an owner is just another address to run this chain on.","guide":"https://flat-rate-llm.kikoribera03.workers.dev/.well-known/skills/wallet.md","how":"Every answer in the chain carries a `next` array: route, method, parameters already filled in from what was just found, price and a ready-made url."},{"id":"transaction","title":"Find out what a transaction did","answers":"What did this transaction do, what did it cost, and who was on the other side?","steps":[{"path":"/v1/evm/tx","method":"GET","what":"What was asked: sender, destination, value, nonce, block and status."},{"path":"/v1/evm/receipt","method":"GET","what":"What happened: fee actually paid, gas used, how many logs it emitted and any contract it deployed."},{"path":"/v1/evm/is-contract","method":"GET","what":"What the destination actually is: a contract, and how big its code is, or a plain wallet."},{"path":"/v1/evm/token-info","method":"GET","what":"If the destination was a contract: name, symbol, decimals and total supply, read straight from it."}],"leads_to":"/v1/evm/token-safety — any contract this transaction touched can be run through the token chain.","guide":"https://flat-rate-llm.kikoribera03.workers.dev/.well-known/skills/transaction.md","how":"Every answer in the chain carries a `next` array: route, method, parameters already filled in from what was just found, price and a ready-made url."},{"id":"token","title":"Check an ERC20 token before you trust it","answers":"Is this token what it claims, what is it worth, and who can still change it under you?","steps":[{"path":"/v1/evm/token-info","method":"GET","what":"Name, symbol, decimals and total supply, read from the contract rather than from a listing site."},{"path":"/v1/evm/token-price","method":"GET","what":"What it is worth right now, from the deepest Uniswap V3 pool against USDC — with the pool address, fee tier, liquidity, sqrtPriceX96, tick and block, so the number can be audited instead of trusted. No aggregator and no API key."},{"path":"/v1/evm/token-safety","method":"GET","what":"Proxy and implementation, owner, whether ownership is renounced, whether transfers can be paused — every finding with the call that produced it."},{"path":"/v1/evm/is-contract","method":"GET","what":"For a proxy: whether there is real code at the implementation it currently points to."},{"path":"/v1/evm/nonce","method":"GET","what":"For an owner that has not renounced: whether it is a multisig contract or a plain wallet, and how active it is."}],"leads_to":"/v1/evm/erc20-balance and /v1/evm/erc20-allowance — once you trust the token, what an address holds of it and what it has approved.","guide":"https://flat-rate-llm.kikoribera03.workers.dev/.well-known/skills/token.md","how":"Every answer in the chain carries a `next` array: route, method, parameters already filled in from what was just found, price and a ready-made url."},{"id":"evm-health","title":"Pick a chain and know what writing to it costs","answers":"Which chain is actually answering, is its head fresh, and what will a transaction cost right now?","steps":[{"path":"/v1/evm/chains","method":"GET","what":"Live health of every supported chain in one call: chain id, block height and how stale each head is. Start here when you do not yet know which chain to use."},{"path":"/v1/evm/block","method":"GET","what":"The head of the chain you picked: height, hash, timestamp, transaction count and how many seconds old it is. A node that is behind returns stale answers without saying so."},{"path":"/v1/evm/gas","method":"GET","what":"What it costs to write to it right now: gas price in wei and gwei, the current base fee, and the cost of a plain transfer."},{"path":"/v1/evm/fees","method":"GET","what":"And the numbers that actually get a transaction mined: maxFeePerGas and maxPriorityFeePerGas at the slow, normal and fast percentiles of the last 20 blocks of real fee history."}],"leads_to":"/v1/evm/estimate-gas — you know what a unit costs; this says how many units your call needs, and hands you back to /v1/evm/fees with the amount in hand.","guide":"https://flat-rate-llm.kikoribera03.workers.dev/.well-known/skills/evm-health.md","how":"Every answer in the chain carries a `next` array: route, method, parameters already filled in from what was just found, price and a ready-made url."},{"id":"time","title":"Turn a place into a time zone, and compare two clocks","answers":"What is this place's zone actually called, what time is it there, and how far is it from another one?","steps":[{"path":"/v1/time/zones","method":"GET","what":"Search the full IANA list and turn a city or a country into the exact zone name the other endpoints expect, with each zone's current offset, abbreviation, local time and DST state."},{"path":"/v1/time/now","method":"GET","what":"The current time in the zone you picked, in every form at once: ISO with offset, 24-hour, 12-hour, weekday, unix and UTC — plus whether daylight saving is active now and what the zone's standard offset is."},{"path":"/v1/time/convert","method":"GET","what":"The gap between two of the zones that search returned, with daylight saving applied from the tz database, and a warning when the time asked for does not exist or happens twice because the clocks change that day."}],"leads_to":"/v1/time/zones again — /v1/time/now hands you back every zone sitting at the same offset right now, which is where the two ends of a conversion come from.","guide":"https://flat-rate-llm.kikoribera03.workers.dev/.well-known/skills/time.md","how":"Every answer in the chain carries a `next` array: route, method, parameters already filled in from what was just found, price and a ready-made url."},{"id":"voice","title":"Hear audio in another language","answers":"What does this recording say, in my language, and can I hear it read aloud?","steps":[{"path":"/v1/ai/transcribe","method":"GET","what":"Whisper large v3 turbo turns the audio into text, with the detected language, its probability and timed segments."},{"path":"/v1/ai/translate","method":"GET","what":"M2M100 translates the transcript into any of ~100 languages, piece by piece so long texts keep their order and line breaks."},{"path":"/v1/ai/speech","method":"GET","what":"Reads the translation aloud: a hosted MP3 (Deepgram Aura-2 for English and Spanish) or WAV (MeloTTS for French, Chinese, Japanese, Korean)."}],"leads_to":"/v1/ai/transcribe again — the audio link that speech returns can be transcribed to check what was said.","guide":"https://flat-rate-llm.kikoribera03.workers.dev/.well-known/skills/voice.md","how":"Every answer in the chain carries a `next` array: route, method, parameters already filled in from what was just found, price and a ready-made url."}],"checkout_flow":"Call the endpoint with no payment, get 402 with the challenge in the PAYMENT-REQUIRED header (base64, x402 v2), sign an EIP-3009 authorisation for the stated amount and repeat the call with the X-PAYMENT header.","compatibility":{"x402":["v1","v2"],"mcp":true,"openapi":"3.1.0"}}