Help center custom domains

Serve your help center from your own hostname, proved by a TXT record.

Each workspace gets one help-center site. Set its hostname and prove you own it with a TXT record, and the public help center serves from that hostname instead of the slug path.

Set the hostname

PUT /api/help_center_site sets the hostname and answers the verification record to publish. It is an upsert: the first save creates the site, and changing the hostname later moves it and requires re-verification. One site per workspace, and the hostname is unique across every workspace.

sh
curl -X PUT http://127.0.0.1/api/help_center_site \
  -H 'content-type: application/json' \
  -H 'authorization: Bearer fk_<key>' \
  -d '{"hostname":"help.acme.example"}'

A hostname is a bare name, never a URL: no scheme, port, path or whitespace, between 4 and 253 characters, at least two labels, and the last label must not be all digits. https://help.acme.example is refused with a message that says to enter a hostname.

The TXT record

The verification value is derived from the hostname itself, so nothing secret needs storing beside the row. Publish this record at your DNS provider:

TXT record
_fikadesk-verify.help.acme.example   TXT   "fikadesk-verify=help.acme.example"

Verify

POST /api/help_center_site/verify looks up the TXT record and marks the site verified when it matches. Only resolveTxt is used, never dns.lookup, so the check cannot be pointed anywhere but DNS.

sh
curl -X POST http://127.0.0.1/api/help_center_site/verify \
  -H 'content-type: application/json' \
  -H 'authorization: Bearer fk_<key>'

A verified site serves the help center when a request arrives with that Host header, with no slug in the path. An unverified hostname, or an unknown host, answers null and the server falls back to the slug path or 404.

Delete the site with DELETE /api/help_center_site to drop your custom hostname and free it for another claimant. The delete is soft, so a resolver mid-read never races a hard delete.

Note

If another workspace already holds the hostname, the upsert answers 409 conflict. Hostnames are global because they are public and resolved with no tenant context.