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 |
|---|---|---|
| Free | $0 | 100 once per account |
| Maker | $19/month | 2,000 each paid month |
| Pro | $49/month | 10,000 each paid month |
| Credit pack | $10 once | 1,000, no expiry |
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.
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.