Credits
Your credit balance, every credit transaction, and buying more credits with the card on file.
Get the credit balance
Returns the workspace's credit wallet. A wallet is created empty on first use, so a new workspace sees zeros rather than an error; a workspace on a free trial sees its one-time trial credits, which its first balance read hands over. unlimited is true when Emailchaser has made this workspace's credits free: credit actions then never spend available and are never refused for lack of credits, so there is no need to check the balance or buy credits.
Responses
- 200 The wallet snapshot · CreditBalanceResponse
- 401 Unauthorized - invalid or missing API key · ErrorUnauthorized
- 500 Failed to load the credit balance · ErrorResponse
Fields in the 200 response
- available integerExample:
1500 - lifetimeGranted integerExample:
5000 - lifetimeUsed integerExample:
3400 - monthlyGrant integerExample:
2000 - reserved integerExample:
100 - unlimited boolean
Unlimited is true when this workspace's credits are free: every credit action goes through without spending available, nothing is refused for lack of credits, and POST /credits/purchase is refused (code credits_free) because there is nothing to buy.
Example:false
Request
curl -X GET "https://api.emailchaser.com/r/credits/balance" \
-H "Authorization: Bearer $EMAILCHASER_API_KEY"Response
{
"available": 1500,
"lifetimeGranted": 5000,
"lifetimeUsed": 3400,
"monthlyGrant": 2000,
"reserved": 100,
"unlimited": false
}Buy credits (charges real money)
CHARGES REAL MONEY: this immediately charges the workspace's saved default payment method (the card behind the active subscription), off-session, with no confirmation step beyond this call. Buys between 1000 and 10000 prospect credits at the tiered list price ($33 per 1000 credits, $20 per 1000 from 5000 credits) and grants them to the wallet on success. Responds with the credits bought, the exact amount charged in USD and the new available balance. Errors carry a machine-readable code: billing_required (402, no active subscription or saved card - fix billing in the app first), payment_failed (402, the charge was refused - no money moved), credits_free (409, this workspace's credits are free, so nothing is charged and there is nothing to buy), invalid_request (400), temporarily_unavailable (503, the purchase stopped before any charge - safe to retry), purchase_incomplete (500, charged but not credited, support already notified - do NOT retry) and purchase_unconfirmed (500, check /credits/transactions before retrying). The grant is idempotent on the Stripe invoice, so one charge can never double-credit - but every successful call is a NEW charge.
Request bodyJSON · PurchaseCreditsRequest
- credits integer required
Credits is how many prospect credits to buy. Minimum 1000, maximum 10000 per call.
Example:5000
Responses
- 200 The completed purchase · PurchaseCreditsResponse
- 400 Malformed body or credits out of bounds (code invalid_request) · PurchaseCreditsErrorResponse
- 401 Unauthorized - invalid or missing API key · ErrorUnauthorized
- 402 No usable billing (code billing_required) or the charge was refused (code payment_failed) · PurchaseCreditsErrorResponse
- 409 Credits are free for this workspace, nothing was charged (code credits_free) · PurchaseCreditsErrorResponse
- 500 Charged but not credited (code purchase_incomplete, do not retry) or outcome unknown (code purchase_unconfirmed) · PurchaseCreditsErrorResponse
- 503 Stopped before any charge, safe to retry (code temporarily_unavailable) · PurchaseCreditsErrorResponse
Fields in the 200 response
- amountUsd number
AmountUsd is what the saved default payment method was charged, in US dollars.
Example:100 - creditsPurchased integer
CreditsPurchased is how many credits were bought and granted.
Example:5000 - newBalance integer
NewBalance is the available credit balance after the grant.
Example:5000
Request
curl -X POST "https://api.emailchaser.com/r/credits/purchase" \
-H "Authorization: Bearer $EMAILCHASER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"credits": 5000
}'Response
{
"amountUsd": 100,
"creditsPurchased": 5000,
"newBalance": 5000
}List credit transactions
Lists the workspace's credit ledger entries, newest first. Optional filters: kind (movement type), reason (what the credits were for), and since/until on the entry time (both inclusive, RFC3339 or YYYY-MM-DD where a bare date means midnight UTC at the start of that day). Without filters the full ledger is returned as before. An entry with free=true was written while the workspace's credits were free: its amount is what the action would have cost, and no credits moved.
Parameters
- limit integer in query
Page size (default 50, max 200)
- page integer in query
Page number, 1-based (default 1)
- kind string in query
Filter by movement type: grant, topup, reserve, commit, refund, expire or adjustment
- reason string in query
Filter by reason: monthly_grant, prospect_reveal, ai_icp, ai_sequence, ai_reply, stripe_topup or manual_adjustment
- since string in query
Only entries at or after this time, RFC3339 or YYYY-MM-DD
- until string in query
Only entries at or before this time, RFC3339 or YYYY-MM-DD (a bare date means midnight UTC at the start of that day)
Responses
- 200 Ledger entries and total count (both reflect the filters) · ListCreditTransactionsResponse
- 400 Invalid filter value · ErrorResponse
- 401 Unauthorized - invalid or missing API key · ErrorUnauthorized
- 500 Failed to retrieve credit transactions · ErrorResponse
Fields in the 200 response
- total integerExample:
12 - transactions array of CreditTransactionItem
9 fields inside transactions
- amount integer
Amount is the signed credit delta: negative for spend, positive for grants and refunds.
Example:2000 - balanceAfter integer
BalanceAfter is the available balance immediately after this entry.
Example:2000 - createdAt stringExample:
2026-07-01T10:30:00Z - description stringExample:
Monthly plan credits - free boolean
Free is true for an entry written while this workspace's credits were free. Its amount is what the action would have cost, no credits moved, and balanceAfter is the balance it found.
Example:false - id integerExample:
42 - kind string
Kind is the movement type: grant, topup, reserve, commit, refund, expire or adjustment.
Example:grant - reason string
Reason is what the credits were spent on or granted for.
Example:monthly_grant - reference string
Reference correlates the entry to what caused it, e.g. 'prospect_search:123'.
Request
curl -X GET "https://api.emailchaser.com/r/credits/transactions" \
-H "Authorization: Bearer $EMAILCHASER_API_KEY"Response
{
"total": 12,
"transactions": [
{
"amount": 2000,
"balanceAfter": 2000,
"createdAt": "2026-07-01T10:30:00Z",
"description": "Monthly plan credits",
"free": false,
"id": 42,
"kind": "grant",
"reason": "monthly_grant",
"reference": "string"
}
]
}Generated from the Emailchaser API's own OpenAPI definition, so it always matches the running API.