Endpoints
NOTE: This page documents the
2025-10-31version which isdeprecated. See Versions.
API Domain is: https://api.grain.com
OAuth2
Generate Token
Endpoint
POST /_/public-api/oauth2/tokenParams
| Param | |
|---|---|
| client_id | Obtained separately in Step 1 of the OAuth Flow |
| client_secret required for server-side applications |
Obtained separately in Step 1 of the OAuth Flow |
| grant_type | Must be authorization_code |
| code | String obtained in Step 4 of the OAuth Flow |
| code_verifier | String sent as code_challenge in Step 2 of the OAuth Flow |
Response
| Field | |
|---|---|
| token_type | Always bearer |
| access_token | Token to be used in the Authorization header |
| refresh_token | Token to be used to refresh the access_token (See Refresh Token) |
| expires_in | Denotes how many seconds the access_token will live for after its generation. |
Note: Some legacy clients do not return refresh_token nor expires_in.
For these cases the access_token does not expire.
Example Request
curl -X POST \
-H 'Content-Type: application/json' \
--data '{"grant_type": "authorization_code", "code": "CODE", "client_id": "CLIENT_ID", "client_secret": "CLIENT_SECRET"}' \
https://api.grain.com/_/public-api/oauth2/tokenExample Response
{
"token_type": "bearer",
"access_token": "aaaaa33333EEEEENNNNNoooooKKKKK33333lllll",
"refresh_token": "IIIIIQQQQQxxxxx4444422222CCCCCoooooWWWWW",
"expires_in": 3600
}Refresh Token
Endpoint
POST /_/public-api/oauth2/tokenParams
| Param | |
|---|---|
| client_id | Obtained separately in Step 1 of the OAuth Flow |
| client_secret required for server-side applications |
Obtained separately in Step 1 of the OAuth Flow |
| grant_type | Must be refresh_token |
| refresh_token | Obtained when generating or refreshing an access_token |
Response
| Field | |
|---|---|
| token_type | Always bearer |
| access_token | Token to be used in the Authorization header |
| refresh_token | Token to be used to re-refresh the access_token |
| expires_in | Denotes how many seconds the access_token will live for after its generation. |
Example Request
curl -X POST \
-H 'Content-Type: application/json' \
--data '{"grant_type": "refresh_token", "refresh_token": "IIIIIQQQQQxxxxx4444422222CCCCCoooooWWWWW", "client_id": "CLIENT_ID", "client_secret": "CLIENT_SECRET"}' \
https://api.grain.com/_/public-api/oauth2/tokenExample Response
{
"token_type": "bearer",
"access_token": "bbbbb44444FFFFFOOOOOpppppLLLLL44444mmmmm",
"refresh_token": "JJJJJRRRRRyyyyy5555533333DDDDDpppppXXXXX",
"expires_in": 3600
}Recordings
List Recordings
Endpoint
POST /_/public-api/v2/recordingsParams
| Param | Type | |
|---|---|---|
| cursor | string | Used to paginate through the list. |
| filter | object | Recording Filter |
| include | object | Recording Include |
Response
| Field | Type | |
|---|---|---|
| cursor | string *nullable |
Can be sent as a param to retrieve the next page of the list |
| recordings | object array | List of Recordings |
Example Request
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TOKEN" \
-H "Public-Api-Version: 2025-10-31" \
--data '{"filter": {"title_search": "hands"}, "include": {"participants": true}}' \
https://api.grain.com/_/public-api/v2/recordingsExample Response
{
"cursor": "ApJNWoNoBHcCdjJ3DWNocm9ub2xvZ2ljYWx3BGRlc2NoAm4HAO5FaSm2QgZuBwAVPC0qtkIG",
"recordings": [
{
"id": "pppp6666-qq77-rr88-ss99-tttt00000000",
"title": "All Hands",
"source": "zoom",
"share_state": "public",
"url": "https://grain.com/share/recording/pppp6666-qq77-rr88-ss99-tttt00000000",
"media_type": "video",
"tags": [],
"start_datetime": "2025-01-01T09:30:00Z",
"teams": [
{
"id": "aaaa1111-bb22-cc33-dd44-eeee55555555",
"name": "My Team"
}
],
"workspace_shared": false,
"recorders": [
{
"id": "kkkk1111-ll22-mm33-nn44-oooo55555555",
"name": "Luke Skywalker",
"email": "luke@example.com",
"participant_id": "eeee1111-ff22-gg33-hh44-iiii55555555"
}
],
"participants": [
{
"id": "eeee1111-ff22-gg33-hh44-iiii55555555",
"name": "Luke Skywalker",
"scope": "internal",
"email": "luke@example.com",
"confirmed_attendee": true
},
{
"id": "jjjj6666-kk77-ll88-mm99-nnnn00000000",
"name": "Han Solo",
"scope": "internal",
"email": "solo@example.com",
"confirmed_attendee": false
}
],
"end_datetime": "2025-01-01T10:00:00Z",
"duration_ms": 1800000,
"thumbnail_url": "https://media.grain.com/public_thumbnails/recordings/pppp6666",
"meeting_type": {
"id": "ffff6666-gg77-hh88-ii99-jjjj00000000",
"name": "Project & Team Coordination",
"scope": "internal"
}
}
]
}Get Recording
Endpoint
POST /_/public-api/v2/recordings/:recording_idParams
| Param | Type | |
|---|---|---|
| include | object | Recording Include |
Response
| Field | Type |
|---|---|
| Recording | object |
Example Request
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TOKEN" \
-H "Public-Api-Version: 2025-10-31" \
--data '{"include": {"participants": true, "calendar_event": true}}' \
https://api.grain.com/_/public-api/v2/recordings/pppp6666-qq77-rr88-ss99-tttt00000000Example Response
{
"id": "pppp6666-qq77-rr88-ss99-tttt00000000",
"title": "All Hands",
"source": "zoom",
"share_state": "public",
"url": "https://grain.com/share/recording/pppp6666-qq77-rr88-ss99-tttt00000000",
"media_type": "video",
"tags": [],
"start_datetime": "2025-01-01T09:30:00Z",
"teams": [
{
"id": "aaaa1111-bb22-cc33-dd44-eeee55555555",
"name": "My Team"
}
],
"workspace_shared": false,
"recorders": [
{
"id": "kkkk1111-ll22-mm33-nn44-oooo55555555",
"name": "Luke Skywalker",
"email": "luke@example.com",
"participant_id": "eeee1111-ff22-gg33-hh44-iiii55555555"
}
],
"participants": [
{
"id": "eeee1111-ff22-gg33-hh44-iiii55555555",
"name": "Luke Skywalker",
"scope": "internal",
"email": "luke@example.com",
"confirmed_attendee": true
},
{
"id": "jjjj6666-kk77-ll88-mm99-nnnn00000000",
"name": "Han Solo",
"scope": "internal",
"email": "solo@example.com",
"confirmed_attendee": false
}
],
"end_datetime": "2025-01-01T10:00:00Z",
"duration_ms": 1800000,
"thumbnail_url": "https://media.grain.com/public_thumbnails/recordings/pppp6666",
"meeting_type": {
"id": "ffff6666-gg77-hh88-ii99-jjjj00000000",
"name": "Project & Team Coordination",
"scope": "internal"
},
"calendar_event": {
"ical_uid": "meeting-abc123",
"scheduled_start_datetime": "2025-01-01T09:00:00Z",
"scheduled_end_datetime": "2025-01-01T10:00:00Z"
}
}Get Recording Transcript (json)
Endpoint
GET /_/public-api/v2/recordings/:recording_id/transcriptParams
N/A
Response
| Field | Type | |
|---|---|---|
| participant_id | UUID string *nullable |
id of the participant |
| speaker | string | Name of the participant |
| start | integer | Timestamp in ms from the recording of when this section started. |
| end | integer | Timestamp in ms from the recording of when this section ended. |
| text | string | Text of this transcript section. |
Example Request
curl \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TOKEN" \
-H "Public-Api-Version: 2025-10-31" \
https://api.grain.com/_/public-api/v2/recordings/pppp6666-qq77-rr88-ss99-tttt00000000/transcriptExample Response
[
{
"start": 8000,
"text": "Hello there.",
"end": 9000,
"speaker": "Obi Wan Kenobi",
"participant_id": "oooo1111-pp22-qq33-rr44-ssss55555555"
},
{
"start": 11482,
"text": "General Kenobi...",
"end": 13000,
"speaker": "General Grievous",
"participant_id": "yyyy1111-zz22-aabb-cc44-dddd55555555"
}
]Get Recording Transcript (text formats)
Endpoint
GET /_/public-api/v2/recordings/:recording_id/transcript.txtGET /_/public-api/v2/recordings/:recording_id/transcript.vttGET /_/public-api/v2/recordings/:recording_id/transcript.srtParams
N/A
Response
Transcript text
Example Request
curl \
-H "Authorization: Bearer TOKEN" \
-H "Public-Api-Version: 2025-10-31" \
https://api.grain.com/_/public-api/v2/recordings/pppp6666-qq77-rr88-ss99-tttt00000000/transcript.txtExample Response
Obi Wan Kenobi: Hello there.
General Grievous: General Kenobi...Download Recording
Endpoint
GET /_/public-api/v2/recordings/:recording_id/downloadParams
N/A
Response
Recording file
Example Request
curl \
-H "Authorization: Bearer TOKEN" \
-H "Public-Api-Version: 2025-10-31" \
-L --output recording.mp4 \
https://api.grain.com/_/public-api/v2/recordings/pppp6666-qq77-rr88-ss99-tttt00000000/downloadExample Response
Recording file
Upload Recording
Supported formats:
.mov.mp4.mp3.m4a
Step 1: Generate Upload URL
First a URL has to be generated to which you will be able to upload the file to.
Endpoint:
POST /_/public-api/v2/recordings/uploadParams
| Param | Type | |
|---|---|---|
| filename required |
string | Name of the upload file |
| user_id **Workspace API Only required |
UUID string | User to own the recording. Obtained through List Users |
Response
| Field | Type | |
|---|---|---|
| uuid | UUID string | id of the upload, will be present in the upload hooks if a upload_status hook exists |
| url | string | url to upload the file to |
| max_duration_sec | integer | Max duration in seconds the upload can be |
| max_upload_bytes | integer | Max size in bytes the upload can be |
Example Request
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TOKEN" \
-H "Public-Api-Version: 2025-10-31" \
--data '{"filename": "recording.mp4"}' \
https://api.grain.com/_/public-api/v2/recordings/uploadExample Response
{
"url": "https://example.com/generated_url",
"uuid": "eeee-1f2g-3h4i-5j6k-7890-abcd2222",
"max_duration_sec": 10800,
"max_upload_bytes": 4294967296
}Step 2: Upload the file
Now the file can be uploaded to the generated url.
Please note that even after the upload finishes Grain still needs process the file.
Grain will post progress messages, the resulting recording_id and/or possible error messages to existing upload_status hooks. (Create Hook)
Example Request
curl -X PUT --upload-file recording.mp4 "https://example.com/generated_url"Example Response
N/A
Update Recording
Endpoint
PATCH /_/public-api/v2/recordings/:recording_idParams
| Param | Type | |
|---|---|---|
| title | string | New title for the recording |
Response
| Field | Type |
|---|---|
| success | Always true |
Example Request
curl -X PATCH \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TOKEN" \
-H "Public-Api-Version: 2025-10-31" \
--data '{"title": "A new title"}' \
https://api.grain.com/_/public-api/v2/recordings/pppp6666-qq77-rr88-ss99-tttt00000000Example Response
{
"success": true
}Add a Tag to a Recording
Endpoint
PUT /_/public-api/v2/recordings/:recording_id/tagsParams
| Param | Type | |
|---|---|---|
| tag | Regex checked string format: (Regex101) /^[\p{L}\d][\p{L}\d-]*$/u |
Tag to be added to the recording (Letters and numbers separated by dashes - ) |
Response
| Field | Type |
|---|---|
| success | Always true |
Example Request
curl -X PUT \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TOKEN" \
-H "Public-Api-Version: 2025-10-31" \
--data '{"tag": "my-new-tag"}' \
https://api.grain.com/_/public-api/v2/recordings/pppp6666-qq77-rr88-ss99-tttt00000000/tagsExample Response
{
"success": true
}Remove a Tag from a Recording
Endpoint
DELETE /_/public-api/v2/recordings/:recording_id/tags/:tagParams
N/A
Response
| Field | Type |
|---|---|
| success | Always true |
Example Request
curl -X DELETE \
-H "Authorization: Bearer TOKEN" \
-H "Public-Api-Version: 2025-10-31" \
https://api.grain.com/_/public-api/v2/recordings/pppp6666-qq77-rr88-ss99-tttt00000000/tags/my-new-tagExample Response
{
"success": true
}Share Recording to an User
Endpoint
PUT /_/public-api/v2/recordings/:recording_id/usersParams
| Param | Type | |
|---|---|---|
| user_id | UUID string | User to share the recording with. Obtained through List Users |
Response
| Field | Type |
|---|---|
| success | Always true |
Example Request
curl -X PUT \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TOKEN" \
-H "Public-Api-Version: 2025-10-31" \
--data '{"user_id": "7890-abcd-ef01-2222-3456-7890ffff"}' \
https://api.grain.com/_/public-api/v2/recordings/pppp6666-qq77-rr88-ss99-tttt00000000/usersExample Response
{
"success": true
}Unshare Recording from an User
Endpoint
DELETE /_/public-api/v2/recordings/:recording_id/users/:user_idParams
N/A
Response
| Field | Type |
|---|---|
| success | Always true |
Example Request
curl -X DELETE \
-H "Authorization: Bearer TOKEN" \
-H "Public-Api-Version: 2025-10-31" \
https://api.grain.com/_/public-api/v2/recordings/pppp6666-qq77-rr88-ss99-tttt00000000/users/7890-abcd-ef01-2222-3456-7890ffffExample Response
{
"success": true
}Share Recording to a Team
Endpoint
PUT /_/public-api/v2/recordings/:recording_id/teamsParams
| Param | Type | |
|---|---|---|
| team_id | UUID string | Team to share the recording with. Obtained through List Teams |
Response
| Field | Type |
|---|---|
| success | Always true |
Example Request
curl -X PUT \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TOKEN" \
-H "Public-Api-Version: 2025-10-31" \
--data '{"team_id": "aaaa1111-bb22-cc33-dd44-eeee55555555"}' \
https://api.grain.com/_/public-api/v2/recordings/pppp6666-qq77-rr88-ss99-tttt00000000/teamsExample Response
{
"success": true
}Unshare Recording from a Team
Endpoint
DELETE /_/public-api/v2/recordings/:recording_id/teams/:team_idParams
N/A
Response
| Field | Type |
|---|---|
| success | Always true |
Example Request
curl -X DELETE \
-H "Authorization: Bearer TOKEN" \
-H "Public-Api-Version: 2025-10-31" \
https://api.grain.com/_/public-api/v2/recordings/pppp6666-qq77-rr88-ss99-tttt00000000/teams/aaaa1111-bb22-cc33-dd44-eeee55555555Example Response
{
"success": true
}Hooks
Create Hook
Endpoint
POST /_/public-api/v2/hooks/createParams
| Param | Type | |
|---|---|---|
| hook_url required |
string | Endpoint to be called when the event is triggered. A reachability test is made to the provided url on creation. The endpoint must respond with a 2xx status in order to successfully create the hook. |
| hook_type required |
One of: - recording_added- recording_updated- recording_deleted- highlight_added- highlight_updated- highlight_deleted- story_added- story_updated- story_deleted- upload_status |
Type of notifications the hook will be sent. |
| include | object | - recording_added- recording_updatedRecording Include - highlight_added- highlight_updatedHighlight Include - recording_deleted- highlight_deleted- story_added- story_updated- story_deleted- upload_statusN/A |
Response
| Field | Type |
|---|---|
| Hook | object |
Example Request
curl \
-X POST \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-H "Public-Api-Version: 2025-10-31" \
--data '{"hook_type": "recording_added", "hook_url": "https://example.com/hook"}' \
https://api.grain.com/_/public-api/v2/hooks/createExample Response
{
"enabled": true,
"id": "zzzz6666-aa77-bb88-cc99-dddd00000000",
"include": {},
"inserted_at": "2025-01-01T09:30:00Z",
"hook_url": "https://example.com/hook",
"hook_type": "recording_added"
}List Hooks
Endpoint
POST /_/public-api/v2/hooksParams
| Param | Type | |
|---|---|---|
| filter | object | Hook Filter |
Response
| Field | Type | |
|---|---|---|
| hooks | object array | List of Hooks |
Example Request
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TOKEN" \
-H "Public-Api-Version: 2025-10-31" \
https://api.grain.com/_/public-api/v2/hooksExample Response
{
"hooks": [
{
"enabled": true,
"id": "zzzz6666-aa77-bb88-cc99-dddd00000000",
"include": {},
"inserted_at": "2025-01-01T09:30:00Z",
"hook_url": "https://example.com/hook",
"hook_type": "recording_added"
}
]
}Delete Hook
Endpoint
DELETE /_/public-api/v2/hooks/:hook_idParams
N/A
Response
| Field | Type |
|---|---|
| success | Always true |
Example Request
curl -X DELETE \
-H "Authorization: Bearer TOKEN" \
-H "Public-Api-Version: 2025-10-31" \
https://api.grain.com/_/public-api/v2/hooks/zzzz6666-aa77-bb88-cc99-dddd00000000Example Response
{
"success": true
}Hook Payload Example
{
"type": "recording_added",
"user_id": "eeee1111-ff22-gg33-hh44-iiii55555555",
"data": {
"id": "pppp6666-qq77-rr88-ss99-tttt00000000",
"title": "All Hands",
"source": "zoom",
"share_state": "public",
"url": "https://grain.com/share/recording/pppp6666-qq77-rr88-ss99-tttt00000000",
"media_type": "video",
"tags": [],
"start_datetime": "2025-01-01T09:30:00Z",
"teams": [
{
"id": "aaaa1111-bb22-cc33-dd44-eeee55555555",
"name": "My Team"
}
],
"workspace_shared": false,
"recorders": [
{
"id": "kkkk1111-ll22-mm33-nn44-oooo55555555",
"name": "Luke Skywalker",
"email": "luke@example.com"
}
],
"end_datetime": "2025-01-01T10:00:00Z",
"duration_ms": 1800000,
"thumbnail_url": "https://media.grain.com/public_thumbnails/recordings/pppp6666",
"meeting_type": {
"id": "ffff6666-gg77-hh88-ii99-jjjj00000000",
"name": "Project & Team Coordination",
"scope": "internal"
}
}
}Others
List Users
Endpoint
POST /_/public-api/v2/usersParams
N/A
Response
| Field | Type | |
|---|---|---|
| users | object array | List of Users |
Example Request
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TOKEN" \
-H "Public-Api-Version: 2025-10-31" \
https://api.grain.com/_/public-api/v2/usersExample Response
{
"users": [
{
"id": "7890-abcd-ef01-2222-3456-7890ffff",
"name": "Luke Skywalker",
"email": "luke@example.com"
}
]
}List Teams
Endpoint
POST /_/public-api/v2/teamsParams
N/A
Response
| Field | Type | |
|---|---|---|
| teams | object array | List of Teams |
Example Request
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TOKEN" \
-H "Public-Api-Version: 2025-10-31" \
https://api.grain.com/_/public-api/v2/teamsExample Response
{
"teams": [
{
"id": "aaaa1111-bb22-cc33-dd44-eeee55555555",
"name": "My Team"
}
]
}List Meeting Types
Endpoint
POST /_/public-api/v2/meeting_typesParams
N/A
Response
| Field | Type | |
|---|---|---|
| meeting_types | object array | List of Meeting Types |
Example Request
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TOKEN" \
-H "Public-Api-Version: 2025-10-31" \
https://api.grain.com/_/public-api/v2/meeting_typesExample Response
{
"meeting_types": [
{
"id": "aaaa1111-bb22-cc33-dd44-eeee55555555",
"name": "Sales",
"scope": "external"
},
{
"id": "ffff6666-gg77-hh88-ii99-jjjj00000000",
"name": "Project & Team Coordination",
"scope": "internal"
}
]
}Common Params
Recording Filter
This object is used to filter for specific recordings.
| Param | Type | |
|---|---|---|
| before_datetime | ISO8601 formatted timestamp2025-01-01T09:30:00Z |
Only return recordings which start_datetime is after the selected date (exclusive) |
| after_datetime | ISO8601 formatted timestamp2025-01-01T09:30:00Z |
Only return recordings which start_datetime is before the selected date (inclusive) |
| attendance *Personal API Only |
One of: - hosted- attended |
hostedOnly return recordings where the user was the meeting host. attendedOnly return recordings where the user attended the meeting. |
| participant_scope | One of: - internal- external |
internalOnly return recordings of internal / team meetings. externalOnly return recordings of external / customer meetings. |
| title_search | string | Only return recordings which title matches the given search string. |
| team | uuid | Only return recordings which team matches the given team id. Team ids can be found through the List Teams endpoint. |
| meeting_type | uuid | Only return recordings which meeting type matches the given meeting type id. Meeting type ids can be found through the List Meeting Types endpoint. |
Recording Include
| Param | Type | |
|---|---|---|
| highlights | boolean | Include clips / highlights in the response |
| participants | boolean | Include participants in the response |
| ai_action_items | boolean | Include the ai_action_items in the response |
| ai_summary | boolean | Include the ai_summary in the response |
| private_notes *Personal API Only |
boolean | Include your private notes in the response |
| calendar_event | boolean | Include calendar event data in the response |
| hubspot | boolean | Include HubSpot related data in the response |
| screenshares | boolean | Include screenshare ranges in the response |
| ai_template_sections | object | Includes ai_template_sections in the response |
| ai_template_sections format |
One of: - json- markdown- text |
Controls the output of ai_template_sections Defaults to json |
| ai_template_sections allowed_sections |
string array | Only include sections which title matches the given allowed_sectionsCase insensitive |
Highlight Include
| Param | Type | |
|---|---|---|
| transcript | boolean | Include the highlight's transcript in the response. |
| speakers | boolean | Include the highlight's speakers in the response |
Hook Filter
| Param | Type | |
|---|---|---|
| hook_type | One of: - recording_added- recording_updated- recording_deleted- highlight_added- highlight_updated- highlight_deleted- story_added- story_updated- story_deleted- upload_status |
Only return hooks with the matching hook_type |
| state | One of: - enabled- disabled |
Only return hooks that are either enabled or disabled. |
Common Responses
Recording
| Field | Type | |
|---|---|---|
| id | UUID string | Id of the recording |
| title | string | Title of the recording |
| start_datetime | ISO8601 formatted timestamp2025-01-01T09:30:00Z |
UTC datetime at which grain started the recording |
| end_datetime | ISO8601 formatted timestamp2025-01-01T09:30:00Z |
UTC datetime at which the recording ended |
| duration_ms | integer | Duration of the recording in ms |
| media_type | One of: - audio- transcript- video |
Media type of the recording |
| source | One of: - aircall- local_capture- meet- teams- upload- webex- zoom- other |
From what source did Grain get the recording |
| share_state | One of: - public- workspace- restricted |
publicAnyone with the link workspaceAll workspace members restrictedOnly people with access |
| url | string | URL to the recording in Grain |
| thumbnail_url | string *nullable |
URL to the recording's thumbnail |
| highlights | object array | List of Highlights |
| tags | string array | Tags of the recording |
| teams | object array | List of Teams the recording belongs to. |
| workspace_shared | boolean | Whether the recording is shared with the whole workspace |
| recorders | object array | List of users that recorded the meeting |
| recorders id |
UUID string | User id of the recorder |
| recorders name |
string | Name of the recorder |
| recorders |
string | Email of the recorder |
| recorders participant_id include: participants |
UUID string *nullable |
Participant id of the recorder |
| meeting_type | object *nullable |
Recording's Meeting Type |
| ai_template_sections include: ai_template_sections |
object array | List of AI Template Sections |
| ai_action_items include: ai_action_items |
object array | List of Action Items |
| ai_action_items status |
One of: - pending- completed |
Status of the action item |
| ai_action_items timestamp |
integer | Observed timestamp in ms at which the action item was mentioned |
| ai_action_items text |
string | Content of the action item |
| ai_action_items assignee |
object *nullable |
Assignee of the action item |
| ai_action_items assignee id |
UUID string | Id of the assignee |
| ai_action_items assignee name |
string | Name of the assignee |
| ai_action_items assignee user_id |
UUID string *nullable |
User id of the assignee |
| ai_summary include: ai_summary |
object | |
| ai_summary text |
markdown formatted string | Markdown text of the ai summary |
| calendar_event include: calendar_event |
object *nullable |
|
| calendar_event ical_uid |
string *nullable |
Ical UID of the related event |
| calendar_event scheduled_start_datetime |
ISO8601 formatted timestamp2025-01-01T09:00:00Z*nullable |
UTC datetime of the scheduled calendar event start time |
| calendar_event scheduled_end_datetime |
ISO8601 formatted timestamp2025-01-01T10:00:00Z*nullable |
UTC datetime of the scheduled calendar event end time |
| hubspot include: hubspot |
object | |
| hubspot hubspot_company_ids |
string array | List of HubSpot company id's related to the recording |
| hubspot hubspot_deal_ids |
string array | List of HubSpot deal id's related to the recording |
| participants include: participants |
object array | |
| participants id |
UUID string | id of the participant |
| participants name |
string | Name of the participant |
| participants |
string *nullable |
Email of the participant |
| participants scope |
One of: - internal- external- unknown |
Scope of the participant |
| participants confirmed_attendee |
boolean | Whether or not the participant was present in the recording |
| participants hs_contact_id include: hubspot |
string *nullable |
HubSpot contact id of the particpant |
| participants observed_join_time |
ISO8601 formatted timestamp2025-01-01T09:30:00Z*nullable |
UTC datetime the participant was observed joining the meeting. Note: This is based on what Grain's recorder observed and may not reflect the participant's actual join time. |
| participants observed_leave_time |
ISO8601 formatted timestamp2025-01-01T10:00:00Z*nullable |
UTC datetime the participant was observed leaving the meeting. Note: This is based on what Grain's recorder observed and may not reflect the participant's actual leave time. |
| private_notes include: private_notes |
object *nullable |
|
| private_notes text |
string | Markdown text of the user's private notes |
| screenshares include: screenshares |
object array | List of screenshare ranges |
| screenshares start |
integer | Timestamp in ms from the recording of when the screenshare range started |
| screenshares end |
integer | Timestamp in ms from the recording of when the screenshare range ended |
| screenshares participant_id |
UUID string | Id of the participant that was screensharing |
Highlight (aka Clip)
| Field | Type | |
|---|---|---|
| id | UUID string | id of the highlight |
| recording_id | UUID string | id of the recording it was clipped from |
| text | string | Small description of the clip, equivalent to a title |
| transcript | string | Transcript of the clip formatted as text |
| speakers | string array | Names of the speakers of the clip |
| timestamp | integer | Timestamp in ms from the recording of when the clip starts |
| duration | integer | Duration of the clip in ms |
| tags | string array | Tags of the clip |
| url | string | URL to the highlight in Grain |
| thumbnail_url | string | URL to the highlight's thumbnail |
| created_datetime | ISO8601 formatted timestamp2025-01-01T09:30:00Z |
UTC datetime of when the clip was created |
Hook
| Field | Type | |
|---|---|---|
| id | UUID string | id of the hook |
| enabled | boolean | Whether the hook is enabled or not |
| hook_url | string | URL to which Grain will post to |
| hook_type | One of: - recording_added- recording_updated- recording_deleted- highlight_added- highlight_updated- highlight_deleted- story_added- story_updated- story_deleted- upload_status |
Type of notifications the hook will be sent. |
| include | object | recording_addedrecording_updatedRecording Include the hook was created with. highlight_addedhighlight_updatedHighlight Include the hooks was created with. recording_deletedhighlight_deletedstory_addedstory_updatedstory_deletedupload_statusAlways an empty object |
| inserted_at | ISO8601 formatted timestamp2025-01-01T09:30:00Z |
UTC datetime of when the hook was created |
User
| Field | Type | |
|---|---|---|
| id | UUID string | id of the user |
| name | string | Name of the user |
| string | Primary email of the user |
Team
| Field | Type | |
|---|---|---|
| id | UUID string | id of the team |
| name | string | Name of the team |
Meeting Type
| Field | Type | |
|---|---|---|
| id | UUID string | id of the meeting type |
| name | string | Name of the meeting type |
| scope | One of: - internal- external |
Scope of the meeting type |
AI Template Sections
| Field | Type | |
|---|---|---|
| title | string | Title of the section |
| data | object | Fields depend on the type of section. |
