Skip to main content

EchoIQ API

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

  1. Go to Admin SettingsEchoIQDevelopers.

  2. Generate an Access Key and Access Key Secret.

  3. 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

X-RateLimit-Limit

Maximum requests allowed during the current minute

X-RateLimit-Remaining

Requests remaining in the current minute

X-RateLimit-Reset

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 cursor as the cursor query parameter to retrieve the next page.

  • When cursor is absent or null, you have reached the last page.

  • currentPageSize indicates the number of records returned in the current page. The page size is 100.

  • totalRecords may 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 Z suffix, 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, and meta.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

400 Bad Request

Malformed request

Invalid parameter value

401 Unauthorized

Auth failed

Missing/bad header, unknown/revoked key, wrong secret

404 Not Found

Resource not found

Unknown id, or a resource belonging to another organization (deliberately indistinguishable)

409 Conflict

Conflict

(Key management) An active key already exists

422 Unprocessable Entity

Validation error

Bad query-param type/format

429 Too Many Requests

Rate limited

Over minute or day quota — see Retry-After

503 Service Unavailable

Upstream down

User roster source temporarily unreachable — see Retry-After

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

updated_after

ISO-8601 datetime

Returns recordings with an updatedAt strictly after this time. Used for incremental sync.

from

ISO-8601 datetime

Inclusive lower bound (>=) for the meeting's scheduledAt.

to

ISO-8601 datetime

Exclusive upper bound (<) for the meeting's scheduledAt.

cursor

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

id

UUID

The recording ID. Use the recording.id returned by the recordings list endpoint.

Media URLs

  • mediaUrls.* are short-lived presigned URLs with a default expiry of 15 minutes. The exact expiry time is provided in expiresAt.

  • 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 null and the recording status is processing.

  • Poll the endpoint until the recording status is ready before accessing the media.


GET /partner/recordings/{id}/transcript

Returns the speaker-attributed transcript for a recording.

  • startMs / endMs indicates the position of each utterance in milliseconds from the start of the recording.

  • transcriptStatus is processing while the transcript is being generated.

  • If the recording will not have a transcript, transcriptStatus may remain processing.

  • Poll the recording detail endpoint for its status before 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.

  • questionsAnswers contains extracted questions, the users who asked and answered them, and the corresponding answers.

  • Any metric may be null if it has not been computed for the recording.

  • While PII redaction is pending, analytics return empty shapes.


Data Models

Meta

Field

Type

Notes

requestId

string

Short correlation ID for the request.

timeRequiredMs

integer

Server processing time, in milliseconds.

code

integer

Mirrors the HTTP status code.

error

boolean

true on error, otherwise false.

message

string, nullable

Error reason on failure; null on success.

pagination

object, nullable

totalRecords (int, nullable), currentPageSize (int), cursor (string, nullable). List endpoints only.

It is present on every response.


Recording List

Field

Type

Notes

id

UUID

Recording ID

externalId

string

-

title

string

Meeting/recording title.

scheduledAt

datetime

Proposed meeting time

startedAt

datetime

Actual meeting time

durationSeconds

integer

Recording duration in seconds.

provider

string

meeting provider

scope

string

-

media

string

-

language

string

-

meetingUrl

string

-

ownerUserId

UUID

-

status

string

ready, processing, or failed.

updatedAt

datetime

Last modification (UTC). Use for incremental sync.

Recording detail

Field

Type

Notes

mediaUrls.audioUrl

string

-

mediaUrls.videoUrl

string

-

mediaUrls.thumbnailUrl

string

-

mediaUrls.expiresAt

datetime

-

participants[]

array

See Participant

Participant

Field

Type

Notes

name

string

-

email

string

-

affiliation

string

-

status

string

-

Transcript utterance

Field

Type

Notes

speaker

string

-

text

string

Utterance text

startMs

integer

-

endMs

integer

-

sentiment

string

-

Call Analytics

Field

Type

totalTalkSeconds

float

silenceSeconds

float

silencePercentage

float

speakerCount

integer

participantCount

integer

internalParticipantCount

integer

externalParticipantCount

integer

internalTalkPercentage

float

externalTalkPercentage

float

engagementScore

float

Speaker Analytics

Field

Type

name

string

affiliation

string

talkSeconds

float

talkPercentage

float

sentiment

string

questionCount

integer

interruptionCount

integer

fillerWordCount

integer

Question/Answer

Field

Type

question

string

askedBy

string

answeredBy

string

answer

string

User

Field

Type

Notes

id

UUID/string

Joins to recordings’ ownerUserId.

email

string

User Email ID

name

string

User Name

active

boolean

User Status

createdAt

datetime

When was the user created?


Field enumerations

Field

Allowed values

Recording status

ready, processing, failed

Recording media

video, audio, null

scope / affiliation

internal, external

transcriptStatus

ready, processing

sentiment

positive, negative, neutral, mixed, insufficient_data


Did this answer your question?