Loods API v1

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:

OperationCreditsBase cost
/v1/interpret/lead25€0.25
/v1/interpret/message15€0.15
/v1/draft40€0.40
/v1/extract50€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.

GET/v1/credits
curl https://loods.dev/v1/credits \
  -H "Authorization: Bearer $LOODS_KEY"
200 OK
{
  "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.

PATCH/v1/credits
curl -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.

PlanCredits/monthChannels carriedPrice
Starter5,0002 maintained, 2 webhook€49/month
Pro25,0005 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.

POST/v1/billing/subscription
curl -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"}'
200 OK
{
  "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.

GET/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.

PackCreditsPricePer credit
Starter1,000€10€0.010
Growth5,000€25€0.005
Scale25,000€50€0.002
Enterprise100,000€100€0.001

GET /v1/billing/packages lists the packs. POST /v1/billing/checkout starts a purchase.

POST/v1/billing/checkout
curl -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"}'
200 OK
{
  "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.

TierWhat it isPer monthSetup
MaintainedLoods follows the platform's own API or mail format, and fixes it when it changes: a mailbox, a platform push, a business number.€20—
WebhookSomething 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—
CustomA 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.

GET/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.

GET/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.

GET/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.