Skip to content

Minutes, caps and limits

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.

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.

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 holding account:read: for a meeting you send, your balance less the meetings still in progress; for an Ask, the balance itself, the same number as wallet.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.

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.

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 /events spends the same read budget as reading bundles, status and whoami.
  • Each token has budgets of its own, so one agent can’t use up another’s.
  • Over the budget, a request answers 429 RATE_LIMITED with Retry-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_LIMITED with Retry-After too.
  • Asking for a meeting’s status about once a minute stays far inside the budget.

whoami gives the current limits in limits:

  • limits.maxUploadMb: the largest audio file, in megabytes. A bigger one answers 413 UPLOAD_TOO_LARGE.
  • limits.maxRecordingMinutes: the longest meeting, in minutes of audio. A longer one answers 413 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.