Skip to main content
Use Happy Scribe through Corsair: one client, typed API calls, and incoming webhooks. Create an API key in Happy Scribe under My workspace, API access. Things to know before you call:
  • Credit-spending creates. transcriptions.create, translations.createTask and meetings.create spend Happy Scribe credits. orders.create stays incomplete (unpaid) until orders.confirm or an explicit confirm: true; human orders are then irreversible.
  • Four async lifecycles. Transcriptions report state until automatic_done; exports state until ready with a download_link; translation tasks state until done; meetings report status (a different field) until completed. The plugin declares jobs for all four, so the agent’s get_job follows them.
  • Rate limits. The transcription-creation endpoint allows about 200 requests per user per hour; a 429 carries retry_in_seconds in the body and the plugin waits exactly that before retrying.
  • Pagination is inconsistent. transcriptions.list pages from 0 with perPage default 5; companies.list and people.list page from 1 with perPage up to 100; memberships.list pages from 1, 25 at a time. All return nextPageUrl when another page exists.
  • Deleting. transcriptions.delete moves the file to the Trash; pass permanent: true to delete it for good.
  • Intelligence API is enrollment-gated. companies, people and the person/company filters on transcriptions.list answer 404 until the organization is enrolled; contact Happy Scribe support to enroll.
  • Local files. uploads.getSignedUrl returns a pre-signed S3 URL; upload the file bytes there yourself, then pass a tmpUrl to transcriptions.create.
  • Webhooks. Configure a meeting webhook in Settings, Webhooks and set its signing secret (whsec_...) as the plugin’s webhookSecret. Deliveries are HMAC-signed twice; unsigned or stale deliveries are rejected. If your own route receives them, pass the raw body (await request.text()) to processWebhook, not request.json(): transcripts carry numbers like 0.0 that change when re-serialized, and the signature check then fails. The payload does not name the organization, so with multi-tenancy pass the tenant as query.tenantId (for example from ?tenantId= on the endpoint URL).
  • Languages. Language codes are BCP-47 (en-GB, es); human services are available only for some of them.
What you get:
  • 28 typed API operations
  • 7 incoming webhook event types

Setup

1

Install

2

Add the plugin

corsair.ts
With multiTenancy: true, scope calls with corsair.withTenant(id). See Quick start for KEK + Hub keys, and Multi-tenancy for account isolation.
3

Choose authentication

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 transcriptions in an organization
Transcribe media from a URL
See the full list on the API page.

Webhooks

This plugin registers 7 webhook event types. Configure the provider to POST to your Corsair HTTP handler, then use webhookHooks on the plugin factory. See Webhooks for every event path and payload shape, and Webhooks concept for routing.

What’s next

API reference

Every happyscribe.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.