Skip to main content

Distribution error codes

Structured per-target error codes emitted by every distribution module, the error class each code maps to, and which classes the fan-out per-target retry re-attempts. Codes appear in the error_code field of the per-target results (last_target_results) on the distribution and in job logs.

Error classes

Retry policy is based on a normalized error class, not on raw error strings. Each code maps to one of five classes; only the first two are re-attempted by fan-out per-target retry.

ClassMeaningRetried by fan-out?
networkTimeout, connect failure, DNS resolution failure.Yes
io_transientBroken pipe, connection reset, transient SFTP/API failure — likely to succeed on retry.Yes
io_permanentRemote permission denied, no space left, quota/ownership conflicts — operator action needed.No
authSSH/API authentication failure, credential rejected.No
validationCert/key mismatch, invalid path, missing target — the request itself is wrong.No
note

A code that is not mapped to any class (and where the module did not set a class itself) is treated as not retryable.

Cross-module codes

CodeClassMeaning
CREDENTIAL_MISSINGauthThe module credential referenced by the target could not be resolved.
No code for external secret stores

A credential read from an external secret store is resolved before any target is attempted, so a store failure has no target to attach a code to. It is reported at the job level instead — the job status and last error name the credential, the store and the underlying failure. There is deliberately no SECRETSTORE_* code, because no target result could ever carry one.

SSH

CodeClassMeaning
SSH_CONNECTnetworkTCP/SSH connection to the target failed.
SSH_AUTHauthThe host rejected the credentials during the SSH handshake (key or password). A handshake that fails for a transport reason — the peer closes the connection, connection reset — is SSH_CONNECT, not this.
SFTP_FAILEDio_transientSFTP session could not be opened or an SFTP operation failed.
FILE_UPLOADio_transientWriting a PathSet file on the target failed for a transient reason (I/O error, lost connection, full disk).
SSH_PERMISSIONio_permanentThe host refused the file operation: permission denied on the file or directory, a missing parent directory the SSH user could not create, a path that is not a directory, or a read-only filesystem (from the SFTP status code or its text). Not retried — give the SSH user write access, create the directory, or fix the PathSet path.
SCRIPT_EXIT_NONZEROio_transientThe ActionSet script ran but exited with a non-zero status.
SCRIPT_FAILEDio_transientThe ActionSet script could not be executed.
SSH_VALIDATIONvalidationPre-flight validation of the SSH deployment inputs failed: the target has no SSH spec or its bound PathSet/ActionSet no longer resolves (deleted, another project, kind changed), a path could not be rendered, an unresolved or secret variable in a path, path traversal, an invalid owner or run_as, a pfx passphrase variable that is missing, not secret or empty. Also the fallback for any unclassified error.
SSH_HOST_KEY_ALGOvalidationHost-key negotiation failed before any key was presented: the server offers only key types CertAutoPilot does not advertise once verification is enabled — in practice a DSA-only server. Not retried, and there is nothing to approve. Add a modern host key to the server, or turn verification off for that target. A server that merely dropped the pinned key type does not land here: the other types stay on offer, so it is reported as SSH_HOST_KEY_CHANGED and can be reviewed.
SSH_HOST_KEY_CHANGEDvalidationThe server presented a host key that does not match the one pinned for this target. Nothing was deployed, and the run is not retried — review and approve the new key on the target. Only raised when host-key verification is enabled on that target.

Webhook

CodeClassMeaning
WEBHOOK_CONNECTnetworkThe webhook endpoint could not be reached on the last attempt (DNS, refused, timeout, TLS, policy refusal, redirect limit, unparseable URL). Connection failures are retried within retry_count; an unparseable URL is not.
WEBHOOK_NON_2XXio_transientThe endpoint answered with a non-2xx HTTP status on the last attempt. 5xx, 408, 425 and 429 are retried within retry_count; any other 4xx ends the attempts immediately.
WEBHOOK_TEMPLATEvalidationThe payload template failed to render (or the default payload could not be built). No request was sent and nothing is retried — fix the module-config template and run a dry run.

Kubernetes

CodeClassMeaning
K8S_CONNECTnetworkThe API server could not be reached (dial, DNS, TLS, timeout, 503/504), or a live-picker listing (namespaces / Secrets / workloads) failed for a reason other than RBAC.
K8S_FORBIDDENauthThe API server answered 401 (expired or revoked token) or 403 (RBAC) for the secret create/update or workload patch — or, in a live picker, the list verb the listing needs.
K8S_NOT_FOUNDvalidationNamespace or referenced object does not exist.
K8S_APPLY_FAILEDio_transientApplying the Secret or the restart patch failed for another reason (conflict, immutable/wrong-type Secret, admission or quota rejection).
K8S_VALIDATIONvalidationThe API client could not be built — kubeconfig credential missing, empty or unparseable, unknown context, in_cluster outside a pod, invalid proxy_url. Nothing was dialed; not retried.

NetScaler

CodeClassMeaning
NETSCALER_CONNECTnetworkNITRO API unreachable at any step (refused, DNS, TLS, timeout, dropped connection), or the pre-flight nsversion probe did not answer like a NITRO endpoint.
NETSCALER_AUTHauthHTTP 401/403 or NITRO 354 at any step — wrong password, or a command the user's command policy does not allow.
NETSCALER_UPLOADio_transientNetScaler rejected a cert/key systemfile write (rights, cert_path, disk space).
NETSCALER_UPDATEio_transientNetScaler rejected the certkey create/update, a create conflict could not be resolved safely, or a certkey read failed for a non-transport, non-auth reason.
NETSCALER_CHAINio_transientInstalling the intermediate certkeys failed (parse error, >5 intermediates, rejected upload/create, unresolvable content conflict). Strict mode only.
NETSCALER_LINKio_transientThe link step failed (link read, unlink, link, or the read-back showing a different link). Strict mode only, except a broken link that could not be restored, which fails in every mode.
NETSCALER_OWNERSHIPio_permanentThe object exists but is not managed by CertAutoPilot — refusing to overwrite.

Huawei Cloud

CodeClassMeaning
HUAWEICLOUD_CONNECTnetworkHuawei Cloud API unreachable, HTTP 5xx, client initialisation failed, or a 2xx create response without an id.
HUAWEICLOUD_AUTHauthAK/SK authentication rejected (401/403).
HUAWEICLOUD_NOT_FOUNDvalidationThe referenced certificate object or CDN domain does not exist.
HUAWEICLOUD_CONFLICTio_permanentName/state conflict — e.g. ambiguous name lookup matched multiple certificates, or the name listing was cut off (WAF page incomplete, ELB more than 500 matches) with no exact match, so nothing is created.
HUAWEICLOUD_QUOTAio_transientAPI quota / rate limit hit (429).
HUAWEICLOUD_VALIDATIONvalidationHTTP 400 — the API rejected the request content (invalid PEM, name or field). Not retried.

F5 BIG-IP

CodeClassMeaning
F5BIGIP_CONNECTnetworkThe device did not answer (unreachable, TLS/verify error, timeout, transport error on any call), or the first call failed with a non-auth HTTP error. A rejected login is F5BIGIP_AUTH.
F5BIGIP_AUTHauthHTTP 401/403 anywhere in the run: a rejected token login (wrong password or login provider), a role denial on the upload endpoint, or a forbidden object/profile/transaction call.
F5BIGIP_UPLOADio_transientUploading a cert/key file failed (5xx or transport error). A 401/403 role denial is F5BIGIP_AUTH.
F5BIGIP_UPDATEio_transientTMOS below 13.0 or an unparseable version; creating or updating the cert/key objects failed; a transaction could not start, commit or timed out; the versioned name is too long.
F5BIGIP_NOT_FOUNDvalidationAn import-only in-place update targeted an object that does not exist (F5 answered 404) — typically an explicit key_name whose ssl-key object was never created while the cert object exists.
F5BIGIP_CHAINio_transientInstalling the intermediates failed (strict mode): chain unparseable, more than 5 intermediates, a lookup/upload/create failed, or an existing object conflicts with no identical object to reuse.
F5BIGIP_OWNERSHIPio_permanentA cap_f5ic_<fp24> intermediate object exists but holds a different certificate (strict mode).
F5BIGIP_PROFILEio_permanentProfile-aware only — the module never creates profiles: no listed client-ssl profile exists, a profile could not be read, its certKeyChain PATCH or commit failed or timed out, or it already serves a different certificate of the same key type.

HashiCorp Vault

CodeClassMeaning
VAULT_CONNECT_FAILEDnetworkVault unreachable.
VAULT_AUTH_FAILEDauthAppRole login rejected, or Vault answered 403 on the secret read or write (invalid/expired token, or the policy lacks read / create / update on the path). Not retried.
VAULT_READ_FAILEDio_transientReading the existing secret failed for a reason other than 403 (network, 5xx, unparsable body). Nothing is written.
VAULT_WRITE_FAILEDio_transientWriting the secret failed for a reason other than 403 (network, 5xx).
VAULT_VALIDATE_FAILEDvalidationPost-write validation of the stored material failed.
VAULT_PATH_INVALIDvalidationThe configured KV path is invalid.

Windows (generic WinRM)

CodeClassMeaning
WINRM_CONNECTnetworkWinRM endpoint unreachable.
WINRM_AUTHauthNTLM / Basic / Kerberos authentication rejected. For Kerberos, check the realm, that the target is addressed by AD FQDN, and that this host's DNS resolves AD records (or set the KDC Address field).
WINRM_TIMEOUTio_transientCommand execution timed out.
WINRM_EXECio_transientActionSet command/script failed on the host.
WINRM_PS_SYNTAXvalidationThe PowerShell payload has a syntax error, or calls a cmdlet that is not recognized (detected in the failed ActionSet output).
WINRM_FILEio_transientThe file transfer to the host failed, or what arrived did not match what was sent (the content check runs on the host and the destination is left untouched on a mismatch).
WINRM_VALIDATIONvalidationOperator configuration error: unresolved PathSet/ActionSet, invalid file path or missing variable, missing/non-secret pfx passphrase variable, invalid or absent shell, a command rejected by allowed_commands, or an unusable allowed_commands pattern. Nothing is retried.
WINRM_QUOTAio_permanentWinRM quota exceeded (envelope size, concurrent shells).

Microsoft IIS

CodeClassMeaning
IIS_CONNECTnetworkWinRM connection or in-flight transport to the Windows host failed.
IIS_AUTHauth / validationNTLM / Basic / Kerberos authentication rejected, an authorization denial before the bind ("Access is denied", 0x80070005, 401/403, "permission denied" — e.g. the account lacks store permissions), or a permanent Kerberos configuration error (qualified username, IP-addressed target, missing realm). A filesystem "Access to the path … is denied" is IIS_IMPORT_FAILED, not this code.
IIS_PFX_FAILEDvalidation / io_transientBuilding the PKCS#12 bundle locally failed (validation — cert/key problem), or uploading it over WinRM failed (io_transient — retried).
IIS_IMPORT_FAILEDio_permanentA script failure before the bind step (module import, password file, opening or importing the PFX, binding lookup — including a filesystem access-to-path denial on the staged file), a missing thumbprint in the result, or a script result that could not be parsed.
IIS_BINDING_NOT_FOUNDvalidationNo HTTPS binding matched the configured filter (or, in all_sites, no binding on any non-excluded site).
IIS_BINDING_AMBIGUOUSvalidationMore than one binding matched in single mode — refusing to guess.
IIS_BINDING_FAILEDio_permanentsingle mode: assigning the certificate to the binding threw (the exception message follows the code). Multi-binding modes: no bindings could be updated (including the all-matched-bindings-are-CCS case).
IIS_APPPOOL_DETECT_FAILEDvalidationDetecting the application pools to recycle failed.
IIS_APPPOOL_RECYCLE_FAILEDio_permanentRecycling one or more application pools failed (run is partial).
IIS_VALIDATE_STOREvalidationPost-deploy check of the certificate store failed.
IIS_VALIDATE_BINDINGvalidation / io_transientPost-deploy binding check found a mismatch (validation), or the check itself failed at the transport level (io_transient — retried; the bind already succeeded).
IIS_MODULE_MISSINGvalidationA required server-side component (e.g. the WebAdministration PowerShell module) is missing.
IIS_SITE_NOT_FOUNDvalidationThe configured IIS site does not exist — or the resolved placement names no site at all (a site-less per-certificate override inherited onto an all_sites target; reported by Execute and Dry Run).

Dual-class rows: the same code covers two failure natures; the module sets the class explicitly at the failure site, so fan-out retries only the transient one.

SMTP

The SMTP module classifies by SMTP reply code and sets the class directly on the result.

CodeClassMeaning
SMTP_CONNECTnetworkTCP dial / DNS failure before any SMTP conversation.
SMTP_TLSauthTLS handshake or certificate-trust failure (STARTTLS/SMTPS).
SMTP_AUTHauthAuthentication rejected (reply 530/534/535/538).
SMTP_TRANSIENTio_transientTemporary server condition (421/450/451/452/454, other 4xx, or errors without a reply code that are not a recognised negotiation failure).
SMTP_PERMANENTio_permanentPermanent rejection (550/552/554, other 5xx) — operator action needed.
SMTP_VALIDATIONvalidationThe request was malformed (500/501/503/553), or the target and the relay cannot agree deterministically: STARTTLS required but not advertised, AUTH or the chosen PLAIN/LOGIN mechanism not offered, password refused over plaintext. Not retried — change tls_mode/auth_method.
SMTP_PAYLOADvalidationBuilding the PEM / PKCS#12 attachment failed before sending.

AWS ACM

The AWS ACM module classifies AWS SDK errors itself, so one code can map to more than one class depending on the underlying cause.

CodeClassMeaning
AWS_CONNECTnetwork (dial/timeout) or io_transient (throttling)AWS API unreachable, or the request was throttled (Throttling, RequestLimitExceeded, TooManyRequests, SlowDown).
AWS_AUTHauthCredentials rejected (InvalidClientTokenId, SignatureDoesNotMatch, AccessDenied, UnauthorizedOperation, …).
AWS_CREDENTIALauthResolving the module credential for the target failed.
AWS_IMPORTvalidation (bad input: missing region, ARN region ≠ target region, or an ARN naming a certificate ACM issued itself — refused before the import) or io_permanent (import rejected)ImportCertificate failed or returned an unusable result, or the resolved ARN cannot be imported over.

Cloudflare

The certificate is uploaded to a Cloudflare zone as a Custom Certificate (Business/Enterprise plan) over the Cloudflare API; renewals update it in place.

CodeClassMeaning
CLOUDFLARE_CONNECTnetworkCloudflare API (api.cloudflare.com:443) unreachable, HTTP 5xx, or an HTTP 3xx redirect (never followed — a wrong or intercepting endpoint) — check egress/DNS/proxy and retry.
CLOUDFLARE_AUTHauthAPI token rejected — verify the token is active and carries Zone → SSL and Certificates → Edit on the target zone.
CLOUDFLARE_PLANvalidationThe zone's plan does not permit Custom Certificates — upgrade the zone to Business or Enterprise. Also raised when the zone's custom-certificate allocation is full (Cloudflare 1445 "Hit maximum cert allocation") — delete unused custom certificates or buy more slots.
CLOUDFLARE_NOT_FOUNDvalidationThe referenced zone or custom certificate does not exist — check the zone ID / certificate ID.
CLOUDFLARE_CONFLICTvalidationThe zone holds a custom certificate covering the hostname that CertAutoPilot did not upload (one is enough — there is no adoption by hostname) — pin an explicit certificate_id to take it over, or remove it in Cloudflare.
CLOUDFLARE_VALIDATIONvalidationThe request itself is invalid — bad bundle_method/type/geo_restrictions, or a cert/key the API rejected (any 4xx on the upload, including error 1002 there).
CLOUDFLARE_QUOTAio_transientAPI rate limit or custom-certificate quota hit — retried; if persistent, free a custom-cert slot or slow the cadence.

cPanel

CodeClassMeaning & resolution
CPANEL_CONNECTnetworkThe cPanel/WHM host is unreachable — check host, port, use_ssl and network egress; retried.
CPANEL_AUTHauthThe API token was rejected — verify username + token and the mode (cpanel vs whm).
CPANEL_NOT_FOUNDvalidationThe server answered HTTP 404 — usually a wrong port/mode pairing (UAPI path on the WHM port or the reverse) or a proxy in front of the API.
CPANEL_CONFLICTvalidationThe server answered HTTP 409 — read the error text in the target detail and correct the server state.
CPANEL_VALIDATIONvalidationThe target spec is invalid — check host, mode and the domain list.
CPANEL_INSTALLio_permanentThe API reported failure (status ≠ 1 in cpanel mode; metadata.result ≠ 1 or data.status ≠ 1 in whm mode) — check the certificate/key/chain and that the domain is on the account.
CPANEL_QUOTAio_transientRate limit exceeded — retried; if persistent, slow the cadence.

Azure Key Vault

The certificate is imported into an Azure Key Vault as a new version of a KV certificate (AES-256-encrypted PKCS#12 under a random per-import password) over the Key Vault REST API, authenticated via an AAD service principal.

CodeClassMeaning
AZUREKV_CONNECTnetworkVault or AAD endpoint unreachable (also raised on an unexpected redirect) — check egress and the vault_url.
AZUREKV_AUTHauthToken rejected, missing permission, blocked by the vault firewall, or the owning Azure subscription is disabled. The message names the case — fix tenant/client/secret, grant Key Vault Certificates Officer (or access-policy Get+Import+List), allowlist CertAutoPilot's egress IP in the Key Vault firewall, or re-enable the subscription (no role change helps a disabled one).
AZUREKV_NOT_FOUNDvalidationVault or certificate not found — verify the vault URL and certificate name. Also raised when the vault host does not resolve in DNS (a mistyped or deleted vault), which is permanent and therefore not retried.
AZUREKV_CONFLICTvalidationA soft-deleted certificate holds the name (az keyvault certificate recover, or purge — blocked by purge protection — or pick a different cert_name); also covers a pending certificate operation.
AZUREKV_VALIDATIONvalidationBad vault_url/cert_name, or Azure rejected the PFX.
AZUREKV_QUOTAio_transientKey Vault throttling (429). Transient class: retried per target in a fan-out batch and by the sweep re-arm; the module itself performs no in-run backoff.

MerlinCDN

Certificates on MerlinCDN are immutable — each deploy uploads a new cert, then binds it by re-pointing the distribution's canonical name. The codes below distinguish an upload failure (nothing bound yet) from a bind failure (a new cert was uploaded; the module best-effort deletes that orphan).

CodeClassMeaning
MERLINCDN_CONNECTnetworkMerlinCDN API unreachable.
MERLINCDN_AUTHauthPersonal access token or org/workspace headers rejected.
MERLINCDN_NOT_FOUNDvalidationThe referenced distribution or canonical name does not exist.
MERLINCDN_CONFLICTio_permanentName/state conflict on the CDN.
MERLINCDN_QUOTAio_transientAPI quota / rate limit hit (HTTP 429) — during the upload, or during binding when every failed row was rate-limited. Retried.
MERLINCDN_UPLOADio_permanentUploading the new certificate failed (nothing was bound), or the upload landed but its id could not be recovered (a warning names the possible stray upload).
MERLINCDN_BINDio_permanentRe-binding a canonical name was rejected — a 4xx other than 429, a missing CNAME/distribution, or an incomplete row. Not retried. If every row failed and the upload was fresh in this run, that upload is best-effort removed; if only some rows failed, the successful ones stay bound and a re-run heals the rest. A bind phase whose failures were all transient (5xx/network → MERLINCDN_CONNECT, 429 → MERLINCDN_QUOTA) is retried instead.

Exchange

On-premises Microsoft Exchange, deployed over WinRM + the Exchange Management Shell. Every renewal imports a new thumbprint (import → enable → optional remove-old).

CodeClassMeaning
EXCHANGE_CONNECTnetworkWinRM unreachable — host/port/network.
EXCHANGE_AUTHauthWinRM authentication rejected, or a TLS-verify / Kerberos misconfiguration (terminal).
EXCHANGE_EMS_UNAVAILABLEio_transientThe Exchange /PowerShell RBAC session did not open (reason included) — not a real Exchange server, remote PowerShell disabled for the account, the account has no Exchange RBAC role, the per-user concurrent-session limit is exhausted, or the endpoint is down while IIS restarts. Retried: the last two clear on their own; a permanent cause fails again. A role that opens the session but lacks the certificate cmdlets surfaces as EXCHANGE_IMPORT / EXCHANGE_ENABLE instead.
EXCHANGE_CREDENTIAL_MISSINGvalidationNo or malformed exchange_winrm credential (missing username/password).
EXCHANGE_UNSUPPORTED_KEY_TYPEvalidationThe certificate does not use an RSA key, or its RSA key is smaller than 2048 bits. Exchange accepts RSA 2048 and above only; re-issue the certificate with such a key.
EXCHANGE_IMPORTio_permanentImport-ExchangeCertificate failed.
EXCHANGE_ENABLEio_permanentEnable-ExchangeCertificate failed.
EXCHANGE_REMOVEio_permanentRemoving the previous certificate failed (it may still be in use).
EXCHANGE_NOT_FOUNDvalidationA referenced Exchange server or certificate was not found.
EXCHANGE_PFX_FAILEDvalidationBuilding the PKCS#12 from the cert/key failed.

PAN-OS

The certificate, key and chain are imported into the firewall as one named certificate object over the PAN-OS XML API, followed by a partial commit scoped to the API user.

CodeClassMeaning
PANOS_CONNECTnetworkTCP/TLS connection to the firewall management interface failed. Retried.
PANOS_AUTHauthAuthentication rejected (bad username/password or api_key, or an expired session key). Not retried. Note: username is required even with api_key.
PANOS_IMPORTio_transientThe certificate import was rejected or failed on the device. Retried — a same-name re-import is idempotent. Note: PAN-OS refuses a self-signed non-CA certificate, and the PKCS#12 passphrase is device-limited to 31 characters (the module already complies).
PANOS_COMMITio_transientThe partial commit failed or its job timed out. Retried; a timed-out commit may still complete in the background, and the next run finishes with a commit-only pass instead of re-importing.
PANOS_NOT_FOUNDvalidationA referenced object does not exist on the firewall. Not retried.
PANOS_VALIDATIONvalidationThe device rejected the request as invalid (bad name, vsys set while multi-vsys is off, malformed input). Not retried.
PANOS_APIio_transientAn unclassified device-internal error. Retried.

See also