Claim a domain for admin SSO
/portal/v1/accounts/{accountSlug}/sso/domainsClaims an email domain for admin-SSO routing and issues a DNS TXT challenge (a canopy-domain-verification= token published under a _canopy-verification subdomain). The domain is normalized from a pasted URL or host and rejected (400) if it is malformed or a known public email provider. Idempotent: re-claiming an existing (Account, domain) returns the existing row and token rather than minting a new challenge. Emits an sso.domain.claimed audit row and returns 201.
Authentication
AuthorizationJWT access token. Never send alongside X-API-Key: a request carrying both is refused.
sso.manageSecurityManage SSO connections, domains, and directory sync. Granted through an administrator role in the Admin Workspace; a valid token without it is refused with 403.
Request body
application/json
domainstring Required Domain to claim, e.g. `acme.com`.
Responses
application/json
data *SsoDomainResponseDto
application/json
error *ApiErrorBodyDto
application/json
error *ApiErrorBodyDto
Errors
When the request can't be completed, the response body includes a stable error code you can branch on.
account.capability_requiredForbiddenThe signed-in user's administrator roles do not grant the capability this endpoint requires.
Ask an account administrator to grant a role carrying the capability named in the Authentication section, then retry.
Returned object
curl -X POST "https://auth.canopy-io.com/portal/v1/accounts/{accountSlug}/sso/domains" \ -H "Authorization: Bearer $CANOPY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "domain": "string" }'
{ "data": { "domain": "string", "status": "pending", "txt_record_name": "string", "txt_record_value": "string", "verified_at": "2026-04-20T12:00:00.000Z", "last_checked_at": "2026-04-20T12:00:00.000Z", "failure_reason": "string" } }
Tell us how we can improve this guide.