Custom Domain

Reference

Enums, environment variables, error codes, and other lookup tables.

Enums

ConnectionStatuspending, propagating, live, failed.

SetupTypeautomatic, manual, async, mcp.

Roleowner, admin, member, viewer.

PlanIdfree, startup, growth, premium, enterprise.

Environmentproduction, staging, development.

DNS record typesA, AAAA, CNAME, CAA, MX, NS, TXT, plus the meta-types SPFM (SPF-merge) and REDIR301.

Webhook eventsconnection.created, connection.applied, connection.live, connection.failed, domain.record_missing, domain.record_restored, domain.purchased (the broader emitted vocabulary also includes domain.flow.completed and domain.propagation.timeout).

Error envelope & codes

Every error is { "code", "title", "details"? }. code is a stable machine string:

codeHTTPMeaning
invalid_request400Malformed or missing input.
unauthorized401Missing/invalid credential.
not_found404Object doesn't exist or isn't in your tenant.
service_unavailable503An optional engine (Sell, templates, billing, webhooks) isn't configured.
internal_error500Server error (generic title + a logged request id).

Environment variables

See Self-hosting → Configuration for the full control-plane, edge, and console tables. Note the CUSTOMDOMAIN_*-then-JUSTEASY_* fallback for control-plane variables.

Webhook signature

  • Headers: X-JE-Timestamp: <unix seconds> and X-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 JUSTEASY_EDGE_CNAME_TARGET.

Resources

  • docs/architecture/ARCHITECTURE.md — the two-plane design, data model, and request flows.
  • infra/ — compose files, Caddyfile, and ops scripts.
  • openapi-v1.yaml — the OpenAPI document the API reference is generated from; also served live at GET /v1/openapi.json.

On this page