Skip to main content
Grain logo

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 token
1

Step 1

Log in to your Grain account at https://grain.com
2

Step 2

Open Settings and navigate to the API / Integrations section
3

Step 3

Create a Personal Access Token (developer access may require approval)
4

Step 4

Paste the access token below

Required Credentials

FieldDescriptionRequiredFormat
Grain API KeyYour Grain personal access tokenYes-

Available Actions

Parameters

cursor
string
Pagination cursor for next page (returned from previous response)
before_datetime
string
Only recordings before this ISO8601 timestamp (e.g., “2024-01-15T00:00:00Z”)
after_datetime
string
Only recordings after this ISO8601 timestamp (e.g., “2024-01-01T00:00:00Z”)
participant_scope
string
Filter: “internal” or “external”
Search term to filter by recording title (e.g., “weekly standup”)
team_id
string
Filter by team UUID
meeting_type_id
string
Filter by meeting type UUID
include_highlights
boolean
Include highlights/clips in response (Default: false)
include_participants
boolean
Include participant list in response (Default: false)
include_ai_summary
boolean
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"
}

Parameters

recording_id
string
required
The recording UUID
include_highlights
boolean
Include highlights/clips (Default: false)
include_participants
boolean
Include participant list (Default: false)
include_ai_summary
boolean
Include AI summary (Default: false)
include_calendar_event
boolean
Include calendar event data (Default: false)
include_hubspot
boolean
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"
}

Parameters

recording_id
string
required
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"
}

Parameters

type_filter
string
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"
}

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"
}

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"
}

Parameters

hook_url
string
required
Webhook endpoint URL (e.g., “https://example.com/webhooks/grain”)
view_id
string
required
Grain view ID for the webhook subscription
actions
array
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"
}

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"
}

Parameters

hook_id
string
required
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-Version header (currently 2025-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 + error rather than raising. Plan for retries on the agent side based on the error string.

Granola

Obsidian

Reflect