Documentation
Deployments
A deployment event records that a service was deployed: what, which version, where, when and how it ended. Recorded next to the alerts, it lets you and the insights see what changed before a burst of alerts.
What a deployment event is
A deployment belongs to a team. It names a service and a version, the environment it went to (production when you send none), when it started and finished, and its status. A pipeline sends one request when the deploy starts and one when it ends, with the same external_id, and the second updates the first.
The console shows them in the team’s Deployments tab and on the dashboard, and the AI insights read them next to the alerts.
Recording from a pipeline
Record with the team’s integration key, the same kind of key that sends alerts. Give each pipeline a key of its own, created for the team and kept as a repository or environment secret, so one can be revoked without stopping the others. A key records only its own team’s deployments.
printf 'Authorization: %s\n' "$IGNITEOPS_KEY" | curl --fail-with-body --retry 3 --retry-delay 5 \
-X POST "https://api.igniteops.io/v1/organizations/{org}/incident-management/{team}/deployments" \
-H @- \
-H "Content-Type: application/json" \
-d '{ "service": "checkout-api", "version": "2.14.0", "status": "succeeded", "external_id": "9123456789-1-checkout-api" }'curl reads the Authorization: ign_… line from its standard input, so the key never appears on a command line or in a file. In GitHub Actions, record the start before the deploy step and the end only when the deploy ran, with its outcome:
# .github/workflows/deploy.yml
- name: Record the deployment start
continue-on-error: true
env:
IGNITEOPS_KEY: ${{ secrets.IGNITEOPS_INTEGRATION_KEY }}
VERSION: ${{ github.sha }}
EXTERNAL_ID: ${{ github.run_id }}-${{ github.run_attempt }}-checkout-api
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
run: |
jq -n --arg version "$VERSION" --arg external_id "$EXTERNAL_ID" --arg url "$RUN_URL" \
'{service: "checkout-api", version: $version, status: "started", external_id: $external_id, url: $url}' > "$RUNNER_TEMP/deployment-body"
printf 'Authorization: %s\n' "$IGNITEOPS_KEY" | curl -sS --fail-with-body --retry 3 --retry-delay 5 \
-X POST "https://api.igniteops.io/v1/organizations/acme/incident-management/platform/deployments" \
-H @- -H "Content-Type: application/json" --data @"$RUNNER_TEMP/deployment-body" \
|| { echo; echo "::warning::The deployment start was not recorded in IgniteOps"; }
- name: Deploy
id: deploy
run: make deploy
- name: Record the deployment end
if: always() && (steps.deploy.outcome == 'success' || steps.deploy.outcome == 'failure')
continue-on-error: true
env:
IGNITEOPS_KEY: ${{ secrets.IGNITEOPS_INTEGRATION_KEY }}
VERSION: ${{ github.sha }}
STATUS: ${{ steps.deploy.outcome == 'success' && 'succeeded' || 'failed' }}
EXTERNAL_ID: ${{ github.run_id }}-${{ github.run_attempt }}-checkout-api
run: |
jq -n --arg version "$VERSION" --arg status "$STATUS" --arg external_id "$EXTERNAL_ID" \
'{service: "checkout-api", version: $version, status: $status, external_id: $external_id}' > "$RUNNER_TEMP/deployment-body"
printf 'Authorization: %s\n' "$IGNITEOPS_KEY" | curl -sS --fail-with-body --retry 3 --retry-delay 5 \
-X POST "https://api.igniteops.io/v1/organizations/acme/incident-management/platform/deployments" \
-H @- -H "Content-Type: application/json" --data @"$RUNNER_TEMP/deployment-body" \
|| { echo; echo "::warning::The deployment end was not recorded in IgniteOps"; }- One
external_idper attempt and per service. A re-run of a job is a new attempt, and a job that deploys several services records each under its own id. The same id again updates the recorded deployment and answers 200; a new one answers 201. - Resending is safe with an
external_id. Only a timeout, a 408, a 429 or a 5xx is worth retrying, and the retry lands on the same deployment. Without anexternal_idevery request records a new one, so a retry can record it twice. - A refusal never fails the deploy. The steps continue on error and leave a warning: a plan limit, a renamed team or a field the API refuses should not stop a release.
- A run cancelled or failed before the deploy records nothing, and a run cancelled during it stays
started(it readsunknownafter 24 hours).
The fields
| Field | Required | Meaning |
|---|---|---|
| service | Yes | What was deployed. Up to 100 characters. |
| version | Yes | The version deployed. Up to 100 characters. |
| environment | No | Where it went. production by default; up to 50 characters. |
| status | No | started, succeeded (the default), failed or rolled_back. |
| kind | No | deploy (the default), rollback, config, infra or feature_flag. |
| external_id | When status is started | Your id for this attempt. Up to 200 characters, no < or >. With another service or environment the same id is refused (409 external_id_conflict). |
| started_at, finished_at | No | RFC 3339 with an offset, at most a day ahead and 400 days back. The start defaults to the finish when only that is sent, else to now. A finish up to 5 minutes before the start is taken as the start; earlier is refused. |
| previous_version, triggered_by, description, repository, commit_sha, url | No | What a reader needs to find the change. url is an http or https link to the run. |
| tags | No | Up to 20 key and value pairs. |
A later request for the same deployment keeps its environment and kind unless it sends them.
Statuses and transitions
| Status | Meaning |
|---|---|
| started | The deploy began and its end is not recorded yet. |
| succeeded | It finished. |
| failed | It failed. |
| rolled_back | It was rolled back. |
| unknown | Shown, never sent: a started deployment that was not closed within 24 hours. |
A status only moves forward: started to succeeded, failed or rolled_back, and succeeded to rolled_back. A move backwards is refused with 409 invalid_transition.
The team list and the organization timeline
Every member of the organization can read deployments. A team’s list answers its deployments, and the organization timeline answers every team’s, both newest first:
GET …/incident-management/{team}/deployments?environment=production&status=failed&from=2026-11-01T00:00:00Z
GET /v1/organizations/{org}/deployments?service=checkout-api&limit=100- Filters:
service,environment,status(unknownincluded), andfrom/toon the start (RFC 3339). - Pages:
limitfrom 1 to 100 (50 by default), then the answer’snext_token. With filters a page can hold fewer deployments, or none, whilehas_moreis true: follownext_tokenuntil it is null. - Deployments are kept for 400 days.
In the console the team’s Deployments tab has the same filters, and the dashboard shows the organization’s last 7 days, the failed and rolled back ones marked.
Who can record, change and delete
| Action | Who |
|---|---|
| Read | Every member of the organization. |
| Record | The team’s integration key, or a member with the Responder role or above. |
| Change a recorded deployment | Its recorder, or a team or organization Owner or Manager, changes any field. Anyone else who may record moves the status and the finish and fills only the fields still empty. |
| Delete | A team or organization Owner or Manager. |
How the insights use deployments
On Pro, the AI insights read the deployments next to the alerts:
- Alerts after a deployment. When a team gets unusually many alerts in the hour after a deployment starts (at least 3, and at least twice its usual hourly rate over the week before), or its first P1 of that week, the insight names the deployment. The hour ends early at the next deployment of the same team and environment, whose alerts are its own.
- Change failure rate. Once a team has 10 deployments that ended in the last 30 days, the share that failed or was rolled back is reported from 15%, and as a warning from 30%. A deployment still
starteddoes not count. - The weekly review includes the week’s changes and the change failure rate.
The insights read the service, version, environment, status and times, never the description, the link or the tags.
Limits
| Free | Pro | |
|---|---|---|
| New deployments per day, per organization | 100 (UTC day) | Unlimited |
| Updates of a recorded deployment | Never counted | Never counted |
| Retention | 400 days | 400 days |
Past the Free plan’s daily cap a new deployment is refused with 402 plan_limit_reached and the key deployments_per_day; the pipeline step above leaves a warning and the deploy goes on. See plans and limits.