Overview
Add Grain to any ModuleX agent or workflow. Access Grain meeting recordings, transcripts, highlights, and AI-generated summaries through the Grain public REST API (api.grain.com/_/public-api). List and retrieve recordings, fetch full transcripts, browse teams, meeting types, and views, and manage webhook subscriptions for recording events.
Categories: Productivity & Collaboration · Meeting · Note Taking · Auth: API Key · Actions: 9
Authentication
API Key Authentication
Authenticate using your Grain personal access tokenStep 1
Log in to your Grain account at https://grain.com
Required Credentials
| Field | Description | Required | Format |
|---|---|---|---|
| Grain API Key | Your Grain personal access token | Yes | - |
Available Actions
list_recordings — List recordings from Grain with optional filters and pagination
list_recordings — List recordings from Grain with optional filters and pagination
Parameters
Pagination cursor for next page (returned from previous response)
Only recordings before this ISO8601 timestamp (e.g., “2024-01-15T00:00:00Z”)
Only recordings after this ISO8601 timestamp (e.g., “2024-01-01T00:00:00Z”)
Filter: “internal” or “external”
Search term to filter by recording title (e.g., “weekly standup”)
Filter by team UUID
Filter by meeting type UUID
Include highlights/clips in response (Default:
false)Include participant list in response (Default:
false)Include AI-generated summary (Default:
false)Response
{
"$defs": {
"Recording": {
"additionalProperties": false,
"description": "A meeting recording object.\n\nExtra include-blocks (highlights, participants, ai_summary,\ncalendar_event, hubspot, etc.) are returned verbatim as\nJSON-serializable values.",
"properties": {
"id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Id"
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Title"
},
"start_datetime": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Start Datetime"
},
"end_datetime": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "End Datetime"
},
"duration_ms": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Duration Ms"
},
"media_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Media Type"
},
"source": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Source"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Url"
},
"thumbnail_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Thumbnail Url"
},
"tags": {
"items": {
"type": "string"
},
"title": "Tags",
"type": "array"
},
"teams": {
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Teams",
"type": "array"
},
"meeting_type": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Meeting Type"
},
"highlights": {
"anyOf": [
{
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Highlights"
},
"participants": {
"anyOf": [
{
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Participants"
},
"ai_summary": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Ai Summary"
},
"calendar_event": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Calendar Event"
},
"hubspot": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Hubspot"
},
"private_notes": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Private Notes"
},
"ai_template_sections": {
"anyOf": [
{
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Ai Template Sections"
}
},
"title": "Recording",
"type": "object"
}
},
"additionalProperties": false,
"properties": {
"success": {
"title": "Success",
"type": "boolean"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error"
},
"recordings": {
"items": {
"$ref": "#/$defs/Recording"
},
"title": "Recordings",
"type": "array"
},
"cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Cursor"
}
},
"required": [
"success"
],
"title": "ListRecordingsOutput",
"type": "object"
}
get_recording — Get details of a single recording by ID
get_recording — Get details of a single recording by ID
Parameters
The recording UUID
Include highlights/clips (Default:
false)Include participant list (Default:
false)Include AI summary (Default:
false)Include calendar event data (Default:
false)Include HubSpot associations (Default:
false)Response
{
"$defs": {
"Recording": {
"additionalProperties": false,
"description": "A meeting recording object.\n\nExtra include-blocks (highlights, participants, ai_summary,\ncalendar_event, hubspot, etc.) are returned verbatim as\nJSON-serializable values.",
"properties": {
"id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Id"
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Title"
},
"start_datetime": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Start Datetime"
},
"end_datetime": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "End Datetime"
},
"duration_ms": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Duration Ms"
},
"media_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Media Type"
},
"source": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Source"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Url"
},
"thumbnail_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Thumbnail Url"
},
"tags": {
"items": {
"type": "string"
},
"title": "Tags",
"type": "array"
},
"teams": {
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Teams",
"type": "array"
},
"meeting_type": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Meeting Type"
},
"highlights": {
"anyOf": [
{
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Highlights"
},
"participants": {
"anyOf": [
{
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Participants"
},
"ai_summary": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Ai Summary"
},
"calendar_event": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Calendar Event"
},
"hubspot": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Hubspot"
},
"private_notes": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Private Notes"
},
"ai_template_sections": {
"anyOf": [
{
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Ai Template Sections"
}
},
"title": "Recording",
"type": "object"
}
},
"additionalProperties": false,
"properties": {
"success": {
"title": "Success",
"type": "boolean"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error"
},
"recording": {
"anyOf": [
{
"$ref": "#/$defs/Recording"
},
{
"type": "null"
}
],
"default": null
}
},
"required": [
"success"
],
"title": "GetRecordingOutput",
"type": "object"
}
get_transcript — Get the full transcript of a recording
get_transcript — Get the full transcript of a recording
Parameters
The recording UUID
Response
{
"$defs": {
"TranscriptSection": {
"additionalProperties": false,
"description": "A single transcript section (speaker turn).",
"properties": {
"participant_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Participant Id"
},
"speaker": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Speaker"
},
"start": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Start"
},
"end": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "End"
},
"text": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Text"
}
},
"title": "TranscriptSection",
"type": "object"
}
},
"additionalProperties": false,
"properties": {
"success": {
"title": "Success",
"type": "boolean"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error"
},
"transcript": {
"items": {
"$ref": "#/$defs/TranscriptSection"
},
"title": "Transcript",
"type": "array"
}
},
"required": [
"success"
],
"title": "GetTranscriptOutput",
"type": "object"
}
list_views — List available Grain views for webhook subscriptions
list_views — List available Grain views for webhook subscriptions
Parameters
Optional view type filter: recordings, highlights, or stories
Response
{
"$defs": {
"View": {
"additionalProperties": false,
"description": "A Grain view object.",
"properties": {
"id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Name"
},
"type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Type"
}
},
"title": "View",
"type": "object"
}
},
"additionalProperties": false,
"properties": {
"success": {
"title": "Success",
"type": "boolean"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error"
},
"views": {
"items": {
"$ref": "#/$defs/View"
},
"title": "Views",
"type": "array"
}
},
"required": [
"success"
],
"title": "ListViewsOutput",
"type": "object"
}
list_teams — List all teams in the workspace
list_teams — List all teams in the workspace
Response
{
"$defs": {
"Team": {
"additionalProperties": false,
"description": "A team object.",
"properties": {
"id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Name"
}
},
"title": "Team",
"type": "object"
}
},
"additionalProperties": false,
"properties": {
"success": {
"title": "Success",
"type": "boolean"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error"
},
"teams": {
"items": {
"$ref": "#/$defs/Team"
},
"title": "Teams",
"type": "array"
}
},
"required": [
"success"
],
"title": "ListTeamsOutput",
"type": "object"
}
list_meeting_types — List all meeting types in the workspace
list_meeting_types — List all meeting types in the workspace
Response
{
"$defs": {
"MeetingType": {
"additionalProperties": false,
"description": "A meeting type object.",
"properties": {
"id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Name"
},
"scope": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Scope"
}
},
"title": "MeetingType",
"type": "object"
}
},
"additionalProperties": false,
"properties": {
"success": {
"title": "Success",
"type": "boolean"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error"
},
"meeting_types": {
"items": {
"$ref": "#/$defs/MeetingType"
},
"title": "Meeting Types",
"type": "array"
}
},
"required": [
"success"
],
"title": "ListMeetingTypesOutput",
"type": "object"
}
create_hook — Create a webhook to receive recording events
create_hook — Create a webhook to receive recording events
Parameters
Webhook endpoint URL (e.g., “https://example.com/webhooks/grain”)
Grain view ID for the webhook subscription
Optional list of actions to subscribe to: added, updated, removed
Response
{
"$defs": {
"Hook": {
"additionalProperties": false,
"description": "A webhook subscription object.",
"properties": {
"id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Id"
},
"enabled": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"title": "Enabled"
},
"version": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Version"
},
"hook_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Hook Url"
},
"view_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "View Id"
},
"actions": {
"items": {
"type": "string"
},
"title": "Actions",
"type": "array"
},
"inserted_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Inserted At"
}
},
"title": "Hook",
"type": "object"
}
},
"additionalProperties": false,
"properties": {
"success": {
"title": "Success",
"type": "boolean"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error"
},
"hook": {
"anyOf": [
{
"$ref": "#/$defs/Hook"
},
{
"type": "null"
}
],
"default": null
}
},
"required": [
"success"
],
"title": "CreateHookOutput",
"type": "object"
}
list_hooks — List all webhooks for the account
list_hooks — List all webhooks for the account
Response
{
"$defs": {
"Hook": {
"additionalProperties": false,
"description": "A webhook subscription object.",
"properties": {
"id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Id"
},
"enabled": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"title": "Enabled"
},
"version": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Version"
},
"hook_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Hook Url"
},
"view_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "View Id"
},
"actions": {
"items": {
"type": "string"
},
"title": "Actions",
"type": "array"
},
"inserted_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Inserted At"
}
},
"title": "Hook",
"type": "object"
}
},
"additionalProperties": false,
"properties": {
"success": {
"title": "Success",
"type": "boolean"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error"
},
"hooks": {
"items": {
"$ref": "#/$defs/Hook"
},
"title": "Hooks",
"type": "array"
}
},
"required": [
"success"
],
"title": "ListHooksOutput",
"type": "object"
}
delete_hook — Delete a webhook by ID
delete_hook — Delete a webhook by ID
Parameters
The hook UUID to delete
Response
{
"additionalProperties": false,
"properties": {
"success": {
"title": "Success",
"type": "boolean"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error"
}
},
"required": [
"success"
],
"title": "DeleteHookOutput",
"type": "object"
}
Limits & Quotas
- The Grain public API requires the
Public-Api-Versionheader (currently2025-10-31) on the recording, transcript, team, and meeting-type endpoints. - Developer access to the public API is in beta and may be limited to approved partners.
- Error model: non-2xx responses and timeouts are caught and
returned as
success=False+errorrather than raising. Plan for retries on the agent side based on the error string.