Calls
List and retrieve conversations recorded and analyzed by MeetRox.
Calls
Retrieve conversations recorded and analyzed by MeetRox, including transcriptions, AI summaries, speech metrics, and CRM associations.
List Calls
GET /v1/calls
Returns a paginated list of calls for the authenticated workspace. The list response omits the full analysis, scorecard, and evaluator details — use Get Call for the complete record.
Query Parameters
Pagination
The endpoint uses cursor-based pagination.
| Parameter | Type | Description |
|---|---|---|
first | integer | Number of records to return (default: 50, max: 100) |
after | string | Cursor to fetch the next page (use end_cursor from the previous response) |
last | integer | Number of records to return from the end |
before | string | Cursor to fetch the previous page (use start_cursor from the previous response) |
Filtering
Calls can be filtered by the following fields. Filters are passed as query parameters in the format filters[0][field]=<field>&filters[0][op]=<operator>&filters[0][value]=<value>.
| Field | Type | Description |
|---|---|---|
id | integer | Call ID |
type | string | Format — audio, video, file, chat, or group_chat |
title | string | Call title |
timestamp | datetime | When the call occurred (ISO 8601) |
inserted_at | datetime | When the call was created in MeetRox |
updated_at | datetime | When the call was last updated |
duration | float | Duration in seconds |
public | boolean | Whether the call is publicly shared |
ai_score | float | AI-generated quality score (0–100) |
score | float | Human review score (0–100) |
lead_name | string | Name of the prospect |
lead_company | string | Company of the prospect |
won | boolean | Whether the associated deal was won |
rep_talk_ratio | float | Fraction of the call time the rep was speaking (0–1) |
call_exchanges | float | Number of speaking turns |
longest_rep_monologue | float | Longest uninterrupted rep speech in seconds |
longest_lead_story | float | Longest uninterrupted prospect speech in seconds |
silence_percentage | float | Fraction of the call with silence (0–1) |
Sorting
| Parameter | Description |
|---|---|
order_by[] | Fields to sort by. Sortable: id, agent_name, ai_score, lead_name, lead_company, duration, timestamp, inserted_at, updated_at |
order_directions[] | asc or desc for each field in order_by[] |
Default order: updated_at desc, id desc.
Example
curl "https://api.meetrox.ai/v1/calls?first=20" \
-H "x-api-key: YOUR_API_KEY"Response
{
"data": [
{
"id": 42,
"workspace_id": 7,
"title": "Demo call with Acme Corp",
"duration": 1823.4,
"timestamp": "2026-05-15T14:30:00Z",
"inserted_at": "2026-05-15T14:55:10Z",
"updated_at": "2026-05-15T15:42:00Z",
"format": "video",
"chat": null,
"public": false,
"source": {
"system": "google_meet",
"system_id": "abc-xyz-123"
},
"url": "https://app.meetrox.com/7/calls/42",
"agent": {
"id": 5,
"name": "Ana Silva",
"email": "[email protected]"
},
"attendees": ["[email protected]"],
"type": {
"id": 3,
"name": "Demo",
"description": "Product demonstration calls",
"association_mode": "crm_deal"
},
"interaction_metrics": {
"rep_talk_ratio": 0.48,
"call_exchanges": 32,
"longest_rep_monologue": 87.2,
"longest_lead_story": 54.1,
"silence_percentage": 0.06,
"ai_score": 82.5,
"score": 78.0
},
"business_info": {
"lead_name": "John Doe",
"lead_company": "Acme Corp",
"won": null
},
"associations": {
"crm_deals": [
{
"system": "hubspot",
"system_id": "98765432",
"label": "Acme Corp - Enterprise Deal",
"url": "https://app.hubspot.com/deals/98765432"
}
],
"crm_contacts": [
{
"system": "hubspot",
"system_id": "12345",
"label": "John Doe",
"url": null
}
]
}
}
],
"meta": {
"page_size": 20,
"has_next_page": true,
"has_previous_page": false,
"start_cursor": "g2wAAAABaAJtAAAACGNhbGxfaWRhKm4=",
"end_cursor": "g2wAAAABaAJtAAAACGNhbGxfaWRhMm4=",
"errors": [],
"params": {}
}
}Get Call
GET /v1/calls/:id
Returns the full record for a single call, including the AI-generated analysis (summary and transcription), scorecard, evaluator scores, signed media URLs, and the conversation for chat-type calls.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
id | integer | The ID of the call |
Example
curl https://api.meetrox.ai/v1/calls/42 \
-H "x-api-key: YOUR_API_KEY"Response
The response includes all fields from the list endpoint, plus:
{
"data": {
"id": 42,
"title": "Demo call with Acme Corp",
"media": {
"audio_url": "https://signed-url.s3.amazonaws.com/audio/call-42.mp3?...",
"video_url": null
},
"chat": null,
"analysis": {
"summary": {
"topics": [
{ "title": "Pricing", "content": "The prospect asked about annual plans..." },
{ "title": "Next steps", "content": "Follow-up demo scheduled for Friday." }
]
},
"transcription": "Ana: Good afternoon, John. Thanks for joining...\nJohn: Of course, happy to be here..."
},
"scorecard": {
"id": 1,
"name": "Demo Scorecard",
"active": true,
"categories": [
{
"id": 10,
"name": "Opening",
"sort_number": 1,
"questions": [
{
"id": 100,
"text": "Did the rep introduce themselves?",
"weight": 1.0,
"default_answer": "n/a"
}
]
}
]
},
"evaluators": [
{
"id": 201,
"type": "system",
"score": 82.5,
"name": "AI",
"user_id": null,
"email": null,
"answers": [
{
"id": 301,
"question_id": 100,
"category_id": 10,
"answer": "yes"
}
]
}
]
}
}Association Types
The associations object groups linked CRM records by type:
| Key | Description |
|---|---|
crm_deals | CRM deals/opportunities |
crm_contacts | CRM contacts |
crm_accounts / crm_companies | CRM companies/accounts |
crm_leads | CRM leads |
crm_activities | CRM activities |
crm_events | CRM calendar events |
crm_tickets | CRM tickets |
crm_custom_objects | Custom CRM objects |
csm_contacts | CSM contacts |
csm_customers | CSM customers |
csm_tasks | CSM tasks |
Each association contains:
| Field | Type | Description |
|---|---|---|
system | string | Integration name (e.g., hubspot, salesforce, pipedrive) |
system_id | string | ID of the record in the external system |
label | string | Human-readable label |
url | string | null | Direct link to the record in the CRM |
Evaluator Answer Values
Scorecard answers are returned as strings:
| Value | Meaning |
|---|---|
"yes" | Positive |
"no" | Negative |
"n/a" | Not applicable |
Media URLs
The media object contains signed URLs for the call recordings:
| Field | Type | Description |
|---|---|---|
audio_url | string | null | Signed URL for the audio recording. null if no audio file exists for this call. |
video_url | string | null | Signed URL for the video recording. null if no video file exists for this call. |
Signed URLs expire after 30 minutes. Do not cache or store these URLs — always fetch a fresh call record when you need access to the recording.
Chat Conversations
For chat-type calls (WhatsApp conversations), the chat object carries the
conversation: metadata, the participant list and the full message history. For
every other call type, chat is null.
Availability. Before September 2026 this field was always
null, including
for chat calls. If you integrated against it previously and found it empty,
that was the cause. It is now populated.
Only on Get Call. The key is present in the List Calls response too, but it
is alwaysnullthere. Listing endpoints do not carry conversations, since a
direct message stores its entire history in this field. Fetch the single call
to read a conversation.
No audio metrics. Chat calls have no speech analysis, so every field in
interaction_metricsisnull.
Two shapes, one field
The payload depends on whether the conversation is a direct message or a group.
Read format on the call, or is_group inside the object, before parsing.
Call format | chat shape |
|---|---|
chat | Direct message (one contact, one rep) |
group_chat | WhatsApp group (any number of participants) |
The two shapes differ in how senders and participants are identified, so code
written against one will not read the other correctly:
chat (direct) | group_chat (group) | |
|---|---|---|
Participant id | "client" or "internal" | The participant's WhatsApp ID |
Participant type | "external", "internal" | "contact", "agent", "participant", "bot" |
Message sender | "client" or "internal" | The sender's WhatsApp ID |
A check like sender === "client" works on a direct message and silently fails
on a group. Branch on format first.
Denied groups. A WhatsApp group whose processing was denied in MeetRox
returnschat: null, even though the call itself is returned normally. Here
nullmeans withheld, not empty.
App-only fields.
viewer_phoneon the object andis_vieweron each
participant are not part of this API. They describe the signed-in user looking
at the conversation, and this API authenticates by key, not by user.
Direct messages (format: "chat")
format: "chat"){
"chat_id": "5511*****[email protected]",
"channel": "whatsapp",
"is_group": false,
"conversation_type": "direct",
"processing_status": "approved",
"participants": [
{
"id": "client",
"type": "external",
"name": "5511*****1234",
"profile_pic": null,
"company": null,
"email": null
},
{
"id": "internal",
"type": "internal",
"name": "Ana Silva",
"user_id": 15,
"profile_pic": null,
"company": null,
"email": null,
"phone": "",
"is_owner": true
}
],
"messages": [
{
"id": "3EB0A1B2C3D4E5F6",
"sender": "client",
"timestamp": "2026-05-20T14:30:00Z",
"type": "text",
"text": "Olá, gostaria de saber mais sobre os planos.",
"transcription": null,
"url": null
},
{
"id": "3EB0F1E2D3C4B5A6",
"sender": "internal",
"timestamp": "2026-05-20T14:31:05Z",
"type": "image",
"text": null,
"transcription": null,
"url": "https://media.example.com/image.jpg"
}
]
}A direct message is returned exactly as MeetRox stored it, so its participant
objects may carry keys beyond the ones shown here depending on the integration
that produced the conversation.
Groups (format: "group_chat")
format: "group_chat")Group conversations are assembled from participant and message records, so the
payload is stable and every field below is documented.
{
"chat_id": "1203630*******@g.us",
"channel": "whatsapp",
"is_group": true,
"conversation_type": "group",
"processing_status": "approved",
"participants": [
{
"id": "5511*****[email protected]",
"type": "contact",
"name": "Maria Almeida",
"push_name": "Maria Almeida",
"first_seen_at": "2026-05-20T14:28:41Z"
},
{
"id": "5511*****[email protected]",
"type": "agent",
"name": "Ana Silva",
"phone": "5511*****5678",
"user_id": 15,
"first_seen_at": "2026-05-20T14:29:02Z"
}
],
"messages": [
{
"id": "3EB0A1B2C3D4E5F6",
"sender": "5511*****[email protected]",
"timestamp": "2026-05-20T14:30:00Z",
"type": "text",
"text": "Bom dia! Conseguem me enviar a proposta?",
"transcription": null,
"url": null
},
{
"id": "3EB0F1E2D3C4B5A6",
"sender": "5511*****[email protected]",
"timestamp": "2026-05-20T14:31:05Z",
"type": "audio",
"text": null,
"transcription": "Bom dia, Maria. Já estou enviando a proposta agora.",
"url": "https://media.example.com/audio/3EB0F1E2D3C4B5A6.ogg"
}
]
}Conversation fields
| Field | Type | Description |
|---|---|---|
chat_id | string | The conversation's ID on the originating platform |
channel | string | Source of the conversation (e.g. whatsapp) |
is_group | boolean | true for a group, false for a direct message |
conversation_type | string | "group" or "direct" |
processing_status | string | "pending", "approved" or "denied". A group only reaches this payload as pending or approved, since a denied group returns chat: null |
Participant fields
| Field | Type | Description |
|---|---|---|
id | string | The participant's ID on the originating platform |
type | string | contact (external person), agent (a MeetRox user's own number), participant (member not resolved to either), bot |
name | string | null | Display name. Falls back to push_name when no explicit name is known |
push_name | string | null | Name as set by the participant on WhatsApp |
phone | string | null | Phone number, when known |
first_seen_at | string | null | ISO 8601 datetime of the participant's first message in this conversation |
user_id | integer | Present only when the participant is a MeetRox user. Matches the id in the Users endpoint |
Participants are deduplicated by id, so each person appears once no matter how
many messages they sent.
Message fields
| Field | Type | Description |
|---|---|---|
id | string | Message ID from the originating platform |
sender | string | Identifies the sender. Matches a participant's id |
timestamp | string | ISO 8601 datetime of when the message was sent |
type | string | text, image, video, document or audio |
text | string | null | Text content. null for media messages |
transcription | string | null | What the media said or showed, produced by MeetRox. null for text messages, and for media not yet processed |
url | string | null | Link to the media file. null for text messages |
Messages are returned oldest first, with a stable tiebreaker for messages
delivered within the same second, so the order does not change between requests.
Media without
transcriptionis media without content. Aurlalone tells
you a file was exchanged, not what was in it. If you are feeding conversations
into search, analytics or an AI pipeline, readtranscriptionas the content of
audio and image messages.
Updated 12 days ago
