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 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:

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
# 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