Prototype · Base Sepolia testnet · API3 AirnodeHub
Pay-per-post, settled on a signed tweet
A brand locks a budget for a sponsored post on X. The contract pays the creator only when TwitterAPI.io's answer, signed through API3 AirnodeHub, shows that the post is live, was written by the agreed creator, carries the deal code, was posted after the deal opened, has stayed up for the hold period and has enough views. The payout follows the views, up to a cap. The agent that submits the proof earns a fee in the same transaction, and the rest goes back to the brand.
Brands fear deleted posts and faked screenshots; creators fear brands that pay late. A signature replaces the screenshot. AI can find the post, but the contract decides: no LLM is on the money path.
- Escrow
- …
- Data signer (TwitterAPI.io Airnode)
- …
- Token
- …
Watch the agent team run a campaign
Three agents, each with its own wallet. The Scout buys an X search over x402 and uses Claude to pick the
post that best promotes the campaign. The Brand uses Claude to turn a one-line brief into deal terms,
which code then clamps to hard limits, and opens the deal on chain. The Settler buys the signed tweet
over x402 and calls settle. Claude only interprets: whether money moves is decided by the
contract's checks on signed data.
The passcode only protects the scarce testnet ETH in the agents' wallets. Each run opens a deal for an existing public post that mentions @tbc_munich (a bounty for a post that already exists) and pays a demo address.
How settle decides
-
Signer and request. The contract rebuilds the AirnodeHub request hash from the tweet id and recovers
the signer. Only TwitterAPI.io's Airnode passes, and only for this exact tweet. Otherwise it reverts with
NotSignedByAirnode. -
Fresh. The response was signed at most 2 minutes before the block, so the post was live just now.
ResponseTooOld -
Posted after the deal opened. Read from the tweet's Snowflake id, with no date parsing.
PostedTooEarly - Hold period over. Post time + hold ≤ signing time.
HoldNotOver -
Right post, right creator, code present. These are checked on the signed bytes.
WrongTweet·WrongAuthor·CodeMissing - Enough views. The payout is min(cap, views × price per 1000).
NotEnoughViews
Deals on chain
Read live from the contract. For each settlement, this page decodes the transaction, rebuilds the request hash, recovers the signer and re-runs the contract's checks in your browser.
Reading Base Sepolia…
Rejected on chain
Each of these settle calls was sent on purpose and reverted on chain. The first four are API3
tamper cases; the last two use genuine signed data that breaks the deal's rules. The browser re-check runs the
same steps as the contract and should stop at the same error.
Reading Base Sepolia…
The settlement agent's trail
The agent finds the post with searchTweets (discovery only, never checked on chain), buys the
signed tweetsByIds answer over x402 (0.01 aUSD each, Base Sepolia), checks it locally, then calls
settle and collects its fee.
Honest gaps
- Views are X's own number. Bot views count. The signature proves who said it, not that people saw the post.
- TwitterAPI.io is a third-party source, not X itself. The contract trusts its Airnode key.
- The hold period is checked once, at settlement. Nothing proves that the post stayed visible the whole time.
- Whoever settles first fixes the view count. A brand could settle early to pay for fewer views. A settlement window would fix this.
- The deal binds the handle, not X's numeric user id, so a renamed or taken-over handle breaks it.
- X only. AirnodeHub has no TikTok or Instagram source today.
- Demo data. Deal 1 uses an existing public @Api3DAO tweet, and the agent team opens deals for existing public posts that mention @tbc_munich. None of them is a post sponsored for its deal; each deal is opened after the post exists. The payee is a demo address, and the amounts are DemoUSD on a testnet.