# Custom domains

Serve your source URLs from your own hostname, such as hooks.acme.com, instead of hooks.getensue.com.

By default a source URL looks like `https://hooks.getensue.com/in/<token>`. With a custom domain, the same source is reachable at `https://hooks.acme.com/in/<token>`. Senders then never see Ensue's hostname, and you can move providers without changing every sender's webhook settings.

## Add a domain

1. Open **Settings → Domains**, or `POST /v1/domains` with the hostname.

   ```bash
   curl -X POST https://api.getensue.com/v1/domains \
     -H "authorization: Bearer ens_<key>" -H "content-type: application/json" \
     -d '{ "hostname": "hooks.acme.com" }'
   ```

2. The response lists the DNS records to create at your DNS provider:

   | Type | Name | Value |
   |---|---|---|
   | `CNAME` | `hooks.acme.com` | The target Ensue gives you. |
   | `TXT` | `_acme-challenge.hooks.acme.com` | The validation value Ensue gives you, so the certificate can be issued. |

3. Wait for the status to become active. Ensue checks pending domains every five minutes; **Check now** (`POST /v1/domains/:id/check`) checks immediately.

When both the hostname and its TLS certificate are active, the same source tokens work on your hostname. The original `hooks.getensue.com` URL keeps working.

## Good to know

- Add the `TXT` record **before** you move the `CNAME`, so the certificate is issued without downtime.
- If validation fails permanently, remove the domain and add it again.
- Over-quota traffic is blocked at the edge on custom domains too. See [Usage and retention](/gateway/usage-and-retention/).
- Deleting a domain stops serving it straight away; senders still pointing at it will get connection errors.

> [!NOTE]
> Custom domains are for **receiving** webhooks. Webhooks you send with [Dispatch](/dispatch/overview/) are delivered from Ensue's network.