Skip to main content
This is an experimental v0 endpoint. While marked as experimental, this endpoint is considered stable and versioned and is meant to be backwards compatible. We’re actively collecting feedback on this endpoint and will be releasing v1 in the future. We highly recommend using our JavaScript SDK pollCiGreenlightStatus function directly. See @qawolf/ci-sdk
This API provides the results of a run into your CI/CD pipeline. This could be just for visibility, but often one would use the results to block (stop, rollback, or revert pending releases and environment promotions).

Request /api/v0/ci-greenlight/[root-run-id]

HTTP Method: GET

Sample Query

Shell
curl -X GET -H "Authorization: Bearer $apiKey" \
     "https://app.qawolf.com/api/v0/ci-greenlight/$rootRunId?outcomeWhenBlockingBugsInOtherWorkflows=red"
Go to https://app.qawolf.com/<team slug>/settings/integrationsOr, navigate via the UI:

Required Request Headers

Header NameHeader ValueDescription
AuthorizationBearer api_***Provide a string constructed by appending your team API Key to Bearer.

Optional Query Parameters

Parameter nameAllowed valuesDescription
outcomeWhenBlockingBugsInOtherWorkflowsgreen or redEXPERIMENTAL! Defaults to green. When set to red, greenlight will be false when blocking bugs were found in the environment that were affecting workflows not executed in this run.

Response

Those responses refer to the “run” terminology that is used in the UI, it is synonymous for “suite” in the deploy_success webhook.

200 Response (CI Greenlight status)

The response looks like this:
JSON
{
  "blockingBugsCount": 0,
  "greenlight": true,
  "nonBlockingBugsCount": 2,
  "relevantRunId": "***",
  "relevantRunUrl": "https://***",
  "relevantRunWithBugsUrl": "https://***",
  "rootRunId": "***",
  "rootRunUrl": "https://***",
  "runStage": "completed",
  "workflowsDisabledAfterRunCount": 0,
  "workflowsInRunCount": 50,
  "workflowsUnderInvestigationCount": 0,
  "reproducedBugs": [
    {
      "applicationUrl": "https://***",
      "externalIssue": {
        "applicationUrl": "https://***",
        "externalIssueId": "***",
        "platform": "linear"
      },
      "isBlocking": false,
      "isNew": false,
      "name": "Bug 1",
      "number": 1,
      "priority": "low"
    },
    {
      "applicationUrl": "https://***",
      "externalIssue": {
        "applicationUrl": "https://***",
        "externalIssueId": "***",
        "platform": "linear"
      },
      "isBlocking": false,
      "isNew": true,
      "name": "Bug 2",
      "number": 2,
      "priority": "medium"
    }
  ]
}

FieldDescription
greenlightIndicates if the relevant run outcome signals safety to release.
relevantRunIdSee Superseding Logic section below.
relevantRunUrlThe application URL to the relevant run.
relevantRunWithBugsUrlThe application URL to the relevant run, with workflows diagnosed as bug filtered out.
rootRunIdSee Superseding Logic section below.
rootRunUrlThe application URL to the root run.
runStageOne of "initializing" , “underReview” , "completed" and "canceled". See Run Stages section below.
workflowsDisabledAfterRunCountNumber of workflows disabled after the review process is completed. This may happen when runs are put under maintenance, but should be relatively rare.
workflowsInRunCountNumber of workflows in this run.
workflowsUnderInvestigationCountNumber of failed workflows requiring investigation.
blockingBugsCount *The number of blocking bugs found or reproduced after review. Present only when runStage is "completed".
nonBlockingBugsCount *The number of non-blocking bugs found or reproduced after review. Present only when runStage is "completed".
blockingBugUrls *An array of URLs to observe all blocking bugs (string).
nonBlockingBugUrls *An array of URLs to observe all non-blocking bugs (string).
reproducedBugs *A list of detailed bug objects.
* Those fields are only available in the "underReview" and "completed" run stages.

Interpreting the greenlight field

The greenlight field will be only true when:
  • runStage is "complete" (see Run Stages) AND;
  • Zero non-blocking bugs were found.
The blocking status is determined by the priority bug field. To be blocking, priority has to be at least "high" or unset. Newly found bugs have an unset priority and hence are counted as blocking by default. One can lower the priority of the bug to a non-blocking one in the UI, and then retry one’s “ci-greenlight” job, and it will pass.

HTTP Status Error Codes

CodeDescription
401Missing or invalid credentials. Make sure you are using the Authorization: Bearer XXX with XXX the API token for your team.
403Forbidden. Usually indicates a disabled team. Contact support.
404Run not found.
405Method not allowed. Make sure you use GET.
410Gone. That will show-up for old and legacy runs.
500Internal server error. If the issue persists, contact support.

Superseding Logic

Provided a rootRunId, this endpoint will look for superseding runs, and if found it will return the greenlight response for the most recent superseding run. This situation can be identified by comparing rootRunId and relevantRunId. If these are different, then we are looking at the superseding run greenlight status.
Superseding runs are identified by matching deduplication key. See the relevant documentation here: Deploy Success Webhook - Advanced Fields.
When polling, it is recommended to reuse the relevantRunId. This will result in faster queries as looking up the superseding run can slow down the response time.

Run Stages

The endpoint will return the current stage of the relevant run (replacing the root run with the relevant run as depicted in the Superseding Logic section above).
A canceled run cannot be recovered and polling should stop thereafter. It is the client discretion to decide whether to submit a new run or call for support.
Run (aka Suite) Stages Run (aka Suite) Stages ​
Last modified on February 9, 2026