Skip to main content
Every endpoint below lives under https://sreagent.app and takes a POST. Replace <token> with your organization’s webhook token. You find the token, and a ready-made URL for each source, on Integrations, Webhooks tab.
The token is part of every URL and identifies your organization. Treat the URLs as credentials: anyone holding one can post alerts, deployments and cards into your organization.

Endpoints

Fix pull requests, including the Jira, Zoho Sprints and fix request routes, need the Business plan and the GitHub App installed. See Plan matrix.

How authentication works

The token in the URL decides which organization receives the request. A token that does not match any organization, or one whose organization is disabled, always gets the same 404 with “Invalid webhook token”, so the endpoint never confirms whether a token exists. Grafana, Datadog, New Relic and PagerDuty alerts must be signed once you have an approved runbook that runs automatically. Requests without a valid signature from those sources then answer 401. You set PagerDuty and GitHub signing secrets under Integrations, Webhooks tab. For Grafana, Datadog and New Relic, contact support to enable signing. Once a PagerDuty or GitHub secret is saved, every request must carry a matching signature or it is refused with 401. Without a saved secret, GitHub accepts requests on the token alone, and the tab shows a warning saying so. CloudWatch and CloudTrail deliver through SNS, which signs its own messages. When signature checking is enabled for your organization, an unsigned message or a direct alarm payload that did not come through SNS is refused.

Rotating the token

Choose Rotate token on the Webhooks tab to get a new URL. The old URL keeps working for 72 hours so you can move your senders over, then answers 404. Revoke now stops the old URL immediately.

Response codes

A request without a User-Agent header can be refused before it reaches SRE Agent. Set a User-Agent header, or contact support if it persists.

Ops board cards, updates and comments

The three ops board endpoints work on any plan, including Free. A card opened here lands in Triage with no author. Any status, source or author you send on create is ignored.

Open a card

Only title is required. A 201 answers with the card’s id, its key (for example OPS-12) and its url. priority is one of urgent, high, normal or low, and any other value becomes normal. assignee_email assigns the card when it matches a member of your organization and never invites anyone. Field sizes are on Limits.

Update a card or add a comment

Use either the card id or its key in the path. The key is matched without regard to case, and only within your organization.
An update sends only the fields you want to change. status is one of backlog, triage, todo, in_progress, blocked or done, and the usual synonyms work. won't do, wontfix and cancelled archive the card without counting it as done. An unknown status or priority on update answers 422 rather than guessing. A comment needs a body. author is a display name shown beside it and is not matched against your members.

Idempotency keys

Without a key, every POST opens a new card, and a sender that retries creates duplicates. To make a delivery safe to repeat, send your own id for it. A card accepts the id as an Idempotency-Key header or a dedup_key field in the body. If both are present, the header wins. When the body is an SNS notification, its message id is used automatically. A comment takes comment_id. The first delivery answers 201. Every repeat answers 200 with the same body and "duplicate": true, and nothing else happens: no second card, notification or Slack post. A key is up to 200 characters of letters, digits and . _ - : / + = @. Anything else, including a blank key, answers 422. Keys belong to your organization and never expire, so use a new key when you mean a new card.

Card endpoint responses

Deployments

event_type defaults to deploy and status to succeeded. You can also send previous_version, deployed_by, description, commit_sha, repo_full_name, pr_url, compare_url, run_url, branch, author, started_at and completed_at. Posting the same dedup_key again, for example from the start and the end of one CI run, updates the same timeline entry. A success answers 200 with {"status":"ok","id":"...","action":"..."}, and a payload that cannot be recorded answers 422.

Fix requests

Only description is required. service or repo pins the target repository. Sending the same dedup_key or ticket again replaces the earlier request instead of opening a second pull request. A 202 with {"status":"analyzing","id":"..."} means the request was queued, not that a pull request will follow. The result, a draft pull request or a decline with reasoning, appears in Control Tower. A 422 means it was refused before analysis, with a reason such as the GitHub App not being installed, a target that matches nothing you mapped, or five open pull requests already on that repository.

Jira

Jira answers 200 for an issue it accepts and for one it ignores, so Jira does not disable the webhook over a configuration problem. {"status":"ok"} means a fix pull request is being generated. {"status":"ignored"} carries the reason: the issue has no sre-agent-fix label, the GitHub App is not installed, the target matches nothing you mapped, or the repository is at its limit of open pull requests. A wrong token answers 404, and a payload with no summary answers 422.