Sentry
Access the Sentry API with managed authentication. Monitor errors, manage issues, projects, teams, and releases.
Quick Start
# List issues for a project
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/sentry/api/0/projects/{organization_slug}/{project_slug}/issues/')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Base URL
https://gateway.maton.ai/sentry/{native-api-path}
Replace {native-api-path} with the actual Sentry API endpoint path. The gateway proxies requests to {subdomain}.sentry.io and automatically injects your credentials.
Authentication
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Getting Your API Key
- Sign in or create an account at maton.ai
- Go to maton.ai/settings
- Copy your API key
Connection Management
Manage your Sentry OAuth connections at https://ctrl.maton.ai.
List Connections
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=sentry&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Create Connection
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'sentry'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Get Connection
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "21fd90f9-5935-43cd-b6c8-bde9d915ca80",
"status": "ACTIVE",
"creation_time": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "sentry",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
Delete Connection
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Specifying Connection
If you have multiple Sentry connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/sentry/api/0/organizations/')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If omitted, the gateway uses the default (oldest) active connection.
API Reference
Organization Operations
List Organizations
GET /sentry/api/0/organizations/
Retrieve an Organization
GET /sentry/api/0/organizations/{organization_slug}/
Update an Organization
PUT /sentry/api/0/organizations/{organization_slug}/
Content-Type: application/json
{
"name": "Updated Organization Name"
}
List Organization Projects
GET /sentry/api/0/organizations/{organization_slug}/projects/
List Organization Members
GET /sentry/api/0/organizations/{organization_slug}/members/
Project Operations
Retrieve a Project
GET /sentry/api/0/projects/{organization_slug}/{project_slug}/
Update a Project
PUT /sentry/api/0/projects/{organization_slug}/{project_slug}/
Content-Type: application/json
{
"name": "Updated Project Name",
"slug": "updated-project-slug"
}
Delete a Project
DELETE /sentry/api/0/projects/{organization_slug}/{project_slug}/
Create a New Project
POST /sentry/api/0/teams/{organization_slug}/{team_slug}/projects/
Content-Type: application/json
{
"name": "New Project",
"slug": "new-project"
}
Issue Operations
List Project Issues
GET /sentry/api/0/projects/{organization_slug}/{project_slug}/issues/
Query Parameters:
statsPeriod- Stats period:24h,14d, or emptyshortIdLookup- Enable short ID lookup (set to1)query- Sentry search query (default:is:unresolved)cursor- Pagination cursor
List Organization Issues
GET /sentry/api/0/organizations/{organization_slug}/issues/
Retrieve an Issue
GET /sentry/api/0/issues/{issue_id}/
Update an Issue
PUT /sentry/api/0/issues/{issue_id}/
Content-Type: application/json
{
"status": "resolved"
}
Status values: resolved, unresolved, ignored
Delete an Issue
DELETE /sentry/api/0/issues/{issue_id}/
List Issue Events
GET /sentry/api/0/issues/{issue_id}/events/
List Issue Hashes
GET /sentry/api/0/issues/{issue_id}/hashes/
Event Operations
List Project Events
GET /sentry/api/0/projects/{organization_slug}/{project_slug}/events/
Retrieve an Event
GET /sentry/api/0/projects/{organization_slug}/{project_slug}/events/{event_id}/
Team Operations
List Organization Teams
GET /sentry/api/0/organizations/{organization_slug}/teams/
Create a Team
POST /sentry/api/0/organizations/{organization_slug}/teams/
Content-Type: application/json
{
"name": "New Team",
"slug": "new-team"
}
Retrieve a Team
GET /sentry/api/0/teams/{organization_slug}/{team_slug}/
Update a Team
PUT /sentry/api/0/teams/{organization_slug}/{team_slug}/
Content-Type: application/json
{
"name": "Updated Team Name"
}
Delete a Team
DELETE /sentry/api/0/teams/{organization_slug}/{team_slug}/
List Team Projects
GET /sentry/api/0/teams/{organization_slug}/{team_slug}/projects/
Release Operations
List Organization Releases
GET /sentry/api/0/organizations/{organization_slug}/releases/
Create a Release
POST /sentry/api/0/organizations/{organization_slug}/releases/
Content-Type: application/json
{
"version": "1.0.0",
"projects": ["project-slug"]
}
Retrieve a Release
GET /sentry/api/0/organizations/{organization_slug}/releases/{version}/
Update a Release
PUT /sentry/api/0/organizations/{organization_slug}/releases/{version}/
Content-Type: application/json
{
"ref": "main",
"commits": [
{
"id": "abc123",
"message": "Fix bug"
}
]
}
Delete a Release
DELETE /sentry/api/0/organizations/{organization_slug}/releases/{version}/
List Release Deploys
GET /sentry/api/0/organizations/{organization_slug}/releases/{version}/deploys/
Create a Deploy
POST /sentry/api/0/organizations/{organization_slug}/releases/{version}/deploys/
Content-Type: application/json
{
"environment": "production"
}
Pagination
Sentry uses cursor-based pagination via the Link header.
GET /sentry/api/0/projects/{organization_slug}/{project_slug}/issues/?cursor=0:100:0
Response headers include pagination links:
Link: <...?cursor=0:0:1>; rel="previous"; results="false"; cursor="0:0:1",
<...?cursor=0:100:0>; rel="next"; results="true"; cursor="0:100:0"
results="true"indicates more results existresults="false"indicates no more results in that direction
Code Examples
JavaScript
const response = await fetch(
'https://gateway.maton.ai/sentry/api/0/organizations/',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const data = await response.json();
Python
import os
import requests
response = requests.get(
'https://gateway.maton.ai/sentry/api/0/organizations/',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
data = response.json()
Python - Resolve an Issue
import os
import requests
response = requests.put(
'https://gateway.maton.ai/sentry/api/0/issues/12345/',
headers={
'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
'Content-Type': 'application/json'
},
json={'status': 'resolved'}
)
Notes
- Sentry API uses version
0prefix:/api/0/ - Organization and project identifiers use slugs (lowercase, hyphenated)
- Issue IDs are numeric
- Release versions can contain special characters (URL encode as needed)
- IMPORTANT: When using curl commands, use
curl -gwhen URLs contain brackets to disable glob parsing - IMPORTANT: When piping curl output to
jqor other commands, environment variables like$MATON_API_KEYmay not expand correctly in some shell environments
Error Handling
| Status | Meaning |
|---|---|
| 400 | Missing Sentry connection |
| 401 | Invalid or missing Maton API key |
| 403 | Insufficient permissions (check OAuth scopes) |
| 404 | Resource not found |
| 429 | Rate limited |
| 4xx/5xx | Passthrough error from Sentry API |