From cryptorefills
Buy gift cards, top up phones, and get travel eSIMs with Bitcoin, Lightning, Ethereum, Solana, USDC, USDT, or 15+ other cryptos on Base, Polygon, Arbitrum, Tron, and more. No account or CLI install — MCP-native. 10,500+ brands, 180+ countries.
How this skill is triggered — by the user, by Claude, or both
Slash command
/cryptorefills:cryptorefills-buyThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Full purchase lifecycle: search, price, validate, order, pay, track delivery. Supports all crypto payment methods, fixed and range-based products, multi-product carts, and interactive guided purchasing.
Full purchase lifecycle: search, price, validate, order, pay, track delivery. Supports all crypto payment methods, fixed and range-based products, multi-product carts, and interactive guided purchasing.
For browse-only, follow the instructions in cryptorefills-catalog. For autonomous agent purchases with USDC on Base (no account), follow cryptorefills-x402 instead.
When the user needs autonomous wallet-based purchasing without human payment interaction, switch to the cryptorefills-x402 skill instructions.
https://api.cryptorefills.com/mcp/httpUser-Agent: Cryptorefills-MCP/1.0To configure the MCP connection in Claude Code:
{
"mcpServers": {
"cryptorefills": {
"url": "https://api.cryptorefills.com/mcp/http",
"headers": { "User-Agent": "Cryptorefills-MCP/1.0" }
}
}
}
Always confirm before purchasing. Present product name, denomination, price, and payment method — wait for explicit user approval before calling createOrder.
getProductPrice before proceeding to createOrdersearchProducts → getProductPrice → validateOrder → createOrder → getOrderStatus
│ │
└── or use purchaseElicitation ────────────────┘
Two paths to purchase:
purchaseElicitation walks through the purchase interactively (recommended for conversational agents)Use searchProducts or listBrands to find products.
searchProducts(country_code="US", q="Netflix")
Note: The search parameter is q (not query), and language is lang (not language).
Country codes must be uppercase Alpha-2 ISO (US, IT, BR). Note: the x402 skill uses lowercase — different endpoint.
Fixed-denomination products (is_dynamic: false): Price is already in the listProductsForCountry response (coin_amount field). No extra call needed.
Range-based products (is_dynamic: true): Use getProductPrice to get the price for a specific amount within the range.
getProductPrice(brand_name="Amazon.com", country_code="US", face_value=75, coin="USDC")
face_value is a number (75), not a string. Returns coin_amount with the exact crypto price.
Use validateOrder before creating. Both validateOrder and createOrder use a body wrapper with payment and deliveries.
validateOrder(body={
payment: {type: "via", payment_via: "USER_WALLET", coin: "BTC", network: "Mainnet"},
deliveries: [{
denomination: "25 USD",
brand_name: "Steam",
beneficiary_account: "[email protected]",
country_code: "US"
}]
})
Key fields:
payment.type — always "via" for crypto paymentspayment.payment_via — from getPaymentViasWithCurrencies (e.g., "USER_WALLET")payment.coin — cryptocurrency (e.g., "BTC", "USDC")payment.network — use the exact string from getPaymentViasWithCurrencies. Common values:| Coin | network value |
|---|---|
| BTC | Mainnet |
| ETH | ETH Mainnet |
| USDC | Base, Polygon (Matic), Solana, Arbitrum |
| USDT | Polygon (Matic), Tron |
| SOL | Solana |
deliveries[].denomination — for fixed products: exact string from listProductsForCountry (e.g., "25 USD"). For range products: the literal string "range" (plus product_value with the desired amount)deliveries[].brand_name — exact brand name from listBrandsdeliveries[].beneficiary_account — email for gift cards/eSIMs, E.164 phone for mobile rechargedeliveries[].country_code — uppercase Alpha-2Catches errors early: invalid phone, out-of-range amount, unavailable product, minimum order amount.
Same body schema as validateOrder, plus user.email is required.
createOrder(body={
user: {email: "[email protected]"},
payment: {type: "via", payment_via: "USER_WALLET", coin: "BTC", network: "Mainnet"},
deliveries: [{
denomination: "25 USD",
brand_name: "Steam",
beneficiary_account: "[email protected]",
country_code: "US"
}]
})
Returns: order_id, wallet_address, coin_amount, qr_url, qr_text (payment URI), payment_state, order_state.
Presenting payment to the user: In text-only environments, present the qr_text payment URI (e.g., bitcoin:3EFu...?amount=0.00038) — wallets can parse it directly. In rich environments, link to or render the qr_url image.
Multi-product orders: Include up to 10 items in the deliveries array. Each can be a different brand/country/delivery type.
Poll getOrderStatus with the order ID.
WalletCreated → PaymentRequested → PaymentReceived (or Expired)WaitingForPayment → Done (success) / Expired / Canceled / WaitingForManualActionStop polling when order reaches a terminal state.
When order state is Done:
deliverable.pin_code. If it starts with http/https, it's a URL to visit. Plain text is a manual redemption code.1. searchProducts(country_code="US", q="Steam")
→ finds brand "Steam", category "games"
2. listProductsForCountry(country_code="US", brand_name="Steam", coin="BTC")
→ products: [{product_id: "a300c244-...", denomination: "25 USD", coin_amount: "0.00038", is_dynamic: false}]
3. validateOrder(body={
payment: {type: "via", payment_via: "USER_WALLET", coin: "BTC", network: "Mainnet"},
deliveries: [{denomination: "25 USD", brand_name: "Steam", beneficiary_account: "[email protected]", country_code: "US"}]
})
→ coin_amount: "0.00038", problems: [] (valid)
4. createOrder(body={
user: {email: "[email protected]"},
payment: {type: "via", payment_via: "USER_WALLET", coin: "BTC", network: "Mainnet"},
deliveries: [{denomination: "25 USD", brand_name: "Steam", beneficiary_account: "[email protected]", country_code: "US"}]
})
→ order_id: "e054...", wallet_address: "3EFu...", coin_amount: "0.00038", qr_text: "bitcoin:3EFu...?amount=0.00038"
5. getOrderStatus(order_id="e054...")
→ payment_state: "PaymentRequested", order_state: "WaitingForPayment"
1. searchProducts(country_code="US", q="Amazon")
→ finds brand "Amazon.com", is_dynamic: true, range $5–$500
2. getProductPrice(brand_name="Amazon.com", country_code="US", face_value=50, coin="USDC")
→ coin_amount: "51.08", product_id: "5549e92e-..."
3. validateOrder(body={
payment: {type: "via", payment_via: "USER_WALLET", coin: "USDC", network: "Base"},
deliveries: [{denomination: "range", brand_name: "Amazon.com", beneficiary_account: "[email protected]", country_code: "US", product_value: "50"}]
})
→ coin_amount: "51.08", problems: [] (valid)
→ Note: denomination is "range" (literal string), product_value is "50" (desired amount)
4. createOrder(body={
user: {email: "[email protected]"},
payment: {type: "via", payment_via: "USER_WALLET", coin: "USDC", network: "Base"},
deliveries: [{denomination: "range", brand_name: "Amazon.com", beneficiary_account: "[email protected]", country_code: "US", product_value: "50"}]
})
→ order_id, wallet_address (USDC on Base), coin_amount: "51.08"
1. searchProducts(country_code="BR", q="Claro")
→ finds brand "Claro Credits", category "mobile_credits"
2. listProductsForCountry(country_code="BR", brand_name="Claro Credits", coin="USDC")
→ products: [{denomination: "15 BRL", delivery_type: "by_phone", is_dynamic: false}]
3. validateOrder(body={
payment: {type: "via", payment_via: "USER_WALLET", coin: "USDC", network: "Base"},
deliveries: [{denomination: "15 BRL", brand_name: "Claro Credits", beneficiary_account: "+5511999887766", country_code: "BR"}]
})
→ Note: beneficiary_account is the E.164 phone number (not email)
4. createOrder(body={
user: {email: "[email protected]"},
payment: {type: "via", payment_via: "USER_WALLET", coin: "USDC", network: "Base"},
deliveries: [{denomination: "15 BRL", brand_name: "Claro Credits", beneficiary_account: "+5511999887766", country_code: "BR"}]
})
→ order_id, wallet_address (USDC on Base), coin_amount
1. searchProducts(country_code="IT", q="eSIM")
→ finds brand "eSIM", category "e-sim"
2. listProductsForCountry(country_code="IT", brand_name="eSIM", coin="ETH")
→ products: [{denomination: "1 GB 7 days", delivery_type: "by_email", is_dynamic: false}]
3. validateOrder(body={
payment: {type: "via", payment_via: "USER_WALLET", coin: "ETH", network: "ETH Mainnet"},
deliveries: [{denomination: "1 GB 7 days", brand_name: "eSIM", beneficiary_account: "[email protected]", country_code: "IT"}]
})
→ Note: denomination is "1 GB 7 days" (exact string from listProductsForCountry), beneficiary is email
4. createOrder(body={
user: {email: "[email protected]"},
payment: {type: "via", payment_via: "USER_WALLET", coin: "ETH", network: "ETH Mainnet"},
deliveries: [{denomination: "1 GB 7 days", brand_name: "eSIM", beneficiary_account: "[email protected]", country_code: "IT"}]
})
→ order_id, wallet_address (ETH), coin_amount, qr_text
purchaseElicitation is an interactive, stateful tool that guides the agent through the entire purchase. Ideal for conversational UIs.
purchaseElicitation with empty body {} (optionally pass lang for localized prompts) — receive a session_tokensession_tokenstatus equals complete (order created) or erroraction: "back" to revert a step if the user changes their mindThe elicitation handles product selection, denomination, delivery info, and payment method selection internally. It's the simplest path from intent to purchase.
+ prefix, country code, number, no spaces or dashesUS, not us). The x402 skill uses lowercasemin_value and max_value. Out-of-bounds amounts are rejectedvalidateOrder before createOrder to catch errorscreateOrder call. Split larger orders into multiple callsLoad references only when you need deeper detail than what's in this skill file.
| File | Load when... | Content |
|---|---|---|
references/mcp-tools.md | You need exact parameter schemas for a specific MCP tool call | All 10 MCP tool signatures with parameters |
references/payment-methods.md | User asks about specific chains, networks, or payment routing | Supported cryptocurrencies, chains, payment flow |
references/order-lifecycle.md | Order enters an unexpected state or you need delivery/polling details | Order and payment state machines, delivery types |
references/troubleshooting.md | A tool call returns an error or order is stuck | Common errors, recovery steps |
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub cryptorefills/agents --plugin cryptorefills