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
/testing/load-testsCreate a new load test configuration.
Body Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | required | Display name for the load test |
| configId | string | required | Test configuration ID to use as the base flow |
| concurrency | number | required | Number of concurrent calls |
| totalCalls | number | required | Total number of calls to make |
Request
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-testsResponse
{
"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
/testing/load-testsList all load test configurations in the workspace.
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| limit | number | optional | Maximum items to return (default 50) |
| nextToken | string | optional | Pagination token from previous response |
Request
curl -H "x-api-key: YOUR_API_KEY" \
https://api.nopaque.co.uk/testing/load-testsResponse
{
"configs": [
{
"id": "lt_abc123",
"name": "Peak Load Test",
"concurrency": 10,
"totalCalls": 100,
"status": "created"
}
]
}Get a load test
/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
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | Load test ID |
Request
curl -H "x-api-key: YOUR_API_KEY" \
https://api.nopaque.co.uk/testing/load-tests/lt_abc123Response
{
"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
/testing/load-tests/{id}Update a load test configuration.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | Load test ID |
Body Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | optional | Updated display name |
| concurrency | number | optional | Updated concurrency level |
| totalCalls | number | optional | Updated total call count |
Request
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_abc123Response
{
"config": {
"id": "lt_abc123",
"concurrency": 20,
"updatedAt": "2026-04-10T12: 10: 00Z"
}
}Delete a load test
/testing/load-tests/{id}Delete a load test configuration.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | Load test ID |
Request
curl -X DELETE -H "x-api-key: YOUR_API_KEY" \
https://api.nopaque.co.uk/testing/load-tests/lt_abc123Response
{
"message": "Load test deleted successfully"
}Estimate the cost of a load test
/testing/load-tests/estimateEstimate the cost and duration of a load test before running it.
Body Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| configId | string | required | Test configuration ID |
| concurrency | number | required | Number of concurrent calls |
| totalCalls | number | required | Total number of calls |
Request
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/estimateResponse
{
"estimatedMinutes": 15.5,
"estimatedCost": "$4.65",
"concurrency": 10,
"totalCalls": 100
}Start a load test
/testing/load-tests/{id}/startStart a load test run. Initiates concurrent calls according to the configuration.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | Load test ID |
Request
curl -X POST -H "x-api-key: YOUR_API_KEY" \
https://api.nopaque.co.uk/testing/load-tests/lt_abc123/startResponse
{
"id": "lt_abc123",
"runId": "ltrun_def456",
"status": "running",
"startedAt": "2026-04-10T12: 15: 00Z"
}Abort a load test
/testing/load-tests/{id}/abortAbort a running load test.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | Load test ID |
Request
curl -X POST -H "x-api-key: YOUR_API_KEY" \
https://api.nopaque.co.uk/testing/load-tests/lt_abc123/abortResponse
{
"id": "lt_abc123",
"status": "aborted",
"abortedAt": "2026-04-10T12: 20: 00Z"
}Get live load test status
/testing/load-tests/{id}/statusGet the current status and progress of a load test run.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | Load test ID |
Request
curl -H "x-api-key: YOUR_API_KEY" \
https://api.nopaque.co.uk/testing/load-tests/lt_abc123/statusResponse
{
"id": "lt_abc123",
"status": "running",
"progress": {
"completedCalls": 45,
"totalCalls": 100,
"passRate": 0.93
}
}List load test runs
/testing/load-tests/runsList all load test runs across all load tests in the workspace.
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| limit | number | optional | Maximum items to return (default 50) |
| nextToken | string | optional | Pagination token from previous response |
Request
curl -H "x-api-key: YOUR_API_KEY" \
https://api.nopaque.co.uk/testing/load-tests/runsResponse
{
"runs": [
{
"id": "ltrun_def456",
"loadTestId": "lt_abc123",
"status": "completed",
"passRate": 0.95
}
]
}Start a data export
/testing/load-tests/{id}/exportsStart 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
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | Load test run ID |
Request
curl -X POST -H "x-api-key: YOUR_API_KEY" \
https://api.nopaque.co.uk/testing/load-tests/77a87d5d-3c1e-4b8a-9f52-0d6e1a4c8b21/exportsResponse
{
"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
/testing/load-tests/{id}/exportsList the data exports of a load-test run.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | Load test run ID |
Request
curl -H "x-api-key: YOUR_API_KEY" \
https://api.nopaque.co.uk/testing/load-tests/77a87d5d-3c1e-4b8a-9f52-0d6e1a4c8b21/exportsResponse
{
"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
/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
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | Load test run ID |
| exportId | string | required | Export ID |
Request
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-2f6a1d9e7c40Response
{
"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
/testing/load-tests/{id}/failure-patternsGroup 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
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | Load-test run ID (the runId, not the load test ID) |
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| scope | string | optional | group (default): every lane started with this run. lane: this run only |
Request
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
{
"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
/testing/load-tests/{id}/failure-patterns/{patternId}/callsThe 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
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | Load-test run ID (the runId, not the load test ID) |
| patternId | string | required | P1 to P10 (with P2a-P2d and P7a), UNCLASSIFIED, or LATE_START |
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| scope | string | optional | group (default): every lane started with this run. lane: this run only |
| limit | number | optional | Calls per page (default 50) |
| cursor | string | optional | cursor from the previous page |
Request
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
{
"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
/testing/load-tests/{id}/failure-patterns/reclassifyRerun 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
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | Load-test run ID (the runId, not the load test ID) |
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| scope | string | optional | group (default): every lane started with this run. lane: this run only |
Request
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/reclassifyResponse
{
"jobId": "c2d4e6f8-1a3b-4c5d-8e9f-0a1b2c3d4e5f"
}Create a detailed report
/testing/reportsBuild 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
| Name | Type | Required | Description |
|---|---|---|---|
| loadTestRunIds | string[] | required | Finished load-test run IDs from your workspace, 1-20 |
| name | string | optional | Defaults to the first run's name ("<name> and N more" for several runs) |
| packs | string[] | optional | Which files to build: data, excel, pdf. Defaults to all three |
| includeAudio | boolean | optional | Include call recordings in the data pack |
Request
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/reportsResponse
{
"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
/testing/reportsThe workspace's detailed reports, newest first. Page with `cursor` until `nextCursor` is absent.
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| limit | number | optional | Reports per page (default 50) |
| cursor | string | optional | nextCursor from the previous page |
Request
curl -H "x-api-key: YOUR_API_KEY" \
"https://api.nopaque.co.uk/testing/reports?limit=50"Response
{
"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
/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
| Name | Type | Required | Description |
|---|---|---|---|
| reportId | string | required | Report ID, from Create a detailed report |
Request
curl -H "x-api-key: YOUR_API_KEY" \
https://api.nopaque.co.uk/testing/reports/9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6bResponse
{
"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
/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
| Name | Type | Required | Description |
|---|---|---|---|
| reportId | string | required | Report ID, from Create a detailed report |
| pack | string | required | data, excel or pdf |
Request
curl -H "x-api-key: YOUR_API_KEY" \
https://api.nopaque.co.uk/testing/reports/9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b/files/pdfResponse
{
"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
/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
| Name | Type | Required | Description |
|---|---|---|---|
| reportId | string | required | Report ID, from Create a detailed report |
Request
curl -X DELETE -H "x-api-key: YOUR_API_KEY" \
https://api.nopaque.co.uk/testing/reports/9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b