Live demo · PortaldotV3 testnet · test tokens only

Buy a real API call from this page.

No wallet, no install. A public test key in this page signs a voucher against a capped prepaid session, the hosted seller checks it and answers. Nothing goes on-chain per request: the seller settles many requests in one transaction, in Solidity and ink! together, and each batch carries a signature from the session key over the requests made and the responses received. Test tokens only.

This page was pre-rendered from the live PortaldotV3 testnet at 2026-11-07T12:52:12Z, including the replay of the public session below. With JavaScript on, your browser reads every panel again from the chain.

Buy one request

0.01 pUSD per call · endpoint 3
    
            
    1. HTTP 402. The seller quotes 0.01 pUSD for endpoint 3.
    2. A voucher, signed here. Your browser signs it with the page's public test key: no gas, no wallet.
    3. HTTP 200. The data arrives with a provider-signed receipt, and its hash is checked.
    4. Settled later, in bulk. The seller redeems this request with many others in one Ethereum transaction, listed in the batches table.

    The public session, live from the seller

    56requests in this session
    0.56 pUSDspent
    1.94 pUSDbudget left
    257requests settled, all sessions
    8on-chain transactions for them
    0waiting for the next batch
    blockrequests settledsessionsone Ethereum tx
    350726910x81b1bd7d…cca0b953
    3416731310x79ff6250…9e9f349f
    329697110x24aa5a19…9a18b770
    322401510x6ce0ba08…0dc245b5
    2993701910x9075726b…98429c86
    286350610x53ab89ba…51eb24ba
    28255913730xe5038746…aded7f09
    2824706720xe388295c…9c3992db

    What one request costs on-chain

    per-request escrowprepaid session
    on-chain transactions, 1 request2: pay, then settlenone: a voucher signed over HTTP
    on-chain transactions, 100 requests2003: open, one settlement batch, close
    locked for good per request7.53 tPOT0.076 tPOT, in a 100-request session
    locked for good, 100 requestsabout 753 tPOT7.6 tPOT

    Measured on this testnet with our own keys, blocks 276657 to 276660 and 282559. Test tokens have no value; the ratio is the point.

    Check it against the chain

    Replays the seller's public log of this session against the payer-signed head in each Redeemed event on the EVM and its ink! anchor on the WASM VM.

    Replayed at 2026-11-07T12:52:12Z against the chain:

    ACCEPT
    • PASSlog replays from the session genesis 56 requests
    • PASSbatch up to request 4 matches the payer-signed head on-chain (responses 1 to 3 acknowledged) 0xc840118140…930faedee7
    • PASSbatch up to request 10 matches the payer-signed head on-chain (responses 1 to 9 acknowledged) 0x713d46f412…5c2150be0e
    • PASSbatch up to request 29 matches the payer-signed head on-chain (responses 1 to 28 acknowledged) 0x4e32c3711b…36aebde289
    • PASSbatch up to request 34 matches the payer-signed head on-chain (responses 1 to 33 acknowledged) 0xf62fddfae4…c35714ddff
    • PASSbatch up to request 47 matches the payer-signed head on-chain (responses 1 to 46 acknowledged) 0xf41cdf2b5e…7a6081c66e
    • PASSbatch up to request 56 matches the payer-signed head on-chain (responses 1 to 55 acknowledged) 0x2fb90d690e…fc7b6ab084
    • PASSink! anchor of the batch up to request 4: endpoint, amount and receipt hash block 282470, 40000 paid
    • PASSink! anchor of the batch up to request 10: endpoint, amount and receipt hash block 286350, 60000 paid
    • PASSink! anchor of the batch up to request 29: endpoint, amount and receipt hash block 299370, 190000 paid
    • PASSink! anchor of the batch up to request 34: endpoint, amount and receipt hash block 322401, 50000 paid
    • PASSink! anchor of the batch up to request 47: endpoint, amount and receipt hash block 341673, 130000 paid
    • PASSink! anchor of the batch up to request 56: endpoint, amount and receipt hash block 350726, 90000 paid

    Session 0x3dfa2eac…08395039: 56 requests in the public log, redeemed on-chain in batches up to request 4, 10, 29, 34, 47, 56. The latest requests:

    requestrequest hashresponse hash
    560x26bfbce8…f0a7b0a00xf249fb2c…40f70614
    550x26bfbce8…f0a7b0a00x640222e2…198d7298
    540x26bfbce8…f0a7b0a00x3475ff94…7d9dd4f5
    530x26bfbce8…f0a7b0a00x938077c7…d8d873b4
    520x26bfbce8…f0a7b0a00xe79a2dc8…0567393c
    Two ways to pay

    Per-request escrow, and prepaid sessions

    An API provider lists an endpoint with a price. A client pays for one request in an ERC-20 (here a Portaldot native asset, reached through the pallet-assets ERC-20 precompile). The payment waits in escrow in a Solidity contract on Portaldot's EVM. The provider settles it once it has served the request, or refunds it. An ink! registry on Portaldot's WASM VM keeps the provider's public record. Everything on this page is read live from the testnet by your browser.

    1. 1GET, then a 402 quote
    2. 2pay() on EVM
    3. 3retry with signed proof
    4. 4served once + receipt
    5. 5settle + ink! record, one tx

    That is the escrow path, for calls worth a few cents or more. High-frequency APIs use a prepaid session: one budget, a signed voucher per request, many requests settled in one transaction.

    Demo video, 2:23

    The measured cost problem, a real call bought from this page, block 282559 settling 137 requests in one transaction, the log replayed against the chain, and the escrow path. Watch on YouTube or download the MP4 (7 MB).

    Network

    EVM chain id
    420420777 (0x190f1ca9)
    EVM block
    363,447
    Substrate block
    363,447
    runtime
    portaldot-v3 3002
    gas price
    20,155 wei
    contract VMs
    pallet-revive (EVM) + pallet-contracts (ink!/WASM)

    Contracts

    MeterSettlement (EVM)
    0x9E7Ad2Aa754A0EBA70CFbd1db01d25ef97e5781e
    deployed in
    block 276611
    MeterRegistry (ink!)
    5DHgN8JZRp…K2Vd8Ku4
    registry knows
    settlement 0x9e7ad2…e5781e · 4 endpoints · 22 outcomes anchored
    endpoints listed
    4

    Payment token: a native asset seen as an ERC-20

    Two test assets, one per payment path. The prepaid sessions and the hosted seller (endpoints 3 and 4) are priced in pUSD, asset 7777, Portaldot's own test dollar. The per-request escrow run (endpoints 1 and 2) used tUSDm, asset 43907 "Portal Meter Test USD", which we created for it; that is the asset read below.

    Portaldot exposes every pallet-assets token to Solidity at 0x{asset id}…00010000. The supply below is read twice: once through the EVM (totalSupply() on the precompile) and once from Substrate storage.

    asset
    #43907 Portal Meter Test USD (tUSDm), 6 decimals
    ERC-20 address
    0x0000ab8300000000000000000000000000010000
    supply via EVM
    1000 totalSupply() on the precompile
    supply via Substrate
    1000 Assets.Asset storage
    same value
    yes

    Endpoints and provider record

    Price and payee come from MeterSettlement (EVM). The URL and the served / refunded / confirmed / disputed counts come from MeterRegistry (ink!), keyed by the provider's EVM address. On a session endpoint, one "served" is one anchored batch of many requests. A score shows only once a payer has confirmed a request. Endpoints 1 and 2 were listed by our escrow test run against a seller on our own machine: their on-chain URLs are kept as recorded and cannot be reached. Endpoints 3 and 4 are the public sellers.

    #endpointpriceproviderservedrefundedconfirmeddisputedscore
    1http://127.0.0.1:8402/v1/account/{address} local test endpoint, not reachable0.025 tUSDm 0x43CA1C…7C159910 10100.0 %
    2http://127.0.0.1:8402/v1/asset/{id} local test endpoint, not reachable0.01 tUSDm 0x43CA1C…7C159912 00—, no confirmations yet
    3https://portal-meter.swiftbotlab.workers.dev/v1/0.01 pUSD 0xE13A4d…E18E59150 00—, no confirmations yet
    4https://paid-indexer.swiftbotlab.workers.dev/v1/transfers/{address}0.01 pUSD 0x43CA1C…7C159930 00—, no confirmations yet

    Escrow activity

    Every Paid, Served and Refunded event of MeterSettlement, in tUSDm. What was paid into escrow is either settled to the provider or refunded to the payer, so the first amount is the sum of the other two. Session requests settle through MeterSession and are counted in the buy box above.

    7paid requests
    4served
    3refunded
    0.1paid into escrow (tUSDm)
    0.07settled to providers (tUSDm)
    0.03refunded to payers (tUSDm)
    blockeventrequestamountdetailtx
    276733Refunded0x2dabd1…8d8c84 0.01to 0x0118d8…CB6AbA, reason 3, by provider0x679758…8ee84b
    2767300x2dabd1…8d8c84 0.01payer 0x0118d8…CB6AbA0xdc4c3c…382f5d
    276726Served0x7de231…06eaa5 0.01payee 0x77df5A…a8Ca5C, response 0x47c7ca…bcdba80x4ec9ea…4f226a
    2767250x7de231…06eaa5 0.01payer 0x0118d8…CB6AbA0x5b5df5…67d0fc
    276660Refunded0x4175ff…ccb930 0.01to 0x0118d8…CB6AbA, reason 3, by provider0x1a5202…36f314
    2766590x4175ff…ccb930 0.01payer 0x0118d8…CB6AbA0xd511d2…984c86
    276658Served0x0dd187…aedc6e 0.025payee 0x77df5A…a8Ca5C, response 0xc315af…03ba190xf52642…0bacb6
    2766570x0dd187…aedc6e 0.025payer 0x0118d8…CB6AbA0x75b80a…8a7e8e
    276646Served0x5f2a69…6cd3b8 0.01payee 0x77df5A…a8Ca5C, response 0x519d1a…c0e87e0x4902c5…1ce30b
    2766450x5f2a69…6cd3b8 0.01payer 0x0118d8…CB6AbA0x918da8…3df27e
    276619Refunded0x6eb795…8721e6 0.01to 0x0118d8…CB6AbA, reason 3, by provider0xd71195…ef5ebf
    2766180x6eb795…8721e6 0.01payer 0x0118d8…CB6AbA0xcacb9a…16dab0
    276617Served0x242fa2…91b199 0.025payee 0x77df5A…a8Ca5C, response 0xd872e2…f7809a0xa013c5…124713
    2766160x242fa2…91b199 0.025payer 0x0118d8…CB6AbA0x38aaaf…3005a9

    Verify a receipt

    Paste the PAYMENT-RESPONSE header (base64) or the receipt JSON. Add the response body to check its hash. Nothing leaves your browser except read-only calls to the Portaldot testnet nodes.

    Deployment transactions

    steplayerblocktx
    fund EVM keys (twin accounts) from the sr25519 accountsubstrate 2766090x8dcb667876a54ebf3cccbfd20cce8b36802de1eca47f3120c6ad04afa23b9441
    create native asset #43907 tUSDm, metadata, mint 1000 to the buyersubstrate 2766100x58599fcd2ac5273925cb7f9af74bead15f9f0e4ec420a6f87d746a4c832b4d72
    deploy MeterSettlement (Solidity, pallet-revive)evm 2766110x1adf1c422c9782a22d974dea3d2abc0be287da435747883e7895375d15731227
    provider: register endpoint 1 /v1/account/{address}evm 2766120x44a7d0b4864bb4ea76649a1715401d3afde88ee56acffd64fb7600168bfdf39e
    provider: register endpoint 2 /v1/asset/{id}evm 2766130xf4f367da4236935df37377c20356141798f4c34c7c8baf8c15ccd80cd6d45ba6
    buyer: approve the settlement contract on the tUSDm precompileevm 2766150xca1867b45d46335dfe2c4b47254b4be6aff6cc01f3563897f99da7c55a68962b
    buyer: pay request (served case)evm 2766160x38aaaf8a83481db8f420d8a5ff2e88e70b35e7c9f5cd81a3c0d30c42903005a9
    provider: settle the served request (Solidity)evm 2766170xa013c5400ea7c4e26bc90dd20a046a063921e7af2afb3a86f36cad0d30124713
    buyer: pay request (refunded case)evm 2766180xcacb9a74ee80cfc806722fb4b859422719f630d9bc5a1debf2abf4a42c16dab0
    provider: refund the undeliverable request (Solidity)evm 2766190xd7119590fdbc7b5987547278ac8bd09e212f7b5195f1feb421ce9694d9ef5ebf
    buyer: pay request (cross-pallet case)evm 2766450x918da875f56c975e0aeaa95e9630ebc9ad88fdc59413d5ce24d23023df3df27e
    provider: settle in Solidity + anchor the receipt hash in system.remarkWithEvent, one Ethereum tx (utility.batchAll via the runtime pallets address)evm -> substrate 2766460x4902c5a30982f0c3706c795554a04aea4d83113d21654fa5f88655752a1ce30b
    top up the provider and buyer keys from the sr25519 accountsubstrate 2766540x6a7009a129be992c986dbe207010a917946b3347b3cf5315469406cb3e70ceb0
    instantiate MeterRegistry (ink!, pallet-contracts)substrate 2766550xef17ab339d696959449ed2e94bd066fb86de2a1945297d0d3d7dc35f97bd60e0
    provider: list both endpoints in the ink! registry, one Ethereum tx (contracts.call batch via the runtime pallets address)evm -> substrate 2766560x7c14d9debd223cc01974022bc64e05aa90f9bea08c36560aa4a6b012f6cc569b
    buyer: pay request (served case)evm 2766570x75b80a21c8b42251c6234a5dbbdecc2e8ae4e991ac2457268ac174dae28a7e8e
    provider: settle the served request in Solidity + anchor in ink!, one Ethereum txevm -> substrate 2766580xf5264278d35ec75998992133da8fe8bc7bb8de5f7040137ba3353f1e7e0bacb6
    buyer: pay request (refunded case)evm 2766590xd511d2f40d3b05ae6e18bd61bf94c757c21d9e9a3eaad3dad0fffa6fc5984c86
    provider: refund the undeliverable request in Solidity + anchor in ink!, one Ethereum txevm -> substrate 2766600x1a52029d1a3006600c7ad50c2424c18fefdf0df499505dd35e85c9d68a36f314
    buyer: confirm the served request in ink! (contracts.call from its EVM key)evm -> substrate 2766650x91d0a18a7aee958852e8f1903981a5c526910976c899c86192ef2f7970cd3297