REST API overview¶
Everything the dashboard does is available under /api/v1, and the Agent,
the plugins and the reporting scripts use the same API. This page covers the
conventions that apply to every call; the interactive reference lists each
route.
Where the API lives¶
| Host | Serves | Typical caller |
|---|---|---|
Your workspace address - https://<slug>.app.certin.tel or your own vanity domain - plus /api/v1 |
The whole API and the dashboard. | Browser sessions, integration keys, scripts that read the inventory. |
The ingest host https://api.certin.tel |
Only the routes an Agent or reporting script needs: POST /api/v1/renewals, /checkins, /internal-certs, /agents/heartbeat, /agents/capabilities, /agents/workflow-assignments and …/{id}/status (Agent 1.3.95 and later), /agents/unregister, /internal-endpoints/claim and …/{id}/result, /crl-monitors/report, /private-cas/{id}/issue, the …/agent/all listings, /install-tokens/exchange, /dns-delegations/{id}/txt, /acme-dns/update, /api/v1/auth/me, /api/v1/releases, /api/v1/meta, /api/v1/version and the public /pki/ publication paths. No dashboard, no sign-in, no inventory reads. |
Agents, ACME clients and scanners that must keep working even when the dashboard sits behind an IP allowlist. |
The ingest host is never filtered by the workspace IP allowlist; the workspace address is, unless Settings → Security allows ingest from any IP. Use the exact base URL shown on the Install Tokens, API Keys or Delegated DNS-01 page rather than deriving one.
Interactive reference¶
Sign in to your workspace and open API docs from the account menu, or go
to /api/v1/docs (Swagger UI) or /api/v1/redoc; the schema is at
/api/v1/openapi.json. The reference is generated from the running platform,
so it always matches the deployed version. Demo accounts are redirected away
from it. GET /api/v1/meta (no authentication) returns the product version,
build, deployment mode and capability flags; GET /api/v1/version adds the
database schema status.
Authentication¶
- API keys are presented as
<prefix>.<secret>in either theX-Api-Keyheader orAuthorization: Bearer <prefix>.<secret>. What a key may do is decided by its scope and organization binding; see API keys & authentication. A wrong, revoked or expired key always gets the same401. - Browser sessions from the dashboard can call the API too (the API docs
page relies on this).
POST /api/v1/auth/loginstarts a session for a local account and is throttled like the sign-in page (10 attempts per minute per address and email, 30 per address, and a 15-minute lockout after eight consecutive failures); single sign-on users sign in through the dashboard. For an account with two-factor sign-in, the answer hasmfa_required: trueand the session can only callPOST /api/v1/auth/mfa/verify(withcodeorrecovery_code),GET /api/v1/auth/meandPOST /api/v1/auth/logoutuntil the code is verified; every other call answers403withmfa-required. GET /api/v1/auth/medescribes the current principal: the tenant, the organizations it can act in, its permissions, and for a reporting key thereporting_organization_idits submissions land in. It is the quickest way to check a new key.
Pagination¶
List routes use keyset pagination:
| Query parameter | Meaning |
|---|---|
limit |
Rows per page, 1–200, default 50. |
cursor |
The opaque meta.next_cursor from the previous page; omit for the first page. It is signed - do not construct or decode it. |
sort, order |
Field to sort by and asc / desc (default desc) where the route supports it. |
Responses carry the rows in items and a meta object with limit,
next_cursor and has_more; stop when has_more is false.
Errors¶
Every error is an RFC 9457 problem document with
Content-Type: application/problem+json:
{
"type": "https://certin.tel/problems/not-found",
"title": "Not Found",
"status": 404,
"detail": "…",
"request_id": "…",
"errors": [{"field": "…", "message": "…"}]
}
errors appears only on validation failures (422). Quote the request_id
when you report a problem. A resource that exists in another tenant or
organization answers 404, never 403, so an id cannot reveal what exists
elsewhere; see troubleshooting.
A 429 (…/problems/rate-limited) carries a Retry-After header; wait that
long before retrying.
Resource families¶
| Prefix | What it covers | Guide |
|---|---|---|
/auth |
Session login/logout, password change, me, and the second sign-in step POST /auth/mfa/verify. |
this page, Two-factor sign-in |
/organizations, /users, /roles, /permissions |
Organization tree, users, built-in and custom roles, the permission catalogue. POST /users/{user_id}/mfa/reset removes a user's two-factor sign-in (users.update, 204). |
Organizations, users & roles, Two-factor sign-in |
/api-keys, /install-tokens |
Integration and Agent keys, install tokens and the exchange route. POST /install-tokens/one-time (platform builds after 2026.10.28) mints a one-time token (expires_in_minutes 15, 60, 240 or 1440; the 201 answer carries the secret once, with Cache-Control: no-store); token responses include kind (organization / one_time) and used_at, and reveal, rotate and reactivate answer 409 for a one-time token. |
API keys, Install tokens |
/certificates, /ct-findings, /targets |
The inventory, Certificate Transparency findings, public endpoint monitors. A certificate carries renewal_schedule (planned renewal, basis, ARI window, deployment state) when its managing Agent reports one. A CT finding carries issued_by_certintel, in_inventory and new_name_set. GET/POST /targets/{target_id}/certificate-links and DELETE /targets/{target_id}/certificate-links/{link_id} list, add and remove an endpoint's links to managed certificates (targets.read / targets.update). A target carries a tls block (grade, reasons, versions, cipher, key exchange group, post-quantum badge, chain, assessment time) and a writable probe_legacy_tls, on a platform build that offers TLS grades. |
Certificates, TLS grade, CT Log Watch |
/trusted-cas |
Trust anchors and the ignore list (ignored.json is public). |
Trusted CAs |
/private-cas and /pki/{ca_id}/… |
Issuing CAs, issuance, export, revocation and the public CRL publication. Where offered: POST /private-cas/{ca_id}/rotate (Rotate now, private_ca.update, 202), auto_rotate on PATCH, and GET /private-cas/{ca_id}/trust (per-host root trust, private_ca.read). |
Private CA |
/renewals, /checkins, /internal-certs |
Reporting from ACME clients and scanners. A renewal read carries failure_output (a failed installation step and the redacted end of its output) and deployment_window_override when the Agent reported them. |
ACME check-ins & renewals, Internal certificate scanners |
/agents, /internal-endpoints, /adcs-templates, /crl-monitors |
Enrolled Agents, platform-assigned endpoint checks, AD CS template and CRL distribution point monitors. Where offered, GET /agents lists Agents with agent_version, config_locked, outdated, latest_version and (with agent_updates.read) the live update_request (agents.read, ?outdated=true), and POST /agents/{api_key_id}/sealing-key/approve approves an Agent's new sealing key (platform_credentials.update, 204). |
Monitors & internal endpoints, CRL monitoring, Install tokens & the Agents page |
/agent-updates |
Update requests for Agent 1.5.0 and later: GET lists them, POST with api_key_ids (up to 500) or all_outdated: true and an optional target_version creates them (201; Agents that cannot take one are listed as skipped), DELETE /agent-updates/{id} cancels a request the Agent has not received yet (agent_updates.read / .create / .delete). The device decides whether to install. |
Install tokens & the Agents page |
/platform-credentials |
Appliance credentials for remote deployment: GET (list, one), POST (201), PATCH (rename or replace the secret), DELETE (204). Secrets are write-only and never returned (platform_credentials.*). |
Platform credentials |
/msp/organizations |
MSP mode: per client organization, expiring, expired, renewal_failures_7d, served_mismatches, offline_agents and ct_new_name_sets (workspace-wide users, Enterprise msp). |
Organizations, users & roles |
/dns-delegations and /acme-dns/update |
Delegated DNS-01 records and TXT updates. | Delegated DNS-01 |
/workflow-assignments |
Certificate workflows proposed to one Agent from a bundled template (POST to create with api_key_id, template, variables, certificate (a challenge other than {"type": "dns-01"} is refused with 422: HTTP-01 was removed; for a Private CA issuer and Agent 1.5.0, an optional private_ca_profile and empty domains with ip_addresses; an IP address in an ACME certificate's domains is 422), issuer, issue_now, note, expires_in_days and an optional deployment_window; a credential variable is local or platform:<id> (needs platform_credentials.read), never a value; 422 when the Agent does not report the feature; GET lists with cursor pagination and shows the timeline; …/{id}/resend, …/{id}/cancel, DELETE for finished ones). The Agent's own routes are PUT /agents/capabilities, GET /agents/workflow-assignments and POST /agents/workflow-assignments/{id}/status. workflow_assignments.* permissions. |
Dashboard-assigned workflows |
/notification-channels, /scheduled-reports, /alert-contacts |
Alert destinations (an email destination takes up to 50 contact_ids), periodic report emails, and alert contacts (GET/POST /alert-contacts, PATCH/DELETE /alert-contacts/{id}; alert_contacts.read / .update; reads say whether the address unsubscribed). |
Alerts & notifications |
/oidc/providers |
Identity providers for single sign-on. | OIDC / SSO overview |
/releases |
Public release records for the Agent and plugins. | Downloads |
/activity, /jobs |
The activity log and background jobs. | - |
Routes used only by the platform console are not part of the published schema.