Set edge delivery for a custom domain
const url = 'https://api.deploybase.eu/api/v1/api/v1/domains/example/edge-delivery';const options = { method: 'PATCH', headers: {Authorization: '<Authorization>', 'Content-Type': 'application/json'}, body: '{"mode":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PATCH \ --url https://api.deploybase.eu/api/v1/api/v1/domains/example/edge-delivery \ --header 'Authorization: <Authorization>' \ --header 'Content-Type: application/json' \ --data '{ "mode": "example" }'Chooses whether the domain is served only from EEA edge locations (“eea”) or worldwide (“global”). Only available for domains on a dedicated pull zone.
Authorizations
Section titled “ Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “ Path Parameters ”Domain ID
Request Body
Section titled “ Request Body ”Edge delivery mode
object
Mode is “eea” (served only from edge locations in the European Economic Area) or “global” (served from the worldwide edge network).
Example generated
{ "mode": "example"}Responses
Section titled “ Responses ”OK
object
object
object
DebugURL links to an external Let’s Encrypt diagnostic (Let’s Debug) pre-filled for this hostname, so a developer can self-check CAA/DNS issues we don’t probe server-side. Present only while SSL is unresolved (failed/pending/provisioning).
object
Record host
Human-readable guidance
CNAME | ALIAS | TXT
Record value/target
EdgeDelivery is the PoP set allowed to serve the dedicated pull zone (DEP-788). The gorm default tag matters: on Create GORM writes ‘eea’ for an empty value (and sets it on the struct), so a new domain never reaches the CHECK constraint as ‘’.
GeoMode + GeoCountries hold the CDN geo-filtering policy (BACK-210). GeoCountries is the set the customer chose (allow set or block set per GeoMode), NOT the inverted Bunny list; the block-list sent to Bunny is derived on the fly by ComputeBlockedCountries. Effective only when the domain is on a dedicated pull zone (UsesDedicatedPullZone()).
NextRetryAt is when the worker will next automatically re-attempt a failed SSL provisioning, so the UI can show “still retrying, next attempt ~X” instead of a frozen failure. Computed from the last attempt + the worker’s backoff; omitted unless failed.
PullZoneID is the dedicated Bunny pull zone for this custom domain in the 1:1 architecture (BACK-197/198), set at creation. NULL only when the CDN isn’t configured (dev/mock), in which case the domain has no CDN serving and falls back to the shared-PZ DNS instructions (see PointingTarget).
RouterOriginAt is set when the dedicated pull zone above has the Edge Script router as its origin (ADR-021 Phase 6, DEP-366) instead of a storage path pinned to one deployment. NULL means the legacy storage-path origin, which is what every domain has until the cutover re-points it.
NOTE: the explicit column tag is REQUIRED — GORM’s default namer mangles “SSLAttempts” to
“s_slattempts” (it treats the embedded “SLA” as a known initialism), which doesn’t match the
ssl_attempts column created in migration 000055. Without it every domains write fails with
column "s_slattempts" does not exist. The other SSL* fields don’t collide, so only this one
needs the override.
Machine-readable failure reason (SSLErrorCode); drives reason-specific UI guidance
SupportsEdgeDelivery reports whether the domain’s edge delivery (EEA-only or worldwide, DEP-788) can be changed. Like geo-filtering it needs the domain’s own pull zone.
SupportsGeoFiltering reports whether the domain is on a dedicated pull zone and can therefore accept a CDN geo-filtering policy (BACK-210). The UI uses this to enable/disable the geo controls and explain that a legacy (shared-PZ) domain isn’t eligible yet.
Example
{ "data": { "connection_mode": "byo_dns", "edge_delivery": "eea", "geo_mode": "off", "ssl_status": "pending", "status": "pending_verification" }}Invalid body or mode
object
object
Example generated
{ "code": "example", "details": "example", "error": "example", "meta": { "request_id": "example", "timestamp": "example", "trace_id": "example" }}Unauthorized
object
object
Example generated
{ "code": "example", "details": "example", "error": "example", "meta": { "request_id": "example", "timestamp": "example", "trace_id": "example" }}Forbidden
object
object
Example generated
{ "code": "example", "details": "example", "error": "example", "meta": { "request_id": "example", "timestamp": "example", "trace_id": "example" }}Not Found
object
object
Example generated
{ "code": "example", "details": "example", "error": "example", "meta": { "request_id": "example", "timestamp": "example", "trace_id": "example" }}Domain not on a dedicated pull zone yet
object
object
Example generated
{ "code": "example", "details": "example", "error": "example", "meta": { "request_id": "example", "timestamp": "example", "trace_id": "example" }}Saved but not applied to CDN
object
object
Example generated
{ "code": "example", "details": "example", "error": "example", "meta": { "request_id": "example", "timestamp": "example", "trace_id": "example" }}Live 174db30c built