Credits and costs
See what each generation costs, check your balance and buy credits.
What generation costs
| Operation | Credits |
|---|---|
| One image, image edit, or preview | 1 per generated image |
| Animation, Standard | 2 per second (2 to 15 seconds) |
| Animation, Premium | 6 per second (4 to 30 seconds) |
| Source image for an animation | 1 when a new image is needed |
| From Video, Premium only | 6 per second (4 to 30 seconds), plus 1 for the pose image |
| Talking animation | 2 per second (120 a minute), up to 5 minutes, settled once the voice is recorded |
Talking estimate (dry_run: true) | 0 |
| Three voice samples | 1 |
| Logo | 5 |
| SVG from a logo or image | 30 |
| Background | 3 |
| Sticker from an image | 1 |
| Animated sticker from an animation | 0 |
| Cursor follower (nine directions) | 9 |
| Reversing an existing video | 0 |
No credits for background removal, format conversion, resizing, uploads, reading metadata, analyzing an image or website, or reviewing a generation plan. Preview images are paid even though their URLs expire.
What credits cost
Bigger purchases give more credits per dollar, so a minute of talking costs $18 with the smallest pack and $13.33 from $1,000. Any amount from $10 works in Billing.
| Purchase | Credits | Talking it buys | Price per minute of talking |
|---|---|---|---|
| $15 | 100 | 50 seconds | $18.00 |
| $50 | 400 | 3 min 20 s | $15.00 |
| $200 | 1,700 | 14 minutes | $14.12 |
| $1,000 | 9,000 | 75 minutes | $13.33 |
Amounts below $50 give 6⅔ credits per dollar, $50 to $199.99 give 8, $200 to $999.99 give 8.5, and $1,000 or more give 9.
Check your balance
Run masko credits (or --json), or await Masko.client().credits() in the TypeScript SDK. masko whoami shows the account and workspace it belongs to.
curl https://api.masko.ai/v1/credits \
-H "Authorization: Bearer $MASKO_API_KEY"{
"data": {
"subscription": 450,
"topup": 100,
"total": 550
}
}Subscription credits are spent before top-up credits. Buy credits and see terms in Billing; asset hosting is billed separately.
Buy credits from an API or agent
Create a Stripe-hosted checkout page for your credential's workspace; it never charges a saved card or buys automatically. Team purchases require the active team owner.
curl https://api.masko.ai/v1/credit-checkouts \
-H "Authorization: Bearer $MASKO_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: credit-purchase-001" \
-d '{"amount_cents":2000}'amount_cents: whole USD cents from 1000 to 1000000 ($10 to $10,000). Send no organization ID, price, credit quantity, payment method or return URL.- The response has
id,url,credits,amount_cents,currency,organization_id,expires_atandstatus_url. Openurlto confirm the final amount on Stripe; never give card details to an agent. - After a timeout, reuse the same
Idempotency-Keyand body (replays last 24 hours). If the URL expired, check status before buying again.
curl https://api.masko.ai/v1/credit-checkouts/CHECKOUT_ID \
-H "Authorization: Bearer $MASKO_API_KEY"Only its creator can read a checkout, from the same workspace. A paid checkout with credits_added: false is still delivering credits, so check again rather than paying twice; balance is the workspace balance, not a receipt. Only Stripe's verified webhook grants credits, once; reading status never does.
Connected agents get create_credit_checkout (amount_cents and a stable UUID operation_id) and get_credit_checkout (id). Create a checkout only when the user asks to buy credits; it is a hosted link, not an automatic payment. ChatGPT does not get these tools: it spends the credits already in the workspace you connected, and you buy credits in Billing.
Approve a plan
For canvas generation, dry-run first, then submit the same selection, approved plan ID and graph hash, so a changed graph cannot silently cost more.
Credits are allocated when work is accepted, and a client timeout does not prove failure. Check the job or run before retrying, and use persisted idempotency keys where supported; /generate has no run-level replay.
Insufficient credits
A rejected request returns HTTP 402:
{
"error": {
"code": "insufficient_credits",
"message": "Insufficient credits",
"details": {
"required": 21,
"balance": 5
}
}
}Rely on error.code; messages and optional details differ by endpoint.
Failures and refunds
A partly failed run can still hold successful paid assets. Runs report allocated_credits, credits_refunded and refund_status where available; a missing refund value promises nothing.
If the source video succeeded but transparent formats failed, use media repair instead of a new paid generation (generation progress and repair).
