bugwatch docs

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 cursor and return nextCursor when truncated.
  • Mutations return {"ok": true} or the created object with 201.
  • Analytics-backed responses (/transactions, /stats, /releases/{version}/health) are sampled estimates and include cached or a note saying so.