Docs For organizations
Claiming a domain
File a claim, publish the DNS TXT challenge at _workload-directory.<domain>, run the check, and keep domain control fresh with the 90-day recheck.
A claim is your organization's request to be recorded as the operator of one exact domain. Domain control is the first of the three checks; the claim then waits for identity and authority review.
Domain not listed yet?
You can add an exact name before claiming it. The directory adds it only if it resolves in public DNS and serves a certificate from a publicly trusted CA.
File a claim
From the console, choose Claim a domain on your organization's page, or start from the domain's public record. Through the API:
curl https://svid.io/v1/claims \
-X POST \
-H "Content-Type: application/json" \
-H "Origin: https://svid.io" \
-H "Cookie: __Host-art_session=<session>" \
-H "x-art-csrf: <csrf_token>" \
-H "Idempotency-Key: claim-payments-example-com-1" \
-d '{"organization_id":"org_7k3m9q2x8d5f1h4j6n0p2r4t8v","domain":"payments.example.com"}'
An owner or domain administrator can file a claim, with a session or a service token. A domain the directory does not know yet is added as unclaimed. Limits: one open claim per organization per domain (409), and at most 10 new claims per organization in a rolling hour (429).
The claim covers the name you challenge and nothing else. Control of payments.example.com says nothing about example.com, and a subdomain of someone else's verified domain needs a delegation from them.
Publish the TXT record
The response carries the first DNS challenge:
{
"dns_name": "_workload-directory.payments.example.com",
"record_type": "TXT",
"value": "art-verify=<token>",
"expires_at": "2026-10-06T12:00:00.000Z",
"max_attempts": 5
}
Add a TXT record at dns_name whose content is exactly value. Copy it now: the value is shown once, and an idempotent replay of the request returns value: null with value_redacted: true. The directory stores only a hash of the token.
- Publish at that exact name, not through an alias. An answer reached through a CNAME or DNAME never counts, and the check fails with
cname_not_allowed. If_workload-directory.<domain>is an alias today, remove the alias and add the TXT record directly. - Both resolvers must see it. The check queries Cloudflare (
cloudflare-dns.com) and Google (dns.google) public DNS over HTTPS. If either does not return the record yet, the result istxt_not_foundwith the resolver's name. Wait for your DNS TTL and try again. - A challenge is valid for 24 hours and allows 5 checks.
Run the check
curl https://svid.io/v1/claims/<claim id>/verify -X POST \
-H "Origin: https://svid.io" -H "Cookie: __Host-art_session=<session>" -H "x-art-csrf: <csrf_token>" \
-H "Idempotency-Key: verify-1" -H "Content-Type: application/json" -d '{}'
The answer is 202 with a job; poll GET /v1/jobs/<job id> until it finishes. The console does this for you. While a check of the same attempt is queued or running, the same job is returned.
The challenge is bound to the account that requested it, the organization, the domain and the claim. Another member of your organization cannot finish your challenge (wrong_account), and calling verify with no live challenge of your own answers 422 semantic_check_failed.
If the value is lost, the challenge expired or its attempts ran out, issue a new one with POST /v1/claims/{id}/challenges. Each claim gets at most 5 challenges in total. When the last one fails and nothing else is live, the claim expires.
When the record matches at both resolvers, the challenge is consumed, dns_challenge evidence is recorded and the claim moves to pending_identity. Continue with evidence and review.
Claim states
| State | Meaning |
|---|---|
pending_domain |
Waiting for the DNS challenge |
pending_identity |
Waiting for organization identity review |
pending_authority |
Waiting for representative authority review |
verified |
All three checks passed |
needs_information |
A reviewer asked for more evidence |
rejected |
A reviewer rejected the claim; it can be appealed |
disputed |
Competing claims or an appeal are under review |
suspended |
Domain control lapsed, the authority expired, or a reviewer suspended it |
expired, withdrawn |
Terminal |
Competing claims on the same domain are sent to review; they are never decided by whoever proved DNS first.
Keep domain control fresh: the 90-day recheck
A verified claim must prove domain control again every 90 days. The recheck does not disturb a verified organization:
- 76 days after domain control was last proven, the directory issues a recheck challenge valid for 14 days. Nothing changes in the meantime.
- An owner or domain administrator reveals it with
POST /v1/claims/{id}/recheck-challenge(the console shows it on the claim page). Each reveal rotates the token, so the previous value stops working, and the value is bound to the person who revealed it. Reveals are limited per person and per claim within the 14-day window. - Publish the new value at the same
_workload-directory.<domain>name and callPOST /v1/claims/{id}/verifyas before.
If 90 days pass without a passed recheck, the claim becomes suspended and the issuers it backs stop resolving. Passing the recheck restores it, as long as the identity and authority evidence have not expired. A binding left suspended for more than 30 days is withdrawn for good; see suspension.
Withdraw or appeal
- Withdraw:
POST /v1/claims/{id}/withdrawwithexpected_version. Owner only, with step-up. It is terminal, and a verified claim's issuer bindings stop resolving in the same commit. - Appeal: a
rejectedclaim can be appealed by an owner with step-up (POST /v1/claims/{id}/appeal), at most 3 times. It moves todisputedfor a reviewer. Appealing does not bring back bindings that were withdrawn.