Skip to main content
Domain endpoints sit under /api/brands/{brand}/ (no moduleAccess required). Authenticate with EF-Access-Key.

List Domains

GET /api/brands/{brand}/domains
per_page
number
Results per page (1–100, default: 25)
q
string
Search by domain name
cURL
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
domain
string
required
Fully-qualified domain name (e.g. checkout.mybrand.com). Must be globally unique.
dedicated_domain
boolean
required
true for custom domains (requires DNS setup); false for subdomains on the platform’s root domain.
cURL — add custom 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}'
{
  "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}
{ "success": true }

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
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
curl -X POST https://app.elasticfunnels.io/api/brands/{brand_id}/domains/7/validate \
  -H "EF-Access-Key: your_api_key_here"
{
  "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
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
number
required
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
target_domain_id
number
required
Target domain ID
{
  "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
domain
string
required
Fully-qualified tracking domain (e.g. track.mybrand.com). Must be globally unique.
cURL
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

StatusMeaning
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