Sentry API
Use the Sentry API via direct curl calls to manage error tracking, issues, projects, and releases.
Official docs:
https://docs.sentry.io/api/
When to Use
Use this skill when you need to:
- List and search issues - find errors and exceptions
- Resolve or ignore issues - manage issue status
- View issue details - get stack traces and event data
- Manage projects - list and configure projects
- Track releases - create and monitor releases
- View events - get detailed error events
Prerequisites
- Go to Sentry → Settings → Developer Settings → Internal Integrations
- Create a new Internal Integration with required scopes (see below)
- Copy the generated token
export SENTRY_HOST="sentry.io" # Or your self-hosted Sentry domain
export SENTRY_TOKEN="sntrys_..." # Auth token from Internal Integration
export SENTRY_ORG="your-org-slug" # Your organization slug
Required Scopes
project:read- List and view projectsevent:read- View issues and eventsevent:write- Update issues (resolve, ignore, assign)release:read- View releasesrelease:write- Create releases
Important: When using
$VARin a command that pipes to another command, wrap the command containing$VARinbash -c '...'. Due to a Claude Code bug, environment variables are silently cleared when pipes are used directly.bash -c 'curl -s "https://api.example.com" -H "Authorization: Bearer $API_KEY"'
How to Use
All examples below assume SENTRY_HOST, SENTRY_TOKEN, and SENTRY_ORG are set.
Base URL: https://${SENTRY_HOST}/api/0
1. List Your Projects
Get all projects you have access to:
bash -c 'curl -s "https://${SENTRY_HOST}/api/0/projects/" --header "Authorization: Bearer ${SENTRY_TOKEN}"' | jq '.[] | {slug, name, platform, dateCreated}'
2. Get Project Details
Get details for a specific project:
Note: Replace
my-projectwith your actual project slug from the "List Your Projects" output above.
PROJECT_SLUG="my-project"
bash -c 'curl -s "https://${SENTRY_HOST}/api/0/projects/${SENTRY_ORG}/${PROJECT_SLUG}/" --header "Authorization: Bearer ${SENTRY_TOKEN}"' | jq '{slug, name, platform, status, dateCreated}'
3. List Organization Issues
Get all issues across the organization:
bash -c 'curl -s "https://${SENTRY_HOST}/api/0/organizations/${SENTRY_ORG}/issues/" --header "Authorization: Bearer ${SENTRY_TOKEN}"' | jq '.[] | {id, shortId, title, culprit, status, count, userCount, firstSeen, lastSeen}
Query parameters:
query=is:unresolved- Filter by statusquery=error.type:TypeError- Filter by error typesort=date- Sort by last seen (default)sort=new- Sort by first seensort=freq- Sort by event count
4. List Project Issues
Get issues for a specific project:
Note: Replace
my-projectwith your actual project slug from the "List Your Projects" output.
PROJECT_SLUG="my-project"
bash -c 'curl -s "https://${SENTRY_HOST}/api/0/projects/${SENTRY_ORG}/${PROJECT_SLUG}/issues/" --header "Authorization: Bearer ${SENTRY_TOKEN}"' | jq '.[] | {id, shortId, title, status, count, lastSeen}
5. Search Issues
Search issues with query:
Write to /tmp/sentry_query.txt:
is:unresolved level:error
bash -c 'curl -s -G "https://${SENTRY_HOST}/api/0/organizations/${SENTRY_ORG}/issues/" --header "Authorization: Bearer ${SENTRY_TOKEN}" --data-urlencode "query@/tmp/sentry_query.txt"' | jq '.[] | {shortId, title, level, count}
Common query filters:
is:unresolved/is:resolved/is:ignored- By statuslevel:error/level:warning/level:info- By levelassigned:me/assigned:none- By assigneebrowser:Chrome- By browseros:Windows- By OSrelease:1.0.0- By release version
6. Get Issue Details
Get details for a specific issue:
Note: Replace
123456789with an actual issue ID from the "List Issues" or "List Project Issues" output (use theidfield, notshortId).
ISSUE_ID="123456789"
bash -c 'curl -s "https://${SENTRY_HOST}/api/0/organizations/${SENTRY_ORG}/issues/${ISSUE_ID}/" --header "Authorization: Bearer ${SENTRY_TOKEN}"' | jq '{id, shortId, title, culprit, status, level, count, userCount, firstSeen, lastSeen, assignedTo}'
7. Get Latest Event for Issue
Get the most recent event for an issue:
Note: Replace
123456789with an actual issue ID from the "List Issues" output.
ISSUE_ID="123456789"
bash -c 'curl -s "https://${SENTRY_HOST}/api/0/organizations/${SENTRY_ORG}/issues/${ISSUE_ID}/events/latest/" --header "Authorization: Bearer ${SENTRY_TOKEN}"' | jq '{eventID, message, platform, dateCreated, tags, contexts}'
8. List Issue Events
Get all events for an issue:
Note: Replace
123456789with an actual issue ID from the "List Issues" output.
ISSUE_ID="123456789"
bash -c 'curl -s "https://${SENTRY_HOST}/api/0/organizations/${SENTRY_ORG}/issues/${ISSUE_ID}/events/" --header "Authorization: Bearer ${SENTRY_TOKEN}"' | jq '.[] | {eventID, message, dateCreated}
9. Resolve Issue
Mark an issue as resolved:
Note: Replace
123456789with an actual issue ID from the "List Issues" output.
ISSUE_ID="123456789"
Write to /tmp/sentry_request.json:
{
"status": "resolved"
}
Then run:
bash -c 'curl -s -X PUT "https://${SENTRY_HOST}/api/0/organizations/${SENTRY_ORG}/issues/${ISSUE_ID}/" --header "Authorization: Bearer ${SENTRY_TOKEN}" --header "Content-Type: application/json" -d @/tmp/sentry_request.json' | jq '{id, shortId, status}'
10. Resolve in Next Release
Mark issue as resolved in next release:
Note: Replace
123456789with an actual issue ID from the "List Issues" output.
ISSUE_ID="123456789"
Write to /tmp/sentry_request.json:
{
"status": "resolvedInNextRelease"
}
Then run:
bash -c 'curl -s -X PUT "https://${SENTRY_HOST}/api/0/organizations/${SENTRY_ORG}/issues/${ISSUE_ID}/" --header "Authorization: Bearer ${SENTRY_TOKEN}" --header "Content-Type: application/json" -d @/tmp/sentry_request.json' | jq '{id, shortId, status}'
11. Ignore Issue
Ignore an issue:
Note: Replace
123456789with an actual issue ID from the "List Issues" output.
ISSUE_ID="123456789"
Write to /tmp/sentry_request.json:
{
"status": "ignored"
}
Then run:
bash -c 'curl -s -X PUT "https://${SENTRY_HOST}/api/0/organizations/${SENTRY_ORG}/issues/${ISSUE_ID}/" --header "Authorization: Bearer ${SENTRY_TOKEN}" --header "Content-Type: application/json" -d @/tmp/sentry_request.json' | jq '{id, shortId, status}'
Ignore with duration (in minutes):
Write to /tmp/sentry_request.json:
{
"status": "ignored",
"statusDetails": {
"ignoreDuration": 60
}
}
Then run:
bash -c 'curl -s -X PUT "https://${SENTRY_HOST}/api/0/organizations/${SENTRY_ORG}/issues/${ISSUE_ID}/" --header "Authorization: Bearer ${SENTRY_TOKEN}" --header "Content-Type: application/json" -d @/tmp/sentry_request.json' | jq '{id, shortId, status}'
12. Unresolve Issue
Reopen a resolved issue:
Note: Replace
123456789with an actual issue ID from the "List Issues" output.
ISSUE_ID="123456789"
Write to /tmp/sentry_request.json:
{
"status": "unresolved"
}
Then run:
bash -c 'curl -s -X PUT "https://${SENTRY_HOST}/api/0/organizations/${SENTRY_ORG}/issues/${ISSUE_ID}/" --header "Authorization: Bearer ${SENTRY_TOKEN}" --header "Content-Type: application/json" -d @/tmp/sentry_request.json' | jq '{id, shortId, status}'
13. Assign Issue
Assign an issue to a user:
Note: Replace
123456789with an actual issue ID from the "List Issues" output. Replace<user-email>with a valid user email from your Sentry organization members.
Write to /tmp/sentry_request.json:
{
"assignedTo": "<user-email>"
}
Then run:
bash -c 'curl -s -X PUT "https://${SENTRY_HOST}/api/0/organizations/${SENTRY_ORG}/issues/${ISSUE_ID}/" --header "Authorization: Bearer ${SENTRY_TOKEN}" --header "Content-Type: application/json" -d @/tmp/sentry_request.json' | jq '{id, shortId, assignedTo}'
Note: Replace
123456789in the URL with the actual issue ID from the "List Issues" output.
14. Bulk Update Issues
Update multiple issues at once:
Note: Replace
123456789and987654321with actual issue IDs from the "List Issues" output.
Write to /tmp/sentry_request.json:
{
"id": ["123456789", "987654321"],
"status": "resolved"
}
Then run:
bash -c 'curl -s -X PUT "https://${SENTRY_HOST}/api/0/organizations/${SENTRY_ORG}/issues/" --header "Authorization: Bearer ${SENTRY_TOKEN}" --header "Content-Type: application/json" -d @/tmp/sentry_request.json'
15. Delete Issue
Delete an issue (requires admin permissions):
Note: Replace
123456789with an actual issue ID from the "List Issues" output.
ISSUE_ID="123456789"
bash -c 'curl -s -X DELETE "https://${SENTRY_HOST}/api/0/organizations/${SENTRY_ORG}/issues/${ISSUE_ID}/" --header "Authorization: Bearer ${SENTRY_TOKEN}" -w "\nHTTP Status: %{http_code}"'
16. List Releases
Get all releases for the organization:
bash -c 'curl -s "https://${SENTRY_HOST}/api/0/organizations/${SENTRY_ORG}/releases/" --header "Authorization: Bearer ${SENTRY_TOKEN}"' | jq '.[] | {version, dateCreated, newGroups, projects: [.projects[].slug]}'
17. Get Release Details
Get details for a specific release:
Note: Replace
1.0.0with an actual release version from the "List Releases" output.
RELEASE_VERSION="1.0.0"
bash -c 'curl -s "https://${SENTRY_HOST}/api/0/organizations/${SENTRY_ORG}/releases/${RELEASE_VERSION}/" --header "Authorization: Bearer ${SENTRY_TOKEN}"' | jq '{version, dateCreated, dateReleased, newGroups, lastEvent, projects}'
18. Create Release
Create a new release:
Note: Replace
<your-project-slug>with your actual project slug from the "List Your Projects" output.
Write to /tmp/sentry_request.json:
{
"version": "1.0.1",
"projects": ["<your-project-slug>"]
}
Then run:
bash -c 'curl -s -X POST "https://${SENTRY_HOST}/api/0/organizations/${SENTRY_ORG}/releases/" --header "Authorization: Bearer ${SENTRY_TOKEN}" --header "Content-Type: application/json" -d @/tmp/sentry_request.json' | jq '{version, dateCreated}'
19. Create Release with Commits
Create release with associated commits:
Note: Replace
<your-project-slug>with your actual project slug from the "List Your Projects" output.
Write to /tmp/sentry_request.json:
{
"version": "1.0.2",
"projects": ["<your-project-slug>"],
"refs": [
{
"repository": "owner/repo",
"commit": "abc123def456"
}
]
}
Then run:
bash -c 'curl -s -X POST "https://${SENTRY_HOST}/api/0/organizations/${SENTRY_ORG}/releases/" --header "Authorization: Bearer ${SENTRY_TOKEN}" --header "Content-Type: application/json" -d @/tmp/sentry_request.json' | jq '{version, dateCreated}'
20. List Project Error Events
Get recent error events for a project:
Note: Replace
my-projectwith your actual project slug from the "List Your Projects" output.
PROJECT_SLUG="my-project"
bash -c 'curl -s "https://${SENTRY_HOST}/api/0/projects/${SENTRY_ORG}/${PROJECT_SLUG}/events/" --header "Authorization: Bearer ${SENTRY_TOKEN}"' | jq '.[] | {eventID, title, message, dateCreated}'
Issue Status Values
| Status | Description |
|--------|-------------|
| unresolved | Active issue (default) |
| resolved | Manually resolved |
| resolvedInNextRelease | Auto-resolve on next release |
| ignored | Ignored (won't alert) |
Guidelines
- Use organization slug: Most endpoints use org slug, not ID
- Pagination: Use
cursorparameter for paginated results - Query syntax: Use Sentry's query language for powerful filtering
- Rate limits: Sentry has rate limits; implement backoff for 429 responses
- Self-hosted: For self-hosted Sentry, set
SENTRY_HOSTto your domain - Scopes matter: Ensure your token has required scopes for each operation