Overview
The EchoIQ API provides authenticated access to EchoIQ meeting recordings, transcripts, analytics, and user information.
The API can be used to:
Retrieve meeting recordings
Download recording media
Retrieve meeting transcripts
Access call and speaker analytics
Retrieve question-and-answer pairs
All API endpoints are scoped to the organization associated with the API credentials.
Getting Started
Generate API Credentials
Go to Admin Settings → EchoIQ → Developers.
Generate an Access Key and Access Key Secret.
Store the credentials securely. The secret should not be exposed in client-side applications or source code.
Base URL
All endpoints are relative to this base URL:
https://api.app.getmaxiq.com/echoiq
Endpoint paths shown in this reference (e.g. /partner/recordings) are appended to it. For example, List recordings is: https://api.app.getmaxiq.com/echoiq/partner/recordings
Authentication
All Partner API endpoints require HTTP Basic Authentication.
Basic Auth Field | Value |
Username | Access Key |
Password | Access Secret |
The Authorization header must contain the Base64-encoded key:secret value:
Authorization: Basic <base64(key:secret)>
Rate Limits
Rate limits are enforced per organization. All API keys belonging to the same organization share the same quota.
Window | Default Limit |
Per minute | 60 requests |
Per day | 10,000 requests |
Successful responses include the following headers:
Header | Description |
| Maximum requests allowed during the current minute |
| Requests remaining in the current minute |
| Unix epoch timestamp when the current window resets |
When the rate limit is exceeded, the API returns 429 Too Many Requests with a Retry-After header.
Applications should wait for the specified duration or until the reset time before retrying.
Pagination & Incremental Sync
Cursor Pagination
List endpoints use cursor-based pagination through meta.pagination.
"meta": {
"requestId": "a1b2c3d4e5f6",
"timeRequiredMs": 57,
"code": 200,
"error": false,
"message": null,
"pagination": {
"totalRecords": 1284,
"currentPageSize": 100,
"cursor": "eyJ1IjoiMjAyNi0wOC0xMVQxMjozNDo1NiIsImkiOjkxMjN9"
}
}Pass the returned
cursoras thecursorquery parameter to retrieve the next page.When
cursoris absent or null, you have reached the last page.currentPageSizeindicates the number of records returned in the current page. The page size is 100.totalRecordsmay be null when the total count is unavailable, such as for the users endpoint. In this case, continue fetching pages until the cursor is null.Cursors are opaque tokens. Do not parse, modify, or generate them manually.
Dates, Times & Formatting Conventions
All timestamps use ISO-8601 format in UTC with an explicit
Zsuffix, e.g.2026-08-11T12:34:56Z.All response field names use camelCase.
Durations and metric times are in seconds, unless the field name ends in
Ms, which indicates milliseconds. For example,startMs,endMs, andmeta.timeRequiredMs.Query parameters that accept timestamps also use ISO-8601 format.
Empty query parameter values, such as
?from=, are treated as absent.
Errors
Errors use the same {meta, result} envelope. result is null; the failure is described in meta:
Status | Meaning | Typical Cause |
| Malformed request | Invalid parameter value |
| Auth failed | Missing/bad header, unknown/revoked key, wrong secret |
| Resource not found | Unknown id, or a resource belonging to another organization (deliberately indistinguishable) |
| Conflict | (Key management) An active key already exists |
| Validation error | Bad query-param type/format |
| Rate limited | Over minute or day quota — see |
| Upstream down | User roster source temporarily unreachable — see |
An empty result set is always 200 with an empty list — never a 404.
Endpoints
All endpoints require authentication. Every response includes meta.requestId, a short correlation ID that can be used when reporting issues to EchoIQ Support.
GET /partner/recordings
Returns recordings ordered by updatedAt in ascending order. Supports cursor pagination and incremental synchronization.
Query Parameters
Parameter | Type | Description |
| ISO-8601 datetime | Returns recordings with an |
| ISO-8601 datetime | Inclusive lower bound ( |
| ISO-8601 datetime | Exclusive upper bound ( |
| string | Opaque pagination token returned by a previous response. |
Recordings that are still pre-upload, mid-ingestion, or awaiting redaction are omitted from the list until they are viewable.
GET /partner/recordings/{id}
Fetches a single recording, including its participant roster and short-lived presigned media URLs.
Path Parameters
Parameter | Type | Description |
| UUID | The recording ID. Use the |
Media URLs
mediaUrls.*are short-lived presigned URLs with a default expiry of 15 minutes. The exact expiry time is provided inexpiresAt.Download the media promptly after retrieving the URLs.
To generate new URLs, call this endpoint again.
While PII redaction is being processed, media URLs are
nulland the recordingstatusisprocessing.Poll the endpoint until the recording status is
readybefore accessing the media.
GET /partner/recordings/{id}/transcript
Returns the speaker-attributed transcript for a recording.
startMs/endMsindicates the position of each utterance in milliseconds from the start of the recording.transcriptStatusisprocessingwhile the transcript is being generated.If the recording will not have a transcript,
transcriptStatusmay remainprocessing.Poll the recording detail endpoint for its
statusbefore proceeding.
GET /partner/recordings/{id}/analytics
Returns curated call-level and per-speaker analytics, along with extracted question-and-answer pairs.
Call- and speaker-level metrics include talk time, silence, participants, talk percentage, engagement, sentiment, questions, interruptions, and filler words.
questionsAnswerscontains extracted questions, the users who asked and answered them, and the corresponding answers.Any metric may be
nullif it has not been computed for the recording.While PII redaction is pending, analytics return empty shapes.
Data Models
Meta
Field | Type | Notes |
| string | Short correlation ID for the request. |
| integer | Server processing time, in milliseconds. |
| integer | Mirrors the HTTP status code. |
| boolean | true on error, otherwise false. |
| string, nullable | Error reason on failure; null on success. |
| object, nullable | totalRecords (int, nullable), currentPageSize (int), cursor (string, nullable). List endpoints only. |
It is present on every response.
Recording List
Field | Type | Notes |
| UUID | Recording ID |
| string | - |
| string | Meeting/recording title. |
| datetime | Proposed meeting time |
| datetime | Actual meeting time |
| integer | Recording duration in seconds. |
| string | meeting provider |
| string | - |
| string | - |
| string | - |
| string | - |
| UUID | - |
| string |
|
| datetime | Last modification (UTC). Use for incremental sync. |
Recording detail
Field | Type | Notes |
| string | - |
| string | - |
| string | - |
| datetime | - |
| array | See Participant |
Participant
Field | Type | Notes |
| string | - |
| string | - |
| string | - |
| string | - |
Transcript utterance
Field | Type | Notes |
| string | - |
| string | Utterance text |
| integer | - |
| integer | - |
| string | - |
Call Analytics
Field | Type |
| float |
| float |
| float |
| integer |
| integer |
| integer |
| integer |
| float |
| float |
| float |
Speaker Analytics
Field | Type |
| string |
| string |
| float |
| float |
| string |
| integer |
| integer |
| integer |
Question/Answer
Field | Type |
| string |
| string |
| string |
| string |
User
Field | Type | Notes |
| UUID/string | Joins to recordings’ |
| string | User Email ID |
| string | User Name |
| boolean | User Status |
| datetime | When was the user created? |
Field enumerations
Field | Allowed values |
Recording |
|
Recording |
|
|
|
|
|
|
|
