---
title: "Buy credits (charges real money)"
method: POST
path: "/credits/purchase"
tags: ["Credits"]
---

# Buy credits (charges real money)

`POST /credits/purchase`

## Request

- Base URL: `https://api.emailchaser.com/r`
- URL: `https://api.emailchaser.com/r/credits/purchase`
- Auth: HTTP bearer

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 body

- ModelsPurchaseCreditsRequest
  - `credits` integer, required: Credits is how many prospect credits to buy. Minimum 1000, maximum 10000 per call.

## Response `200`

The completed purchase

- ModelsPurchaseCreditsResponse
  - `amountUsd` number: AmountUsd is what the saved default payment method was charged, in US dollars.
  - `creditsPurchased` integer: CreditsPurchased is how many credits were bought and granted.
  - `newBalance` integer: NewBalance is the available credit balance after the grant.

## Other responses

- `400`: Malformed body or credits out of bounds (code invalid_request)
- `401`: Unauthorized - invalid or missing API key
- `402`: No usable billing (code billing_required) or the charge was refused (code payment_failed)
- `409`: Credits are free for this workspace, nothing was charged (code credits_free)
- `500`: Charged but not credited (code purchase_incomplete, do not retry) or outcome unknown (code purchase_unconfirmed)
- `503`: Stopped before any charge, safe to retry (code temporarily_unavailable)

---

[API](https://skmtc.dev/emailchaser/apis/emailchaser-api.md) · [All operations](https://skmtc.dev/emailchaser/apis/emailchaser-api/llms.txt) · [OpenAPI document](https://skmtc.dev/emailchaser/apis/emailchaser-api/revisions/8b114990abb7?raw)
