Reference
Enums, environment variables, error codes, and other lookup tables.
Enums
ConnectionStatus — pending, propagating, live, failed.
SetupType — automatic, manual, async, mcp.
Role — owner, admin, member, viewer.
PlanId — free, startup, growth, premium, enterprise.
Environment — production, staging, development.
DNS record types — A, AAAA, CNAME, CAA, MX, NS, TXT, plus the
meta-types SPFM (SPF-merge) and REDIR301.
One-click setup template shapes (the provider-hosted one-click protocol;
customdomain.ai catalog shipped in prod) —
web: apex-a, apex-aaaa, apex-cname, apex-www, subdomain, www,
wildcard; ownership: verify, connect-verified (apex A + ownership TXT
applied together); caa; email: email-spf, email-dkim, email-dmarc,
email-mx, email-full; and redirect (301 forward).
Webhook events (the complete set — see
webhooks) — connection.created,
connection.applied, connection.live, connection.failed,
connection.records.updated, connection.reapply.failed,
connection.records_outdated, connection.disconnected,
domain.record_missing, domain.record_restored, domain.purchased,
purchase.error, purchase.confirmation.expired, secure_status,
power_status.
Error envelope & codes
Every error is { "code", "title", "details"? }. code is a stable machine
string. This table and the "Error envelope" section on the
API reference index page are maintained separately;
keep both in sync when a code changes.
code | HTTP | Meaning |
|---|---|---|
invalid_request | 400 | Malformed or missing input. |
unauthorized | 401 | Missing/invalid credential. |
not_found | 404 | Object doesn't exist or isn't in your tenant. |
quota_exceeded | 402 | The plan's monthly quota is used up. Only free is hard-capped, and only where BILLING_ENFORCE_QUOTA is on (the hosted service currently runs meter-only, so nothing is refused today) — no paid tier is ever refused. See Plans & quotas. |
InvalidNameservers | 422 | The domain has no usable nameserver delegation. |
ProviderAuthenticationError | 422 | The end-user's DNS provider rejected the authorization/credential. |
apex_not_supported | 422 | The provider has no ALIAS/ANAME/flattened-CNAME apex capability — see Apex domains. |
service_unavailable | 503 | An optional engine (Sell, templates, billing, webhooks, Power, Secure) isn't configured. |
internal_error | 500 | Server error (generic title + a logged request id). |
Environment variables
Control-plane variables read CUSTOMDOMAIN_* first and fall back to the legacy
JUSTEASY_* prefix. Variables that matter for API consumers are called out on
the page that uses them.
Webhook signature
- Headers:
X-JE-Timestamp: <unix seconds>andX-JE-Signature: sha256=<hex>. - Algorithm: HMAC-SHA256 over
${timestamp}.${rawBody}(the timestamp, a dot, then the exact request body), keyed by the endpoint's signing secret (whsec_…). Reject deliveries whose timestamp is outside a ~5-minute window. See Verifying signatures.
Default edge record
A connection with no applied records yet points at the edge with a synthesized
CNAME <host> → edge.customdomain.ai (TTL 3600), overridable with
CUSTOMDOMAIN_EDGE_CNAME_TARGET (the legacy JUSTEASY_EDGE_CNAME_TARGET still works).
Resources
- Architecture — the two-plane design, data model, and request flows.
openapi-v1.yaml— the OpenAPI document the API reference is generated from; also served live atGET /v1/openapi.json.