Response Schema
Shape of job objects, summaries, signals, and audio quality.
The Amplifier API produces two response shapes:
- Model jobs (
POST /v2/models/{model_name}/analyze) — multi-sign result with asummarywrapper, asignals[]array,audio_quality, andextended_metrics. See Model API. - Sign jobs (
POST /v2/signs/{sign_name}/analyze) — single-signal result with a singularsignalobject andaudio_quality. See Sign API.
Both endpoints return the full job object immediately (job_id, status: queued, result: null). Retrieve the completed result with GET /v2/jobs/{job_id}, or receive it via webhook.
When a request fails, the API returns a JSON object with code, message, and status — see Errors.
For workflow and display rules, see Interpreting Results.
Model response
Analyze submit and GET /v2/jobs/{job_id} share the same job envelope. At submit time status is queued and result is null. The table below is the canonical field list.
Job response
GET /v2/jobs/{job_id} returns the job status and, when complete, the full analysis result.
| Field | Type | Description |
|---|---|---|
job_id |
string | Unique job identifier. |
status |
string | Job status: queued, running, done, failed, or timed-out. See Enumerations. |
created_at |
string | ISO 8601; fractional seconds and timezone designator vary. See Timestamps. |
completed_at |
string or null | ISO 8601; null while queued or running. Semantics for done versus failed and timed-out: Timestamps and Job status: failed. |
job_type |
string | "model" or "sign". |
api_version |
string | "v2". |
audio_content_type |
string | MIME type of the submitted audio. |
audio_size_bytes |
integer | Size in bytes of the submitted audio as accepted and processed for this job. |
audio_duration_seconds |
number | Duration of the submitted audio in seconds. |
audio_sample_rate |
integer or null | Sample rate in Hz. |
model_name |
string or null | Named model (e.g. "pulse") when this is a model job; otherwise null. |
sign_name |
string or null | Named sign (e.g. "stress") when this is a sign job; otherwise null. |
result |
object or null | Full analysis when status is done. When failed or timed-out, typically null. See Job status: failed. |
Both model_name and sign_name may appear on the same object. Treat the unused discriminator as null; do not require it to be omitted.
Note
statusis one ofqueued,running,done,failed, ortimed-out. Nullable fields —completed_at,result,audio_sample_rate, and the unused discriminator — may benull.
result contains:
| Field | Type | Description |
|---|---|---|
summary |
object | Aggregated result across all signals. |
signals |
array | Per-sign results, one entry per sign in the model bundle. |
audio_quality |
object | Recording quality scores and detected issue codes. |
extended_metrics |
array | Per-metric wellness scores for the model. Empty array when no metrics are configured. |
{
"job_id": "189bce4a-52cb-4e60-8586-cef89e719109",
"status": "done",
"created_at": "2026-02-22T09:14:00Z",
"completed_at": "2026-02-22T09:14:03Z",
"job_type": "model",
"api_version": "v2",
"model_name": "pulse",
"sign_name": null,
"audio_content_type": "audio/wav",
"audio_size_bytes": 876032,
"audio_duration_seconds": 27.4,
"result": {
"summary": { ... },
"signals": [ ... ],
"audio_quality": { ... },
"extended_metrics": [ ... ]
}
}
Timestamps
Type: created_at and completed_at are ISO 8601 datetimes; RFC 3339–compatible parsing is recommended.
Variability: The API may return:
- A timezone designator:
Z(UTC) or numeric offset±hh:mm, or omit the designator in some responses. - Fractional seconds at variable precision (milliseconds, microseconds, and so on).
UTC: Values with a Z suffix are UTC. When no offset appears, treat the timestamp as UTC.
Client guidance: Use a standard ISO 8601-compatible datetime parser. Prefer parsing over string comparison, and allow for a varying number of fractional digits.
Both of these forms are valid.
With Z, no fractional seconds:
"created_at": "2026-02-22T09:14:00Z",
"completed_at": "2026-02-22T09:14:03Z"
With fractional seconds, no Z:
"created_at": "2026-03-28T01:05:35.943000",
"completed_at": "2026-03-28T01:05:38.120500"
Job status: failed
This section covers both terminal outcomes that end without a result: failed and timed-out.
When status is "failed" or "timed-out", processing ended without a result. For a valid job_id on your account, GET /v2/jobs/{job_id} still returns 200 OK with a job object — these outcomes are expressed in status, not via a 4xx HTTP code.
Poll until status is done, failed, or timed-out, then branch:
done:resultcontains the full analysis.failed:resultis typicallynull;completed_atmay also benull. For the failure reason, check your operational logs or contact support — the job object does not include a structured error code.timed-out: processing did not complete in time;resultandcompleted_atarenull. Submit a new job to retry.
404 Not Found applies when the job is unknown or belongs to a different account — see Jobs API.
summary object
result.summary is the primary object for routing decisions. Read it first.
| Field | Type | Description |
|---|---|---|
overall_level |
string | Highest level across all signals: none, low, consider, moderate, elevated, or inconclusive. See Signal levels. |
recommended_action |
string | Highest-priority action: none, monitor, consider, review, escalate, or inconclusive. See Recommended action logic. |
flagged_count |
integer | Count of signals where flagged: true. |
primary_signals |
string[] | Top 1–3 name values by score, descending (matches signals[].name). |
description |
object | Narrative summary plus vocal_features. See description object. |
overall_level reflects the highest level value across all signals in the bundle. recommended_action is derived from the full distribution of signal levels — not from overall_level alone. See Recommended action logic for the derivation.
{
"overall_level": "elevated",
"recommended_action": "escalate",
"flagged_count": 3,
"primary_signals": ["stress", "anxiety", "fatigue"],
"description": {
"summary": "Voice patterns suggest elevated indicators for stress and anxiety...",
"vocal_features": [ ... ]
}
}
signals array
signals contains one entry per sign in the model bundle.
| Field | Type | Description |
|---|---|---|
name |
string | External sign name. See Sign Catalog. |
label |
string | Human-readable model name. |
score |
number | Raw confidence score, 0.0–1.0. Keep for internal use; use level for display. For the score-to-level mapping, see Signal levels. |
level |
string | Quantized level: none, low, consider, moderate, elevated, or inconclusive. |
flagged |
boolean | true when level is consider, moderate, or elevated. |
[
{"name": "stress", "label": "Stress", "score": 0.81, "level": "elevated", "flagged": true},
{"name": "anxiety", "label": "Anxiety", "score": 0.71, "level": "elevated", "flagged": true},
{"name": "fatigue", "label": "Fatigue", "score": 0.54, "level": "consider", "flagged": true}
]
For display rules and field usage guidance, see Display guidelines.
description object
description is nested inside summary. It contains a machine-generated plain-text summary and a structured array of annotated vocal feature values.
| Field | Type | Description |
|---|---|---|
summary |
string | LLM-generated plain-text description of the acoustic findings. Not a diagnostic assessment. |
vocal_features |
array | Annotated acoustic feature values that informed the summary. See vocal_features array. |
Surface description in care-staff interfaces. For the full display rules, see Display guidelines.
vocal_features array
Each entry in vocal_features describes a single acoustic measurement extracted from the recording.
| Field | Type | Description |
|---|---|---|
feature |
string | Canonical feature identifier (e.g. speech_rate, voice_shimmer, pitch_mean). See Speech feature IDs. |
label |
string | Human-readable feature name (e.g. "Speech Rate", "Voice Shimmer", "Average Pitch"). |
value |
number | Measured value for this recording. |
unit |
string | Unit of measurement (e.g. "dB", "syllables/s", "Hz"). |
value_interpretation |
string | Interpretation relative to reference range: "within range", "slightly elevated", "high", "reduced", or "low". |
{
"summary": "Voice patterns suggest elevated stress and fatigue indicators...",
"vocal_features": [
{
"feature": "speech_rate",
"label": "Speech Rate",
"value": 3.2,
"unit": "syllables/s",
"value_interpretation": "reduced"
},
{
"feature": "voice_shimmer",
"label": "Voice Shimmer",
"value": 0.041,
"unit": "dB",
"value_interpretation": "slightly elevated"
}
]
}
audio_quality object
audio_quality scores the recording and lists issue codes. Use them to keep the result or re-record. File metadata is on the job: audio_size_bytes, audio_duration_seconds, audio_content_type.
| Field | Type | Description |
|---|---|---|
issues |
string[] | Detected quality issue codes. Empty array means no issues. See Audio quality issue codes for the full list and recommended actions. |
voice_percentage |
number or null | Percentage of the recording containing active speech (0–100). A value of 0 means no speech was detected; 100 means the full recording contains active speech. Values below 30 typically correspond to an insufficient_speech issue. |
audio_clarity |
number or null | Background noise quality score (0–100), derived from SI-SDR (Scale-Invariant Signal-to-Distortion Ratio). Higher values indicate a clearer recording with less background noise. Values below 50 typically correspond to a high_background_noise issue. |
issues, voice_percentage, and audio_clarity are coherent: when a score is below its threshold, the corresponding issue code will typically be present in issues.
{
"issues": [],
"voice_percentage": 82.4,
"audio_clarity": 74.1
}
Example with quality issues detected:
{
"issues": ["high_background_noise", "insufficient_speech"],
"voice_percentage": 21.3,
"audio_clarity": 38.6
}
When issues is non-empty, signals may still be returned. Use the issue codes to decide whether to act on the result or re-record — see Audio quality issue codes for the recommended action for each code.
extended_metrics array
extended_metrics contains wellness metric scores derived from the voice recording. The set of metrics returned depends on the model. For metric definitions, see Extended Metrics.
| Field | Type | Description |
|---|---|---|
metric_id |
string | Canonical metric identifier (e.g. anxious-mood, vad-valence). See Extended metric IDs. |
label |
string | Human-readable metric name (e.g. "Anxious Mood", "Emotional Valence"). |
score_mean |
number | Mean score, 0.0–1.0. |
score_std |
number | Standard deviation of the score, 0.0–1.0. |
low_anchor |
string | Verbal anchor describing the state at score ≈ 0 (e.g. "tranquil"). |
high_anchor |
string | Verbal anchor describing the state at score ≈ 1 (e.g. "panicked"). |
[
{
"metric_id": "anxious-mood",
"label": "Anxious Mood",
"score_mean": 0.72,
"score_std": 0.08,
"low_anchor": "tranquil",
"high_anchor": "panicked"
},
{
"metric_id": "vad-valence",
"label": "Emotional Valence",
"score_mean": 0.38,
"score_std": 0.05,
"low_anchor": "negative",
"high_anchor": "positive"
}
]
Sign response
POST /v2/signs/{sign_name}/analyze returns the same job object envelope (see Job response above), but with job_type: "sign", a non-null sign_name, model_name typically null, and a structurally different result interior.
The result object uses a singular signal object instead of summary plus signals[]:
{
"job_id": "4a8f12c9-e7b2-4d3a-9f1c-8b6d2e5a7c0f",
"status": "done",
"job_type": "sign",
"api_version": "v2",
"model_name": null,
"sign_name": "stress",
"result": {
"signal": { ... },
"audio_quality": { ... }
}
}
signal object
signal is a single object, not an array, containing the full result for the requested sign. Where the model response places description and recommended_action on the summary wrapper, the sign response places them directly on signal.
| Field | Type | Description |
|---|---|---|
name |
string | External sign name. See Sign Catalog. |
label |
string | Human-readable sign name. |
score |
number | Raw confidence score, 0.0–1.0. Keep for internal use; use level for display. For the score-to-level mapping, see Signal levels. |
level |
string | Quantized level: none, low, consider, moderate, elevated, or inconclusive. |
flagged |
boolean | true when level is consider, moderate, or elevated. |
recommended_action |
string | Action for this sign: none, monitor, consider, review, escalate, or inconclusive. |
description |
object | Narrative summary plus vocal_features. Same schema as the description object. |
recommended_action is derived from this sign’s level alone — not aggregated across a bundle. See Recommended action logic.
description contains an LLM-generated plain-text summary of the acoustic findings and a structured vocal_features array. The same display rules apply: surface it in care-staff interfaces. On the inconclusive path, summary contains a standard inconclusive message and vocal_features is empty.
{
"name": "stress",
"label": "Stress",
"score": 0.81,
"level": "elevated",
"flagged": true,
"recommended_action": "escalate",
"description": {
"summary": "Voice patterns suggest elevated stress indicators...",
"vocal_features": [
{
"feature": "speech_rate",
"label": "Speech Rate",
"value": 3.2,
"unit": "syllables/s",
"value_interpretation": "reduced"
}
]
}
}
Use job_type to select the correct result parser:
job_type |
Result shape |
|---|---|
model |
summary plus signals[] (model bundle) |
sign |
singular signal object |
For display rules, see Display guidelines.