# Grain

> Pull your Grain meeting recordings, AI summaries, action items, and transcripts into your workflows.

App · Meeting Notes · 3 actions. Web page: https://docs.lodol.com/docs/integrations/grain

## Actions

### Get a recording

Fetch one recording with its AI summary, action items, and highlights.

**Inputs**

- Recording ID (`recording_id`, text, required): The Grain recording ID, as returned by List recordings.
- Include AI summary (`include_summary`, true/false): Include the AI-generated summary and action items. On by default. Default: `true`.

**Outputs**

- `action_items` (list): Action items Grain's AI picked out
- `duration_ms` (number): How long the recording runs, in milliseconds
- `end_datetime` (text): When the meeting ended
- `highlights` (list): Clips someone highlighted in the recording
- `participants` (list): The people on the call
- `recording_id` (text): Recording ID. Use with Get a recording and Get a transcript.
- `source` (text): Where the recording came from, for example 'zoom', 'teams', 'meet', or 'upload'
- `start_datetime` (text): When the meeting started
- `summary` (text): Grain's AI summary of the meeting, as Markdown. Empty when the summary wasn't requested or hasn't been generated.
- `tags` (list): Tags applied to the recording
- `title` (text): The recording's title
- `url` (text): Link to watch the recording in Grain

**Example output**

```json
{
  "action_items": [
    {
      "assignee": "Ada Lovelace",
      "completed": false,
      "text": "Send the SOC 2 report"
    }
  ],
  "duration_ms": 1920000,
  "end_datetime": "2026-07-29T15:32:00Z",
  "highlights": [
    {
      "highlight_id": "8f2b1c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
      "text": "We need SOC 2 before we can sign.",
      "timestamp_ms": 742000,
      "url": "https://grain.com/share/highlight/8f2b1c4d"
    }
  ],
  "participants": [
    {
      "confirmed_attendee": true,
      "email": "ada@example.com",
      "name": "Ada Lovelace",
      "scope": "internal"
    },
    {
      "confirmed_attendee": true,
      "email": "grace@example.com",
      "name": "Grace Hopper",
      "scope": "external"
    }
  ],
  "recording_id": "d1c9f7a2-3b4e-4c5d-9e8f-0a1b2c3d4e5f",
  "source": "zoom",
  "start_datetime": "2026-07-29T15:00:00Z",
  "summary": "Acme is evaluating three vendors and needs SOC 2 evidence before moving forward.",
  "tags": [
    "discovery",
    "enterprise"
  ],
  "title": "Acme discovery call",
  "url": "https://grain.com/share/recording/d1c9f7a2-3b4e-4c5d-9e8f-0a1b2c3d4e5f"
}
```

### Get a transcript

Fetch a recording's word-for-word transcript, both as one block of text and as timed segments.

**Inputs**

- Recording ID (`recording_id`, text, required): The Grain recording ID, as returned by List recordings.

**Outputs**

- `recording_id` (text): The recording the transcript belongs to
- `segments` (list): The transcript split into timed lines
- `text` (text): The whole transcript as one string, one 'Speaker: line' per line. Handy for passing to an AI step.

**Example output**

```json
{
  "recording_id": "d1c9f7a2-3b4e-4c5d-9e8f-0a1b2c3d4e5f",
  "segments": [
    {
      "end_ms": 3400,
      "speaker": "Ada Lovelace",
      "start_ms": 1200,
      "text": "Thanks for making the time."
    },
    {
      "end_ms": 5100,
      "speaker": "Grace Hopper",
      "start_ms": 3500,
      "text": "Happy to be here."
    }
  ],
  "text": "Ada Lovelace: Thanks for making the time.\nGrace Hopper: Happy to be here."
}
```

### List recordings

List the meeting recordings in your Grain workspace.

**Inputs**

- Started after (`after_datetime`, date and time): Optional. Only return recordings that started after this time, as an ISO 8601 timestamp.
- Started before (`before_datetime`, date and time): Optional. Only return recordings that started before this time, as an ISO 8601 timestamp.
- Title contains (`title_search`, text): Optional. Only return recordings whose title contains this text.

**Outputs**

- `recordings` (list): The matching recordings

**Example output**

```json
{
  "recordings": [
    {
      "duration_ms": 1920000,
      "end_datetime": "2026-07-29T15:32:00Z",
      "participants": [
        {
          "confirmed_attendee": true,
          "email": "ada@example.com",
          "name": "Ada Lovelace",
          "scope": "internal"
        },
        {
          "confirmed_attendee": true,
          "email": "grace@example.com",
          "name": "Grace Hopper",
          "scope": "external"
        }
      ],
      "recording_id": "d1c9f7a2-3b4e-4c5d-9e8f-0a1b2c3d4e5f",
      "source": "zoom",
      "start_datetime": "2026-07-29T15:00:00Z",
      "tags": [
        "discovery",
        "enterprise"
      ],
      "title": "Acme discovery call",
      "url": "https://grain.com/share/recording/d1c9f7a2-3b4e-4c5d-9e8f-0a1b2c3d4e5f"
    }
  ]
}
```
