(DC) CERTInext REST API (Practical Guide)
CERTInext REST API v2 — Practical Guide
What the API can do, organized by task. Verified live against the production account (1251749675) as a Manager on 2026-07-21.
Base URL:
https://us-api.certinext.ioAll paths below are prefixed with:
/api/certinext/v2Auth: OAuth 2.0 client-credentials → short-lived Bearer JWT (see below).
Legend
✅ Verified — called live and returned real data (Manager account).
🧩 Confirmed (state-changing) — exists / exercised by the official
certinextPython client, but not re-fired here because it writes.⛔ Not available via REST — console-only, or missing (see Gaps).
Unless noted, everything verified here works with a Manager role.
Verification: every ✅ row was fetched live on 2026-07-21 (Manager, prod account 1251749675). Endpoint paths cross-checked against the official certinext Python client. 🧩 rows are exercised by that client but not re-fired here because they change state. No state-changing calls were made while producing this document.
1. Authenticate
Op | Method + path | Notes |
|---|---|---|
Get token |
| ✅ |
Who am I |
| ✅ Returns |
# token (form-encoded); then use: Authorization: Bearer <access_token>
curl -s https://us-api.certinext.io/oauth/token \
-d grant_type=client_credentials -d client_id=1251749675 -d client_secret=****
2. Discover inventory (orgs, groups, domains)
Operation | Method + path | Status | Useful for |
|---|---|---|---|
List organizations |
| ✅ | The org records you can issue under (4 in this account). Fields incl. |
Organization detail |
| ✅ | Full org: |
List groups |
| ✅ ⚠️ | Group → organization bindings ( |
List domains |
| ✅ | The domain inventory (2,454 entries). Offset/limit paging; response shape |
Domain detail |
| ✅ | One domain: |
GET /domains paging & filters (0-based offset, limit ≤ … ; content/totalElements): search (name), domainStatus, dcvStatus, dcvMethod, created-date range.
curl -s -H "Authorization: Bearer $TOK" \
"https://us-api.certinext.io/api/certinext/v2/domains?offset=0&limit=50"3. Products (what you're allowed to issue)
Op | Method + path | Status | Notes |
|---|---|---|---|
List products |
| ✅ | 35 products across DV / OV / EV / IGTF-OV families (base, 30/90-day, Wildcard, UCC combos). Grouped by category → each category has an inner |
Product custom fields |
| ✅ | Fields a given product requires on the order. |
This answers "are DV/EV available?" — yes, all of DV, OV, EV, and IGTF-OV products exist in production. A group can only use the products on its Allow Products list.
4. Request / issue a certificate
Op | Method + path | Status | Notes |
|---|---|---|---|
Create SSL order |
| 🧩 | Body carries product, CSR, organization, domains, custom fields. Returns an order id. |
Order / cert detail |
| ✅ |
|
Download issued cert | (from the order detail once | 🧩 | The official |
Two issuance paths: (a) ACME (EAB) — the normal, automated path; (b) REST
POST /ssl-certificatesfor scripted, non-ACME issuance. Either way the order still passes the approval gate below.
5. Search certificates & check status ← very useful
Op | Method + path | Status | Notes |
|---|---|---|---|
Order / certificate history |
| ✅ | The cert search/inventory endpoint. 1-based |
Transaction ledger |
| ✅ | Billing/transaction history (accessible to a Manager; often a Finance view). |
Each /reports/orders row is rich — you can answer real questions without opening the portal:
orderNumber, certificateStatus (e.g. "Pending for Approver", "Issued"), orderStatus ("Order Accepted"…), originator ("ACME"/"CERTInext"), productCode, domainName, groupNumber, certificateSerialNumber, certificateExpiryDate, issuerCA, orderDate, tags, requestNumber.
# All orders (paged):
curl -s -H "Authorization: Bearer $TOK" \
"https://us-api.certinext.io/api/certinext/v2/reports/orders?page=1&size=100"
# By status (client examples: issued, expired):
".../reports/orders?page=1&size=100&status=issued"
Useful things this answers:
"What's stuck waiting for approval?" → filter rows where
certificateStatus == "Pending for Approver"."What's expiring / expired?" →
status=expired, or sort rows bycertificateExpiryDate."Which group/product issued this?" →
groupNumber+productCodeon the row."Find a cert by hostname or serial" → match
domainName/certificateSerialNumber.
6. Domain Control Validation (DCV)
Verified against live domains. A publishable challenge is only minted after you set a method — GET /dcv is empty ({}) until then (set a method first).
Operation | Method + path | Status | Notes |
|---|---|---|---|
Show challenge |
| ✅ | Empty |
Set / (re)generate method |
| 🧩 | Body |
Trigger validation |
| 🧩 | Empty body. |
Last attempt diagnostics |
| ✅ | Gold for debugging: MPIC per-perspective results, the CAA consensus it read, |
Add domain |
| 🧩 | Body |
Deactivate domain |
| 🧩 | Retire a domain. |
Enum note: attempt diagnostics report methods in
UPPER_SNAKE(CAA_EMAIL, …). Confirm the exactdcvMethodvalue thePATCHexpects (DNS_TXT/HTTP_URLvs. a lowercasedns-txt) — a probable enum mismatch to watch for.
7. The approval gate (why issued ≠ done)
An accepted order sits at certificateStatus: "Pending for Approver" until approved (observed live on an ACME order). There is no REST toggle to auto-approve — per-Group Auto-Approval is set in the console by an Administrator. Until that's enabled, ACME/REST orders won't auto-issue. (Approvers also can't approve their own requests.)
8. Gaps & console-only (what REST can't do today)
⛔ List a Group's permitted domains — no endpoint.
GET /groupsgives org bindings only; the group's Allow Domains permit-list (Domain / Permit-Deny / Scope) is console-only, and the portal's own "View Domains" can 504 on a large group.⛔ Create/edit Groups, create ACME/EAB credentials, set per-Group Auto-Approval, edit CAA / domain permit-lists — all console + Administrator only.
⚠️
GET /groupsreturned a subset of the groups the console shows — treat group enumeration as incomplete via REST.
9. Role matrix (Manager vs Administrator)
Capability | Manager | Needs Administrator |
|---|---|---|
Auth, | ✅ |
|
List/inspect orgs, domains, products | ✅ |
|
List/search orders ( | ✅ |
|
DCV: set method / verify / diagnostics | ✅ |
|
Add / deactivate domains | ✅ |
|
Create SSL order / issue via ACME | ✅ |
|
Create/edit Groups, EAB accounts |
| ✅ (console-only) |
Per-Group Auto-Approval |
| ✅ (console-only) |
Edit a Group's domain permit-list |
| ✅ (console-only) |
10. Pagination cheat-sheet (they differ!)
Endpoint | Paging | Response |
|---|---|---|
| 0-based |
|
| 1-based |
|
| 1-based | paged |
Out-of-range
pageon/reports/ordersis clamped to the last page (returns the last page again, not empty) — guard your loops ontotalPages.