Subscriptions
Buy a plan or a credit pack with XRP or a card.
Plans
| Plan | 30 days | 1 year | Credits per 30 days | Requests/sec | Transactions/sec |
|---|---|---|---|---|---|
| Free | Free | — | 1M | 10 | 1 |
| Developer | $49 | $490 | 10M | 50 | 5 |
| Business | $499 | $4990 | 100M | 200 | 50 |
| Professional | $999 | $9990 | 200M | 500 | 100 |
| Partner | By invitation, free | — | 20M | 100 | 10 |
A plan is a 30-day or 1-year term and never renews by itself. Buying the same plan again before it ends adds another term; switching plans, or buying after it ends, starts a new term that day. When a term ends, your keys drop to Free. A plan’s credits reset every 30 days, and unused ones do not carry over. A year costs the same as 10 months. The Partner tier is free for integrations that credit xrpl.to — apply from the dashboard.
Rate limits
Four independent layers apply to every request; the strictest one wins. All 429 responses carry Retry-After plus X-RateLimit-Limit/-Remaining/-Reset headers and a JSON body with retryAfter.
| Limit | Rule |
|---|---|
| No key | 2 req/sec burst, 30 req/min, 333/day (no key) + 0.25x endpoint windows |
| Per IP | All clients: 100 requests per 2s per IP (DDoS backstop). 429 with Retry-After: 2. |
| Per second | Sustained rate enforced over a 10s window, plus a hard 1-second burst cap. Anonymous: 2/sec burst, 30/min sustained, per IP. Free: 10/sec sustained with 20/sec bursts (shared per IP across keys). Keyed tiers per key — developer 50/sec (burst 100), partner 100/sec (burst 200), business 200/sec (burst 300), professional 500/sec (burst 750). |
| Per minute | Anonymous and free: 30 req/min and 600 req/min per IP respectively. |
| Per endpoint | Expensive endpoints have their own request windows, matched by path prefix (so /tokens and /tokens/slugs share one bucket). Base limits are per 60s and scale by tier multiplier: anonymous 0.25x, free 1x, developer 3x, partner 5x, business 10x, professional 15x, enterprise uncapped. Examples at anonymous tier: /tokens 5/min, /search 7/min, /amm 7/min, /account/tx 5/min. Some endpoints pin per-tier caps directly instead of the multiplier (unpinned tiers use the standard multiplier): /dex/quote 1/min anonymous, 3/min free, 45/min partner (10 credits/call); /mentions/x-search 1/min anonymous, 2/min free (10 credits/call); /web-search 1/min anonymous, 3/min free; /tx-explain 3/min free; /account-tx-explain 2/min free. The 429 body names the endpoint bucket and its window. |
| Per day | Anonymous: 333 requests/day per IP. Free: 33K/day per IP. Keyed tiers per key: developer 400K/day, partner 1M/day, business 4M/day, professional 8M/day. Successful responses include X-RateLimit-Daily-Remaining where a daily cap applies. |
| Headers | Successful responses include X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset (seconds until the window resets). For anonymous clients these reflect the per-minute window; for keyed clients the per-second window. Credit-metered keys also get X-Credits-Used / X-Credits-Remaining. |
| Credits | Each endpoint has a credit cost (0-10 credits per call). Check /keys/costs for details. WebSocket messages cost 0.1 credits each. Scam-blocklist reads (/scams/*, /nft/scam) are never rate-limited or capped. |
Credit packs
| Pack | Price | Credits |
|---|---|---|
| Starter Pack | $5 | 1M |
| Standard Pack | $20 | 5M |
| Bulk Pack | $75 | 25M |
| Mega Pack | $250 | 100M |
One-time top-ups, added when the payment confirms. Unlike a plan’s credits, they are not reset every 30 days.
Pay with XRP
import { Client, Wallet, xrpToDrops } from 'xrpl';
const wallet = Wallet.fromSeed(seed, { algorithm: seed.startsWith('sEd') ? 'ed25519' : 'ecdsa-secp256k1' });
// 1. Ask for a payment request (valid 30 minutes)
const { payment } = await fetch('https://api.xrpl.to/v1/keys/purchase', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ wallet: wallet.address, type: 'tier', tier: 'developer', billing: 'monthly' })
// tier: developer | business | professional, billing: monthly | yearly
// or a credit pack: { wallet, type: 'credits', package: 'starter' } (starter | standard | bulk | mega)
}).then((r) => r.json());
// 2. Send exactly that XRP, with the destination tag (submitAndWait fills in sequence and fee, then signs)
const client = new Client('wss://xrplcluster.com');
await client.connect();
const tx = await client.submitAndWait({
TransactionType: 'Payment',
Account: wallet.address,
Destination: payment.destination,
DestinationTag: payment.destinationTag,
Amount: xrpToDrops(payment.amount)
}, { wallet });
// 3. Apply it
await fetch('https://api.xrpl.to/v1/keys/verify-payment', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ txHash: tx.result.hash })
});Pay by card
// 1. Create a checkout session and send the user to it
const { checkoutUrl, sessionId } = await fetch('https://api.xrpl.to/v1/keys/stripe/checkout', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ wallet: 'rYourWallet…', type: 'tier', tier: 'developer', billing: 'yearly' })
}).then((r) => r.json());
window.location.href = checkoutUrl;
// 2. After the redirect back, check the session
const status = await fetch(
`https://api.xrpl.to/v1/keys/stripe/status/${sessionId}?wallet=rYourWallet…`
).then((r) => r.json());Billing endpoints
- GET
/v1/keys/{wallet}/subscriptionwallet signatureSubscription details, available upgrades and partnerRequest { status: pending|approved|declined, creditUrl, requestedAt, decidedAt, reason } (null when never requested). billingCycle.end is the paid term end: 30 days for a monthly purchase, 365 for yearly. Buying the same tier again before it ends extends the term; an ended term downgrades the wallet and its keys to Free. - POST
/v1/keys/{wallet}/partner-requestwallet signatureApply for the free Partner tier (see usagePolicy.partner) - GET
/v1/keys/tiersAvailable API tiers with live XRP pricing. Developer, Business and Professional are bought for a term (30 days monthly, 365 yearly) and renew by buying the same tier again; Partner is by application. - GET
/v1/keys/packagesCredit top-up packages with pricing - POST
/v1/keys/purchaseCreate XRP payment request - POST
/v1/keys/verify-paymentVerify XRP payment and apply credits/tier - GET
/v1/keys/xrp/status/{txHash}Check XRP payment status - POST
/v1/keys/stripe/checkoutCreate Stripe checkout session - GET
/v1/keys/stripe/status/{sessionId}Check Stripe payment status - GET
/v1/keys/payment/{txHash}wallet signatureLook up processed payment by tx hash - GET
/v1/keys/payments/{wallet}wallet signaturePayment history for wallet - GET
/v1/keys/invoices/{paymentId}wallet signatureInvoice detail for a payment (sequential INV-YYYY-NNNNN number assigned on first fetch)