Let an autonomous agent pay a real-world crypto invoice. Exact amount, cross-chain, with no account, no API key and no KYC anywhere in the path.
npm install https://norravex.com/agentbuy-0.2.0.tgz @solana/web3.js
Served straight from this domain — no registry account involved, which is rather the point. MIT, 8 kB.
Ships with an MCP server, so Claude Code, Claude Desktop or Cursor can quote and pay invoices as tools:
{
"mcpServers": {
"agentbuy": {
"command": "npx",
"args": ["-y", "https://norravex.com/agentbuy-0.2.0.tgz", "agentbuy-mcp"],
"env": {
"AGENTBUY_KEYPAIR": "/path/to/solana-keypair.json",
"AGENTBUY_REFUND_AUTHORITY": "0xYourEvmAddress",
"AGENTBUY_MAX_SOL": "0.5"
}
}
}
}
Three tools: quote_invoice (never moves funds), pay_invoice, check_order. Paying refuses outright unless a keypair and a refund authority are configured, and always enforces AGENTBUY_MAX_SOL — default 0.25 SOL. Quote first, then decide.
const { payInvoice } = require("agentbuy");
await payInvoice({
secretKey: "/path/to/solana-keypair.json",
toChain: "ethereum",
amount: "0.01008", // the EXACT figure on the invoice
recipient: "0x9579…", // merchant's single-use address
refundAuthority: "0x8a87…",
maxPay: 0.35, // refuse a bad quote
});
An agent holding SOL cannot pay an invoice denominated in ETH. It needs a cross-chain swap that lands an exact amount on an address it does not control.
That last part matters more than it sounds. Merchants taking crypto issue a single-use address and a precise figure. Underpay by a hair and it is not credited — you get a support ticket with a company that, by design, does not know who you are. So you must solve for the input, never the output.
The obvious fix is a swap aggregator. Every one of them wants an account.
Measured 2026-07-25, from a datacentre host, with no signups:
| Route | Result |
|---|---|
| SideShift | affiliateId required — needs an account |
| ChangeNOW | v1 endpoint gone; v2 returns Unauthorized |
| StealthEX | API key is not provided |
| SimpleSwap | Wrong api key |
| FixedFloat | Not have permission |
| THORChain | public nodes did not resolve |
| deBridge DLN | works, keyless |
deBridge is the default route for that reason. The interface is provider-shaped, so another keyless route can be added without changing callers.
maxPay guard — refuses to send if the quote comes back worse than you allowed.Extracted from a working system that autonomously bought and configured a domain end to end — swap, invoice, registration, DNS, TLS, mail — with no card, no bank and no human in the loop. The routing table above is what survived that, not a survey.
The domain you are reading this on was bought that way.