Credit Cards
Providers: Visa, MasterCard, American Express Processor: Stripe (PCI-compliant) Fees: None Speed: Instant
Save a card once and pay from it whenever you want. Hoody never sees your card number; Stripe stores and processes it.
Your money goes into a General Balance for infrastructure or an AI Balance for LLM credits. Three payment methods add funds: credit card for instant top-ups, cryptocurrency for payments that need no account, and bank transfer for large deposits. Every transaction is logged, every payment generates an invoice, and both are readable over HTTP.
You can read both balances in one call or query either one on its own:
# See both balances at oncehoody wallet balance get
# General balance onlyhoody wallet balance general
# AI balance onlyhoody wallet balance aiimport { HoodyClient } from 'hoody-sdk';const client = new HoodyClient({ baseURL: 'https://api.hoody.com', token: process.env.HOODY_TOKEN });
// All balances: general + AIconst balances = await client.api.wallet.getAggregateBalances();console.log(balances.data);// { general_balance: "125.50", ai_limit: "50.00", ai_usage: "23.45", ai_remaining: "26.55" }
// General balance onlyconst general = await client.api.wallet.getGeneralBalance();
// AI balance onlyconst ai = await client.api.wallet.getAiBalance();# Aggregate balancescurl -X GET "https://api.hoody.com/api/v1/wallet/balances" \ -H "Authorization: Bearer $TOKEN"
# General balancecurl -X GET "https://api.hoody.com/api/v1/wallet/balances/general" \ -H "Authorization: Bearer $TOKEN"
# AI balancecurl -X GET "https://api.hoody.com/api/v1/wallet/balances/ai" \ -H "Authorization: Bearer $TOKEN"One request, one link
cURL runs inside your container and can wrap any HTTP request into a single GET URL. The call stops being something you need a client for and becomes something you can paste into a browser, send in a chat, bookmark, schedule with cron, or drop into a no-code tool.
Nothing is installed on the machine that opens it. The link does carry whatever credentials the call needs, so treat it as you would treat those credentials.
Slashes, colons and braces pass through as they are. The one character you must
encode is an & inside a value, which happens when the wrapped URL
carries its own query string. Left raw it ends the value early, and the rest is
read as cURL's own parameters, so you get a 200 on a request you did
not make.
How the wrapping works Chaining calls into one link Turning a link into a shortcut
Each link reads one of the three balance views without a CLI or SDK install.
# Both balances
https://PROJECT_ID-CONTAINER_ID-curl-1.SERVER.containers.hoody.com/api/v1/curl/request?url=https://api.hoody.com/api/v1/wallet/balances&method=GET&bearer_token=TOKEN&response=transparent
# General only
https://PROJECT_ID-CONTAINER_ID-curl-1.SERVER.containers.hoody.com/api/v1/curl/request?url=https://api.hoody.com/api/v1/wallet/balances/general&method=GET&bearer_token=TOKEN&response=transparent
# AI only
https://PROJECT_ID-CONTAINER_ID-curl-1.SERVER.containers.hoody.com/api/v1/curl/request?url=https://api.hoody.com/api/v1/wallet/balances/ai&method=GET&bearer_token=TOKEN&response=transparent The link carries a credential and executes with it, so it is as sensitive as the credential itself — and it passes through the cURL service's request log on the way, not just the target's. Share it only where you would share the secret, and prefer a delegated token with minimal permissions and an expiry: see API tokens.
Credit Cards
Providers: Visa, MasterCard, American Express Processor: Stripe (PCI-compliant) Fees: None Speed: Instant
Save a card once and pay from it whenever you want. Hoody never sees your card number; Stripe stores and processes it.
Cryptocurrencies
Supported: BTC, ETH, USDT, USDC, LTC, 100+ more Processor: NOWPayments Fees: +5% processing Speed: 5-60 minutes (blockchain confirmation)
You do not need an account or an identity check. Send the amount to the address you are given and wait for confirmation.
Bank Transfer
Minimum: $500+ Fees: None from Hoody (your bank may charge) Speed: 1-3 business days
Contact support for account details. Best for large deposits and enterprise accounts.
Save a credit card for repeat payments:
# The CLI cannot add a payment method. See the SDK and HTTP tabs.# It can only inspect and manage methods that already exist:hoody wallet payment-methods listconst paymentMethod = await client.api.wallet.addPaymentMethod({ type: 'credit_card', name: 'Personal Visa', details: { token: 'tok_1LgR....Dc2' }, // Stripe.js one-time token is_default: true,});console.log(paymentMethod.data.id); // "507f1f77bcf86cd799439131"curl -X POST "https://api.hoody.com/api/v1/wallet/payment-methods/" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Personal Visa", "type": "credit_card", "details": { "token": "tok_1LgR....Dc2" }, "is_default": true }'One request, one link
cURL runs inside your container and can wrap any HTTP request into a single GET URL. The call stops being something you need a client for and becomes something you can paste into a browser, send in a chat, bookmark, schedule with cron, or drop into a no-code tool.
Nothing is installed on the machine that opens it. The link does carry whatever credentials the call needs, so treat it as you would treat those credentials.
Slashes, colons and braces pass through as they are. The one character you must
encode is an & inside a value, which happens when the wrapped URL
carries its own query string. Left raw it ends the value early, and the rest is
read as cURL's own parameters, so you get a 200 on a request you did
not make.
How the wrapping works Chaining calls into one link Turning a link into a shortcut
Saves a card from a one-time Stripe token. Generate that token with Stripe.js in your own frontend first — this link cannot create one.
https://PROJECT_ID-CONTAINER_ID-curl-1.SERVER.containers.hoody.com/api/v1/curl/request?url=https://api.hoody.com/api/v1/wallet/payment-methods/&method=POST&bearer_token=TOKEN&json={"name":"Personal%20Visa","type":"credit_card","details":{"token":"tok_1LgR....Dc2"},"is_default":true}&response=transparent The link carries a credential and executes with it, so it is as sensitive as the credential itself — and it passes through the cURL service's request log on the way, not just the target's. Share it only where you would share the secret, and prefer a delegated token with minimal permissions and an expiry: see API tokens.
# List all payment methodshoody wallet payment-methods list
# Set a card as defaulthoody wallet payment-methods set-default $PAYMENT_METHOD_ID
# Delete a cardhoody wallet payment-methods delete $PAYMENT_METHOD_ID// List allconst methods = await client.api.wallet.listPaymentMethods();
// Set defaultawait client.api.wallet.setDefaultPaymentMethod(PAYMENT_METHOD_ID);
// Deleteawait client.api.wallet.deletePaymentMethod(PAYMENT_METHOD_ID);# List allcurl -X GET "https://api.hoody.com/api/v1/wallet/payment-methods/" \ -H "Authorization: Bearer $TOKEN"
# Set defaultcurl -X PUT "https://api.hoody.com/api/v1/wallet/payment-methods/$PAYMENT_METHOD_ID/default" \ -H "Authorization: Bearer $TOKEN"
# Deletecurl -X DELETE "https://api.hoody.com/api/v1/wallet/payment-methods/$PAYMENT_METHOD_ID" \ -H "Authorization: Bearer $TOKEN"One request, one link
cURL runs inside your container and can wrap any HTTP request into a single GET URL. The call stops being something you need a client for and becomes something you can paste into a browser, send in a chat, bookmark, schedule with cron, or drop into a no-code tool.
Nothing is installed on the machine that opens it. The link does carry whatever credentials the call needs, so treat it as you would treat those credentials.
Slashes, colons and braces pass through as they are. The one character you must
encode is an & inside a value, which happens when the wrapped URL
carries its own query string. Left raw it ends the value early, and the rest is
read as cURL's own parameters, so you get a 200 on a request you did
not make.
How the wrapping works Chaining calls into one link Turning a link into a shortcut
List saved cards, set one as default, or delete one.
# List
https://PROJECT_ID-CONTAINER_ID-curl-1.SERVER.containers.hoody.com/api/v1/curl/request?url=https://api.hoody.com/api/v1/wallet/payment-methods/&method=GET&bearer_token=TOKEN&response=transparent
# Set default
https://PROJECT_ID-CONTAINER_ID-curl-1.SERVER.containers.hoody.com/api/v1/curl/request?url=https://api.hoody.com/api/v1/wallet/payment-methods/PAYMENT_METHOD_ID/default&method=PUT&bearer_token=TOKEN&response=transparent
# Delete
https://PROJECT_ID-CONTAINER_ID-curl-1.SERVER.containers.hoody.com/api/v1/curl/request?url=https://api.hoody.com/api/v1/wallet/payment-methods/PAYMENT_METHOD_ID&method=DELETE&bearer_token=TOKEN&response=transparent The link carries a credential and executes with it, so it is as sensitive as the credential itself — and it passes through the cURL service's request log on the way, not just the target's. Share it only where you would share the secret, and prefer a delegated token with minimal permissions and an expiry: see API tokens.
Add funds to your General Balance with a card via Stripe Checkout:
# Card top-ups complete on Stripe's hosted checkout page, so they run# through the SDK/HTTP API or the dashboard rather than a direct CLI charge.# From the CLI, check your balance and transactions:hoody wallet balance gethoody wallet transactions list// Card top-up via Stripe Checkout. Redirect the user to the returned// checkout URL; the wallet is credited after Stripe confirms settlement// (webhook), not instantly.const checkout = await client.api.wallet.createStripeCheckout({ amount: '100.00', idempotency_key: 'topup-2026-06-10-001',});// checkout.data.intent.redirect_url: hosted Stripe Checkout URL to open// checkout.data.intent.id: payment intent id (poll with getStripePaymentIntent)curl -X POST "https://api.hoody.com/api/v1/wallet/payments/stripe/checkout" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "amount": "100.00", "idempotency_key": "topup-2026-06-10-001" }'One request, one link
cURL runs inside your container and can wrap any HTTP request into a single GET URL. The call stops being something you need a client for and becomes something you can paste into a browser, send in a chat, bookmark, schedule with cron, or drop into a no-code tool.
Nothing is installed on the machine that opens it. The link does carry whatever credentials the call needs, so treat it as you would treat those credentials.
Slashes, colons and braces pass through as they are. The one character you must
encode is an & inside a value, which happens when the wrapped URL
carries its own query string. Left raw it ends the value early, and the rest is
read as cURL's own parameters, so you get a 200 on a request you did
not make.
How the wrapping works Chaining calls into one link Turning a link into a shortcut
Opens a Stripe Checkout session; follow the returned redirect URL to complete the charge. The wallet is credited after Stripe confirms settlement, not instantly.
https://PROJECT_ID-CONTAINER_ID-curl-1.SERVER.containers.hoody.com/api/v1/curl/request?url=https://api.hoody.com/api/v1/wallet/payments/stripe/checkout&method=POST&bearer_token=TOKEN&json={"amount":"100.00","idempotency_key":"topup-2026-06-10-001"}&response=transparent The link carries a credential and executes with it, so it is as sensitive as the credential itself — and it passes through the cURL service's request log on the way, not just the target's. Share it only where you would share the secret, and prefer a delegated token with minimal permissions and an expiry: see API tokens.
Redirect the user to the returned checkout URL. Funds are credited after Stripe confirms settlement, usually within seconds. There are no additional fees, and an invoice is generated automatically.
Crypto payments work from any country, need no account, and carry no identity check.
Initiate the payment
Select cryptocurrency in the dashboard or API. The amount is converted to crypto at the current exchange rate.
Send to the address
You receive a unique payment address. Send the exact amount shown (including the 5% fee).
Wait for confirmation
Funds added
Hoody credits your balance, generates an invoice, and sends a confirmation email.
BTC, ETH, USDT, USDC, LTC, and 100+ more via NOWPayments. Check the payment interface for the complete list.
Bank transfers are for large deposits and enterprise accounts.
Contact support
Email with your desired amount, account ID, and preferred currency (USD, EUR).
Receive bank details
Account number, routing details, SWIFT/BIC code, and a reference number (required for crediting).
Send the transfer
Include the reference number in the transfer notes. Without it, crediting may be delayed.
Funds arrive (1-3 business days)
Hoody credits your balance, generates an invoice, and sends an email confirmation.
Hoody charges no fee on bank transfers. Your bank may charge wire, SWIFT, or conversion fees.
Every payment, charge, transfer, and refund lands in the same transaction list:
# List recent transactionshoody wallet transactions list
# Get details for a specific transactionhoody wallet transactions get $TRANSACTION_ID// List transactionsconst txns = await client.api.wallet.listTransactions({ limit: 50, sort_by: 'created_at', sort_order: 'desc' });
// Get a specific transactionconst txn = await client.api.wallet.getTransaction(TRANSACTION_ID);# List transactionscurl -X GET "https://api.hoody.com/api/v1/wallet/transactions?limit=50&sort_by=created_at&sort_order=desc" \ -H "Authorization: Bearer $TOKEN"
# Get specific transactioncurl -X GET "https://api.hoody.com/api/v1/wallet/transactions/$TRANSACTION_ID" \ -H "Authorization: Bearer $TOKEN"One request, one link
cURL runs inside your container and can wrap any HTTP request into a single GET URL. The call stops being something you need a client for and becomes something you can paste into a browser, send in a chat, bookmark, schedule with cron, or drop into a no-code tool.
Nothing is installed on the machine that opens it. The link does carry whatever credentials the call needs, so treat it as you would treat those credentials.
Slashes, colons and braces pass through as they are. The one character you must
encode is an & inside a value, which happens when the wrapped URL
carries its own query string. Left raw it ends the value early, and the rest is
read as cURL's own parameters, so you get a 200 on a request you did
not make.
How the wrapping works Chaining calls into one link Turning a link into a shortcut
Lists recent transactions or fetches one by ID.
# List
https://PROJECT_ID-CONTAINER_ID-curl-1.SERVER.containers.hoody.com/api/v1/curl/request?url=https://api.hoody.com/api/v1/wallet/transactions?limit=50%26sort_by=created_at%26sort_order=desc&method=GET&bearer_token=TOKEN&response=transparent
# Get one
https://PROJECT_ID-CONTAINER_ID-curl-1.SERVER.containers.hoody.com/api/v1/curl/request?url=https://api.hoody.com/api/v1/wallet/transactions/TRANSACTION_ID&method=GET&bearer_token=TOKEN&response=transparent The link carries a credential and executes with it, so it is as sensitive as the credential itself — and it passes through the cURL service's request log on the way, not just the target's. Share it only where you would share the secret, and prefer a delegated token with minimal permissions and an expiry: see API tokens.
Each transaction includes: unique ID, amount, currency, type (payment, credit, debit, refund, adjustment), status (pending, completed, failed, cancelled), timestamp, and related invoice.
Every payment generates an invoice automatically. Download them for accounting, taxes, or client billing:
# List all invoiceshoody wallet invoices list
# Download invoice as PDF (-o raw is required: the default output# JSON-stringifies the binary body and is not a usable PDF)hoody wallet invoices download $INVOICE_ID -o raw > invoice.pdf
# Generate invoice for a transaction that's missing onehoody wallet invoices generate $TRANSACTION_ID// List invoicesconst invoices = await client.api.wallet.listInvoices({ limit: 10, sort_by: 'created_at', sort_order: 'desc' });
// Download PDFconst pdf = await client.api.wallet.downloadInvoicePdf(INVOICE_ID);
// Generate missing invoiceawait client.api.wallet.generateInvoice(TRANSACTION_ID);# List invoicescurl -X GET "https://api.hoody.com/api/v1/wallet/invoices/?limit=10&sort_order=desc" \ -H "Authorization: Bearer $TOKEN"
# Download PDFcurl -X GET "https://api.hoody.com/api/v1/wallet/invoices/$INVOICE_ID/pdf" \ -H "Authorization: Bearer $TOKEN" -o invoice.pdf
# Generate missing invoicecurl -X POST "https://api.hoody.com/api/v1/wallet/invoices/generate/$TRANSACTION_ID" \ -H "Authorization: Bearer $TOKEN"One request, one link
cURL runs inside your container and can wrap any HTTP request into a single GET URL. The call stops being something you need a client for and becomes something you can paste into a browser, send in a chat, bookmark, schedule with cron, or drop into a no-code tool.
Nothing is installed on the machine that opens it. The link does carry whatever credentials the call needs, so treat it as you would treat those credentials.
Slashes, colons and braces pass through as they are. The one character you must
encode is an & inside a value, which happens when the wrapped URL
carries its own query string. Left raw it ends the value early, and the rest is
read as cURL's own parameters, so you get a 200 on a request you did
not make.
How the wrapping works Chaining calls into one link Turning a link into a shortcut
Lists invoices or generates one for a transaction that’s missing it. The PDF download (see the HTTP tab above) is a plain GET too, returning raw PDF bytes instead of JSON — fetch it with the CLI or HTTP tab shown above.
# List
https://PROJECT_ID-CONTAINER_ID-curl-1.SERVER.containers.hoody.com/api/v1/curl/request?url=https://api.hoody.com/api/v1/wallet/invoices/?limit=10%26sort_order=desc&method=GET&bearer_token=TOKEN&response=transparent
# Generate missing
https://PROJECT_ID-CONTAINER_ID-curl-1.SERVER.containers.hoody.com/api/v1/curl/request?url=https://api.hoody.com/api/v1/wallet/invoices/generate/TRANSACTION_ID&method=POST&bearer_token=TOKEN&response=transparent The link carries a credential and executes with it, so it is as sensitive as the credential itself — and it passes through the cURL service's request log on the way, not just the target's. Share it only where you would share the secret, and prefer a delegated token with minimal permissions and an expiry: see API tokens.
| Method | Speed | Fees | Best For |
|---|---|---|---|
| Credit Card | Instant | None | Regular top-ups, automation |
| Cryptocurrency | 5-60 min | +5% | Privacy, international, no-account |
| Bank Transfer | 1-3 days | Bank fees vary | Large deposits ($500+), enterprise |
Pick the method by what you need most: speed (card), privacy (crypto), or volume (bank transfer).
Your bank may flag hosting purchases as suspicious. Call your bank to whitelist Stripe. Verify the card hasn’t expired and the billing address matches. Check payment status:
hoody wallet transactions list --limit 10 # no CLI command for payment-intent status; use the SDK/HTTP tab// For a card payment, look up its Stripe intent (crypto: getCryptoPaymentIntent)const status = await client.api.wallet.getStripePaymentIntent(PAYMENT_ID);# Card payment (crypto: /wallet/payments/crypto/intents/$PAYMENT_ID)curl -X GET "https://api.hoody.com/api/v1/wallet/payments/stripe/intents/$PAYMENT_ID" \ -H "Authorization: Bearer $TOKEN"One request, one link
cURL runs inside your container and can wrap any HTTP request into a single GET URL. The call stops being something you need a client for and becomes something you can paste into a browser, send in a chat, bookmark, schedule with cron, or drop into a no-code tool.
Nothing is installed on the machine that opens it. The link does carry whatever credentials the call needs, so treat it as you would treat those credentials.
Slashes, colons and braces pass through as they are. The one character you must
encode is an & inside a value, which happens when the wrapped URL
carries its own query string. Left raw it ends the value early, and the rest is
read as cURL's own parameters, so you get a 200 on a request you did
not make.
How the wrapping works Chaining calls into one link Turning a link into a shortcut
Looks up a card payment’s Stripe intent status.
https://PROJECT_ID-CONTAINER_ID-curl-1.SERVER.containers.hoody.com/api/v1/curl/request?url=https://api.hoody.com/api/v1/wallet/payments/stripe/intents/PAYMENT_ID&method=GET&bearer_token=TOKEN&response=transparent The link carries a credential and executes with it, so it is as sensitive as the credential itself — and it passes through the cURL service's request log on the way, not just the target's. Share it only where you would share the secret, and prefer a delegated token with minimal permissions and an expiry: see API tokens.
Check the blockchain explorer for your transaction hash. Bitcoin needs 1-6 confirmations, Ethereum needs 12. If confirmed but not credited, contact support with the transaction hash and payment reference.
Verify you included the reference number. Check with your bank that the transfer was processed and not held for review. SWIFT transfers can take up to 5 days. Contact support with your bank confirmation and transfer details.