Load Testing

    Create and run load tests against IVR systems with configurable concurrency profiles. Estimate consumption before running. Afterwards, see why calls failed, grouped by pattern, and build detailed reports covering one or more runs.

    21 endpoints

    Create a load test

    POST/testing/load-tests

    Create a new load test configuration.

    Body Parameters

    NameTypeRequiredDescription
    namestringrequiredDisplay name for the load test
    configIdstringrequiredTest configuration ID to use as the base flow
    concurrencynumberrequiredNumber of concurrent calls
    totalCallsnumberrequiredTotal number of calls to make

    Request

    bash
    curl -X POST -H "x-api-key: YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"name":"Peak Load Test","configId":"cfg_abc123","concurrency":10,"totalCalls":100}' \
      https://api.nopaque.co.uk/testing/load-tests

    Response

    json
    {
      "config": {
        "id": "lt_abc123",
        "name": "Peak Load Test",
        "configId": "cfg_abc123",
        "concurrency": 10,
        "totalCalls": 100,
        "status": "created",
        "createdAt": "2026-04-10T12: 00: 00Z"
      }
    }

    List load tests

    GET/testing/load-tests

    List all load test configurations in the workspace.

    Query Parameters

    NameTypeRequiredDescription
    limitnumberoptionalMaximum items to return (default 50)
    nextTokenstringoptionalPagination token from previous response

    Request

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

    Response

    json
    {
      "configs": [
        {
          "id": "lt_abc123",
          "name": "Peak Load Test",
          "concurrency": 10,
          "totalCalls": 100,
          "status": "created"
        }
      ]
    }

    Get a load test

    GET/testing/load-tests/{id}

    Get a specific load test configuration by ID. The response spreads the config fields flat and includes a `testConfig` sibling with the referenced test configuration.

    Path Parameters

    NameTypeRequiredDescription
    idstringrequiredLoad test ID

    Request

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

    Response

    json
    {
      "id": "lt_abc123",
      "name": "Peak Load Test",
      "configId": "cfg_abc123",
      "concurrency": 10,
      "totalCalls": 100,
      "status": "created",
      "createdAt": "2026-04-10T12: 00: 00Z",
      "testConfig": {
        "id": "cfg_abc123",
        "name": "Base Flow"
      }
    }

    Update a load test

    PUT/testing/load-tests/{id}

    Update a load test configuration.

    Path Parameters

    NameTypeRequiredDescription
    idstringrequiredLoad test ID

    Body Parameters

    NameTypeRequiredDescription
    namestringoptionalUpdated display name
    concurrencynumberoptionalUpdated concurrency level
    totalCallsnumberoptionalUpdated total call count

    Request

    bash
    curl -X PUT -H "x-api-key: YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"concurrency":20}' \
      https://api.nopaque.co.uk/testing/load-tests/lt_abc123

    Response

    json
    {
      "config": {
        "id": "lt_abc123",
        "concurrency": 20,
        "updatedAt": "2026-04-10T12: 10: 00Z"
      }
    }

    Delete a load test

    DELETE/testing/load-tests/{id}

    Delete a load test configuration.

    Path Parameters

    NameTypeRequiredDescription
    idstringrequiredLoad test ID

    Request

    bash
    curl -X DELETE -H "x-api-key: YOUR_API_KEY" \
      https://api.nopaque.co.uk/testing/load-tests/lt_abc123

    Response

    json
    {
      "message": "Load test deleted successfully"
    }

    Estimate the cost of a load test

    POST/testing/load-tests/estimate

    Estimate the cost and duration of a load test before running it.

    Body Parameters

    NameTypeRequiredDescription
    configIdstringrequiredTest configuration ID
    concurrencynumberrequiredNumber of concurrent calls
    totalCallsnumberrequiredTotal number of calls

    Request

    bash
    curl -X POST -H "x-api-key: YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"configId":"cfg_abc123","concurrency":10,"totalCalls":100}' \
      https://api.nopaque.co.uk/testing/load-tests/estimate

    Response

    json
    {
      "estimatedMinutes": 15.5,
      "estimatedCost": "$4.65",
      "concurrency": 10,
      "totalCalls": 100
    }

    Start a load test

    POST/testing/load-tests/{id}/start

    Start a load test run. Initiates concurrent calls according to the configuration.

    Path Parameters

    NameTypeRequiredDescription
    idstringrequiredLoad test ID

    Request

    bash
    curl -X POST -H "x-api-key: YOUR_API_KEY" \
      https://api.nopaque.co.uk/testing/load-tests/lt_abc123/start

    Response

    json
    {
      "id": "lt_abc123",
      "runId": "ltrun_def456",
      "status": "running",
      "startedAt": "2026-04-10T12: 15: 00Z"
    }

    Abort a load test

    POST/testing/load-tests/{id}/abort

    Abort a running load test.

    Path Parameters

    NameTypeRequiredDescription
    idstringrequiredLoad test ID

    Request

    bash
    curl -X POST -H "x-api-key: YOUR_API_KEY" \
      https://api.nopaque.co.uk/testing/load-tests/lt_abc123/abort

    Response

    json
    {
      "id": "lt_abc123",
      "status": "aborted",
      "abortedAt": "2026-04-10T12: 20: 00Z"
    }

    Get live load test status

    GET/testing/load-tests/{id}/status

    Get the current status and progress of a load test run.

    Path Parameters

    NameTypeRequiredDescription
    idstringrequiredLoad test ID

    Request

    bash
    curl -H "x-api-key: YOUR_API_KEY" \
      https://api.nopaque.co.uk/testing/load-tests/lt_abc123/status

    Response

    json
    {
      "id": "lt_abc123",
      "status": "running",
      "progress": {
        "completedCalls": 45,
        "totalCalls": 100,
        "passRate": 0.93
      }
    }

    List load test runs

    GET/testing/load-tests/runs

    List all load test runs across all load tests in the workspace.

    Query Parameters

    NameTypeRequiredDescription
    limitnumberoptionalMaximum items to return (default 50)
    nextTokenstringoptionalPagination token from previous response

    Request

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

    Response

    json
    {
      "runs": [
        {
          "id": "ltrun_def456",
          "loadTestId": "lt_abc123",
          "status": "completed",
          "passRate": 0.95
        }
      ]
    }

    Start a data export

    POST/testing/load-tests/{id}/exports

    Start an export of every call and step of a finished load-test run. Returns 202 immediately; poll Get an export until status is ready. See Load-test export files for the contents.

    Path Parameters

    NameTypeRequiredDescription
    idstringrequiredLoad test run ID

    Request

    bash
    curl -X POST -H "x-api-key: YOUR_API_KEY" \
      https://api.nopaque.co.uk/testing/load-tests/77a87d5d-3c1e-4b8a-9f52-0d6e1a4c8b21/exports

    Response

    json
    {
      "export": {
        "exportId": "5b0e2c1a-9d4f-4e7a-8c3b-2f6a1d9e7c40",
        "runId": "77a87d5d-3c1e-4b8a-9f52-0d6e1a4c8b21",
        "status": "pending",
        "createdAt": "2026-04-10T12: 30: 00Z",
        "expiresAt": "2026-05-10T12: 30: 00Z"
      }
    }

    List exports

    GET/testing/load-tests/{id}/exports

    List the data exports of a load-test run.

    Path Parameters

    NameTypeRequiredDescription
    idstringrequiredLoad test run ID

    Request

    bash
    curl -H "x-api-key: YOUR_API_KEY" \
      https://api.nopaque.co.uk/testing/load-tests/77a87d5d-3c1e-4b8a-9f52-0d6e1a4c8b21/exports

    Response

    json
    {
      "exports": [
        {
          "exportId": "5b0e2c1a-9d4f-4e7a-8c3b-2f6a1d9e7c40",
          "runId": "77a87d5d-3c1e-4b8a-9f52-0d6e1a4c8b21",
          "status": "ready",
          "createdAt": "2026-04-10T12: 30: 00Z",
          "startedAt": "2026-04-10T12: 30: 02Z",
          "completedAt": "2026-04-10T12: 30: 40Z",
          "fileName": "loadtest-nhs-111-dental-77a87d5d-20261009-1005.zip",
          "sizeBytes": 482113,
          "counts": {
            "calls": 100,
            "steps": 640
          },
          "expiresAt": "2026-05-10T12: 30: 00Z"
        }
      ]
    }

    Get an export

    GET/testing/load-tests/{id}/exports/{exportId}

    Get one export. When status is ready the response includes a downloadUrl valid for 1 hour; request the export again for a fresh link.

    Path Parameters

    NameTypeRequiredDescription
    idstringrequiredLoad test run ID
    exportIdstringrequiredExport ID

    Request

    bash
    curl -H "x-api-key: YOUR_API_KEY" \
      https://api.nopaque.co.uk/testing/load-tests/77a87d5d-3c1e-4b8a-9f52-0d6e1a4c8b21/exports/5b0e2c1a-9d4f-4e7a-8c3b-2f6a1d9e7c40

    Response

    json
    {
      "export": {
        "exportId": "5b0e2c1a-9d4f-4e7a-8c3b-2f6a1d9e7c40",
        "runId": "77a87d5d-3c1e-4b8a-9f52-0d6e1a4c8b21",
        "status": "ready",
        "createdAt": "2026-04-10T12: 30: 00Z",
        "startedAt": "2026-04-10T12: 30: 02Z",
        "completedAt": "2026-04-10T12: 30: 40Z",
        "fileName": "loadtest-nhs-111-dental-77a87d5d-20261009-1005.zip",
        "sizeBytes": 482113,
        "counts": {
          "calls": 100,
          "steps": 640
        },
        "expiresAt": "2026-05-10T12: 30: 00Z",
        "downloadUrl": "https://<bucket>.s3.eu-west-2.amazonaws.com/exports/<workspaceId>/5b0e2c1a-9d4f-4e7a-8c3b-2f6a1d9e7c40/loadtest-nhs-111-dental-77a87d5d-20261009-1005.zip?X-Amz-Signature=..."
      }
    }

    Get failures by pattern

    GET/testing/load-tests/{id}/failure-patterns

    Group the calls of a load-test run that did not pass into named failure patterns: why each failed and who owns it (`platform`, `carrier`, `system-under-test`, `test-definition` or `unknown`). Each pattern has a count, its share of the failures, a per-lane breakdown, first and last seen, and up to five example call ids. `timeline` counts failures per pattern in 15-second buckets alongside the calls in flight. `lateStarts` counts calls whose system under test first spoke late, passed or not. Calls not yet classified count as `UNCLASSIFIED`; for a run from before failure patterns, call Reclassify failure patterns first.

    Path Parameters

    NameTypeRequiredDescription
    idstringrequiredLoad-test run ID (the runId, not the load test ID)

    Query Parameters

    NameTypeRequiredDescription
    scopestringoptionalgroup (default): every lane started with this run. lane: this run only

    Request

    bash
    curl -H "x-api-key: YOUR_API_KEY" \
      "https://api.nopaque.co.uk/testing/load-tests/77a87d5d-3c1e-4b8a-9f52-0d6e1a4c8b21/failure-patterns?scope=group"

    Response

    json
    {
      "runId": "77a87d5d-3c1e-4b8a-9f52-0d6e1a4c8b21",
      "groupId": null,
      "scope": "group",
      "rulesVersion": 3,
      "totalCalls": 100,
      "failedCalls": 7,
      "unclassified": 1,
      "lateStarts": 4,
      "lateStartsPassed": 1,
      "patterns": [
        {
          "id": "P4",
          "label": "Late answer, straight to hold",
          "owner": "system-under-test",
          "description": "The IVR answered but started speaking late, then went to hold music before its first prompt finished.",
          "count": 4,
          "share": 0.5714,
          "byLane": {
            "77a87d5d-3c1e-4b8a-9f52-0d6e1a4c8b21": 4
          },
          "firstSeen": "2026-04-10T12: 04: 15Z",
          "lastSeen": "2026-04-10T12: 11: 30Z",
          "examples": [
            "call_0012",
            "call_0031",
            "call_0047",
            "call_0080"
          ]
        }
      ],
      "timeline": {
        "bucketSecs": 15,
        "buckets": [
          {
            "t": "2026-04-10T12: 04: 15Z",
            "inFlight": 20,
            "counts": {
              "P4": 1
            }
          }
        ]
      },
      "lanes": [
        {
          "runId": "77a87d5d-3c1e-4b8a-9f52-0d6e1a4c8b21",
          "name": "NHS 111 dental"
        }
      ]
    }

    List the calls in a failure pattern

    GET/testing/load-tests/{id}/failure-patterns/{patternId}/calls

    The calls of the run (or its group) in one failure pattern, oldest first, with the lane, the failed step and the evidence that put each call in the pattern. `LATE_START` lists the calls whose system under test first spoke late, passed or not. Page with `cursor` until it is absent.

    Path Parameters

    NameTypeRequiredDescription
    idstringrequiredLoad-test run ID (the runId, not the load test ID)
    patternIdstringrequiredP1 to P10 (with P2a-P2d and P7a), UNCLASSIFIED, or LATE_START

    Query Parameters

    NameTypeRequiredDescription
    scopestringoptionalgroup (default): every lane started with this run. lane: this run only
    limitnumberoptionalCalls per page (default 50)
    cursorstringoptionalcursor from the previous page

    Request

    bash
    curl -H "x-api-key: YOUR_API_KEY" \
      "https://api.nopaque.co.uk/testing/load-tests/77a87d5d-3c1e-4b8a-9f52-0d6e1a4c8b21/failure-patterns/P4/calls?limit=50"

    Response

    json
    {
      "items": [
        {
          "callId": "call_0012",
          "runId": "77a87d5d-3c1e-4b8a-9f52-0d6e1a4c8b21",
          "laneName": "NHS 111 dental",
          "startedAt": "2026-04-10T12: 04: 15Z",
          "failedStepIndex": 1,
          "failedStepName": "Main menu",
          "evidence": {
            "firstSpokeSecs": 9.2,
            "heard": "music",
            "heardBasis": "heard"
          },
          "recordingAvailable": true
        }
      ],
      "cursor": "eyJrIjoiY2FsbF8wMDEyIn0"
    }

    Reclassify failure patterns

    POST/testing/load-tests/{id}/failure-patterns/reclassify

    Rerun the current failure-pattern rules over every call of a finished run (by default its whole group) in the background, with the latest call data, and update each call's pattern and the run's counts. Use it for runs from before failure patterns, and after a rule or threshold change. Returns 202 at once with a `jobId`. No calls are placed. 409 when a run in scope has not finished.

    Path Parameters

    NameTypeRequiredDescription
    idstringrequiredLoad-test run ID (the runId, not the load test ID)

    Query Parameters

    NameTypeRequiredDescription
    scopestringoptionalgroup (default): every lane started with this run. lane: this run only

    Request

    bash
    curl -X POST -H "x-api-key: YOUR_API_KEY" \
      https://api.nopaque.co.uk/testing/load-tests/77a87d5d-3c1e-4b8a-9f52-0d6e1a4c8b21/failure-patterns/reclassify

    Response

    json
    {
      "jobId": "c2d4e6f8-1a3b-4c5d-8e9f-0a1b2c3d4e5f"
    }

    Create a detailed report

    POST/testing/reports

    Build a detailed report covering up to 20 finished load-test runs in your workspace. A report has up to three files ("packs"): `data` (a zip of every record, CSVs, recordings and a manual), `excel` (a workbook with summary charts, every call and step, and failures) and `pdf` (a written report). Returns 202 with a `pending` report; the build runs in the background, usually in a few minutes. Poll Get a detailed report until `status` is `ready` (or `failed`), then fetch each file with Get a report file download link. No calls are placed. 409 when a run has not finished.

    Body Parameters

    NameTypeRequiredDescription
    loadTestRunIdsstring[]requiredFinished load-test run IDs from your workspace, 1-20
    namestringoptionalDefaults to the first run's name ("<name> and N more" for several runs)
    packsstring[]optionalWhich files to build: data, excel, pdf. Defaults to all three
    includeAudiobooleanoptionalInclude call recordings in the data pack

    Request

    bash
    curl -X POST -H "x-api-key: YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"loadTestRunIds":["77a87d5d-3c1e-4b8a-9f52-0d6e1a4c8b21"],"packs":["excel","pdf"]}' \
      https://api.nopaque.co.uk/testing/reports

    Response

    json
    {
      "report": {
        "reportId": "9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b",
        "name": "NHS 111 dental",
        "kind": "load-test-runs",
        "loadTestRunIds": [
          "77a87d5d-3c1e-4b8a-9f52-0d6e1a4c8b21"
        ],
        "packs": [
          "excel",
          "pdf"
        ],
        "includeAudio": false,
        "status": "pending",
        "createdAt": "2026-04-10T13: 30: 00Z",
        "files": []
      }
    }

    List detailed reports

    GET/testing/reports

    The workspace's detailed reports, newest first. Page with `cursor` until `nextCursor` is absent.

    Query Parameters

    NameTypeRequiredDescription
    limitnumberoptionalReports per page (default 50)
    cursorstringoptionalnextCursor from the previous page

    Request

    bash
    curl -H "x-api-key: YOUR_API_KEY" \
      "https://api.nopaque.co.uk/testing/reports?limit=50"

    Response

    json
    {
      "reports": [
        {
          "reportId": "9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b",
          "name": "NHS 111 dental",
          "kind": "load-test-runs",
          "loadTestRunIds": [
            "77a87d5d-3c1e-4b8a-9f52-0d6e1a4c8b21"
          ],
          "packs": [
            "data",
            "excel",
            "pdf"
          ],
          "includeAudio": false,
          "status": "ready",
          "createdAt": "2026-04-10T13: 30: 00Z",
          "startedAt": "2026-04-10T13: 30: 03Z",
          "completedAt": "2026-04-10T13: 32: 41Z",
          "counts": {
            "runs": 1,
            "calls": 100,
            "steps": 640,
            "recordings": 0
          },
          "files": [
            {
              "pack": "data",
              "fileName": "nhs-111-dental-data.zip",
              "sizeBytes": 482113,
              "contentType": "application/zip"
            },
            {
              "pack": "excel",
              "fileName": "nhs-111-dental.xlsx",
              "sizeBytes": 220416,
              "contentType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
            },
            {
              "pack": "pdf",
              "fileName": "nhs-111-dental-report.pdf",
              "sizeBytes": 1843200,
              "contentType": "application/pdf"
            }
          ]
        }
      ]
    }

    Get a detailed report

    GET/testing/reports/{reportId}

    `status` moves `pending` → `running` → `ready` (or `failed`, with `error`). While running, `progress` says what the build is doing. When `ready`, `files` lists each pack that was built.

    Path Parameters

    NameTypeRequiredDescription
    reportIdstringrequiredReport ID, from Create a detailed report

    Request

    bash
    curl -H "x-api-key: YOUR_API_KEY" \
      https://api.nopaque.co.uk/testing/reports/9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b

    Response

    json
    {
      "report": {
        "reportId": "9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b",
        "name": "NHS 111 dental",
        "kind": "load-test-runs",
        "loadTestRunIds": [
          "77a87d5d-3c1e-4b8a-9f52-0d6e1a4c8b21"
        ],
        "packs": [
          "data",
          "excel",
          "pdf"
        ],
        "includeAudio": false,
        "status": "ready",
        "createdAt": "2026-04-10T13: 30: 00Z",
        "startedAt": "2026-04-10T13: 30: 03Z",
        "completedAt": "2026-04-10T13: 32: 41Z",
        "counts": {
          "runs": 1,
          "calls": 100,
          "steps": 640,
          "recordings": 0
        },
        "files": [
          {
            "pack": "data",
            "fileName": "nhs-111-dental-data.zip",
            "sizeBytes": 482113,
            "contentType": "application/zip"
          },
          {
            "pack": "excel",
            "fileName": "nhs-111-dental.xlsx",
            "sizeBytes": 220416,
            "contentType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
          },
          {
            "pack": "pdf",
            "fileName": "nhs-111-dental-report.pdf",
            "sizeBytes": 1843200,
            "contentType": "application/pdf"
          }
        ]
      }
    }

    Get a report file download link

    GET/testing/reports/{reportId}/files/{pack}

    A pre-signed link to one file of a `ready` report, valid for 1 hour. Call again for a fresh link. 404 when the report is not ready or has no such file.

    Path Parameters

    NameTypeRequiredDescription
    reportIdstringrequiredReport ID, from Create a detailed report
    packstringrequireddata, excel or pdf

    Request

    bash
    curl -H "x-api-key: YOUR_API_KEY" \
      https://api.nopaque.co.uk/testing/reports/9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b/files/pdf

    Response

    json
    {
      "url": "https://<bucket>.s3.eu-west-2.amazonaws.com/reports/<workspaceId>/9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b/report.pdf?X-Amz-Signature=...",
      "fileName": "nhs-111-dental-report.pdf",
      "sizeBytes": 1843200,
      "expiresAt": "2026-04-10T13: 40: 00Z"
    }

    Delete a detailed report

    DELETE/testing/reports/{reportId}

    Permanently delete a finished report (`ready` or `failed`) and every file it built. This cannot be undone; the load-test runs it covered are not touched. Returns 204. 409 while the report is still `pending` or `running`. Reports are never deleted automatically.

    Path Parameters

    NameTypeRequiredDescription
    reportIdstringrequiredReport ID, from Create a detailed report

    Request

    bash
    curl -X DELETE -H "x-api-key: YOUR_API_KEY" \
      https://api.nopaque.co.uk/testing/reports/9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b