API Reference
Base URL, authentication, limits, and the endpoint map.
| Resource | What it does |
|---|---|
| Model API | List named bundles, get one bundle, or submit audio to a bundle. When the job is done, result has summary, signals[], audio_quality, and extended_metrics. |
| Sign API | List standalone signs, get one sign, or submit audio for one sign. When done, result has signal and audio_quality. |
| Jobs API | List jobs on the account, or retrieve one job (including its completed result). |
| Audio Uploads | Mint a signed PUT URL (upload_ref + required_headers), PUT the file, then pass that ref as audio_upload_ref on analyze instead of multipart audio. |
| Groups API | Create, list, and delete groups; add or remove jobs. Does not run analysis. |
| Longitudinal API | Analyze into a group (raw or vs history); read a subject’s trajectory; read a cohort aggregate. |
| Account API | Set the account webhook; read remaining credits. API keys are created in the console, not via these endpoints. |
Analyze calls are asynchronous: they return a job immediately. Read it from Jobs API or a webhook — Jobs, Polling, and Webhooks.
Base URL
https://api.amplifierhealth.com
Endpoints use the /v2 prefix — for example /v2/models/pulse/analyze.
Authentication
All requests require two headers.
| Header | Description |
|---|---|
X-Account-ID |
Your account identifier |
X-API-Key |
Your API key |
Sign up at console.amplifierhealth.com, open the console, and create an API key: API Keys → Provide Name for Key → Create Key. Your account ID is shown in the console. See Quickstart for the full walkthrough.
curl -X GET "https://api.amplifierhealth.com/v2/account/credits" \
-H "X-Account-ID: your-account-id" \
-H "X-API-Key: your-api-key"const response = await fetch("https://api.amplifierhealth.com/v2/account/credits", {
headers: {
"X-Account-ID": process.env.AMPLIFIER_ACCOUNT_ID,
"X-API-Key": process.env.AMPLIFIER_API_KEY,
},
});
const data = await response.json();# Requires httpx: pip install httpx
import os
import httpx
response = httpx.get(
"https://api.amplifierhealth.com/v2/account/credits",
headers={
"X-Account-ID": os.environ["AMPLIFIER_ACCOUNT_ID"],
"X-API-Key": os.environ["AMPLIFIER_API_KEY"],
},
)
data = response.json()Request and response conventions
- All endpoints return JSON.
- Analyze endpoints accept
Content-Type: multipart/form-data. JSON bodies:POST /v2/audio/uploads, Groups create/membership, andPOST /v2/account/webhook. GET endpoints have no body. - Analyze submit and
GET /v2/jobs/{job_id}return HTTP200with a job object.POST /v2/groupsreturns201 Created. Trajectory and aggregate GETs return arunning/doneenvelope, not a job — see Longitudinal API. - A job’s outcome is in
status(queued,running,done,failed,timed-out), not only HTTP codes. See Jobs API. - Field definitions: Response Schema. Enumerated values: Enumerations.
- Errors: HTTP status plus JSON
code,message, andstatus. See Errors.
Model versions
Note The
model_versionparameter is available starting November 5, 2026.
A model version names the release of the analysis models that scores your audio. Versions are written X.Y.Z with digits only, for example 2.0.0. Two versions are available: 2.0.0 and 2.1.0. 2.0.0 is the default.
Pin a version
To pin a request (fix it to one version), send the optional model_version form field on an analyze call.
| You send | What happens |
|---|---|
No model_version, or an empty value |
The current default version (2.0.0) runs. Requests you already send behave exactly as before. |
model_version=2.0.0 |
That version runs. |
| Any other value | The request is rejected with 400 and one of the error codes below. No job is created. |
The value must be three numbers separated by dots. A v prefix (v2.0.0), two-part versions (2.0), and surrounding spaces are rejected.
The field is accepted on these analyze calls:
POST /v2/models/{model_name}/analyzePOST /v2/signs/{sign_name}/analyze- The four group analyze calls:
POST /v2/models/{model_name}/groups/{group_id}/analyzeandPOST /v2/signs/{sign_name}/groups/{group_id}/analyze, each also with the/longitudinalsuffix. See Longitudinal API.
Read the version on a job
Every job response and webhook payload includes model_version: the version the job was submitted with. If you omitted the field, it holds the default version that ran. It is null for jobs created before model versions were introduced. See Response Schema.
Groups
A group’s model version is fixed when the group is created and never changes. Create a group with the optional model_version field on POST /v2/groups, or let the first analyze call into a new group_id create it: that call’s model_version, if sent, becomes the group’s version. If neither sends one, the group gets the current default version. Groups created before November 10, 2026 stay on 2.0.0.
On a group call, model_version is optional. Omitted means the group’s version. A different version returns 400 GROUP_VERSION_MISMATCH. Adding existing jobs with POST /v2/groups/{group_id}/jobs is rejected the same way if any listed job ran on a different version than the group. GET /v2/groups returns each group’s model_version.
Model version errors
All of these are 400 responses. They are not transient, so do not retry them unchanged. A rejected request creates no job.
| Code | Cause | What to do |
|---|---|---|
INVALID_MODEL_VERSION |
The value is not in X.Y.Z form. |
Send three dot-separated numbers, or omit the field. |
UNKNOWN_MODEL_VERSION |
The value is well formed but is not an available version. The message lists the available versions. |
Use a version from the message, or omit the field. |
GROUP_VERSION_MISMATCH |
A group call sent a model_version that is not the group’s version, or POST /v2/groups/{group_id}/jobs listed jobs that ran on a different version than the group. |
Omit model_version on group calls, or send the group’s version. Remove the listed jobs from the add request. |
GROUP_UNSUPPORTED_MODEL_VERSION |
Deprecated. The API no longer returns this code. Group calls now return GROUP_VERSION_MISMATCH. The code name stays reserved for one more release. |
None. |
Exact message text is on Errors.
Release 2.1.0
Note Release 2.1.0 is available now. Send
model_version=2.1.0on the single-audio analyze calls to use it. The default is still2.0.0.
| Date | What happens |
|---|---|
| November 6, 2026 | 2.1.0 became available. Send model_version=2.1.0 to use it. The default stays 2.0.0. |
| November 6 to November 18, 2026 | Requests that send no model_version run 2.0.0. |
| November 18, 2026 | 2.1.0 becomes the default. Requests that send no model_version run 2.1.0. |
Results can differ between 2.0.0 and 2.1.0 for the same audio. From November 18, 2026, calls that send no model_version get 2.1.0. To stay on 2.0.0, send model_version=2.0.0 on every analyze call.
What changes in 2.1.0:
- Two new optional form fields for the speaker’s age and sex. Requests without them still work.
- No new use cases, conditions, models, or signs. The catalog is the same as in
2.0.0. - No response field or enumeration value changes.
Speaker age and sex
| Field | Type | Values | Meaning |
|---|---|---|---|
provided_age |
number | 0 to 130 |
The speaker’s age in years. A number outside that range returns 400. |
provided_sex |
string | female or male |
The speaker’s sex assigned at birth. Send exactly female or male, in lowercase — any other spelling returns 400. |
Both fields are optional. Send either one, both, or neither. They are accepted on every analyze call:
POST /v2/models/{model_name}/analyzePOST /v2/signs/{sign_name}/analyze- The four group analyze calls on the Longitudinal API.
They need model version 2.1.0 or later. A request that sends either field and runs 2.0.0 returns 400 and creates no job. For a group call, that means the group is on 2.0.0. Send model_version=2.1.0 with them on single-audio calls. provided_age and provided_sex work on groups pinned to 2.1.0 or later. A bad value returns 400 on any version. The codes are PARAM_REQUIRES_MODEL_VERSION, INVALID_PROVIDED_AGE, and INVALID_PROVIDED_SEX — see Errors.
Group calls follow the group’s version, so you do not need to send model_version with these fields. To use them in a group, create the group with model_version 2.1.0. Groups pinned to 2.0.0 reject them.
Compatibility
The parameter is additive. Requests that do not send model_version are unchanged. One case differs: if your client already sent a form field named model_version, the API ignored it before. It is now validated, so a value that is not an available version in X.Y.Z form returns 400.
Limits
| Limit | Value |
|---|---|
| Maximum audio file size | 32 MB per upload |
| Maximum audio duration | 20 minutes (1200 seconds) |
| Minimum audio duration | 15 seconds |
| Supported formats | WAV, FLAC, MP3, M4A |
For longer recordings, MP3 or FLAC typically keep file size under the 32 MB limit. See Audio Requirements for recording guidance.
Rate limits
The API enforces per-account rate limits using a sliding 60-second window. Limits vary by rate limit plan:
| Plan | General endpoints | Upload / analyze endpoints | Job status polling |
|---|---|---|---|
| Standard (default) | 10 requests/min | 5 requests/min | 30 requests/min |
| Enterprise | 1,000 requests/min | 500 requests/min | 1,000 requests/min |
Upload / analyze endpoints: POST /v2/audio/uploads; POST /v2/models/{model_name}/analyze; POST /v2/signs/{sign_name}/analyze; the four group-aware analyze routes on the Longitudinal API (.../analyze and .../analyze/longitudinal for models and signs).
Job status polling: GET /v2/jobs/{job_id} has its own limit, sized for the recommended 2–5 second polling cadence described in Jobs, Polling, and Webhooks.
General endpoints (everything else documented here): catalog reads (GET /v2/models, GET /v2/signs, and their {name} variants), GET /v2/jobs, GET /v2/account/credits, POST /v2/account/webhook, Groups API lifecycle and membership, and GET /v2/groups/{group_id}/longitudinal plus GET /v2/groups/{group_id}/aggregate.
When a rate limit is exceeded, the API returns 429 Too Many Requests with a Retry-After header indicating seconds until the window resets. See Errors for retry guidance.
To request rate limit changes, contact sales@amplifierhealth.com.
Endpoints by resource
| Page | Endpoints |
|---|---|
| Model API | GET /v2/models, GET /v2/models/{model_name}, POST /v2/models/{model_name}/analyze |
| Sign API | GET /v2/signs, GET /v2/signs/{sign_name}, POST /v2/signs/{sign_name}/analyze |
| Jobs API | GET /v2/jobs, GET /v2/jobs/{job_id} |
| Groups API | POST /v2/groups, GET /v2/groups, DELETE /v2/groups/{group_id}, GET /v2/groups/{group_id}/jobs, POST /v2/groups/{group_id}/jobs, DELETE /v2/groups/{group_id}/jobs/{job_id} |
| Longitudinal API | POST .../groups/{group_id}/analyze, POST .../analyze/longitudinal (model and sign), GET /v2/groups/{group_id}/longitudinal, GET /v2/groups/{group_id}/aggregate |
| Account API | POST /v2/account/webhook, GET /v2/account/credits |
| Audio Uploads | POST /v2/audio/uploads |
Shared lookups: Response Schema, Enumerations, Errors.