Skip to content
Documentation

Reference

API reference

Every AutoCertify endpoint, grouped by resource. Provision domains, fetch delegation records, issue and read certificates, invite DNS admins, and subscribe to signed webhooks.

Base URL & conventions

All requests go to https://api.autocertify.net. Authenticated resources live under the /v1/ prefix, and both requests and responses use application/json. Endpoints below are tagged Bearer token or Public.

Authentication

Send Authorization: Bearer <token>. Today the token is an access token issued to your session by Auth0 and verified against Auth0’s JWKS. Scoped, long-lived API keys (ac_live_…) for server-to-server automation are part of the developer preview. API access is a Business Pro and Scale capability.

Responses & errors

Successful calls return the resource (or a small result object) directly with a 2xx status. Errors return a single envelope; validation failures come back as 400 validation_error with per-field details.

Error envelope
{
  "status": 400,
  "code": "validation_error",
  "message": "apex must be a valid domain name.",
  "details": [
    { "field": "apex", "issue": "invalid_hostname" }
  ]
}

Idempotency

Certificate issuance accepts an Idempotency-Key header. Replaying a request with the same key returns the original result instead of issuing a second time — safe for retries.

Idempotent issuance
curl -X POST https://api.autocertify.net/v1/domains/dom_8Qp3v1c7/certificates/issue \
  -H "Authorization: Bearer $AUTOCERTIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 3f0c2a9e-1b7d-4e52-9a10-8c6b5d4e3f21" \
  -d '{}'

Pagination & filtering

List operations are POST …/query endpoints that take a page object with a limit, plus optional filters, and return items with a total.

Request — POST /v1/domains/query
{
  "q": "example.com",
  "status": "active",
  "validationStatus": "verified",
  "page": { "limit": 50 }
}
Response
{
  "items": [
    {
      "id": "dom_8Qp3v1c7",
      "apex": "shop.example.com",
      "status": "active",
      "validationStatus": "verified",
      "tags": ["storefront"],
      "createdAt": "2026-02-04T18:22:10Z"
    }
  ],
  "total": 1
}

Rate limits

Per token, in a rolling 15-minute window. Exceeding a bucket returns 429.

  • auth — 20 requests / 15 min (sign-up, session, logout).
  • public — 60 requests / 15 min (public verification-link views and checks).
  • site-scan — 120 requests / 15 min (domain scanning and health checks).

Authentication

Create an account and manage the current session. Sign-up is public; the rest use the session token.

POST /v1/public/signup Public

Create an account and its first domain. Returns the portal URL to continue onboarding.

Request body
{
  "email": "[email protected]",
  "password": "a-strong-passphrase",
  "domain": "shop.example.com"
}
201 Created
{
  "userEmail": "[email protected]",
  "domain": "shop.example.com",
  "portalUrl": "https://app.autocertify.net",
  "authProvider": "auth0"
}
GET /v1/auth/session Bearer token

Return the authenticated session when a bearer token is supplied, or an anonymous session when it is not (the token is optional here).

POST /v1/auth/logout Bearer token

Invalidate the current session. Returns 204 No Content.

Domains

A Domain is a hostname you want to secure. It carries a status (pending, active or error), a validationStatus, its delegationRecord, an optional clientId, tags, and createdAt.

POST /v1/domains Bearer token

Create a domain and get back the delegation record to add to DNS.

Request body
{
  "apex": "shop.example.com",
  "contactEmail": "[email protected]",
  "tags": ["storefront"]
}
201 Created — Domain
{
  "id": "dom_8Qp3v1c7",
  "apex": "shop.example.com",
  "status": "pending",
  "validationStatus": "pending",
  "delegationRecord": {
    "type": "CNAME",
    "host": "_acme-challenge.shop.example.com",
    "value": "shop.example.com.a1b2c3d4.dcv.cloudflare.com",
    "ttl": 300
  },
  "tags": ["storefront"],
  "createdAt": "2026-02-04T18:22:10Z"
}
POST /v1/domains/bulk Bearer token

Create up to 500 domains in one call from an apexList. Returns created[] and rejected[] so partial success is explicit.

POST /v1/domains/query Bearer token

List and filter domains by q, status and validationStatus with page.limit pagination; returns items and total.

GET /v1/domains/:domainId Bearer token

Fetch a single domain by id.

PATCH /v1/domains/:domainId Bearer token

Update a domain's tags and notes.

DELETE /v1/domains/:domainId Bearer token

Delete a domain. Returns 204 No Content.

GET /v1/domains/:domainId/delegation-record Bearer token

Return the exact CNAME to add — host, value and TTL — for delegated DCV.

200 OK — delegation record
{
  "type": "CNAME",
  "host": "_acme-challenge.shop.example.com",
  "value": "shop.example.com.a1b2c3d4.dcv.cloudflare.com",
  "ttl": 300
}
POST /v1/domains/:domainId/verify-delegation Bearer token

Check that the delegation CNAME is live. A successful verification auto-triggers certificate issuance and includes the new certificate.

200 OK
{
  "status": "verified",
  "checkedAt": "2026-02-04T18:41:52Z",
  "message": "Delegation confirmed. Certificate issuance has started.",
  "certificate": {
    "certificateId": "crt_5Nb2Kq9w",
    "status": "pending",
    "nextRenewalAt": null,
    "message": "Issuance started via Cloudflare for SaaS."
  }
}
POST /v1/domains/:domainId/recheck Bearer token

Re-run delegation and health checks for a domain on demand.

Certificates

Certificates are DV, publicly-trusted, and issued via Cloudflare for SaaS (not Let’s Encrypt). A Certificate has a status (pending, active or error), an issuer of Cloudflare for SaaS Managed CA, and notBefore / notAfter / nextRenewalAt timestamps.

POST /v1/domains/:domainId/certificates/issue Bearer token

Issue a certificate for a verified domain. Accepts an Idempotency-Key header. Issuance also happens automatically on successful delegation verification, so an explicit call is usually only needed for re-issuance.

POST — with Idempotency-Key
curl -X POST https://api.autocertify.net/v1/domains/dom_8Qp3v1c7/certificates/issue \
  -H "Authorization: Bearer $AUTOCERTIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 3f0c2a9e-1b7d-4e52-9a10-8c6b5d4e3f21" \
  -d '{}'
200 OK
{
  "certificateId": "crt_5Nb2Kq9w",
  "status": "pending",
  "nextRenewalAt": null,
  "message": "Issuance started via Cloudflare for SaaS."
}

Wildcards are not supported. Issuing with wildcard: true returns 400 wildcard_not_supported — issue a certificate per hostname instead.

400 Bad Request — wildcard
{
  "status": 400,
  "code": "wildcard_not_supported",
  "message": "Wildcard certificates are not supported. Issue a certificate per hostname instead."
}
POST /v1/domains/:domainId/certificates/query Bearer token

List certificates for a domain with page.limit pagination; returns items and total.

GET /v1/certificates/:certificateId Bearer token

Fetch a certificate by id, including its status and renewal timestamps.

200 OK — Certificate
{
  "id": "crt_5Nb2Kq9w",
  "domainId": "dom_8Qp3v1c7",
  "status": "active",
  "issuer": "Cloudflare for SaaS Managed CA",
  "notBefore": "2026-02-04T18:43:07Z",
  "notAfter": "2026-05-05T18:43:07Z",
  "nextRenewalAt": "2026-04-21T00:00:00Z"
}
POST /v1/certificates/:certificateId/refresh Bearer token

Force a renewal/status check for a certificate.

GET /v1/certificates/:certificateId/bundle Bearer token

There is no PEM bundle export. Certificate material is managed by Cloudflare for SaaS, installed and served automatically, so this endpoint returns 409 by design.

409 Conflict — by design
{
  "status": 409,
  "code": "bundle_export_unavailable",
  "message": "Certificate material is managed by Cloudflare for SaaS and cannot be exported as PEM. The certificate is installed and served automatically."
}

Invite a developer or DNS admin to add the delegation record without giving them account access. The recipient opens a public link, sees the exact record, and re-checks it themselves.

Webhooks

Register endpoints to receive signed events instead of polling. Deliveries are signed with HMAC-SHA256 and retried with exponential backoff up to 6 attempts. See the Webhooks guide for the payload format and a signature-check example.

GET /v1/webhooks Bearer token

List your registered webhook endpoints.

POST /v1/webhooks Bearer token

Register a URL and the events to deliver. The response includes the signing secret (whsec_…), shown once.

Request body
{
  "url": "https://hooks.example.com/autocertify",
  "events": ["certificate.active", "certificate.renewal_failed"]
}
201 Created
{
  "id": "wh_3Jd8s2Rf",
  "url": "https://hooks.example.com/autocertify",
  "events": ["certificate.active", "certificate.renewal_failed"],
  "secret": "whsec_9f2Ka7Qm4Zt1Rb6Vn0Xy",
  "createdAt": "2026-02-04T18:10:00Z"
}
PATCH /v1/webhooks/:id Bearer token

Update a webhook's URL or subscribed events.

DELETE /v1/webhooks/:id Bearer token

Delete a webhook endpoint. Returns 204 No Content.

POST /v1/webhooks/:id/rotate-secret Bearer token

Rotate the signing secret (whsec_…) for a webhook. Sign checks against the new secret afterward.

API keys

Scoped keys for server-to-server access. Keys look like ac_live_… and are sent as Authorization: Bearer ac_live_…. The full key is returned only once, at creation. Use an Auth0 session JWT instead for user-facing sessions.

GET /v1/api-keys Bearer token

List your API keys (metadata only — the secret is never returned again).

POST /v1/api-keys Bearer token

Create a new API key. The full ac_live_… value is shown once in the response.

POST /v1/api-keys/:keyId/rotate Bearer token

Rotate a key — issues a new secret and retires the old one.

POST /v1/api-keys/:keyId/revoke Bearer token

Revoke a key immediately. Requests using it stop authenticating.