Docs · API v1
Billing
Credits, subscriptions, and top-ups. Check your balance, buy more, or subscribe for monthly credits.
Credits
Every AI call costs credits. One credit is €0.01 at the base rate. Operations are priced by value delivered, not by token count:
| Operation | Credits | Base cost |
|---|---|---|
/v1/interpret/lead | 25 | €0.25 |
/v1/interpret/message | 15 | €0.15 |
/v1/draft | 40 | €0.40 |
/v1/extract | 50 | €0.50 |
An AI call that fails (a 502) costs nothing. You're only charged for successful calls.
When your balance hits zero, AI calls return 402 Payment Required with "code": "insufficient_credits". Channel reading and event delivery keep working.
Check your balance
GET /v1/credits returns your current balance and when it last changed. Set a low_balance_threshold to get a warning when you're running low.
/v1/creditscurl https://loods.dev/v1/credits \ -H "Authorization: Bearer $LOODS_KEY"
{ "balance": 5000, "updated_at": "2026-09-24T12:00:00Z", "threshold": 500, "warning": false }
Set the threshold with PATCH /v1/credits. Pass null to disable warnings.
/v1/creditscurl -X PATCH https://loods.dev/v1/credits \
-H "Authorization: Bearer $LOODS_KEY" \
-H "Content-Type: application/json" \
-d '{"low_balance_threshold": 500}'
Subscriptions
A subscription grants credits monthly. When you subscribe, you pay the first month and get your credits immediately. Each renewal adds credits and charges again.
| Plan | Credits/month | Channels carried | Price |
|---|---|---|---|
| Starter | 5,000 | 2 maintained, 2 webhook | €49/month |
| Pro | 25,000 | 5 maintained, webhook without limit | €149/month |
Credits don't roll over. Unused credits from one month don't carry to the next.
A plan of your own. Volume, an unusual channel count, terms agreed in a conversation: instead of a discount on a public plan, you are put on a plan built for you, with those numbers on it. It is billed exactly as the plans above are. It is listed to you and to nobody else, and no other client can subscribe to it. It may also cost nothing, and then there is nothing to pay and no checkout to visit: your credits arrive each month as they would on any plan.
GET /v1/billing/plans lists the plans you may take: the public ones, and yours if you have one. POST /v1/billing/subscription starts one.
/v1/billing/subscriptioncurl -X POST https://loods.dev/v1/billing/subscription \
-H "Authorization: Bearer $LOODS_KEY" \
-H "Content-Type: application/json" \
-d '{"plan": "starter", "redirect_url": "https://your.app/thanks"}'
{ "checkout_url": "https://checkout.mollie.com/…", "payment_id": "tr_…" }
Redirect the user to checkout_url to pay. After payment, they land on your redirect_url. Check the subscription status with GET /v1/billing/subscription. Cancel with DELETE.
/v1/billing/subscription{ "subscription": { "plan": "starter", "status": "active", "channel_fee": 20, "monthly": 69, "current_period": { "start": "2026-09-24T00:00:00Z", "end": "2026-10-24T00:00:00Z" }, "canceled_at": null } }
Top-ups
Buy extra credits any time with a one-time payment. Larger packs cost less per credit.
| Pack | Credits | Price | Per credit |
|---|---|---|---|
| Starter | 1,000 | €10 | €0.010 |
| Growth | 5,000 | €25 | €0.005 |
| Scale | 25,000 | €50 | €0.002 |
| Enterprise | 100,000 | €100 | €0.001 |
GET /v1/billing/packages lists the packs. POST /v1/billing/checkout starts a purchase.
/v1/billing/checkoutcurl -X POST https://loods.dev/v1/billing/checkout \
-H "Authorization: Bearer $LOODS_KEY" \
-H "Content-Type: application/json" \
-d '{"package_id": 2, "redirect_url": "https://your.app/thanks"}'
{ "checkout_url": "https://checkout.mollie.com/…", "payment_id": "tr_…" }
Channel fees
Credits pay for work done. A channel is different: it costs the same to keep working whether it reads one lead a month or a thousand, so it carries a flat monthly fee instead. What that fee is depends on who fixes it when the platform on the other side changes.
| Tier | What it is | Per month | Setup |
|---|---|---|---|
| Maintained | Loods follows the platform's own API or mail format, and fixes it when it changes: a mailbox, a platform push, a business number. | €20 | — |
| Webhook | Something of yours posts to Loods and you own the fields, so there is nothing for Loods to chase: a form on your own pages is this tier. A platform push is not — Loods follows that platform, so it is maintained. | €5 | — |
| Custom | A channel built for one platform that is yours alone: Loods writes it and keeps it working, and the setup is the writing of it. | €75 | €1,500 |
Your plan carries a few channels of each tier; every channel beyond that adds its tier's fee to the one monthly payment, so there is never a second invoice to reconcile.
Nothing is prorated. A channel you connect today is charged from your next renewal, not from today. A channel you remove today is not charged at that renewal at all. So you can try a platform out, and stop, without a part-month to work out.
Without a plan you may read one maintained channel and no webhook ones at all — so a first form channel needs a plan where a first mailbox does not. Connecting one beyond the allowance answers 402 plan_required: there is no standing payment to add a fee to, so take a plan first.
GET /v1/billing/channels says what you have connected, what your plan carries, and what the rest costs. included of -1 means that tier is carried without limit.
/v1/billing/channels{ "plan": "starter", "tiers": { "maintained": { "connected": 3, "included": 2, "billable": 1, "price_per_month": 20, "setup": 0, "monthly": 20 }, "webhook": { "connected": 0, "included": 2, "billable": 0, "monthly": 0 } }, "monthly": 20 }
Usage reporting
GET /v1/credits/usage shows credits spent by task. Filter by period (day, week, month, year) or by from and to dates.
/v1/credits/usage?period=month{ "period": { "from": "2026-08-26", "to": "2026-09-24" }, "total": 1275, "by_task": [ { "task": "interpret.lead", "calls": 45, "credits": 1125 }, { "task": "draft", "calls": 3, "credits": 120 } ] }
GET /v1/credits/usage/daily breaks it down by day. The days parameter defaults to 30, max 90.
/v1/credits/usage/daily?days=7{ "days": 7, "data": [ { "date": "2026-09-24", "calls": 12, "credits": 300 }, { "date": "2026-09-23", "calls": 8, "credits": 200 } ] }
GET /v1/credits/ledger lists every transaction: top-ups, usage, grants. Page with after (the last id you saw) and filter by type.