api_key. Every request sends it in an x-api-key header.
Things to know before you call:
- A
User-Agentis mandatory. tl;dv blocks default library agents before the key is read: a request sent asPython-urllib/3.11gets a Cloudflare403witherror code: 1010and no JSON body. The plugin always sendsCorsair-tldv-integration/1.0. - The host is
pasta.tldv.io, notapi.tldv.io; the latter answers 404 for every/v1alpha1path. - API access depends on the organizer’s plan. Seeing a meeting in the web app does not grant API access: a meeting organized on a Free plan cannot be exported, and sharing does not change that. Organization-wide automation needs Enterprise.
- Two error shapes, split by status. A
400carries{ name: 'BadRequestError', message, errors: [{ property, constraints }] };401,403,404and500carry{ name, message }. The plugin throws aTldvAPIError. Itsstatusis the HTTP status, itscodeis tl;dv’sname(for exampleNotFoundError) and itsdetailis the first constraint.error.nameis alwaysTldvAPIError, so compareerror.code. - Timestamps are ISO 8601 strings while
durationand transcript offsets are numbers in seconds.durationcan be fractional. The list endpoint itself answershappenedAtas a JavaScript date string (Tue Nov 10 2026 19:06:44 GMT+0000 (Coordinated Universal Time));meetings.listconverts it to ISO 8601 so it matchesmeetings.get. - No recording download.
GET /meetings/{id}/downloadanswers a 302 to a signed URL, and the shared HTTP client follows redirects, so it would pull the whole file into memory. The meeting’surlfield is the tl;dv web page for the meeting, not the media file. To get the recording, callGET https://pasta.tldv.io/v1alpha1/meetings/{id}/downloadyourself with the samex-api-keyandUser-Agentheaders and redirects turned off, then read the signed URL from theLocationheader. It expires after 6 hours. - Webhooks are not signed, so they carry a shared secret. tl;dv publishes no signature scheme for either trigger. The plugin accepts a delivery only when it carries your shared secret in an
x-corsair-webhook-secretheader, and it rejects every delivery when no secret is configured. tl;dv can send that header itself: in Integrations > Webhooks > Configure new webhook, set Authentication type to “API Key”, the header name tox-corsair-webhook-secretand the value to your secret. Set the same secret withtldv({ webhookSecret })orkeys.set_webhook_signature(secret). Webhooks need a Pro or Business plan, and the endpoint must be HTTPS and must not redirect. - What the secret proves. The secret is the only thing that ties a delivery to tl;dv. Use a long random value, keep it out of logs and client code, and replace it in both places if it leaks.
- Answer within 10 seconds. tl;dv retries a delivery that gets no 2xx in that time, and a
MeetingReadydelivery with the transcript included can be several hundred KB. When the plugin rejects a delivery (wrong secret, a payload that does not parse),processWebhookreturnsresponse.success === false. Answer that with a non-2xx status. - Tenant routing. Add
?tenantId=<id>to the endpoint URL you give tl;dv, and passObject.fromEntries(new URL(request.url).searchParams)toprocessWebhookas its fourth argument. Without it a delivery runs underdefault. If your handler resolves the tenant from the payload instead, aMeetingReadydelivery is matched by the organizer’s email, which you store withkeys.set_tenant_external_id(email). ATranscriptReadydelivery names no organizer, so onlytenantIdcan route it.
- 6 typed API operations
- 2 incoming webhook event types
Setup
1
Install
2
Add the plugin
corsair.ts
multiTenancy: true, scope calls with corsair.withTenant(id). See Quick start for KEK + Hub keys, and Multi-tenancy for account isolation.3
Choose authentication
- API Key (Recommended)
No setup required yet. When you make your first request as a tenant, Corsair prompts for the API key.More: API Key
4
Connect a tenant
Mint a connect link and send the tenant to it. Hub hosts the page and delivers the result to your app — see Connect / OAuth.
Example API calls
List recent meetingsWebhooks
React as soon as a meeting is processed, with its notes and, when included, its transcript. PasswebhookSecret next to webhookHooks, or store it with keys.set_webhook_signature(secret). With no secret the plugin rejects every delivery and this hook never runs.
What’s next
API reference
Every
tldv.api.* operation with input and output types.Webhooks
Event paths, payloads, and
webhookHooks examples.Connect / OAuth
createLink, Hub delivery, and tenant connect flows.
Use with agents
Expose this plugin’s operations as MCP tools.