Mission Tests
Run freeform mission tests against an IVR. A mission test places a real call, drives the conversation against a sector and mission you specify, and writes the verdict to a structured run record. Long-running. Poll the run id to track status.
7 endpoints
Real-time updates
The platform UI subscribes to a WebSocket gateway for live status as runs complete. The WebSocket gateway is Cognito-authenticated and not exposed to API-key callers. Poll GET /testing/mission-tests/{id} or GET /testing/compliance-reports/{phoneNumber} for status from the SDK.
Language codes
The language field on these endpoints takes one of the call-language codes below. Omit it and the call is held in English, so en and omitting the field mean the same thing. multi is for a call that switches between languages — an English greeting, then Spanish. Anything not in this table is rejected with a 400.
| Code | Language |
|---|---|
| en | English(default) |
| multi | More than one language |
| es | Spanish |
| fr | French |
| de | German |
| it | Italian |
| pt | Portuguese |
| nl | Dutch |
| hi | Hindi |
| ru | Russian |
| ja | Japanese |
These are not the standard-test and mapping transcription codes. That list is wider and regional — en-GB and the like are rejected here, and a bare code from this table is rejected there. See the Testing or Mapping page for the transcription list.
Start a mission test
/testing/mission-testsCreate and launch a freeform mission test. Long-running. Poll the returned id for status.
Body Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| sector | string | required | Sector key from the catalogue (e.g. "banking", "healthcare") |
| mission | string | required | The objective the agent should pursue on the call |
| acceptance | string | required | Acceptance criteria used to grade the run |
| language | string | optional | Language the call is held in, e.g. es, fr, or multi for a call that switches language. Listed in full under Language codes at the top of this page — any other value is rejected with a 400. Omit it and the call is held in English. These are the mission-test call languages, not the wider regional transcription codes used by standard tests and mapping: en-GB is rejected here |
| profile | object | required | Caller profile to drive the conversation |
| └ phoneNumber | string | required | Phone number to dial in E.164 format (e.g. +441234567890) |
| └ name | string | optional | Optional caller display name |
Request
curl -X POST -H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"sector":"banking","mission":"Reset my online banking password","acceptance":"Agent verifies identity and resets password","profile":{"phoneNumber":"+441234567890"}}' \
https://api.nopaque.co.uk/testing/mission-testsResponse
{
"id": "mtr_abc123",
"kind": "freeform",
"sector": "banking",
"mission": "Reset my online banking password",
"acceptance": "Agent verifies identity and resets password",
"profile": {
"phoneNumber": "+441234567890"
},
"status": "queued",
"createdAt": "2026-05-06T12: 00: 00Z"
}List mission tests
/testing/mission-testsList mission test runs in the workspace, newest first. Every filter is applied server-side across the full history, so keep paging with nextCursor until it is absent. Filters combine: a run must match all of them. The SDKs page for you. `passed` is true or false once a run has been judged, and absent while it is in progress or if it was cancelled.
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| configId | string | optional | Only runs launched from this mission test config (its id). Runs started without a saved config never match. |
| q | string | optional | Text search on the run's mission or sector, not case-sensitive (max 200 characters) |
| phoneNumber | string | optional | Runs whose called number contains these digits (e.g. 3301900 matches +443301900164) |
| tags | string | optional | Comma-separated tags. Runs whose config has any of these tags. |
| kind | string | optional | freeform (mission runs) or compliance. Omit for both. |
| limit | number | optional | Maximum items per page, 1-200 (default 50) |
| cursor | string | optional | nextCursor from the previous response, to fetch the next page |
Request
curl -H "x-api-key: YOUR_API_KEY" \
"https://api.nopaque.co.uk/testing/mission-tests?configId=mtc_abc123"Response
{
"runs": [
{
"id": "mtr_abc123",
"workspaceId": "ws_abc123",
"testType": "mission",
"status": "completed",
"configId": "mtc_abc123",
"phoneNumber": "+441234567890",
"sector": "healthcare",
"mission": "Book a COVID vaccination for tomorrow afternoon",
"acceptance": "Agent confirms a COVID vaccination slot",
"passed": true,
"startedAt": "2026-05-06T12: 00: 00Z",
"completedAt": "2026-05-06T12: 03: 41Z"
}
],
"nextCursor": "eyJpZCI6Im10cl9hYmMxMjMifQ"
}Get mission test defaults
/testing/mission-tests/defaultsGet the default sector, mission, and acceptance values used to seed an ad-hoc run. Returns 503 with errorCode CATALOG_NOT_READY until the mission-tester service has published its SSM payload.
Request
curl -H "x-api-key: YOUR_API_KEY" \
https://api.nopaque.co.uk/testing/mission-tests/defaultsResponse
{
"sector": "banking",
"mission": "Reset my online banking password",
"acceptance": "Agent verifies identity and resets password"
}Get a mission test
/testing/mission-tests/{id}Get a single mission test run by id. Poll this endpoint to track status.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | Mission test run id |
Request
curl -H "x-api-key: YOUR_API_KEY" \
https://api.nopaque.co.uk/testing/mission-tests/mtr_abc123Response
{
"id": "mtr_abc123",
"kind": "freeform",
"sector": "banking",
"mission": "Reset my online banking password",
"acceptance": "Agent verifies identity and resets password",
"profile": {
"phoneNumber": "+441234567890"
},
"status": "completed",
"verdict": "pass",
"createdAt": "2026-05-06T12: 00: 00Z",
"completedAt": "2026-05-06T12: 05: 00Z"
}Cancel a mission test
/testing/mission-tests/{id}/cancelCancel an in-flight mission test run.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | Mission test run id |
Request
curl -X POST -H "x-api-key: YOUR_API_KEY" \
https://api.nopaque.co.uk/testing/mission-tests/mtr_abc123/cancelResponse
{
"id": "mtr_abc123",
"status": "cancelled",
"cancelledAt": "2026-05-06T12: 03: 00Z"
}List voices
/testing/voicesThe voices a mission test may speak in, and which one is the default. Pass a `voiceId` from here as `voiceId` on a mission test config, or to Generate a voice clip (Audio). `defaultVoiceId` is the voice used when none is chosen; it is sent so clients never hardcode it. `hasSample` says whether Get a voice sample has a preview to play. Cached for 60 seconds.
Request
curl -H "x-api-key: YOUR_API_KEY" \
https://api.nopaque.co.uk/testing/voicesResponse
{
"voices": [
{
"voiceId": "Telnyx.Ultra.0ee8beaa-6a0b-4c3e-9f1d-2b7c5e4a8d61",
"name": "Amelia",
"language": "en-GB",
"accent": "British",
"gender": "female",
"provider": "Telnyx",
"label": "Warm, clear and conversational",
"isDefault": true,
"hasSample": true
}
],
"defaultVoiceId": "Telnyx.Ultra.0ee8beaa-6a0b-4c3e-9f1d-2b7c5e4a8d61"
}Get a voice sample
/testing/voices/{voiceId}/sampleA short-lived presigned URL for an MP3 preview of one voice. Separate from List voices because that list is cached and a URL inside it could expire. Call it only when someone asks to hear a voice, and only for a voice whose `hasSample` is true. Sent with `cache-control: no-store`. 404 when the voice is not enabled, has gone from the catalogue, or has no sample yet; treat all three the same. The published SDKs (0.13.0) have no method for this, so the sample is curl only.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| voiceId | string | required | An enabled voice id from List voices |
Request
curl -H "x-api-key: YOUR_API_KEY" \
https://api.nopaque.co.uk/testing/voices/Telnyx.Ultra.0ee8beaa-6a0b-4c3e-9f1d-2b7c5e4a8d61/sampleResponse
{
"url": "https://<bucket>.s3.eu-west-2.amazonaws.com/voice-samples/Telnyx.Ultra.0ee8beaa-6a0b-4c3e-9f1d-2b7c5e4a8d61.mp3?X-Amz-Signature=...",
"expiresInSecs": 60
}