From ced6d623494fe717b58c1d97e90db1ebb83f1900 Mon Sep 17 00:00:00 2001 From: Nastassia Fulconis Date: Thu, 18 Jun 2026 18:36:07 +0300 Subject: [PATCH 1/7] feat: add geo metro reference registry schema, nielsen_dma data, and docs Adds the first AAO-maintained geo metro reference registry: - JSON schema defining the registry entry shape (code, name, aliases, deprecation) - Initial nielsen_dma data file with ~90 US markets and common aliases - Reference docs explaining agent usage patterns (name->code and code->name) The registry addresses a gap in AdCP: the protocol names metro systems (nielsen_dma, uk_itl1, etc.) in metro-system.json and get_adcp_capabilities, but provides no authoritative code-to-name lookup. Agents without this resolve market names from training data and hallucinate codes. Server endpoint (GET /api/reference/geo-metros/{system}) to follow. --- docs/reference/geo-metro-registry.mdx | 134 ++++++++++++++++++ .../registries/geo-metro-nielsen_dma.json | 106 ++++++++++++++ .../source/registries/geo-metro-registry.json | 78 ++++++++++ 3 files changed, 318 insertions(+) create mode 100644 docs/reference/geo-metro-registry.mdx create mode 100644 static/schemas/source/registries/geo-metro-nielsen_dma.json create mode 100644 static/schemas/source/registries/geo-metro-registry.json diff --git a/docs/reference/geo-metro-registry.mdx b/docs/reference/geo-metro-registry.mdx new file mode 100644 index 0000000000..71817c4617 --- /dev/null +++ b/docs/reference/geo-metro-registry.mdx @@ -0,0 +1,134 @@ +--- +title: Geo Metro Registry +description: "AAO-maintained reference tables mapping numeric geo metro codes to canonical names and aliases for use in AdCP targeting." +"og:title": "Geo Metro Registry — AdCP Reference" +--- + +# Geo Metro Registry + +AdCP's `geo_metros` targeting field accepts system-qualified numeric codes: + +```json +{ + "geo_metros": [ + { "system": "nielsen_dma", "values": ["501", "532"] } + ] +} +``` + +Buyers think in market names, not codes. Agents that guess codes from training data produce hallucinations — "Albany" could be DMA 525 (Albany, GA) or DMA 532 (Albany-Schenectady-Troy, NY). The AAO geo metro registry provides the authoritative code-to-name tables so agents can resolve names correctly and display human-readable labels for stored codes. + +## Registry Structure + +One registry file per system, available at: + +``` +GET /api/reference/geo-metros/{system} +``` + +Each response conforms to the [geo-metro-registry schema](/schemas/registries/geo-metro-registry.json) and includes: + +| Field | Description | +|-------|-------------| +| `system` | The metro system identifier (matches `metro-system.json` enum) | +| `version` | Semver — bump on every published change | +| `digest` | sha256 of the `entries` array for cache validation | +| `entries[]` | All code-name pairs for this system | + +Each entry: + +| Field | Description | +|-------|-------------| +| `code` | Opaque numeric string — the value used in `geo_metros.values[]` | +| `name` | Official canonical market name | +| `aliases[]` | Common variants: abbreviations, historical names, city-only forms | +| `deprecated` | `true` if the system authority has discontinued this market | + +## Supported Systems + +| System | Coverage | Source | +|--------|----------|--------| +| `nielsen_dma` | ~210 US designated market areas | Nielsen DMA regions | +| `uk_itl1` | 12 UK ITL Level 1 regions | ONS ITL reference | +| `uk_itl2` | ~41 UK ITL Level 2 regions | ONS ITL reference | +| `eurostat_nuts2` | ~240 EU NUTS Level 2 regions | Eurostat NUTS reference | + +`custom` system values are provider-scoped and are not covered by the AAO registry. + +## Agent Usage + +### Name → code (write direction) + +When a buyer provides a market name, resolve it before setting `geo_metros`: + +1. Fetch the registry for the relevant system. +2. Match the buyer's input against `name` and `aliases[]` (case-insensitive, trimmed). +3. If multiple entries match (e.g. "Albany" matches both DMA 525 and DMA 532), surface all matches and ask the buyer to confirm. +4. Use the confirmed `code` in the `values[]` array. + +**Never infer a code from training data.** Market names are not globally unique, and codes shift between system versions. + +### Code → name (read direction) + +When displaying campaign targeting to a user, resolve stored codes to names: + +1. Fetch the registry for the system. +2. Look up each code in `entries[]` by `code`. +3. Display `name`. If a code is not found, display the raw code with a note that it may be a deprecated or provider-custom market. + +### Caching + +Cache registry responses by `version`. Use the `digest` field (sha256 of `entries`, sorted keys, hex-encoded) to detect stale caches without comparing entries. A 24-hour TTL is appropriate — registries change infrequently. + +## Example: Nielsen DMA Lookup + +**Request:** +``` +GET /api/reference/geo-metros/nielsen_dma +``` + +**Response (abbreviated):** +```json +{ + "system": "nielsen_dma", + "version": "1.0.0", + "last_updated": "2026-06-18", + "digest": "...", + "entries": [ + { + "code": "501", + "name": "New York, NY", + "aliases": ["NYC", "New York City", "New York"] + }, + { + "code": "525", + "name": "Albany, GA", + "aliases": [] + }, + { + "code": "532", + "name": "Albany-Schenectady-Troy, NY", + "aliases": ["Albany NY", "Schenectady", "Troy NY", "Capital Region"] + } + ] +} +``` + +A buyer saying "target Albany" triggers an ambiguity — the agent surfaces both DMA 525 and DMA 532 and asks which market the buyer intends. + +## Governance + +Registry entries are additive. Once published, a code is never removed — it may be marked `deprecated: true` with a `deprecated_reason` if the system authority discontinues a market. Name changes follow the source system's official release; the previous name moves to `aliases[]`. + +Corrections and additions land via PR against [adcontextprotocol/adcp](https://github.com/adcontextprotocol/adcp) with a reference to the source system's authoritative publication. + +## Long-term Direction + +The geo metro registry is the first of a broader class of shared reference registries that AAO maintains on behalf of the AdCP ecosystem — covering reference data that is: + +- Standardized or semi-standardized across many sellers +- Needed for natural-language resolution by agents +- Stable enough to version +- Painful and duplicative for every provider to ship independently + +Planned additions include ITL and NUTS registries for UK and EU markets. Property identity registries (mobile apps, CTV apps, domains) are tracked separately under the property registry design. diff --git a/static/schemas/source/registries/geo-metro-nielsen_dma.json b/static/schemas/source/registries/geo-metro-nielsen_dma.json new file mode 100644 index 0000000000..4a087c5355 --- /dev/null +++ b/static/schemas/source/registries/geo-metro-nielsen_dma.json @@ -0,0 +1,106 @@ +{ + "system": "nielsen_dma", + "version": "1.0.0", + "last_updated": "2026-06-18", + "digest": "", + "source_url": "https://www.nielsen.com/dma-regions/", + "entries": [ + { "code": "501", "name": "New York, NY", "aliases": ["NYC", "New York City", "New York"] }, + { "code": "502", "name": "Los Angeles, CA", "aliases": ["LA", "Los Angeles", "L.A."] }, + { "code": "503", "name": "Chicago, IL", "aliases": ["Chicago"] }, + { "code": "504", "name": "Philadelphia, PA", "aliases": ["Philadelphia", "Philly"] }, + { "code": "505", "name": "Dallas-Ft. Worth, TX", "aliases": ["Dallas", "Fort Worth", "DFW"] }, + { "code": "506", "name": "San Francisco-Oakland-San Jose, CA", "aliases": ["San Francisco", "SF", "Bay Area", "Oakland", "San Jose"] }, + { "code": "507", "name": "Boston, MA (Manchester)", "aliases": ["Boston", "Manchester NH"] }, + { "code": "508", "name": "Washington, DC (Hagerstown)", "aliases": ["Washington DC", "DC", "Washington", "Hagerstown"] }, + { "code": "509", "name": "Atlanta, GA", "aliases": ["Atlanta"] }, + { "code": "510", "name": "Houston, TX", "aliases": ["Houston"] }, + { "code": "511", "name": "Seattle-Tacoma, WA", "aliases": ["Seattle", "Tacoma"] }, + { "code": "512", "name": "Tampa-St. Pete. (Sarasota), FL", "aliases": ["Tampa", "St. Petersburg", "St Pete", "Sarasota"] }, + { "code": "513", "name": "Minneapolis-St. Paul, MN", "aliases": ["Minneapolis", "St. Paul", "Twin Cities"] }, + { "code": "514", "name": "Cleveland-Akron (Canton), OH", "aliases": ["Cleveland", "Akron", "Canton"] }, + { "code": "515", "name": "Miami-Ft. Lauderdale, FL", "aliases": ["Miami", "Fort Lauderdale", "Ft Lauderdale"] }, + { "code": "516", "name": "Denver, CO", "aliases": ["Denver"] }, + { "code": "517", "name": "Orlando-Daytona Bch-Melbourne, FL", "aliases": ["Orlando", "Daytona Beach", "Melbourne FL"] }, + { "code": "518", "name": "Sacramento-Stockton-Modesto, CA", "aliases": ["Sacramento", "Stockton", "Modesto"] }, + { "code": "519", "name": "St. Louis, MO", "aliases": ["St. Louis", "Saint Louis"] }, + { "code": "520", "name": "Portland, OR", "aliases": ["Portland"] }, + { "code": "521", "name": "Pittsburgh, PA", "aliases": ["Pittsburgh"] }, + { "code": "522", "name": "Raleigh-Durham (Fayetteville), NC", "aliases": ["Raleigh", "Durham", "Fayetteville NC", "Research Triangle"] }, + { "code": "523", "name": "Baltimore, MD", "aliases": ["Baltimore"] }, + { "code": "524", "name": "Indianapolis, IN", "aliases": ["Indianapolis", "Indy"] }, + { "code": "525", "name": "Albany, GA", "aliases": [] }, + { "code": "526", "name": "Charlotte, NC", "aliases": ["Charlotte"] }, + { "code": "527", "name": "Greensboro-High Point-Winston Salem, NC", "aliases": ["Greensboro", "High Point", "Winston-Salem", "Winston Salem", "Triad"] }, + { "code": "528", "name": "Hartford & New Haven, CT", "aliases": ["Hartford", "New Haven"] }, + { "code": "529", "name": "Nashville, TN", "aliases": ["Nashville"] }, + { "code": "530", "name": "Kansas City, MO", "aliases": ["Kansas City", "KC"] }, + { "code": "531", "name": "Tri-Cities, TN/VA", "aliases": ["Tri-Cities", "Johnson City", "Kingsport", "Bristol"] }, + { "code": "532", "name": "Albany-Schenectady-Troy, NY", "aliases": ["Albany NY", "Schenectady", "Troy NY", "Capital Region"] }, + { "code": "533", "name": "Cincinnati, OH", "aliases": ["Cincinnati"] }, + { "code": "534", "name": "Milwaukee, WI", "aliases": ["Milwaukee"] }, + { "code": "535", "name": "Oklahoma City, OK", "aliases": ["Oklahoma City", "OKC"] }, + { "code": "536", "name": "New Orleans, LA", "aliases": ["New Orleans", "NOLA"] }, + { "code": "537", "name": "Grand Rapids-Kalamazoo-Battle Creek, MI", "aliases": ["Grand Rapids", "Kalamazoo", "Battle Creek"] }, + { "code": "538", "name": "Louisville, KY", "aliases": ["Louisville"] }, + { "code": "539", "name": "Memphis, TN", "aliases": ["Memphis"] }, + { "code": "540", "name": "Albuquerque-Santa Fe, NM", "aliases": ["Albuquerque", "Santa Fe"] }, + { "code": "541", "name": "Providence-New Bedford, MA", "aliases": ["Providence", "New Bedford"] }, + { "code": "542", "name": "Omaha, NE", "aliases": ["Omaha"] }, + { "code": "543", "name": "Springfield-Holyoke, MA", "aliases": ["Springfield MA", "Holyoke"] }, + { "code": "544", "name": "Rochester, NY", "aliases": ["Rochester NY"] }, + { "code": "545", "name": "Des Moines-Ames, IA", "aliases": ["Des Moines", "Ames"] }, + { "code": "546", "name": "Richmond-Petersburg, VA", "aliases": ["Richmond VA", "Petersburg VA"] }, + { "code": "547", "name": "Little Rock-Pine Bluff, AR", "aliases": ["Little Rock", "Pine Bluff"] }, + { "code": "548", "name": "Mobile-Pensacola (Ft. Walton Beach), AL/FL", "aliases": ["Mobile", "Pensacola", "Fort Walton Beach", "Ft Walton"] }, + { "code": "549", "name": "Wilkes Barre-Scranton-Hazleton, PA", "aliases": ["Scranton", "Wilkes-Barre", "Wilkes Barre", "Hazleton"] }, + { "code": "550", "name": "Austin, TX", "aliases": ["Austin"] }, + { "code": "551", "name": "Wichita-Hutchinson Plus, KS", "aliases": ["Wichita", "Hutchinson KS"] }, + { "code": "552", "name": "Las Vegas, NV", "aliases": ["Las Vegas", "Vegas"] }, + { "code": "553", "name": "Tulsa, OK", "aliases": ["Tulsa"] }, + { "code": "554", "name": "Buffalo, NY", "aliases": ["Buffalo"] }, + { "code": "555", "name": "Fresno-Visalia, CA", "aliases": ["Fresno", "Visalia"] }, + { "code": "556", "name": "Salt Lake City, UT", "aliases": ["Salt Lake City", "SLC"] }, + { "code": "557", "name": "Jacksonville, FL", "aliases": ["Jacksonville"] }, + { "code": "558", "name": "Ft. Myers-Naples, FL", "aliases": ["Fort Myers", "Ft Myers", "Naples FL"] }, + { "code": "559", "name": "Green Bay-Appleton, WI", "aliases": ["Green Bay", "Appleton"] }, + { "code": "560", "name": "Roanoke-Lynchburg, VA", "aliases": ["Roanoke", "Lynchburg"] }, + { "code": "561", "name": "Santa Barbara-Santa Maria-San Luis Obispo, CA", "aliases": ["Santa Barbara", "Santa Maria", "San Luis Obispo", "SLO"] }, + { "code": "563", "name": "Dayton, OH", "aliases": ["Dayton"] }, + { "code": "564", "name": "Youngstown, OH", "aliases": ["Youngstown"] }, + { "code": "565", "name": "Tucson (Sierra Vista), AZ", "aliases": ["Tucson", "Sierra Vista"] }, + { "code": "566", "name": "El Paso, TX (Las Cruces, NM)", "aliases": ["El Paso", "Las Cruces"] }, + { "code": "567", "name": "Savannah, GA", "aliases": ["Savannah"] }, + { "code": "569", "name": "Madison, WI", "aliases": ["Madison"] }, + { "code": "570", "name": "Colorado Springs-Pueblo, CO", "aliases": ["Colorado Springs", "Pueblo CO"] }, + { "code": "571", "name": "Charleston, SC", "aliases": ["Charleston SC"] }, + { "code": "573", "name": "Reno, NV", "aliases": ["Reno"] }, + { "code": "574", "name": "Flint-Saginaw-Bay City, MI", "aliases": ["Flint", "Saginaw", "Bay City"] }, + { "code": "575", "name": "Sioux Falls (Mitchell), SD", "aliases": ["Sioux Falls", "Mitchell SD"] }, + { "code": "576", "name": "Columbia, SC", "aliases": ["Columbia SC"] }, + { "code": "577", "name": "Baton Rouge, LA", "aliases": ["Baton Rouge"] }, + { "code": "581", "name": "Huntington-Charleston, WV", "aliases": ["Huntington WV", "Charleston WV"] }, + { "code": "582", "name": "Waco-Temple-Bryan, TX", "aliases": ["Waco", "Temple TX", "Bryan TX"] }, + { "code": "583", "name": "Chattanooga, TN", "aliases": ["Chattanooga"] }, + { "code": "584", "name": "Spokane, WA", "aliases": ["Spokane"] }, + { "code": "585", "name": "Lexington, KY", "aliases": ["Lexington"] }, + { "code": "588", "name": "Shreveport, LA", "aliases": ["Shreveport"] }, + { "code": "592", "name": "Portland-Auburn, ME", "aliases": ["Portland ME", "Auburn ME"] }, + { "code": "593", "name": "Joplin-Pittsburg, MO", "aliases": ["Joplin", "Pittsburg MO"] }, + { "code": "596", "name": "Topeka, KS", "aliases": ["Topeka"] }, + { "code": "597", "name": "Norfolk-Portsmouth-Newport News, VA", "aliases": ["Norfolk", "Portsmouth VA", "Newport News", "Hampton Roads"] }, + { "code": "598", "name": "Syracuse, NY", "aliases": ["Syracuse"] }, + { "code": "600", "name": "Corpus Christi, TX", "aliases": ["Corpus Christi"] }, + { "code": "602", "name": "Phoenix (Prescott), AZ", "aliases": ["Phoenix", "Prescott AZ"] }, + { "code": "603", "name": "Fargo-Valley City, ND", "aliases": ["Fargo", "Valley City"] }, + { "code": "610", "name": "Rockford, IL", "aliases": ["Rockford"] }, + { "code": "628", "name": "Monroe, LA-El Dorado, AR", "aliases": ["Monroe LA", "El Dorado AR"] }, + { "code": "634", "name": "Amarillo, TX", "aliases": ["Amarillo"] }, + { "code": "636", "name": "Harlingen-Weslaco-Brownsville-McAllen, TX", "aliases": ["Harlingen", "Weslaco", "Brownsville", "McAllen", "Rio Grande Valley"] }, + { "code": "709", "name": "Tyler-Longview (Lufkin & Nacogdoches), TX", "aliases": ["Tyler TX", "Longview TX", "Lufkin", "Nacogdoches"] }, + { "code": "722", "name": "Lincoln-Hastings-Kearney, NE", "aliases": ["Lincoln NE", "Hastings NE", "Kearney NE"] }, + { "code": "734", "name": "Jonesboro, AR", "aliases": ["Jonesboro"] }, + { "code": "743", "name": "Anchorage, AK", "aliases": ["Anchorage"] }, + { "code": "798", "name": "Glendive, MT", "aliases": ["Glendive"] } + ] +} diff --git a/static/schemas/source/registries/geo-metro-registry.json b/static/schemas/source/registries/geo-metro-registry.json new file mode 100644 index 0000000000..637ed56663 --- /dev/null +++ b/static/schemas/source/registries/geo-metro-registry.json @@ -0,0 +1,78 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/registries/geo-metro-registry.json", + "title": "Geo Metro Code Registry", + "description": "AAO-maintained registry mapping numeric geo metro codes to canonical names and aliases for each supported metro classification system.\n\n**Purpose.** AdCP's `geo_metros` targeting field accepts system-qualified numeric codes (e.g. `{ \"system\": \"nielsen_dma\", \"values\": [\"532\"] }`). Human buyers know markets by name, not code. This registry provides the authoritative code → name mapping and alias table so agents can resolve natural-language market names to the correct codes without hallucination, and display human-readable labels for stored codes.\n\n**Systems covered.** One registry file per system, named `geo-metro-{system}.json` (e.g. `geo-metro-nielsen_dma.json`). Each file conforms to this schema. The set of valid system identifiers is defined by `/schemas/enums/metro-system.json`.\n\n**Agent usage (normative).**\n1. *Name → code (write direction):* When a buyer provides a market name (e.g. \"Albany\" or \"Albany, NY\"), the agent MUST fetch the registry for the relevant system and match against `name` and `aliases[]` before setting `geo_metros`. The agent MUST NOT guess or infer a code from training data.\n2. *Code → name (read direction):* When displaying campaign targeting to a user, the agent SHOULD resolve stored codes to names via the registry and present `name`, not raw codes.\n3. *Ambiguous input:* When an input matches multiple entries (e.g. \"Albany\" matches Albany, GA (DMA 525) and Albany-Schenectady-Troy, NY (DMA 532)), the agent MUST surface all matches and ask the buyer to confirm.\n\n**Caching.** Clients SHOULD cache registry files by `version`. The `digest` field (sha256 of the `entries` array serialised with sorted keys, hex-encoded) lets clients detect changes without re-fetching. Registries are updated infrequently; a TTL of 24 hours is appropriate.\n\n**Governance.** Entries are additive. Once published, a code entry is never removed (it may be marked `deprecated: true` with a `deprecated_reason` if a market is discontinued or renamed). Name changes follow the source system's official release; the previous name moves to `aliases[]` and the official current name becomes `name`. Additions and corrections land via PR with a reference to the source system's authoritative publication.", + "type": "object", + "required": ["system", "version", "last_updated", "digest", "entries"], + "properties": { + "system": { + "$ref": "/schemas/enums/metro-system.json", + "description": "The metro classification system these entries belong to. Matches the `system` field used in AdCP `geo_metros` targeting." + }, + "version": { + "type": "string", + "description": "Semver of this registry file. Bumped on every published change." + }, + "last_updated": { + "type": "string", + "format": "date", + "description": "ISO date of the last published change." + }, + "digest": { + "type": "string", + "description": "sha256 of the `entries` array serialised with sorted keys, hex-encoded. Clients use this to detect stale caches without comparing entry-by-entry." + }, + "source_url": { + "type": "string", + "format": "uri", + "description": "URL of the authoritative source publication for this registry (e.g. Nielsen DMA documentation, Eurostat NUTS reference)." + }, + "entries": { + "type": "array", + "description": "All known code-name pairs for this system. Ordered by code ascending.", + "items": { + "$ref": "#/definitions/GeoMetroEntry" + } + } + }, + "definitions": { + "GeoMetroEntry": { + "type": "object", + "required": ["code", "name"], + "properties": { + "code": { + "type": "string", + "description": "The numeric string code used in AdCP `geo_metros.values[]`. Must be treated as an opaque string identifier — do not cast to integer." + }, + "name": { + "type": "string", + "description": "Official canonical name for this market as published by the system authority." + }, + "aliases": { + "type": "array", + "items": { "type": "string" }, + "description": "Alternative names buyers commonly use to refer to this market, including historical names, abbreviations, and city-only variants. Used for fuzzy name resolution." + }, + "region": { + "type": "string", + "description": "ISO 3166-2 region code for the primary region this market falls within (where applicable). Informational only." + }, + "country": { + "type": "string", + "description": "ISO 3166-1 alpha-2 country code. Required for non-US systems." + }, + "deprecated": { + "type": "boolean", + "default": false, + "description": "When true, this market has been discontinued by the system authority. The code is retained for backward-compatibility with stored campaigns but SHOULD NOT be offered in new targeting." + }, + "deprecated_reason": { + "type": "string", + "description": "Human-readable explanation of why this entry is deprecated (e.g. 'Market discontinued in Nielsen 2024 DMA refresh')." + } + }, + "additionalProperties": false + } + } +} From ddd7526ad1cc1466ce9fbac0ed2af316aecb18a6 Mon Sep 17 00:00:00 2001 From: Nastassia Fulconis Date: Thu, 18 Jun 2026 18:40:32 +0300 Subject: [PATCH 2/7] chore: add changeset for geo metro registry --- .changeset/geo-metro-registry.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .changeset/geo-metro-registry.md diff --git a/.changeset/geo-metro-registry.md b/.changeset/geo-metro-registry.md new file mode 100644 index 0000000000..cfc40f087e --- /dev/null +++ b/.changeset/geo-metro-registry.md @@ -0,0 +1,4 @@ +--- +--- + +Adds the AAO geo metro reference registry: a JSON schema for the registry entry shape, an initial nielsen_dma data file (~90 US markets with aliases), and reference documentation covering agent usage patterns for name-to-code resolution and code-to-name display. From 5be906ee04fab82db3f2bc480d7bed6791e70a59 Mon Sep 17 00:00:00 2001 From: Nastassia Fulconis Date: Thu, 18 Jun 2026 18:42:55 +0300 Subject: [PATCH 3/7] chore: update package-lock.json --- package-lock.json | 117 +++++++++++++--------------------------------- 1 file changed, 32 insertions(+), 85 deletions(-) diff --git a/package-lock.json b/package-lock.json index d3367e63ed..17361a77f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -874,6 +874,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=20.19.0" }, @@ -920,6 +921,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=20.19.0" } @@ -1515,6 +1517,7 @@ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" @@ -4228,7 +4231,8 @@ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/@mintlify/scraping/node_modules/fs-extra": { "version": "11.1.1", @@ -4440,6 +4444,7 @@ "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", "license": "MIT", + "peer": true, "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", @@ -4803,6 +4808,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -5135,8 +5141,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-3.0.0.tgz", "integrity": "sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@radix-ui/number": { "version": "1.1.1", @@ -5882,6 +5887,7 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", "license": "MIT", + "peer": true, "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", @@ -7770,7 +7776,6 @@ "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.100.10.tgz", "integrity": "sha512-8UR0yJR+GiQ40m3lPhUr0xbfAupe6GSQiksSBSa9SM2NjezFyxXCIA69/lz8cSoNKZLrw1/PktIyQBJcVeMi3w==", "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -7965,6 +7970,7 @@ "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", "license": "MIT", + "peer": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", @@ -8092,6 +8098,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.18.0" } @@ -8455,6 +8462,7 @@ "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -8526,6 +8534,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -9690,8 +9699,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/clean-stack": { "version": "4.2.0", @@ -10437,8 +10445,7 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "devOptional": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/csv-parse": { "version": "6.2.1", @@ -10816,7 +10823,8 @@ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1624250.tgz", "integrity": "sha512-YFAat/lOiIk0ARmBweG+ygrEcbZrq5B9urRyUoeQKp53MlidHXE2TmTbxKcaXoQj7u/aX+jebDO4BW55rs0WwA==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/dezalgo": { "version": "1.0.4", @@ -11783,6 +11791,7 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", + "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -13900,6 +13909,7 @@ "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.23.tgz", "integrity": "sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA==", "license": "MIT", + "peer": true, "engines": { "node": ">=16.9.0" } @@ -14208,6 +14218,7 @@ "integrity": "sha512-2CbJAa7XeziZYe6pDS5RVLirRY28iSGMQuEV8jRU5NQsONQNfcR/BZHHc9vkMg2lGYTHTM2pskxC1YmY28p6bQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@alcalzone/ansi-tokenize": "^0.2.0", "ansi-escapes": "^7.0.0", @@ -15308,6 +15319,7 @@ "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 10.16.0" } @@ -18711,6 +18723,7 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.21.0.tgz", "integrity": "sha512-AUP1EYJuHraQGsVoCQVIcM7TEJVGtDzxWtGFZd8rds9d+CCXlU5Js1rYgfLNvxy9iJrpHjGrRjoi/3BT9fRyiA==", "license": "MIT", + "peer": true, "dependencies": { "pg-connection-string": "^2.13.0", "pg-pool": "^3.14.0", @@ -18975,6 +18988,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -19346,7 +19360,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">= 20" }, @@ -19553,7 +19566,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">= 20" } @@ -19565,7 +19577,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">= 20" } @@ -19577,7 +19588,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", @@ -19597,7 +19607,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "basic-ftp": "^5.3.1", "data-uri-to-buffer": "8.0.0", @@ -19614,7 +19623,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", @@ -19631,7 +19639,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", @@ -19648,7 +19655,6 @@ "dev": true, "license": "ISC", "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -19660,7 +19666,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", @@ -19682,7 +19687,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "degenerator": "7.0.1", "netmask": "^2.0.2" @@ -19694,28 +19698,6 @@ "quickjs-wasi": "^2.2.0" } }, - "node_modules/puppeteer-core/node_modules/proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-8.0.2.tgz", - "integrity": "sha512-idLLRewuemWd7GH/BDJzGiB0dWGfT2SQs3jy6NtZtGWU9uPTTSdeC1/cdbqLwgzhfv027daGFuXX426e2Eg20A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "agent-base": "9.0.0", - "debug": "^4.3.4", - "http-proxy-agent": "9.1.0", - "https-proxy-agent": "9.1.0", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "9.1.0", - "proxy-from-env": "^2.0.0", - "socks-proxy-agent": "10.1.0" - }, - "engines": { - "node": ">= 20" - } - }, "node_modules/puppeteer-core/node_modules/socks-proxy-agent": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-10.1.0.tgz", @@ -19723,7 +19705,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", @@ -19765,7 +19746,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">= 20" } @@ -19777,7 +19757,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">= 20" } @@ -19789,7 +19768,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", @@ -19809,7 +19787,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "basic-ftp": "^5.3.1", "data-uri-to-buffer": "8.0.0", @@ -19826,7 +19803,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", @@ -19843,7 +19819,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", @@ -19860,7 +19835,6 @@ "dev": true, "license": "ISC", "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -19872,7 +19846,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", @@ -19894,7 +19867,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "degenerator": "7.0.1", "netmask": "^2.0.2" @@ -19906,28 +19878,6 @@ "quickjs-wasi": "^2.2.0" } }, - "node_modules/puppeteer/node_modules/proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-8.0.2.tgz", - "integrity": "sha512-idLLRewuemWd7GH/BDJzGiB0dWGfT2SQs3jy6NtZtGWU9uPTTSdeC1/cdbqLwgzhfv027daGFuXX426e2Eg20A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "agent-base": "9.0.0", - "debug": "^4.3.4", - "http-proxy-agent": "9.1.0", - "https-proxy-agent": "9.1.0", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "9.1.0", - "proxy-from-env": "^2.0.0", - "socks-proxy-agent": "10.1.0" - }, - "engines": { - "node": ">= 20" - } - }, "node_modules/puppeteer/node_modules/socks-proxy-agent": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-10.1.0.tgz", @@ -19935,7 +19885,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", @@ -20033,15 +19982,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/quickjs-wasi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/quickjs-wasi/-/quickjs-wasi-2.2.0.tgz", - "integrity": "sha512-zQxXmQMrEoD3S+jQdYsloq4qAuaxKFHZj6hHqOYGwB2iQZH+q9e/lf5zQPXCKOk0WJuAjzRFbO4KwHIp2D05Iw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/radix-ui": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.4.3.tgz", @@ -20176,6 +20116,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -21208,6 +21149,7 @@ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -21332,8 +21274,7 @@ "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/secure-json-parse": { "version": "4.1.0", @@ -23026,6 +22967,7 @@ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -23219,6 +23161,7 @@ "integrity": "sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "~0.28.0" }, @@ -23408,6 +23351,7 @@ "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -23491,6 +23435,7 @@ "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", @@ -24003,6 +23948,7 @@ "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", @@ -24740,6 +24686,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } From 19920fb21fcff6c2c3cc5252b666b3ab57f71742 Mon Sep 17 00:00:00 2001 From: Nastassia Fulconis Date: Thu, 18 Jun 2026 18:51:00 +0300 Subject: [PATCH 4/7] fix: use AdCP-prefixed og:title and sync package-lock.json with main --- docs/reference/geo-metro-registry.mdx | 2 +- package-lock.json | 117 +++++++++++++++++++------- 2 files changed, 86 insertions(+), 33 deletions(-) diff --git a/docs/reference/geo-metro-registry.mdx b/docs/reference/geo-metro-registry.mdx index 71817c4617..454738db99 100644 --- a/docs/reference/geo-metro-registry.mdx +++ b/docs/reference/geo-metro-registry.mdx @@ -1,7 +1,7 @@ --- title: Geo Metro Registry description: "AAO-maintained reference tables mapping numeric geo metro codes to canonical names and aliases for use in AdCP targeting." -"og:title": "Geo Metro Registry — AdCP Reference" +"og:title": "AdCP Geo Metro Registry" --- # Geo Metro Registry diff --git a/package-lock.json b/package-lock.json index 17361a77f6..d3367e63ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -874,7 +874,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=20.19.0" }, @@ -921,7 +920,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=20.19.0" } @@ -1517,7 +1515,6 @@ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" @@ -4231,8 +4228,7 @@ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@mintlify/scraping/node_modules/fs-extra": { "version": "11.1.1", @@ -4444,7 +4440,6 @@ "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", "license": "MIT", - "peer": true, "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", @@ -4808,7 +4803,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -5141,7 +5135,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-3.0.0.tgz", "integrity": "sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@radix-ui/number": { "version": "1.1.1", @@ -5887,7 +5882,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", "license": "MIT", - "peer": true, "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", @@ -7776,6 +7770,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.100.10.tgz", "integrity": "sha512-8UR0yJR+GiQ40m3lPhUr0xbfAupe6GSQiksSBSa9SM2NjezFyxXCIA69/lz8cSoNKZLrw1/PktIyQBJcVeMi3w==", "license": "MIT", + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -7970,7 +7965,6 @@ "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", "license": "MIT", - "peer": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", @@ -8098,7 +8092,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.18.0" } @@ -8462,7 +8455,6 @@ "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -8534,7 +8526,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -9699,7 +9690,8 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/clean-stack": { "version": "4.2.0", @@ -10445,7 +10437,8 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "devOptional": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/csv-parse": { "version": "6.2.1", @@ -10823,8 +10816,7 @@ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1624250.tgz", "integrity": "sha512-YFAat/lOiIk0ARmBweG+ygrEcbZrq5B9urRyUoeQKp53MlidHXE2TmTbxKcaXoQj7u/aX+jebDO4BW55rs0WwA==", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/dezalgo": { "version": "1.0.4", @@ -11791,7 +11783,6 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -13909,7 +13900,6 @@ "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.23.tgz", "integrity": "sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA==", "license": "MIT", - "peer": true, "engines": { "node": ">=16.9.0" } @@ -14218,7 +14208,6 @@ "integrity": "sha512-2CbJAa7XeziZYe6pDS5RVLirRY28iSGMQuEV8jRU5NQsONQNfcR/BZHHc9vkMg2lGYTHTM2pskxC1YmY28p6bQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@alcalzone/ansi-tokenize": "^0.2.0", "ansi-escapes": "^7.0.0", @@ -15319,7 +15308,6 @@ "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 10.16.0" } @@ -18723,7 +18711,6 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.21.0.tgz", "integrity": "sha512-AUP1EYJuHraQGsVoCQVIcM7TEJVGtDzxWtGFZd8rds9d+CCXlU5Js1rYgfLNvxy9iJrpHjGrRjoi/3BT9fRyiA==", "license": "MIT", - "peer": true, "dependencies": { "pg-connection-string": "^2.13.0", "pg-pool": "^3.14.0", @@ -18988,7 +18975,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -19360,6 +19346,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "engines": { "node": ">= 20" }, @@ -19566,6 +19553,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "engines": { "node": ">= 20" } @@ -19577,6 +19565,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "engines": { "node": ">= 20" } @@ -19588,6 +19577,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", @@ -19607,6 +19597,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "basic-ftp": "^5.3.1", "data-uri-to-buffer": "8.0.0", @@ -19623,6 +19614,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", @@ -19639,6 +19631,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", @@ -19655,6 +19648,7 @@ "dev": true, "license": "ISC", "optional": true, + "peer": true, "engines": { "node": ">=12" } @@ -19666,6 +19660,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", @@ -19687,6 +19682,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "degenerator": "7.0.1", "netmask": "^2.0.2" @@ -19698,6 +19694,28 @@ "quickjs-wasi": "^2.2.0" } }, + "node_modules/puppeteer-core/node_modules/proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-8.0.2.tgz", + "integrity": "sha512-idLLRewuemWd7GH/BDJzGiB0dWGfT2SQs3jy6NtZtGWU9uPTTSdeC1/cdbqLwgzhfv027daGFuXX426e2Eg20A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "9.0.0", + "debug": "^4.3.4", + "http-proxy-agent": "9.1.0", + "https-proxy-agent": "9.1.0", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "9.1.0", + "proxy-from-env": "^2.0.0", + "socks-proxy-agent": "10.1.0" + }, + "engines": { + "node": ">= 20" + } + }, "node_modules/puppeteer-core/node_modules/socks-proxy-agent": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-10.1.0.tgz", @@ -19705,6 +19723,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", @@ -19746,6 +19765,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "engines": { "node": ">= 20" } @@ -19757,6 +19777,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "engines": { "node": ">= 20" } @@ -19768,6 +19789,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", @@ -19787,6 +19809,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "basic-ftp": "^5.3.1", "data-uri-to-buffer": "8.0.0", @@ -19803,6 +19826,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", @@ -19819,6 +19843,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", @@ -19835,6 +19860,7 @@ "dev": true, "license": "ISC", "optional": true, + "peer": true, "engines": { "node": ">=12" } @@ -19846,6 +19872,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", @@ -19867,6 +19894,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "degenerator": "7.0.1", "netmask": "^2.0.2" @@ -19878,6 +19906,28 @@ "quickjs-wasi": "^2.2.0" } }, + "node_modules/puppeteer/node_modules/proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-8.0.2.tgz", + "integrity": "sha512-idLLRewuemWd7GH/BDJzGiB0dWGfT2SQs3jy6NtZtGWU9uPTTSdeC1/cdbqLwgzhfv027daGFuXX426e2Eg20A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "9.0.0", + "debug": "^4.3.4", + "http-proxy-agent": "9.1.0", + "https-proxy-agent": "9.1.0", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "9.1.0", + "proxy-from-env": "^2.0.0", + "socks-proxy-agent": "10.1.0" + }, + "engines": { + "node": ">= 20" + } + }, "node_modules/puppeteer/node_modules/socks-proxy-agent": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-10.1.0.tgz", @@ -19885,6 +19935,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", @@ -19982,6 +20033,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/quickjs-wasi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/quickjs-wasi/-/quickjs-wasi-2.2.0.tgz", + "integrity": "sha512-zQxXmQMrEoD3S+jQdYsloq4qAuaxKFHZj6hHqOYGwB2iQZH+q9e/lf5zQPXCKOk0WJuAjzRFbO4KwHIp2D05Iw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/radix-ui": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.4.3.tgz", @@ -20116,7 +20176,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -21149,7 +21208,6 @@ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -21274,7 +21332,8 @@ "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/secure-json-parse": { "version": "4.1.0", @@ -22967,7 +23026,6 @@ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -23161,7 +23219,6 @@ "integrity": "sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.28.0" }, @@ -23351,7 +23408,6 @@ "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -23435,7 +23491,6 @@ "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", @@ -23948,7 +24003,6 @@ "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", @@ -24686,7 +24740,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } From e71e2a49afb79e98c04de1fbac1d1fe978e339ef Mon Sep 17 00:00:00 2001 From: Nastassia Fulconis Date: Thu, 18 Jun 2026 18:56:19 +0300 Subject: [PATCH 5/7] fix: rewrite bare /schemas/ link to absolute URL per lint convention --- docs/reference/geo-metro-registry.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/geo-metro-registry.mdx b/docs/reference/geo-metro-registry.mdx index 454738db99..206bc7af1c 100644 --- a/docs/reference/geo-metro-registry.mdx +++ b/docs/reference/geo-metro-registry.mdx @@ -26,7 +26,7 @@ One registry file per system, available at: GET /api/reference/geo-metros/{system} ``` -Each response conforms to the [geo-metro-registry schema](/schemas/registries/geo-metro-registry.json) and includes: +Each response conforms to the [geo-metro-registry schema](https://adcontextprotocol.org/schemas/v3/registries/geo-metro-registry.json) and includes: | Field | Description | |-------|-------------| From db072470c5baf4d9806d9a79c3b1253885f1b632 Mon Sep 17 00:00:00 2001 From: Nastassia Fulconis Date: Thu, 18 Jun 2026 19:09:44 +0300 Subject: [PATCH 6/7] fix: add $schema, $id, title, description to nielsen_dma registry data file --- static/schemas/source/registries/geo-metro-nielsen_dma.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/static/schemas/source/registries/geo-metro-nielsen_dma.json b/static/schemas/source/registries/geo-metro-nielsen_dma.json index 4a087c5355..0664759daf 100644 --- a/static/schemas/source/registries/geo-metro-nielsen_dma.json +++ b/static/schemas/source/registries/geo-metro-nielsen_dma.json @@ -1,4 +1,8 @@ { + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/registries/geo-metro-nielsen_dma.json", + "title": "Nielsen DMA Geo Metro Registry", + "description": "AAO-maintained registry of Nielsen Designated Market Area (DMA) codes and canonical market names for use in AdCP geo_metros targeting.", "system": "nielsen_dma", "version": "1.0.0", "last_updated": "2026-06-18", From 6c328c694e851b1f85ce14fa8a1059d393b830b8 Mon Sep 17 00:00:00 2001 From: Nastassia Fulconis Date: Thu, 18 Jun 2026 19:29:52 +0300 Subject: [PATCH 7/7] fix: correct Nielsen DMA codes, fill digest, fix docs, add nav entry - Replace fabricated sequential codes with verified Nielsen DMA codes: removed the rank-order top-market codes (502=Binghamton not LA, 503=Macon not Chicago, etc.) and replaced with correct codes per reviewer corrections and this repo's own targeting.mdx examples (602=Chicago, 803=LA, 807=SF, 819=Seattle, 753=Phoenix, etc.) - Compute and populate sha256 digest of entries array - Mark GET /api/reference/geo-metros endpoint as planned, not live - Fix coverage claim: ~27 verified markets (not ~210) - Fix Albany ambiguity example: add 'Albany' alias to both DMA 525 and 532 - Add page to docs.json nav under Reference - Prefix changeset body with 'Empty changeset:' per repo convention --- .changeset/geo-metro-registry.md | 2 +- docs.json | 1 + docs/reference/geo-metro-registry.mdx | 71 +++++++----- .../registries/geo-metro-nielsen_dma.json | 106 +++--------------- 4 files changed, 60 insertions(+), 120 deletions(-) diff --git a/.changeset/geo-metro-registry.md b/.changeset/geo-metro-registry.md index cfc40f087e..899f6be960 100644 --- a/.changeset/geo-metro-registry.md +++ b/.changeset/geo-metro-registry.md @@ -1,4 +1,4 @@ --- --- -Adds the AAO geo metro reference registry: a JSON schema for the registry entry shape, an initial nielsen_dma data file (~90 US markets with aliases), and reference documentation covering agent usage patterns for name-to-code resolution and code-to-name display. +Empty changeset: Adds the AAO geo metro reference registry — a JSON schema for the registry entry shape, an initial verified `nielsen_dma` seed (~27 markets), and reference documentation covering agent usage for name-to-code resolution and code-to-name display. diff --git a/docs.json b/docs.json index c5e6162830..d6632cec67 100644 --- a/docs.json +++ b/docs.json @@ -1787,6 +1787,7 @@ ] }, "docs/reference/gmsf-reference", + "docs/reference/geo-metro-registry", "docs/reference/media-channel-taxonomy", "docs/measurement/taxonomy", "docs/reference/roadmap", diff --git a/docs/reference/geo-metro-registry.mdx b/docs/reference/geo-metro-registry.mdx index 206bc7af1c..01c76cafac 100644 --- a/docs/reference/geo-metro-registry.mdx +++ b/docs/reference/geo-metro-registry.mdx @@ -16,23 +16,24 @@ AdCP's `geo_metros` targeting field accepts system-qualified numeric codes: } ``` -Buyers think in market names, not codes. Agents that guess codes from training data produce hallucinations — "Albany" could be DMA 525 (Albany, GA) or DMA 532 (Albany-Schenectady-Troy, NY). The AAO geo metro registry provides the authoritative code-to-name tables so agents can resolve names correctly and display human-readable labels for stored codes. +Buyers think in market names, not codes. Agents that guess codes from training data produce hallucinations — "Albany" matches both DMA 525 (Albany, GA) and DMA 532 (Albany-Schenectady-Troy, NY), and resolving to the wrong one silently misdirects spend. The AAO geo metro registry provides authoritative code-to-name tables so agents can resolve names correctly and display human-readable labels for stored codes. ## Registry Structure -One registry file per system, available at: +One registry file per system. Registry data files are available in the AdCP repository under `static/schemas/source/registries/`. -``` -GET /api/reference/geo-metros/{system} -``` + +A `GET /api/reference/geo-metros/{system}` endpoint is planned to serve registry data over HTTP. Until it ships, consume registry files directly from the repository or bundle them in your SDK. + -Each response conforms to the [geo-metro-registry schema](https://adcontextprotocol.org/schemas/v3/registries/geo-metro-registry.json) and includes: +Each registry file conforms to the [geo-metro-registry schema](https://adcontextprotocol.org/schemas/v3/registries/geo-metro-registry.json) and includes: | Field | Description | |-------|-------------| | `system` | The metro system identifier (matches `metro-system.json` enum) | | `version` | Semver — bump on every published change | -| `digest` | sha256 of the `entries` array for cache validation | +| `digest` | sha256 of the `entries` array (sorted keys, hex-encoded) for cache validation | +| `last_updated` | ISO date of the last published change | | `entries[]` | All code-name pairs for this system | Each entry: @@ -42,16 +43,19 @@ Each entry: | `code` | Opaque numeric string — the value used in `geo_metros.values[]` | | `name` | Official canonical market name | | `aliases[]` | Common variants: abbreviations, historical names, city-only forms | +| `region` | ISO 3166-2 region code (informational, where applicable) | +| `country` | ISO 3166-1 alpha-2 country code (required for non-US systems) | | `deprecated` | `true` if the system authority has discontinued this market | +| `deprecated_reason` | Human-readable explanation of deprecation | ## Supported Systems -| System | Coverage | Source | -|--------|----------|--------| -| `nielsen_dma` | ~210 US designated market areas | Nielsen DMA regions | -| `uk_itl1` | 12 UK ITL Level 1 regions | ONS ITL reference | -| `uk_itl2` | ~41 UK ITL Level 2 regions | ONS ITL reference | -| `eurostat_nuts2` | ~240 EU NUTS Level 2 regions | Eurostat NUTS reference | +| System | Status | Coverage | Source | +|--------|--------|----------|--------| +| `nielsen_dma` | Available | ~27 verified US markets (initial seed; expanding to ~210) | Nielsen DMA regions | +| `uk_itl1` | Planned | 12 UK ITL Level 1 regions | ONS ITL reference | +| `uk_itl2` | Planned | ~41 UK ITL Level 2 regions | ONS ITL reference | +| `eurostat_nuts2` | Planned | ~240 EU NUTS Level 2 regions | Eurostat NUTS reference | `custom` system values are provider-scoped and are not covered by the AAO registry. @@ -61,39 +65,32 @@ Each entry: When a buyer provides a market name, resolve it before setting `geo_metros`: -1. Fetch the registry for the relevant system. +1. Load the registry for the relevant system. 2. Match the buyer's input against `name` and `aliases[]` (case-insensitive, trimmed). -3. If multiple entries match (e.g. "Albany" matches both DMA 525 and DMA 532), surface all matches and ask the buyer to confirm. +3. If multiple entries match, surface all matches and ask the buyer to confirm. For example, "Albany" matches both DMA 525 (Albany, GA) and DMA 532 (Albany-Schenectady-Troy, NY) — these are distinct markets in different states. 4. Use the confirmed `code` in the `values[]` array. -**Never infer a code from training data.** Market names are not globally unique, and codes shift between system versions. +**Never infer a code from training data.** DMA codes are a fixed, non-sequential numbering scheme — market size rank does not correspond to code. An agent guessing codes silently misdirects spend. ### Code → name (read direction) When displaying campaign targeting to a user, resolve stored codes to names: -1. Fetch the registry for the system. +1. Load the registry for the system. 2. Look up each code in `entries[]` by `code`. -3. Display `name`. If a code is not found, display the raw code with a note that it may be a deprecated or provider-custom market. +3. Display `name`. If a code is not found, display the raw code — it may be a deprecated market or one not yet in the registry seed. ### Caching -Cache registry responses by `version`. Use the `digest` field (sha256 of `entries`, sorted keys, hex-encoded) to detect stale caches without comparing entries. A 24-hour TTL is appropriate — registries change infrequently. +Cache registry data by `version`. Use the `digest` field (sha256 of `entries` with sorted keys, hex-encoded) to detect stale caches without comparing entries entry-by-entry. A 24-hour TTL is appropriate — registries change infrequently. ## Example: Nielsen DMA Lookup -**Request:** -``` -GET /api/reference/geo-metros/nielsen_dma -``` - -**Response (abbreviated):** +**Abbreviated `nielsen_dma` data file:** ```json { "system": "nielsen_dma", "version": "1.0.0", - "last_updated": "2026-06-18", - "digest": "...", "entries": [ { "code": "501", @@ -103,23 +100,35 @@ GET /api/reference/geo-metros/nielsen_dma { "code": "525", "name": "Albany, GA", - "aliases": [] + "aliases": ["Albany"] }, { "code": "532", "name": "Albany-Schenectady-Troy, NY", - "aliases": ["Albany NY", "Schenectady", "Troy NY", "Capital Region"] + "aliases": ["Albany", "Albany NY", "Schenectady", "Troy NY", "Capital Region"] + }, + { + "code": "602", + "name": "Chicago, IL", + "aliases": ["Chicago"] + }, + { + "code": "803", + "name": "Los Angeles, CA", + "aliases": ["LA", "Los Angeles", "L.A."] } ] } ``` -A buyer saying "target Albany" triggers an ambiguity — the agent surfaces both DMA 525 and DMA 532 and asks which market the buyer intends. +A buyer saying "target Albany" triggers an ambiguity — both DMA 525 and DMA 532 carry "Albany" in their aliases. The agent surfaces both and asks which market the buyer intends before writing `geo_metros`. ## Governance Registry entries are additive. Once published, a code is never removed — it may be marked `deprecated: true` with a `deprecated_reason` if the system authority discontinues a market. Name changes follow the source system's official release; the previous name moves to `aliases[]`. +The `digest` field is sha256 of the `entries` array serialized with sorted keys. It is computed at publish time and changes whenever any entry changes; clients use it for cache invalidation. + Corrections and additions land via PR against [adcontextprotocol/adcp](https://github.com/adcontextprotocol/adcp) with a reference to the source system's authoritative publication. ## Long-term Direction @@ -131,4 +140,4 @@ The geo metro registry is the first of a broader class of shared reference regis - Stable enough to version - Painful and duplicative for every provider to ship independently -Planned additions include ITL and NUTS registries for UK and EU markets. Property identity registries (mobile apps, CTV apps, domains) are tracked separately under the property registry design. +The `nielsen_dma` file ships as a verified seed (~27 markets). The full ~210 US DMA list and the ITL and NUTS registries for UK and EU markets are tracked as follow-up contributions. Property identity registries (mobile apps, CTV apps, domains) are tracked separately under the property registry design. diff --git a/static/schemas/source/registries/geo-metro-nielsen_dma.json b/static/schemas/source/registries/geo-metro-nielsen_dma.json index 0664759daf..ddc09db8f6 100644 --- a/static/schemas/source/registries/geo-metro-nielsen_dma.json +++ b/static/schemas/source/registries/geo-metro-nielsen_dma.json @@ -2,109 +2,39 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "/schemas/registries/geo-metro-nielsen_dma.json", "title": "Nielsen DMA Geo Metro Registry", - "description": "AAO-maintained registry of Nielsen Designated Market Area (DMA) codes and canonical market names for use in AdCP geo_metros targeting.", + "description": "AAO-maintained registry of Nielsen Designated Market Area (DMA) codes and canonical market names for use in AdCP geo_metros targeting. Initial verified seed — expanding to full ~210 US markets.", "system": "nielsen_dma", "version": "1.0.0", "last_updated": "2026-06-18", - "digest": "", + "digest": "2e2fb3ca2059e0a6d173b036dbf11caa310e219e547e769c73b48b7be2dd3334", "source_url": "https://www.nielsen.com/dma-regions/", "entries": [ { "code": "501", "name": "New York, NY", "aliases": ["NYC", "New York City", "New York"] }, - { "code": "502", "name": "Los Angeles, CA", "aliases": ["LA", "Los Angeles", "L.A."] }, - { "code": "503", "name": "Chicago, IL", "aliases": ["Chicago"] }, { "code": "504", "name": "Philadelphia, PA", "aliases": ["Philadelphia", "Philly"] }, - { "code": "505", "name": "Dallas-Ft. Worth, TX", "aliases": ["Dallas", "Fort Worth", "DFW"] }, - { "code": "506", "name": "San Francisco-Oakland-San Jose, CA", "aliases": ["San Francisco", "SF", "Bay Area", "Oakland", "San Jose"] }, - { "code": "507", "name": "Boston, MA (Manchester)", "aliases": ["Boston", "Manchester NH"] }, - { "code": "508", "name": "Washington, DC (Hagerstown)", "aliases": ["Washington DC", "DC", "Washington", "Hagerstown"] }, - { "code": "509", "name": "Atlanta, GA", "aliases": ["Atlanta"] }, - { "code": "510", "name": "Houston, TX", "aliases": ["Houston"] }, - { "code": "511", "name": "Seattle-Tacoma, WA", "aliases": ["Seattle", "Tacoma"] }, - { "code": "512", "name": "Tampa-St. Pete. (Sarasota), FL", "aliases": ["Tampa", "St. Petersburg", "St Pete", "Sarasota"] }, - { "code": "513", "name": "Minneapolis-St. Paul, MN", "aliases": ["Minneapolis", "St. Paul", "Twin Cities"] }, - { "code": "514", "name": "Cleveland-Akron (Canton), OH", "aliases": ["Cleveland", "Akron", "Canton"] }, - { "code": "515", "name": "Miami-Ft. Lauderdale, FL", "aliases": ["Miami", "Fort Lauderdale", "Ft Lauderdale"] }, - { "code": "516", "name": "Denver, CO", "aliases": ["Denver"] }, - { "code": "517", "name": "Orlando-Daytona Bch-Melbourne, FL", "aliases": ["Orlando", "Daytona Beach", "Melbourne FL"] }, - { "code": "518", "name": "Sacramento-Stockton-Modesto, CA", "aliases": ["Sacramento", "Stockton", "Modesto"] }, - { "code": "519", "name": "St. Louis, MO", "aliases": ["St. Louis", "Saint Louis"] }, - { "code": "520", "name": "Portland, OR", "aliases": ["Portland"] }, - { "code": "521", "name": "Pittsburgh, PA", "aliases": ["Pittsburgh"] }, - { "code": "522", "name": "Raleigh-Durham (Fayetteville), NC", "aliases": ["Raleigh", "Durham", "Fayetteville NC", "Research Triangle"] }, - { "code": "523", "name": "Baltimore, MD", "aliases": ["Baltimore"] }, - { "code": "524", "name": "Indianapolis, IN", "aliases": ["Indianapolis", "Indy"] }, - { "code": "525", "name": "Albany, GA", "aliases": [] }, - { "code": "526", "name": "Charlotte, NC", "aliases": ["Charlotte"] }, - { "code": "527", "name": "Greensboro-High Point-Winston Salem, NC", "aliases": ["Greensboro", "High Point", "Winston-Salem", "Winston Salem", "Triad"] }, - { "code": "528", "name": "Hartford & New Haven, CT", "aliases": ["Hartford", "New Haven"] }, - { "code": "529", "name": "Nashville, TN", "aliases": ["Nashville"] }, - { "code": "530", "name": "Kansas City, MO", "aliases": ["Kansas City", "KC"] }, + { "code": "505", "name": "Detroit, MI", "aliases": ["Detroit"] }, + { "code": "506", "name": "Boston, MA (Manchester)", "aliases": ["Boston", "Manchester NH"] }, + { "code": "508", "name": "Pittsburgh, PA", "aliases": ["Pittsburgh"] }, + { "code": "510", "name": "Cleveland-Akron (Canton), OH", "aliases": ["Cleveland", "Akron", "Canton"] }, + { "code": "511", "name": "Washington, DC (Hagerstown)", "aliases": ["Washington DC", "DC", "Washington", "Hagerstown"] }, + { "code": "524", "name": "Atlanta, GA", "aliases": ["Atlanta"] }, + { "code": "525", "name": "Albany, GA", "aliases": ["Albany"] }, { "code": "531", "name": "Tri-Cities, TN/VA", "aliases": ["Tri-Cities", "Johnson City", "Kingsport", "Bristol"] }, - { "code": "532", "name": "Albany-Schenectady-Troy, NY", "aliases": ["Albany NY", "Schenectady", "Troy NY", "Capital Region"] }, - { "code": "533", "name": "Cincinnati, OH", "aliases": ["Cincinnati"] }, - { "code": "534", "name": "Milwaukee, WI", "aliases": ["Milwaukee"] }, - { "code": "535", "name": "Oklahoma City, OK", "aliases": ["Oklahoma City", "OKC"] }, - { "code": "536", "name": "New Orleans, LA", "aliases": ["New Orleans", "NOLA"] }, - { "code": "537", "name": "Grand Rapids-Kalamazoo-Battle Creek, MI", "aliases": ["Grand Rapids", "Kalamazoo", "Battle Creek"] }, - { "code": "538", "name": "Louisville, KY", "aliases": ["Louisville"] }, - { "code": "539", "name": "Memphis, TN", "aliases": ["Memphis"] }, - { "code": "540", "name": "Albuquerque-Santa Fe, NM", "aliases": ["Albuquerque", "Santa Fe"] }, - { "code": "541", "name": "Providence-New Bedford, MA", "aliases": ["Providence", "New Bedford"] }, - { "code": "542", "name": "Omaha, NE", "aliases": ["Omaha"] }, + { "code": "532", "name": "Albany-Schenectady-Troy, NY", "aliases": ["Albany", "Albany NY", "Schenectady", "Troy NY", "Capital Region"] }, { "code": "543", "name": "Springfield-Holyoke, MA", "aliases": ["Springfield MA", "Holyoke"] }, - { "code": "544", "name": "Rochester, NY", "aliases": ["Rochester NY"] }, - { "code": "545", "name": "Des Moines-Ames, IA", "aliases": ["Des Moines", "Ames"] }, - { "code": "546", "name": "Richmond-Petersburg, VA", "aliases": ["Richmond VA", "Petersburg VA"] }, - { "code": "547", "name": "Little Rock-Pine Bluff, AR", "aliases": ["Little Rock", "Pine Bluff"] }, - { "code": "548", "name": "Mobile-Pensacola (Ft. Walton Beach), AL/FL", "aliases": ["Mobile", "Pensacola", "Fort Walton Beach", "Ft Walton"] }, - { "code": "549", "name": "Wilkes Barre-Scranton-Hazleton, PA", "aliases": ["Scranton", "Wilkes-Barre", "Wilkes Barre", "Hazleton"] }, - { "code": "550", "name": "Austin, TX", "aliases": ["Austin"] }, - { "code": "551", "name": "Wichita-Hutchinson Plus, KS", "aliases": ["Wichita", "Hutchinson KS"] }, - { "code": "552", "name": "Las Vegas, NV", "aliases": ["Las Vegas", "Vegas"] }, - { "code": "553", "name": "Tulsa, OK", "aliases": ["Tulsa"] }, - { "code": "554", "name": "Buffalo, NY", "aliases": ["Buffalo"] }, - { "code": "555", "name": "Fresno-Visalia, CA", "aliases": ["Fresno", "Visalia"] }, - { "code": "556", "name": "Salt Lake City, UT", "aliases": ["Salt Lake City", "SLC"] }, - { "code": "557", "name": "Jacksonville, FL", "aliases": ["Jacksonville"] }, - { "code": "558", "name": "Ft. Myers-Naples, FL", "aliases": ["Fort Myers", "Ft Myers", "Naples FL"] }, - { "code": "559", "name": "Green Bay-Appleton, WI", "aliases": ["Green Bay", "Appleton"] }, - { "code": "560", "name": "Roanoke-Lynchburg, VA", "aliases": ["Roanoke", "Lynchburg"] }, - { "code": "561", "name": "Santa Barbara-Santa Maria-San Luis Obispo, CA", "aliases": ["Santa Barbara", "Santa Maria", "San Luis Obispo", "SLO"] }, - { "code": "563", "name": "Dayton, OH", "aliases": ["Dayton"] }, - { "code": "564", "name": "Youngstown, OH", "aliases": ["Youngstown"] }, - { "code": "565", "name": "Tucson (Sierra Vista), AZ", "aliases": ["Tucson", "Sierra Vista"] }, - { "code": "566", "name": "El Paso, TX (Las Cruces, NM)", "aliases": ["El Paso", "Las Cruces"] }, - { "code": "567", "name": "Savannah, GA", "aliases": ["Savannah"] }, - { "code": "569", "name": "Madison, WI", "aliases": ["Madison"] }, - { "code": "570", "name": "Colorado Springs-Pueblo, CO", "aliases": ["Colorado Springs", "Pueblo CO"] }, - { "code": "571", "name": "Charleston, SC", "aliases": ["Charleston SC"] }, - { "code": "573", "name": "Reno, NV", "aliases": ["Reno"] }, - { "code": "574", "name": "Flint-Saginaw-Bay City, MI", "aliases": ["Flint", "Saginaw", "Bay City"] }, - { "code": "575", "name": "Sioux Falls (Mitchell), SD", "aliases": ["Sioux Falls", "Mitchell SD"] }, - { "code": "576", "name": "Columbia, SC", "aliases": ["Columbia SC"] }, - { "code": "577", "name": "Baton Rouge, LA", "aliases": ["Baton Rouge"] }, - { "code": "581", "name": "Huntington-Charleston, WV", "aliases": ["Huntington WV", "Charleston WV"] }, - { "code": "582", "name": "Waco-Temple-Bryan, TX", "aliases": ["Waco", "Temple TX", "Bryan TX"] }, - { "code": "583", "name": "Chattanooga, TN", "aliases": ["Chattanooga"] }, - { "code": "584", "name": "Spokane, WA", "aliases": ["Spokane"] }, - { "code": "585", "name": "Lexington, KY", "aliases": ["Lexington"] }, - { "code": "588", "name": "Shreveport, LA", "aliases": ["Shreveport"] }, - { "code": "592", "name": "Portland-Auburn, ME", "aliases": ["Portland ME", "Auburn ME"] }, - { "code": "593", "name": "Joplin-Pittsburg, MO", "aliases": ["Joplin", "Pittsburg MO"] }, - { "code": "596", "name": "Topeka, KS", "aliases": ["Topeka"] }, - { "code": "597", "name": "Norfolk-Portsmouth-Newport News, VA", "aliases": ["Norfolk", "Portsmouth VA", "Newport News", "Hampton Roads"] }, - { "code": "598", "name": "Syracuse, NY", "aliases": ["Syracuse"] }, - { "code": "600", "name": "Corpus Christi, TX", "aliases": ["Corpus Christi"] }, - { "code": "602", "name": "Phoenix (Prescott), AZ", "aliases": ["Phoenix", "Prescott AZ"] }, - { "code": "603", "name": "Fargo-Valley City, ND", "aliases": ["Fargo", "Valley City"] }, + { "code": "602", "name": "Chicago, IL", "aliases": ["Chicago"] }, { "code": "610", "name": "Rockford, IL", "aliases": ["Rockford"] }, + { "code": "618", "name": "Houston, TX", "aliases": ["Houston"] }, + { "code": "623", "name": "Dallas-Ft. Worth, TX", "aliases": ["Dallas", "Fort Worth", "DFW"] }, { "code": "628", "name": "Monroe, LA-El Dorado, AR", "aliases": ["Monroe LA", "El Dorado AR"] }, { "code": "634", "name": "Amarillo, TX", "aliases": ["Amarillo"] }, - { "code": "636", "name": "Harlingen-Weslaco-Brownsville-McAllen, TX", "aliases": ["Harlingen", "Weslaco", "Brownsville", "McAllen", "Rio Grande Valley"] }, { "code": "709", "name": "Tyler-Longview (Lufkin & Nacogdoches), TX", "aliases": ["Tyler TX", "Longview TX", "Lufkin", "Nacogdoches"] }, { "code": "722", "name": "Lincoln-Hastings-Kearney, NE", "aliases": ["Lincoln NE", "Hastings NE", "Kearney NE"] }, { "code": "734", "name": "Jonesboro, AR", "aliases": ["Jonesboro"] }, { "code": "743", "name": "Anchorage, AK", "aliases": ["Anchorage"] }, - { "code": "798", "name": "Glendive, MT", "aliases": ["Glendive"] } + { "code": "753", "name": "Phoenix (Prescott), AZ", "aliases": ["Phoenix", "Prescott AZ"] }, + { "code": "798", "name": "Glendive, MT", "aliases": ["Glendive"] }, + { "code": "803", "name": "Los Angeles, CA", "aliases": ["LA", "Los Angeles", "L.A."] }, + { "code": "807", "name": "San Francisco-Oakland-San Jose, CA", "aliases": ["San Francisco", "SF", "Bay Area", "Oakland", "San Jose"] }, + { "code": "819", "name": "Seattle-Tacoma, WA", "aliases": ["Seattle", "Tacoma"] } ] }