Action Triggers
To access the Configs tab, you’ll need the project-view-configs permission,
which is available to users with the Config Manager role or other roles that
include this permission.
Action Triggers allow you to automate responses when test runs complete in Nexus. Unlike run triggers that initiate test executions, action triggers are activated when a test run ends and perform outbound actions based on the test results. This enables you to integrate test outcomes into your broader development workflow, such as notifying external systems, updating status dashboards, or triggering downstream processes.
Nexus currently supports outbound webhook action triggers, which call external HTTP endpoints with test run result data. Below you’ll find detailed documentation for configuring webhook actions.
Outbound Webhook
Outbound Webhook action triggers call external HTTP endpoints when a test run completes. When a test run finishes, Nexus will automatically send a POST request with a JSON body containing information about the test run to your configured endpoint.
Configuration Options
There are two configuration options for outbound webhooks:
-
URL: The endpoint that will receive the POST request with test run data as a JSON body.
-
Secret: An optional secret token used to validate webhook deliveries and ensure they are coming from Nexus. This works the same way as GitHub’s webhook validation , but uses the
X-Nexus-Signature-256header instead. Nexus generates an HMAC hex digest using your secret token and the payload contents, which you can verify on your server to confirm the authenticity of the webhook delivery.
You can press the toggle button to enable or disable the action trigger at any time. This is useful when you want to temporarily pause webhook executions without deleting the trigger configuration.
Example Request
When a test run completes, we will send a POST request similar to this:
POST /your-endpoint HTTP/1.1
Host: your-domain.com
...
Content-Type: application/json
X-Nexus-Signature-256: sha256=<hmac_hex_digest>
...{
"projectId": "your-project",
"jobId": "00000000-0000-0000-0000-000000000001",
"multiplayerRunId": "abcdefghijk",
"compositeRunId": "abcdefghijk-1",
"testPlanExecutionId": null,
"multiplayerState": {
"runState": "COMPLETED",
"totalPlayers": 2,
"finishedPlayers": 2,
"pendingPlayers": 0
},
"runResult": "SUCCESS",
"bugLabel": "NO_BUG",
"startedBy": {
"type": "user",
"value": {
"user_id": "00000000-0000-0000-0000-000000000002"
}
},
"platformInfo": {
"kind": "android-native",
"config": {
"device": {
"name": "Pixel 9 Pro XL",
"os_version": "15"
}
}
},
"tags": [],
"buildId": "00000000-0000-0000-0000-000000000003",
"startTime": "2025-09-03T16:00:12.802+02:00",
"endTime": "2025-09-03T16:23:25.416+02:00",
"duration": "PT1392.614S",
"testPlanId": null,
"multiplayerTestVersionId": "00000000-0000-0000-0000-000000000004",
"compositeTestVersionId": "00000000-0000-0000-0000-000000000005",
"playerNumber": 1,
"report": "...",
"artifacts": [
{
"filename": "deliverables/custom-report.json",
"url": "https://bouncer.nunu.ai/runs/abcdefghijk-1/artifacts/deliverables/custom-report.json",
"size": 523,
"uploaded": "2025-09-03T14:23:05.683Z",
"etag": "00000000000000000000000000000001"
},
{
"filename": "device_log.log",
"url": "https://bouncer.nunu.ai/runs/abcdefghijk-1/artifacts/device_log.log",
"size": 1048576,
"uploaded": "2025-09-03T14:23:05.735Z",
"etag": "00000000000000000000000000000002"
},
{
"filename": "recording.mp4",
"url": "https://bouncer.nunu.ai/runs/abcdefghijk-1/artifacts/recording.mp4",
"size": 298183654,
"uploaded": "2025-09-03T14:23:17.630Z",
"etag": "00000000000000000000000000000003"
}
]
}Payload Fields
The webhook payload contains the following fields:
| Field | Type | Description |
|---|---|---|
| Core Identifiers | ||
projectId | string | The unique identifier of the project this test run belongs to. |
jobId | uuid | The unique identifier for this specific test run job. |
multiplayerRunId | string | The unique identifier for the multiplayer run this player run belongs to. |
compositeRunId | string | A composite identifier combining multiple run information. |
testPlanExecutionId | uuid | null | The unique identifier for the test plan execution if this run was part of a test plan. Will be null for standalone test runs. |
testPlanId | uuid | null | The unique identifier for the test plan if this run was part of a test plan. Will be null for standalone test runs. |
| Test Results | ||
multiplayerState | object | Current aggregate state for the multiplayer run. Contains runState (string: the multiplayer run state, one of INITIALIZING, RUNNING, or COMPLETED — for outbound webhooks this is always COMPLETED), totalPlayers (number: Total players in the multiplayer run), finishedPlayers (number: Players that have finished), and pendingPlayers (number: Players still pending). |
runResult | string | The outcome of the test run. Possible values: SUCCESS (Test completed successfully), MAX_STEPS (Test ran out of execution time and was forcefully stopped), STOPPED (Test was stopped by a user), ERROR (Test encountered an error). |
bugLabel | string | Classification of any bugs found during the test run. Possible values: UNDECIDED (Bug presence is undetermined), NO_BUG (No bugs detected), LIKELY_NO_BUG (Likely not a bug, but not certain), LIKELY_BUG (Likely a bug, but not confirmed), DEFINITELY_BUG (Confirmed bug present). |
| Execution Context | ||
startedBy | object | Information about who or what initiated the test run. Contains type (string: the type of initiator, one of user, trigger, bot, api, or unknown) and value (object: additional details about the initiator — user runs contain a user_id, trigger runs contain a trigger_id, api runs contain a key_id, bot runs contain a details object, and unknown has no value). |
platformInfo | object | Details about the platform where the test was executed. Contains kind (string: the platform type, one of android-native, android-native-private, android-native-nunu, android-emulator-cloud, android-emulator-nunu, ios-native, ios-native-private, ios-simulator-nunu, windows-vm, windows-native, or xbox) and config (object: platform-specific configuration details, such as the device or input method — see the example payload above). |
tags | array | An array of string tags associated with this test run for organization and filtering. |
buildId | string | null | The unique identifier of the game build used for this test run, if any. |
| Timing Information | ||
startTime | string | null | ISO 8601 timestamp indicating when the test run started, including timezone offset. |
endTime | string | null | ISO 8601 timestamp indicating when the test run completed, including timezone offset. |
duration | string | null | The total duration of the test run in ISO 8601 duration format (e.g., PT1392.614S represents 1392.614 seconds). |
| Test Configuration | ||
multiplayerTestVersionId | uuid | The unique identifier for the version of the multiplayer test configuration used. |
compositeTestVersionId | uuid | The unique identifier for the version of the composite test configuration used. |
playerNumber | number | For multiplayer tests, indicates which player number this run represents. |
report | string | null | The final run report (if available). |
| Artifacts | ||
artifacts | array | An array of artifact objects generated during the test run. Each artifact object contains: filename (string: The name and path of the artifact file), url (string: A direct URL to download the artifact, can be accessed with cookies from an active nexus session or an api key valid for the run’s project with no permissions required), size (number: The size of the artifact in bytes), uploaded (string: ISO 8601 timestamp of when the artifact was uploaded), etag (string: An entity tag for cache validation and version tracking). |