Docs · API v1
Reference
Every endpoint, error and limit of API v1 on one page.
Endpoints
| Method | Path | What it does | Answers |
|---|---|---|---|
POST | /v1/key-pickups | Collect your key with the link you were sent. No key needed | 200 |
GET | /v1/me | Who this key belongs to | 200 |
PATCH | /v1/me | Set or clear your webhook | 200 |
GET | /v1/channels | Every channel of yours | 200 |
GET | /v1/channels/{ref} | One channel | 200 |
PUT | /v1/channels/{ref} | Create or replace a channel | 201 · 200 |
DELETE | /v1/channels/{ref} | Stop reading it and forget it | 204 |
GET | /v1/events | Events, oldest first | 200 |
GET | /v1/events/{id} | One event, with its delivery | 200 |
POST | /v1/events/{id}/redeliver | Push it again | 202 |
POST | /v1/interpret/lead | Read a lead | 200 |
POST | /v1/interpret/message | Read a message against your intents | 200 |
POST | /v1/draft | Fill the gaps in your outline | 200 |
POST | /v1/extract | Answer in your own schema | 200 |
POST | /v1/whatsapp/messages | Send a message | 201 |
GET | /v1/whatsapp/media/{media_id} | Stream the bytes of received media | 200 |
GET | /v1/mail/attachments/{id} | Stream the bytes of a mail attachment | 200 |
GET | /v1/credits | Your balance, and when it last moved | 200 |
PATCH | /v1/credits | Set or clear the low-balance threshold | 200 |
GET | /v1/credits/ledger | Every credit movement, newest first | 200 |
GET | /v1/credits/usage | Credits spent per task | 200 |
GET | /v1/credits/usage/daily | The same, broken down by day | 200 |
GET | /v1/billing/plans | The plans you may take | 200 |
POST | /v1/billing/subscription | Start a subscription | 200 |
GET | /v1/billing/subscription | What you are on, and what it costs | 200 |
DELETE | /v1/billing/subscription | Cancel at the end of the period | 204 |
GET | /v1/billing/packages | The top-up packs | 200 |
POST | /v1/billing/checkout | Buy a pack | 200 |
GET | /v1/billing/channels | Channels connected, carried and charged | 200 |
POST | /in/form/{channel_id} | A submission from one of your own pages. No key: a browser posts this | 204 · 303 |
Errors
Branch on code. type says whose problem it is.
| Type | Status | Codes | What to do |
|---|---|---|---|
invalid_request | 400 · 422 | invalid_request | Fix the request. fields says what is wrong with each field. form_not_declared is the page being refused rather than the visitor: no retry helps, and the channel’s forms list is what to look at. |
authentication_error | 401 | invalid_api_key | Send a valid key as a bearer token. |
not_found | 404 | not_found | It doesn’t exist, or it isn’t yours. |
conflict | 409 | conflict | The request clashes with what exists: a channel’s type, a number already connected, a reused key, or a redelivery with no webhook. A key link that was used or ran out is asked for again, and one used by somebody else is reported. |
rate_limited | 429 | rate_limited | Slow down: 600 requests a minute per client. A form channel is counted per channel instead — see Limits. |
upstream_error | 502 | model_unreachable | The model or the messaging platform failed. A model call is safe to try again. A send is safe to retry with the same Idempotency-Key. |
unavailable | 503 | unavailable | Loods is down for a moment. Try again shortly. |
api_error | 500 | api_error | Something went wrong in Loods. Try again. If it keeps happening, report the time and the path you called. |
Limits
| What | Limit |
|---|---|
| Requests per client | 600 a minute |
| Form submissions per channel | 600 an hour |
| Form submissions, every channel together | 300 a minute |
| Channel ref | 64 characters: a–z 0–9 . _ - |
| Webhook answer | 2xx within 15 s |
| Retries of a push | about 2 days |
| Events kept | 30 days |
| Signature clock tolerance | 300 s |
| Lead text read | 20,000 characters |
| guidance | 10,000 characters |
| Draft gaps | 20, of 2,000 characters each |
| companion.max_chars | 20 to 4096 |
| Message text | 4096 characters |
| Reply buttons | 3, titles of 20 characters |
| Idempotency-Key | 255 characters |
| Idempotency-Key remembered | 1 day |
| Media ids | about 30 days |