# Credits, plans and billing # Credits, plans and billing Second Studio runs on credits. Each operation spends some; failed jobs are refunded automatically. You can buy one-time credit packs, or save with a monthly plan. Credits do not expire. ## Prices | Operation | Credits | |---|---| | Analyze a style (`POST /v1/styles`) | 2 for the first minute, then 1 per extra started minute, up to 10 minutes | | Make an edit (`POST /v1/edits`) | 5 plus 1 per started minute of footage, up to 10 clips and 30 minutes | | Record a web app (`POST /v1/recordings`) | 3 | | Fetch a video on our servers (`POST /v1/fetch`) | 1, or 2 for Instagram and other proxied hosts, plus 1 per extra 25 MB on a proxied download | | Draft a post (`POST /v1/posts`) | 1 per account, or 7 per X account when the caption has a link | | Generate an image (`POST /v1/images`) | GPT Image: 6 at 1K, 16 at 2K, 48 at 4K. Nano Banana: 6 at 1K or 2K, 9 at 4K. Own key: 1. Check with `estimate: true` | | Create a character (`POST /v1/characters`) | Twice the image price (32 at GPT Image 2K). Half is refunded when the first sheet passes | | Generate video (`POST /v1/videos`) | Quoted per request from the model provider's price, plus 2 credits (own key: 2, with no extra 2). Check with `estimate: true` | | Swap or motion transfer | Quoted per request (own key: 2) | | Generate voice (`POST /v1/voice`), including cloned voices | 2 credits minimum, then 1 per 250 characters | | Lip sync (`POST /v1/lipsync`) | 15 minimum; 94 per minute of output (pro: 157 per minute) | | Write an explainer script (`POST /v1/scripts`) | 2 | | Render an explainer video (`POST /v1/explainers`) | 12 for the first minute, 7 per extra started minute, narration included | | Upscale a video | 3 | | Brand kits (`POST /v1/brands`) | Free | | Read a repository into docs and skills (`POST /v1/repos/{id}/index`) | 12 plus 0.12 per selected file, rounded up (3,000 file cap, 400 credit cap). A later commit is 6 plus 0.12 per changed file. A quote (`estimate: true`) is free | | Rewrite one codebase skill (`POST /v1/skills/{id}/regenerate`) | 4 | | Reading repository docs and skills | Free | | Everything else: uploads, reading jobs and styles, listing accounts, bug reports | Free | `GET /v1/billing` always returns the current prices, packs and plans. ## Credit packs (one-time top-ups) | Pack | Credits | Price | Credits per $ | |---|---|---|---| | `starter` | 100 | $10 | 10.0 | | `growth` | 520 | $50 | 10.4 | | `scale` | 1,050 | $100 | 10.5 | ## Monthly plans | Plan | Price | Credits every month | Credits per $ | Jobs at once | |---|---|---|---|---| | `studio` | $100/mo | 1,150 | 11.5 | 8 | | `studio_max` | $200/mo | 2,375 | 11.9 | 16 | Plans give 15% to 19% more credits per dollar than packs: **$20 of top-ups buys 200 credits; $20 of Studio buys 230, and $20 of Studio Max about 238.** Plan accounts also run 8 or 16 jobs at once (instead of 4). Monthly credits are added each time the invoice is paid and stay in your balance, even after you cancel. You can top up with packs at any time while on a plan. ## Annual billing Annual is 5% off twelve times the monthly price, paid once, with the year's credits granted up front. | Plan | Price | Credits for the year | Credits per month | |---|---|---|---| | `studio` | $1,140/year | 13,728 | 1,144 | | `studio_max` | $2,280/year | 27,468 | 2,289 | That is about 12 credits per dollar, a bit more than the monthly plans. Subscribe with `POST /v1/billing/subscribe` `{ "plan": "studio", "interval": "year" }`. If you already have an annual subscription, you keep your current price and your current credit grant until you change plans. A renewal does not move you onto this price by itself. ## Buying credits or a plan | What | REST | MCP | |---|---|---| | Top up with a pack | `POST /v1/billing/checkout` `{ "pack": "growth" }` | `buy_credits` with `pack` | | Start a plan | `POST /v1/billing/subscribe` `{ "plan": "studio" }` | `buy_credits` with `plan` | | Change plan | `POST /v1/billing/plan` `{ "plan": "studio_max" }` | `change_plan` | | Cancel | `POST /v1/billing/plan` `{ "plan": "none" }` | `change_plan` with `none` | Each returns a Stripe Checkout link (`url`) that a person opens to pay. Credits are added as soon as Stripe confirms payment, through our webhook, even if the browser is closed before the success page loads. A new customer can also buy a first pack at `/signup?pack=starter`, which creates the account. Plan changes take effect right away for concurrency, with no proration; the new monthly credit grant starts at the next renewal. Cancelling ends the plan at the end of the paid period. If a renewal payment fails the plan shows `past_due` while Stripe retries; if Stripe gives up, the plan ends and the account goes back to packs. Credits already granted are never taken back. ### Who can buy On accounts with teams (all new accounts): - **Admins** can buy packs and start, change or cancel plans. - **Managers** can buy packs (top-ups). The credits go to the account balance, not to their team's budget, so buying cannot raise anyone's spending limit. Managers cannot change the plan. - **Creators and reviewers** cannot buy; their 402 errors tell them to ask an admin or manager. Older accounts without teams keep the previous rule: any key except a reviewer's can get a pack link, and plans need an admin key. Every purchase is attributed to the account. The ledger (`GET /v1/billing/ledger`) shows each `purchase` and `subscription` grant, and on accounts with teams the audit log records who created each Checkout link, each purchase, every plan change and any failed payment. Member and team budgets are never changed by a purchase. ## Refunds are automatic Credits are taken when a job or post is accepted. They are returned automatically when: - a job fails, including a render that fails its quality check; - a job gets no response from a worker for three hours; - a post is rejected, or fails on the platform. `GET /v1/billing/ledger` lists every purchase, grant, charge and refund with the running balance, and each job shows `creditsCharged` and `refunded`. ## Running out A request you cannot afford returns `402 insufficient_credits` and is not started; nothing is half-done or partly charged. The error message says how to top up (`buy_credits`, or `POST /v1/billing/checkout`) and points to this page. ## How prices are set 1 credit is $0.10 at the Starter price. Every operation is priced so that at least 2.5 times its provider cost is covered by the net dollars we actually receive per credit on every monthly pack and plan, after bonus credits and Stripe's fees (among those, the lowest is Studio Max, about $0.081 per credit). A test in the codebase checks this for every monthly pack, plan and operation.