Docs/Build & operate
Developer reference

API reference

Authenticate, select a tenant, and integrate with Probara's monitoring, alerting, incident, and administration APIs.

Base URL and conventions

The control-plane API is rooted at {API_ORIGIN}/api/v1. The API serves /healthz, /readyz, and /metrics on HTTP_PORT (8080 in the bundled deployments); its declared METRICS_PORT does not have a separate listener. Public rendered status pages are served by the separate status-page service.

Set an origin for examples
export PROBARA_API_ORIGIN='https://monitoring.example.com'

curl "$PROBARA_API_ORIGIN/healthz"
curl "$PROBARA_API_ORIGIN/readyz"
ConventionBehavior
Content typeSend application/json for JSON request bodies; import endpoints also accept supported file content
IdentifiersResources use UUID-shaped IDs unless the endpoint uses a public slug or capability token
TimesUse RFC 3339 timestamps for filters and scheduled fields
Tenant scopeResolved from an admin membership selection or permanently from the API key
DeletionMany operational resources are soft-deleted first and cleaned asynchronously
ErrorsMost application handlers return JSON error information, but a few low-level validation paths can return plain HTTP error text

Authentication

Administrator session
Login establishes an HTTP-only access cookie and a rotating refresh session. It is the credential used by the web application and can switch among allowed tenants.
API key
Send Authorization: Bearer pk_<secret>. The key has read or write scope and is bound to its creation tenant.
Push token
Used only in /api/v1/push/{token}. No cookie or bearer key is required because possession of the URL token authorizes a heartbeat.
API-key request
curl \
  -H 'Authorization: Bearer pk_<secret>' \
  -H 'Accept: application/json' \
  "$PROBARA_API_ORIGIN/api/v1/monitors?page=1&page_size=20"
Public authentication routePurpose
POST /api/v1/auth/loginLocal username/password login
POST /api/v1/auth/refreshRotate and refresh an admin session
POST /api/v1/auth/logoutRevoke the current refresh session and clear cookies
GET /api/v1/auth/meRead the current session user when present
GET /api/v1/auth/oidc/statusReport OIDC availability
GET /api/v1/auth/oidc/startBegin authorization-code + PKCE login
GET /api/v1/auth/oidc/callbackComplete the provider callback
GET /api/v1/users/bootstrap/statusCheck whether first-user bootstrap remains available
POST /api/v1/users/bootstrap/firstCreate the one-time first superadministrator

Tenant selection and permissions

For an administrator cookie, send X-Tenant-ID: <tenant-id> to select an allowed membership. A supported tenant_id query fallback can select context where middleware permits it. API keys ignore caller-selected tenant values and remain pinned to one tenant.

Administrator-session tenant header
curl \
  --cookie cookie-jar.txt \
  -H 'X-Tenant-ID: <tenant-id>' \
  "$PROBARA_API_ORIGIN/api/v1/auth-context"
PrincipalReadsMutations
Tenant viewer / read API keyTenant dataOnly approved compute-only POST diagnostics
Tenant editor / write API keyTenant dataNormal operational writes; not tenant-admin-only governance
Tenant adminTenant data and auditAll tenant writes, API-key management, and tenant settings
Platform superadminAny selected tenant plus platform usersPlatform user administration and tenant operations

Compute-only POST exceptions include /monitors/test, /monitors/import/preview, /monitors/dependency-suggestions, /mesh/probe, and /ai-settings/test. They do not persist monitor/result/graph state. Channel test sends a real outbound notification and therefore is not read-only.

Pagination and common filters

Collection APIs generally accept 1-based page and page_size. The common maximum is 100; locations allow up to 200, and dashboard recent-item limits are capped at 50. Use returned total/page metadata where provided rather than inferring completion from a short page.

ResourceImportant filters
Monitorstag (repeatable where supported), enabled, page, page_size (default 20, max 100)
Monitor resultslimit, optional RFC 3339 since
Monitor analyticsrange: 1h, 6h, 24h, 7d, 30d, 90d, 365d
Alertsstatus, monitor_id, since, page, page_size (max 100)
Maintenancestatus, monitor_id, page, page_size
Mesh historysource, target, and hours
Dashboardrange, repeatable tag, and bounded recent-item limits
Audit logaction, outcome, actor_id, RFC 3339 from / to, pagination

Monitor endpoints

Method and pathPurpose
POST /api/v1/monitorsCreate a monitor
GET /api/v1/monitorsList tenant monitors
POST /api/v1/monitors/testExecute a supplied config without persistence or alerting
GET /api/v1/monitors/{id}Get full monitor detail
PATCH /api/v1/monitors/{id}Update monitor fields/config
DELETE /api/v1/monitors/{id}Soft-delete a monitor
POST /api/v1/monitors/{id}/runQueue a persisted on-demand check
GET /api/v1/monitors/{id}/resultsList raw check results
GET /api/v1/monitors/{id}/analyticsGet summary, series, latency, downtime, and coverage
DELETE /api/v1/monitors/{id}/historyDelete the monitor's stored result history
GET /api/v1/monitors/{id}/artifacts/screenshot?path=...Retrieve an authorized synthetic-browser screenshot path
POST /api/v1/monitors/{id}/snoozeCreate a one-monitor snooze by duration or end time
Create an HTTP monitor
{
  "name": "Public API",
  "type": "http",
  "config": {
    "url": "https://api.example.com/health",
    "method": "GET",
    "expected_status_classes": ["2xx"],
    "json_assertions": [
      {"path": "status", "op": "equals", "value": "ok"}
    ],
    "max_latency_ms": 1500
  },
  "interval_seconds": 60,
  "timeout_seconds": 15,
  "enabled": true,
  "tags": ["api", "production"],
  "consecutive_failures_threshold": 2,
  "notification_mode": "default",
  "location_ids": [],
  "location_quorum": 1
}

Monitor relationships, bulk, and portability

Method and pathPurpose
GET /api/v1/monitors/{id}/membersList group members
POST /api/v1/monitors/{id}/membersAdd monitors to a group
DELETE /api/v1/monitors/{id}/membersRemove supplied monitors from a group
GET /api/v1/monitors/{id}/dependenciesList upstream dependencies
POST /api/v1/monitors/{id}/dependenciesCreate an upstream edge
DELETE /api/v1/monitors/{id}/dependencies/{dependsOnId}Remove an upstream edge
GET /api/v1/monitors/{id}/dependentsList downstream dependents
GET /api/v1/monitors/dependency-graphGet all participating nodes and directed edges
POST /api/v1/monitors/dependency-suggestionsCompute advisory AI suggestions without saving edges
POST /api/v1/monitors/bulk/alertingUpdate notification routing for selected monitors
POST /api/v1/monitors/bulk/deleteSoft-delete selected monitors
GET /api/v1/monitors/exportExport a versioned YAML configuration bundle
POST /api/v1/monitors/import/previewParse, map, and validate without creating resources
POST /api/v1/monitors/importExecute import and return per-row outcomes

Dependency creation rejects self-reference and transitive cycles with HTTP 409. Export/import is not a universal secret-preserving round trip: masked fields and newer monitor types require explicit preview and remediation. Import preview reports a schema for recognized sources (portable_monitor_export, uptime_kuma_export), per-row warnings, and skipped_rows naming source records it declined to translate.

Locations, mesh, and maintenance

Method and pathPurpose
POST /api/v1/locationsCreate a private location and credential
GET /api/v1/locationsList tenant locations
GET /api/v1/locations/{id}Get location detail
PATCH /api/v1/locations/{id}Update location metadata/state
DELETE /api/v1/locations/{id}Delete and detach a location
GET /api/v1/locations/{id}/deployGenerate credential-scoped deployment information
GET /api/v1/meshRead current directional mesh topology/state
GET /api/v1/mesh/historyRead filtered edge history
POST /api/v1/mesh/probeRun a compute-only immediate directional diagnostic
POST /api/v1/maintenance-windowsCreate scheduled maintenance
GET /api/v1/maintenance-windowsList/filter maintenance
GET /api/v1/maintenance-windows/{id}Get a maintenance window
PATCH /api/v1/maintenance-windows/{id}Update a maintenance window
DELETE /api/v1/maintenance-windows/{id}Delete a maintenance window
Create maintenance
{
  "title": "Database upgrade",
  "description": "Planned primary database maintenance",
  "starts_at": "2026-08-01T22:00:00Z",
  "ends_at": "2026-08-01T23:30:00Z",
  "monitor_ids": ["<monitor-id>"]
}

Dashboard endpoints

Method and pathResponse focus
GET /api/v1/dashboard/overviewStats, trend, activity, platform health, problems, recent failures/alerts, tags
GET /api/v1/dashboard/summaryCurated tag-group service summary and ungrouped monitors
GET /api/v1/dashboard/problem-monitorsMonitors needing attention
GET /api/v1/dashboard/recent-failuresBounded recent failing results
GET /api/v1/dashboard/recent-alertsBounded recent alert records
GET /api/v1/dashboard/group-sparklineDeferred time series for one dashboard group

Overview ranges are 1h, 24h, 7d, 30d, 90d, and 365d, defaulting to 24h. Dashboard group rows are tag-derived presentation, not group-monitor resources.

Alert and notification endpoints

Method and pathPurpose
GET /api/v1/alertsPaginated/filterable alert list (status, monitor_id, since, suppressed=true|false); items carry suppression_reason and impacted_count when dependency suppression applies
GET /api/v1/alerts/recentRecent alerts with bounded limit
GET /api/v1/alerts/streamAuthenticated server-sent event stream
GET /api/v1/alerts/{id}Alert detail
POST /api/v1/alerts/{id}/acknowledgeMark an open condition acknowledged
POST /api/v1/alerts/{id}/resolveManually close an alert lifecycle
GET /api/v1/alert-channelsList configured channels
POST /api/v1/alert-channelsCreate a plugin-backed channel
GET /api/v1/alert-channels/{id}Read channel with protected config masked
PATCH /api/v1/alert-channels/{id}Update config or active state
DELETE /api/v1/alert-channels/{id}Delete a channel
POST /api/v1/alert-channels/{id}/testSend a real test notification
GET /api/v1/alert-channel-pluginsList channel plugin form manifests
GET /api/v1/alert-channel-plugins/{type}Get one plugin manifest
GET /api/v1/notification-settingsRead tenant defaults, reminders, anomaly and auto-incident settings
PUT /api/v1/notification-settingsReplace tenant notification settings

Incident endpoints

Method and pathPurpose
GET /api/v1/incidentsList incidents
POST /api/v1/incidentsCreate an incident
GET /api/v1/incidents/{id}Get full incident context
PATCH /api/v1/incidents/{id}Update metadata
POST /api/v1/incidents/{id}/stateTransition lifecycle state
POST /api/v1/incidents/{id}/timelineAdd an internal note, public update, or supported timeline event
POST /api/v1/incidents/{id}/alertsAttach an alert
DELETE /api/v1/incidents/{id}/alerts/{alertId}Detach an alert
POST /api/v1/incidents/{id}/monitorsAttach a monitor
DELETE /api/v1/incidents/{id}/monitors/{monitorId}Detach a monitor
PUT /api/v1/incidents/{id}/status-pages/{statusPageId}Publish incident to one status page
DELETE /api/v1/incidents/{id}/status-pages/{statusPageId}Unpublish from one status page
POST /api/v1/incidents/{id}/ai-analysisQueue tenant-configured asynchronous analysis
GET /api/v1/incidents/{id}/ai-analysisRead pending, ready, or failed analysis state

Status page endpoints

Method and pathPurpose
POST /api/v1/status-pagesCreate a page
GET /api/v1/status-pagesList pages
GET /api/v1/status-pages/{id}Get page configuration
PATCH /api/v1/status-pages/{id}Update page and settings
DELETE /api/v1/status-pages/{id}Delete a page
GET /api/v1/status-pages/{id}/templateRead published/draft/version state
DELETE /api/v1/status-pages/{id}/templateReset to the built-in template as a new version
GET /api/v1/status-pages/{id}/template/defaultExport current built-in source
GET /api/v1/status-pages/{id}/template/versions/{version}/sourceRead archived version source
PUT /api/v1/status-pages/{id}/template/draftValidate and save the one draft
DELETE /api/v1/status-pages/{id}/template/draftDiscard draft
POST /api/v1/status-pages/{id}/template/publishPublish draft and archive current source
POST /api/v1/status-pages/{id}/template/revertRepublish archived source as a new version
Template-library routePurpose
GET /api/v1/status-page-templatesList tenant template metadata
POST /api/v1/status-page-templatesCreate a validated library entry
GET /api/v1/status-page-templates/{templateId}Get entry metadata
GET /api/v1/status-page-templates/{templateId}/sourceRetrieve source
PATCH /api/v1/status-page-templates/{templateId}Rename/update source
DELETE /api/v1/status-page-templates/{templateId}Delete library entry

The separate status-page service exposes unauthenticated GET /public/status/{slug}, /data, and /stream, plus draft preview. Do not use those public routes to mutate configuration.

Agent and push endpoints

Method and pathAuthorization and purpose
POST /api/v1/otlp/v1/metricsTenant write API key (Bearer) plus X-Probara-Agent-Id; OTLP/HTTP metric ingest for collector agents
POST /api/v1/agent/metricsDeprecated legacy-agent ingest (Sunset: 18 Nov 2026, then 410); tenant write API key
GET /api/v1/monitors/{id}/agent/installAuthenticated; generated install command/information incl. collector_config and collector_version
GET /api/v1/monitors/{id}/agent/config.yamlAuthenticated; raw collector YAML for one platform (linux/darwin/windows)
GET /api/v1/monitors/{id}/agent/install/script.shAuthenticated Unix installer
GET /api/v1/monitors/{id}/agent/install/script.ps1Authenticated Windows installer
GET /api/v1/monitors/{id}/agent/uninstall/script.shAuthenticated Unix uninstaller
GET /api/v1/monitors/{id}/agent/uninstall/script.ps1Authenticated Windows uninstaller
GET /api/v1/monitors/{id}/metrics/seriesAuthenticated; discover stored metric series for an agent monitor
POST /api/v1/monitors/{id}/metrics/queryAuthenticated (read-only despite POST, viewer-accessible); batch range queries — ≤12 queries, ≤50 series and ≤2,000 points per series per response, automatic raw-vs-rollup selection for ranges over 48 h or steps ≥1 h
GET /api/v1/monitors/{id}/push/infoAuthenticated generated push URL/config information
GET /api/v1/push/{token}Public capability token; success heartbeat plus query metrics
POST /api/v1/push/{token}Public capability token; status/error plus arbitrary metric values

Administration endpoints

Method and pathRequired role and purpose
GET /api/v1/auth-contextAuthenticated; effective credential, tenant, role, and scope
GET /api/v1/tenantsAdmin session; list membership-filtered tenants or all for superadmin
GET /api/v1/tenant-settingsAuthenticated; read retention and dashboard tags
PATCH /api/v1/tenant-settingsTenant admin; update retention/dashboard tags
GET /api/v1/api-keysAuthenticated tenant context; list safe key metadata
POST /api/v1/api-keysTenant admin; create and return secret once
DELETE /api/v1/api-keys/{id}Tenant admin; revoke
GET /api/v1/audit-logTenant admin; filtered audit records
GET /api/v1/audit-log/actionsTenant admin; distinct action catalog
GET /api/v1/ai-settingsAuthenticated; effective tenant-safe settings
PUT /api/v1/ai-settingsAuthorized write; replace tenant AI configuration
POST /api/v1/ai-settings/testCompute-only provider connection test
GET /api/v1/usersSuperadmin; list platform users
POST /api/v1/usersSuperadmin; create user and memberships
GET /api/v1/users/{id}Superadmin; user detail
PATCH /api/v1/users/{id}Superadmin; update role/auth/membership fields
DELETE /api/v1/users/{id}Superadmin; delete subject to last-admin/self safeguards
GET /api/v1/oidc-group-mappingsSuperadmin; list OIDC group→role mappings, groups seen at past SSO logins, and groups-claim config facts
POST /api/v1/oidc-group-mappingsSuperadmin; map an IdP group to a tenant role or platform superadmin
PATCH /api/v1/oidc-group-mappings/{id}Superadmin; change a mapping's role and/or display label
DELETE /api/v1/oidc-group-mappings/{id}Superadmin; remove a mapping

Server-sent events

GET /api/v1/alerts/stream is an authenticated tenant alert stream. The public status-page service exposes a different slug-scoped stream at /public/status/{slug}/stream. Use a native EventSource-compatible client where cookie authentication is required, or a streaming HTTP client that can attach the bearer key.

Inspect an alert stream
curl -N \
  -H 'Authorization: Bearer pk_<secret>' \
  "$PROBARA_API_ORIGIN/api/v1/alerts/stream"
  • Reconnect with backoff after network or proxy interruption.
  • Treat events as refresh/invalidation signals and refetch durable resource state.
  • Keep proxy buffering disabled for the streaming route.
  • Do not assume the stream is a replayable audit log.

Build a safe client

  • Set explicit HTTP timeouts and retry only operations whose idempotency you understand.
  • Retry GET requests with bounded exponential backoff; do not blindly retry create, run-now, import execution, notification tests, or incident timeline writes.
  • Use import preview before import execution and monitor test before saving complex check configuration.
  • Respect 401, 403, 404, 409, 410, 422, and rate/transport failures as distinct conditions.
  • Send ***, or leave the field out, to keep a masked designated secret field; send an empty string when you deliberately want to clear it.
  • Page collections and retain returned coverage metadata for analytics.
  • Store full API keys only in a secret manager; the API returns them once.
  • Log resource IDs and status codes without logging bearer keys, push tokens, installer output, WebSocket headers, connection strings, or webhook secrets.