{
  "openapi": "3.1.0",
  "info": {
    "title": "Namedesk Stats API",
    "summary": "Programmatic access to Namedesk research, pricing, and signals.",
    "description": "Domain industry statistics as JSON: TLDs, registry operators and registrars month by month, launch phases and nightly zone counts, and the 2026 new gTLD round: applications, strings, applicants and ICANN's calendar. Free, no key required. Docs: https://namedesk.app/docs/stats",
    "version": "1.0.0",
    "contact": {
      "name": "Namedesk support",
      "email": "hello@namedesk.app",
      "url": "https://namedesk.app/faqs"
    },
    "termsOfService": "https://namedesk.app/privacy",
    "license": {
      "name": "Proprietary"
    }
  },
  "servers": [
    {
      "url": "https://api.namedesk.app",
      "description": "Production"
    }
  ],
  "externalDocs": {
    "description": "Full API documentation",
    "url": "https://namedesk.app/docs/api"
  },
  "paths": {
    "/v1/stats/summary": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Stats summary",
        "description": "TLDs, domains, registrars and registry operators with a figure in one month, by kind, and the newest zone night.",
        "operationId": "getStatsSummary",
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/StatsPeriod"
          }
        ],
        "responses": {
          "200": {
            "description": "The summary.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StatsSummary"
                },
                "example": {
                  "period": "2026-05",
                  "tlds": 6,
                  "domains": 2653610,
                  "registrars": 2,
                  "registries": 6,
                  "kinds": [
                    {
                      "kind": "new-gtld",
                      "tlds": 5,
                      "domains": 1953010
                    },
                    {
                      "kind": "idn-cctld",
                      "tlds": 1,
                      "domains": 700600
                    }
                  ],
                  "zone": {
                    "date": "2026-09-18",
                    "tlds": 3,
                    "domains": 3539000
                  },
                  "url": "https://namedesk.app/stats",
                  "meta": {
                    "as_of": "2026-09-18",
                    "updated_at": "2026-09-28T03:40:00Z",
                    "attribution": "Registry statistics from ICANN monthly registry reports and registry operators' own reports. Zone counts from ICANN CZDS zone files."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          }
        }
      }
    },
    "/v1/stats/periods": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Months covered",
        "description": "Every month the registry reports cover, oldest first. Some months are missing.",
        "operationId": "listStatsPeriods",
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/StatsLimit"
          },
          {
            "$ref": "#/components/parameters/StatsCursor"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of months.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StatsPeriod"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Null on the last page."
                    },
                    "query": {
                      "type": "object",
                      "description": "The parameters as resolved: defaults filled in, bounds clamped.",
                      "properties": {
                        "limit": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "limit"
                      ],
                      "additionalProperties": false
                    },
                    "bounds": {
                      "$ref": "#/components/schemas/StatsBounds"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/StatsMeta"
                    }
                  },
                  "required": [
                    "items",
                    "next_cursor",
                    "query",
                    "meta"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "items": [
                    {
                      "period": "2024-01"
                    },
                    {
                      "period": "2024-02"
                    }
                  ],
                  "next_cursor": "eyJrIjoiL3YxL3N0YXRzL3BlcmlvZHM_e30iLCJhdCI6IjIwMjQtMDIifQ",
                  "query": {
                    "limit": 2
                  },
                  "bounds": {
                    "first": "2024-01",
                    "last": "2026-05"
                  },
                  "meta": {
                    "as_of": "2024-02",
                    "updated_at": "2026-09-28T03:40:00Z",
                    "attribution": "Registry statistics from ICANN monthly registry reports and registry operators' own reports."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          }
        }
      }
    },
    "/v1/stats/tlds": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "List TLDs",
        "description": "Every TLD with a reported figure, at its newest month. `domains.estimated` marks a figure from the registry's own report. Sorted by `domains`; ties by TLD.",
        "operationId": "listStatsTlds",
        "security": [],
        "parameters": [
          {
            "name": "sort",
            "in": "query",
            "description": "Sorts on each TLD's newest month. Estimated figures have no `adds` and sort last.",
            "schema": {
              "type": "string",
              "enum": [
                "domains",
                "change",
                "adds",
                "name"
              ],
              "default": "domains"
            }
          },
          {
            "name": "order",
            "in": "query",
            "description": "Defaults to `desc`, or `asc` when sorting by `name`.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ]
            }
          },
          {
            "name": "kind",
            "in": "query",
            "description": "One or more, comma-joined.",
            "schema": {
              "type": "string",
              "example": "cctld,idn-cctld"
            }
          },
          {
            "name": "category",
            "in": "query",
            "description": "One or more, comma-joined: brand, commerce, culture, ai-tech, geo, infra, other.",
            "schema": {
              "type": "string",
              "example": "geo"
            }
          },
          {
            "name": "registry",
            "in": "query",
            "description": "Registry operator ids, comma-joined (up to 50).",
            "schema": {
              "type": "string",
              "example": "69"
            }
          },
          {
            "$ref": "#/components/parameters/StatsQ"
          },
          {
            "$ref": "#/components/parameters/StatsLimit"
          },
          {
            "$ref": "#/components/parameters/StatsCursor"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of TLDs.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Tld"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Null on the last page."
                    },
                    "total": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Items across all pages."
                    },
                    "query": {
                      "type": "object",
                      "description": "The parameters as resolved: defaults filled in, bounds clamped.",
                      "properties": {
                        "sort": {
                          "type": "string",
                          "enum": [
                            "domains",
                            "change",
                            "adds",
                            "name"
                          ]
                        },
                        "order": {
                          "type": "string",
                          "enum": [
                            "asc",
                            "desc"
                          ]
                        },
                        "kind": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "enum": [
                              "cctld",
                              "idn-cctld",
                              "legacy-gtld",
                              "new-gtld",
                              "sponsored",
                              "infra",
                              "unknown"
                            ]
                          }
                        },
                        "category": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "enum": [
                              "brand",
                              "commerce",
                              "culture",
                              "ai-tech",
                              "geo",
                              "infra",
                              "other"
                            ]
                          }
                        },
                        "registry": {
                          "type": "array",
                          "items": {
                            "type": "integer"
                          }
                        },
                        "q": {
                          "type": "string"
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "sort",
                        "order",
                        "limit"
                      ],
                      "additionalProperties": false
                    },
                    "meta": {
                      "$ref": "#/components/schemas/StatsMeta"
                    }
                  },
                  "required": [
                    "items",
                    "next_cursor",
                    "total",
                    "query",
                    "meta"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "items": [
                    {
                      "tld": "xyz",
                      "kind": "new-gtld",
                      "category": "other",
                      "delegated": "2014-02-19",
                      "registry": {
                        "id": 1,
                        "name": "XYZ.COM LLC"
                      },
                      "domains": {
                        "period": "2026-05",
                        "count": 1280000,
                        "change": 10000,
                        "change_year": 120000
                      },
                      "zone": {
                        "date": "2026-09-18",
                        "count": 1039000,
                        "for_sale": 400039,
                        "parked": 100000
                      },
                      "url": "https://namedesk.app/stats/tlds/xyz"
                    },
                    {
                      "tld": "xn--p1ai",
                      "unicode": "\u0440\u0444",
                      "kind": "idn-cctld",
                      "delegated": "2010-05-12",
                      "registry": {
                        "id": 8,
                        "name": "Coordination Center for TLD RU"
                      },
                      "domains": {
                        "period": "2026-05",
                        "count": 700600,
                        "change": 100,
                        "estimated": true
                      },
                      "url": "https://namedesk.app/stats/tlds/xn--p1ai"
                    }
                  ],
                  "next_cursor": "eyJrIjoiL3YxL3N0YXRzL3RsZHM_e1wic29ydFwiOlwiZG9tYWluc1wiLFwib3JkZXJcIjpcImRlc2NcIn0iLCJ2Ijo3MDA2MDAsInRsZCI6InhuLS1wMWFpIn0",
                  "total": 12,
                  "query": {
                    "sort": "domains",
                    "order": "desc",
                    "limit": 2
                  },
                  "meta": {
                    "as_of": "2026-09-18",
                    "updated_at": "2026-09-28T03:40:00Z",
                    "attribution": "Registry statistics from ICANN monthly registry reports and registry operators' own reports. Zone counts from ICANN CZDS zone files."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          }
        }
      }
    },
    "/v1/stats/tlds/{tld}": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Get a TLD",
        "description": "One TLD, with its launch phases.",
        "operationId": "getStatsTld",
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/StatsTld"
          }
        ],
        "responses": {
          "200": {
            "description": "The TLD.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Tld"
                },
                "example": {
                  "tld": "mono",
                  "kind": "new-gtld",
                  "category": "commerce",
                  "delegated": "2015-03-01",
                  "registry": {
                    "id": 6,
                    "name": "XYZ Two LLC"
                  },
                  "phases": [
                    {
                      "phase": "sunrise",
                      "start": "2015-04-01",
                      "end": "2015-05-01"
                    },
                    {
                      "phase": "landrush",
                      "start": "2015-05-02",
                      "end": "2015-05-30"
                    },
                    {
                      "phase": "claims",
                      "start": "2015-06-01",
                      "end": "2015-08-30"
                    },
                    {
                      "phase": "general_availability",
                      "start": "2015-06-01"
                    },
                    {
                      "phase": "qualified_launch"
                    }
                  ],
                  "domains": {
                    "period": "2026-05",
                    "count": 32000,
                    "change": 500,
                    "change_year": 6000
                  },
                  "url": "https://namedesk.app/stats/tlds/mono",
                  "meta": {
                    "as_of": "2026-05",
                    "updated_at": "2026-09-28T03:40:00Z",
                    "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."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          },
          "404": {
            "$ref": "#/components/responses/StatsNotFound"
          }
        }
      }
    },
    "/v1/stats/tlds/{tld}/months": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "A TLD's months",
        "description": "Monthly figures, oldest first.",
        "operationId": "listStatsTldMonths",
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/StatsTld"
          },
          {
            "$ref": "#/components/parameters/StatsFrom"
          },
          {
            "$ref": "#/components/parameters/StatsTo"
          },
          {
            "$ref": "#/components/parameters/StatsRange"
          },
          {
            "$ref": "#/components/parameters/StatsLimit"
          },
          {
            "$ref": "#/components/parameters/StatsCursor"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of months.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TldMonth"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Null on the last page."
                    },
                    "query": {
                      "type": "object",
                      "description": "The parameters as resolved: defaults filled in, bounds clamped.",
                      "properties": {
                        "from": {
                          "type": "string",
                          "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
                          "example": "2026-05"
                        },
                        "to": {
                          "type": "string",
                          "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
                          "example": "2026-05"
                        },
                        "range": {
                          "type": "string",
                          "enum": [
                            "1y",
                            "3y",
                            "5y",
                            "10y",
                            "all"
                          ]
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "range",
                        "limit"
                      ],
                      "additionalProperties": false
                    },
                    "bounds": {
                      "$ref": "#/components/schemas/StatsBounds"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/StatsMeta"
                    }
                  },
                  "required": [
                    "items",
                    "next_cursor",
                    "query",
                    "meta"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "items": [
                    {
                      "period": "2025-06",
                      "domains": 26500,
                      "change": 500,
                      "change_year": 6000,
                      "adds": 900,
                      "renews": 400,
                      "deletes": 400,
                      "transfers_in": 30,
                      "transfers_out": 20,
                      "restores": 5,
                      "registrars": 2
                    },
                    {
                      "period": "2025-07",
                      "domains": 27000,
                      "change": 500,
                      "change_year": 6000,
                      "adds": 900,
                      "renews": 400,
                      "deletes": 400,
                      "transfers_in": 30,
                      "transfers_out": 20,
                      "restores": 5,
                      "registrars": 2
                    }
                  ],
                  "next_cursor": "eyJrIjoiL3YxL3N0YXRzL3RsZHMvbW9uby9tb250aHM_e1wiZnJvbVwiOlwiMjAyNS0wNlwiLFwidG9cIjpcIjIwMjYtMDVcIixcInJhbmdlXCI6XCIxeVwifSIsImF0IjoiMjAyNS0wNyJ9",
                  "query": {
                    "from": "2025-06",
                    "to": "2026-05",
                    "range": "1y",
                    "limit": 2
                  },
                  "bounds": {
                    "first": "2024-05",
                    "last": "2026-05"
                  },
                  "meta": {
                    "as_of": "2025-07",
                    "updated_at": "2026-09-28T03:40:00Z",
                    "attribution": "Registry statistics from ICANN monthly registry reports and registry operators' own reports."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          },
          "404": {
            "$ref": "#/components/responses/StatsNotFound"
          }
        }
      }
    },
    "/v1/stats/tlds/{tld}/registrars": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "A TLD's registrars",
        "description": "Each registrar's holding in the TLD for one month; defaults to the newest month with a registrar breakdown. ccTLDs have none.",
        "operationId": "listStatsTldRegistrars",
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/StatsTld"
          },
          {
            "$ref": "#/components/parameters/StatsPeriod"
          },
          {
            "name": "sort",
            "in": "query",
            "description": "Numbers descending, name ascending.",
            "schema": {
              "type": "string",
              "enum": [
                "domains",
                "adds",
                "name"
              ],
              "default": "domains"
            }
          },
          {
            "$ref": "#/components/parameters/StatsLimit"
          },
          {
            "$ref": "#/components/parameters/StatsCursor"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of registrars.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TldRegistrar"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Null on the last page."
                    },
                    "total": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Items across all pages."
                    },
                    "domains_total": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "The TLD's domains that month, when a reported figure exists (shares are absent otherwise)."
                    },
                    "query": {
                      "type": "object",
                      "description": "The parameters as resolved: defaults filled in, bounds clamped.",
                      "properties": {
                        "period": {
                          "type": "string",
                          "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
                          "example": "2026-05"
                        },
                        "sort": {
                          "type": "string",
                          "enum": [
                            "domains",
                            "adds",
                            "name"
                          ]
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "period",
                        "sort",
                        "limit"
                      ],
                      "additionalProperties": false
                    },
                    "meta": {
                      "$ref": "#/components/schemas/StatsMeta"
                    }
                  },
                  "required": [
                    "items",
                    "next_cursor",
                    "total",
                    "query",
                    "meta"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "items": [
                    {
                      "registrar": {
                        "id": 146,
                        "name": "GoDaddy.com, LLC"
                      },
                      "domains": 27000,
                      "share_pct": 84.38,
                      "adds": 700,
                      "renews": 300,
                      "deletes": 300,
                      "transfers_in": 25,
                      "transfers_out": 15
                    },
                    {
                      "registrar": {
                        "id": 1068,
                        "name": "NameCheap, Inc."
                      },
                      "domains": 5000,
                      "share_pct": 15.63,
                      "adds": 200,
                      "renews": 100,
                      "deletes": 100,
                      "transfers_in": 5,
                      "transfers_out": 5
                    }
                  ],
                  "next_cursor": null,
                  "total": 2,
                  "domains_total": 32000,
                  "query": {
                    "period": "2026-05",
                    "sort": "domains",
                    "limit": 2
                  },
                  "meta": {
                    "as_of": "2026-05",
                    "updated_at": "2026-09-28T03:40:00Z",
                    "attribution": "Registry statistics from ICANN monthly registry reports and registry operators' own reports."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          },
          "404": {
            "$ref": "#/components/responses/StatsNotFound"
          }
        }
      }
    },
    "/v1/stats/tlds/{tld}/zone": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "A TLD's zone nights",
        "description": "Nightly counts from the TLD's zone file, oldest first. Empty for a TLD without zone counts. Nights with no count are left out. Zone data may be withdrawn if a registry revokes access.",
        "operationId": "listStatsTldZone",
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/StatsTld"
          },
          {
            "name": "from",
            "in": "query",
            "description": "First night, YYYY-MM-DD.",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-09-18"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Last night, YYYY-MM-DD.",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-09-18"
            }
          },
          {
            "name": "range",
            "in": "query",
            "description": "How far back from `to` when `from` is not given; `all` is up to five years.",
            "schema": {
              "type": "string",
              "enum": [
                "30d",
                "90d",
                "1y",
                "all"
              ],
              "default": "90d"
            }
          },
          {
            "$ref": "#/components/parameters/StatsLimit"
          },
          {
            "$ref": "#/components/parameters/StatsCursor"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of nights.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ZoneDay"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Null on the last page."
                    },
                    "query": {
                      "type": "object",
                      "description": "The parameters as resolved: defaults filled in, bounds clamped.",
                      "properties": {
                        "from": {
                          "type": "string",
                          "format": "date",
                          "example": "2026-09-18"
                        },
                        "to": {
                          "type": "string",
                          "format": "date",
                          "example": "2026-09-18"
                        },
                        "range": {
                          "type": "string",
                          "enum": [
                            "30d",
                            "90d",
                            "1y",
                            "all"
                          ]
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "range",
                        "limit"
                      ],
                      "additionalProperties": false
                    },
                    "bounds": {
                      "$ref": "#/components/schemas/StatsBounds"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/StatsMeta"
                    }
                  },
                  "required": [
                    "items",
                    "next_cursor",
                    "query",
                    "meta"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "items": [
                    {
                      "date": "2026-08-10",
                      "domains": 1000000
                    },
                    {
                      "date": "2026-08-11",
                      "domains": 1001000,
                      "entered": 1501,
                      "left": 900
                    }
                  ],
                  "next_cursor": "eyJrIjoiL3YxL3N0YXRzL3RsZHMveHl6L3pvbmU_e1wiZnJvbVwiOlwiMjAyNi0wOC0xMFwiLFwidG9cIjpcIjIwMjYtMDktMThcIixcInJhbmdlXCI6XCI5MGRcIn0iLCJhdCI6IjIwMjYtMDgtMTEifQ",
                  "query": {
                    "from": "2026-08-10",
                    "to": "2026-09-18",
                    "range": "90d",
                    "limit": 2
                  },
                  "bounds": {
                    "first": "2026-08-10",
                    "last": "2026-09-18"
                  },
                  "meta": {
                    "as_of": "2026-08-11",
                    "attribution": "Zone counts from ICANN CZDS zone files."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          },
          "404": {
            "$ref": "#/components/responses/StatsNotFound"
          }
        }
      }
    },
    "/v1/stats/registries": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "List registry operators",
        "description": "Every operator running a TLD today.",
        "operationId": "listStatsRegistries",
        "security": [],
        "parameters": [
          {
            "name": "sort",
            "in": "query",
            "description": "Numbers descending, name ascending.",
            "schema": {
              "type": "string",
              "enum": [
                "domains",
                "tlds",
                "name"
              ],
              "default": "domains"
            }
          },
          {
            "$ref": "#/components/parameters/StatsGroupFilter"
          },
          {
            "$ref": "#/components/parameters/StatsQ"
          },
          {
            "$ref": "#/components/parameters/StatsLimit"
          },
          {
            "$ref": "#/components/parameters/StatsCursor"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of operators.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Registry"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Null on the last page."
                    },
                    "total": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Items across all pages."
                    },
                    "query": {
                      "type": "object",
                      "description": "The parameters as resolved: defaults filled in, bounds clamped.",
                      "properties": {
                        "sort": {
                          "type": "string",
                          "enum": [
                            "domains",
                            "tlds",
                            "name"
                          ]
                        },
                        "group": {
                          "type": "string"
                        },
                        "q": {
                          "type": "string"
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "sort",
                        "limit"
                      ],
                      "additionalProperties": false
                    },
                    "meta": {
                      "$ref": "#/components/schemas/StatsMeta"
                    }
                  },
                  "required": [
                    "items",
                    "next_cursor",
                    "total",
                    "query",
                    "meta"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "items": [
                    {
                      "id": 1,
                      "name": "XYZ.COM LLC",
                      "group": "XYZ Registry",
                      "tlds": 1,
                      "domains": {
                        "period": "2026-05",
                        "count": 1280000
                      },
                      "url": "https://namedesk.app/stats/registries/1/xyz-com-llc"
                    },
                    {
                      "id": 8,
                      "name": "Coordination Center for TLD RU",
                      "tlds": 2,
                      "domains": {
                        "period": "2026-05",
                        "count": 700600
                      },
                      "url": "https://namedesk.app/stats/registries/8/coordination-center-for-tld-ru"
                    }
                  ],
                  "next_cursor": "eyJrIjoiL3YxL3N0YXRzL3JlZ2lzdHJpZXM_e1wic29ydFwiOlwiZG9tYWluc1wifSIsInYiOjcwMDYwMCwiaWQiOjh9",
                  "total": 7,
                  "query": {
                    "sort": "domains",
                    "limit": 2
                  },
                  "meta": {
                    "as_of": "2026-05",
                    "updated_at": "2026-09-28T03:40:00Z",
                    "attribution": "Registry statistics from ICANN monthly registry reports and registry operators' own reports."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          }
        }
      }
    },
    "/v1/stats/registries/{id}": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Get a registry operator",
        "description": "One operator.",
        "operationId": "getStatsRegistry",
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/StatsRegistryId"
          }
        ],
        "responses": {
          "200": {
            "description": "The operator.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Registry"
                },
                "example": {
                  "id": 6,
                  "name": "XYZ Two LLC",
                  "group": "XYZ Registry",
                  "tlds": 2,
                  "domains": {
                    "period": "2026-05",
                    "count": 32000
                  },
                  "url": "https://namedesk.app/stats/registries/6/xyz-two-llc",
                  "meta": {
                    "as_of": "2026-05",
                    "updated_at": "2026-09-28T03:40:00Z",
                    "attribution": "Registry statistics from ICANN monthly registry reports and registry operators' own reports."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          },
          "404": {
            "$ref": "#/components/responses/StatsNotFound"
          }
        }
      }
    },
    "/v1/stats/registries/{id}/tlds": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "An operator's TLDs",
        "description": "The TLDs it runs today, by TLD.",
        "operationId": "listStatsRegistryTlds",
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/StatsRegistryId"
          },
          {
            "$ref": "#/components/parameters/StatsLimit"
          },
          {
            "$ref": "#/components/parameters/StatsCursor"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of TLDs.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RegistryTld"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Null on the last page."
                    },
                    "total": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Items across all pages."
                    },
                    "query": {
                      "type": "object",
                      "description": "The parameters as resolved: defaults filled in, bounds clamped.",
                      "properties": {
                        "limit": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "limit"
                      ],
                      "additionalProperties": false
                    },
                    "meta": {
                      "$ref": "#/components/schemas/StatsMeta"
                    }
                  },
                  "required": [
                    "items",
                    "next_cursor",
                    "total",
                    "query",
                    "meta"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "items": [
                    {
                      "tld": "mono",
                      "since": "2015-03"
                    },
                    {
                      "tld": "tpo",
                      "since": "1995-01"
                    }
                  ],
                  "next_cursor": null,
                  "total": 2,
                  "query": {
                    "limit": 100
                  },
                  "meta": {
                    "updated_at": "2026-09-28T03:40:00Z",
                    "attribution": "Registry statistics from ICANN monthly registry reports and registry operators' own reports."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          },
          "404": {
            "$ref": "#/components/responses/StatsNotFound"
          }
        }
      }
    },
    "/v1/stats/registries/{id}/months": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "An operator's months",
        "description": "Monthly totals over the TLDs it runs today (not as of each month), oldest first, up to the newest registry-report month.",
        "operationId": "listStatsRegistryMonths",
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/StatsRegistryId"
          },
          {
            "$ref": "#/components/parameters/StatsFrom"
          },
          {
            "$ref": "#/components/parameters/StatsTo"
          },
          {
            "$ref": "#/components/parameters/StatsRange"
          },
          {
            "$ref": "#/components/parameters/StatsLimit"
          },
          {
            "$ref": "#/components/parameters/StatsCursor"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of months.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RegistryMonth"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Null on the last page."
                    },
                    "query": {
                      "type": "object",
                      "description": "The parameters as resolved: defaults filled in, bounds clamped.",
                      "properties": {
                        "from": {
                          "type": "string",
                          "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
                          "example": "2026-05"
                        },
                        "to": {
                          "type": "string",
                          "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
                          "example": "2026-05"
                        },
                        "range": {
                          "type": "string",
                          "enum": [
                            "1y",
                            "3y",
                            "5y",
                            "10y",
                            "all"
                          ]
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "range",
                        "limit"
                      ],
                      "additionalProperties": false
                    },
                    "bounds": {
                      "$ref": "#/components/schemas/StatsBounds"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/StatsMeta"
                    }
                  },
                  "required": [
                    "items",
                    "next_cursor",
                    "query",
                    "meta"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "items": [
                    {
                      "period": "2025-06",
                      "domains": 26500,
                      "adds": 900,
                      "deletes": 400,
                      "tlds": 1
                    },
                    {
                      "period": "2025-07",
                      "domains": 27000,
                      "adds": 900,
                      "deletes": 400,
                      "tlds": 1
                    }
                  ],
                  "next_cursor": "eyJrIjoiL3YxL3N0YXRzL3JlZ2lzdHJpZXMvNi9tb250aHM_e1wiZnJvbVwiOlwiMjAyNS0wNlwiLFwidG9cIjpcIjIwMjYtMDVcIixcInJhbmdlXCI6XCIxeVwifSIsImF0IjoiMjAyNS0wNyJ9",
                  "query": {
                    "from": "2025-06",
                    "to": "2026-05",
                    "range": "1y",
                    "limit": 2
                  },
                  "bounds": {
                    "first": "2024-05",
                    "last": "2026-05"
                  },
                  "meta": {
                    "as_of": "2025-07",
                    "updated_at": "2026-09-28T03:40:00Z",
                    "attribution": "Registry statistics from ICANN monthly registry reports and registry operators' own reports."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          },
          "404": {
            "$ref": "#/components/responses/StatsNotFound"
          }
        }
      }
    },
    "/v1/stats/registrars": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "List registrars",
        "description": "Every accredited registrar with a figure, each at its newest month.",
        "operationId": "listStatsRegistrars",
        "security": [],
        "parameters": [
          {
            "name": "sort",
            "in": "query",
            "description": "Numbers descending, name ascending; `adds` are that month's.",
            "schema": {
              "type": "string",
              "enum": [
                "domains",
                "adds",
                "tlds",
                "name"
              ],
              "default": "domains"
            }
          },
          {
            "$ref": "#/components/parameters/StatsGroupFilter"
          },
          {
            "$ref": "#/components/parameters/StatsQ"
          },
          {
            "$ref": "#/components/parameters/StatsLimit"
          },
          {
            "$ref": "#/components/parameters/StatsCursor"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of registrars.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Registrar"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Null on the last page."
                    },
                    "total": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Items across all pages."
                    },
                    "query": {
                      "type": "object",
                      "description": "The parameters as resolved: defaults filled in, bounds clamped.",
                      "properties": {
                        "sort": {
                          "type": "string",
                          "enum": [
                            "domains",
                            "adds",
                            "tlds",
                            "name"
                          ]
                        },
                        "group": {
                          "type": "string"
                        },
                        "q": {
                          "type": "string"
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "sort",
                        "limit"
                      ],
                      "additionalProperties": false
                    },
                    "meta": {
                      "$ref": "#/components/schemas/StatsMeta"
                    }
                  },
                  "required": [
                    "items",
                    "next_cursor",
                    "total",
                    "query",
                    "meta"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "items": [
                    {
                      "id": 146,
                      "iana_id": 146,
                      "name": "GoDaddy.com, LLC",
                      "group": "GoDaddy",
                      "tlds": 3,
                      "domains": {
                        "period": "2026-05",
                        "count": 1435000
                      },
                      "url": "https://namedesk.app/stats/registrars/146/godaddy-com-llc"
                    },
                    {
                      "id": 1068,
                      "iana_id": 1068,
                      "name": "NameCheap, Inc.",
                      "group": "Namecheap",
                      "tlds": 2,
                      "domains": {
                        "period": "2026-05",
                        "count": 517000
                      },
                      "url": "https://namedesk.app/stats/registrars/1068/namecheap-inc"
                    }
                  ],
                  "next_cursor": "eyJrIjoiL3YxL3N0YXRzL3JlZ2lzdHJhcnM_e1wic29ydFwiOlwiZG9tYWluc1wifSIsInYiOjUxNzAwMCwiaWQiOjEwNjh9",
                  "total": 4,
                  "query": {
                    "sort": "domains",
                    "limit": 2
                  },
                  "meta": {
                    "as_of": "2026-05",
                    "updated_at": "2026-09-28T03:40:00Z",
                    "attribution": "Registry statistics from ICANN monthly registry reports and registry operators' own reports."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          }
        }
      }
    },
    "/v1/stats/registrars/{id}": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Get a registrar",
        "description": "One registrar, by its IANA id: `146` or `iana:146`.",
        "operationId": "getStatsRegistrar",
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/StatsRegistrarId"
          }
        ],
        "responses": {
          "200": {
            "description": "The registrar.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Registrar"
                },
                "example": {
                  "id": 146,
                  "iana_id": 146,
                  "name": "GoDaddy.com, LLC",
                  "group": "GoDaddy",
                  "tlds": 3,
                  "domains": {
                    "period": "2026-05",
                    "count": 1435000
                  },
                  "url": "https://namedesk.app/stats/registrars/146/godaddy-com-llc",
                  "meta": {
                    "as_of": "2026-05",
                    "updated_at": "2026-09-28T03:40:00Z",
                    "attribution": "Registry statistics from ICANN monthly registry reports and registry operators' own reports."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          },
          "404": {
            "$ref": "#/components/responses/StatsNotFound"
          }
        }
      }
    },
    "/v1/stats/registrars/{id}/months": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "A registrar's months",
        "description": "Monthly totals over its TLDs, oldest first.",
        "operationId": "listStatsRegistrarMonths",
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/StatsRegistrarId"
          },
          {
            "$ref": "#/components/parameters/StatsFrom"
          },
          {
            "$ref": "#/components/parameters/StatsTo"
          },
          {
            "$ref": "#/components/parameters/StatsRange"
          },
          {
            "$ref": "#/components/parameters/StatsLimit"
          },
          {
            "$ref": "#/components/parameters/StatsCursor"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of months.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RegistrarMonth"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Null on the last page."
                    },
                    "query": {
                      "type": "object",
                      "description": "The parameters as resolved: defaults filled in, bounds clamped.",
                      "properties": {
                        "from": {
                          "type": "string",
                          "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
                          "example": "2026-05"
                        },
                        "to": {
                          "type": "string",
                          "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
                          "example": "2026-05"
                        },
                        "range": {
                          "type": "string",
                          "enum": [
                            "1y",
                            "3y",
                            "5y",
                            "10y",
                            "all"
                          ]
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "range",
                        "limit"
                      ],
                      "additionalProperties": false
                    },
                    "bounds": {
                      "$ref": "#/components/schemas/StatsBounds"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/StatsMeta"
                    }
                  },
                  "required": [
                    "items",
                    "next_cursor",
                    "query",
                    "meta"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "items": [
                    {
                      "period": "2025-06",
                      "domains": 1308500,
                      "change": 11500,
                      "adds": 50700,
                      "deletes": 28300,
                      "tlds": 3
                    },
                    {
                      "period": "2025-07",
                      "domains": 1320000,
                      "change": 11500,
                      "adds": 50700,
                      "deletes": 28300,
                      "tlds": 3
                    }
                  ],
                  "next_cursor": "eyJrIjoiL3YxL3N0YXRzL3JlZ2lzdHJhcnMvMTQ2L21vbnRocz97XCJmcm9tXCI6XCIyMDI1LTA2XCIsXCJ0b1wiOlwiMjAyNi0wNVwiLFwicmFuZ2VcIjpcIjF5XCJ9IiwiYXQiOiIyMDI1LTA3In0",
                  "query": {
                    "from": "2025-06",
                    "to": "2026-05",
                    "range": "1y",
                    "limit": 2
                  },
                  "bounds": {
                    "first": "2024-01",
                    "last": "2026-05"
                  },
                  "meta": {
                    "as_of": "2025-07",
                    "updated_at": "2026-09-28T03:40:00Z",
                    "attribution": "Registry statistics from ICANN monthly registry reports and registry operators' own reports."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          },
          "404": {
            "$ref": "#/components/responses/StatsNotFound"
          }
        }
      }
    },
    "/v1/stats/registrars/{id}/tlds": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "A registrar's TLDs",
        "description": "Its holding in each TLD for one month; defaults to its newest.",
        "operationId": "listStatsRegistrarTlds",
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/StatsRegistrarId"
          },
          {
            "$ref": "#/components/parameters/StatsPeriod"
          },
          {
            "name": "sort",
            "in": "query",
            "description": "Numbers descending, `name` (the TLD) ascending.",
            "schema": {
              "type": "string",
              "enum": [
                "domains",
                "change",
                "change_year",
                "adds",
                "share_pct",
                "name"
              ],
              "default": "domains"
            }
          },
          {
            "$ref": "#/components/parameters/StatsLimit"
          },
          {
            "$ref": "#/components/parameters/StatsCursor"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of TLDs.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RegistrarTld"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Null on the last page."
                    },
                    "total": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Items across all pages."
                    },
                    "query": {
                      "type": "object",
                      "description": "The parameters as resolved: defaults filled in, bounds clamped.",
                      "properties": {
                        "period": {
                          "type": "string",
                          "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
                          "example": "2026-05"
                        },
                        "sort": {
                          "type": "string",
                          "enum": [
                            "domains",
                            "change",
                            "change_year",
                            "adds",
                            "share_pct",
                            "name"
                          ]
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "period",
                        "sort",
                        "limit"
                      ],
                      "additionalProperties": false
                    },
                    "meta": {
                      "$ref": "#/components/schemas/StatsMeta"
                    }
                  },
                  "required": [
                    "items",
                    "next_cursor",
                    "total",
                    "query",
                    "meta"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "items": [
                    {
                      "tld": "xyz",
                      "domains": 768000,
                      "change": 6000,
                      "change_year": 72000,
                      "adds": 30000,
                      "share_pct": 60
                    },
                    {
                      "tld": "app",
                      "domains": 640000,
                      "change": 5000,
                      "change_year": 60000,
                      "adds": 20000,
                      "share_pct": 100
                    }
                  ],
                  "next_cursor": "eyJrIjoiL3YxL3N0YXRzL3JlZ2lzdHJhcnMvMTQ2L3RsZHM_e1wicGVyaW9kXCI6XCIyMDI2LTA1XCIsXCJzb3J0XCI6XCJkb21haW5zXCJ9IiwidiI6NjQwMDAwLCJ0bGQiOiJhcHAifQ",
                  "total": 3,
                  "query": {
                    "period": "2026-05",
                    "sort": "domains",
                    "limit": 2
                  },
                  "meta": {
                    "as_of": "2026-05",
                    "updated_at": "2026-09-28T03:40:00Z",
                    "attribution": "Registry statistics from ICANN monthly registry reports and registry operators' own reports."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          },
          "404": {
            "$ref": "#/components/responses/StatsNotFound"
          }
        }
      }
    },
    "/v1/stats/groups/{slug}": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Get a group",
        "description": "The registrars, or registry operators, under one owner. The slug is the `group` name, lower case, non-alphanumerics as hyphens.",
        "operationId": "getStatsGroup",
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/StatsGroupSlug"
          }
        ],
        "responses": {
          "200": {
            "description": "The group.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StatsGroup"
                },
                "example": {
                  "slug": "godaddy",
                  "name": "GoDaddy",
                  "kind": "registrar",
                  "members": [
                    {
                      "id": 146,
                      "name": "GoDaddy.com, LLC"
                    }
                  ],
                  "domains": {
                    "period": "2026-05",
                    "count": 1435000
                  },
                  "url": "https://namedesk.app/stats/groups/godaddy",
                  "meta": {
                    "as_of": "2026-05",
                    "updated_at": "2026-09-28T03:40:00Z",
                    "attribution": "Registry statistics from ICANN monthly registry reports and registry operators' own reports."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          },
          "404": {
            "$ref": "#/components/responses/StatsNotFound"
          }
        }
      }
    },
    "/v1/stats/phases": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Launch phases",
        "description": "Which TLDs ran which launch phase when: every dated phase, by start date, then TLD.",
        "operationId": "listStatsPhases",
        "security": [],
        "parameters": [
          {
            "name": "phase",
            "in": "query",
            "description": "One or more, comma-joined.",
            "schema": {
              "type": "string",
              "example": "general_availability"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Phases starting in or after this month, YYYY-MM.",
            "schema": {
              "type": "string",
              "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
              "example": "2026-05"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Phases starting in or before this month, YYYY-MM.",
            "schema": {
              "type": "string",
              "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
              "example": "2026-05"
            }
          },
          {
            "$ref": "#/components/parameters/StatsLimit"
          },
          {
            "$ref": "#/components/parameters/StatsCursor"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of phases.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StatsPhase"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Null on the last page."
                    },
                    "total": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Items across all pages."
                    },
                    "query": {
                      "type": "object",
                      "description": "The parameters as resolved: defaults filled in, bounds clamped.",
                      "properties": {
                        "phase": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "enum": [
                              "sunrise",
                              "claims",
                              "landrush",
                              "limited_registration",
                              "qualified_launch",
                              "exclusive_registration",
                              "approved_launch",
                              "general_availability"
                            ]
                          }
                        },
                        "from": {
                          "type": "string",
                          "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
                          "example": "2026-05"
                        },
                        "to": {
                          "type": "string",
                          "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
                          "example": "2026-05"
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "limit"
                      ],
                      "additionalProperties": false
                    },
                    "meta": {
                      "$ref": "#/components/schemas/StatsMeta"
                    }
                  },
                  "required": [
                    "items",
                    "next_cursor",
                    "total",
                    "query",
                    "meta"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "items": [
                    {
                      "tld": "mono",
                      "phase": "sunrise",
                      "start": "2015-04-01",
                      "end": "2015-05-01"
                    },
                    {
                      "tld": "mono",
                      "phase": "landrush",
                      "start": "2015-05-02",
                      "end": "2015-05-30"
                    }
                  ],
                  "next_cursor": "eyJrIjoiL3YxL3N0YXRzL3BoYXNlcz97fSIsImF0IjoiMjAxNS0wNS0wMiBtb25vIGxhbmRydXNoIDIwMTUtMDUtMzAifQ",
                  "total": 4,
                  "query": {
                    "limit": 2
                  },
                  "meta": {
                    "updated_at": "2026-09-28T03:40:00Z",
                    "attribution": "Launch periods from ICANN's TLD startup pages and the Trademark Clearinghouse calendar."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          }
        }
      }
    },
    "/v1/stats/applications": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "List 2026 round applications",
        "description": "Applications in ICANN's 2026 new gTLD round, from applicants' public announcements and ICANN's published lists. One item per string and applicant.",
        "operationId": "listStatsApplications",
        "security": [],
        "parameters": [
          {
            "name": "string",
            "in": "query",
            "description": "Applications for this string, its A-label.",
            "schema": {
              "type": "string",
              "example": "agent"
            }
          },
          {
            "name": "applicant",
            "in": "query",
            "description": "Applications by this applicant, by id.",
            "schema": {
              "type": "string",
              "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
            }
          },
          {
            "name": "status",
            "in": "query",
            "description": "One or more statuses, comma-joined.",
            "schema": {
              "type": "string",
              "example": "confirmed,in-contention"
            }
          },
          {
            "name": "category",
            "in": "query",
            "description": "One or more categories, comma-joined: ai-tech, crypto, commerce, geo, brand, culture, infra, other.",
            "schema": {
              "type": "string",
              "example": "ai-tech"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "description": "`announced`: newest announcement first, applications with no announcement date last. `string`: A to Z. `contention`: most contested first.",
            "schema": {
              "type": "string",
              "enum": [
                "announced",
                "string",
                "contention"
              ],
              "default": "announced"
            }
          },
          {
            "$ref": "#/components/parameters/StatsLimit"
          },
          {
            "$ref": "#/components/parameters/StatsCursor"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of applications.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RoundApplication"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Null on the last page."
                    },
                    "total": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Items across all pages."
                    },
                    "query": {
                      "type": "object",
                      "description": "The parameters as resolved: defaults filled in, bounds clamped.",
                      "properties": {
                        "string": {
                          "type": "string"
                        },
                        "applicant": {
                          "type": "string",
                          "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
                        },
                        "status": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "enum": [
                              "catalogued",
                              "rumored",
                              "announced",
                              "confirmed",
                              "ghost",
                              "retracted",
                              "withdrawn",
                              "in-contention",
                              "auction-lost",
                              "will-not-proceed",
                              "delegated",
                              "sunrise",
                              "launched",
                              "terminated",
                              "replacement",
                              "variant",
                              "switched",
                              "deactivated"
                            ]
                          }
                        },
                        "category": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "enum": [
                              "ai-tech",
                              "crypto",
                              "commerce",
                              "geo",
                              "brand",
                              "culture",
                              "infra",
                              "other"
                            ]
                          }
                        },
                        "sort": {
                          "type": "string",
                          "enum": [
                            "announced",
                            "string",
                            "contention"
                          ]
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "sort",
                        "limit"
                      ],
                      "additionalProperties": false
                    },
                    "meta": {
                      "$ref": "#/components/schemas/StatsMeta"
                    }
                  },
                  "required": [
                    "items",
                    "next_cursor",
                    "total",
                    "query",
                    "meta"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "items": [
                    {
                      "id": "3f0c9a52-6d1e-4b7a-9c2f-1a8e5d7b4c10",
                      "round": 2026,
                      "string": "agent",
                      "applicant": {
                        "id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
                        "name": "Example Registry Inc."
                      },
                      "status": "confirmed",
                      "announced": "2026-04-12",
                      "contention": 2,
                      "source": {
                        "title": "We applied for .agent",
                        "url": "https://example.com/news/we-applied",
                        "publisher": "Example Registry Inc."
                      },
                      "icann_application_id": "1-1234-56789",
                      "contention_set": "42",
                      "replacement": {
                        "id": "5d7a1c3e-9b2f-4a6d-8e1c-2f4b6a8d0c35",
                        "string": "agents"
                      },
                      "url": "https://namedesk.app/tlds/agent"
                    },
                    {
                      "id": "8b2e4f61-0c3d-4e9a-a1b7-6d5c4e3f2a19",
                      "round": 2026,
                      "string": "bots",
                      "applicant": {
                        "id": "7e6d5c4b-3a29-4180-b7c6-d5e4f3a2b1c0",
                        "name": "Sample Names LLC"
                      },
                      "status": "switched",
                      "announced": "2026-05-01",
                      "contention": 0,
                      "source": {
                        "title": "Applied-for strings",
                        "url": "https://example.com/applied-for-strings"
                      },
                      "icann_application_id": "1-2345-67890",
                      "switched_to": {
                        "id": "5d7a1c3e-9b2f-4a6d-8e1c-2f4b6a8d0c35",
                        "string": "robots",
                        "date": "2026-10-14"
                      },
                      "url": "https://namedesk.app/tlds/bots"
                    }
                  ],
                  "next_cursor": "eyJrIjoiL3YxL3N0YXRzL2FwcGxpY2F0aW9ucz97XCJzb3J0XCI6XCJhbm5vdW5jZWRcIn0iLCJ2IjoiMjAyNi0wNC0xMiIsImlkIjoiOGIyZTRmNjEtMGMzZC00ZTlhLWExYjctNmQ1YzRlM2YyYTE5In0",
                  "total": 958,
                  "query": {
                    "sort": "announced",
                    "limit": 2
                  },
                  "meta": {
                    "updated_at": "2026-10-08T09:30:12Z",
                    "attribution": "TLD round record from applicants' public announcements and ICANN's published lists."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          }
        }
      }
    },
    "/v1/stats/applications/{id}": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Get a 2026 round application",
        "description": "One application.",
        "operationId": "getStatsApplication",
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/StatsApplicationId"
          }
        ],
        "responses": {
          "200": {
            "description": "The application.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RoundApplication"
                },
                "example": {
                  "id": "8b2e4f61-0c3d-4e9a-a1b7-6d5c4e3f2a19",
                  "round": 2026,
                  "string": "bots",
                  "applicant": {
                    "id": "7e6d5c4b-3a29-4180-b7c6-d5e4f3a2b1c0",
                    "name": "Sample Names LLC"
                  },
                  "status": "switched",
                  "announced": "2026-05-01",
                  "contention": 0,
                  "source": {
                    "title": "Applied-for strings",
                    "url": "https://example.com/applied-for-strings"
                  },
                  "icann_application_id": "1-2345-67890",
                  "switched_to": {
                    "id": "5d7a1c3e-9b2f-4a6d-8e1c-2f4b6a8d0c35",
                    "string": "robots",
                    "date": "2026-10-14"
                  },
                  "url": "https://namedesk.app/tlds/bots",
                  "meta": {
                    "updated_at": "2026-10-08T09:30:12Z",
                    "attribution": "TLD round record from applicants' public announcements and ICANN's published lists."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          },
          "404": {
            "$ref": "#/components/responses/StatsNotFound"
          }
        }
      }
    },
    "/v1/stats/strings": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "List 2026 round strings",
        "description": "Strings in the 2026 round: applied for, named as a backup, or claimed and abandoned, chosen with `role` (by default, applied-for strings and backups). Each carries the AI assessment's score and verdict once the string is assessed.",
        "operationId": "listStatsStrings",
        "security": [],
        "parameters": [
          {
            "name": "role",
            "in": "query",
            "description": "One or more roles, comma-joined. A string is listed when at least one application puts it in one of them. `applied`: applied for, with an application live on ICANN's list (an IDN variant label of an application counts here). `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. Default: `applied,backup`.",
            "schema": {
              "type": "string",
              "example": "applied,backup,deactivated",
              "default": "applied,backup"
            }
          },
          {
            "name": "status",
            "in": "query",
            "description": "One or more statuses, comma-joined.",
            "schema": {
              "type": "string",
              "example": "confirmed,in-contention"
            }
          },
          {
            "name": "category",
            "in": "query",
            "description": "One or more categories, comma-joined: ai-tech, crypto, commerce, geo, brand, culture, infra, other.",
            "schema": {
              "type": "string",
              "example": "ai-tech"
            }
          },
          {
            "name": "contested",
            "in": "query",
            "description": "`true`: only strings two or more applicants are pursuing.",
            "schema": {
              "type": "string",
              "enum": [
                "false",
                "true"
              ],
              "default": "false"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "description": "`score`: highest first, unassessed strings last. `contention`: most contenders first. `string`: A to Z. `first_seen`: newest first.",
            "schema": {
              "type": "string",
              "enum": [
                "score",
                "contention",
                "string",
                "first_seen"
              ],
              "default": "score"
            }
          },
          {
            "$ref": "#/components/parameters/StatsLimit"
          },
          {
            "$ref": "#/components/parameters/StatsCursor"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of strings.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RoundString"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Null on the last page."
                    },
                    "total": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Items across all pages."
                    },
                    "query": {
                      "type": "object",
                      "description": "The parameters as resolved: defaults filled in, bounds clamped.",
                      "properties": {
                        "status": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "enum": [
                              "catalogued",
                              "rumored",
                              "announced",
                              "confirmed",
                              "ghost",
                              "retracted",
                              "withdrawn",
                              "in-contention",
                              "auction-lost",
                              "will-not-proceed",
                              "delegated",
                              "sunrise",
                              "launched",
                              "terminated",
                              "replacement",
                              "variant",
                              "switched",
                              "deactivated"
                            ]
                          }
                        },
                        "category": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "enum": [
                              "ai-tech",
                              "crypto",
                              "commerce",
                              "geo",
                              "brand",
                              "culture",
                              "infra",
                              "other"
                            ]
                          }
                        },
                        "contested": {
                          "type": "boolean",
                          "enum": [
                            true
                          ]
                        },
                        "role": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "enum": [
                              "applied",
                              "backup",
                              "deactivated",
                              "abandoned"
                            ]
                          }
                        },
                        "sort": {
                          "type": "string",
                          "enum": [
                            "score",
                            "contention",
                            "string",
                            "first_seen"
                          ]
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "sort",
                        "limit"
                      ],
                      "additionalProperties": false
                    },
                    "meta": {
                      "$ref": "#/components/schemas/StatsMeta"
                    }
                  },
                  "required": [
                    "items",
                    "next_cursor",
                    "total",
                    "query",
                    "meta"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "items": [
                    {
                      "string": "agent",
                      "round": 2026,
                      "category": "ai-tech",
                      "status": "confirmed",
                      "applications": 2,
                      "contention": 2,
                      "first_seen": "2026-08-15",
                      "score": 72,
                      "verdict": "A natural home for AI agent products.",
                      "applicants": [
                        {
                          "id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
                          "name": "Example Registry Inc.",
                          "role": "applying"
                        },
                        {
                          "id": "7e6d5c4b-3a29-4180-b7c6-d5e4f3a2b1c0",
                          "name": "Sample Names LLC",
                          "role": "applying"
                        }
                      ],
                      "url": "https://namedesk.app/tlds/agent"
                    },
                    {
                      "string": "xn--czrs0t",
                      "unicode": "\u5546\u5e97",
                      "round": 2026,
                      "category": "commerce",
                      "status": "variant",
                      "applications": 0,
                      "contention": 0,
                      "first_seen": "2026-10-07",
                      "applicants": [
                        {
                          "id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
                          "name": "Example Registry Inc.",
                          "role": "variant"
                        }
                      ],
                      "url": "https://namedesk.app/tlds/xn--czrs0t"
                    }
                  ],
                  "next_cursor": "eyJrIjoiL3YxL3N0YXRzL3N0cmluZ3M_e1wic29ydFwiOlwic2NvcmVcIn0iLCJ2IjowLCJpZCI6InhuLS1jenJzMHQifQ",
                  "total": 731,
                  "query": {
                    "role": [
                      "applied",
                      "backup"
                    ],
                    "sort": "score",
                    "limit": 2
                  },
                  "meta": {
                    "updated_at": "2026-10-08T09:30:12Z",
                    "attribution": "TLD round record from applicants' public announcements and ICANN's published lists."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          }
        }
      }
    },
    "/v1/stats/strings/{string}": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Get a 2026 round string",
        "description": "One string, by its A-label.",
        "operationId": "getStatsString",
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/StatsRoundString"
          }
        ],
        "responses": {
          "200": {
            "description": "The string.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RoundString"
                },
                "example": {
                  "string": "agent",
                  "round": 2026,
                  "category": "ai-tech",
                  "status": "confirmed",
                  "applications": 2,
                  "contention": 2,
                  "first_seen": "2026-08-15",
                  "score": 72,
                  "verdict": "A natural home for AI agent products.",
                  "applicants": [
                    {
                      "id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
                      "name": "Example Registry Inc.",
                      "role": "applying"
                    },
                    {
                      "id": "7e6d5c4b-3a29-4180-b7c6-d5e4f3a2b1c0",
                      "name": "Sample Names LLC",
                      "role": "applying"
                    }
                  ],
                  "url": "https://namedesk.app/tlds/agent",
                  "meta": {
                    "updated_at": "2026-10-08T09:30:12Z",
                    "attribution": "TLD round record from applicants' public announcements and ICANN's published lists."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          },
          "404": {
            "$ref": "#/components/responses/StatsNotFound"
          }
        }
      }
    },
    "/v1/stats/applicants": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "List 2026 round applicants",
        "description": "The legal entities with at least one application in the 2026 round (`counts.applicants` on /v1/stats/round/2026). With `abandoned=true`, the parties whose every claim was abandoned instead (`counts.abandoned_applicants`).",
        "operationId": "listStatsApplicants",
        "security": [],
        "parameters": [
          {
            "name": "abandoned",
            "in": "query",
            "description": "`true`: list the parties whose every claim was abandoned (announced, not on ICANN's list) instead of the applicants.",
            "schema": {
              "type": "string",
              "enum": [
                "false",
                "true"
              ],
              "default": "false"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "description": "`applications`: most first. `name`: A to Z.",
            "schema": {
              "type": "string",
              "enum": [
                "applications",
                "name"
              ],
              "default": "applications"
            }
          },
          {
            "$ref": "#/components/parameters/StatsLimit"
          },
          {
            "$ref": "#/components/parameters/StatsCursor"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of applicants.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RoundApplicant"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Null on the last page."
                    },
                    "total": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Items across all pages."
                    },
                    "query": {
                      "type": "object",
                      "description": "The parameters as resolved: defaults filled in, bounds clamped.",
                      "properties": {
                        "abandoned": {
                          "type": "boolean",
                          "enum": [
                            true
                          ]
                        },
                        "sort": {
                          "type": "string",
                          "enum": [
                            "applications",
                            "name"
                          ]
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "sort",
                        "limit"
                      ],
                      "additionalProperties": false
                    },
                    "meta": {
                      "$ref": "#/components/schemas/StatsMeta"
                    }
                  },
                  "required": [
                    "items",
                    "next_cursor",
                    "total",
                    "query",
                    "meta"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "items": [
                    {
                      "id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
                      "name": "Example Registry Inc.",
                      "website": "https://example.com",
                      "applications": 12
                    },
                    {
                      "id": "7e6d5c4b-3a29-4180-b7c6-d5e4f3a2b1c0",
                      "name": "Sample Names LLC",
                      "applications": 3
                    }
                  ],
                  "next_cursor": "eyJrIjoiL3YxL3N0YXRzL2FwcGxpY2FudHM_e1wic29ydFwiOlwiYXBwbGljYXRpb25zXCJ9IiwidiI6MywiaWQiOiI3ZTZkNWM0Yi0zYTI5LTQxODAtYjdjNi1kNWU0ZjNhMmIxYzAifQ",
                  "total": 402,
                  "query": {
                    "sort": "applications",
                    "limit": 2
                  },
                  "meta": {
                    "updated_at": "2026-10-08T09:30:12Z",
                    "attribution": "TLD round record from applicants' public announcements and ICANN's published lists."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          }
        }
      }
    },
    "/v1/stats/applicants/{id}": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Get a 2026 round applicant",
        "description": "One applicant, or one party whose every claim was abandoned: any id an application or a string names.",
        "operationId": "getStatsApplicant",
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/StatsApplicantId"
          }
        ],
        "responses": {
          "200": {
            "description": "The applicant.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RoundApplicant"
                },
                "example": {
                  "id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
                  "name": "Example Registry Inc.",
                  "website": "https://example.com",
                  "applications": 12,
                  "meta": {
                    "updated_at": "2026-10-08T09:30:12Z",
                    "attribution": "TLD round record from applicants' public announcements and ICANN's published lists."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          },
          "404": {
            "$ref": "#/components/responses/StatsNotFound"
          }
        }
      }
    },
    "/v1/stats/applicants/{id}/applications": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "An applicant's 2026 round applications",
        "description": "Every application by one applicant.",
        "operationId": "listStatsApplicantApplications",
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/StatsApplicantId"
          },
          {
            "name": "status",
            "in": "query",
            "description": "One or more statuses, comma-joined.",
            "schema": {
              "type": "string",
              "example": "confirmed,in-contention"
            }
          },
          {
            "name": "category",
            "in": "query",
            "description": "One or more categories, comma-joined: ai-tech, crypto, commerce, geo, brand, culture, infra, other.",
            "schema": {
              "type": "string",
              "example": "ai-tech"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "description": "`announced`: newest announcement first, applications with no announcement date last. `string`: A to Z. `contention`: most contested first.",
            "schema": {
              "type": "string",
              "enum": [
                "announced",
                "string",
                "contention"
              ],
              "default": "announced"
            }
          },
          {
            "$ref": "#/components/parameters/StatsLimit"
          },
          {
            "$ref": "#/components/parameters/StatsCursor"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of applications.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RoundApplication"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Null on the last page."
                    },
                    "total": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Items across all pages."
                    },
                    "query": {
                      "type": "object",
                      "description": "The parameters as resolved: defaults filled in, bounds clamped.",
                      "properties": {
                        "status": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "enum": [
                              "catalogued",
                              "rumored",
                              "announced",
                              "confirmed",
                              "ghost",
                              "retracted",
                              "withdrawn",
                              "in-contention",
                              "auction-lost",
                              "will-not-proceed",
                              "delegated",
                              "sunrise",
                              "launched",
                              "terminated",
                              "replacement",
                              "variant",
                              "switched",
                              "deactivated"
                            ]
                          }
                        },
                        "category": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "enum": [
                              "ai-tech",
                              "crypto",
                              "commerce",
                              "geo",
                              "brand",
                              "culture",
                              "infra",
                              "other"
                            ]
                          }
                        },
                        "sort": {
                          "type": "string",
                          "enum": [
                            "announced",
                            "string",
                            "contention"
                          ]
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "sort",
                        "limit"
                      ],
                      "additionalProperties": false
                    },
                    "meta": {
                      "$ref": "#/components/schemas/StatsMeta"
                    }
                  },
                  "required": [
                    "items",
                    "next_cursor",
                    "total",
                    "query",
                    "meta"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "items": [
                    {
                      "id": "3f0c9a52-6d1e-4b7a-9c2f-1a8e5d7b4c10",
                      "round": 2026,
                      "string": "agent",
                      "applicant": {
                        "id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
                        "name": "Example Registry Inc."
                      },
                      "status": "confirmed",
                      "announced": "2026-04-12",
                      "contention": 2,
                      "source": {
                        "title": "We applied for .agent",
                        "url": "https://example.com/news/we-applied",
                        "publisher": "Example Registry Inc."
                      },
                      "icann_application_id": "1-1234-56789",
                      "contention_set": "42",
                      "replacement": {
                        "id": "5d7a1c3e-9b2f-4a6d-8e1c-2f4b6a8d0c35",
                        "string": "agents"
                      },
                      "url": "https://namedesk.app/tlds/agent"
                    }
                  ],
                  "next_cursor": "eyJrIjoiL3YxL3N0YXRzL2FwcGxpY2FudHMvMGExYjJjM2QtNGU1Zi00YTZiLThjN2QtOWUwZjFhMmIzYzRkL2FwcGxpY2F0aW9ucz97XCJzb3J0XCI6XCJhbm5vdW5jZWRcIn0iLCJ2IjoiMjAyNi0wNC0xMiIsImlkIjoiM2YwYzlhNTItNmQxZS00YjdhLTljMmYtMWE4ZTVkN2I0YzEwIn0",
                  "total": 12,
                  "query": {
                    "sort": "announced",
                    "limit": 1
                  },
                  "meta": {
                    "updated_at": "2026-10-08T09:30:12Z",
                    "attribution": "TLD round record from applicants' public announcements and ICANN's published lists."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          },
          "404": {
            "$ref": "#/components/responses/StatsNotFound"
          }
        }
      }
    },
    "/v1/stats/changes": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "2026 round changes",
        "description": "Every change to the round data, oldest first: a new application, a status change, a correction or a note.",
        "operationId": "listStatsChanges",
        "security": [],
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "description": "First day, YYYY-MM-DD.",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-10-08"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Last day, YYYY-MM-DD.",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-10-08"
            }
          },
          {
            "name": "range",
            "in": "query",
            "description": "How far back from `to` when `from` is not given; `all` is up to five years.",
            "schema": {
              "type": "string",
              "enum": [
                "30d",
                "90d",
                "1y",
                "all"
              ],
              "default": "90d"
            }
          },
          {
            "$ref": "#/components/parameters/StatsLimit"
          },
          {
            "$ref": "#/components/parameters/StatsCursor"
          }
        ],
        "responses": {
          "200": {
            "description": "A page of changes.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "items": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RoundChange"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Null on the last page."
                    },
                    "query": {
                      "type": "object",
                      "description": "The parameters as resolved: defaults filled in, bounds clamped.",
                      "properties": {
                        "from": {
                          "type": "string",
                          "format": "date",
                          "example": "2026-10-08"
                        },
                        "to": {
                          "type": "string",
                          "format": "date",
                          "example": "2026-10-08"
                        },
                        "range": {
                          "type": "string",
                          "enum": [
                            "30d",
                            "90d",
                            "1y",
                            "all"
                          ]
                        },
                        "limit": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "range",
                        "limit"
                      ],
                      "additionalProperties": false
                    },
                    "bounds": {
                      "$ref": "#/components/schemas/StatsBounds"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/StatsMeta"
                    }
                  },
                  "required": [
                    "items",
                    "next_cursor",
                    "query",
                    "meta"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "items": [
                    {
                      "at": "2026-10-07T19:02:41Z",
                      "string": "agent",
                      "applicant": {
                        "id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
                        "name": "Example Registry Inc."
                      },
                      "change": "status_changed",
                      "status": "confirmed",
                      "source": {
                        "title": "Applied-for strings",
                        "url": "https://example.com/applied-for-strings"
                      }
                    },
                    {
                      "at": "2026-10-08T09:30:12Z",
                      "string": "agent",
                      "applicant": {
                        "id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
                        "name": "Example Registry Inc."
                      },
                      "change": "corrected"
                    }
                  ],
                  "next_cursor": "eyJrIjoiL3YxL3N0YXRzL2NoYW5nZXM_e1wiZnJvbVwiOlwiMjAyNi0wNy0xMFwiLFwidG9cIjpcIjIwMjYtMTAtMDhcIixcInJhbmdlXCI6XCI5MGRcIn0iLCJhdCI6IjIwMjYtMTAtMDhUMDk6MzA6MTIuNDE4WiIsIm4iOjQyMTF9",
                  "query": {
                    "from": "2026-07-10",
                    "to": "2026-10-08",
                    "range": "90d",
                    "limit": 2
                  },
                  "bounds": {
                    "first": "2026-08-15",
                    "last": "2026-10-08"
                  },
                  "meta": {
                    "updated_at": "2026-10-08T09:30:12Z",
                    "attribution": "TLD round record from applicants' public announcements and ICANN's published lists."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          }
        }
      }
    },
    "/v1/stats/round/{round}": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "The 2026 round",
        "description": "ICANN's calendar for the round, where the round is on it (cached no longer than until the phase changes), and how many applications, strings, applicants and contention sets it has.",
        "operationId": "getStatsRound",
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/StatsRound"
          }
        ],
        "responses": {
          "200": {
            "description": "The round.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Round"
                },
                "example": {
                  "round": 2026,
                  "phase": "replacement_period",
                  "milestones": [
                    {
                      "milestone": "reveal_day",
                      "start": "2026-10-07T18:00:00Z"
                    },
                    {
                      "milestone": "replacement_period",
                      "start": "2026-10-08T00:01:00Z",
                      "end": "2026-10-21T23:59:00Z"
                    },
                    {
                      "milestone": "string_confirmation_day",
                      "start": "2026-11-17"
                    },
                    {
                      "milestone": "refund_deadline",
                      "end": "2026-11-27T23:59:00Z"
                    },
                    {
                      "milestone": "objections",
                      "start": "2026-11-17",
                      "end": "2027-03-16"
                    },
                    {
                      "milestone": "icann_closed",
                      "start": "2026-12-19T01:00:00Z",
                      "end": "2027-01-04T16:00:00Z"
                    },
                    {
                      "milestone": "prioritization_draw",
                      "when": "H1 2027, date to be set"
                    }
                  ],
                  "counts": {
                    "applications": 958,
                    "strings": 731,
                    "applicants": 402,
                    "companies": 352,
                    "abandoned_applicants": 3,
                    "contention_sets": 96
                  },
                  "revealed": true,
                  "url": "https://namedesk.app/tlds",
                  "meta": {
                    "updated_at": "2026-10-08T09:30:12Z",
                    "attribution": "TLD round record from applicants' public announcements and ICANN's published lists."
                  }
                }
              }
            }
          },
          "302": {
            "$ref": "#/components/responses/StatsCanonical"
          },
          "400": {
            "$ref": "#/components/responses/StatsBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/StatsUnauthorized"
          },
          "429": {
            "$ref": "#/components/responses/StatsRateLimited"
          },
          "404": {
            "$ref": "#/components/responses/StatsNotFound"
          }
        }
      }
    }
  },
  "tags": [
    {
      "name": "Stats",
      "description": "Domain industry statistics and the 2026 new gTLD round, free, no key required. Statistics: TLDs, registry operators and registrars month by month, launch phases and nightly zone counts, as counts and totals. The 2026 round: every application announced by its applicant or published by ICANN, the strings applied for, the applicants, ICANN's calendar and every change to the round data. Every response carries `meta` with the sources to credit."
    }
  ],
  "components": {
    "parameters": {
      "StatsCursor": {
        "name": "cursor",
        "in": "query",
        "description": "The `next_cursor` of the previous page. It is bound to the query it came from: change any other parameter and start again without it.",
        "schema": {
          "type": "string"
        }
      },
      "StatsFrom": {
        "name": "from",
        "in": "query",
        "description": "First month, YYYY-MM, inclusive. Overrides `range`.",
        "schema": {
          "type": "string",
          "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
          "example": "2026-05"
        }
      },
      "StatsGroupFilter": {
        "name": "group",
        "in": "query",
        "description": "Only this group, by its exact name (the `group` field).",
        "schema": {
          "type": "string",
          "maxLength": 200
        }
      },
      "StatsGroupSlug": {
        "name": "slug",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "example": "godaddy"
        }
      },
      "StatsLimit": {
        "name": "limit",
        "in": "query",
        "description": "Page size, 1 to 1000. Defaults to 100.",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 1000,
          "default": 100
        }
      },
      "StatsPeriod": {
        "name": "period",
        "in": "query",
        "description": "A month, YYYY-MM. Defaults to the newest month; clamped to the months that exist and echoed in `query`.",
        "schema": {
          "type": "string",
          "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
          "example": "2026-05"
        }
      },
      "StatsQ": {
        "name": "q",
        "in": "query",
        "description": "Contained in the name (or the TLD), case-insensitive, 1 to 64 characters.",
        "schema": {
          "type": "string",
          "minLength": 1,
          "maxLength": 64
        }
      },
      "StatsRange": {
        "name": "range",
        "in": "query",
        "description": "How far back from `to` when `from` is not given.",
        "schema": {
          "type": "string",
          "enum": [
            "1y",
            "3y",
            "5y",
            "10y",
            "all"
          ],
          "default": "10y"
        }
      },
      "StatsRegistrarId": {
        "name": "id",
        "in": "path",
        "required": true,
        "description": "The IANA registrar id, or `iana:` followed by it.",
        "schema": {
          "type": "string",
          "pattern": "^(iana:)?[1-9][0-9]*$",
          "example": "146"
        }
      },
      "StatsRegistryId": {
        "name": "id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "pattern": "^[1-9][0-9]*$",
          "example": "69"
        }
      },
      "StatsTld": {
        "name": "tld",
        "in": "path",
        "required": true,
        "description": "The A-label, lower case.",
        "schema": {
          "type": "string",
          "example": "xyz"
        }
      },
      "StatsTo": {
        "name": "to",
        "in": "query",
        "description": "Last month, YYYY-MM, inclusive. Defaults to the newest.",
        "schema": {
          "type": "string",
          "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
          "example": "2026-05"
        }
      },
      "StatsApplicationId": {
        "name": "id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
          "example": "3f0c9a52-6d1e-4b7a-9c2f-1a8e5d7b4c10"
        }
      },
      "StatsApplicantId": {
        "name": "id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
          "example": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d"
        }
      },
      "StatsRoundString": {
        "name": "string",
        "in": "path",
        "required": true,
        "description": "The A-label, lower case.",
        "schema": {
          "type": "string",
          "example": "agent"
        }
      },
      "StatsRound": {
        "name": "round",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "enum": [
            "2026"
          ]
        }
      }
    },
    "responses": {
      "StatsBadRequest": {
        "description": "A parameter has a bad value or was repeated (`invalid_parameter`, with `details.accepted`), or the cursor belongs to another query (`invalid_cursor`). Unknown parameters are ignored.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/StatsError"
            }
          }
        }
      },
      "StatsCanonical": {
        "description": "The query string carried an unknown parameter or was not in standard form: a redirect to the same query in standard form. Follow it.",
        "headers": {
          "Location": {
            "schema": {
              "type": "string"
            }
          }
        }
      },
      "StatsNotFound": {
        "description": "No such entity (`tld_not_found`, `registry_not_found`, `registrar_not_found`, `group_not_found`, `application_not_found`, `applicant_not_found`, `string_not_found`, `round_not_found`, with `details.id`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/StatsError"
            }
          }
        }
      },
      "StatsRateLimited": {
        "description": "Too many requests from this address in a minute (`rate_limited`). An API key raises the limit.",
        "headers": {
          "Retry-After": {
            "description": "Seconds to wait.",
            "schema": {
              "type": "integer"
            }
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/StatsError"
            }
          }
        }
      },
      "StatsUnauthorized": {
        "description": "An API key was sent and is not valid. Send none to read anonymously.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/StatsError"
            }
          }
        }
      }
    },
    "schemas": {
      "Registrar": {
        "type": "object",
        "description": "An ICANN-accredited registrar.",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Our id: equal to the IANA registrar id.",
            "example": 146
          },
          "iana_id": {
            "type": "integer",
            "example": 146
          },
          "name": {
            "type": "string"
          },
          "group": {
            "type": "string",
            "description": "The owner (see /v1/stats/groups/{slug})."
          },
          "tlds": {
            "type": "integer",
            "minimum": 0,
            "description": "TLDs it held names in that month."
          },
          "domains": {
            "$ref": "#/components/schemas/StatsDomains"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "meta": {
            "$ref": "#/components/schemas/StatsMeta",
            "description": "On the top-level object of a response only."
          }
        },
        "required": [
          "id",
          "iana_id",
          "name",
          "tlds",
          "domains",
          "url"
        ],
        "additionalProperties": false
      },
      "RegistrarMonth": {
        "type": "object",
        "description": "One month of a registrar, summed over its TLDs.",
        "properties": {
          "period": {
            "type": "string",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
            "example": "2026-05"
          },
          "domains": {
            "type": "integer",
            "minimum": 0
          },
          "change": {
            "type": "integer"
          },
          "adds": {
            "type": "integer",
            "minimum": 0
          },
          "deletes": {
            "type": "integer",
            "minimum": 0
          },
          "tlds": {
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [
          "period",
          "domains",
          "tlds"
        ],
        "additionalProperties": false
      },
      "RegistrarTld": {
        "type": "object",
        "description": "One TLD of a registrar for a month.",
        "properties": {
          "tld": {
            "type": "string"
          },
          "domains": {
            "type": "integer",
            "minimum": 0
          },
          "change": {
            "type": "integer"
          },
          "change_year": {
            "type": "integer"
          },
          "adds": {
            "type": "integer",
            "minimum": 0
          },
          "share_pct": {
            "type": "number",
            "description": "Percent of the TLD's domains, two decimals."
          }
        },
        "required": [
          "tld",
          "domains"
        ],
        "additionalProperties": false
      },
      "Registry": {
        "type": "object",
        "description": "A registry operator.",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Our id, stable for v1.",
            "example": 69
          },
          "name": {
            "type": "string"
          },
          "group": {
            "type": "string",
            "description": "The owner, when two or more operators share one (see /v1/stats/groups/{slug})."
          },
          "tlds": {
            "type": "integer",
            "minimum": 0,
            "description": "TLDs it runs today."
          },
          "domains": {
            "$ref": "#/components/schemas/StatsDomains",
            "description": "Summed over the TLDs it runs today, for the newest ICANN-report month. Absent when none of them has a figure that month."
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "meta": {
            "$ref": "#/components/schemas/StatsMeta",
            "description": "On the top-level object of a response only."
          }
        },
        "required": [
          "id",
          "name",
          "tlds",
          "url"
        ],
        "additionalProperties": false
      },
      "RegistryMonth": {
        "type": "object",
        "description": "One month of an operator, summed over the TLDs it runs today.",
        "properties": {
          "period": {
            "type": "string",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
            "example": "2026-05"
          },
          "domains": {
            "type": "integer",
            "minimum": 0
          },
          "adds": {
            "type": "integer",
            "minimum": 0
          },
          "deletes": {
            "type": "integer",
            "minimum": 0
          },
          "tlds": {
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [
          "period",
          "domains",
          "tlds"
        ],
        "additionalProperties": false
      },
      "RegistryTld": {
        "type": "object",
        "description": "A TLD a registry operator runs.",
        "properties": {
          "tld": {
            "type": "string"
          },
          "since": {
            "type": "string",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
            "example": "2026-05",
            "description": "The month it took the TLD over."
          },
          "domains": {
            "$ref": "#/components/schemas/StatsDomains",
            "description": "The TLD's newest reported figure, as on Tld.domains (without change_year). Absent when no such figure exists."
          }
        },
        "required": [
          "tld",
          "since"
        ],
        "additionalProperties": false
      },
      "StatsBounds": {
        "type": "object",
        "description": "The first and last points a series has, whatever range was asked for.",
        "properties": {
          "first": {
            "type": "string",
            "description": "The oldest point that exists (YYYY-MM, or YYYY-MM-DD for zone nights)."
          },
          "last": {
            "type": "string",
            "description": "The newest point that exists."
          }
        },
        "required": [
          "first",
          "last"
        ],
        "additionalProperties": false
      },
      "StatsDomains": {
        "type": "object",
        "description": "A stock figure as of a month.",
        "properties": {
          "period": {
            "type": "string",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
            "example": "2026-05"
          },
          "count": {
            "type": "integer",
            "minimum": 0,
            "description": "Domains under management that month."
          },
          "change": {
            "type": "integer",
            "description": "Against the month before."
          },
          "change_year": {
            "type": "integer",
            "description": "Against the same month a year before. Absent on an estimated figure."
          },
          "estimated": {
            "type": "boolean",
            "const": true,
            "description": "Present (and true) only when the figure is from the registry operator's own report rather than its ICANN monthly registry report."
          }
        },
        "required": [
          "period",
          "count"
        ],
        "additionalProperties": false
      },
      "StatsError": {
        "type": "object",
        "description": "Every stats error.",
        "properties": {
          "error": {
            "type": "string",
            "description": "Stable 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`.",
            "example": "invalid_parameter"
          },
          "message": {
            "type": "string",
            "description": "A sentence a person can act on."
          },
          "details": {
            "type": "object",
            "properties": {
              "parameter": {
                "type": "string",
                "description": "The rejected parameter."
              },
              "value": {
                "type": "string",
                "description": "The value it was given."
              },
              "accepted": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "The values or the form it accepts."
              },
              "id": {
                "type": "string",
                "description": "The path id that was not found."
              }
            },
            "required": [],
            "additionalProperties": false
          },
          "request_id": {
            "type": "string",
            "description": "Also in the `X-Request-Id` header; quote it when asking for help."
          }
        },
        "required": [
          "error",
          "message",
          "request_id"
        ],
        "additionalProperties": false
      },
      "StatsGroup": {
        "type": "object",
        "description": "The registrars (or registry operators) under one owner.",
        "properties": {
          "slug": {
            "type": "string",
            "example": "godaddy"
          },
          "name": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "registrar",
              "registry"
            ]
          },
          "members": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StatsRef"
            }
          },
          "domains": {
            "$ref": "#/components/schemas/StatsDomains",
            "description": "Its members summed, as of the newest registry-report month."
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "meta": {
            "$ref": "#/components/schemas/StatsMeta",
            "description": "On the top-level object of a response only."
          }
        },
        "required": [
          "slug",
          "name",
          "kind",
          "members",
          "url"
        ],
        "additionalProperties": false
      },
      "StatsMeta": {
        "type": "object",
        "description": "On every stats response.",
        "properties": {
          "as_of": {
            "type": "string",
            "description": "The newest month (YYYY-MM) or date (YYYY-MM-DD) in the response. Absent when the response holds none.",
            "example": "2026-05"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the data in this response last changed: the monthly statistics' last update, or the round data's newest change. Absent on zone series.",
            "example": "2026-09-28T03:40:00Z"
          },
          "attribution": {
            "type": "string",
            "description": "The sources of this response, to be shown with it.",
            "example": "Registry statistics from ICANN monthly registry reports."
          }
        },
        "required": [
          "attribution"
        ],
        "additionalProperties": false
      },
      "StatsPeriod": {
        "type": "object",
        "description": "A month the registry reports cover.",
        "properties": {
          "period": {
            "type": "string",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
            "example": "2026-05"
          }
        },
        "required": [
          "period"
        ],
        "additionalProperties": false
      },
      "StatsPhase": {
        "type": "object",
        "description": "A dated launch phase of one TLD.",
        "properties": {
          "tld": {
            "type": "string"
          },
          "phase": {
            "type": "string",
            "enum": [
              "sunrise",
              "claims",
              "landrush",
              "limited_registration",
              "qualified_launch",
              "exclusive_registration",
              "approved_launch",
              "general_availability"
            ]
          },
          "start": {
            "type": "string",
            "format": "date"
          },
          "end": {
            "type": "string",
            "format": "date"
          }
        },
        "required": [
          "tld",
          "phase",
          "start"
        ],
        "additionalProperties": false
      },
      "StatsRef": {
        "type": "object",
        "description": "A reference to a registry or registrar; the full object is at its own endpoint.",
        "properties": {
          "id": {
            "type": "integer",
            "example": 146
          },
          "name": {
            "type": "string",
            "example": "GoDaddy.com, LLC"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "additionalProperties": false
      },
      "StatsSummary": {
        "type": "object",
        "description": "Totals for one month.",
        "properties": {
          "period": {
            "type": "string",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
            "example": "2026-05"
          },
          "tlds": {
            "type": "integer",
            "minimum": 0,
            "description": "TLDs with a figure that month."
          },
          "domains": {
            "type": "integer",
            "minimum": 0,
            "description": "Their domains summed."
          },
          "registrars": {
            "type": "integer",
            "minimum": 0,
            "description": "Registrars with names under management that month."
          },
          "registries": {
            "type": "integer",
            "minimum": 0,
            "description": "Registry operators with names under management that month."
          },
          "kinds": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "enum": [
                    "cctld",
                    "idn-cctld",
                    "legacy-gtld",
                    "new-gtld",
                    "sponsored",
                    "infra",
                    "unknown"
                  ]
                },
                "tlds": {
                  "type": "integer",
                  "minimum": 0
                },
                "domains": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "required": [
                "kind",
                "tlds",
                "domains"
              ],
              "additionalProperties": false
            }
          },
          "zone": {
            "type": "object",
            "description": "The newest zone night: the TLDs in it and their names.",
            "properties": {
              "date": {
                "type": "string",
                "format": "date",
                "example": "2026-09-18"
              },
              "tlds": {
                "type": "integer",
                "minimum": 0
              },
              "domains": {
                "type": "integer",
                "minimum": 0
              }
            },
            "required": [
              "date",
              "tlds",
              "domains"
            ],
            "additionalProperties": false
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "meta": {
            "$ref": "#/components/schemas/StatsMeta",
            "description": "On the top-level object of a response only."
          }
        },
        "required": [
          "period",
          "tlds",
          "domains",
          "registrars",
          "registries",
          "kinds",
          "url"
        ],
        "additionalProperties": false
      },
      "Tld": {
        "type": "object",
        "description": "A top-level domain.",
        "properties": {
          "tld": {
            "type": "string",
            "description": "The A-label, lower case. Also the id.",
            "example": "xyz"
          },
          "unicode": {
            "type": "string",
            "description": "IDN only: the native-script form."
          },
          "kind": {
            "type": "string",
            "enum": [
              "cctld",
              "idn-cctld",
              "legacy-gtld",
              "new-gtld",
              "sponsored",
              "infra",
              "unknown"
            ]
          },
          "category": {
            "type": "string",
            "enum": [
              "brand",
              "commerce",
              "culture",
              "ai-tech",
              "geo",
              "infra",
              "other"
            ]
          },
          "delegated": {
            "type": "string",
            "description": "Root-zone delegation date, at the precision known: YYYY-MM-DD, or YYYY-MM or YYYY for a few old TLDs."
          },
          "removed": {
            "type": "string",
            "description": "Date removed from the root, same precision rule. Absent for a live TLD."
          },
          "registry": {
            "$ref": "#/components/schemas/StatsRef",
            "description": "The operator today."
          },
          "phases": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TldPhase"
            },
            "description": "On the single TLD only."
          },
          "domains": {
            "$ref": "#/components/schemas/StatsDomains",
            "description": "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."
          },
          "zone": {
            "$ref": "#/components/schemas/TldZone"
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Its page on namedesk.app."
          },
          "meta": {
            "$ref": "#/components/schemas/StatsMeta",
            "description": "On the top-level object of a response only."
          }
        },
        "required": [
          "tld",
          "kind",
          "url"
        ],
        "additionalProperties": false
      },
      "TldMonth": {
        "type": "object",
        "description": "One month of a TLD.",
        "properties": {
          "period": {
            "type": "string",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
            "example": "2026-05"
          },
          "domains": {
            "type": "integer",
            "minimum": 0
          },
          "change": {
            "type": "integer"
          },
          "change_year": {
            "type": "integer"
          },
          "adds": {
            "type": "integer",
            "minimum": 0
          },
          "renews": {
            "type": "integer",
            "minimum": 0
          },
          "deletes": {
            "type": "integer",
            "minimum": 0
          },
          "transfers_in": {
            "type": "integer",
            "minimum": 0
          },
          "transfers_out": {
            "type": "integer",
            "minimum": 0
          },
          "restores": {
            "type": "integer",
            "minimum": 0
          },
          "registrars": {
            "type": "integer",
            "minimum": 0,
            "description": "How many registrars held names in the TLD that month. Absent where there is no registrar breakdown (ccTLDs)."
          },
          "estimated": {
            "type": "boolean",
            "const": true,
            "description": "The figure is not from an ICANN monthly report; such a month carries only `domains` and `change`."
          }
        },
        "required": [
          "period"
        ],
        "additionalProperties": false
      },
      "TldPhase": {
        "type": "object",
        "description": "A launch phase. Dates are absent when the source gives none.",
        "properties": {
          "phase": {
            "type": "string",
            "enum": [
              "sunrise",
              "claims",
              "landrush",
              "limited_registration",
              "qualified_launch",
              "exclusive_registration",
              "approved_launch",
              "general_availability"
            ]
          },
          "start": {
            "type": "string",
            "format": "date"
          },
          "end": {
            "type": "string",
            "format": "date",
            "description": "Absent for a phase with no end date (general availability)."
          }
        },
        "required": [
          "phase"
        ],
        "additionalProperties": false
      },
      "TldRegistrar": {
        "type": "object",
        "description": "One registrar's holding in a TLD for a month.",
        "properties": {
          "registrar": {
            "$ref": "#/components/schemas/StatsRef"
          },
          "domains": {
            "type": "integer",
            "minimum": 0
          },
          "share_pct": {
            "type": "number",
            "description": "Percent of the TLD's domains that month, two decimals."
          },
          "adds": {
            "type": "integer",
            "minimum": 0
          },
          "renews": {
            "type": "integer",
            "minimum": 0
          },
          "deletes": {
            "type": "integer",
            "minimum": 0
          },
          "transfers_in": {
            "type": "integer",
            "minimum": 0
          },
          "transfers_out": {
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [
          "registrar",
          "domains"
        ],
        "additionalProperties": false
      },
      "TldZone": {
        "type": "object",
        "description": "The newest night of the TLD's zone file. May be withdrawn if the registry revokes zone access.",
        "properties": {
          "date": {
            "type": "string",
            "format": "date",
            "example": "2026-09-18"
          },
          "count": {
            "type": "integer",
            "minimum": 0,
            "description": "Names in the zone that night."
          },
          "for_sale": {
            "type": "integer",
            "minimum": 0,
            "description": "Names whose nameservers are a marketplace's; present when the night was classified."
          },
          "parked": {
            "type": "integer",
            "minimum": 0,
            "description": "Names on a parking service; present when the night was classified."
          }
        },
        "required": [
          "date",
          "count"
        ],
        "additionalProperties": false
      },
      "ZoneDay": {
        "type": "object",
        "description": "One night of a TLD's zone file.",
        "properties": {
          "date": {
            "type": "string",
            "format": "date",
            "example": "2026-09-18"
          },
          "domains": {
            "type": "integer",
            "minimum": 0,
            "description": "Names in the zone that night."
          },
          "entered": {
            "type": "integer",
            "minimum": 0,
            "description": "Names that appeared since the night before. Absent on the first night and after a gap."
          },
          "left": {
            "type": "integer",
            "minimum": 0,
            "description": "Names that dropped out since the night before. Absent on the first night and after a gap."
          },
          "for_sale": {
            "type": "integer",
            "minimum": 0
          },
          "parked": {
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [
          "date",
          "domains"
        ],
        "additionalProperties": false
      },
      "RoundApplicationRef": {
        "type": "object",
        "description": "An application, by id and string; the full object is at /v1/stats/applications/{id}.",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
            "example": "3f0c9a52-6d1e-4b7a-9c2f-1a8e5d7b4c10"
          },
          "string": {
            "type": "string",
            "example": "agent"
          }
        },
        "required": [
          "id",
          "string"
        ],
        "additionalProperties": false
      },
      "RoundApplicantRef": {
        "type": "object",
        "description": "An applicant: one legal entity that applied. `name` is the company it belongs to, which several legal entities can share. The full object is at /v1/stats/applicants/{id}.",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
            "example": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d"
          },
          "name": {
            "type": "string",
            "example": "Example Registry Inc."
          },
          "legal_name": {
            "type": "string",
            "description": "The legal entity's name as ICANN lists it. Absent for a party not on ICANN's list.",
            "example": "Example Registry Holdings LLC"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "additionalProperties": false
      },
      "RoundSwitch": {
        "type": "object",
        "description": "The string an application switched to or from, with the date.",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
          },
          "string": {
            "type": "string"
          },
          "date": {
            "type": "string",
            "format": "date",
            "description": "The day of the switch."
          }
        },
        "required": [
          "id",
          "string"
        ],
        "additionalProperties": false
      },
      "RoundSource": {
        "type": "object",
        "description": "The source.",
        "properties": {
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "example": "https://example.com/news/we-applied"
          },
          "publisher": {
            "type": "string",
            "description": "On applications only."
          }
        },
        "required": [
          "url"
        ],
        "additionalProperties": false
      },
      "RoundApplication": {
        "type": "object",
        "description": "An application in the 2026 new gTLD round: one 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 items of their own, with status `replacement`, `deactivated` or `variant`, and name the application they belong to in `primary`; the application names them in `replacement`, `deactivated_replacement` and `variants`. A backup string that several applications name is an item for each of them.",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
            "description": "Our id, stable for v1.",
            "example": "3f0c9a52-6d1e-4b7a-9c2f-1a8e5d7b4c10"
          },
          "round": {
            "type": "integer",
            "enum": [
              2026
            ]
          },
          "string": {
            "type": "string",
            "description": "The string applied for, its A-label.",
            "example": "agent"
          },
          "applicant": {
            "$ref": "#/components/schemas/RoundApplicantRef",
            "description": "Absent when the applicant is not known."
          },
          "status": {
            "type": "string",
            "enum": [
              "catalogued",
              "rumored",
              "announced",
              "confirmed",
              "ghost",
              "retracted",
              "withdrawn",
              "in-contention",
              "auction-lost",
              "will-not-proceed",
              "delegated",
              "sunrise",
              "launched",
              "terminated",
              "replacement",
              "variant",
              "switched",
              "deactivated"
            ],
            "description": "Where 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`."
          },
          "announced": {
            "type": "string",
            "format": "date",
            "description": "The day the applicant announced it applied."
          },
          "contention": {
            "type": "integer",
            "minimum": 0,
            "description": "How many applicants are pursuing the string: those with an application live on ICANN's list (`confirmed`, `in-contention`, `delegated`, `sunrise`, `launched`)."
          },
          "summary": {
            "type": "string"
          },
          "source": {
            "$ref": "#/components/schemas/RoundSource",
            "description": "The announcement or list where the application first appeared."
          },
          "icann_application_id": {
            "type": "string",
            "description": "ICANN's application id, once ICANN has published it."
          },
          "contention_set": {
            "type": "string",
            "description": "ICANN's id for the set of applications competing for the same string."
          },
          "icann_types": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": ["brand", "community", "geographic", "idn", "applicant-support", "variant-only"]
            },
            "description": "ICANN'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."
          },
          "primary": {
            "$ref": "#/components/schemas/RoundApplicationRef",
            "description": "On a `replacement`, `deactivated` or `variant`: the application it belongs to."
          },
          "replacement": {
            "$ref": "#/components/schemas/RoundApplicationRef",
            "description": "The application's replacement string, while it is unused."
          },
          "deactivated_replacement": {
            "$ref": "#/components/schemas/RoundApplicationRef",
            "description": "The application's replacement string that ICANN's list shows as deactivated."
          },
          "variants": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RoundApplicationRef"
            },
            "description": "The application's IDN variant labels."
          },
          "switched_to": {
            "$ref": "#/components/schemas/RoundSwitch",
            "description": "On a `switched` application: the replacement string it moved to."
          },
          "switched_from": {
            "$ref": "#/components/schemas/RoundSwitch",
            "description": "On the application a switch moved to: the string it moved from."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "The string's page on namedesk.app. Absent for the few strings without a page."
          },
          "meta": {
            "$ref": "#/components/schemas/StatsMeta",
            "description": "On the top-level object of a response only."
          }
        },
        "required": [
          "id",
          "round",
          "string",
          "status",
          "contention",
          "source"
        ],
        "additionalProperties": false
      },
      "RoundString": {
        "type": "object",
        "description": "A string in the 2026 round: applied for, named as a backup, or claimed and abandoned. 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.",
        "properties": {
          "string": {
            "type": "string",
            "description": "The A-label.",
            "example": "agent"
          },
          "unicode": {
            "type": "string",
            "description": "IDN only: the native-script form."
          },
          "round": {
            "type": "integer",
            "enum": [
              2026
            ]
          },
          "category": {
            "type": "string",
            "enum": [
              "ai-tech",
              "crypto",
              "commerce",
              "geo",
              "brand",
              "culture",
              "infra",
              "other"
            ],
            "description": "The AI assessment's leading category once the string is assessed. Absent when not known."
          },
          "status": {
            "type": "string",
            "enum": [
              "catalogued",
              "rumored",
              "announced",
              "confirmed",
              "ghost",
              "retracted",
              "withdrawn",
              "in-contention",
              "auction-lost",
              "will-not-proceed",
              "delegated",
              "sunrise",
              "launched",
              "terminated",
              "replacement",
              "variant",
              "switched",
              "deactivated"
            ],
            "description": "The furthest stage any of its applications has reached."
          },
          "applications": {
            "type": "integer",
            "minimum": 0,
            "description": "Applications for this string. Only an application live on ICANN's list counts as an application: `confirmed`, `in-contention`, `delegated`, `sunrise`, `launched`."
          },
          "contention": {
            "type": "integer",
            "minimum": 0,
            "description": "How many applicants are pursuing it. Two or more means contested."
          },
          "first_seen": {
            "type": "string",
            "format": "date",
            "description": "The day namedesk first listed the string."
          },
          "score": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "description": "The 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."
          },
          "verdict": {
            "type": "string",
            "description": "The assessment's one-sentence verdict. Absent until the string is assessed."
          },
          "applicants": {
            "type": "array",
            "description": "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.",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
                },
                "name": {
                  "type": "string",
                  "description": "The company. Several legal entities can share it."
                },
                "legal_name": {
                  "type": "string",
                  "description": "The legal entity's name as ICANN lists it. Absent for a party not on ICANN's list."
                },
                "role": {
                  "type": "string",
                  "enum": [
                    "applying",
                    "replacement",
                    "variant",
                    "switched",
                    "deactivated",
                    "abandoned",
                    "unconfirmed",
                    "ended"
                  ],
                  "description": "`applying`: has an application for the string live on ICANN's list. `replacement`, `variant`: holds it as the replacement string or an IDN variant label of another application. `switched`: moved its application away from it. `deactivated`: named it as a backup string that ICANN's list shows as deactivated. `abandoned`: announced it, but is not on ICANN's list for it. `unconfirmed`: said or reported to have applied for it, not on ICANN's list. `ended`: applied for it, and the application ended (retracted, withdrawn, lost at auction, not proceeding, terminated)."
                }
              },
              "required": [
                "id",
                "name",
                "role"
              ],
              "additionalProperties": false
            }
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "The string's page on namedesk.app. Absent for the few strings without a page."
          },
          "meta": {
            "$ref": "#/components/schemas/StatsMeta",
            "description": "On the top-level object of a response only."
          }
        },
        "required": [
          "string",
          "round",
          "status",
          "applications",
          "contention",
          "first_seen",
          "applicants"
        ],
        "additionalProperties": false
      },
      "RoundApplicant": {
        "type": "object",
        "description": "An applicant in the 2026 round: one legal entity that applied, or, in the list of abandoned parties, a party whose every claim was abandoned. Several legal entities can belong to one company, and then share its `name`.",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
            "description": "Our id, stable for v1.",
            "example": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d"
          },
          "name": {
            "type": "string",
            "description": "The company the legal entity belongs to.",
            "example": "Example Registry Inc."
          },
          "legal_name": {
            "type": "string",
            "description": "The legal entity's name as ICANN lists it. Absent for a party not on ICANN's list.",
            "example": "Example Registry Holdings LLC"
          },
          "website": {
            "type": "string",
            "description": "When known."
          },
          "applications": {
            "type": "integer",
            "minimum": 0,
            "description": "Its applications in the round. Only an application live on ICANN's list counts as an application: `confirmed`, `in-contention`, `delegated`, `sunrise`, `launched`."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "The company's page on namedesk.app, with every legal entity it applies through."
          },
          "meta": {
            "$ref": "#/components/schemas/StatsMeta",
            "description": "On the top-level object of a response only."
          }
        },
        "required": [
          "id",
          "name",
          "applications"
        ],
        "additionalProperties": false
      },
      "RoundChange": {
        "type": "object",
        "description": "One change to the round data.",
        "properties": {
          "at": {
            "type": "string",
            "format": "date-time",
            "description": "When namedesk made the change."
          },
          "string": {
            "type": "string"
          },
          "applicant": {
            "$ref": "#/components/schemas/RoundApplicantRef"
          },
          "change": {
            "type": "string",
            "enum": [
              "recorded",
              "status_changed",
              "corrected",
              "noted"
            ],
            "description": "`recorded`: a new application was listed. `status_changed`: its status moved. `corrected`: a fact was corrected or removed on request. `noted`: a note was added."
          },
          "status": {
            "type": "string",
            "enum": [
              "catalogued",
              "rumored",
              "announced",
              "confirmed",
              "ghost",
              "retracted",
              "withdrawn",
              "in-contention",
              "auction-lost",
              "will-not-proceed",
              "delegated",
              "sunrise",
              "launched",
              "terminated",
              "replacement",
              "variant",
              "switched",
              "deactivated"
            ],
            "description": "On `status_changed`: the new status."
          },
          "source": {
            "$ref": "#/components/schemas/RoundSource",
            "description": "The announcement or list behind the change, when there is one."
          }
        },
        "required": [
          "at",
          "string",
          "change"
        ],
        "additionalProperties": false
      },
      "RoundMilestone": {
        "type": "object",
        "description": "A milestone on ICANN's calendar for the round. A date (YYYY-MM-DD) where ICANN gave a day, a UTC timestamp where it gave a time.",
        "properties": {
          "milestone": {
            "type": "string",
            "enum": [
              "reveal_day",
              "replacement_period",
              "string_confirmation_day",
              "refund_deadline",
              "objections",
              "icann_closed",
              "prioritization_draw"
            ]
          },
          "start": {
            "type": "string",
            "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}:[0-9]{2}Z)?$"
          },
          "end": {
            "type": "string",
            "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}:[0-9]{2}Z)?$",
            "description": "When it closes: the closing moment for a timestamp, the last day for a date."
          },
          "when": {
            "type": "string",
            "description": "How ICANN describes a milestone it has not dated yet."
          }
        },
        "required": [
          "milestone"
        ],
        "additionalProperties": false
      },
      "Round": {
        "type": "object",
        "description": "The 2026 new gTLD round at a glance.",
        "properties": {
          "round": {
            "type": "integer",
            "enum": [
              2026
            ]
          },
          "phase": {
            "type": "string",
            "enum": [
              "before_reveal",
              "revealed",
              "replacement_period",
              "awaiting_confirmation",
              "objections",
              "evaluation"
            ],
            "description": "Where 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."
          },
          "milestones": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RoundMilestone"
            }
          },
          "counts": {
            "type": "object",
            "properties": {
              "applications": {
                "type": "integer",
                "minimum": 0,
                "description": "Only an application live on ICANN's list counts as an application: `confirmed`, `in-contention`, `delegated`, `sunrise`, `launched`."
              },
              "strings": {
                "type": "integer",
                "minimum": 0,
                "description": "Strings with at least one application."
              },
              "applicants": {
                "type": "integer",
                "minimum": 0,
                "description": "Legal entities with at least one application in the round: the list at /v1/stats/applicants. Several can belong to one company."
              },
              "companies": {
                "type": "integer",
                "minimum": 0,
                "description": "Companies with at least one application: legal entities that belong to one company (its shells and subsidiaries) count once."
              },
              "abandoned_applicants": {
                "type": "integer",
                "minimum": 0,
                "description": "Parties whose every claim in the round is abandoned: announced, but not on ICANN's list. Not part of `applicants`; the list at /v1/stats/applicants?abandoned=true."
              },
              "contention_sets": {
                "type": "integer",
                "minimum": 0,
                "description": "ICANN contention sets among the applications."
              }
            },
            "required": [
              "applications",
              "strings",
              "applicants",
              "companies",
              "abandoned_applicants",
              "contention_sets"
            ],
            "additionalProperties": false
          },
          "revealed": {
            "type": "boolean",
            "description": "True once ICANN's published list is in the API."
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "meta": {
            "$ref": "#/components/schemas/StatsMeta",
            "description": "On the top-level object of a response only."
          }
        },
        "required": [
          "round",
          "phase",
          "milestones",
          "counts",
          "revealed",
          "url"
        ],
        "additionalProperties": false
      }
    }
  }
}
