Access the Sentry API with managed authentication. Monitor errors, manage issues, projects, teams, and releases.
# List issues for a project
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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
https://api.maton.ai/sentry/{native-api-path}
Maton proxies requests to {subdomain}.sentry.io and automatically injects your credentials.
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"
Manage your Sentry OAuth connections at https://api.maton.ai.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'sentry'}).encode()
req = urllib.request.Request('https://api.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
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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": "{connection_id}",
"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.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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
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://api.maton.ai/sentry/api/0/organizations/')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always include this header to ensure requests go to the intended account.
GET /sentry/api/0/organizations/
GET /sentry/api/0/organizations/{organization_slug}/
PUT /sentry/api/0/organizations/{organization_slug}/
Content-Type: application/json
{
"name": "Updated Organization Name"
}
GET /sentry/api/0/organizations/{organization_slug}/projects/
GET /sentry/api/0/organizations/{organization_slug}/members/
GET /sentry/api/0/projects/{organization_slug}/{project_slug}/
PUT /sentry/api/0/projects/{organization_slug}/{project_slug}/
Content-Type: application/json
{
"name": "Updated Project Name",
"slug": "updated-project-slug"
}
DELETE /sentry/api/0/projects/{organization_slug}/{project_slug}/
POST /sentry/api/0/teams/{organization_slug}/{team_slug}/projects/
Content-Type: application/json
{
"name": "New Project",
"slug": "new-project"
}
GET /sentry/api/0/projects/{organization_slug}/{project_slug}/issues/
Query Parameters:
statsPeriod - Stats period: 24h, 14d, or emptyshortIdLookup - Enable short ID lookup (set to 1)query - Sentry search query (default: is:unresolved)cursor - Pagination cursorGET /sentry/api/0/organizations/{organization_slug}/issues/
GET /sentry/api/0/issues/{issue_id}/
PUT /sentry/api/0/issues/{issue_id}/
Content-Type: application/json
{
"status": "resolved"
}
Status values: resolved, unresolved, ignored
DELETE /sentry/api/0/issues/{issue_id}/
GET /sentry/api/0/issues/{issue_id}/events/
GET /sentry/api/0/issues/{issue_id}/hashes/
GET /sentry/api/0/projects/{organization_slug}/{project_slug}/events/
GET /sentry/api/0/projects/{organization_slug}/{project_slug}/events/{event_id}/
GET /sentry/api/0/organizations/{organization_slug}/teams/
POST /sentry/api/0/organizations/{organization_slug}/teams/
Content-Type: application/json
{
"name": "New Team",
"slug": "new-team"
}
GET /sentry/api/0/teams/{organization_slug}/{team_slug}/
PUT /sentry/api/0/teams/{organization_slug}/{team_slug}/
Content-Type: application/json
{
"name": "Updated Team Name"
}
DELETE /sentry/api/0/teams/{organization_slug}/{team_slug}/
GET /sentry/api/0/teams/{organization_slug}/{team_slug}/projects/
GET /sentry/api/0/organizations/{organization_slug}/releases/
POST /sentry/api/0/organizations/{organization_slug}/releases/
Content-Type: application/json
{
"version": "1.0.0",
"projects": ["project-slug"]
}
GET /sentry/api/0/organizations/{organization_slug}/releases/{version}/
PUT /sentry/api/0/organizations/{organization_slug}/releases/{version}/
Content-Type: application/json
{
"ref": "main",
"commits": [
{
"id": "abc123",
"message": "Fix bug"
}
]
}
DELETE /sentry/api/0/organizations/{organization_slug}/releases/{version}/
GET /sentry/api/0/organizations/{organization_slug}/releases/{version}/deploys/
POST /sentry/api/0/organizations/{organization_slug}/releases/{version}/deploys/
Content-Type: application/json
{
"environment": "production"
}
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 directionconst response = await fetch(
'https://api.maton.ai/sentry/api/0/organizations/',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const data = await response.json();
import os
import requests
response = requests.get(
'https://api.maton.ai/sentry/api/0/organizations/',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
data = response.json()
import os
import requests
response = requests.put(
'https://api.maton.ai/sentry/api/0/issues/12345/',
headers={
'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
'Content-Type': 'application/json'
},
json={'status': 'resolved'}
)
0 prefix: /api/0/curl -g when URLs contain brackets to disable glob parsingjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments| 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 |
共 2 个版本