Back to Nova AI Ops
API REFERENCE · v1

The Nova REST API.

Every Nova UI surface, alerts, incidents, runbooks, services, agents, on-call, is also reachable via REST. JSON in, JSON out, bearer-token auth, OpenAPI 3.1 spec available. The launch surface covers read + most writes; expanded write coverage and an interactive playground are on the roadmap.

Base URL

https://api.novaaiops.com/v1

All endpoints are under the /v1 prefix. Versioning is date-pinned in the API-Version request header for breaking-change isolation; the URL path version increments only on full v2 cuts.

Authentication

Authenticate every request with a bearer token. Tokens are issued from the admin UI under Settings → API Tokens, scoped per role (Read-Only, Operator, Admin), and rotatable without downtime.

curl https://api.novaaiops.com/v1/incidents \
  # bearer token, scoped to your tenant
  -H "Authorization: Bearer $NOVA_TOKEN" \
  -H "API-Version: 2026-04-01"

Tokens never expire on their own; rotate them on a schedule that matches your security policy. Compromised tokens revoke instantly via the same Settings UI.

Incidents

The incident lifecycle endpoints. Cover the same surface the on-call UI uses: create, ack, resolve, timeline, autogen postmortems, and inline comments.

MethodPathDescription
GET/incidentsList incidents; filter by ?status=open, ?severity=sev1, ?service=...
POST/incidentsCreate an incident with title, severity, affected services
GET/incidents/{id}Fetch a single incident with current state and metadata
POST/incidents/{id}/ackAcknowledge a paged incident
POST/incidents/{id}/resolveMark an incident resolved with a closing note
GET/incidents/{id}/timelineFull event stream: pages, agent actions, comments, status changes
GET/incidents/{id}/postmortemAuto-generated postmortem draft (root cause, contributing factors, action items)
POST/incidents/{id}/commentsAdd a comment to the incident timeline

Alerts

Read alert state, manage silences, and define alert rules. Silencing returns a deterministic ID so you can revoke it programmatically from the same client.

MethodPathDescription
GET/alertsList alerts; ?firing=true for active, ?service=... to filter
GET/alerts/{id}Fetch a single alert with rule, history, and routing
POST/alerts/{id}/silenceSilence an alert for a duration with a required reason
DELETE/alerts/{id}/silenceUn-silence (lift an active silence early)
POST/alerts/{id}/notifyManually re-fire notifications to all routed channels
GET/alert-rulesList alert rules with thresholds and notification routing
POST/alert-rulesCreate a new alert rule (PromQL or NovaQL expression)

Services and SLOs

The service catalog and SLO posture. /services/{name}/dependencies returns the resolved upstream/downstream graph used by the topology view.

MethodPathDescription
GET/servicesList services tracked in the platform
POST/servicesRegister a new service with team owner and tier
GET/services/{name}Service detail: owner, tier, runbooks, recent incidents
GET/services/{name}/healthGolden signals snapshot (latency, traffic, errors, saturation)
GET/services/{name}/dependenciesResolved dependency graph (upstream/downstream services)
GET/sloSLO posture across all services with current burn rates
GET/slo/{service}Per-service SLO target, current attainment, error budget
POST/slo/{service}Set or update an SLO target (objective + window)

Runbooks and agents

Runbooks define safe automated remediations; agents are the policy-bound executors. Every /runbooks/{id}/run writes to the agent audit ledger so an external system can replay or review the action.

MethodPathDescription
GET/runbooksList runbooks; ?service=X filters by service
POST/runbooksCreate a runbook (steps, guardrails, approval policy)
POST/runbooks/{id}/runExecute a runbook through the agent within policy
GET/runbooks/{id}/runsExecution history with status, duration, and operator
GET/agentsList agent fleet with current trust scores and roles
GET/agents/{id}Agent detail: capabilities, scope, approval policy
POST/agents/{id}/actionsApprove or reject a queued agent action
GET/agents/{id}/auditTamper-evident audit ledger for one agent

On-call and schedules

Read who is on call right now, manage schedules, apply overrides, and define escalation policies. Same data model the on-call UI and Slack/Teams bots consume.

MethodPathDescription
GET/oncallCurrent on-call across all rotations with contact info
GET/oncall/schedulesList schedules with rotations and members
POST/oncall/schedulesCreate a schedule (members, rotation cadence, timezone)
POST/oncall/overridesApply a temporary override (cover for someone)
GET/escalation-policiesList escalation policies with steps and timeouts
POST/escalation-policiesCreate or update an escalation policy

Synthetic checks

Create black-box probes that hit a URL or TCP port from one or more regions on a schedule. Results stream into the same alert pipeline as agent telemetry, so a failed probe pages on-call.

MethodPathDescription
GET/syntheticsList synthetic checks with last result and uptime
POST/syntheticsCreate a check (HTTP / TCP / browser-flow), regions, cadence
GET/synthetics/{id}/resultsRecent run results with latency, status, and screenshot URLs
POST/synthetics/{id}/runTrigger a one-off run outside the schedule
DELETE/synthetics/{id}Delete a synthetic check

Audit logs

Every privileged action lands in the audit log: agent executions, alert silences, user role changes, runbook approvals. Each entry includes actor, target, before/after, and a request ID that ties back to the originating API call.

MethodPathDescription
GET/auditSearch audit events; filter by ?actor=, ?target=, ?since=
GET/audit/{id}Fetch a single audit event with full diff and request context
POST/audit/exportExport a date range to CSV or JSON; returns a signed download URL

Webhooks

Subscribe to events for incidents, alerts, agent actions, and audit. Each delivery is signed with HMAC-SHA256; rotate the secret without dropping in-flight deliveries via the rotate endpoint.

MethodPathDescription
GET/webhooksList webhook subscriptions with event filters and last delivery
POST/webhooksCreate a subscription (URL, event types, secret)
POST/webhooks/{id}/rotate-secretRotate the signing secret; previous secret valid for 24h
POST/webhooks/{id}/testSend a test event to the configured URL
DELETE/webhooks/{id}Delete a subscription

Users, tokens, and SCIM

User management and API token rotation. SCIM 2.0 is exposed at /scim/v2 for automated provisioning from Okta, Azure AD, or any SCIM-capable IdP.

MethodPathDescription
GET/usersList users in the tenant with role and last-active timestamp
POST/usersInvite a user by email; assigns role on accept
DELETE/users/{id}Deactivate a user and revoke all their tokens
GET/tokensList API tokens (metadata only, never returns the secret)
POST/tokens/{id}/rotateRotate a token; new secret returned once, old valid for 1h
GET/scim/v2/ServiceProviderConfigSCIM 2.0 service config (point your IdP here)

Dashboards and NovaQL

NovaQL is Nova's metric query language. Run ad-hoc queries against the same TSDB the UI uses, and persist results as panels inside dashboards.

MethodPathDescription
GET/dashboardsList dashboards with owner and last-edited timestamp
POST/dashboardsCreate or save a dashboard with panels and layout
GET/dashboards/{id}Fetch a dashboard with its panel definitions
POST/novaqlRun a NovaQL query; returns timeseries results with metadata
GET/panels/{id}/dataFetch the resolved data for a single panel (CSV or JSON)

Integrations

Connect, test, and sync provider integrations programmatically. /integrations/{provider}/connect returns an OAuth or device-flow URL the user has to complete in a browser; everything else is callable headless.

MethodPathDescription
GET/integrationsList connected providers with health and last-sync time
POST/integrations/{provider}/connectStart a connect flow; returns OAuth URL or device code
POST/integrations/{provider}/testProbe credentials and report success / specific failure reason
POST/integrations/{provider}/syncTrigger an out-of-band sync (pull resources, services, alerts)
GET/integrations/{provider}/statusIntegration health, sync lag, and last error if any
DELETE/integrations/{provider}Disconnect and delete stored credentials

Quick example, Python

import os, requests

resp = requests.get(
    "https://api.novaaiops.com/v1/incidents",
    params={"status": "open"},
    headers={
        "Authorization": f"Bearer {os.environ['NOVA_TOKEN']}",
        "API-Version": "2026-04-01",
    },
)
resp.raise_for_status()
for inc in resp.json()["data"]:
    print(inc["id"], inc["severity"], inc["title"])

Quick example, Node

const res = await fetch("https://api.novaaiops.com/v1/incidents?status=open", {
  headers: {
    "Authorization": `Bearer ${process.env.NOVA_TOKEN}`,
    "API-Version": "2026-04-01",
  },
});
const { data } = await res.json();
data.forEach(inc => console.log(inc.id, inc.severity, inc.title));

Rate limits

Defaults: 100 requests/minute per token, 10K requests/day per tenant. Bursts above the per-minute cap return 429 Too Many Requests with a Retry-After header. Enterprise plans raise both limits; ask sales if you need more.

Errors and pagination

Every non-2xx response uses the same envelope so clients can switch on error.code without inspecting the HTTP status. request_id is the right thing to quote when you email support.

{
  "error": {
    "code": "incident_not_found",
    "message": "No incident with id=inc_12abf3 in tenant=acme-prod.",
    "request_id": "req_01HXY8N9V2W4M2A0Q9P1B2C3D4"
  }
}

Status codes you'll see: 400 validation, 401 bad token, 403 token lacks scope, 404 resource missing, 409 state conflict (e.g. acking a resolved incident), 422 semantic conflict, 429 rate limit, 500 on our side.

List endpoints are cursor-paginated. Pass ?limit=N (max 200, default 50) and ?cursor=X (the value returned in next_cursor on the previous page). When next_cursor is omitted you've reached the end.

{
  "data": [ /* ... up to N items ... */ ],
  "next_cursor": "eyJpZCI6Imluc18xMjNhYmYzIn0"
}

POST endpoints accept an optional Idempotency-Key header. If you replay the same key within 24 hours, Nova returns the original response instead of creating a duplicate. Use it for any write that you might retry on a network blip.

OpenAPI spec

The full spec lives at api.novaaiops.com/v1/openapi.json. Drop it into Swagger UI, Postman, Insomnia, or any OpenAPI client to generate types and SDKs.

Talk to a human

If you're integrating against the API and run into anything weird, email developers@novaaiops.com. Same-day reply during business hours, faster on Slack if you're an enterprise customer.

Get a token Use the CLI Read the docs