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.

    CodeLanguage
    enEnglish(default)
    multiMore than one language
    esSpanish
    frFrench
    deGerman
    itItalian
    ptPortuguese
    nlDutch
    hiHindi
    ruRussian
    jaJapanese

    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

    POST/testing/mission-tests

    Create and launch a freeform mission test. Long-running. Poll the returned id for status.

    Body Parameters

    NameTypeRequiredDescription
    sectorstringrequiredSector key from the catalogue (e.g. "banking", "healthcare")
    missionstringrequiredThe objective the agent should pursue on the call
    acceptancestringrequiredAcceptance criteria used to grade the run
    languagestringoptionalLanguage 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
    profileobjectrequiredCaller profile to drive the conversation
    └ phoneNumberstringrequiredPhone number to dial in E.164 format (e.g. +441234567890)
    └ namestringoptionalOptional caller display name

    Request

    bash
    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-tests

    Response

    json
    {
      "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

    GET/testing/mission-tests

    List 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

    NameTypeRequiredDescription
    configIdstringoptionalOnly runs launched from this mission test config (its id). Runs started without a saved config never match.
    qstringoptionalText search on the run's mission or sector, not case-sensitive (max 200 characters)
    phoneNumberstringoptionalRuns whose called number contains these digits (e.g. 3301900 matches +443301900164)
    tagsstringoptionalComma-separated tags. Runs whose config has any of these tags.
    kindstringoptionalfreeform (mission runs) or compliance. Omit for both.
    limitnumberoptionalMaximum items per page, 1-200 (default 50)
    cursorstringoptionalnextCursor from the previous response, to fetch the next page

    Request

    bash
    curl -H "x-api-key: YOUR_API_KEY" \
      "https://api.nopaque.co.uk/testing/mission-tests?configId=mtc_abc123"

    Response

    json
    {
      "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

    GET/testing/mission-tests/defaults

    Get 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

    bash
    curl -H "x-api-key: YOUR_API_KEY" \
      https://api.nopaque.co.uk/testing/mission-tests/defaults

    Response

    json
    {
      "sector": "banking",
      "mission": "Reset my online banking password",
      "acceptance": "Agent verifies identity and resets password"
    }

    Get a mission test

    GET/testing/mission-tests/{id}

    Get a single mission test run by id. Poll this endpoint to track status.

    Path Parameters

    NameTypeRequiredDescription
    idstringrequiredMission test run id

    Request

    bash
    curl -H "x-api-key: YOUR_API_KEY" \
      https://api.nopaque.co.uk/testing/mission-tests/mtr_abc123

    Response

    json
    {
      "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

    POST/testing/mission-tests/{id}/cancel

    Cancel an in-flight mission test run.

    Path Parameters

    NameTypeRequiredDescription
    idstringrequiredMission test run id

    Request

    bash
    curl -X POST -H "x-api-key: YOUR_API_KEY" \
      https://api.nopaque.co.uk/testing/mission-tests/mtr_abc123/cancel

    Response

    json
    {
      "id": "mtr_abc123",
      "status": "cancelled",
      "cancelledAt": "2026-05-06T12: 03: 00Z"
    }

    List voices

    GET/testing/voices

    The 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

    bash
    curl -H "x-api-key: YOUR_API_KEY" \
      https://api.nopaque.co.uk/testing/voices

    Response

    json
    {
      "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

    GET/testing/voices/{voiceId}/sample

    A 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

    NameTypeRequiredDescription
    voiceIdstringrequiredAn enabled voice id from List voices

    Request

    bash
    curl -H "x-api-key: YOUR_API_KEY" \
      https://api.nopaque.co.uk/testing/voices/Telnyx.Ultra.0ee8beaa-6a0b-4c3e-9f1d-2b7c5e4a8d61/sample

    Response

    json
    {
      "url": "https://<bucket>.s3.eu-west-2.amazonaws.com/voice-samples/Telnyx.Ultra.0ee8beaa-6a0b-4c3e-9f1d-2b7c5e4a8d61.mp3?X-Amz-Signature=...",
      "expiresInSecs": 60
    }