Plans and pricing
Free to evaluate, pay-as-you-go for exact usage, subscriptions for predictable bills. Every paid plan overflows instead of stopping.
Storage is free. What is metered is the work: extraction on writes, search on reads, the model on playground chats. Every paid plan overflows into a wallet rather than stopping — the one exception is Free, which upgrades instead of billing.
The plans
| plan | price | conversations/mo | retrievals/mo | memories | playground chats/mo |
|---|---|---|---|---|---|
| Free | ₹0 | 100 | 2,500 | 1,000 | 25 |
| Pay as you go | ₹500 min recharge | 20,000¹ | 1,000,000¹ | 200,000¹ | 2,000¹ |
| Starter | $5/mo | 1,000 | 50,000 | 10,000 | 200 |
| Growth | $20/mo | 5,000 | 250,000 | 50,000 | 1,000 |
| Scale | $100/mo | 30,000 | 1,500,000 | 250,000 | 5,000 |
| Max | $200/mo | 75,000 | 4,000,000 | 600,000 | 12,000 |
| Enterprise | talk to us | — | — | — | — |
¹ Pay-as-you-go's numbers are abuse ceilings, not entitlements. You are billed per unit from your wallet from the first request; these figures exist only to cap what a compromised key could spend before the wallet runs dry or a ceiling is hit.
An account with no plan on file is Free. Free's numbers are sized so a genuine evaluation finishes — a hundred ingested conversations is enough to decide whether this works — and an abusive signup costs cents, not dollars.
Pay as you go
No subscription. Recharge a wallet, in Indian Rupees, and pay for exactly the work you use:
| meter | rate |
|---|---|
conversation remembered (POST /v1/memories) |
₹0.50 |
retrieval (GET /v1/retrieve) |
₹0.02 |
| playground chat | ₹1.00 |
The minimum recharge is ₹500, and the maximum is ₹1,00,000 in one transaction —
above that, contact support. Recharges start from the
dashboard's billing page, not from the API: POST /v1/billing/recharge requires a
dashboard session and returns a hosted checkout link.
curl -s -X POST "$GITLOOM_API/v1/billing/recharge" \
-H "Authorization: Bearer $ID_TOKEN" \
-H "content-type: application/json" \
-d '{"amount_paise": 50000}'
{"payment_link": "https://checkout.dodopayments.com/...", "payment_id": "pay_..."}
The first successful recharge moves the account onto the payg plan automatically.
Balance and rates are readable any time:
curl -s "$GITLOOM_API/v1/billing" -H "Authorization: Bearer $ID_TOKEN"
{
"plan": "payg",
"currency": "INR",
"ledger": "dodo",
"balance_paise": 44998,
"min_recharge_paise": 50000,
"rates_paise": {"writes": 50, "reads": 2, "chats": 100},
"transactions": [{"amount_paise": -2, "note": "1 reads", "at": "2026-08-01T09:14:02Z"}]
}
The one downside of pay-as-you-go is rate limits — see below. That is the entire trade: no monthly commitment, in exchange for the tightest ceiling on how fast you can call the API.
Subscriptions
Starter, Growth, Scale and Max are monthly plans with a fixed allowance, higher rate
limits than pay-as-you-go, and overage: once the monthly allowance for a meter is
spent, further usage draws from the wallet at pay-as-you-go rates instead of failing.
Keep the wallet funded if you expect to run over — an empty wallet on overage returns
402, same as an exhausted pay-as-you-go balance.
curl -s -X POST "$GITLOOM_API/v1/billing/subscribe" \
-H "Authorization: Bearer $ID_TOKEN" \
-H "content-type: application/json" \
-d '{"plan": "starter"}'
{"payment_link": "https://checkout.dodopayments.com/..."}
plan is one of starter, growth, scale, max. Subscribing, renewing, and
cancelling are all driven by Dodo's webhook, not the dashboard directly:
- Active or renewed → the account moves onto that plan's limits immediately.
- Cancelled, expired, failed, or put on hold → the account demotes to
paygif the wallet still holds a balance, otherwise tofree. Nothing is left on a paid tier's limits with nothing paying for them.
Starter is the floor for running the CLI locally
The local CLI is licensed software, separate from a hosted API key. A licence can
only be minted on Starter or above — Free and pay-as-you-go do not qualify.
Creating one on an ineligible plan is 402 plan_required, with a pointer back to
this page. See Install and CLI for
activation.
Overage
Overage(plan) is true for every subscription tier and false for Free and
pay-as-you-go — Free has nothing to overflow into (it upgrades instead), and
pay-as-you-go is already billed per unit inside its ceiling. Concretely, once a
subscribed account's monthly writes, reads, memories, or chats allowance is
spent:
- The request is not refused. It is billed from the wallet at the pay-as-you-go rate for that meter.
- If the wallet cannot cover it, the request fails with
402 balance_exhausted— recharge and retry. - Usage keeps reporting truthfully past the allowance; the counter does not cap out at the limit and hide what actually happened.
{"error":{"code":"balance_exhausted","message":"reads allowance spent and the wallet cannot cover the overage"}}
Rate limits
Independent of the monthly allowance, every plan has a per-minute ceiling on writes, reads, and chats. This is the lever that makes pay-as-you-go's trade real: an abuse ceiling sized for the whole month means nothing if a script can spend it in ten seconds.
| plan | writes/min | reads/min | chats/min |
|---|---|---|---|
| Free | 5 | 30 | 2 |
| Pay as you go | 20 | 120 | 4 |
| Starter | 30 | unmetered | 8 |
| Growth | 60 | unmetered | 15 |
| Scale | 120 | unmetered | 30 |
| Max | 240 | unmetered | 60 |
Reads are unmetered on every subscription tier. Retrieval is the hot path a production integration calls on every user turn, and holding paid accounts to a per-minute ceiling there would cap p99 latency for exactly the customers paying to avoid that. Pay-as-you-go and Free still throttle reads, because an unmetered read path on a plan with no subscription behind it is an open door.
A throttled request costs nothing — the rate check runs before anything is counted or billed:
{"error":{"code":"rate_limited","message":"quota: rate limited: the starter plan allows 30 writes per minute"}}
429, same status as a spent monthly allowance. Distinguish them by code:
quota_exceeded clears at the next calendar month; rate_limited clears within the
minute.
Checking where you stand
curl -s "$GITLOOM_API/v1/usage" -H "Authorization: Bearer $GITLOOM_KEY"
{
"period": "2026-08",
"plan": "starter",
"used": {"writes": 340, "reads": 41200, "memories": 3108, "chats": 12},
"limits": {"writes": 1000, "reads": 50000, "memories": 10000, "chats": 200},
"exceeded": false
}
Counters are month-keyed and start at zero on the first of the month — there is no
reset to wait for. memories is the one exception: it is a level, not a flow (stored
memories go down as well as up), so it is not scoped to a period.
A notification fires internally when a meter crosses 80% of its limit, so a warning arrives before the ceiling does.
FAQ
Do I need a card to try GitLoom? No. Free requires only a sign-up.
What happens if I exceed Free? Writes and the playground refuse with
429 quota_exceeded until the next calendar month, or until you move to a paid
plan — reads keep answering from what is already stored.
Is test-prefixed key usage billed separately? No. env in a key prefix is a
labelling convenience today, not a billing or data boundary — see
Authentication.
Can I downgrade? Cancel the subscription from the dashboard's billing page.
Dodo's webhook demotes the account to payg (if funded) or free automatically —
nothing needs to be done by hand.