Custom domains

Short links are served from the shared zngl.ink host unless you register your
own. Custom hosts need a Starter (or higher) plan.

All paths below are relative to https://api-v1.zingasuite.com/papi/v1.

Method Path Purpose
GET /links/domains List your hosts
POST /links/domains Register a host
DELETE /links/domains/{id} Remove a host

Register a host

curl -X POST https://api-v1.zingasuite.com/papi/v1/links/domains \
  -H "Authorization: Bearer zk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"host": "go.yourbrand.com"}'
{
  "id": "3ac9…",
  "host": "go.yourbrand.com",
  "status": "pending",
  "isDefault": false,
  "verificationJson": {},
  "createdAt": "2026-08-17T10:12:00Z"
}

The host is normalised (lower-cased, trailing dot stripped). A malformed host
returns 400 invalid_host; a host already claimed by another workspace returns
409 host_taken.

A new host starts pending. Point its DNS at the edge and complete verification
in the console (Zingalinks → Domains) — DNS verification is a console step,
not an API one. Once it is active you can pass its id as domainId when
creating a link.

Use a dedicated subdomain such as go.yourbrand.com, never your main website
host: a short-link host answers every path at its root.

List hosts

curl https://api-v1.zingasuite.com/papi/v1/links/domains \
  -H "Authorization: Bearer zk_live_xxx"

Returns { "data": [ … ], "total": n }, newest first. Check status before
using an id — pending hosts do not resolve yet.

Remove a host

curl -X DELETE https://api-v1.zingasuite.com/papi/v1/links/domains/<id> \
  -H "Authorization: Bearer zk_live_xxx"

Links on a removed host stop resolving. Keep the host registered while any
printed material that uses it is still in circulation.

Each host has its own slug namespace, so zngl.ink/sale and
go.yourbrand.com/sale are separate links, and a link cannot be moved between
hosts (that would change its short URL). Create a new link on the new host
instead.

Was this helpful?