O Read AI oferece uma API REST pública, ideal para desenvolvedores que desejam criar aplicativos que acessem programaticamente os dados de reuniões do Read AI. Atualmente, ela está disponível como uma versão beta aberta.
⚠️ Antes de começar, certifique-se de ter revisado os pré-requisitos.
Autenticação
Todos os endpoints exigem autenticação por token Bearer usando o cabeçalho Authorization. Consulte Chaves de API e autenticação para obter instruções sobre como obter seu token de acesso.
Formato do cabeçalho
Authorization: Bearer YOUR_ACCESS_TOKENExemplo
curl https://api.read.ai/v1/meetings \
-H "Authorization: Bearer sk_test_123" \
-H "Accept: application/json"Para JWTs (usados no OAuth2/Ory), o Bearer seria assim:
"Authorization: Bearer ory_at_..."Estados das reuniões
As reuniões na API do Read AI podem estar em estados diferentes:
-
Reunião ativa: uma reunião em andamento. Identificada pela ausência de
end_time_msou pornull. -
Reunião encerrada: uma reunião concluída. Identificada quando
end_time_mstem um valor. -
Reunião com recurso ao vivo ativado: uma reunião com captura de dados em tempo real ativada. Identificada por
live_enabled: true.
Endpoints
A URL base de todos os endpoints é https://api.read.ai/.
1. Listar reuniões
Método: GET /v1/meetings
Descrição: retorna uma lista paginada de reuniões em ordem cronológica inversa (mais recentes primeiro), opcionalmente filtrada pelo horário de início. Esse endpoint retorna reuniões ativas e encerradas, incluindo o status do recurso ao vivo. Observe que as reuniões ativas terão dados limitados ou nenhum dado para campos expansíveis, pois eles são gerados após o encerramento de uma reunião.
Parâmetros de consulta
| Nome | Tipo | Descrição |
| limit | int | Número de resultados a retornar. Padrão 10, máximo 10. |
| start_time_ms.gt | int | Retorna reuniões em que start_time_ms é maior que este valor. |
| start_time_ms.gte | int | Retorna reuniões em que start_time_ms é maior ou igual a este valor. |
| start_time_ms.lt | int | Retorna reuniões em que start_time_ms é menor que este valor. |
| start_time_ms.lte | int | Retorna reuniões em que start_time_ms é menor ou igual a este valor. |
| cursor | str | Cursor para paginação; use o ID do último objeto da página anterior. |
| expand[] | array | Campos a expandir (consulte a seção Campos expansíveis). |
Exemplo de solicitação
curl "https://api.read.ai/v1/meetings?limit=5&start_time_ms.gte=1733700000000" \
-H "Authorization: Bearer sk_test_123" \
-H "Accept: application/json"Exemplo de resposta
{
"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. Recuperar uma reunião
Método: GET /v1/meetings/{id}
Descrição: recupera uma reunião específica pelo seu ID exclusivo. Para reuniões ativas com o recurso ao vivo ativado, use o endpoint /v1/meetings/{id}/live.
Parâmetros de caminho
| Nome | Tipo | Descrição |
| id | string | ULID da reunião |
Parâmetros de consulta
| Nome | Tipo | Descrição |
| expand[] | array | Campos a expandir na resposta |
Exemplo de solicitação
curl "https://api.read.ai/v1/meetings/01HFYH0A6JM4R7MZ2E6X5T9BNP?expand[]=summary&expand[]=metrics" \
-H "Authorization: Bearer sk_test_123" \
-H "Accept: application/json"Exemplo de resposta
{
"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. Recuperar uma reunião ao vivo
Método: GET /v1/meetings/{id}/live
Descrição: recupera dados ao vivo de uma reunião em andamento pelo seu ID exclusivo. Esse endpoint permite buscar a transcrição em tempo real e os resumos dos capítulos à medida que a reunião avança, com filtragem opcional pelo horário de início.
Observação importante: por padrão, nenhuma reunião possui dados ao vivo; eles só ficam disponíveis se você mantiver o painel ao vivo aberto durante a reunião. Adicionaremos uma configuração de conta para ativar dados ao vivo em todas as reuniões como parte do lançamento completo da disponibilidade geral.
Parâmetros de caminho
| Nome | Tipo | Descrição |
| id | string | ULID da reunião |
Parâmetros de consulta
| Nome | Tipo | Descrição |
| Nome | Tipo | Descrição |
| start_time_ms.gt | int | Retorna dados ao vivo em que start_time_ms é maior que este valor |
| start_time_ms.gte | int | Retorna dados ao vivo em que start_time_ms é maior ou igual a este valor |
| expand[] | array | Campos a expandir na resposta (apenas transcript e chapter_summaries estão disponíveis para reuniões ao vivo) |
Exemplo de solicitação
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"Exemplo de resposta
{
"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."
}
}
Campos expansíveis
A API é compatível com o parâmetro expand[] para buscar campos enriquecidos adicionais que não são incluídos por padrão. Observe que o uso de campos expandidos aumentará os tempos de resposta, pois a API recupera e processa dados adicionais. Expandir vários campos ou usar expansões em solicitações de lista grandes pode resultar em tempos de processamento visivelmente mais longos.
Campos disponíveis
summarychapter_summariesaction_itemskey_questionstopicstranscriptmetricsrecording_download
Exemplo de solicitação
curl "https://api.read.ai/v1/meetings?expand[]=metrics&expand[]=transcript" \
-H "Authorization: Bearer sk_test_123" \
-H "Accept: application/json"
Paginação
A API usa paginação baseada em cursor para navegar por grandes conjuntos de resultados.
Parâmetros
| Parâmetro | Descrição |
| limit | Número máximo de objetos a retornar. Padrão 10, máximo 10. |
| cursor | Cursor que aponta para a próxima página. Use o ID do último objeto da resposta anterior. |
Campos da resposta
| Campo | Tipo | Descrição |
| object | str | Normalmente "list". |
| url | str | URL da solicitação. |
| has_more | bool | Indica se existem páginas adicionais. |
| data | array | Lista de objetos de reunião retornados. |
Exemplo de uso
O parâmetro cursor deve ser definido como o ID da última reunião retornada na matriz data da página anterior.
Etapa 1: solicitação da primeira página
Método: GET /v1/meetings
Exemplo de resposta:
{
"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",
...
}
]
}
Etapa 2: solicitação da segunda página
Pegue o id do último objeto na matriz data (01KG4JRNA0EEFAJTM0S3PMDARK) e use-o como cursor:
Método: GET /v1/meetings?cursor=01KG4JRNA0EEFAJTM0S3PMDARK
Isso retornará a próxima página de resultados, começando após essa reunião.
Etapa 3: continue até concluir
Continue repetindo com o novo ID da última reunião até que has_more seja false.
Códigos de erro
As respostas de erro comuns seguem os códigos de status HTTP padrão.
| Código de status | Significado | Descrição |
| 200 | OK | Solicitação concluída com sucesso. |
| 400 | Solicitação inválida | Os parâmetros da sua solicitação estavam malformados ou inválidos. |
| 401 | Não autorizado | A autenticação falhou ou o token está ausente. |
| 403 | Proibido | Você não tem permissão para acessar este recurso. |
| 404 | Não encontrado | O recurso solicitado não existe. |
| 422 | Entidade não processável | Um ou mais parâmetros não passaram na validação. |
| 429 | Solicitações em excesso | Limite de taxa excedido (máximo de 100 solicitações por minuto por usuário); tente novamente mais tarde. |
| 500 | Erro do servidor | Ocorreu um erro no servidor. |