# Stats API

Domain industry statistics as JSON: TLDs, registry operators and registrars month by month, plus nightly zone counts. Also the 2026 new gTLD round: who applied for which strings. Free, no key required.

```bash
curl https://api.namedesk.app/v1/stats/tlds/xyz
```

```json
{
  "tld": "xyz",
  "kind": "new-gtld",
  "category": "other",
  "delegated": "2014-02-19",
  "registry": { "id": 69, "name": "XYZ.COM LLC" },
  "phases": [
    { "phase": "sunrise", "start": "2014-03-20", "end": "2014-05-20" },
    { "phase": "landrush", "start": "2014-05-20", "end": "2014-06-01" },
    { "phase": "claims", "start": "2014-06-02", "end": "2014-09-02" },
    { "phase": "general_availability", "start": "2014-06-02" }
  ],
  "domains": { "period": "2026-05", "count": 8557020, "change": -121996, "change_year": 3571471 },
  "zone": { "date": "2026-10-01", "count": 10226440, "for_sale": 5413297, "parked": 917336 },
  "url": "https://namedesk.app/stats/tlds/xyz",
  "meta": {
    "as_of": "2026-10-01",
    "updated_at": "2026-10-02T02:04:55Z",
    "attribution": "Registry statistics from ICANN monthly registry reports and registry operators' own reports. Launch periods from ICANN's TLD startup pages and the Trademark Clearinghouse calendar. Zone counts from ICANN CZDS zone files."
  }
}
```

Each TLD, registry operator, registrar, group, string and application carries `url`, its page on namedesk.app. Every response carries `meta` with `attribution`, the sources to credit. A response that holds a dated figure also carries `as_of`, the newest month or date in it. `updated_at` says when the data last changed: the statistics' last update, or the 2026 round's newest change. Zone series carry no `updated_at`, and the round's responses no `as_of`.

## Endpoints

| Path | Returns |
|---|---|
| `/v1/stats/summary` | Totals for the newest month, by TLD kind, and the newest zone night |
| `/v1/stats/periods` | Every month the registry reports cover |
| `/v1/stats/tlds` | Every TLD with a reported figure; filter by `kind`, `category`, `registry`, `q`; sort by `domains`, `change`, `adds`, `name` |
| `/v1/stats/tlds/{tld}` | One TLD with its launch phases, newest figure and newest zone night |
| `/v1/stats/tlds/{tld}/months` | Monthly figures: domains, change, adds, renewals, deletes, transfers, restores, registrars |
| `/v1/stats/tlds/{tld}/registrars` | Each registrar's share for one month. ccTLDs have no registrar breakdown |
| `/v1/stats/tlds/{tld}/zone` | Nightly zone counts: names in the zone, entered and left, for sale, parked |
| `/v1/stats/registries` | Every registry operator running a TLD today |
| `/v1/stats/registries/{id}` | One operator; `/tlds` for the TLDs it runs, `/months` for its monthly total |
| `/v1/stats/registrars` | Every accredited registrar with names under management |
| `/v1/stats/registrars/{id}` | One registrar, by IANA id (`146` or `iana:146`); `/months`, `/tlds` |
| `/v1/stats/groups/{slug}` | The registrars or operators under one owner: `godaddy`, `identity-digital` |
| `/v1/stats/phases` | Launch phases across TLDs; `?phase=general_availability&from=2024-01&to=2024-12` lists every TLD that opened in 2024 |

### Applications and strings

The 2026 new gTLD round, from applicants' public announcements and ICANN's published lists.

| Path | Returns |
|---|---|
| `/v1/stats/round/2026` | ICANN's calendar for the round, where the round stands on it, and how many applications, strings applied for, applicants, companies and contention sets it has, plus the parties whose every claim was abandoned |
| `/v1/stats/applications` | Every application; filter by `string`, `applicant`, `status`, `category`; sort by `announced`, `string`, `contention` |
| `/v1/stats/applications/{id}` | One application, with its replacement string, IDN variants or switch |
| `/v1/stats/strings` | Strings in the round, with the AI score and verdict once a string is assessed; `role` picks which: `applied`, `backup`, `deactivated`, `abandoned` (default `applied,backup`); filter by `status`, `category`, `contested=true`; sort by `score`, `contention`, `string`, `first_seen` |
| `/v1/stats/strings/{string}` | One string and everyone on it |
| `/v1/stats/applicants` | Every applicant with at least one application, one per legal entity; `abandoned=true` lists instead the parties whose every claim was abandoned. `/applicants/{id}` for one applicant or party, `/applicants/{id}/applications` for its applications |
| `/v1/stats/changes` | Every change, oldest first: a new application, a status change, a correction or a note |

`/v1/stats/applications` lists one item per ICANN application, plus each claim an applicant announced that ICANN's list does not hold. An application's replacement (backup) string and IDN variant labels are listed as applications of their own, with status `replacement` or `variant`. They name the application they belong to in `primary`, and the application names them in `replacement` and `variants`. An applicant can name the same backup string in several of its applications, so a backup string has one entry per application that names it. A backup string ICANN does not allow, because another applicant applied for the same string or named it as a backup, reads `deactivated`; it names its application in `primary`, and the application names it in `deactivated_replacement`. When an applicant switches to its replacement string in the replacement period, the old application reads `switched` and carries `switched_to`; the new one carries `switched_from`. An announced claim that is not on ICANN's list reads `ghost` (role `abandoned`).

Only an application live on ICANN's list counts toward `applications`, `applicants` and `contention`: status `confirmed`, `in-contention`, `delegated`, `sunrise` or `launched`. Nothing else counts: not a replacement, deactivated, variant, switched or abandoned entry, not a claim ICANN's list does not hold, and not an application that was withdrawn or ended another way.

Strings that are already TLDs are not part of the round, except where ICANN lists an application to add an IDN variant label to an existing TLD (`icann_types` includes `variant-only`). That application counts, under the existing TLD, as ICANN lists it, and names the new label in `variants`.

A string is in a role when at least one application puts it there, so one string can be in several. `applied`: applied for, with an application live on ICANN's list, including an IDN variant label of an application. `backup`: named as an application's replacement string. `deactivated`: named as a backup string that ICANN's list shows as deactivated. `abandoned`: announced, but not on ICANN's list.

On a string, each applicant is listed once for each `role` it has there: `applying` (an application live on ICANN's list), `replacement`, `variant`, `switched`, `deactivated`, `abandoned`, `unconfirmed` (said or reported to have applied, not on ICANN's list) or `ended` (applied, and the application ended).

An applicant is the legal entity that applied. Its `name` is the company it belongs to, so several applicants can share one, and `legal_name` is the entity's name as ICANN lists it. A party that is not on ICANN's list has no `legal_name`. The round's `counts.companies` counts each company once. An applicant's `url` is the company's page on namedesk.app. The score and verdict are our AI assessment; the [methodology](https://namedesk.app/tlds/methodology) explains them.

Every parameter and field is in the [API reference](/api). A stats-only OpenAPI document is at https://namedesk.app/openapi-stats.json, for connectors and tools that take a spec URL.

## Figures

`domains.count`, or `domains` in a monthly series, is the number of registered names at the end of the month. A figure carries `estimated: true` when it comes from a registry operator's own report rather than its monthly report to ICANN. A TLD with no reported figure has no `domains` field.

Registry reports arrive about four months after the month they describe. Zone counts are from the previous night.

## Rate limits

120 requests a minute per address without a key, 600 with one. A `429` carries `Retry-After` in seconds. Responses carry `Cache-Control: max-age=3600` and an `ETag`; send `If-None-Match` to get a `304`. `/v1/stats/round/2026` is cached for less when its phase changes sooner, so it never shows a phase past its end.

## Sources and terms

Registry statistics come from the registries' monthly reports to ICANN and from registry operators' own reports. Launch periods come from ICANN's TLD startup pages and the Trademark Clearinghouse calendar. Zone counts come from ICANN CZDS zone files. 2026 round data comes from applicants' public announcements and ICANN's published lists. Credit the sources in `meta.attribution` wherever you show the numbers.

Registry and zone statistics are counts and totals only. The API never lists domain names. You may use the statistics in your own products and publications, including commercially, if you credit the sources. You may not resell them as a dataset or use them to run a competing statistics service. Zone counts depend on access the registries grant and can be withdrawn. The [Terms of Service](https://namedesk.app/terms) have the full wording.

The Stats API is in beta and free. Any change to that is announced on the [changelog](https://namedesk.app/changelog) first.
