Let your customers bring their own domain
Give every workspace in your SaaS its own hostname. One API call returns the DNS records your customer adds; we handle verification, HTTPS and routing each request to the right workspace.
Hosted plans are opening soon. Self-hosting is available today.
from custom_domain import Client
client = Client(API_URL, API_KEY)
# A customer entered forms.acme.com
domain = client.create_domain(
"forms.acme.com", reference="ws_8f3a"
)
for r in domain.dns_records:
print(r.type, r.name, r.value)
# TXT _custom-domain-challenge.forms…
# CNAME forms.acme.com → edge.customdomainapi.comHow it works
From "add your domain" to live over HTTPS
Your app calls one endpoint. Your customer adds two DNS records. Everything else is automatic.
Register the hostname
Your backend calls POST /v1/domains with the customer's hostname and their workspace in your app.
Your customer adds two records
Show them the records the API returned: one proves they own the name, one sends its traffic to the edge.
CNAMEforms.acme.com → edge.customdomainapi.com
It goes live, safely
Once ownership, routing, certificate and your origin check out, the hostname is served over HTTPS and you get a domain.ready webhook.
Features
Everything custom domains need, nothing you have to build
Built for multi-tenant SaaS, where one wrong route means one customer seeing another's data.
Automatic HTTPS
Certificates are issued on demand from Let's Encrypt the moment a verified hostname is first requested, and renewed without you noticing.
Tenant-safe routing
Every request reaches your app with a signed assertion naming the workspace. Your backend never has to trust the Host header.
Exact DNS instructions
The API hands back the two records your customer publishes, and tells you in plain words which one is missing or wrong.
Lifecycle checks
Ownership, routing, certificate and origin are checked continuously. A hostname goes live only when all four pass, and stops the moment one fails.
Signed webhooks
Know when a customer's domain is ready, needs attention, recovers or is deleted, with signatures, retries and replay.
API, SDK and portal
A documented REST API with OpenAPI, a Python SDK with ASGI middleware, and an operator portal for everything else.
Pricing
Priced by domains, not by surprise
Start free on a shared edge. Every paid plan is a dedicated edge of your own, with a clear allowance of domains.
Free
25 domains · Shared edge
- Customers CNAME to edge.customdomainapi.com
- No card needed
- Community support on GitHub
Upgrade for more
Get early accessStarter
500 domains · Dedicated edge
- Your own edge hostname
- Fixed IPv4 and IPv6 addresses
- Managed upgrades and monitoring
- Email support
$0.02 per extra domain
Get early accessGrowth
5,000 domains · Dedicated edge
- Everything in Starter
- Daily backups kept 30 days
$0.01 per extra domain
Get early accessScale
25,000 domains · Dedicated edge
- Everything in Growth
- For large numbers of customer domains
More? Talk to us
Get early accessSecond edge · coming soon
A second edge on any paid plan, for failover or a second region. Tell us if you need it.
Enterprise
Managed in your own cloud account, several regions, an SLA. Talk to us.
Self-hosted
Free and open source under Apache 2.0, on your own server or cloud. Deploy it yourself.
A domain is a customer hostname you have registered and not deleted. Annual billing: two months free. Hosted plans are billed by Sireto BV; prices exclude VAT where it applies. Existing domains are never switched off when you reach your limit.
Self-host
Your cloud, fifteen minutes
Each option creates one server with fixed addresses, installs the latest release, and ends with the operator portal open at your edge's own name. Your cloud provider bills you directly.
FAQ
Questions
What is an edge?
The server your customers' hostnames point at. It holds their certificates, terminates HTTPS and forwards each request to your app with a signed assertion of the workspace it belongs to.
Which hostnames are supported?
Exact customer subdomains, such as forms.acme.com. Apex domains (acme.com) and wildcards are not supported yet.
Does my backend have to be in Python?
No. Any language can use the REST API and verify the signed assertion; the API and the assertion format are documented. The Python SDK and middleware make it a few lines in FastAPI or Starlette.
What is the difference between Free and the paid plans?
Free runs your application on an edge shared with others, under edge.customdomainapi.com, for up to 25 domains and 10 requests a second, with bursts. Every paid plan gives you a server of your own, under your own edge hostname, with more domains and no request limit of ours.
What counts as a domain, and what happens at the limit?
Every customer hostname you have registered and not deleted, including those still waiting for their DNS records. Deleted ones don't count. You are warned as you approach the allowance; on paid plans each extra domain costs a little, and on Free new ones wait until you upgrade. Domains that already work are never switched off.
Can I move between hosted and self-hosted?
It is the same open-source service everywhere, so your integration (the API, the SDK and the middleware) does not change. Your customers' CNAME records name the edge they point at: with your own edge hostname (a paid plan or self-hosted) moving is repointing that one name, while leaving the shared Free edge means they update their CNAME.
Give your customers their own domain
Hosted plans are opening soon. Tell us about your product and we will get you started.