DOCS

REST API reference

Complete endpoint inventory, authentication methods, request/response shapes, and versioning rules.

Base URL

All endpoints are under:

https://api.howlops.com/api/v1/

Versioning

  • Current version: v1 (URL-prefixed /api/v1/)
  • Non-breaking additions (new fields, new endpoints) ship without a version bump.
  • Breaking changes require a v2 prefix; a 90-day deprecation window applies.

Authentication

MethodUsed byHow to pass
Session cookieWeb platform and admin UIhowlops_session HttpOnly Secure cookie (set by login response)
Workspace API tokenScripts, CI, integrationsAuthorization: Bearer howlops_<hex> (token format, not a JWT)
Prober tokenProber agentAuthorization: Bearer <prober_token>

Public endpoints (/api/v1/public/*, /health) require no authentication.

Common request headers

HeaderWhen to send
Authorization: Bearer <token>All authenticated requests
Content-Type: application/jsonPOST / PUT with a body
Idempotency-Key: <uuid>Optional; POST / PUT; safe to retry on network failure
If-None-Match: <etag>GET; server returns 304 if resource unchanged

Common response headers

HeaderMeaning
X-Request-IdUnique request identifier for tracing
X-RateLimit-LimitAllowed requests per window
X-RateLimit-RemainingRemaining requests in current window
X-RateLimit-ResetUnix timestamp when the window resets
ETagHash for conditional GET
Cache-Control: no-storePresent on session-sensitive responses

Response shapes

List response

Every list endpoint returns a paginated envelope. A bare array is never returned.

json
{
  "items": [...],
  "total": 142,
  "page": 1,
  "per_page": 25,
  "total_pages": 6
}

Default: page=1, per_page=25. Maximum per_page: 100.

Detail response

json
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "tenant_id": "...",
  "created_at": "2026-05-01T12:00:00Z",
  "updated_at": "2026-05-13T08:22:15Z"
}

Create (201) / Update (200) response

Returns the complete object. Not just {"id": "..."}.

Delete response

204 No Content, empty body.

Error response

json
{
  "error": "monitor limit reached for your plan",
  "code": "TIER_LIMIT_EXCEEDED",
  "details": { "current_count": 50, "tier_limit": 50 }
}

See API errors reference for the full code catalog.

Endpoint groups

GroupPurposeMobile
POST /api/v1/auth/loginPassword loginYes
POST /api/v1/auth/registerCreate accountYes
POST /api/v1/auth/logoutInvalidate sessionYes
POST /api/v1/auth/forgot-passwordInitiate password resetYes
POST /api/v1/auth/reset-passwordComplete password resetYes
GET /api/v1/auth/verify-emailVerify email address (GET with token query param)Yes
GET /api/v1/auth/oauth/providersList enabled OAuth providersYes
GET /api/v1/auth/oauth/{provider}Start OAuth flow (google, github, microsoft, apple)Yes
GET /api/v1/auth/oauth/{provider}/callbackOAuth callback handlerYes
POST /api/v1/auth/oauth/apple/nativeApple native sign-in with id_tokenYes
GET /api/v1/oauth/authorizePKCE authorization endpointYes
POST /api/v1/oauth/tokenToken + refresh endpointYes
POST /api/v1/auth/sso/initiateSAML SP-initiated SSONo
GET /api/v1/auth/meCurrent authenticated userYes
PUT /api/v1/settings/profileUpdate profileYes
GET /api/v1/sessionsList active sessionsYes
DELETE /api/v1/sessions/{id}Revoke a sessionYes
GET /api/v1/monitorsList monitors (paginated)Yes
POST /api/v1/monitorsCreate monitorYes
GET /api/v1/monitors/{id}Get monitor (includes current status)Yes
PUT /api/v1/monitors/{id}Update monitorYes
DELETE /api/v1/monitors/{id}Delete monitorYes
GET /api/v1/heartbeatsList heartbeatsYes
POST /api/v1/heartbeatsCreate heartbeatYes
GET /api/v1/heartbeats/{id}Get heartbeatYes
PATCH /api/v1/heartbeats/{id}Update heartbeatYes
DELETE /api/v1/heartbeats/{id}Delete heartbeatYes
GET /api/v1/hb/{slug}Heartbeat ping endpoint (GET, POST, and HEAD are all valid)Yes
POST /api/v1/hb/{slug}Heartbeat ping endpointYes
HEAD /api/v1/hb/{slug}Heartbeat ping endpointYes
GET /api/v1/incidentsList incidents (paginated)Yes
GET /api/v1/incidents/{id}Get incidentYes
POST /api/v1/incidents/{id}/acknowledgeAcknowledge incidentYes
POST /api/v1/incidents/{id}/resolveResolve incidentYes
GET /api/v1/correlation-groupsList correlation groupsYes
GET /api/v1/alertsList alert recordsYes
GET /api/v1/alert-routing-rulesList routing rulesYes
POST /api/v1/alert-routing-rulesCreate routing ruleYes
PUT /api/v1/alert-routing-rules/{id}Update routing ruleYes
DELETE /api/v1/alert-routing-rules/{id}Delete routing ruleYes
GET /api/v1/escalation-policiesList escalation policiesYes
POST /api/v1/escalation-policiesCreate policyYes
PUT /api/v1/escalation-policies/{id}Update policyYes
DELETE /api/v1/escalation-policies/{id}Delete policyYes
GET /api/v1/schedulesList on-call schedulesYes
POST /api/v1/schedulesCreate scheduleYes
PUT /api/v1/schedules/{id}Update scheduleYes
DELETE /api/v1/schedules/{id}Delete scheduleYes
POST /api/v1/schedules/{id}/overridesCreate schedule overrideYes
GET /api/v1/notification-channelsList notification channelsYes
POST /api/v1/notification-channelsCreate channelYes
PUT /api/v1/notification-channels/{id}Update channelYes
DELETE /api/v1/notification-channels/{id}Delete channelYes
POST /api/v1/notification-channels/{id}/testSend test notificationYes
GET /api/v1/notification-logSent notification historyNo
GET /api/v1/notifications/feedPer-user in-app feed (paginated + unread_count)Yes
GET /api/v1/notifications/feed/unread-countUnread countYes
POST /api/v1/notifications/feed/{id}/readMark one as readYes
POST /api/v1/notifications/feed/read-allMark all as readYes
GET /api/v1/users/me/notification-prefsGet notification preferencesYes
PUT /api/v1/users/me/notification-prefsUpdate notification preferencesYes
GET /api/v1/status-pagesList status pagesPartial
POST /api/v1/status-pagesCreate status pagePartial
PATCH /api/v1/status-pages/{id}Update status pagePartial
DELETE /api/v1/status-pages/{id}Delete status pagePartial
GET /api/v1/maintenance-windowsList maintenance windowsYes
POST /api/v1/maintenance-windowsCreate maintenance windowYes
PUT /api/v1/maintenance-windows/{id}Update maintenance windowYes
DELETE /api/v1/maintenance-windows/{id}Delete maintenance windowYes
GET /api/v1/analyticsUptime and response-time statsPartial
GET /api/v1/analytics/sla-reportSLA reportPartial
GET /api/v1/analytics/monitor-breakdownPer-monitor breakdownPartial
GET /api/v1/billing/subscriptionCurrent subscriptionYes
POST /api/v1/billing/capability-checkoutStart capability-based Stripe checkoutYes
POST /api/v1/billing/capability-checkout-embeddedEmbedded Stripe checkout for a capabilityYes
POST /api/v1/billing/downgradeSchedule downgrade {target_tier}Yes
DELETE /api/v1/billing/downgradeCancel scheduled downgradeYes
POST /api/v1/billing/intervalSwitch billing interval {interval}Yes
GET /api/v1/billing/invoicesList invoices (paginated)Yes
GET /api/v1/billing/tax-infoGet tax IDYes
PUT /api/v1/billing/tax-infoSet tax ID {country, tax_id, tax_id_type}Yes
GET /api/v1/billing/currenciesSupported billing currenciesYes
POST /api/v1/account/exportStart a workspace-wide data export job (owner/admin only)Yes
POST /api/v1/account/export/personalStart a personal-data-only export job (any member, GDPR Art. 15)Yes
GET /api/v1/account/export/{job_id}Export job status; add ?download=1 once completed to stream the ZIPYes
GET /api/v1/audit-logTenant audit log (paginated)No
GET /api/v1/feature-flagsActive feature flags for tenantYes
GET /api/v1/feature-gatesList feature gatesYes
GET /api/v1/onboarding/statusOnboarding step statusYes
POST /api/v1/workspace/onboarding/stepMark onboarding step completeYes
GET /api/v1/push-tokensList push tokensYes
POST /api/v1/push-tokensRegister device push tokenYes
DELETE /api/v1/push-tokens/{token}Unregister deviceYes
GET /api/v1/public/brand-settingsPublic brand confign/a
GET /api/v1/public/status-pages/{slug}Public status pagen/a
POST /api/v1/public/status-pages/{slug}/subscribeSubscribe to status pagen/a
GET /api/v1/public/capability-plansCapability plan catalog with pricing (drives the pricing page)n/a
GET /api/v1/public/tiersPublic tier summary with per-capability pricingn/a
GET /api/v1/public/tier-comparisonPlan comparison matrixn/a
GET /api/v1/public/billing/currenciesSupported currencies (public)n/a
POST /api/v1/mcpHosted MCP endpoint (JSON-RPC, bearer auth)No
GET /api/v1/mcpMCP capability handshakeNo
GET /healthHealth checkn/a
WSS /api/v1/wsWebSocket real-time events (token query param)Yes

Incident status values

The lifecycle labels shown in the dashboard map onto a smaller set of raw status values returned by the API. There is no acknowledged status — acknowledgement is a separate timestamp (acknowledged_at) layered on top of an ongoing incident.

Dashboard labelAPI statusNotes
Triggered / OngoingongoingThe incident is open. acknowledged_at is null.
Acknowledgedongoing + acknowledged_at setStill ongoing; a responder has taken it. Escalation pauses.
ResolvedresolvedThe underlying signal recovered (auto-resolve or recovery event).
Closedresolved + manually_closed_at setA person closed it by hand rather than it auto-recovering. The status column is still resolved; the manually_closed_at / manually_closed_by fields distinguish a manual close from an auto-recovery.

The status field itself is only ever ongoing or resolved. Acknowledgement (acknowledged_at) and a manual close (manually_closed_at) are timestamps layered on top, not distinct status values. promoted_at (whether the alert became an incident) and is_major are likewise separate flags — they do not change status. An alert and an incident share the same lifecycle values.

WebSocket

WSS /api/v1/ws?token=<workspace_api_token>

The token query parameter must be a workspace API token (howlops_<hex>), not an OAuth or JWT access token. Alternatively, pass the howlops_session cookie (browser clients). The connection streams real-time incident and monitor status events. See the Events reference for event payload shapes.

Rate limits

See Rate limits reference.

See also

Was this page helpful?