| name | sentry |
| description | Sentry API via curl. Use this skill to manage error tracking, list issues, resolve errors, and monitor releases in Sentry. |
| vm0_secrets | SENTRY_TOKEN |
| vm0_vars | SENTRY_HOST, SENTRY_ORG |
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"' | jq .
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:
bash -c 'curl -s -G "https://${SENTRY_HOST}/api/0/organizations/${SENTRY_ORG}/issues/" --header "Authorization: Bearer ${SENTRY_TOKEN}" --data-urlencode "query=is:unresolved level:error"' | 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. Replacedeveloper@example.comwith a valid user email from your Sentry organization members.
ISSUE_ID="123456789"
USER_EMAIL="developer@example.com"
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}'
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' | jq '.'
15. Delete Issue
Delete an issue (requires admin permissions):
Note: Replace
123456789with an actual issue ID from the "List Issues" output.
ISSUE_ID="123456789"
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
my-projectwith your actual project slug from the "List Your Projects" output.
PROJECT_SLUG="my-project"
Write to /tmp/sentry_request.json:
{
"version": "1.0.1",
"projects": ["${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
my-projectwith your actual project slug from the "List Your Projects" output.
PROJECT_SLUG="my-project"
Write to /tmp/sentry_request.json:
{
"version": "1.0.2",
"projects": ["${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