Bu sayfanın Türkçesi de var. Türkçe oku →
Issue tracker integrations
To move an error into the team's workflow, you can create a GitHub issue, a Jira
issue or a Linear issue from the issue page in one click. The ticket is linked
to the error; its number (acme/api#42, OPS-17, ENG-123) and link appear on the
issue page. The ticket and the error keep their status in sync both
ways: closing the ticket resolves the error, and the ticket
reopens when the error comes back.
The ticket contains:
- the error's title (as the ticket title),
- the level, total occurrences, first and last seen, latest release, environment, culprit frame and project,
- the stack trace of the latest event (as a code block),
- a link back to the error in Errorbird.
The text is in the dashboard language of the person creating the ticket. The same error is created only once per connection; a second attempt shows the existing ticket.
Setting up a connection
Connections are organization-wide and are added on the Integrations page in the dashboard. Because a connection carries write access to an external system on behalf of the organization, only admins can add or delete one, and these actions are recorded in the audit trail. Creating a ticket from an error is something every member can do.
| Tracker | What you need | Where to get it |
|---|---|---|
| GitHub | Repository (owner/repo) and a token |
Settings → Developer settings → Fine-grained tokens. A token with access to that repository only and the Issues: Read and write permission is enough. |
| Jira Cloud | Address (https://your-team.atlassian.net), email, API token, project key, issue type (default Bug) |
id.atlassian.com → Security → API tokens. The email is the account that owns the token. |
| Linear | Team key (ENG) and a personal API key |
Settings → Security & access → Personal API keys. The team key is the prefix of issue numbers. |
After saving, the Send test button checks the token and the target (repository, project, team) without creating a ticket. A misconfiguration shows up here, not at the first real error.
The token is entered once and is never returned in any response. For Jira, only Jira
Cloud addresses (*.atlassian.net) are accepted: Errorbird sends requests to this
address, and a free-form address would be a way to make it send requests to systems
on an internal network.
API
# Add a connection (admin)
curl -X POST https://api.errorbird.com/api/v1/issue-trackers \
-H "Authorization: Bearer <token>" -H "Content-Type: application/json" \
-d '{ "organizationId": "<org-id>", "type": "GitHub", "name": "Product repo",
"repository": "acme/api", "token": "github_pat_…" }'
# Create a ticket from an issue (member)
curl -X POST https://api.errorbird.com/api/v1/issues/<issue-id>/links \
-H "Authorization: Bearer <token>" -H "Content-Type: application/json" \
-d '{ "trackerId": "<connection-id>" }'
# 201 { "externalKey": "acme/api#42", "url": "https://github.com/acme/api/issues/42", … }
| Endpoint | Description |
|---|---|
GET /api/v1/issue-trackers?organizationId= |
Connections (the token is not returned) |
POST /api/v1/issue-trackers |
Adds a connection (admin) |
POST /api/v1/issue-trackers/{id}/test |
Checks access without creating a ticket |
PATCH /api/v1/issue-trackers/{id} |
Turns status sync on or off (admin) |
DELETE /api/v1/issue-trackers/{id} |
Deletes the connection; links to tickets already created stay |
GET /api/v1/issues/{id}/links |
Tickets linked to the issue |
POST /api/v1/issues/{id}/links |
Creates a ticket and links it |
POST /api/v1/issues/{id}/links/{linkId}/sync |
Syncs the status right away |
DELETE /api/v1/issues/{id}/links/{linkId} |
Removes the link (the external ticket is not deleted) |
Error codes:
409 already_linked: the issue already has a ticket in this connection.404 issue_tracker_not_found: the connection does not exist or belongs to another organization.502 issue_tracker_failed: the external system rejected the request. The description includes the provider's own message (e.g. GitHub's "Bad credentials"), and the same message is written to the connection's "last error" field.
Status sync (two-way)
While Two-way status sync is on for a connection (the default), the error and the ticket move together:
| What happened | What Errorbird does |
|---|---|
| The ticket was closed in GitHub/Jira/Linear (canceled in Linear too) | Marks the error resolved |
| A closed ticket was reopened | Reopens the error |
| The error was resolved in Errorbird | Closes the ticket and leaves a comment saying why |
| The error was reopened, or happened again after being resolved | Reopens the ticket; for a regression the comment names the release |
- No webhook needed: Errorbird reads the tickets' status every few minutes. When an error changes in Errorbird, its tickets are handled within a minute. The Sync button on the issue page syncs right away.
- What counts as closed:
closedin GitHub, any status in the "Done" category in Jira, and "completed" and "canceled" states in Linear. - Closing in Jira applies a workflow transition: the first one whose target is in the "Done" category. Reopening picks a transition to the "To Do" category, or "In Progress" if there is none. Without a suitable transition the connection shows an error. In Linear, closing uses the team's first "completed" state and reopening its first "unstarted" (otherwise backlog) state.
- Conflicts: if both sides changed in the same interval, the ticket wins; a person changed it, while the change in Errorbird may be an automatic regression.
- An ignored error does not drive the ticket: ignoring means "don't alert", not "done".
- A sync error (expired token, deleted ticket) is shown under the ticket on the issue page and clears on the next round once the provider works again.
- The token needs permission to edit tickets ("Issues: Read and write" in GitHub; in Jira, an account that can transition issues and add comments). To turn sync off, untick the box on the connection; tickets and links stay in place.
# Turn sync off (admin)
curl -X PATCH https://api.errorbird.com/api/v1/issue-trackers/<connection-id> \
-H "Authorization: Bearer <token>" -H "Content-Type: application/json" \
-d '{ "syncStatus": false }'
# Sync one ticket right away (member)
curl -X POST https://api.errorbird.com/api/v1/issues/<issue-id>/links/<link-id>/sync \
-H "Authorization: Bearer <token>"
# { "externalKey": "acme/api#42", "syncedState": "Closed", "lastSyncedAt": "…", "lastSyncError": null, … }
For tickets created before sync existed, the first round adopts the ticket's current status; nothing is changed on either side in that round.
Limits
- Sync covers the status only; title, assignee and comments are not synced.
- Jira Server / Data Center is not supported; only Jira Cloud.
- GitHub Enterprise Server is not supported; only github.com.