Certificates
Uploaded or automatically issued HTTPS certificates. They can be bound to sites; a certificate in use by a site cannot be deleted or disabled.
certsCertificatesAuthentication: User (some parameters admin only)14 endpointsList certificates
GET
/api/v2/certsAuthentication: User (some parameters admin only)
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
| page | integer | — | Page number, starting from 1 |
| page_size | integer | — | Items per page |
| sort | string | — | Sort fields, comma-separated; prefix `-` for descending, e.g. `-created_at,id` |
| tenant_id | integer | — | Admin only: filter by tenant. Ignored for tenant credentials, which only see their own tenant's data |
| name | string | — | Name contains. |
| domain | string | — | SAN contains (part of a domain or IP). |
| scope | string | — | site = site certificate; ip = platform IP certificate; panel = panel certificate (used by the controller's HTTPS listener). |
| enabled | boolean | — | Whether enabled |
| expire_days | integer | — | Only list certificates expiring within N days (including expired ones). |
| id | integer | — | Exact certificate ID match. |
| ids | string | — | Comma-separated certificate IDs (at most 200); matches any of them. Combined with id as an intersection. |
| des | string | — | Remark contains. |
| type | string | — | Certificate type. |
| dns_api_id | integer | — | Certificates using this DNS API credential. |
| domains | string | — | Comma-separated domains or IPs; matches certificates whose SAN contains any of them (exact match). |
| issue_state | string | — | ACME issuance state (uploaded certificates have none). |
| kind | string | — | domain = SAN contains a domain; ip = SAN is all IPs. |
Create certificate
POST
/api/v2/certsAuthentication: User (some parameters admin only)
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
| tenant_id | integer | — | Admin only: filter by tenant. Ignored for tenant credentials, which only see their own tenant's data |
Request body application/json
| Field | Type | Required | Description |
|---|---|---|---|
| acme | CertAcmeSummary | — | Issuance state summary (carried by certificate GET and list). Present only for issued certificates (type=lets/zerossl/zerossl_api); uploaded certificates (custom) do not have this field. See GET /certs/{id}/acme for the full state (challenge type, ARI window, etc.). |
| cert | string | — | Certificate chain PEM (leaf first, intermediates completed, root excluded); no private key (export it only via POST /certs/{id}/private-key). |
| des | string | — | Description |
| enabled | boolean | — | Whether enabled |
| key | string | — | Private key PEM (PKCS#1/PKCS#8/SEC1, must not be encrypted); omit when replacing the certificate to verify against the existing key. |
| name | string | Required | Name |
| scope | string | — | Certificate scope: site = site certificate; ip = platform IP certificate; panel = panel certificate. |
| type | string | — | custom = uploaded; lets/zerossl = issued via ACME; zerossl_api = issued via the paid ZeroSSL REST API. |
Get ACME issuance states in batch
GET
/api/v2/certs/acme-statesAuthentication: User (some parameters admin only)
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
| ids | string | Required | Certificate IDs, comma-separated, at most 200. |
Batch-create ACME certificates
POST
/api/v2/certs/batchAuthentication: User (some parameters admin only)
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
| tenant_id | integer | — | Admin only: filter by tenant. Ignored for tenant credentials, which only see their own tenant's data |
Request body application/json
| Field | Type | Required | Description |
|---|---|---|---|
| acme_account_id | integer | — | Account to issue with (same as acme.acme_account_id in POST /certs); if omitted, the tenant's enabled account for the type is used first, then the platform's. |
| auto_renew | boolean | — | Defaults to true if omitted. |
| des | string | — | Description |
| dns_api_id | integer | — | DNS API credential used for DNS-01 validation (for ACME certificates). |
| items | CertAcme[] | Required | Issuance states. |
| type | string | — | custom = uploaded; lets/zerossl = issued via ACME; zerossl_api = issued via the paid ZeroSSL REST API. |
Batch reissue or renew ACME certificates
POST
/api/v2/certs/batch-issueAuthentication: User (some parameters admin only)
Request body application/json
| Field | Type | Required | Description |
|---|---|---|---|
| ids | integer[] | Required | Certificate IDs. |
List IPs eligible for ZeroSSL certificates
GET
/api/v2/certs/zerossl-ipsAuthentication: User (some parameters admin only)
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
| tenant_id | integer | — | Admin only: filter by tenant. Ignored for tenant credentials, which only see their own tenant's data |
Get certificate
GET
/api/v2/certs/{id}Authentication: User (some parameters admin only)
Update certificate
PUT
/api/v2/certs/{id}Authentication: User (some parameters admin only)
Request body application/json
| Field | Type | Required | Description |
|---|---|---|---|
| acme | CertAcmeSummary | — | Issuance state summary (carried by certificate GET and list). Present only for issued certificates (type=lets/zerossl/zerossl_api); uploaded certificates (custom) do not have this field. See GET /certs/{id}/acme for the full state (challenge type, ARI window, etc.). |
| cert | string | — | Certificate chain PEM (leaf first, intermediates completed, root excluded); no private key (export it only via POST /certs/{id}/private-key). |
| des | string | — | Description |
| enabled | boolean | — | Whether enabled |
| key | string | — | Private key PEM (PKCS#1/PKCS#8/SEC1, must not be encrypted); omit when replacing the certificate to verify against the existing key. |
| name | string | Required | Name |
| scope | string | — | Certificate scope: site = site certificate; ip = platform IP certificate; panel = panel certificate. |
| type | string | — | custom = uploaded; lets/zerossl = issued via ACME; zerossl_api = issued via the paid ZeroSSL REST API. |
Delete certificate
DELETE
/api/v2/certs/{id}Authentication: User (some parameters admin only)
Get certificate ACME issuance status
GET
/api/v2/certs/{id}/acmeAuthentication: User (some parameters admin only)
Update certificate auto-renewal switch
PUT
/api/v2/certs/{id}/acmeAuthentication: User (some parameters admin only)
Request body application/json
| Field | Type | Required | Description |
|---|---|---|---|
| auto_renew | boolean | Required | Defaults to true if omitted. |
Bind certificate to sites
POST
/api/v2/certs/{id}/bindAuthentication: User (some parameters admin only)
Request body application/json
| Field | Type | Required | Description |
|---|---|---|---|
| site_ids | integer[] | Required | Sites using this certificate. |
Reissue ACME certificate
POST
/api/v2/certs/{id}/issueAuthentication: User (some parameters admin only)
Export certificate private key
POST
/api/v2/certs/{id}/private-keyAuthentication: User (some parameters admin only)
Request body application/json
| Field | Type | Required | Description |
|---|---|---|---|
| password | string | — | Current login password. |
| totp_code | string | — | Current 6-digit TOTP code; the account must have TOTP enabled. |
Certificates object
| Field | Type | Required | Description |
|---|---|---|---|
| acme | CertAcmeSummary | — | Issuance state summary (carried by certificate GET and list). Present only for issued certificates (type=lets/zerossl/zerossl_api); uploaded certificates (custom) do not have this field. See GET /certs/{id}/acme for the full state (challenge type, ARI window, etc.). |
| acme_account_id | integer | — | Account to issue with (same as acme.acme_account_id in POST /certs); if omitted, the tenant's enabled account for the type is used first, then the platform's. |
| ari_end | string | — | End of the renewal window suggested by the CA via ARI. |
| ari_start | string | — | Renewal window suggested by the CA via ARI; null = none given by the CA, renew cert.acme.renew_before_days days before expiry. |
| auto_renew | boolean | — | Defaults to true if omitted. |
| cert | string | — | Certificate chain PEM (leaf first, intermediates completed, root excluded); no private key (export it only via POST /certs/{id}/private-key). |
| cert_id | integer | — | Certificate ID. |
| challenge | string | — | Validation method: http-01, dns-01, or http-file (ZeroSSL file validation for zerossl_api). |
| created_at | string | — | Created at |
| des | string | — | Description |
| dns_api_id | integer | — | DNS API credential used for DNS-01 validation (for ACME certificates). |
| enabled | boolean | — | Whether enabled |
| err_times | integer | — | Number of failures in the current round. |
| failed | integer | — | Number of failed items. |
| fingerprint | string | — | SHA-256 fingerprint of the leaf certificate (lowercase hex). |
| id | integer | — | Record ID |
| ids | integer[] | Required | Certificate IDs. |
| issued_at | string | — | Time of the last successful issuance. |
| issuer | string | — | Certificate issuer. |
| items | CertAcme[] | — | Issuance states. |
| key | string | — | Private key PEM (PKCS#1/PKCS#8/SEC1, must not be encrypted); omit when replacing the certificate to verify against the existing key. |
| last_error | string | — | Last error |
| name | string | — | Name |
| names | string[] | — | SANs (domains, wildcard domains or IPs); falls back to CN when there is no SAN. |
| next_try_at | string | — | After a renewal ends in failure, the earliest time the renewal scan will retry. |
| not_after | string | — | Certificate expiry time. |
| not_before | string | — | Time the certificate becomes valid. |
| ocsp | boolean | — | The leaf certificate carries an OCSP URL (nodes can staple). |
| ok | integer | — | Number of items queued for issuance. |
| password | string | — | Current login password. |
| renewing | boolean | — | The current round is a renewal (the old certificate stays in use on failure). |
| scope | string | — | Certificate scope: site = site certificate; ip = platform IP certificate; panel = panel certificate. |
| site_ids | integer[] | — | Sites using this certificate. |
| state | string | — | pending = queued or waiting to retry; running = issuing; issued = issued; failed = retries exhausted (alert sent). |
| tenant_id | integer | — | Owning tenant; null = platform IP certificate. |
| totp_code | string | — | Current 6-digit TOTP code; the account must have TOTP enabled. |
| type | string | — | custom = uploaded; lets/zerossl = issued via ACME; zerossl_api = issued via the paid ZeroSSL REST API. |
| updated_at | string | — | Updated at |
| version | integer | — | Certificate content version; incremented on each replacement. |
| zerossl_order_id | string | — | Current ZeroSSL order ID of a zerossl_api certificate; empty = no order yet. |
| zerossl_order_state | string | — | ZeroSSL order status (draft, pending_validation, issued, cancelled, etc.); empty = no order yet. |