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. A write is one saved fact or one conversation. Every paid plan overflows into a wallet rather than stopping — the one exception is Free, which upgrades instead of billing.
The plans
| plan | price | writes/mo | retrievals/mo | memories | playground chats/mo |
|---|---|---|---|---|---|
| Free | ₹0 | 500 | 10,000 | 2,500 | 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 is a working allowance rather than a trial.
Pay as you go
No subscription. Recharge a wallet, in Indian Rupees, and pay for exactly the work you use:
| meter | rate |
|---|---|
write (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.
The local CLI is free
The local CLI needs no plan, no account and no key. It is separate from the hosted API, which is what these plans price. See Install.
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":"the wallet is empty; recharge from the dashboard's billing page"}}
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 | 10 | 60 | 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":"rate limited: the starter plan allows 30 writes per minute; retry in 12s"}}
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, and its Retry-After header gives the seconds left.
Checking where you stand
curl -s "$GITLOOM_API/v1/usage" -H "Authorization: Bearer $GITLOOM_API_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.