--- name: map-tegna-content-surface description: >- Discover what a TEGNA WordPress host actually serves before querying it — enumerate registered post types, taxonomies and namespaces from the live route index rather than assuming the standard WordPress shape. Use first on any TEGNA property, because the custom types differ per host and change without notice. api: tegna:tegna-content-api operations: - getWpV2Types - getWpV2Taxonomies - getWpV2Categories - getWpV2Tags - getWpV2LeadershipTeam generated: '2026-08-13' method: generated source: openapi/tegna-content-api-openapi.yml --- # Map a TEGNA content surface TEGNA publishes no API documentation. The route index **is** the documentation, and it is authoritative because it is generated by the running server. ## 1. Read the route index first ``` GET https://www.tegna.com/wp-json/ ``` Returns `namespaces[]` and `routes{}` — every path, its methods, and every argument with type, default, enum, minimum and maximum. This is the only trustworthy statement of what exists. Observed 2026-08-13: | Host | Routes | Namespaces | |---|---|---| | `www.tegna.com` | 405 | 14 | | `premion.com` | 290 | 16 | Only four namespaces overlap. **Do not assume one host's shape from the other.** ## 2. Enumerate post types `getWpV2Types` — `GET /wp/v2/types` This is how you find the TEGNA-specific content types without guessing. On `www.tegna.com`: - `leadership-team` — executive profiles, populated, carries an `acf` (Advanced Custom Fields) block alongside the standard post shape - `board-of-director` — registered and public, returns an empty array - `pmb_content` — Print My Blog plugin type, empty - `icons` — registered but **401** anonymously On `premion.com` the custom types are entirely different: `news`, `news-category`, `event`, `expert-insight`, `expert-insights-category`, `gsm_block`, `gsm_styles`. ## 3. Enumerate taxonomies `getWpV2Taxonomies` — `GET /wp/v2/taxonomies` Tells you which taxonomies apply to which post type, so you know whether to filter by `categories`, `tags`, or a custom taxonomy like `expert-insights-category`. Then pull the terms themselves with `getWpV2Categories` and `getWpV2Tags` — both return a `count` per term, which is the cheapest way to see where content actually concentrates. ## 4. Probe before you trust a route A route being listed in the index does not mean you can read it. Three outcomes, all observed: - **200 with data** — `posts`, `pages`, `media`, `tags`, `users`, `leadership-team` - **200 with `[]`** — `board-of-director`, `pmb_content`: registered, nothing anonymously visible - **401** — `menus`, `font-collections`, `icons`, `aioseo/v1/*`, `wp-abilities/v1/abilities` Treat an empty array and a 401 as different facts. The first means TEGNA registered a type it does not populate publicly; the second means the data exists but needs an Application Password. ## Rules - **The volatile part is plugin-supplied.** Namespaces like `aioseo/v1`, `yoast/v1`, `wordfence/v1`, `contact-form-7/v1` and `gutenberghub-*` appear and vanish with plugin installs, with no announcement. Only `wp/v2` and `oembed/1.0` are dependable. - **Re-read the index rather than caching route knowledge.** A `404` with code `rest_no_route` means the route is gone, not that your URL is malformed. - **`_links` beats a second request.** Every resource carries `self`, `collection`, `about`, `author`, `replies`, `version-history`, `wp:attachment`, `wp:term` and `curies`. Follow them, or use `_embed=1` to inline them. - **Ids are host-local.** Post `3771` exists on both hosts and means different things. Key on host + type + id.