Minutes, caps and limits
Minutes
Section titled “Minutes”Lobbe is paid for in minutes. A token spends from the same balance the app uses: a meeting sent through the API costs what the same meeting costs in the app.
What spends
Section titled “What spends”Only three scopes can spend minutes. Every other route is free: reading, search and the Ask quotes included.
| Scope | What spends | How much |
|---|---|---|
recordings:write |
Sending a meeting, POST /recordings |
The meeting’s minutes: minutes in the 202 |
recordings:query |
Asking a meeting, POST /recordings/{id}/ask |
The price GET /recordings/{id}/ask/quote gives |
series:query |
Asking a series, POST /series/{id}/ask |
The price GET /series/{id}/ask/quote gives |
Sending a meeting. minutes in the 202 is what the meeting costs: the audio’s length, plus
the vocabulary surcharge when useKeyterms applies, plus the attachment. From the moment Lobbe
accepts the meeting, those minutes are held: the next meeting you send can’t spend them. The
charge itself is taken when the transcript is ready. A meeting whose transcription fails costs
nothing, and so does one you delete before its transcript is ready. One that waits at naming, or
fails while its Lobbe is being written, is charged, and a retry costs nothing more.
Asking. An Ask spends the price its quote gives. Send maxMinutes, the most you will pay: if
the price is higher, the answer is 409 PRICE_ABOVE_MAX and nothing is spent. An answer the model
declines to give is charged too. An Ask that fails (502 GENERATE_FAILED) is not.
One cost is indirect: a vocabulary you write with account:write or series:write adds the
vocabulary surcharge to the later meetings that use it.
Running short
Section titled “Running short”When the balance doesn’t cover a request, the answer is 402 INSUFFICIENT_MINUTES and nothing is
spent. error.details carries:
requiredMinutes: how many minutes the request needs;balanceMinutes, only for a token holdingaccount:read: for a meeting you send, your balance less the meetings still in progress; for an Ask, the balance itself, the same number aswallet.balanceMinutes.
Don’t send the request again until the owner buys minutes. wallet.balanceMinutes in whoami
and GET /account doesn’t take out meetings whose transcript isn’t ready yet, so it can be more
than a new meeting may spend.
Once, an account that got its trial minutes (they come with a verified phone number) and has never bought minutes may send one meeting its balance doesn’t cover, as long as the shortfall stays within a set limit. The balance then goes below 0 until a purchase.
Lobbe also has its own daily limits on each account, for meetings and for Asks. Reaching one
answers 429 DAILY_LIMIT_REACHED, and no token raises them.
The token’s daily cap
Section titled “The token’s daily cap”When a token has a daily cap and a request would take it over, the answer is
429 TOKEN_DAILY_CAP and nothing is spent. error.details carries capMinutes (the cap),
usedMinutes (what the token spent in the last 24 hours) and requiredMinutes (what this request
costs).
Retry-After gives the seconds to wait until older spending leaves the 24 hours and makes room for
this request. When it is missing, this request alone is bigger than the cap and waiting can’t help:
raise the cap in Connections.
Rate limits
Section titled “Rate limits”Each token has a budget of requests for each class of route, over any 10 minutes:
| Class | Budget per token | Routes |
|---|---|---|
read |
600 requests per 10 minutes | GET /whoami, GET /recordings/ready, GET /recordings/{id}/bundle, GET /recordings/{id}/status, GET /events, GET /series/readable, GET /series/{id}, GET /series/{id}/keyterms, GET /account, GET /account/keyterms, GET /account/memory |
submit |
30 requests per 10 minutes | POST /recordings, POST /recordings/{id}/naming, POST /recordings/{id}/retry |
search |
120 requests per 10 minutes | GET /recordings/search, GET /recordings/{id}/ask/quote, GET /series/{id}/ask/quote |
ask |
30 requests per 10 minutes | POST /recordings/{id}/ask, POST /series/{id}/ask |
settings |
60 requests per 10 minutes | POST /series, PATCH /series/{id}, PUT /series/{id}/keyterms, PATCH /account/settings, PUT /account/keyterms, PATCH /account/memory/{id}, DELETE /account/memory/{id} |
- The budget belongs to the class, not to a route: every route in a class draws on the same
budget. Polling
GET /eventsspends the samereadbudget as reading bundles, status andwhoami. - Each token has budgets of its own, so one agent can’t use up another’s.
- Over the budget, a request answers
429 RATE_LIMITEDwithRetry-After: the seconds to wait. Wait that long, and don’t send it sooner. - On some routes Lobbe also limits the requests from one IP address, whatever the token. Those
answer
429 RATE_LIMITEDwithRetry-Aftertoo. - Asking for a meeting’s status about once a minute stays far inside the budget.
Upload limits
Section titled “Upload limits”whoami gives the current limits in limits:
limits.maxUploadMb: the largest audio file, in megabytes. A bigger one answers413 UPLOAD_TOO_LARGE.limits.maxRecordingMinutes: the longest meeting, in minutes of audio. A longer one answers413 RECORDING_TOO_LONG.
They can change, so read them from GET /whoami rather than writing
them into your code.
Accepted files. audio takes one audio file:
| Format | Type to send |
|---|---|
| M4A, MP4 audio | audio/mp4 |
| MP3 | audio/mpeg |
| WAV | audio/wav |
| WebM | audio/webm |
| Ogg | audio/ogg |
| AAC | audio/aac |
| FLAC | audio/flac |
Lobbe reads the type from the file part’s Content-Type. When it is missing or isn’t an audio type
(curl sends application/octet-stream unless you add ;type=…), Lobbe recognizes MP3, AAC, WAV,
FLAC, Ogg and most M4A files from their first bytes. A WebM file needs its type:
-F "audio=@meeting.webm;type=audio/webm". A file Lobbe can’t place answers 400 VALIDATION, one
it can’t read answers 400 INVALID_AUDIO, and an M4A or MP4 file cut short answers
400 AUDIO_INCOMPLETE.
A video file (video/mp4, video/quicktime, video/webm or video/x-matroska) is accepted only
while video upload is on, and Lobbe keeps only its audio. Send its type too:
-F "audio=@meeting.mp4;type=video/mp4". Lobbe doesn’t recognize a video from its bytes, so
without the type it answers 400 VALIDATION. While video upload is off, a video answers
409 VIDEO_UPLOAD_DISABLED.
attachment takes one PDF, PPTX or DOCX file of up to 10 MB, recognized by its file name’s
extension. It adds minutes to the meeting by its size.