Read AI offers a public REST API, which is ideal for developers looking to build applications that programmatically access their Read AI meeting data. It is currently available as an open beta release.
⚠️ Before starting, make sure you have reviewed the prerequisites.
Authentication
All endpoints require Bearer token authentication using the Authorization header. See API Keys & Authentication for instructions on how to obtain your access token.
Header Format
Authorization: Bearer YOUR_ACCESS_TOKENExample
curl https://api.read.ai/v1/meetings \
-H "Authorization: Bearer sk_test_123" \
-H "Accept: application/json"For JWTs (used in OAuth2/Ory), Bearer would look like:
"Authorization: Bearer ory_at_..."Meeting States
Meetings in the Read AI API can be in different states:
-
Active Meeting: A meeting currently in progress. Identified by
end_time_msbeing not present ornull. -
Ended Meeting: A completed meeting. Identified by
end_time_mshaving a value. -
Live-Enabled Meeting: A meeting with real-time data capture enabled. Identified by
live_enabled: true.
Endpoints
The base URL for all endpoints is https://api.read.ai/.
1. List Meetings
Method: GET /v1/meetings
Description: Returns a paginated list of meetings in reverse chronological order (newest first), optionally filtered by start time. This endpoint returns both active and ended meetings, including their live-enabled status. Note that active meetings will have limited or no data for expandable fields, as these are generated after a meeting concludes.
Query Parameters
| Name | Type | Description |
| limit | int | Number of results to return. Default 10, max 10. |
| start_time_ms.gt | int | Return meetings where start_time_ms is greater than this value. |
| start_time_ms.gte | int | Return meetings where start_time_ms is greater than or equal to this value. |
| start_time_ms.lt | int | Return meetings where start_time_ms is less than this value. |
| start_time_ms.lte | int | Return meetings where start_time_ms is less than or equal to this value. |
| cursor | str | Cursor for pagination; use the ID of the last object from the previous page. |
| expand[] | array | Fields to expand (see Expandable Fields section). |
Example Request
curl "https://api.read.ai/v1/meetings?limit=5&start_time_ms.gte=1733700000000" \
-H "Authorization: Bearer sk_test_123" \
-H "Accept: application/json"Example Response
{
"object": "list",
"url": "/v1/meetings",
"has_more": false,
"data": [
{
"id": "01HFYH0A6JM4R7MZ2E6X5T9BNP",
"start_time_ms": 1733800000000,
"end_time_ms": 1733803600000,
"scheduled_start_time_ms": 1733799800000,
"scheduled_end_time_ms": 1733803400000,
"participants": [
{
"name": "Alice Example",
"email": "alice@example.com",
"invited": true,
"attended": true
}
],
"owner": {
"name": "Alice Example",
"email": "alice@example.com"
},
"title": "Weekly status sync",
"report_url": "https://app.read.ai/analytics/meetings/01HFYH0A6JM4R7MZ2E6X5T9BNP",
"platform": "zoom",
"platform_id": "987654321",
"folders": ["Weekly Sync"],
"live_enabled": false
}
]
}
2. Retrieve a Meeting
Method: GET /v1/meetings/{id}
Description: Fetch a specific meeting by its unique ID. For active, live-enabled meetings, use the /v1/meetings/{id}/live endpoint instead.
Path Parameters
| Name | Type | Description |
| id | string | Meeting ULID |
Query Parameters
| Name | Type | Description |
| expand[] | array | Fields to expand in the response |
Example Request
curl "https://api.read.ai/v1/meetings/01HFYH0A6JM4R7MZ2E6X5T9BNP?expand[]=summary&expand[]=metrics" \
-H "Authorization: Bearer sk_test_123" \
-H "Accept: application/json"Example Response
{
"id": "01HFYH0A6JM4R7MZ2E6X5T9BNP",
"start_time_ms": 1733800000000,
"end_time_ms": 1733803600000,
"scheduled_start_time_ms": 1733799800000,
"scheduled_end_time_ms": 1733803400000,
"participants": [
{
"name": "Alice Example",
"email": "alice@example.com",
"invited": true,
"attended": true
}
],
"owner": {
"name": "Alice Example",
"email": "alice@example.com"
},
"title": "Weekly status sync",
"report_url": "https://app.read.ai/analytics/meetings/01HFYH0A6JM4R7MZ2E6X5T9BNP",
"platform": "zoom",
"platform_id": "987654321",
"folders": ["Weekly Sync"],
"live_enabled": false,
"summary": "We reviewed project timelines and assigned new action items.",
"metrics": {
"read_score": 0.9,
"sentiment": 0.3,
"engagement": 0.75
}
}
3. Retrieve a Live Meeting
Method: GET /v1/meetings/{id}/live
Description: Retrieve live meeting data for an ongoing meeting by its unique ID. This endpoint allows you to fetch real-time transcript and chapter summaries as the meeting progresses, with optional filtering by start time.
Important Note: All meetings do not have live data by default, it is only available if you have the live dashboard open during the meeting. We will be adding an account setting to enable live data for all meetings as part of the full GA release.
Path Parameters
| Name | Type | Description |
| id | string | Meeting ULID |
Query Parameters
| Name | Type | Description |
| Name | Type | Description |
| start_time_ms.gt | int | Return live data where start_time_ms is greater than this value |
| start_time_ms.gte | int | Return live data where start_time_ms is greater than or equal to this value |
| expand[] | array | Fields to expand in the response (only transcript and chapter_summaries are available for live meetings) |
Example Request
curl "https://api.read.ai/v1/meetings/01HFYH0A6JM4R7MZ2E6X5T9BNP/live?expand[]=transcript&start_time_ms.gte=1733800000000" \
-H "Authorization: Bearer sk_test_123" \
-H "Accept: application/json"Example Response
{
"id": "01HFYH0A6JM4R7MZ2E6X5T9BNP",
"start_time_ms": 1733800000000,
"end_time_ms": null,
"scheduled_start_time_ms": 1733799800000,
"scheduled_end_time_ms": 1733803400000,
"participants": [
{
"name": "Alice Example",
"email": "alice@example.com",
"invited": true,
"attended": true
}
],
"owner": {
"name": "Alice Example",
"email": "alice@example.com"
},
"title": "Weekly status sync",
"report_url": "https://app.read.ai/analytics/meetings/01HFYH0A6JM4R7MZ2E6X5T9BNP",
"platform": "zoom",
"platform_id": "987654321",
"folders": ["Weekly Sync"],
"live_enabled": true,
"transcript": {
"speakers": [
{
"name": "Alice Example"
}
],
"turns": [
{
"speaker": {
"name": "Alice Example"
},
"text": "Let's start with the project updates.",
"start_time_ms": 1733800000000,
"end_time_ms": 1733800005000
}
],
"text": "[Alice Example]: Let's start with the project updates."
}
}
Expandable Fields
The API supports the expand[] parameter to fetch additional enriched fields that are not included by default. Note that using expanded fields will increase response times as the API retrieves and processes additional data. Expanding multiple fields or using expansions on large list requests may result in noticeably slower processing times.
Available Fields
summarychapter_summariesaction_itemskey_questionstopicstranscriptmetricsrecording_download
Example Request
curl "https://api.read.ai/v1/meetings?expand[]=metrics&expand[]=transcript" \
-H "Authorization: Bearer sk_test_123" \
-H "Accept: application/json"
Pagination
The API uses cursor-based pagination for navigating through large result sets.
Parameters
| Parameter | Description |
| limit | Maximum number of objects to return. Default 10, max 10. |
| cursor | Cursor pointing to the next page. Use the ID of the last object from the prior response. |
Response Fields
| Field | Type | Description |
| object | str | Typically "list". |
| url | str | URL of the request. |
| has_more | bool | Indicates whether additional pages exist. |
| data | array | List of returned meeting objects. |
Example Usage
The cursor parameter should be set to the ID of the last meeting returned in the previous page's data array.
Step 1: First Page Request
Method: GET /v1/meetings
Example Response:
{
"object": "list",
"url": "/v1/meetings",
"has_more": true,
"data": [
{
"id": "01KG7BZV04HJGVBM4KJCWV9P4N",
"title": "Team Standup",
...
},
{
"id": "01KG76TMYXDRZ0D86Z3MNXP566",
"title": "Client Call",
...
},
...
{
"id": "01KG4JRNA0EEFAJTM0S3PMDARK", // ← Last meeting id in this page
"title": "Sprint Planning",
...
}
]
}
Step 2: Second Page Request
Take the id from the last object in the data array (01KG4JRNA0EEFAJTM0S3PMDARK) and use it as the cursor:
Method: GET /v1/meetings?cursor=01KG4JRNA0EEFAJTM0S3PMDARK
This will return the next page of results starting after that meeting.
Step 3: Continue Until Done
Keep repeating with the new last ID until has_more is false.
Error Codes
Common error responses follow standard HTTP status codes.
| Status Code | Meaning | Description |
| 200 | OK | Request succeeded. |
| 400 | Bad Request | Your request parameters were malformed or invalid. |
| 401 | Unauthorized | Authentication failed or missing token. |
| 403 | Forbidden | You do not have permission to access this resource. |
| 404 | Not Found | The requested resource does not exist. |
| 422 | Unprocessable Entity | One or more parameters failed validation. |
| 429 | Too Many Requests | Rate limit exceeded; retry later. |
| 500 | Server Error | Error occurred on the server. |