Schemas
Error
errorStable machine-readable error code (e.g. invalid_domain, insufficient_credits, not_yet_researched).
messageHuman-readable description of what went wrong.
CreateResearchJobRequest
domainsBetween 1 and 100 unique domains.
labelOptional human-readable label shown in the dashboard, completion email, and activity feed.
ResearchJob
idstatusmode'full' (POST /v1/research-jobs) runs the full multi-model appraisal on every domain at 10 credits each. 'quick' (POST /v1/research-jobs/quick) routes each name through a fast first-pass that decides whether the full appraisal is worth it: names judged worthy run the full appraisal (10 credits each); the rest get a quick-read pricing estimate (1 credit each). Credits are reserved at the worst case (10 per name) and the running total settles down as quick reads come back.
submitted_atdomains_totallabelcompleted_atdomains_completeddomains_failedcredits_chargedSum of per-domain charges so far. For quick-mode jobs this number settles down as each name's decision lands - quick reads keep 1 credit, full reads keep 10.
credits_refundedPer-domain status for this job.
DomainReport
schema_versionBumps on breaking changes; additive changes keep 1.0.
exported_atstatuscomplete = premium probes ran; partial = free-tier signals only.
Deterministic features computed from the domain string. Always present (no compute required).
Most recent verdict (any intent). Markdown allowed in paragraph and alternative_suggestion.
Tiered pricing band for a domain. Returned by /v1/domains/{domain}/pricing as a slice; embedded in DomainReport for full report calls. Free text in reasoning, key_factors, and risks is capped at 4 KB per field.
LLM-derived signals. Each sub-block carries its own engine_version and computed_at; sub-blocks are omitted when absent.
Probes from non-frontier (free-tier) models. Cheaper, less weight-bearing — kept separate from frontier_recall.
Alternative names suggested by the recommendations engine. Present only when a recommendations run was triggered.
DNS-signature detection of for-sale or parked status. Cached domain-level for ~1h.
Pricing
confidencemodelIdentifier of the pricing model that produced this row.
engine_versionPricing prompt version. Bumps invalidate cached rows.
computed_atreasoningMarkdown. Market-expert prose explaining the band.
key_factorsUp to 5 reasons the band lands where it does.
risksUp to 5 risks that bound the upside.
Snapshot of the signal vector that fed the pricing model. Useful for auditing.
PriceBand
lowmidhighJobDomainStatus
Per-domain lifecycle inside a research job. pending = waiting to start; running = appraisal in progress; paid = finished successfully and the credits for this name were committed (1 credit for a quick read, 10 credits for a full read); cached = your organization already had a finished report for this name at submission time, so no new appraisal ran and no credits were charged for it; failed = the appraisal couldn't finish and the credits reserved for this name were returned to your wallet.
JobReportEntry
domainjob_statusPer-domain lifecycle inside a research job. pending = waiting to start; running = appraisal in progress; paid = finished successfully and the credits for this name were committed (1 credit for a quick read, 10 credits for a full read); cached = your organization already had a finished report for this name at submission time, so no new appraisal ran and no credits were charged for it; failed = the appraisal couldn't finish and the credits reserved for this name were returned to your wallet.
Comprehensive research report for a single domain. Returned by /v1/report/{domain} and /v1/research-jobs/{id}/report/{domain}. Null-valued keys are OMITTED from the response (a missing key means the underlying signal has not been computed for this domain). Free text fields are capped at 4 KB. verdict is the most recent verdict regardless of which intent it was computed for; customers who need a different intent should re-run research with that intent.
errorStable, machine-readable code for why this name's appraisal couldn't finish. Examples: concurrent_run_winner, fast_fail_pricing, model_timeout. The same codes appear elsewhere in the API; safe to branch on.
JobPricingEntry
domainjob_statusPer-domain lifecycle inside a research job. pending = waiting to start; running = appraisal in progress; paid = finished successfully and the credits for this name were committed (1 credit for a quick read, 10 credits for a full read); cached = your organization already had a finished report for this name at submission time, so no new appraisal ran and no credits were charged for it; failed = the appraisal couldn't finish and the credits reserved for this name were returned to your wallet.
Tiered pricing band for a domain. Returned by /v1/domains/{domain}/pricing as a slice; embedded in DomainReport for full report calls. Free text in reasoning, key_factors, and risks is capped at 4 KB per field.
errorJobReportsResponse
JobPricingResponse
StatsMeta
attributionThe sources of this response, to be shown with it.
as_ofThe newest month (YYYY-MM) or date (YYYY-MM-DD) in the response. Absent when the response holds none.
updated_atWhen the data in this response last changed: the monthly statistics' last update, or the round data's newest change. Absent on zone series.
StatsError
errorStable machine-readable code: invalid_parameter, invalid_cursor, not_found, tld_not_found, registry_not_found, registrar_not_found, group_not_found, application_not_found, applicant_not_found, string_not_found, round_not_found, unauthorized, rate_limited.
messageA sentence a person can act on.
request_idAlso in the X-Request-Id header; quote it when asking for help.
StatsBounds
firstThe oldest point that exists (YYYY-MM, or YYYY-MM-DD for zone nights).
lastThe newest point that exists.
StatsRef
idnameStatsDomains
period^[0-9]{4}-(0[1-9]|1[… · requiredcountDomains under management that month.
changeAgainst the month before.
change_yearAgainst the same month a year before. Absent on an estimated figure.
estimatedPresent (and true) only when the figure is from the registry operator's own report rather than its ICANN monthly registry report.
TldPhase
phasestartendAbsent for a phase with no end date (general availability).
TldZone
datecountNames in the zone that night.
for_saleNames whose nameservers are a marketplace's; present when the night was classified.
parkedNames on a parking service; present when the night was classified.
Tld
tldThe A-label, lower case. Also the id.
kindurlIts page on namedesk.app.
unicodeIDN only: the native-script form.
categorydelegatedRoot-zone delegation date, at the precision known: YYYY-MM-DD, or YYYY-MM or YYYY for a few old TLDs.
removedDate removed from the root, same precision rule. Absent for a live TLD.
The operator today.
On the single TLD only.
The newest month from an ICANN monthly report or the registry's own report, else the newest archived copy of one. Absent when no such figure exists.
The newest night of the TLD's zone file. May be withdrawn if the registry revokes zone access.
On the top-level object of a response only.
TldMonth
period^[0-9]{4}-(0[1-9]|1[… · requireddomainschangechange_yearaddsrenewsdeletestransfers_intransfers_outrestoresregistrarsHow many registrars held names in the TLD that month. Absent where there is no registrar breakdown (ccTLDs).
estimatedThe figure is not from an ICANN monthly report; such a month carries only domains and change.
TldRegistrar
A reference to a registry or registrar; the full object is at its own endpoint.
domainsshare_pctPercent of the TLD's domains that month, two decimals.
addsrenewsdeletestransfers_intransfers_outZoneDay
datedomainsNames in the zone that night.
enteredNames that appeared since the night before. Absent on the first night and after a gap.
leftNames that dropped out since the night before. Absent on the first night and after a gap.
for_saleparkedRegistry
idOur id, stable for v1.
nameThe operator's brand when no other operator uses it (for example, GoDaddy Registry); otherwise the name ICANN lists.
tldsTLDs it runs today.
urllegal_nameThe name ICANN lists for the operator (for example, Registry Services, LLC). Present only when name holds the brand.
groupThe owner, when two or more operators share one (see /v1/stats/groups/{slug}).
Summed over the TLDs it runs today, for the newest ICANN-report month. Absent when none of them has a figure that month.
On a single operator (/v1/stats/registries/{id}), when there is one: the applicant companies in the 2026 round that a public source ties to this operator, from the round record (the 2026 round endpoints' source), not the registry reports.
On the top-level object of a response only.
RegistryApplicant
namerelationsame-company: the operator is this company (the same legal entity, or wholly owned within one group). shared-ownership: one owns part of the other, or they have an owner in common. shared-people: a person in common. shared-address: a registered address in common, and nothing more.
urlThe company's page on namedesk.app, which quotes the source.
RegistryTld
tldsince^[0-9]{4}-(0[1-9]|1[… · requiredThe month it took the TLD over.
The TLD's newest reported figure, as on Tld.domains (without change_year). Absent when no such figure exists.
RegistryMonth
period^[0-9]{4}-(0[1-9]|1[… · requireddomainstldsaddsdeletesRegistrar
idOur id: equal to the IANA registrar id.
iana_idnametldsTLDs it held names in that month.
A stock figure as of a month.
urlgroupThe owner (see /v1/stats/groups/{slug}).
On the top-level object of a response only.
RegistrarMonth
period^[0-9]{4}-(0[1-9]|1[… · requireddomainstldschangeaddsdeletesRegistrarTld
tlddomainschangechange_yearaddsshare_pctPercent of the TLD's domains, two decimals.
StatsGroup
slugnameurlOne kind of a group's members, and their stock.
One kind of a group's members, and their stock.
On the top-level object of a response only.
StatsGroupMembers
Its members summed, as of the newest registry-report month.
StatsPhase
tldphasestartendStatsPeriod
period^[0-9]{4}-(0[1-9]|1[… · requiredStatsSummary
period^[0-9]{4}-(0[1-9]|1[… · requiredtldsTLDs with a figure that month.
domainsTheir domains summed.
registrarsRegistrars with names under management that month.
registriesRegistry operators with names under management that month.
urlThe newest zone night: the TLDs in it and their names.
On the top-level object of a response only.
RoundApplicationRef
id^[0-9a-f]{8}-[0-9a-f… · requiredstringRoundApplicantRef
id^[0-9a-f]{8}-[0-9a-f… · requirednamelegal_nameThe legal entity's name as ICANN lists it. Absent for a party not on ICANN's list.
RoundSwitch
id^[0-9a-f]{8}-[0-9a-f… · requiredstringdateThe day of the switch.
RoundApplication
id^[0-9a-f]{8}-[0-9a-f… · requiredOur id, stable for v1.
roundstringThe string applied for, its A-label.
statusWhere the application stands. catalogued and rumored are reserved and not used. announced: the applicant has said it applied. confirmed: on ICANN's published list. ghost: abandoned: announced, but not on ICANN's list under that applicant. retracted: the announcement was taken back. withdrawn: withdrawn after applying. in-contention: confirmed, and competing with other applications for the same string. auction-lost: lost the contention set at auction. will-not-proceed: ICANN will not move the application forward. delegated: added to the root zone. sunrise: in its sunrise period. launched: open for general registration. terminated: the registry agreement ended. replacement: named on ICANN's list as the replacement string of another of the applicant's applications. variant: an IDN variant label of another of the applicant's applications. switched: was applied for; the applicant moved the application to its replacement string. deactivated: named as a replacement (backup) string of another of the applicant's applications, shown on ICANN's list as deactivated, because another applicant applied for the same string or named it as a backup. Only an application live on ICANN's list counts as an application: confirmed, in-contention, delegated, sunrise, launched.
contentionHow many applicants are pursuing the string: those with an application live on ICANN's list (confirmed, in-contention, delegated, sunrise, launched).
The announcement or list where the application first appeared.
Absent when the applicant is not known.
announcedThe day the applicant announced it applied.
summaryicann_application_idICANN's application id, once ICANN has published it.
contention_setICANN's id for the set of applications competing for the same string.
icann_typesICANN's TLD types for the application, from ICANN's published list. An empty list is a generic (standard) application. variant-only is an application by the operator of an existing TLD to add an IDN variant label of it: the application is on the existing TLD and names the new label in variants. Absent when the row was not taken from ICANN's list.
On a replacement, deactivated or variant: the application it belongs to.
The application's replacement string, while it is unused.
The application's replacement string that ICANN's list shows as deactivated.
The application's IDN variant labels.
On a switched application: the replacement string it moved to.
On the application a switch moved to: the string it moved from.
urlThe string's page on namedesk.app. Absent for the few strings without a page.
On the top-level object of a response only.
RoundString
stringThe A-label.
roundstatusThe furthest stage any of its applications has reached.
applicationsApplications for this string. Only an application live on ICANN's list counts as an application: confirmed, in-contention, delegated, sunrise, launched.
contentionHow many applicants are pursuing it. Two or more means contested.
first_seenThe day namedesk first listed the string.
Each applicant on the string and its role: one entry per applicant and role, so an applicant that applies for the string and names it as a backup is listed twice.
unicodeIDN only: the native-script form.
categoryThe AI assessment's leading category once the string is assessed. Absent when not known.
scoreThe AI assessment's score, 1 to 100 on one fixed scale; .com is scored on it like every other TLD. Absent until the string is assessed; https://namedesk.app/tlds/methodology explains it.
verdictThe assessment's one-sentence verdict. Absent until the string is assessed.
Only on the single-string read: the AI's comparables from the 2012 round, closest first. Absent when the string has none.
urlThe string's page on namedesk.app. Absent for the few strings without a page.
On the top-level object of a response only.
RoundComp
rank1 is the closest comparable.
stringclosenesswhyWhy it is a comparable, in the AI's words.
applicationsHow many applied for it in 2012.
delegatedIt reached the root.
retiredIt reached the root and has since left it.
unicodeIDN only: the native-script form.
winnerThe applicant that won it, when one did.
delegation_dateoperatorIts registry operator today, when it is a TLD.
Names under management in the latest month reported. Absent when it never reached the root or reports nothing.
urlIts page on namedesk.app, when it is a TLD.
RoundApplicant
id^[0-9a-f]{8}-[0-9a-f… · requiredOur id for the company, stable for v1. It can be the same as one of its legal entities' ids; /v1/stats/applicants/{id} also takes the id of any of its legal entities.
nameThe company.
applicationsIts applications in the round, over all its legal entities. Only an application live on ICANN's list counts as an application: confirmed, in-contention, delegated, sunrise, launched.
The legal entities the company applied through, most applications first.
websiteThe company's website, when known.
The registry operators that are the same company as the applicant or are tied to it, each backed by a public source quoted on its page on namedesk.app. Absent when there is none. A tie says who the applicant is, not who will run its new TLDs.
urlThe company's page on namedesk.app, with every legal entity it applies through and why they are one company. The address stays the same when the company is renamed.
On the top-level object of a response only.
RoundChange
atWhen namedesk made the change.
stringchangerecorded: a new application was listed. status_changed: its status moved. corrected: a fact was corrected or removed on request. noted: a note was added.
Who filed an application. id is the legal entity that filed it, not the company. name is the company that entity belongs to, which several legal entities can share; legal_name is the entity's own name. Send id to /v1/stats/applicants/{id} to get the company.
statusOn status_changed: the new status.
The announcement or list behind the change, when there is one.
noteThe text the changelog shows with the change: why a status moved, what was corrected, or the note itself. Absent when there is none.
RoundMilestone
milestonestart^[0-9]{4}-[0-9]{2}-[…end^[0-9]{4}-[0-9]{2}-[…When it closes: the closing moment for a timestamp, the last day for a date.
whenHow ICANN describes a milestone it has not dated yet.
Round
roundphaseWhere the round is on ICANN's calendar, switching at the instants ICANN gives. before_reveal: ICANN has not published the applied-for strings. revealed: they are out, and the replacement period has not opened. replacement_period: applicants may switch to their replacement string. awaiting_confirmation: switching has closed. objections: the final list is out and objections are open. evaluation: objections have closed.
revealedTrue once ICANN's published list is in the API.
urlOn the top-level object of a response only.