canonical: https://jentic.com/apis/grain.com/grain

# Grain API

Jentic publishes the only available OpenAPI specification for Grain API, keeping it validated and agent-ready. Grain is a meeting recording, transcription, and notes platform that captures conversations and lets teams search, share, and clip them. The API exposes 22 endpoints covering OAuth2 token issuance, recording listing and retrieval, multi-format transcripts (JSON, TXT, VTT, SRT), download URL generation, tagging, sharing recordings to users and teams, webhook (hooks) management, and user and team listings. Authentication supports OAuth2, Personal Access Tokens, and Workspace Access Tokens.

## For AI agents

Pull meeting recordings, transcripts (JSON, TXT, VTT, SRT), and shareable links from Grain, plus manage tags, sharing, and webhook hooks for downstream automation.

## Scope

Does not host or join live calls, run conversation analytics, or schedule meetings - use for managing existing Grain recordings, transcripts, hooks, sharing, and workspace metadata only.

## Capabilities

- List and retrieve meeting recordings via `/v2/recordings`
- Pull transcripts in JSON, TXT, VTT, or SRT format from `/v2/recordings/{id}/transcript` variants
- Generate signed download URLs for recordings with `/v2/recordings/{id}/download`
- Tag recordings via PUT and DELETE on `/v2/recordings/{id}/tags`
- Share or unshare recordings to specific users or teams
- Create and delete webhook hooks for recording events through `/v2/hooks` endpoints
- List workspace users and teams via `/v2/users` and `/v2/teams`

## Use cases

### Customer Call Knowledge Base

Customer success teams ingest every recorded customer call, pull transcripts via `/v2/recordings/{id}/transcript`, and feed them into a searchable knowledge base. The JSON transcript variant includes speaker turns and timestamps, making it easy to chunk for retrieval. Recordings the user does not own or have shared access to are not returned, so workspace-level permissions still apply.

Example prompt: Call POST `/v2/recordings` to list the last 50 recordings, then GET `/v2/recordings/{id}/transcript` for each and chunk the speaker turns into a vector store.

### Automated Sales Coaching Snippets

Sales managers tag recordings with `/v2/recordings/{id}/tags` and share key moments to a coaching team via `/v2/recordings/{id}/teams.` A webhook registered through POST `/v2/hooks/create` can fire on new recordings so the workflow runs without polling. The API does not perform the coaching analysis itself - pair with an LLM to extract talk-time, objections, and follow-ups.

Example prompt: Register a hook on recording.created, fetch the new recording's transcript on the webhook, and POST to an LLM endpoint for coaching analysis.

### Meeting Notes Sync to Productivity Tools

Productivity stacks pull Grain transcripts and metadata to surface meeting notes inside Notion, Linear, or Slack. GET `/v2/recordings/{id}/transcript.txt` returns a plain-text body suited for posting into chat or note tools. Sharing primitives let an agent automatically grant viewer access to the meeting attendees.

Example prompt: GET `/v2/recordings/{id}/transcript.txt` for a recording id and POST the body into a Slack channel via the appropriate webhook.

### Subtitles and Accessibility Workflow

Marketing and accessibility teams pull SRT or VTT subtitles for recordings used as web video assets. GET `/v2/recordings/{id}/transcript.srt` and .vtt return ready-to-attach caption files matching the recording's audio track, removing the need for a separate transcription pipeline.

Example prompt: GET `/v2/recordings/{id}/transcript.vtt` and upload the body alongside the recording's MP4 to a video CMS as a caption track.

### Agent-Driven Meeting Recall via Jentic

An assistant answering 'what did we agree with Acme last week?' uses Jentic to discover Grain, list recent recordings, fetch the matching transcript, and reason over the content. The OAuth token sits in Jentic's Jentic One instance, so the agent never handles the raw secret. Workspace-level permissions still apply to which recordings are visible.

Example prompt: Use the Jentic SDK to search 'list grain meeting recordings', load POST `/v2/recordings`, then chain GET `/v2/recordings/{id}/transcript` for the most relevant match.

## Key endpoints

| Method | Path | Description |
| --- | --- | --- |
| POST | `/_/public-api/v2/recordings` | List meeting recordings |
| POST | `/_/public-api/v2/recordings/{recording_id}` | Get a specific recording |
| GET | `/_/public-api/v2/recordings/{recording_id}/transcript` | Get JSON transcript with speaker turns |
| GET | `/_/public-api/v2/recordings/{recording_id}/transcript.srt` | Get SRT subtitle transcript |
| GET | `/_/public-api/v2/recordings/{recording_id}/download` | Get a signed recording download URL |
| PUT | `/_/public-api/v2/recordings/{recording_id}/tags` | Add a tag to a recording |
| POST | `/_/public-api/v2/hooks/create` | Create a webhook for recording events |
| POST | `/_/public-api/v2/oauth2/token` | Generate or refresh an OAuth2 token |

## Key resources

- **Recordings** — List, retrieve, update, and download meeting recordings
- **Transcripts** — JSON, TXT, VTT, and SRT format transcripts per recording
- **Tags and Sharing** — Tag recordings and share them with users or teams
- **Hooks** — Create, list, and delete webhook hooks for recording events
- **Users and Teams** — Workspace user and team listings

## Why Jentic

- **Setup:** Wiring Grain by hand means handling its bearer auth, learning the `/_/public-api/v2` path layout, and stitching together recording, transcript, tag, and sharing calls yourself. Through Jentic you install once, import the Grain API from the API Directory, store the bearer token once, and your agent calls it.
- **Permission scoping:** Grain puts the recording id in the URL path (`/recordings/{recording_id}/transcript`, `/recordings/{recording_id}/tags`), so a rule can pin your agent to one recording: it can read the transcript and manage tags for that recording and nothing else. You choose the operations it may call, so ones like deleting a tag or removing a recording share are not included unless you add them.
- **Credential handling:** Your Grain bearer token is stored once, encrypted, by your own Jentic One instance and injected at execution time. It never enters the agent's prompt, logs, or context.
- **Discovery method:** Agents search Jentic by intent such as 'get a recording transcript' or 'tag a call recording', and Jentic returns the matching Grain operation with its input schema so the agent calls the right endpoint without browsing the reference docs.

## Related APIs

- **Fireflies AI API** — Meeting transcription and conversation intelligence platform
- **Zoom Meetings API** — Meeting platform whose calls Grain often records
- **Deepgram API** — Speech-to-text platform when raw transcription is the only need
- **AssemblyAI API** — Speech-to-text and audio intelligence for arbitrary audio sources

## FAQ

### Why is there no official OpenAPI spec for Grain API?

Grain does not publish an OpenAPI specification. Jentic generates and maintains this spec so that AI agents and developers can call Grain API via structured tooling. It is validated against the live API and kept up to date. Get started with Jentic One, the self-hosted execution layer.

### What authentication does the Grain API use?

Grain supports HTTP Bearer authentication, with three token types accepted: OAuth2 access tokens (issued via POST `/_/public-api/oauth2/token`), Personal Access Tokens, and Workspace Access Tokens. All three are sent as Authorization: Bearer <token>. Through Jentic, the chosen token type is stored in your Jentic One instance and injected at execution time.

### What transcript formats does the Grain API return?

Four formats are supported per recording: GET `/_/public-api/v2/recordings/{recording_id}/transcript` returns JSON with speaker turns and timestamps, .txt returns plain text, .vtt returns WebVTT captions, and .srt returns SRT subtitles. Pick JSON for agent processing and SRT or VTT when attaching captions to a video player.

### What are the rate limits for the Grain API?

The Jentic-generated spec does not declare rate limits. Limits are enforced at the Grain gateway tied to the workspace and token type, with OAuth2 and Workspace tokens typically receiving higher concurrency than Personal Access Tokens. Cache transcripts since they do not change after a recording finalises.

### How do I retrieve a meeting transcript through Jentic?

Search Jentic for 'get a grain meeting transcript', load GET `/_/public-api/v2/recordings/{recording_id}/transcript`, and execute with the recording_id. The Jentic SDK returns the JSON body so the agent can iterate over speaker turns and timestamps directly.

### Can I subscribe to new recording events with webhooks?

Yes. POST `/_/public-api/v2/hooks/create` registers a webhook URL and event type, POST `/_/public-api/v2/hooks` lists active hooks, and DELETE `/_/public-api/v2/hooks/{hook_id}` removes one. Use this to trigger transcript fetching on recording.created rather than polling the recordings list.

### Can I limit what my agent is allowed to do with the Grain API?

Yes. Jentic One is self-hosted by you, so your own rules decide which Grain operations and which stored token the agent may use. Because Grain puts the recording id in the URL path, such as `/recordings/{recording_id}/transcript` and `/recordings/{recording_id}/tags`, you can pin the agent to a single recording so it reads that transcript and manages its tags and nothing else. You choose the operations it may call, so destructive ones like deleting a tag or removing a recording share stay off unless you explicitly add them.
