Domain endpoints sit under /api/brands/{brand}/ (no moduleAccess required). Authenticate with EF-Access-Key.
List Domains
GET /api/brands/{brand}/domains
Results per page (1–100, default: 25)
curl https://app.elasticfunnels.io/api/brands/{brand_id}/domains \
-H "EF-Access-Key: your_api_key_here"
{
"current_page" : 1 ,
"data" : [
{
"id" : 7 ,
"domain" : "checkout.mybrand.com" ,
"dedicated_domain" : true ,
"status" : "validated" ,
"ssl_ready" : true ,
"cname_validated" : true ,
"is_tracking_domain" : false ,
"brand_id" : 42 ,
"created_at" : "2024-06-01T00:00:00.000000Z"
}
],
"per_page" : 25 ,
"total" : 2 ,
"last_page" : 1
}
List All Domains (Unpaginated)
GET /api/brands/{brand}/domains/all
Returns all domains as an array — used for dropdown selectors.
Get Domain
GET /api/brands/{brand}/domains/{domain}
Add Domain
POST /api/brands/{brand}/domains
Fully-qualified domain name (e.g. checkout.mybrand.com). Must be globally unique.
true for custom domains (requires DNS setup); false for subdomains on the platform’s root domain.
curl -X POST https://app.elasticfunnels.io/api/brands/{brand_id}/domains \
-H "EF-Access-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"domain": "checkout.mybrand.com", "dedicated_domain": true}'
cURL — add platform subdomain
curl -X POST https://app.elasticfunnels.io/api/brands/{brand_id}/domains \
-H "EF-Access-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"domain": "mybrand", "dedicated_domain": false}'
200 Custom domain added
422 Already taken
{
"id" : 7 ,
"domain" : "checkout.mybrand.com" ,
"dedicated_domain" : true ,
"status" : "pending-cname" ,
"ssl_ready" : false ,
"cname_validated" : false
}
Update Domain
PUT /api/brands/{brand}/domains/{domain}
Delete Domain
DELETE /api/brands/{brand}/domains/{domain}
Get Validation Instructions
Returns the DNS records that must be set to validate a custom domain. Call this after adding a domain to get the CNAME record to configure.
GET /api/brands/{brand}/domains/{domain}/validation-instructions
curl https://app.elasticfunnels.io/api/brands/{brand_id}/domains/7/validation-instructions \
-H "EF-Access-Key: your_api_key_here"
{
"cname_record" : {
"type" : "CNAME" ,
"host" : "checkout.mybrand.com" ,
"value" : "proxy.elasticfunnels.io" ,
"ttl" : 3600
},
"instructions" : "Add the following CNAME record to your DNS provider, then click Validate."
}
Validate Domain
Trigger a DNS validation check for a domain. Marks cname_validated = true if the CNAME resolves correctly.
POST /api/brands/{brand}/domains/{domain}/validate
curl -X POST https://app.elasticfunnels.io/api/brands/{brand_id}/domains/7/validate \
-H "EF-Access-Key: your_api_key_here"
200 Validated
200 Not yet validated
{
"success" : true ,
"status" : "validated" ,
"cname_validated" : true
}
Test Domain Configuration
Run a full connectivity and configuration test for a domain.
GET /api/brands/{brand}/domains/{domain}/test-configuration
{
"dns_ok" : true ,
"ssl_ok" : true ,
"http_reachable" : true ,
"https_reachable" : true ,
"status" : "healthy"
}
Request SSL Certificate
Provision or re-provision an SSL certificate for a validated custom domain.
POST /api/brands/{brand}/domains/{domain}/request-ssl
GET /api/brands/{brand}/domains/{domain}/request-ssl
curl -X POST https://app.elasticfunnels.io/api/brands/{brand_id}/domains/7/request-ssl \
-H "EF-Access-Key: your_api_key_here"
{
"success" : true ,
"message" : "SSL certificate provisioning started. This may take a few minutes."
}
Move Domain (Preview)
Preview what pages and components would be affected by moving all content from one domain to another.
POST /api/brands/{brand}/domains/{domain}/move/preview
Target domain ID to move content to
{
"pages_affected" : 12 ,
"components_affected" : 3 ,
"preview" : [
{ "id" : 101 , "title" : "Landing Page" , "current_domain" : "old.mybrand.com" , "new_domain" : "new.mybrand.com" }
]
}
Move Domain (Apply)
Execute the domain migration — update all pages and components from one domain to another.
POST /api/brands/{brand}/domains/{domain}/move/apply
{
"success" : true ,
"pages_updated" : 12 ,
"components_updated" : 3
}
Tracking Domains
Tracking domains are separate first-party domains used for click tracking and analytics (improves ad attribution). They require Cloudflare integration.
List Tracking Domains
GET /api/brands/{brand}/tracking-domains
Add Tracking Domain
POST /api/brands/{brand}/tracking-domains
Fully-qualified tracking domain (e.g. track.mybrand.com). Must be globally unique.
curl -X POST https://app.elasticfunnels.io/api/brands/{brand_id}/tracking-domains \
-H "EF-Access-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"domain": "track.mybrand.com"}'
{
"domain" : {
"id" : 9 ,
"domain" : "track.mybrand.com" ,
"is_tracking_domain" : true ,
"status" : "pending-cloudflare" ,
"cname_validated" : false ,
"cname_validation_record" : "proxy.elasticfunnels.io"
}
}
Delete Tracking Domain
DELETE /api/brands/{brand}/tracking-domains/{domain}
Domain Status Values
Status Meaning pending-cnameWaiting for CNAME DNS record pending-cloudflareCloudflare hostname being provisioned validatedDNS validated, domain active ssl-pendingSSL certificate being issued activeFully configured and live
Notes
Custom domains (dedicated_domain: true) require adding a CNAME record pointing to proxy.elasticfunnels.io before they can be validated
Platform subdomains are available instantly with no DNS changes required
Tracking domains go through Cloudflare provisioning automatically after creation — no manual CNAME setup needed
The Move endpoints transfer all page/component associations; the old domain remains but has no pages attached