Skip to content
UpVoiced Docs

API reference

Custom domains

Custom portal hostnames and their verification.

Set up the SDK client used in the examples

API key or Dashboard session:

import { UpVoiced } from '@upvoiced/sdk';

const apiKey = process.env['UPVOICED_API_KEY']; // uv_live_… (Settings → API keys)
const workspace = process.env['UPVOICED_WORKSPACE_ID']; // sent as X-Workspace
if (!apiKey || !workspace) throw new Error('Set UPVOICED_API_KEY and UPVOICED_WORKSPACE_ID.');
const upvoiced = new UpVoiced({ apiKey, workspace });

curl examples read $UPVOICED_API_KEY and $UPVOICED_WORKSPACE_IDfrom your shell. MCP examples are the tools/call request an MCP client sends to the MCP server with the same API key.

GET/v1/workspace/domains

The workspace custom domain with live status, DNS records and the CNAME target (owner/admin)

Authentication
API key or Dashboard session; API key scope admin
Operation id
listCustomDomains
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 21 fields
Response 200 (application/json)
NameTypeRequired
itemsarray of objectitems ≤ 2Yes
items[].idstring (uuid)Yes
items[].hostnamestringlength 1–253Yes
items[].display_hostnamestringlength 1–1012Yes
items[].status"pending" | "active" | "failed" | "removing"Yes
items[].failure_reason"verification_timeout" | "dns_not_pointed" | "certificate_failed" | "blocked" | "hostname_deleted" | nullYes
items[].hostname_statusstring | nullpattern ^[a-z_]{1,40}$Yes
items[].certificate_statusstring | nullpattern ^[a-z_]{1,40}$Yes
items[].verification_errorsarray of stringitems ≤ 5Yes
items[].recordsarray of objectitems ≤ 6Yes
items[].records[].type"CNAME" | "TXT"Yes
items[].records[].namestringlength 1–300Yes
items[].records[].valuestringlength 1–300Yes
items[].records[].purpose"routing" | "ownership" | "certificate"Yes
items[].records[].requiredbooleanYes
items[].created_atstring (date-time)Yes
items[].activated_atstring (date-time) | nullYes
items[].last_checked_atstring (date-time) | nullYes
items[].next_check_atstring (date-time) | nullYes
cname_targetstringlength 1–253Yes
max_domains1Yes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl 'https://api.upvoiced.com/v1/workspace/domains' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID"
TypeScript SDK
const data = await upvoiced.get('/v1/workspace/domains');
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.

POST/v1/workspace/domains

Connect a custom domain (custom_domain, Starter and above; one per workspace): returns the CNAME target and TXT pre-validation records

Authentication
API key or Dashboard session; API key scope admin
Operation id
createCustomDomain
Idempotency
Send an Idempotency-Key to make retries safe.
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
idempotency-keystringpattern ^[A-Za-z0-9_.:-]{8,128}$No
Request body (JSON)
NameTypeRequired
hostnamestringlength 1–1012Yes
Response 201: 18 fields
Response 201 (application/json)
NameTypeRequired
idstring (uuid)Yes
hostnamestringlength 1–253Yes
display_hostnamestringlength 1–1012Yes
status"pending" | "active" | "failed" | "removing"Yes
failure_reason"verification_timeout" | "dns_not_pointed" | "certificate_failed" | "blocked" | "hostname_deleted" | nullYes
hostname_statusstring | nullpattern ^[a-z_]{1,40}$Yes
certificate_statusstring | nullpattern ^[a-z_]{1,40}$Yes
verification_errorsarray of stringitems ≤ 5Yes
recordsarray of objectitems ≤ 6Yes
records[].type"CNAME" | "TXT"Yes
records[].namestringlength 1–300Yes
records[].valuestringlength 1–300Yes
records[].purpose"routing" | "ownership" | "certificate"Yes
records[].requiredbooleanYes
created_atstring (date-time)Yes
activated_atstring (date-time) | nullYes
last_checked_atstring (date-time) | nullYes
next_check_atstring (date-time) | nullYes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl -X POST 'https://api.upvoiced.com/v1/workspace/domains' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "hostname": "Example hostname"
}'
TypeScript SDK
const data = await upvoiced.post('/v1/workspace/domains', { body: { hostname: 'Example hostname' } });
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.

DELETE/v1/workspace/domains/{id}

Remove the custom domain: the portal returns to its UpVoiced subdomain; the hostname is released

Authentication
API key or Dashboard session; API key scope admin
Operation id
deleteCustomDomain
Path parameters
NameTypeRequired
idstring (uuid)Yes
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 18 fields
Response 200 (application/json)
NameTypeRequired
idstring (uuid)Yes
hostnamestringlength 1–253Yes
display_hostnamestringlength 1–1012Yes
status"pending" | "active" | "failed" | "removing"Yes
failure_reason"verification_timeout" | "dns_not_pointed" | "certificate_failed" | "blocked" | "hostname_deleted" | nullYes
hostname_statusstring | nullpattern ^[a-z_]{1,40}$Yes
certificate_statusstring | nullpattern ^[a-z_]{1,40}$Yes
verification_errorsarray of stringitems ≤ 5Yes
recordsarray of objectitems ≤ 6Yes
records[].type"CNAME" | "TXT"Yes
records[].namestringlength 1–300Yes
records[].valuestringlength 1–300Yes
records[].purpose"routing" | "ownership" | "certificate"Yes
records[].requiredbooleanYes
created_atstring (date-time)Yes
activated_atstring (date-time) | nullYes
last_checked_atstring (date-time) | nullYes
next_check_atstring (date-time) | nullYes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl -X DELETE 'https://api.upvoiced.com/v1/workspace/domains/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID"
TypeScript SDK
const data = await upvoiced.delete('/v1/workspace/domains/{id}', { path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' } });
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.