REST API
Domains
Domains: 6 endpoints of the REST API.
/domainsList domains
The domains of this environment: its platform host first, then custom domains in the order they were added, each with status, verification times and the last check.
Secret key scope (any of): domains:write
Parameters
| Field | Type | Description |
|---|---|---|
limit (query) | integer | Items per page (1–100). |
cursor (query) | string |
|
type (query) | "shared" | "custom" | Only shared or only custom domains. |
Responses
200 A page of domains.
| Field | Type | Description |
|---|---|---|
datarequired | object[] | |
data[].idrequired | string | |
data[].environmentrequired | "test" | "live" | |
data[].hostnamerequired | string | Normalized (lowercase, punycode) hostname. |
data[].typerequired | "shared" | "custom" |
|
data[].statusrequired | "pending_dns" | "verifying" | "issuing_ssl" | "active" | "dns_misconfigured" | "ssl_failed" | "suspended" |
|
data[].dns_recordsrequired | object[] | null | The records to create for a custom domain (a CNAME to the edge host, or an A/AAAA record to its addresses, plus the ownership TXT); null for shared domains. |
data[].verified_atrequired | string (date-time) | null | When ownership was first proven; null until then. |
data[].last_checked_atrequired | string (date-time) | null | |
data[].failed_check_countrequired | integer | Consecutive failed checks. |
data[].failing_sincerequired | string (date-time) | null | |
data[].cert_expires_atrequired | string (date-time) | null | |
data[].suspended_atrequired | string (date-time) | null | |
data[].created_atrequired | string (date-time) | |
data[].updated_atrequired | string (date-time) | |
next_cursorrequired | string | null | Pass as |
custom_domains_enabled | boolean | Whether this deployment lets projects add custom domains. When false, adding one is a 403 |
Example
curl -X GET "https://api.becklinks.com/v1/domains" \
-H "Authorization: Bearer $SECRET_KEY"/domainsAdd a custom domain
Claims a domain or subdomain you own for this environment, e.g. go.acme.com. The response carries dns_records: a CNAME to the edge host and a TXT record with your verification token. Create them, then call verify.
A domain another project already holds is a 409 domain_taken, unless that claim never proved ownership and is older than 7 days. Not available unless the deployment enables custom domains (403 feature_disabled).
Secret key scope (any of): domains:write
Request body
| Field | Type | Description |
|---|---|---|
hostnamerequired | string | The domain or subdomain to serve links on, e.g. |
Responses
201 The pending domain.
| Field | Type | Description |
|---|---|---|
idrequired | string | |
environmentrequired | "test" | "live" | |
hostnamerequired | string | Normalized (lowercase, punycode) hostname. |
typerequired | "shared" | "custom" |
|
statusrequired | "pending_dns" | "verifying" | "issuing_ssl" | "active" | "dns_misconfigured" | "ssl_failed" | "suspended" |
|
dns_recordsrequired | object[] | null | The records to create for a custom domain (a CNAME to the edge host, or an A/AAAA record to its addresses, plus the ownership TXT); null for shared domains. |
verified_atrequired | string (date-time) | null | When ownership was first proven; null until then. |
last_checked_atrequired | string (date-time) | null | |
failed_check_countrequired | integer | Consecutive failed checks. |
failing_sincerequired | string (date-time) | null | |
cert_expires_atrequired | string (date-time) | null | |
suspended_atrequired | string (date-time) | null | |
created_atrequired | string (date-time) | |
updated_atrequired | string (date-time) |
Example
curl -X POST "https://api.becklinks.com/v1/domains" \
-H "Authorization: Bearer $SECRET_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"hostname":"string"}'/domains/{domain}Get a domain
Secret key scope (any of): domains:write
Parameters
| Field | Type | Description |
|---|---|---|
domain (path)required | string | The ID of the domain. |
Responses
200 The domain.
| Field | Type | Description |
|---|---|---|
idrequired | string | |
environmentrequired | "test" | "live" | |
hostnamerequired | string | Normalized (lowercase, punycode) hostname. |
typerequired | "shared" | "custom" |
|
statusrequired | "pending_dns" | "verifying" | "issuing_ssl" | "active" | "dns_misconfigured" | "ssl_failed" | "suspended" |
|
dns_recordsrequired | object[] | null | The records to create for a custom domain (a CNAME to the edge host, or an A/AAAA record to its addresses, plus the ownership TXT); null for shared domains. |
verified_atrequired | string (date-time) | null | When ownership was first proven; null until then. |
last_checked_atrequired | string (date-time) | null | |
failed_check_countrequired | integer | Consecutive failed checks. |
failing_sincerequired | string (date-time) | null | |
cert_expires_atrequired | string (date-time) | null | |
suspended_atrequired | string (date-time) | null | |
created_atrequired | string (date-time) | |
updated_atrequired | string (date-time) |
Example
curl -X GET "https://api.becklinks.com/v1/domains/{domain}" \
-H "Authorization: Bearer $SECRET_KEY"/domains/{domain}Remove a custom domain
Removes a custom domain. Its links stop resolving at once and stay disabled while the domain can still be restored (30 days). The platform host of an environment cannot be removed (409).
Secret key scope (any of): domains:write
Parameters
| Field | Type | Description |
|---|---|---|
domain (path)required | string | The ID of the domain. |
Responses
204 The domain is removed.
Example
curl -X DELETE "https://api.becklinks.com/v1/domains/{domain}" \
-H "Authorization: Bearer $SECRET_KEY"/domains/{domain}/diagnosticsDiagnose a domain
Expected against found DNS records and, for each configured app, whether the host serves a correct apple-app-site-association (Team ID and bundle ID) and assetlinks.json (package name and signing fingerprints). The files are fetched over HTTPS from the host with the same rules Apple and Google apply (no redirects, status 200, JSON).
Secret key scope (any of): domains:write
Parameters
| Field | Type | Description |
|---|---|---|
domain (path)required | string | The ID of the domain. |
Responses
200 The diagnostics.
| Field | Type | Description |
|---|---|---|
domain_idrequired | string | |
hostnamerequired | string | |
typerequired | "shared" | "custom" | |
statusrequired | "pending_dns" | "verifying" | "issuing_ssl" | "active" | "dns_misconfigured" | "ssl_failed" | "suspended" | |
checked_atrequired | string (date-time) | |
dnsrequired | object[] | Empty for shared domains: their DNS is ours. |
dns[].purposerequired | "routing" | "ownership" | |
dns[].typerequired | "CNAME" | "TXT" | |
dns[].namerequired | string | |
dns[].expectedrequired | string[] | What the record should hold. Routing accepts either the CNAME target or an address that belongs to it. |
dns[].foundrequired | string[] | What DNS answers right now. |
dns[].statusrequired | "ok" | "missing" | "mismatch" | "lookup_failed" | |
dns[].viarequired | "cname" | "address" | null | For routing: how the host reaches the edge (a CNAME chain or a shared address). |
dns[].detailrequired | string | null | A hint when the record is not right. |
iosrequired | object | |
ios.platformrequired | "ios" | "android" | |
ios.urlrequired | string | |
ios.sourcerequired | "fetched" | "generated" | "skipped" |
|
ios.configuredrequired | boolean | The environment has this platform configured. |
ios.http_statusrequired | integer | null | |
ios.content_typerequired | string | null | |
ios.valid_jsonrequired | boolean | null | |
ios.expectedrequired | object | |
ios.expected.identifiersrequired | string[] | iOS: app IDs ( |
ios.expected.fingerprintsrequired | string[] | Android SHA-256 signing fingerprints; empty for iOS. |
ios.foundrequired | object | |
ios.found.identifiersrequired | string[] | iOS: app IDs ( |
ios.found.fingerprintsrequired | string[] | Android SHA-256 signing fingerprints; empty for iOS. |
ios.matchesrequired | boolean | null | True when the served file names this app; null when nothing was compared. |
ios.problemsrequired | object[] | |
ios.problems[].coderequired | "not_configured" | "unreachable" | "blocked_address" | "not_found" | "redirected" | "unexpected_status" | "wrong_content_type" | "too_large" | "invalid_json" | "wrong_structure" | "identifier_missing" | "fingerprint_missing" | |
ios.problems[].messagerequired | string | |
androidrequired | object | |
android.platformrequired | "ios" | "android" | |
android.urlrequired | string | |
android.sourcerequired | "fetched" | "generated" | "skipped" |
|
android.configuredrequired | boolean | The environment has this platform configured. |
android.http_statusrequired | integer | null | |
android.content_typerequired | string | null | |
android.valid_jsonrequired | boolean | null | |
android.expectedrequired | object | |
android.expected.identifiersrequired | string[] | iOS: app IDs ( |
android.expected.fingerprintsrequired | string[] | Android SHA-256 signing fingerprints; empty for iOS. |
android.foundrequired | object | |
android.found.identifiersrequired | string[] | iOS: app IDs ( |
android.found.fingerprintsrequired | string[] | Android SHA-256 signing fingerprints; empty for iOS. |
android.matchesrequired | boolean | null | True when the served file names this app; null when nothing was compared. |
android.problemsrequired | object[] | |
android.problems[].coderequired | "not_configured" | "unreachable" | "blocked_address" | "not_found" | "redirected" | "unexpected_status" | "wrong_content_type" | "too_large" | "invalid_json" | "wrong_structure" | "identifier_missing" | "fingerprint_missing" | |
android.problems[].messagerequired | string |
Example
curl -X GET "https://api.becklinks.com/v1/domains/{domain}/diagnostics" \
-H "Authorization: Bearer $SECRET_KEY"/domains/{domain}/verifyRe-verify a domain
Checks the domain now: the ownership TXT record, the CNAME (or address) to the edge and, while the certificate is pending, HTTPS. The status moves accordingly: verifying, dns_misconfigured, issuing_ssl, active or ssl_failed. A lookup that fails (DNS temporarily unavailable) changes nothing (inconclusive). A domain can be checked once every 30 seconds (429 with Retry-After). Shared platform hosts are always active.
Secret key scope (any of): domains:write
Parameters
| Field | Type | Description |
|---|---|---|
domain (path)required | string | The ID of the domain. |
Responses
200 The domain after the check, and what the check found.
| Field | Type | Description |
|---|---|---|
domainrequired | object | |
domain.idrequired | string | |
domain.environmentrequired | "test" | "live" | |
domain.hostnamerequired | string | Normalized (lowercase, punycode) hostname. |
domain.typerequired | "shared" | "custom" |
|
domain.statusrequired | "pending_dns" | "verifying" | "issuing_ssl" | "active" | "dns_misconfigured" | "ssl_failed" | "suspended" |
|
domain.dns_recordsrequired | object[] | null | The records to create for a custom domain (a CNAME to the edge host, or an A/AAAA record to its addresses, plus the ownership TXT); null for shared domains. |
domain.verified_atrequired | string (date-time) | null | When ownership was first proven; null until then. |
domain.last_checked_atrequired | string (date-time) | null | |
domain.failed_check_countrequired | integer | Consecutive failed checks. |
domain.failing_sincerequired | string (date-time) | null | |
domain.cert_expires_atrequired | string (date-time) | null | |
domain.suspended_atrequired | string (date-time) | null | |
domain.created_atrequired | string (date-time) | |
domain.updated_atrequired | string (date-time) | |
checkrequired | object | |
check.outcomerequired | "passed" | "pending" | "failed" | "inconclusive" | "not_applicable" |
|
check.ownershiprequired | "ok" | "fail" | "unknown" | "not_checked" | The TXT record holds the token. |
check.routingrequired | "ok" | "fail" | "unknown" | "not_checked" | The CNAME or the addresses point at the edge. |
check.certificaterequired | "ok" | "fail" | "unknown" | "not_checked" | HTTPS answers with a valid certificate; only probed while issuing it. |
check.checked_atrequired | string (date-time) |
Example
curl -X POST "https://api.becklinks.com/v1/domains/{domain}/verify" \
-H "Authorization: Bearer $SECRET_KEY" \
-H "Idempotency-Key: $(uuidgen)"