Charging Agents for Data and APIs
You have something an AI agent wants — a data feed, an API, a file. XChain lets the agent pay for it in your token, inside the request itself: the agent asks, your server answers “402 — here’s the price,” the agent pays on-chain, retries, and gets the goods. No accounts, no API keys, no card forms. This guide is for the seller side; agents paying are covered by the SDK’s X402Client (one call: client.fetchUrl(url)).
The five-minute version
const { XChainSDK, X402Gateway } = require('xchain-sdk');
const express = require('express');
const sdk = new XChainSDK({ network: 'dogecoin-mainnet' });
const gateway = new X402Gateway({
coin: 'DOGE',
explorer: sdk.explorer,
send: { tick: 'MYTOKEN', amount: '5', payTo: 'D...your address', minConfirmations: 1 },
stateDir: '/var/lib/my-api/x402',
});
gateway.startSweeper();
const app = express();
app.get('/api/report', gateway.middleware(), (req, res) => {
res.json({ report: '…the paid content…', receipt: req.x402 });
});
Every unpaid request gets a 402 with payment instructions; every paid request passes through with req.x402 describing the verified payment. That’s the whole integration.
Three ways to charge
Pay per call (send) — each request costs N tokens, paid by a SEND to your address carrying a one-time invoice code. Best for: individual queries, downloads, one-off purchases.
Hold to access (dispenser) — the caller must hold at least N of a token you sell through an on-chain dispenser. The 402 tells agents exactly where to buy. Best for: memberships, subscriptions-without-billing, token-gated communities. Anyone holding the token gets in — that’s the point.
Deposit and meter (deposit) — the caller tops up once with a SEND to your deposit address, then each call debits a local ledger until it runs dry. Best for: high-frequency, low-price calls where a payment per request would be too slow.
You can offer all three at once; the agent picks.
Speed vs. certainty
A confirmed payment takes about a block (≈1 minute on Dogecoin). If that’s too slow, set minConfirmations: 0 and the gateway accepts payments the moment they hit the mempool — provisionally. Unconfirmed XChain payments are weaker than unconfirmed coin payments (the token transfer can still fail validation at confirmation), so the gateway re-checks every provisional grant and tells you (onProvisionalFailed) if one never confirms.
Rules of thumb: 0-conf for previews, cheap calls, revocable access. One confirmation or more for anything you can’t take back — especially decryption keys. The deposit scheme gives you instant and certain: the top-up confirms once, the calls are local.
Selling files
Combine this with token-gated content: publish the encrypted file on-chain, then sell the decryption key through a paid endpoint. The buyer pays, receives the key payload, pulls the ciphertext from the explorer, and decrypts locally. The e2e reference (xchain-e2e-test/test/helpers/x402Storefront.js) shows the complete storefront in ~100 lines.
Honest fine print
- The invoice codes are single-use and bound to the payer’s address — replays and front-running don’t work.
- The gateway’s file-backed state is for a single server process. Running multiple instances? Plug in a shared store (
invoiceStoreoption). - Prices are token amounts, not USD. If you want USD-pegged pricing, adjust the configured amount from your own price feed for now; native USD quoting arrives with the platform price oracle surface.
- Full wire spec for interoperators: protocol/X402_Payments.md.