On this page
Billing and credits
Predictable export costs, subscription allowances and payment management.
Every signed-in customer has a workspace and one credit balance shared by the editor and all their API keys. Browser previews do not spend credits. Visit Billing to manage your balance, subscription, top-ups, payment method and invoices.
Plans
| Plan | Price (USD) | Included credits | API access | Commercial use |
|---|---|---|---|---|
| Free | $0 | 10 once per account | No | No |
| Maker | $19/month | 2,000 each paid month | Yes | Yes |
| Pro | $49/month | 10,000 each paid month | Yes | Yes |
| Credit pack | $10 once | 1,000, no expiry | — | — |
| Plan | Stills per minute | Animations per minute |
|---|---|---|
| Free | 10 | 2 |
| Maker | 60 | 10 |
| Pro | 300 | 60 |
Credit packs follow your plan's rate limits and do not unlock paid-plan access.
The free plan covers the editor and browser previews with every generator and format. API keys, the MCP endpoint, and the CLI require a paid plan, and commercial use of generated assets requires a paid plan active at generation time. Unused monthly credits expire at the end of their period. Credits closest to expiry are spent first. A paid upgrade adds the difference between allowances once for that period; downgrades and cancellation take effect at renewal. There are no automatic overage charges.
Render rate limits are enforced per account over a fixed one-minute window and are counted separately for stills and animations. Exceeding a limit returns 429 rate_limited with a Retry-After header; the counters are stored with your account, so a restart or a second API process cannot refill an allowance. Billing actions are limited to 10 per minute and MCP requests to 60 per minute on every plan.
Estimate an export
Still image cost is the final output megapixel count, rounded up, with a one-credit minimum. Animation cost is ceil(output megapixels × loop seconds × 10) at 24 fps. SVG and CSS cost one credit. Final dimensions include pixel ratio.
POST /v1/billing/estimate
Authorization: Bearer YOUR_KEY
Content-Type: application/json
{"generator":"shader-gradient","format":"mp4","params":{"loopSeconds":6},"size":{"width":1920,"height":1080,"pixelRatio":1}}
The response includes credits (125 here), final width, height, seconds and pricingVersion. Parameters and format support are validated exactly as for rendering.
Balances and reservations
GET /v1/billing returns the plan, status, available, reserved, consumed, grants and recent activity. Credits are reserved atomically before a synchronous render, batch item or job starts. Success consumes its reservation once. Failure and cancellation release it. Interrupted synchronous work is refunded after restart; jobs retain their reservation during recovery.
Insufficient credit returns HTTP 402, code insufficient_credits. A refund or dispute can put an account into billing_review until support reconciles it. Downloading an existing job result is free. New rendering requests, including cache hits, spend credits.
Export files are retained for seven days. Download completed files promptly; expired or missing results return 410 result_missing. Export metadata stays in your account. Full storage returns 503 export_storage_full without spending credits.
Checkout and portal
These actions require a browser session and matching Origin header. API keys cannot manage payments.
| Endpoint | Body | Result |
|---|---|---|
POST /v1/billing/checkout | {"product":"maker"} (or pro, credits) | Hosted Stripe checkout URL |
POST /v1/billing/portal | none | Current customer's Stripe portal URL |
Payment details stay on Stripe. The server selects the customer and price; arbitrary price IDs, customer IDs and return URLs are rejected. Only verified payment webhooks grant credits. A successful browser redirect alone does not add credits.
Typed SDK
const balance = await client.billing.get();
const estimate = await client.billing.estimate('shader-gradient', {
format: 'png',
size: { width: 1080, height: 1920, pixelRatio: 2 },
});
console.log(balance.available, estimate.credits); // 9 credits for this output
All SDK methods accept { signal }. Aborting a request does not cancel an already accepted job; call client.jobs.cancel(id) explicitly.
Local preview
The explicit local workspace is unmetered and cannot purchase subscriptions. Real signed-in accounts use their own credits even on a local server. Test checkout uses Stripe test payment details and makes no real charge.