Skip to Content

App Domains

Configure custom domains for your multi-tenant applications with automatic SSL and DNS management.

Stable

Overview

Domain management in elizaOS Cloud supports:

Quick Start

Dashboard

Navigate to Dashboard → Apps and select an app to manage its domains.

API

# Add a custom domain to your app curl -X POST "https://cloud.milady.ai/api/v1/apps/{appId}/domains" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "domain": "myapp.example.com" }'

How Domain Routing Works

App Deployment

When you deploy an app, it automatically receives a subdomain like myapp.apps.cloud.milady.ai.

Custom Domain (Optional)

Add your own domain and configure DNS records.

SSL Provisioning

Vercel automatically provisions SSL certificates for all domains.

Traffic Routing

Requests are routed to your app based on the incoming domain.

Using Wildcard Subdomains

Every deployed app automatically gets a subdomain under apps.cloud.milady.ai:

https://myapp.apps.cloud.milady.ai

This works immediately with no DNS configuration required.

Subdomain Rules

RuleExampleValid
Min 3 charactersab
Max 63 charactersmy-long-subdomain...
Alphanumeric + hyphensmy-app-v2
No leading/trailing hyphens-myapp-
Lowercase onlyMyAppmyappAuto-converted

Reserved Subdomains

The following subdomains are reserved and cannot be used:

Adding Custom Domains

Custom domains let you use your own branded URLs like myapp.com or app.company.com.

Add Domain via API

curl -X POST "https://cloud.milady.ai/api/v1/apps/{appId}/domains" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "domain": "myapp.example.com" }'

Response

{ "success": true, "domain": "myapp.example.com", "verified": false, "verificationRecords": [ { "type": "TXT", "name": "_vercel.myapp.example.com", "value": "vc-domain-verify=abc123..." } ], "dnsInstructions": [ { "type": "CNAME", "name": "myapp", "value": "cname.vercel-dns.com" } ], "isApexDomain": false }

DNS Configuration

Subdomains (CNAME)

For subdomains like app.example.com:

TypeNameValue
CNAMEappcname.vercel-dns.com

Root/Apex Domains (A Record)

For apex domains like example.com:

TypeNameValue
A@76.76.21.21

DNS changes can take 5 minutes to 48 hours to propagate worldwide. You can check propagation status at whatsmydns.net .

Verifying Domain Ownership

If your domain is already registered elsewhere on Vercel, you’ll need to add a TXT record to verify ownership.

Verify via API

curl -X POST "https://cloud.milady.ai/api/v1/apps/{appId}/domains/verify" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "domain": "myapp.example.com" }'

Response

{ "success": true, "verified": true, "status": { "domain": "myapp.example.com", "status": "valid", "configured": true, "verified": true, "sslStatus": "provisioning", "configuredBy": "CNAME", "isApexDomain": false } }

Checking Domain Status

Monitor your domain’s DNS and SSL status:

curl -X POST "https://cloud.milady.ai/api/v1/apps/{appId}/domains/status" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "domain": "myapp.example.com" }'

Response

{ "success": true, "domain": "myapp.example.com", "status": "valid", "configured": true, "verified": true, "sslStatus": "active", "sslExpiresAt": "2025-04-15T00:00:00Z", "configuredBy": "CNAME", "records": [], "isApexDomain": false, "dnsInstructions": [ { "type": "CNAME", "name": "myapp", "value": "cname.vercel-dns.com" } ] }

Status Values

StatusDescription
pendingDNS records not yet detected
validDomain properly configured
invalidDNS misconfigured, check records
unknownDomain not found in project

SSL Status Values

SSL StatusDescription
pendingAwaiting DNS verification
provisioningCertificate being issued
activeCertificate active and valid
errorCertificate issue (check configuration)

Syncing Domain Status

Refresh all domain statuses for an app:

curl -X POST "https://cloud.milady.ai/api/v1/apps/{appId}/domains/sync" \ -H "Authorization: Bearer YOUR_API_KEY"

Response

{ "success": true, "domains": [ { "id": "dom_abc123", "subdomain": "myapp", "subdomainUrl": "https://myapp.apps.cloud.milady.ai", "customDomain": "myapp.example.com", "customDomainUrl": "https://myapp.example.com", "customDomainVerified": true, "sslStatus": "active", "isPrimary": true } ], "syncedAt": "2025-01-05T12:00:00Z" }

Removing Custom Domains

Remove a custom domain from your app:

curl -X DELETE "https://cloud.milady.ai/api/v1/apps/{appId}/domains" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "domain": "myapp.example.com" }'

After removing a domain, users will no longer be able to access your app via that URL. The subdomain at *.apps.cloud.milady.ai remains active.

Apex and WWW Redirects

For the best user experience, configure both apex and www versions:

Both Versions

  1. Add both example.com and www.example.com to your app
  2. Configure one to redirect to the other for consistent URLs
DomainTypeValue
example.comA76.76.21.21
www.example.comCNAMEcname.vercel-dns.com

Avoiding Duplicate Content

If the same app is accessible via both subdomain and custom domain:

Add canonical tags to your HTML <head>:

<link rel="canonical" href="https://myapp.example.com/page" />

Troubleshooting

DNS Propagation Delays

Problem: Domain not working after adding DNS records.

Solution:

Domain Verification Failed

Problem: TXT record verification not working.

Solution:

SSL Certificate Not Provisioning

Problem: SSL status stuck on “pending” or “provisioning”.

Solution:

Domain Already In Use

Problem: Error saying domain is already connected to another project.

Solution:

Subdomain Length Limit

Problem: Preview URLs fail due to length.

Solution:

Domain Security

Homograph Attack Prevention

elizaOS Cloud blocks domains with:

This prevents phishing attacks using visually similar domain names.

Domain Validation

All domains are validated for:

API Reference

Endpoints

MethodEndpointDescription
GET/api/v1/apps/{id}/domainsList all domains
POST/api/v1/apps/{id}/domainsAdd custom domain
DELETE/api/v1/apps/{id}/domainsRemove custom domain
POST/api/v1/apps/{id}/domains/verifyVerify domain ownership
POST/api/v1/apps/{id}/domains/statusCheck domain status
POST/api/v1/apps/{id}/domains/syncSync all domain statuses

Best Practices

Next Steps