Skip to content
Hoody.com

The Wallet & Payments API exposes everything around an account’s money: balances (general and AI), the ledger of transactions, payment methods on file, top-up payments via Stripe and crypto providers, issued invoices, and the one-time GitHub connection bonus. Use these endpoints to render a wallet UI, top up an account, manage saved cards, fetch or download invoices, move funds between the general balance and AI credits, and reconcile settled payments.

All endpoints are scoped to the authenticated user. Money values are returned as 2-decimal USD strings unless the response field explicitly carries another type.

Return the aggregate balances for the authenticated user: the general balance plus the AI credit pool (limit, usage, remaining, reserved, usage status).

This endpoint takes no parameters.

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

Return only the AI credit pool: limit, usage, remaining, reserved, and usage status.

This endpoint takes no parameters.

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

Return only the general (spendable) balance and its ledger record.

This endpoint takes no parameters.

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

Return a paginated list of platform fees charged on AI credit transfers and admin credits, newest first.

NameInTypeRequiredDescription
pagequeryintegerNoPage number for pagination. Default: 1.
limitqueryintegerNoNumber of records per page. Default: 20.
sort_byquerystringNoOne of "created_at", "amount", "transaction_id". Default: "created_at".
sort_orderquerystringNoOne of "asc", "desc". Default: "desc".
Terminal window
curl -X GET 'https://api.hoody.com/api/v1/wallet/ai-fee-history?page=1&limit=20' \
-H 'Authorization: Bearer <token>'

List wallet transactions for the authenticated user, newest first.

NameInTypeRequiredDescription
limitqueryintegerNoNumber of records to return. Default: 20.
sort_byquerystringNoOne of "id", "transaction_type", "status", "amount", "created_at", "updated_at". Default: "created_at".
sort_orderquerystringNoOne of "asc", "desc". Default: "desc".
pagequeryintegerNoPage number, starting from 1.
filterquerystringNoOptional JSON object of column filters, e.g. {"status":"completed"} or {"amount":{"gte":10}}. A plain value matches exactly; an object applies operators eq, ne, gt, gte, lt, lte, like (case-insensitive substring; % and _ in the value are wildcards) and in (array, at most 100 values). Columns: transaction_type, status, amount, currency, reason, created_at, updated_at. Any other column or operator, a value that is not a string, number, boolean or null, or a filter that is not a JSON object is rejected with 400.
Terminal window
curl -X GET 'https://api.hoody.com/api/v1/wallet/transactions?limit=20' \
-H 'Authorization: Bearer <token>'

Fetch a single transaction by id.

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

One-way transfer from the general balance to AI credits. The amount is debited from general, the platform fee is deducted, and the net amount is credited to the AI credit limit.

NameTypeRequiredDescription
amountstringYesUSD amount as a string with up to 2 decimals (e.g. "10.00"). No exponent, no negatives.
idempotency_keystringNoOptional caller idempotency key (1-128 chars, must contain a non-whitespace character). Retrying with the same key and same amount returns the original receipt without moving funds again; the same key with a different amount is rejected.
expected_fee_bpsintegerNoOptional: the platform fee (basis points) the client displayed at confirmation. If it no longer matches the current server fee, the transfer is rejected 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",
"expected_fee_bps": 500
}'

List every payment method on file for the authenticated user. Default method first, then by newest created.

NameInTypeRequiredDescription
pagequeryintegerNoPage number, starting from 1. Default: 1.
limitqueryintegerNoResults per page. Capped at 100. Default: 100.
Terminal window
curl -X GET 'https://api.hoody.com/api/v1/wallet/payment-methods/?page=1&limit=100' \
-H 'Authorization: Bearer <token>'

Fetch a single payment method by id.

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

Add a new payment method to the authenticated user’s account.

NameTypeRequiredDescription
typestringYesOne of "credit_card", "paypal", "bank_transfer", "crypto".
namestringYesHuman-readable label shown in the wallet UI.
detailsobjectNoProvider-specific card details (for example last4, brand, exp_month, exp_year).
is_defaultbooleanNoSet this method as the 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. All body fields are optional; only fields you send are changed.

NameInTypeRequiredDescription
idpathstringYesPayment method id.
NameTypeRequiredDescription
namestringNoDisplay name, at most 100 characters.
detailsobjectNoReplace the provider-specific card details.
statusstringNoOne of "active", "inactive".
is_defaultbooleanNoMake this method the 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 '{
"name": "Mastercard (primary)",
"status": "active",
"is_default": true
}'

HTTP method variant of PUT /api/v1/wallet/payment-methods/{id}. Same request body and same responses; use whichever verb your client prefers.

NameInTypeRequiredDescription
idpathstringYesPayment method id.
NameTypeRequiredDescription
namestringNoDisplay name, at most 100 characters.
detailsobjectNoReplace the provider-specific card details.
statusstringNoOne of "active", "inactive".
is_defaultbooleanNoMake this method the default.
Terminal window
curl -X PATCH 'https://api.hoody.com/api/v1/wallet/payment-methods/507f1f77bcf86cd799439131' \
-H 'Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{
"name": "Mastercard (primary)",
"status": "active",
"is_default": true
}'

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

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

Mark an existing payment method as 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>'

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

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

HTTP method variant of PUT /api/v1/wallet/payment-methods/{id}/default. Same path, same response, same effect.

NameInTypeRequiredDescription
idpathstringYesPayment method id.
Terminal window
curl -X PATCH '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 a payment method from the user’s account.

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

List the authenticated user’s invoices, paginated.

NameInTypeRequiredDescription
pagequeryintegerNoPage number for pagination. Starts from 1. Default: 1.
limitqueryintegerNoNumber of invoices to return per page. Maximum 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.
sort_orderquerystringNoOne of "asc", "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 -X GET 'https://api.hoody.com/api/v1/wallet/invoices/?page=1&limit=20&sort_by=created_at&sort_order=desc' \
-H 'Authorization: Bearer <token>'

Fetch a single invoice by id, including its billing details and line items.

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

Download an invoice as a PDF file (application/pdf).

NameInTypeRequiredDescription
idpathstringYesInvoice id.
Terminal window
curl -X GET '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 an invoice for a specific transaction. If an invoice already exists for the transaction, the existing invoice is returned with status 200.

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

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

This endpoint takes no parameters.

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

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

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

Create a payment intent and a hosted Stripe Checkout session. Redirect the user to the returned checkout_url. The wallet is credited only after Stripe confirms settlement via webhook.

NameTypeRequiredDescription
amountstringYesUSD amount as a strict decimal string (e.g. "25" or "25.00").
idempotency_keystringNoOptional caller idempotency key (1-128 chars, must contain a non-whitespace character). Repeats with the same key 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 (card) payment intents, newest first.

NameInTypeRequiredDescription
limitqueryintegerNoMaximum number of intents to return. Default: 20.
offsetqueryintegerNoNumber of intents to skip from the start of the list. Default: 0.
Terminal window
curl -X GET '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}”

Fetch one of the authenticated user’s Stripe payment intents. Poll this after the checkout redirect to confirm settlement.

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

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

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

Create a payment intent and a hosted crypto payment invoice (NOWPayments). Redirect the user to the returned invoice_url. The wallet is credited only after the provider confirms settlement via IPN.

NameTypeRequiredDescription
amountstringYesUSD amount as a strict decimal string (e.g. "25" or "25.00").
idempotency_keystringNoOptional caller idempotency key (1-128 chars, must contain a non-whitespace character). Repeats with the same key 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
limitqueryintegerNoMaximum number of intents to return. Default: 20.
offsetqueryintegerNoNumber of intents to skip from the start of the list. Default: 0.
Terminal window
curl -X GET '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}”

Fetch one of the authenticated user’s crypto payment intents. Poll this after the invoice redirect to confirm settlement.

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

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

This endpoint takes no parameters.

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

Grant the one-time GitHub connection bonus when eligible. Idempotent: a second call returns result: "already_claimed" and credits nothing. The HTTP status is always 200; the outcome lives in data.result.

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