> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sreagent.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Ops board webhook and tracker sync

> Post cards to the ops board from a script or workflow, and keep cards in step with Jira, Zoho Sprints or GitHub issues.

export const Plan = ({tier}) => <Badge color="blue">{tier} plan</Badge>;

This page covers the board's webhook intake, which every plan can use, and syncing cards with an external tracker. For the board itself, see [Track work on the ops board](/guides/respond/ops-board).

## Post a card from a webhook

<Plan tier="Free" />

One POST opens one card in **Triage**. Use it from a form, a script, a CI job or a Slack Workflow Builder step. Your webhook token is at the top of **Integrations**, **Webhooks**. It is the same token every other webhook uses, so keep it private.

```bash theme={null}
curl -X POST https://sreagent.app/webhooks/tickets/<token> \
  -H 'content-type: application/json' \
  -d '{
    "title": "Checkout latency is climbing again",
    "description": "Third night in a row, p99 above 2s from 22:00.",
    "priority": "high",
    "labels": ["checkout", "latency"],
    "service": "checkout"
  }'
```

Only `title` is required. You also get `description`, `priority`, `labels` (the first 10 are kept), `service`, `assignee_email` (assigns a member, never invites anyone) and `dedup_key`. The answer is `201` with the card's `id`, `key` and `url`.

Three details to know:

* The body cannot set the column, source or author. New cards always land in **Triage**.
* Send your own `dedup_key` (or an `Idempotency-Key` header) when your sender can deliver an event twice. A redelivery then answers `200` with the same card and `"duplicate": true` instead of opening another.
* Use the key you got back to keep working on the card. `POST .../webhooks/tickets/<token>/OPS-12` updates its fields or column (`status` takes `backlog`, `triage`, `todo`, `in_progress`, `blocked` or `done`, and the won't-do spellings such as `wontfix` archive it), and `POST .../webhooks/tickets/<token>/OPS-12/comments` with a `body` adds a comment.

To link a card to a Slack thread, send `"slack": {"channel": "<channel-id>", "thread_ts": "<thread-root-ts>"}`. Use the channel id (it starts with `C`, `G` or `D`) and the root message's timestamp. Once linked, card comments and column changes post in the thread, and thread replies become card comments automatically, so do not forward replies yourself.

## Sync with Jira, Zoho Sprints or GitHub

<Plan tier="Business" />

Connecting a tracker and syncing cards needs the Business plan. The board and its webhook are on every plan.

A card can mirror an issue in Jira, Zoho Sprints or GitHub. Title, description, status and comments stay converged in both directions.

1. An organization admin connects the tracker under **Integrations**, **Tickets**. Jira takes a URL, account email, API token and project key. Zoho Sprints takes its API details and project IDs. GitHub uses your existing GitHub App installation and asks only for the repository.
2. Set the status mapping (which board column becomes which tracker state) and, if you want existing issues to become cards, the import rule for that tracker. **Import now** catches up on everything already open.
3. On a card, open **External issue** and either **Link an existing issue** (choose the **Tracker**, enter the **Reference** such as `PROJ-123` or `owner/repo#12`) or **File in** a tracker.
4. **Pause sync** stops changes going out and **Resume sync** sends what was held. **Unlink** ends the pairing.

Archiving a card is a statement about your board, so it never closes the issue in your tracker. A card mirrored to a tracker does not put its key in the issue, which keeps its own title and body.

## Related

* [Webhook endpoints](/guides/reference/webhook-endpoints): the full list of webhook URLs and response codes.
* [Limits](/guides/reference/limits): rate and size limits for the board webhook.
* [Request a fix as a pull request](/guides/fix/fix-requests): a tracker label can also ask for a fix pull request.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.