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.
{
"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.
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.
{
"q": "example.com",
"status": "active",
"validationStatus": "verified",
"page": { "limit": 50 }
} {
"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.
/v1/public/signup Public Create an account and its first domain. Returns the portal URL to continue onboarding.
{
"email": "[email protected]",
"password": "a-strong-passphrase",
"domain": "shop.example.com"
} {
"userEmail": "[email protected]",
"domain": "shop.example.com",
"portalUrl": "https://app.autocertify.net",
"authProvider": "auth0"
} /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).
/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.
/v1/domains Bearer token Create a domain and get back the delegation record to add to DNS.
{
"apex": "shop.example.com",
"contactEmail": "[email protected]",
"tags": ["storefront"]
} {
"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"
} /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.
/v1/domains/query Bearer token List and filter domains by q, status and validationStatus with page.limit pagination; returns items and total.
/v1/domains/:domainId Bearer token Fetch a single domain by id.
/v1/domains/:domainId Bearer token Update a domain's tags and notes.
/v1/domains/:domainId Bearer token Delete a domain. Returns 204 No Content.
/v1/domains/:domainId/delegation-record Bearer token Return the exact CNAME to add — host, value and TTL — for delegated DCV.
{
"type": "CNAME",
"host": "_acme-challenge.shop.example.com",
"value": "shop.example.com.a1b2c3d4.dcv.cloudflare.com",
"ttl": 300
} /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.
{
"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."
}
} /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.
/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.
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 '{}' {
"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.
{
"status": 400,
"code": "wildcard_not_supported",
"message": "Wildcard certificates are not supported. Issue a certificate per hostname instead."
} /v1/domains/:domainId/certificates/query Bearer token List certificates for a domain with page.limit pagination; returns items and total.
/v1/certificates/:certificateId Bearer token Fetch a certificate by id, including its status and renewal timestamps.
{
"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"
} /v1/certificates/:certificateId/refresh Bearer token Force a renewal/status check for a certificate.
/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.
{
"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."
} Verification links
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.
/v1/verification-links Bearer token Create a scoped link for a domain, optionally tied to a clientId and emailed to a recipient.
/v1/public/verification-links/:token Public Public view of a verification link — the domain and the record to add. No token required.
/v1/public/verification-links/:token/check Public Public re-check of the delegation record from the link. No account access required.
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.
/v1/webhooks Bearer token List your registered webhook endpoints.
/v1/webhooks Bearer token Register a URL and the events to deliver. The response includes the signing secret (whsec_…), shown once.
{
"url": "https://hooks.example.com/autocertify",
"events": ["certificate.active", "certificate.renewal_failed"]
} {
"id": "wh_3Jd8s2Rf",
"url": "https://hooks.example.com/autocertify",
"events": ["certificate.active", "certificate.renewal_failed"],
"secret": "whsec_9f2Ka7Qm4Zt1Rb6Vn0Xy",
"createdAt": "2026-02-04T18:10:00Z"
} /v1/webhooks/:id Bearer token Update a webhook's URL or subscribed events.
/v1/webhooks/:id Bearer token Delete a webhook endpoint. Returns 204 No Content.
/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.
/v1/api-keys Bearer token List your API keys (metadata only — the secret is never returned again).
/v1/api-keys Bearer token Create a new API key. The full ac_live_… value is shown once in the response.
/v1/api-keys/:keyId/rotate Bearer token Rotate a key — issues a new secret and retires the old one.
/v1/api-keys/:keyId/revoke Bearer token Revoke a key immediately. Requests using it stop authenticating.