REST API
For agents: every row below with a tool name is callable over MCP with the same arguments; prefer the tool. Rows marked "no tool" are human-only by design. Full argument schemas: MCP tool reference. Example:
get_issue(org="acme", project="web", shortId=42)≡GET /v1/orgs/acme/projects/web/issues/42.
Base URL https://api.bugwatch.io. All /v1 routes need a bearer token or dashboard session (Authentication); JSON in, JSON out; validation errors are 400 with Zod fieldErrors. Path placeholders: {org} and {project} are slugs, {shortId} is the issue number, {eventId} is 32 hex, ids are ULIDs.
This table is generated from the tool registry (packages/agent) — actually generated, since #189: a /v1 route cannot exist without either a tool or an explicit reason, a test enforces that, and the table below is rendered from the same two lists. Full argument schemas and examples are in the MCP tool reference.
/v1 routes (125)
| Method | Path | Scope | Purpose | MCP tool |
|---|---|---|---|---|
DELETE |
/v1/orgs/{org} |
— |
Deleting an organization erases all of its data and cannot be undone. | — (human-only) |
GET |
/v1/orgs/{org}/agent-activity |
org:read |
Recent agent (MCP) actions across the organization: tool, arguments, token, outcome, time. | list_agent_activity |
GET |
/v1/orgs/{org}/agent-usage |
org:read |
Fix-agent credits and usage: this month's allowance and what is left of it, purchased credit remaining, which models the plan may use and what they cost per million tokens, and the most recent runs. | get_agent_usage |
POST |
/v1/orgs/{org}/billing/agent-credits/checkout |
— |
Browser redirect to Stripe Checkout for a fix-agent credit pack; purchases stay human-initiated. | — (human-only) |
POST |
/v1/orgs/{org}/billing/checkout |
— |
Browser redirect to Stripe Checkout; purchases stay human-initiated. | — (human-only) |
POST |
/v1/orgs/{org}/billing/overage |
org:admin |
Turn pay-as-you-go overage on or off (off = hard cap at the plan's included events). | set_overage |
GET |
/v1/orgs/{org}/billing/plans |
org:read |
Plan catalog with prices, included events, retention, overage rate, and whether checkout is available. | get_billing_plans |
POST |
/v1/orgs/{org}/billing/portal |
— |
Browser redirect to the Stripe Billing Portal. | — (human-only) |
GET |
/v1/orgs/{org}/channels |
org:read |
Notification channels in the organization (Slack, webhook, email, PagerDuty) with masked targets. | list_channels |
POST |
/v1/orgs/{org}/channels |
alert:write |
Create a notification channel. | create_channel |
DELETE |
/v1/orgs/{org}/channels/{id} |
alert:write |
Delete a notification channel by id. | delete_channel |
POST |
/v1/orgs/{org}/channels/{id}/rotate-secret |
alert:write |
Give a webhook channel a new signing secret, returned once; the old one stops verifying at the next delivery. | rotate_channel_secret |
POST |
/v1/orgs/{org}/chat |
— |
The mobile companion's own model loop, which runs THESE tools. | — (human-only) |
GET |
/v1/orgs/{org}/devices |
org:read |
The phones registered to you in this organization, with when each last confirmed a delivery. | list_devices |
POST |
/v1/orgs/{org}/devices |
— |
A device registers itself with its own push credentials from the app; there is nothing for an agent to do here, and a tool that could write push tokens could redirect somebody's pages to another handset. | — (human-only) |
DELETE |
/v1/orgs/{org}/devices/{id} |
org:read |
Stop paging one of your devices and clear its push credentials — a lost or replaced phone. | revoke_device |
POST |
/v1/orgs/{org}/devices/{id}/receipt |
— |
A handset confirms a push it actually received. | — (human-only) |
GET |
/v1/orgs/{org}/devices/vapid-key |
— |
The application server key a BROWSER needs to call PushManager.subscribe(). | — (human-only) |
GET |
/v1/orgs/{org}/escalation-policies |
org:read |
Escalation policies: how many rules each chain has, whether it repeats, and its fallback target. | list_escalation_policies |
POST |
/v1/orgs/{org}/escalation-policies |
alert:write |
Create an escalation policy. | create_escalation_policy |
GET |
/v1/orgs/{org}/escalation-policies/{id} |
org:read |
One escalation policy: every rule in order, its targets (schedule or user), delay and urgency. | get_escalation_policy |
PATCH |
/v1/orgs/{org}/escalation-policies/{id} |
alert:write |
Update a policy's name, repeat behaviour, fallback or rules. | update_escalation_policy |
DELETE |
/v1/orgs/{org}/escalation-policies/{id} |
alert:write |
Delete an escalation policy. | delete_escalation_policy |
GET |
/v1/orgs/{org}/export |
— |
A bulk download of every row the org owns, streamed as NDJSON for a backup or a move; far beyond what a tool result can carry. | — (human-only) |
GET |
/v1/orgs/{org}/incidents |
org:read |
Incidents in the organization, newest first. | list_incidents |
POST |
/v1/orgs/{org}/incidents |
alert:write |
Open an incident and start its escalation chain. | trigger_incident |
GET |
/v1/orgs/{org}/incidents/{id} |
org:read |
One incident with its full timeline: when it triggered, every escalation step, who was paged on which channel, who acknowledged and when it resolved. | get_incident |
POST |
/v1/orgs/{org}/incidents/{id}/acknowledge |
alert:write |
Acknowledge an incident: escalation stops immediately. | acknowledge_incident |
GET |
/v1/orgs/{org}/incidents/{id}/brief |
org:read |
Catch up on an incident that is still happening: whether anybody has it, who has been paged and who answered, what has already been tried, and what is wrong with the RESPONSE itself — pages that were never delivered, a service with no escalation policy, a source that fired again. | get_incident_brief |
GET |
/v1/orgs/{org}/incidents/{id}/context |
org:read |
What else changed around an incident: error rate and probe latency before vs after it opened, and deploys in the two hours before. | get_incident_context |
POST |
/v1/orgs/{org}/incidents/{id}/resolve |
alert:write |
Resolve an incident: escalation stops and the timer clears. | resolve_incident |
GET |
/v1/orgs/{org}/incidents/{id}/retro |
org:read |
A retro draft assembled from the incident's own timeline: how long detection, acknowledgement and the fix each took, what the response itself got wrong (pages that were never delivered, a chain that reached its fallback, nobody answering), and the questions left to fill in. | draft_incident_retro |
GET |
/v1/orgs/{org}/incidents/{id}/status-draft |
org:read |
A status-page update drafted for CUSTOMERS from what the incident records: the stage (investigating, identified, monitoring, resolved), which components are affected in the words the public page uses, how long it has been going on, and when the next update is promised. | draft_status_update |
GET |
/v1/orgs/{org}/members |
org:read |
Organization members with role (admin, member, viewer) and email. | list_members |
POST |
/v1/orgs/{org}/members |
— |
Adding a member (or changing a role) grants access that outlives the credential that granted it, so a leaked token or a misled agent could keep its foothold after revocation (#276). | — (human-only) |
DELETE |
/v1/orgs/{org}/members/{userId} |
— |
A leaked token must not be able to remove the admins who would revoke it (#276). | — (human-only) |
GET |
/v1/orgs/{org}/monitors |
org:read |
Uptime monitors in the organization: state (up/degraded/down/paused/pending), type, target, last check and latency. | list_monitors |
POST |
/v1/orgs/{org}/monitors |
alert:write |
Create an uptime monitor. | create_monitor |
GET |
/v1/orgs/{org}/monitors/{id} |
org:read |
One uptime monitor: full check configuration (secrets redacted), interval, regions, thresholds, quorum, channels, current state and — for heartbeat monitors — the ping URL. | get_monitor |
PATCH |
/v1/orgs/{org}/monitors/{id} |
alert:write |
Update an uptime monitor: send only the fields to change (name, check, intervalSeconds, regions, failureThreshold, recoveryThreshold, quorum, channelIds, serviceId, enabled). | update_monitor |
DELETE |
/v1/orgs/{org}/monitors/{id} |
alert:write |
Delete an uptime monitor and stop its probes. | delete_monitor |
GET |
/v1/orgs/{org}/monitors/{id}/events |
org:read |
State-change history for one monitor (most recent 100): when it went up, degraded, down or paused, how many regions were failing, and why. | list_monitor_events |
GET |
/v1/orgs/{org}/monitors/{id}/history |
org:read |
Uptime and latency history for one monitor: per-bucket uptime % with p50/p95, plus a per-region summary over the window. | get_monitor_history |
POST |
/v1/orgs/{org}/monitors/{id}/pause |
alert:write |
Pause an uptime monitor: probes stop and it never pages until resumed (use this during planned maintenance). | pause_monitor |
POST |
/v1/orgs/{org}/monitors/{id}/resume |
alert:write |
Resume a paused uptime monitor. | resume_monitor |
POST |
/v1/orgs/{org}/monitors/{id}/snooze |
alert:write |
Quiet a monitor's paging for 15, 60, 240 or 1440 minutes while somebody works on it (#209). | snooze_monitor |
DELETE |
/v1/orgs/{org}/monitors/{id}/snooze |
alert:write |
Lift a monitor's snooze now. | unsnooze_monitor |
GET |
/v1/orgs/{org}/notification-prefs |
org:read |
Your notification rules for this organization: which categories are on, quiet hours, active mutes and which devices take pages. | get_notification_rules |
PUT |
/v1/orgs/{org}/notification-prefs |
org:read |
Replace your notification rules for this organization. | set_notification_rules |
GET |
/v1/orgs/{org}/projects |
project:read |
List the projects in an organization with slug, name, platform, and dashboard link. | list_projects |
POST |
/v1/orgs/{org}/projects |
project:write |
Create a project. | create_project |
GET |
/v1/orgs/{org}/projects/{project} |
project:read |
Project settings: name, platform, retention tier, store-IP flag, inbound filters, project number. | get_project |
PATCH |
/v1/orgs/{org}/projects/{project} |
project:write |
Update project name, platform, store-IP flag, or inbound filters (crawlers, legacy browsers, localhost, extensions, message deny list, allowed domains). | update_project |
GET |
/v1/orgs/{org}/projects/{project}/alert-rules |
org:read |
Alert rules for a project: conditions (new_issue, regression, frequency), filters, channel actions, throttle, enabled. | list_alert_rules |
POST |
/v1/orgs/{org}/projects/{project}/alert-rules |
alert:write |
Create an alert rule. | create_alert_rule |
PATCH |
/v1/orgs/{org}/projects/{project}/alert-rules/{id} |
alert:write |
Replace an alert rule's definition (PATCH has replace semantics: send the full rule — name, conditions, actions — plus any of filters, environment, frequencyS, enabled). | update_alert_rule |
DELETE |
/v1/orgs/{org}/projects/{project}/alert-rules/{id} |
alert:write |
Delete an alert rule by id. | delete_alert_rule |
POST |
/v1/orgs/{org}/projects/{project}/artifact-bundles |
— |
Binary source-map upload; use sentry-cli or the REST endpoint directly. | — (human-only) |
GET |
/v1/orgs/{org}/projects/{project}/attachments/{id} |
— |
The bytes of a file an SDK attached to an event: binary and always served as a download, not something a tool result can carry. | — (human-only) |
GET |
/v1/orgs/{org}/projects/{project}/export/events |
— |
A bulk stream of a project's stored event bodies from R2; a download, not a tool result (P2.2). | — (human-only) |
POST |
/v1/orgs/{org}/projects/{project}/import-issues |
event:write |
Import a triaged issue backlog from another error tracker. | import_issues |
GET |
/v1/orgs/{org}/projects/{project}/issues |
event:read |
List or search issues in a project (compact: id, level, status, title, impact, deep link). | search_issues |
GET |
/v1/orgs/{org}/projects/{project}/issues/{shortId} |
event:read |
Compact summary of one issue (title, culprit, status, impact, first/last seen, deep link). | get_issue |
PATCH |
/v1/orgs/{org}/projects/{project}/issues/{shortId} |
event:write |
Mark an issue resolved. | resolve_issue |
PATCH |
/v1/orgs/{org}/projects/{project}/issues/{shortId} |
event:write |
Ignore an issue (mute alerts). | ignore_issue |
PATCH |
/v1/orgs/{org}/projects/{project}/issues/{shortId} |
event:write |
Reopen an issue (back to unresolved). | unresolve_issue |
GET |
/v1/orgs/{org}/projects/{project}/issues/{shortId}/activity |
event:read |
Activity feed for an issue: status changes, regressions, agent actions, with actor and time. | get_issue_activity |
GET |
/v1/orgs/{org}/projects/{project}/issues/{shortId}/attachments |
event:read |
Files the SDK attached to this issue's events (screenshots, logs, view hierarchies): filename, type, size, event id, newest first. | list_issue_attachments |
GET |
/v1/orgs/{org}/projects/{project}/issues/{shortId}/events |
event:read |
List recent events for an issue (event id, timestamp, size), newest first; page with cursor. | list_events |
GET |
/v1/orgs/{org}/projects/{project}/issues/{shortId}/events/{eventId} |
event:read |
Full processed event body (JSON, often 10–40 KB): exception with all frames, breadcrumbs, contexts, tags, request, sdk. | get_event |
POST |
/v1/orgs/{org}/projects/{project}/issues/{shortId}/fix-agent |
— |
Server-sent event stream that runs a model; an agent wanting the same material should call get_fix_context and do its own reasoning rather than nest an agent inside a tool call. | — (human-only) |
GET |
/v1/orgs/{org}/projects/{project}/issues/{shortId}/fix-context |
event:read |
Everything needed to FIX an issue in one payload (JSON, can be large): symbolicated in-app frames with source context, breadcrumbs, release + commit, impact numbers, similar resolved issues. | get_fix_context |
GET |
/v1/orgs/{org}/projects/{project}/issues/{shortId}/history |
event:read |
Day-by-day events and estimated affected users for an issue, from the nightly rollup — so it reaches back FURTHER than the analytics window the issue chart uses (up to 400 days). | get_issue_history |
POST |
/v1/orgs/{org}/projects/{project}/issues/bulk |
event:write |
Set the status of up to 100 issues at once (resolve, ignore, or reopen). | bulk_update_issues |
GET |
/v1/orgs/{org}/projects/{project}/keys |
project:read |
DSN keys for a project (public key, DSN, label, status). | list_keys |
POST |
/v1/orgs/{org}/projects/{project}/keys |
project:write |
Create an additional DSN key for a project (for rotation or a second environment). | create_key |
PATCH |
/v1/orgs/{org}/projects/{project}/keys/{keyId} |
project:write |
Enable or disable a DSN key. | set_key_status |
GET |
/v1/orgs/{org}/projects/{project}/releases/{version}/health |
event:read |
Session health of a release in a project: sessions, crashed/errored/abnormal, crash-free rate. | get_release_health |
POST |
/v1/orgs/{org}/projects/{project}/replay |
event:write |
Re-process raw events already stored for a project over a time window — for after a pipeline incident. | replay_raw_events |
POST |
/v1/orgs/{org}/projects/{project}/resolve-by-commit |
event:write |
Resolve the issues a commit message closes. | resolve_issues_from_commit |
GET |
/v1/orgs/{org}/projects/{project}/stats |
event:read |
Time series of event volume (errors, transactions, or sessions) for the last N hours at a chosen interval. | get_stats |
GET |
/v1/orgs/{org}/projects/{project}/transaction |
event:read |
One transaction in detail: throughput, p50/p75/p95/p99, failure rate, latency over time, the spans that own the most of its time, and the error issues seen in its recent traces (linked by trace id). | get_transaction |
GET |
/v1/orgs/{org}/projects/{project}/transactions |
event:read |
Per-transaction performance overview for the last N hours: throughput, p50/p75/p95/p99 ms, failures. | query_performance |
GET |
/v1/orgs/{org}/projects/{project}/vitals |
event:read |
p75 Core Web Vitals per transaction for the last N hours (LCP, FCP, CLS, INP, TTFB), sampling-aware. | get_web_vitals |
GET |
/v1/orgs/{org}/releases |
org:read |
Releases in the organization: version, status, commit, deploy count, last deploy, artifact bundles. | list_releases |
POST |
/v1/orgs/{org}/releases |
release:write |
Register a release version (optionally with commit SHA and URL). | create_release |
POST |
/v1/orgs/{org}/releases/{version}/deploys |
release:write |
Record a deploy of a release to an environment. | create_deploy |
GET |
/v1/orgs/{org}/repo-connection |
org:read |
Whether this organization has a repository connected for the fix agent, and which one. | get_repo_connection |
POST |
/v1/orgs/{org}/repo-connection |
— |
Stores a credential that can write to the customer's source code; connecting a repository stays human-initiated, like minting a token. | — (human-only) |
DELETE |
/v1/orgs/{org}/repo-connection |
— |
The same human-only gate as connecting: an agent must not be able to sever, or silently re-point, the org's source-code access. | — (human-only) |
GET |
/v1/orgs/{org}/schedules |
org:read |
On-call schedules in the organization: name, timezone and how many rotation layers each has. | list_schedules |
POST |
/v1/orgs/{org}/schedules |
alert:write |
Create an on-call schedule. | create_schedule |
GET |
/v1/orgs/{org}/schedules/{id} |
org:read |
One on-call schedule in full: timezone, every rotation layer (type, handoff wall-clock time, rotation order, restrictions, active dates) and every override. | get_schedule |
PATCH |
/v1/orgs/{org}/schedules/{id} |
alert:write |
Update a schedule's name, timezone, team or layers. | update_schedule |
DELETE |
/v1/orgs/{org}/schedules/{id} |
alert:write |
Delete an on-call schedule. | delete_schedule |
GET |
/v1/orgs/{org}/schedules/{id}/coverage |
org:read |
Coverage for a schedule over a window (default: the next 7 days, 90 days maximum) as contiguous segments. | get_schedule_coverage |
POST |
/v1/orgs/{org}/schedules/{id}/import-diff |
org:read |
Compare an Opsgenie or PagerDuty schedule against one of ours over a 30-day window, without importing anything. | diff_imported_schedule |
GET |
/v1/orgs/{org}/schedules/{id}/on-call |
org:read |
Who is on call for a schedule at an instant (default: now). | who_is_on_call |
POST |
/v1/orgs/{org}/schedules/{id}/overrides |
alert:write |
Put someone on call for a window regardless of the rotation — a cover for illness, holiday or a handover. | create_override |
DELETE |
/v1/orgs/{org}/schedules/{id}/overrides/{overrideId} |
alert:write |
Remove an override, handing the window back to the rotation. | delete_override |
GET |
/v1/orgs/{org}/services |
org:read |
Services: what an incident is about, which escalation policy it pages, which channels it notifies, and its auto-resolve and ack-timeout settings. | list_services |
POST |
/v1/orgs/{org}/services |
alert:write |
Create a service: a name, the escalation policy its incidents page, the channels they notify, and optionally the product-line-1 project it belongs to. | create_service |
PATCH |
/v1/orgs/{org}/services/{id} |
alert:write |
Update a service's name, policy, channels, project link, auto-resolve or ack timeout. | update_service |
DELETE |
/v1/orgs/{org}/services/{id} |
alert:write |
Delete a service. | delete_service |
POST |
/v1/orgs/{org}/services/{id}/inbound-key |
— |
Mints a credential that can open an incident on this service, shown exactly once. | — (human-only) |
GET |
/v1/orgs/{org}/status-pages |
org:read |
Public status pages in the organization: slug, public URL, and whether each is published. | list_status_pages |
POST |
/v1/orgs/{org}/status-pages |
alert:write |
Create a public status page. | create_status_page |
GET |
/v1/orgs/{org}/status-pages/{id} |
org:read |
One status page with its components, in display order, and what each component reads its health from. | get_status_page |
PATCH |
/v1/orgs/{org}/status-pages/{id} |
alert:write |
Update a status page. | update_status_page |
DELETE |
/v1/orgs/{org}/status-pages/{id} |
alert:write |
Delete a status page. | delete_status_page |
GET |
/v1/orgs/{org}/status-pages/{id}/domains |
org:read |
Custom domains on a status page: the hostname, whether it is live, and the DNS records still waiting to be added. | list_status_page_domains |
POST |
/v1/orgs/{org}/status-pages/{id}/domains |
alert:write |
Point a hostname you own at a status page. | add_status_page_domain |
DELETE |
/v1/orgs/{org}/status-pages/{id}/domains/{domainId} |
alert:write |
Stop serving a status page on a custom domain and release its certificate. | remove_status_page_domain |
POST |
/v1/orgs/{org}/status-pages/{id}/domains/{domainId}/verify |
alert:write |
Re-check a custom domain with the certificate authority now, instead of waiting for the next automatic check. | verify_status_page_domain |
GET |
/v1/orgs/{org}/status-pages/{id}/incidents |
org:read |
Incidents this status page is showing right now — open ones and any resolved in the last 7 days — each with the stage readers see and every update published about it. | list_status_incidents |
POST |
/v1/orgs/{org}/status-pages/{id}/incidents/{incidentId}/updates |
alert:write |
Publish an update about an incident to a status page: the stage it is at (investigating, identified, monitoring, resolved) and what you want readers to know, in your words. | post_status_update |
GET |
/v1/orgs/{org}/status-pages/{id}/maintenance |
org:read |
Scheduled maintenance windows on a status page, newest first, including past ones. | list_maintenance |
POST |
/v1/orgs/{org}/status-pages/{id}/maintenance |
alert:write |
Schedule a maintenance window on a status page. | schedule_maintenance |
DELETE |
/v1/orgs/{org}/status-pages/{id}/maintenance/{windowId} |
alert:write |
Cancel a scheduled maintenance window. | cancel_maintenance |
POST |
/v1/orgs/{org}/test-page |
— |
Rings the caller's own physical phone at critical-alert insistence to prove their paging setup works. | — (human-only) |
GET |
/v1/orgs/{org}/tokens |
org:admin |
API tokens in the organization (name, scopes, last used, expiry). | list_tokens |
POST |
/v1/orgs/{org}/tokens |
— |
Agents must not mint credentials; tokens are created by a human in Settings → Agents / API tokens. | — (human-only) |
DELETE |
/v1/orgs/{org}/tokens/{id} |
org:admin |
Revoke an API token by id. | revoke_token |
GET |
/v1/orgs/{org}/usage |
org:read |
Exact usage and plan for the organization: plan limits, overage flag, daily accepted events by category, credit balance and expiry. | get_usage |
GET |
/v1/whoami |
org:read |
Who am I? | whoami |
sentry-cli compatibility routes
Same authentication (SENTRY_AUTH_TOKEN becomes the bearer token); scope release:write. See Source maps.
| Method | Path | Purpose |
|---|---|---|
GET |
/api/0/organizations/{org}/chunk-upload/ |
Upload options: 8 MiB chunks, SHA-1 names, gzip, accept: ["artifact_bundles"] |
POST |
/api/0/organizations/{org}/chunk-upload/ |
Multipart chunk upload (≤64 chunks / 32 MiB per request) |
POST |
/api/0/organizations/{org}/artifactbundle/assemble/ |
{checksum, chunks[], projects[], version?, dist?} → {state, missingChunks[]} |
Auth routes (no bearer required)
| Method | Path | Purpose |
|---|---|---|
POST |
/auth/signup |
Create user + organization; sets the session cookie |
POST |
/auth/login |
Password sign-in |
POST |
/auth/logout |
End the session |
GET |
/auth/me |
Current user and memberships |
GET |
/auth/providers |
Enabled sign-in methods |
GET |
/auth/oauth/{provider}/start |
Begin OAuth (google, github, microsoft); ?next= in-app path |
GET |
/auth/oauth/{provider}/callback |
OAuth callback |
POST |
/auth/magic |
Send a magic link |
POST |
/auth/magic/verify |
Redeem a magic link token |
POST |
/auth/orgs |
Create an organization for a signed-in user (session cookie) |
Other endpoints
| Method | Path | Purpose |
|---|---|---|
POST |
/mcp |
The MCP server (JSON-RPC 2.0 over Streamable HTTP, bearer auth) — Connect an agent |
POST |
/stripe/webhook |
Stripe events, verified by signature |
GET |
/healthz |
{"ok": true, "service": "bugwatch-api"} |
POST |
https://ingest.bugwatch.io/api/{project_number}/envelope/ |
SDK ingest (DSN key auth, not a bearer token) — SDKs overview |
GET/POST |
https://uptime.bugwatch.io/ping/{token} |
Heartbeat ping for a heartbeat monitor (the token is the credential; no bearer) — Uptime monitors |
Conventions
- Timestamps are integer epoch milliseconds in responses (
firstSeen,lastSeen,createdAt); stats series use ISO-8601 strings. - Lists page with an opaque
cursorand returnnextCursorwhen truncated. - Mutations return
{"ok": true}or the created object with201. - Analytics-backed responses (
/transactions,/stats,/releases/{version}/health) are sampled estimates and includecachedor anotesaying so.