Skip to content
Hoody.com

Manage account balances, saved payment methods, invoices, transactions, transfers between balance buckets, and top-up payment flows. Use these endpoints to render a wallet UI, check what providers can top up the user right now, generate invoices for transactions, and reconcile Stripe and crypto payment intents.

Authentication is via a Hoody token passed as Bearer <token> in the Authorization header on every request. The control-plane base URL is https://api.hoody.com.

Aggregate the user’s general balance and AI credit balance (limit, live usage, remaining). ai_usage_status is live when ai_usage and ai_remaining reflect a real provider reading; when it is unavailable, treat ai_remaining as unknown, not spendable.

This endpoint takes no parameters.

Terminal window
curl https://api.hoody.com/api/v1/wallet/balances \
-H "Authorization: Bearer <token>"

AI credit balance only — limit, current usage, and remaining.

This endpoint takes no parameters.

Terminal window
curl https://api.hoody.com/api/v1/wallet/balances/ai \
-H "Authorization: Bearer <token>"

General cash balance only.

This endpoint takes no parameters.

Terminal window
curl https://api.hoody.com/api/v1/wallet/balances/general \
-H "Authorization: Bearer <token>"

Paginated history of platform fees charged on AI credit transfers and admin credits. Each fee is paired with the transaction it was charged against.

NameInTypeRequiredDescription
pagequerynumberNoPage number. Default: 1.
limitquerynumberNoResults per page. Default: 20.
sort_byquerystringNoSort field. One of created_at, amount, transaction_id. Default: created_at.
sort_orderquerystringNoasc or desc. Default: desc.
Terminal window
curl "https://api.hoody.com/api/v1/wallet/ai-fee-history?page=1&limit=20&sort_by=created_at&sort_order=desc" \
-H "Authorization: Bearer <token>"

Status of the one-time GitHub connection bonus for the authenticated user. Reads local state only — it never contacts GitHub. When the offer is disabled, the response carries only { enabled: false } (plus the caller’s historical claim, if any).

This endpoint takes no parameters.

Terminal window
curl https://api.hoody.com/api/v1/wallet/github-bonus \
-H "Authorization: Bearer <token>"

Grants the one-time GitHub connection bonus to the authenticated user when eligible. Idempotent: a second call returns already_claimed and credits nothing. The endpoint always returns 200 — the outcome is in data.result.

data.result may be one of:

  • granted: credited now.
  • already_claimed: this account already received it.
  • identity_claimed_elsewhere: another account already claimed with this GitHub identity.
  • not_linked: no GitHub identity on this account.
  • offer_ended: offer inactive.
  • retry: transient write conflict, safe to retry.
  • error: unexpected.

This endpoint takes no parameters.

Terminal window
curl -X POST https://api.hoody.com/api/v1/wallet/github-bonus/claim \
-H "Authorization: Bearer <token>"

Saved payment methods (cards and other instruments) for the authenticated user. Use the CRUD endpoints to list, create, update, set as default, or delete a method.

List all payment methods for the current user.

This endpoint takes no parameters.

Terminal window
curl https://api.hoody.com/api/v1/wallet/payment-methods/ \
-H "Authorization: Bearer <token>"

Get a single payment method by id.

NameInTypeRequiredDescription
idpathstringYesPayment method id.
Terminal window
curl https://api.hoody.com/api/v1/wallet/payment-methods/507f1f77bcf86cd799439130 \
-H "Authorization: Bearer <token>"

Add a new payment method.

FieldTypeRequiredDescription
typestringYesPayment method type (for example credit_card).
namestringYesDisplay name (for example Mastercard ending in 5555).
detailsobjectNoFree-form provider-specific details.
is_defaultbooleanNoMark this method as the user’s default.
Terminal window
curl -X POST https://api.hoody.com/api/v1/wallet/payment-methods/ \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"type": "credit_card",
"name": "Mastercard ending in 5555",
"details": { "last4": "5555", "brand": "mastercard", "exp_month": 8, "exp_year": 2027 },
"is_default": false
}'

Update an existing payment method (name, status, default flag, details).

NameInTypeRequiredDescription
idpathstringYesPayment method id.
FieldTypeRequiredDescription
detailsobjectNoFree-form provider-specific details.
statusstringNoOne of active, inactive.
is_defaultbooleanNoPromote this method to the user’s default.
Terminal window
curl -X PUT https://api.hoody.com/api/v1/wallet/payment-methods/507f1f77bcf86cd799439131 \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"is_default": true,
"status": "active"
}'

PUT /api/v1/wallet/payment-methods/{id}/default

Section titled “PUT /api/v1/wallet/payment-methods/{id}/default”

Promote an existing payment method to the user’s default.

NameInTypeRequiredDescription
idpathstringYesPayment method id.
Terminal window
curl -X PUT https://api.hoody.com/api/v1/wallet/payment-methods/507f1f77bcf86cd799439131/default \
-H "Authorization: Bearer <token>"

DELETE /api/v1/wallet/payment-methods/{id}

Section titled “DELETE /api/v1/wallet/payment-methods/{id}”

Delete an existing payment method.

NameInTypeRequiredDescription
idpathstringYesPayment method id.
Terminal window
curl -X DELETE https://api.hoody.com/api/v1/wallet/payment-methods/507f1f77bcf86cd799439131 \
-H "Authorization: Bearer <token>"

Generate, retrieve, list, and download PDF invoices for completed transactions.

List all invoices for the current user. Supports pagination, sorting, and structured filtering.

NameInTypeRequiredDescription
pagequeryintegerNoPage number, starting from 1. Default: 1.
limitqueryintegerNoResults per page; max 100. Default: 20.
sort_byquerystringNoOne of id, invoice_number, status, amount, currency, issue_date, due_date, paid_date, created_at, updated_at, user_id, transaction_id. Unrecognised values fall back to created_at. Default: created_at.
sort_orderquerystringNoasc or desc. Default: desc.
filterquerystringNoJSON object string filtering by the sortable fields, e.g. {"status":"paid"} or {"amount":{"gte":10}}. Operators: eq, ne, gt, gte, lt, lte, like, in. Unknown fields or operators are rejected with 400.
Terminal window
curl "https://api.hoody.com/api/v1/wallet/invoices/?page=1&limit=10&sort_by=created_at&sort_order=desc" \
-H "Authorization: Bearer <token>"

Get a single invoice, including line items, billing details (when applicable), and the source transaction.

NameInTypeRequiredDescription
idpathstringYesInvoice id.
Terminal window
curl https://api.hoody.com/api/v1/wallet/invoices/507f1f77bcf86cd799439120 \
-H "Authorization: Bearer <token>"

Download an invoice as a PDF file (Content-Type: application/pdf).

NameInTypeRequiredDescription
idpathstringYesInvoice id.
Terminal window
curl -L https://api.hoody.com/api/v1/wallet/invoices/507f1f77bcf86cd799439120/pdf \
-H "Authorization: Bearer <token>" \
-o invoice.pdf

POST /api/v1/wallet/invoices/generate/{id}

Section titled “POST /api/v1/wallet/invoices/generate/{id}”

Generate (or regenerate) an invoice for a specific transaction. If an invoice already exists for the transaction, the existing invoice id is returned with a 200; otherwise a new one is created and returned with 201.

NameInTypeRequiredDescription
idpathstringYesTransaction id.
Terminal window
curl -X POST https://api.hoody.com/api/v1/wallet/invoices/generate/507f1f77bcf86cd799439110 \
-H "Authorization: Bearer <token>"

List wallet transactions. Use to reconcile debits and credits on the user’s balance.

NameInTypeRequiredDescription
limitquerynumberNoResults per page. Default: 20.
sort_byquerystringNoOne of id, transaction_type, status, amount, created_at, updated_at. Default: created_at.
sort_orderquerystringNoasc or desc. Default: desc.
Terminal window
curl "https://api.hoody.com/api/v1/wallet/transactions?limit=20&sort_by=created_at&sort_order=desc" \
-H "Authorization: Bearer <token>"

Get a single transaction by id.

NameInTypeRequiredDescription
idpathstringYesTransaction id.
Terminal window
curl https://api.hoody.com/api/v1/wallet/transactions/507f1f77bcf86cd799439110 \
-H "Authorization: Bearer <token>"

Inspect which top-up providers are usable right now (enabled and configured), the per-provider USD bounds, and the AI-credit transfer fee in basis points. Use this in the wallet UI to render the correct top-up affordances. No secrets are returned.

This endpoint takes no parameters.

Terminal window
curl https://api.hoody.com/api/v1/wallet/payment-availability \
-H "Authorization: Bearer <token>"

One-way transfer from general balance to AI credit balance. The amount is debited in full from the general balance, and the net amount (after the platform fee) is credited to the AI credit limit. Pass expected_fee_bps so the server can reject the transfer if the fee you displayed at confirmation no longer matches — this guarantees no irreversible transfer is charged a fee the user was not shown.

If you pass an idempotency_key, retrying with the same key and the same amount returns the original receipt without moving funds again (the response sets replayed: true); reusing the same key with a different amount returns 409 TRANSFER_IDEMPOTENCY_KEY_REUSED.

FieldTypeRequiredDescription
amountstringYesUSD amount as a strict decimal string with up to 2 decimals (for example "10.00"). No exponent, no negatives.
idempotency_keystringNoCaller idempotency key, 1–128 chars, must contain a non-whitespace character. Retries with the same key and same amount replay the receipt; same key with a different amount is rejected.
expected_fee_bpsintegerNoThe platform fee in basis points the client displayed at confirmation (0–9999). If it does not match the current server fee, the transfer is rejected with 409 TRANSFER_FEE_CHANGED so the user re-confirms.
Terminal window
curl -X POST https://api.hoody.com/api/v1/wallet/transfers \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"amount": "25.00",
"idempotency_key": "transfer-2025-01-21-001",
"expected_fee_bps": 500
}'

Top up the wallet using a hosted crypto invoice. The endpoint creates a payment intent and a hosted invoice URL; the user pays there and the wallet is credited only after NOWPayments confirms settlement via IPN.

POST /api/v1/wallet/payments/crypto/invoice

Section titled “POST /api/v1/wallet/payments/crypto/invoice”

Create a crypto payment intent and return the hosted invoice URL. Send the user to the invoice_url to complete payment. Pass idempotency_key so retries with the same key return the original intent.

FieldTypeRequiredDescription
amountstringYesUSD amount as a strict decimal string (for example "25" or "25.00").
idempotency_keystringNoCaller idempotency key, 1–128 chars, must contain a non-whitespace character. Repeats return the original intent.
Terminal window
curl -X POST https://api.hoody.com/api/v1/wallet/payments/crypto/invoice \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"amount": "25.00",
"idempotency_key": "topup-2026-06-10-002"
}'

GET /api/v1/wallet/payments/crypto/intents

Section titled “GET /api/v1/wallet/payments/crypto/intents”

List the authenticated user’s crypto payment intents, newest first.

NameInTypeRequiredDescription
limitqueryintegerNoMax intents to return. Default: 20.
offsetqueryintegerNoOffset for pagination. Default: 0.
Terminal window
curl "https://api.hoody.com/api/v1/wallet/payments/crypto/intents?limit=20&offset=0" \
-H "Authorization: Bearer <token>"

GET /api/v1/wallet/payments/crypto/intents/{id}

Section titled “GET /api/v1/wallet/payments/crypto/intents/{id}”

Get one of the authenticated user’s crypto payment intents by id. Poll this after redirecting the user to the hosted invoice URL until status is completed, failed, or expired.

NameInTypeRequiredDescription
idpathstringYesPayment intent id.
Terminal window
curl https://api.hoody.com/api/v1/wallet/payments/crypto/intents/665f1f77bcf86cd799439012 \
-H "Authorization: Bearer <token>"

Top up the wallet using a hosted Stripe Checkout session. The endpoint creates a payment intent and a hosted checkout URL; the user pays there and the wallet is credited only after Stripe confirms settlement via webhook.

POST /api/v1/wallet/payments/stripe/checkout

Section titled “POST /api/v1/wallet/payments/stripe/checkout”

Create a card payment intent and a Stripe Checkout session. Send the user to the checkout_url to complete payment. Pass idempotency_key so retries with the same key return the original intent.

FieldTypeRequiredDescription
amountstringYesUSD amount as a strict decimal string (for example "25" or "25.00").
idempotency_keystringNoCaller idempotency key, 1–128 chars, must contain a non-whitespace character. Repeats return the original intent.
Terminal window
curl -X POST https://api.hoody.com/api/v1/wallet/payments/stripe/checkout \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"amount": "25.00",
"idempotency_key": "topup-2026-06-10-001"
}'

GET /api/v1/wallet/payments/stripe/intents

Section titled “GET /api/v1/wallet/payments/stripe/intents”

List the authenticated user’s Stripe payment intents, newest first.

NameInTypeRequiredDescription
limitqueryintegerNoMax intents to return. Default: 20.
offsetqueryintegerNoOffset for pagination. Default: 0.
Terminal window
curl "https://api.hoody.com/api/v1/wallet/payments/stripe/intents?limit=20&offset=0" \
-H "Authorization: Bearer <token>"

GET /api/v1/wallet/payments/stripe/intents/{id}

Section titled “GET /api/v1/wallet/payments/stripe/intents/{id}”

Get one of the authenticated user’s Stripe payment intents by id. Poll this after redirecting the user to the Stripe Checkout URL until status is completed, failed, or expired.

NameInTypeRequiredDescription
idpathstringYesPayment intent id.
Terminal window
curl https://api.hoody.com/api/v1/wallet/payments/stripe/intents/665f1f77bcf86cd799439011 \
-H "Authorization: Bearer <token>"