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- HTTP 402. The seller quotes 0.01 pUSD for endpoint 3.
- A voucher, signed here. Your browser signs it with the page's public test key: no gas, no wallet.
- HTTP 200. The data arrives with a provider-signed receipt, and its hash is checked.
- 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
| block | requests settled | sessions | one Ethereum tx |
|---|---|---|---|
| 350726 | 9 | 1 | 0x81b1bd7d…cca0b953 |
| 341673 | 13 | 1 | 0x79ff6250…9e9f349f |
| 329697 | 1 | 1 | 0x24aa5a19…9a18b770 |
| 322401 | 5 | 1 | 0x6ce0ba08…0dc245b5 |
| 299370 | 19 | 1 | 0x9075726b…98429c86 |
| 286350 | 6 | 1 | 0x53ab89ba…51eb24ba |
| 282559 | 137 | 3 | 0xe5038746…aded7f09 |
| 282470 | 67 | 2 | 0xe388295c…9c3992db |
What one request costs on-chain
| per-request escrow | prepaid session | |
|---|---|---|
| on-chain transactions, 1 request | 2: pay, then settle | none: a voucher signed over HTTP |
| on-chain transactions, 100 requests | 200 | 3: open, one settlement batch, close |
| locked for good per request | 7.53 tPOT | 0.076 tPOT, in a 100-request session |
| locked for good, 100 requests | about 753 tPOT | 7.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:
- 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:
| request | request hash | response hash |
|---|---|---|
| 56 | 0x26bfbce8…f0a7b0a0 | 0xf249fb2c…40f70614 |
| 55 | 0x26bfbce8…f0a7b0a0 | 0x640222e2…198d7298 |
| 54 | 0x26bfbce8…f0a7b0a0 | 0x3475ff94…7d9dd4f5 |
| 53 | 0x26bfbce8…f0a7b0a0 | 0x938077c7…d8d873b4 |
| 52 | 0x26bfbce8…f0a7b0a0 | 0xe79a2dc8…0567393c |
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.
- 1GET, then a
402quote - 2
pay()on EVM - 3retry with signed proof
- 4served once + receipt
- 5
settle+ 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.
| # | endpoint | price | provider | served | refunded | confirmed | disputed | score |
|---|---|---|---|---|---|---|---|---|
| 1 | http://127.0.0.1:8402/v1/account/{address} local test endpoint, not reachable | 0.025 tUSDm | 0x43CA1C…7C1599 | 1 | 0 | 1 | 0 | 100.0 % |
| 2 | http://127.0.0.1:8402/v1/asset/{id} local test endpoint, not reachable | 0.01 tUSDm | 0x43CA1C…7C1599 | 1 | 2 | 0 | 0 | —, no confirmations yet |
| 3 | https://portal-meter.swiftbotlab.workers.dev/v1/ | 0.01 pUSD | 0xE13A4d…E18E59 | 15 | 0 | 0 | 0 | —, no confirmations yet |
| 4 | https://paid-indexer.swiftbotlab.workers.dev/v1/transfers/{address} | 0.01 pUSD | 0x43CA1C…7C1599 | 3 | 0 | 0 | 0 | —, 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.
| block | event | request | amount | detail | tx |
|---|---|---|---|---|---|
| 276733 | Refunded | 0x2dabd1…8d8c84 | 0.01 | to 0x0118d8…CB6AbA, reason 3, by provider | 0x679758…8ee84b |
| 276730 | Paid | 0x2dabd1…8d8c84 | 0.01 | payer 0x0118d8…CB6AbA | 0xdc4c3c…382f5d |
| 276726 | Served | 0x7de231…06eaa5 | 0.01 | payee 0x77df5A…a8Ca5C, response 0x47c7ca…bcdba8 | 0x4ec9ea…4f226a |
| 276725 | Paid | 0x7de231…06eaa5 | 0.01 | payer 0x0118d8…CB6AbA | 0x5b5df5…67d0fc |
| 276660 | Refunded | 0x4175ff…ccb930 | 0.01 | to 0x0118d8…CB6AbA, reason 3, by provider | 0x1a5202…36f314 |
| 276659 | Paid | 0x4175ff…ccb930 | 0.01 | payer 0x0118d8…CB6AbA | 0xd511d2…984c86 |
| 276658 | Served | 0x0dd187…aedc6e | 0.025 | payee 0x77df5A…a8Ca5C, response 0xc315af…03ba19 | 0xf52642…0bacb6 |
| 276657 | Paid | 0x0dd187…aedc6e | 0.025 | payer 0x0118d8…CB6AbA | 0x75b80a…8a7e8e |
| 276646 | Served | 0x5f2a69…6cd3b8 | 0.01 | payee 0x77df5A…a8Ca5C, response 0x519d1a…c0e87e | 0x4902c5…1ce30b |
| 276645 | Paid | 0x5f2a69…6cd3b8 | 0.01 | payer 0x0118d8…CB6AbA | 0x918da8…3df27e |
| 276619 | Refunded | 0x6eb795…8721e6 | 0.01 | to 0x0118d8…CB6AbA, reason 3, by provider | 0xd71195…ef5ebf |
| 276618 | Paid | 0x6eb795…8721e6 | 0.01 | payer 0x0118d8…CB6AbA | 0xcacb9a…16dab0 |
| 276617 | Served | 0x242fa2…91b199 | 0.025 | payee 0x77df5A…a8Ca5C, response 0xd872e2…f7809a | 0xa013c5…124713 |
| 276616 | Paid | 0x242fa2…91b199 | 0.025 | payer 0x0118d8…CB6AbA | 0x38aaaf…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
| step | layer | block | tx |
|---|---|---|---|
| fund EVM keys (twin accounts) from the sr25519 account | substrate | 276609 | 0x8dcb667876a54ebf3cccbfd20cce8b36802de1eca47f3120c6ad04afa23b9441 |
| create native asset #43907 tUSDm, metadata, mint 1000 to the buyer | substrate | 276610 | 0x58599fcd2ac5273925cb7f9af74bead15f9f0e4ec420a6f87d746a4c832b4d72 |
| deploy MeterSettlement (Solidity, pallet-revive) | evm | 276611 | 0x1adf1c422c9782a22d974dea3d2abc0be287da435747883e7895375d15731227 |
| provider: register endpoint 1 /v1/account/{address} | evm | 276612 | 0x44a7d0b4864bb4ea76649a1715401d3afde88ee56acffd64fb7600168bfdf39e |
| provider: register endpoint 2 /v1/asset/{id} | evm | 276613 | 0xf4f367da4236935df37377c20356141798f4c34c7c8baf8c15ccd80cd6d45ba6 |
| buyer: approve the settlement contract on the tUSDm precompile | evm | 276615 | 0xca1867b45d46335dfe2c4b47254b4be6aff6cc01f3563897f99da7c55a68962b |
| buyer: pay request (served case) | evm | 276616 | 0x38aaaf8a83481db8f420d8a5ff2e88e70b35e7c9f5cd81a3c0d30c42903005a9 |
| provider: settle the served request (Solidity) | evm | 276617 | 0xa013c5400ea7c4e26bc90dd20a046a063921e7af2afb3a86f36cad0d30124713 |
| buyer: pay request (refunded case) | evm | 276618 | 0xcacb9a74ee80cfc806722fb4b859422719f630d9bc5a1debf2abf4a42c16dab0 |
| provider: refund the undeliverable request (Solidity) | evm | 276619 | 0xd7119590fdbc7b5987547278ac8bd09e212f7b5195f1feb421ce9694d9ef5ebf |
| buyer: pay request (cross-pallet case) | evm | 276645 | 0x918da875f56c975e0aeaa95e9630ebc9ad88fdc59413d5ce24d23023df3df27e |
| provider: settle in Solidity + anchor the receipt hash in system.remarkWithEvent, one Ethereum tx (utility.batchAll via the runtime pallets address) | evm -> substrate | 276646 | 0x4902c5a30982f0c3706c795554a04aea4d83113d21654fa5f88655752a1ce30b |
| top up the provider and buyer keys from the sr25519 account | substrate | 276654 | 0x6a7009a129be992c986dbe207010a917946b3347b3cf5315469406cb3e70ceb0 |
| instantiate MeterRegistry (ink!, pallet-contracts) | substrate | 276655 | 0xef17ab339d696959449ed2e94bd066fb86de2a1945297d0d3d7dc35f97bd60e0 |
| provider: list both endpoints in the ink! registry, one Ethereum tx (contracts.call batch via the runtime pallets address) | evm -> substrate | 276656 | 0x7c14d9debd223cc01974022bc64e05aa90f9bea08c36560aa4a6b012f6cc569b |
| buyer: pay request (served case) | evm | 276657 | 0x75b80a21c8b42251c6234a5dbbdecc2e8ae4e991ac2457268ac174dae28a7e8e |
| provider: settle the served request in Solidity + anchor in ink!, one Ethereum tx | evm -> substrate | 276658 | 0xf5264278d35ec75998992133da8fe8bc7bb8de5f7040137ba3353f1e7e0bacb6 |
| buyer: pay request (refunded case) | evm | 276659 | 0xd511d2f40d3b05ae6e18bd61bf94c757c21d9e9a3eaad3dad0fffa6fc5984c86 |
| provider: refund the undeliverable request in Solidity + anchor in ink!, one Ethereum tx | evm -> substrate | 276660 | 0x1a52029d1a3006600c7ad50c2424c18fefdf0df499505dd35e85c9d68a36f314 |
| buyer: confirm the served request in ink! (contracts.call from its EVM key) | evm -> substrate | 276665 | 0x91d0a18a7aee958852e8f1903981a5c526910976c899c86192ef2f7970cd3297 |