Prices
This page explains what a tenant pays and what the variables control. There are no plans. Credits are the product.
What a tenant pays
| Line | Price | Variable |
|---|---|---|
| One hour of agent time. | 25 cents. | CREDIT_TURN_HOUR_CENTS. |
An hour of agent time is an hour with a prompt in flight on a platform-paid provider (Sprites, E2B or Daytona). Time on a self-hosted runner spends nothing, because Fountain pays nothing for that machine. Turn time adds up for each turn. Two conversations that each run for an hour on one sandbox spend two hours, on a sandbox that was busy for one.
A detached permission request
adds no turn time while it waits after its turn ends. An answer opens a new
resume turn, and the expiry sweep opens the same turn when nobody answers.
With billing enabled, Fountain prices each resume turn's duration at
CREDIT_TURN_HOUR_CENTS per hour for platform-paid providers. A sequence of
detached approvals therefore adds one resume turn per answer.
The opening credit
A new account gets CREDIT_OPENING_CENTS ($5) when it verifies its email.
That credit expires CREDIT_OPENING_DAYS (14) days later. Credit a tenant
buys never expires, and Fountain spends it last.
Credit packs
A tenant buys credit on the billing page, or with
POST /api/account/billing/credits/checkout. The packs are the amounts in
CREDIT_PACKS_CENTS, $10, $25 and $100 by default. Each purchase is a
one-time Stripe Checkout. Stripe reports the payment on the webhook, and
Fountain adds the credit then, not before.
Subscribe your webhook endpoint to charge.refunded and
charge.dispute.created. On each one, Fountain removes the refunded or
disputed amount from the balance, and the balance can go below zero. Fountain
does not add a disputed amount back when you win the dispute. Add it by hand
from the admin page.
A zero balance
A zero balance refuses new sandboxes and new turns. A balance can still go below zero, because a turn that crosses zero finishes. The next purchase brings it back. Fountain sends an email when the balance falls under 20 percent of the opening credit, and another when it reaches zero.
Hosted Buzz agents
An enabled Buzz identity is a permanent buzz-acp process on the Fountain
pods. It costs while nobody uses it, and no sandbox meter reports it, because
it is not a sandbox. Two rules apply to it.
BUZZ_IDENTITY_CEILING (10) is the most hosted agents one account may run at
once. It is an abuse ceiling, not a price.
An account with no credit keeps its agents but not their processes. Fountain stops each harness within 15 minutes and keeps the row, in the same way that an idle sandbox parks. A top-up starts them again on the next sweep. Nothing charges for the agent itself yet. Only the conversations it opens burn credit.
How many agents at once
A tenant may run as many sandboxes at once as the balance funds: one for each
SANDBOX_RESERVE_CENTS ($2) in the balance, from SANDBOX_CAP_FLOOR (2) up
to SANDBOX_CAP_CEILING (20). An admin override on the account wins. The
whole deployment stops at SANDBOX_FLEET_CEILING (20). Set that to what your
sandbox provider plan allows.
The two limits behave differently. Fountain refuses the next start for a tenant at their cap, and tells the caller to terminate a conversation or add credit. Fountain refuses the next start for everyone when the fleet is full, and tells the caller to try again in a minute.
Both limits feed the same bounded queue. A fresh API start can set
queue: true. Fountain then answers 202 and lets the request wait. A
teammate schedule uses the queue on every cron firing. Other callers keep the
immediate 429 or 503 answer.
Each tenant holds ten requests. A request waits one hour. Set these bounds
with SANDBOX_QUEUE_MAX_DEPTH and SANDBOX_QUEUE_MAX_WAIT_SECONDS. At the
depth bound Fountain refuses the request. After the wait bound Fountain
expires it. The queue delays the cap. It never raises the cap, and a start
must pass the credit gate again when it runs.
Give someone free credit
To make an account pay nothing at all, comp the account. Open
/admin/users and select comp on the row, or send
POST /api/admin/users/{id}/comp with {"comped": true}. Fountain never
checks that account's balance.
To give an account credit that never expires, use the admin API:
POST /api/admin/users/{id}/credits with {"cents": 1000, "note": "why"}.
See the money
/admin/finance shows credit earned, sold and deferred, the cost of each
provider, and the invoice you record next to the computed figure. See
See what sandboxes cost.