curl -X POST "https://api.scanova.io/custom-domain/" \
-H "Authorization: 401f7ac837da42b97f613d789819ff93537bee6a" \
-H "Content-Type: application/json" \
-d '{ "domain": "links.example.com" }'
{
"id": 42,
"domain": "https://links.example.com",
"is_default": false,
"disable_slug_case": false,
"txt_value": "scanova-verification=abc123...",
"is_txt_verified": false,
"is_cname_verified": false,
"is_migrated": false,
"dns_provider": { "name": "Cloudflare", "placeholders": { "cname": { "content": { "label": "Target" } } } },
"txt_error": null,
"cname_error": null,
"root_action": "no_action",
"redirect": null,
"template": null,
"protocol": "https",
"remove_qr_query": false,
"cname_target": "shortcname.scanova.io",
"domain_connect_supported": false,
"domain_connect_checked_at": null,
"created": "2026-09-08T10:00:00Z",
"modified": "2026-09-08T10:00:00Z"
}
Custom Domains
Add a custom domain
POST /custom-domain/
POST
/
custom-domain
/
curl -X POST "https://api.scanova.io/custom-domain/" \
-H "Authorization: 401f7ac837da42b97f613d789819ff93537bee6a" \
-H "Content-Type: application/json" \
-d '{ "domain": "links.example.com" }'
{
"id": 42,
"domain": "https://links.example.com",
"is_default": false,
"disable_slug_case": false,
"txt_value": "scanova-verification=abc123...",
"is_txt_verified": false,
"is_cname_verified": false,
"is_migrated": false,
"dns_provider": { "name": "Cloudflare", "placeholders": { "cname": { "content": { "label": "Target" } } } },
"txt_error": null,
"cname_error": null,
"root_action": "no_action",
"redirect": null,
"template": null,
"protocol": "https",
"remove_qr_query": false,
"cname_target": "shortcname.scanova.io",
"domain_connect_supported": false,
"domain_connect_checked_at": null,
"created": "2026-09-08T10:00:00Z",
"modified": "2026-09-08T10:00:00Z"
}
Connects a new custom domain to the account, on the Management API host (
Adding a domain doesn’t verify it — the response’s
api.scanova.io), authenticated with your raw Management API key.
POST https://api.scanova.io/custom-domain/
Authorization: 401f7ac837da42b97f613d789819ff93537bee6a
string
required
The domain to connect, e.g.
links.example.com. A scheme prefix, trailing slash, and casing are all normalized automatically — send it however you like.curl -X POST "https://api.scanova.io/custom-domain/" \
-H "Authorization: 401f7ac837da42b97f613d789819ff93537bee6a" \
-H "Content-Type: application/json" \
-d '{ "domain": "links.example.com" }'
{
"id": 42,
"domain": "https://links.example.com",
"is_default": false,
"disable_slug_case": false,
"txt_value": "scanova-verification=abc123...",
"is_txt_verified": false,
"is_cname_verified": false,
"is_migrated": false,
"dns_provider": { "name": "Cloudflare", "placeholders": { "cname": { "content": { "label": "Target" } } } },
"txt_error": null,
"cname_error": null,
"root_action": "no_action",
"redirect": null,
"template": null,
"protocol": "https",
"remove_qr_query": false,
"cname_target": "shortcname.scanova.io",
"domain_connect_supported": false,
"domain_connect_checked_at": null,
"created": "2026-09-08T10:00:00Z",
"modified": "2026-09-08T10:00:00Z"
}
txt_value and cname_target are the DNS records you (or the domain owner) still need to add, and is_txt_verified/is_cname_verified start false. Scanova asynchronously checks whether the domain’s registrar supports Domain Connect one-click setup right after creation; domain_connect_supported reflects the outcome once that check completes.
400 if the domain is invalid or already connected to any account (uniqueness is case-insensitive). 403 if the account lacks the CUSTOM_DOMAIN quota, has an inactive plan, lacks CUSTOM_DOMAIN_CAN_ADD permission, or has hit its domain limit.
Related
- List custom domains — see connected domains.
- Verify a custom domain’s DNS records — check the records once added.
- Get a Domain Connect setup link — one-click DNS setup, when supported.
- Email DNS setup instructions — hand the manual steps off to someone else.
- Management API overview — the auth scheme and quota rules that apply to this endpoint.
Authorizations
Send your Management API key as the raw value of the Authorization header — no "Bearer " or "Token " prefix, and no other characters. Example: Authorization: 401f7ac837da42b97f613d789819ff93537bee6a. A header containing more than one space-separated part is rejected outright. Requests also require the request's Host header to be the management API host (e.g. api.scanova.io) — the same key sent to the regular API host will not authenticate.
Response
Domain added.
Was this page helpful?