# Pricing (/docs/api/operational/pricing)



Every paid operation on the API integration debits a single credit wallet on your Layers organization. Ingest is free today; generation costs credits; credit packs are the only way to top up.

New accounts start at 0 credits. The card-required first week costs $9 today, adds 1,000 credits, and converts to Pro monthly after 7 days unless canceled, with the $9 credited toward the first month. Pro is monthly only at $49/month with 5,000 credits. Ultra is $199/month with 25,000 credits.

One-time credit packs add credits to the same wallet: Crawl, 1,000 credits, $9; Walk, 4,000 credits, $29; Run, 10,000 credits, $69; Scale, 20,000 credits, $129. Plans and packs are available in the [Layers dashboard](https://app.layers.com/?settings=credits). Auto-reload buys one of those same packs, at the same price, whenever the balance falls below a threshold the organization sets; it charges the saved card and needs an active subscription. Variable-amount top-ups are retired. Enterprise pricing is negotiated; contact [sales@layers.com](mailto:sales@layers.com).

For the programmatic wallet check used before a generate call, see [`GET /v1/credits`](/docs/api/reference/credits/get-credits).

## Format cost table (in credits) [#format-cost-table-in-credits]

Credits per operation are the same on every plan - what varies is the $/credit your plan charges. The numbers below match `estimatedCreditsPerFormat` returned by [`GET /v1/credits`](/docs/api/reference/credits/get-credits).

| Format              | Credits | Status                                                                 |
| ------------------- | ------- | ---------------------------------------------------------------------- |
| `slideshow-builder` | 85      | Available.                                                             |
| `ugc-remix`         | 200     | Available (gated on `media:write` for the required `app-demo` upload). |
| `video-remix`       | 200     | Reserved; not partner-callable. Returns `UNSUPPORTED_FORMAT`.          |
| `slideshow-remix`   | 85      | Reserved; not partner-callable. Returns `UNSUPPORTED_FORMAT`.          |

Multi-variant fan-out (`variantCount > 1`) charges `N × per-format` credits — the request is gated by your wallet balance pre-flight; if the multiplied cost exceeds the balance the call returns `402 BILLING_EXHAUSTED` before any container is created.

## Ingest costs [#ingest-costs]

Ingest calls are free today. The [`GET /v1/credits`](/docs/api/reference/credits/get-credits) response reflects this on the `ingestCostsBilled` object - all three flags are `false`.

| Ingest                                  | Billed today? |
| --------------------------------------- | ------------- |
| `POST /v1/projects/:id/ingest/github`   | No (`false`)  |
| `POST /v1/projects/:id/ingest/website`  | No (`false`)  |
| `POST /v1/projects/:id/ingest/appstore` | No (`false`)  |

If Layers ever flips one of these to billed, we commit to **30-day advance notice** via partner notice and an update in this page's change history below listing the exact per-call credit deduction. The `ingestCostsBilled` flag on `/v1/credits` will flip to `true` on the same date, so partners who gate programmatically will see it before a single bill posts.

## Credit packs and exhaustion [#credit-packs-and-exhaustion]

At balance zero, every credit-spending call returns `402 BILLING_EXHAUSTED`:

```json
{
  "error": {
    "code": "BILLING_EXHAUSTED",
    "message": "Credit balance exhausted. Top up to resume.",
    "requestId": "req_8a1f2c3d4e5f6a7b",
    "details": { "reason": "insufficient" }
  }
}
```

`details.reason` is `"insufficient"` when the wallet can't cover the call, or `"cap"` when a [sub-org](/docs/api/concepts/organizations) child hit its `monthlyCreditCap`.

Calls that do not spend credits (reads, whoami, job polling, webhook receipt) continue to work - the plan gate only blocks credit-spending operations.

Credit packs are the only top-up mechanism. Purchase them manually in the [Layers dashboard](https://app.layers.com/?settings=credits):

* Crawl, 1,000 credits, $9.
* Walk, 4,000 credits, $29.
* Run, 10,000 credits, $69.
* Scale, 20,000 credits, $129.

Layers does not automatically charge for a top-up or replenish a wallet. The sub-organization auto-refill described below only transfers credits already held by the parent; it does not purchase credits.

## Sub-organization billing [#sub-organization-billing]

When you run customers as [sub-organizations](/docs/api/concepts/organizations), the parent stays the billing principal — only the parent has a card on file, and only the parent is ever charged. Moving credits to a child is never a new charge:

* **Allocation** ([`POST /:orgId/credits/allocate`](/docs/api/reference/organizations/credits/allocate)) is an internal **transfer** of already-purchased prepaid credits from the parent wallet to the child. No Stripe event, no markup — the same credits, now spendable by the child. Reclaim on archive runs the same transfer in reverse.
* **Per-child monthly cap** is a **budget control**, not a price: it bounds how many credits a child may spend per period. Set it with [`PATCH /:orgId/credit-config`](/docs/api/reference/organizations/credit-config) (`monthlyCreditCap`, in credits). At the cap, the child's next generation returns `402 BILLING_EXHAUSTED` with `details.reason: "cap"` — it doesn't change the cost of anything.
* **Auto-refill** is an automated parent→child **transfer** (no Stripe charge) that tops a child up when it runs low. Set `refillThreshold` + `refillAmount` via [credit-config](/docs/api/reference/organizations/credit-config). It draws from the parent's existing balance; if the parent is itself exhausted, the refill is a no-op and the child gets `402`. See the [Credits concept](/docs/api/concepts/credits).

Format costs (the table above) are identical for a child and a top-level org — a slideshow costs the same number of credits wherever it's generated.

## Forecasting spend [#forecasting-spend]

Use `estimatedCreditsPerFormat` from [`GET /v1/credits`](/docs/api/reference/credits/get-credits) as the pre-flight check before firing a generate call. The response also carries `usedThisPeriod` and `includedRemaining` - everything you need to render a "you've used X of Y this period" bar in your own dashboard.

```ts
const wallet = await fetch("https://api.layers.com/v1/credits", {
  headers: { "Authorization": `Bearer ${process.env.LAYERS_API_KEY}` },
}).then((r) => r.json());

const cost = wallet.estimatedCreditsPerFormat["slideshow_builder"];
if (wallet.balance < cost) {
  // 402 will fire if we proceed; warn the user and link to top-up.
  throw new Error(`Low balance: ${wallet.balance} < ${cost}`);
}
```

## Change history [#change-history]

Material changes to credit-per-operation rates or ingest billing land here with a date. Non-material changes (copy edits, clarifications) are not logged. Subscription-tier $/credit changes are plan-level and do not appear here.

| Date       | Change                                                                                                                                                                     |                  |            |                                                    |                                  |                                                                    |
| ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | ---------- | -------------------------------------------------- | -------------------------------- | ------------------------------------------------------------------ |
| 2026-08-27 | Updated slideshow formats to 85 credits and video formats to 200 credits. Replaced automatic top-up instructions with the current trial, plans, and one-time credit packs. |                  |            |                                                    |                                  |                                                                    |
| 2026-05-08 | Replaced legacy \`video\_remix                                                                                                                                             | slideshow\_remix | ugc\_remix | auto` with the v1 partner enum (`slideshow-builder | ugc-remix`available;`video-remix | slideshow-remix\` reserved). No credits-per-operation rate change. |
| 2026-04-20 | Initial publication of the credit-cost table and ingest-billing policy. No changes to credits-per-operation vs prior implicit defaults.                                    |                  |            |                                                    |                                  |                                                                    |

## See also [#see-also]

* [`GET /v1/credits`](/docs/api/reference/credits/get-credits) - programmatic wallet check
* [Errors](/docs/api/operational/errors) - `BILLING_EXHAUSTED` (402) semantics
* [Rate limits](/docs/api/operational/rate-limits) - per-tier rate ceilings
