# WordPress REST API map for hub frontend

Source site: `https://phyllisschlafly.com`  
Method: unauthenticated public `GET` only (TLS on).  
Collected: 2026-07-29.

Base URL for all examples below: `https://phyllisschlafly.com`.

---

## 1. Namespaces and plugins present

Endpoint: `GET /wp-json/`

Site name in index: `Eagle Forum Education & Legal Official Website`.

### Namespaces returned

| Namespace | Plugin / area (inferred) | Hub use |
| --- | --- | --- |
| `wp/v2` | WordPress core REST | Primary hub data |
| `oembed/1.0` | Core oEmbed | Embed previews |
| `contact-form-7/v1` | Contact Form 7 | Present; list is **403** without auth |
| `redirection/v1` | Redirection | Admin-oriented |
| `elementor/v1`, `elementor/v1/documents`, `elementor-ai/v1`, `elementor-pro/v1` | Elementor (+ Pro/AI) | Page builders; most routes not public content |
| `genesis/v1` | Genesis theme | Reading settings public |
| `tcb/v1`, `td/v1`, `tss/v1`, `trd/v1`, `td-metrics/v1`, `tve-dash/v1`, `thrive-product-manager/v1` | Thrive suite (Architect / Leads / dash) | Builder/opt-in; not product catalog |
| `modula-ai-image-descriptor/v1` | Modula AI | Gallery tooling |
| `wpchill/v1` | WPChill (Modula vendor) | Plugin admin |
| `bsf-core/v1` | Brainstorm Force core | License |
| `theme/v1` | Theme fonts | Limited |
| `wp-site-health/v1`, `wp-block-editor/v1`, `wp-abilities/v1` | Core admin / editor | Not hub content |

### Not present (confirmed 404)

| Probe | Result |
| --- | --- |
| `/wp-json/wc/store/v1/products?per_page=1` | `rest_no_route` 404 |
| `/wp-json/wc/v3/products?per_page=1` | `rest_no_route` 404 |
| `/wp-json/wc/` | `rest_no_route` 404 |
| `/wp-json/tribe/events/v1/` | `rest_no_route` 404 |
| `/wp-json/wp/v2/product?per_page=1` | `rest_no_route` 404 |
| `/wp-json/asp/v1/` | `rest_no_route` 404 |

**Claim:** There is **no** public WooCommerce Store API namespace and **no** The Events Calendar namespace in `/wp-json/`.

### Public post types (`GET /wp-json/wp/v2/types`)

Useful for the hub: `post` (`rest_base=posts`), `page` (`pages`), `attachment` (`media`), `modula-gallery` (`modula-gallery`).

Also registered (mostly builder): `elementor_library`, `tcb_symbol`, `tvd_content_set`, Thrive lead/template types, `tve_video_data`.

---

## 2. Pages → hub-section mapping

List endpoint: `GET /wp-json/wp/v2/pages?per_page=100&_fields=id,slug,title,parent,link,date`  
Headers: `X-WP-Total: 68`, `X-WP-TotalPages: 1`.

Fetch one page (with media/author embeds when present):

`GET /wp-json/wp/v2/pages/<id>?_embed=1`

Only one page has a parent: `state-chapters` (id `4881`) → parent `partners` (id `74`).

### Content gap

These hub-relevant pages return **empty** `content.rendered` over REST (builder page or shortcode-only shell):

| id | slug | notes |
| --- | --- | --- |
| 173 | `shop` | Empty body; shop UI not in REST |
| 4881 | `state-chapters` | Empty body |
| 32954 | `2024platform` | Empty body |
| 14783 | `congress` | Empty body; `link` points off-site to House.gov |
| 20410 | `ecregistration` | Empty body |
| 174–176 | `cart` / `checkout` / `my-account` | Only Woo shortcodes in content |

Use HTML `content.rendered` where length &gt; 0. For empty pages, plan a CMS fix or HTML scrape (out of REST scope).

### Mapping table

| slug | title | hub section | fetch URL |
| --- | --- | --- | --- |
| `about-ps-eagles` | About | About/Org | `/wp-json/wp/v2/pages/4?_embed=1` |
| `phyllis` | The Life and Legacy of Phyllis Schlafly | About/Org | `/wp-json/wp/v2/pages/27?_embed=1` |
| `locations` | Locations | About/Org | `/wp-json/wp/v2/pages/10?_embed=1` |
| `partners` | Partner Organizations | About/Org | `/wp-json/wp/v2/pages/74?_embed=1` |
| `eagle-trust` | Eagle Trust Fund | About/Org | `/wp-json/wp/v2/pages/8?_embed=1` |
| `eagle-trust-fund-donation` | Eagle Trust Fund Donation | About/Org | `/wp-json/wp/v2/pages/14060?_embed=1` |
| `patents` | Patents & Intellectual Property | About/Org | `/wp-json/wp/v2/pages/8563?_embed=1` |
| `americas-future` | America’s Future | About/Org | `/wp-json/wp/v2/pages/4893?_embed=1` |
| `thomas` | Phyllis Schlafly on Clarence Thomas | About/Org | `/wp-json/wp/v2/pages/5432?_embed=1` |
| `onepagers` | One Pagers | About/Org | `/wp-json/wp/v2/pages/9328?_embed=1` |
| `join` | Join Phyllis Schlafly Eagles | Join/Chapters | `/wp-json/wp/v2/pages/7115?_embed=1` |
| `be-an-eagle` | Be an Eagle! | Join/Chapters | `/wp-json/wp/v2/pages/15495?_embed=1` |
| `internships` | Internships | Join/Chapters | `/wp-json/wp/v2/pages/29?_embed=1` |
| `collegians` | Phyllis Schlafly Collegians | Join/Chapters | `/wp-json/wp/v2/pages/4029?_embed=1` |
| `teen-eagles` | Teen Eagles | Join/Chapters | `/wp-json/wp/v2/pages/4895?_embed=1` |
| `psnext` | Phyllis Schlafly Next Generation | Join/Chapters | `/wp-json/wp/v2/pages/4898?_embed=1` |
| `state-chapters` | State Chapters | Join/Chapters | `/wp-json/wp/v2/pages/4881?_embed=1` |
| `pennsylvania` | Pennsylvania Phyllis Schlafly Eagles | Join/Chapters | `/wp-json/wp/v2/pages/4884?_embed=1` |
| `events` | Events | Events | `/wp-json/wp/v2/pages/294?_embed=1` |
| `council` | Eagle Council | Events | `/wp-json/wp/v2/pages/5414?_embed=1` |
| `collegians` | (also event recruiting) | Events / Join | `/wp-json/wp/v2/pages/4029?_embed=1` |
| `christmas` | Phyllis Schlafly Christmas Festivals | Events | `/wp-json/wp/v2/pages/5420?_embed=1` |
| `gathering` | The Gathering | Events | `/wp-json/wp/v2/pages/5416?_embed=1` |
| `dc-collegians-summit` | DC Collegians Summit | Events | `/wp-json/wp/v2/pages/5559?_embed=1` |
| `naples` | Naples Luncheon – March 16, 2026 | Events | `/wp-json/wp/v2/pages/33972?_embed=1` |
| `trump47` | Trump 47 Celebration | Events | `/wp-json/wp/v2/pages/34003?_embed=1` |
| `marchin` | Bayh-Dole Act March In Webinar | Events | `/wp-json/wp/v2/pages/32449?_embed=1` |
| `washington` | George Washington’s Birthday | Events | `/wp-json/wp/v2/pages/5449?_embed=1` |
| `eagle-countdown` | Eagle Countdown 2020 | Events | `/wp-json/wp/v2/pages/15380?_embed=1` |
| `ecregistration` | Eagle Council 2021 Registration | Events | `/wp-json/wp/v2/pages/20410?_embed=1` |
| `shop` | Shop | Shop/Books | `/wp-json/wp/v2/pages/173?_embed=1` |
| `products` | Products | Shop/Books | `/wp-json/wp/v2/pages/14053?_embed=1` |
| `books` | Books By Phyllis Schlafly | Shop/Books | `/wp-json/wp/v2/pages/83?_embed=1` |
| `the-power-of-the-positive-woman-by-phyllis-schlafly` | The Power of the Positive Woman… | Shop/Books | `/wp-json/wp/v2/pages/36094?_embed=1` |
| `media` | Media | Media/Radio/Archives | `/wp-json/wp/v2/pages/290?_embed=1` |
| `radio` | Phyllis Schlafly Report Daily Radio Commentaries | Media/Radio/Archives | `/wp-json/wp/v2/pages/7322?_embed=1` |
| `archives` | Phyllis Schlafly Center Archives | Media/Radio/Archives | `/wp-json/wp/v2/pages/9087?_embed=1` |
| `photos` | Photos | Media/Radio/Archives | `/wp-json/wp/v2/pages/5332?_embed=1` |
| `2024platform` | 2024 Platform | Media/Radio/Archives | `/wp-json/wp/v2/pages/32954?_embed=1` |
| `stopera` | Stop ERA Again | Action/Campaigns | `/wp-json/wp/v2/pages/4908?_embed=1` |
| `dobbs` | Dobbs v. Jackson Toolbox | Action/Campaigns | `/wp-json/wp/v2/pages/25740?_embed=1` |
| `votethewall` | Vote The Wall | Action/Campaigns | `/wp-json/wp/v2/pages/5639?_embed=1` |
| `electionjustice` | The Election Justice Project | Action/Campaigns | `/wp-json/wp/v2/pages/21117?_embed=1` |
| `74millionclub` | 74 Million Club | Action/Campaigns | `/wp-json/wp/v2/pages/16631?_embed=1` |
| `catholiccoalition` | Catholic Coalition… | Action/Campaigns | `/wp-json/wp/v2/pages/14374?_embed=1` |
| `rncl` | Republican National Coalition for Life | Action/Campaigns | `/wp-json/wp/v2/pages/4892?_embed=1` |
| `nea` | Inside Look at the NEA | Action/Campaigns | `/wp-json/wp/v2/pages/15019?_embed=1` |
| `promises-kept` | Promises Made, Promises Kept | Action/Campaigns | `/wp-json/wp/v2/pages/15427?_embed=1` |
| `unauthorizedcaucus` | Unauthorized Caucus | Action/Campaigns | `/wp-json/wp/v2/pages/31454?_embed=1` |
| `national-guard-is-needed-to-protect-ice-october-2025` | National Guard… October 2025 | Action/Campaigns | `/wp-json/wp/v2/pages/35654?_embed=1` |
| `congress` | Find Your Representative | Action/Campaigns | `/wp-json/wp/v2/pages/14783?_embed=1` |
| `prayer-for-america` | Prayer for America | Action/Campaigns | `/wp-json/wp/v2/pages/16121?_embed=1` |
| `contact` | Contact | Action/Campaigns | `/wp-json/wp/v2/pages/292?_embed=1` |
| `staff` | Staff | People | `/wp-json/wp/v2/pages/6?_embed=1` |
| `homemaker-awards` | Homemaker of the Year Award Winners | People | `/wp-json/wp/v2/pages/33?_embed=1` |
| `drbencarson` | Ben Carson | People | `/wp-json/wp/v2/pages/32079?_embed=1` |
| `singlaub` | Happy 100th Birthday, General Singlaub! | People | `/wp-json/wp/v2/pages/20006?_embed=1` |
| `cart` | Cart | Utility | `/wp-json/wp/v2/pages/174?_embed=1` |
| `checkout` | Checkout | Utility | `/wp-json/wp/v2/pages/175?_embed=1` |
| `my-account` | My account | Utility | `/wp-json/wp/v2/pages/176?_embed=1` |
| `stripe-checkout-result` | Checkout-Result | Utility | `/wp-json/wp/v2/pages/14052?_embed=1` |
| `privacy-policy` | Privacy Policy | Utility | `/wp-json/wp/v2/pages/4242?_embed=1` |
| `email-signup` | Email Signup | Utility | `/wp-json/wp/v2/pages/8575?_embed=1` |
| `action-notification-list-confirmation` | Notification Confirmation | Utility | `/wp-json/wp/v2/pages/36290?_embed=1` |
| `prayer-call-list-confirmation` | Prayer Call List Confirmation | Utility | `/wp-json/wp/v2/pages/34814?_embed=1` |
| `firstreaderaudio` | First Reader Audio Instructions | Utility | `/wp-json/wp/v2/pages/21938?_embed=1` |
| `one-pagers` | One Pagers – Old URL FWD | Utility | `/wp-json/wp/v2/pages/15894?_embed=1` |
| `priority-access` | Priority Access | Utility | `/wp-json/wp/v2/pages/11471?_embed=1` |
| `auto-draft` | Auto Draft | Utility | `/wp-json/wp/v2/pages/9349?_embed=1` |

---

## 3. Posts → article feed and media-property categories

### Totals and fields

`GET /wp-json/wp/v2/posts?per_page=2&_embed=1`  
Headers: `X-WP-Total: 10351`.

Observed fields on list/detail: `id`, `slug`, `date`, `link`, `title.rendered`, `excerpt.rendered`, `content.rendered`, `author`, `featured_media`, `categories`, `tags`.

With `_embed=1`, `_embedded` includes:

- `author` — `id`, `name`, `slug`, `description`, `link`, `url`, `avatar_urls`
- `wp:featuredmedia` — `source_url`, `mime_type`, `alt_text`, `media_details.sizes`
- `wp:term` — category (and tag) objects

### Filter by category

`GET /wp-json/wp/v2/posts?categories=<id>&per_page=10&_embed=1`

| Category id | slug | role for hub | `X-WP-Total` (posts) |
| --- | --- | --- | --- |
| 75 | `legislative-alerts` | Action feed | 13 |
| 76 | `press-releases` | Action / news | 894 |
| 77 | `daily-radio-commentaries` | Media property | 2338 |
| 165 | `pro-america-report-radio` | Media property | 1901 |
| 139 | `ed-martin-movement-radio` | Media property | 857 |
| 166 | `life-matters` | Media property (podcast) | 6 |
| 72 | `phyllis-schlafly-report-column` | Column / archive | 3574 |
| 78 | `the-phyllis-schlafly-report` | Report series | 804 |
| 74 | `education-reporter` | Report series | 478 |
| 16 | `featured-top` | Homepage feature flag | 381 |

Author filter: `GET /wp-json/wp/v2/posts?author=14&per_page=1` → `X-WP-Total: 3360` (Ed Martin).

Search in posts: `GET /wp-json/wp/v2/posts?search=youtube&per_page=3` → `X-WP-Total: 335`.

### Article feed recipe (secondary hub rail)

```bash
curl -sS 'https://phyllisschlafly.com/wp-json/wp/v2/posts?per_page=12&_embed=1&_fields=id,slug,title,date,link,excerpt,categories,featured_media,author,_links,_embedded'
```

### Media-property category table

| id | name | slug | hub use |
| --- | --- | --- | --- |
| 77 | Daily Radio Commentaries | `daily-radio-commentaries` | Radio show feed |
| 165 | Pro America Report Radio | `pro-america-report-radio` | Radio show feed |
| 139 | Ed Martin Movement Radio | `ed-martin-movement-radio` | Radio show feed |
| 135 | Phyllis Schlafly Eagles Utah Radio (Archived) | `phyllis-schlafly-eagles-utah-radio` | Archived radio |
| 166 | Life Matters Podcast | `life-matters` | Podcast feed |
| 72 | Phyllis Schlafly Report Column | `phyllis-schlafly-report-column` | Column archive |
| 78 | The Phyllis Schlafly Report | `the-phyllis-schlafly-report` | Report archive |
| 74 | Education Reporter | `education-reporter` | Reporter archive |
| 168 | Media | `media` | Sparse (count 2) |
| 163 | Archives | `archives` | Sparse (count 2) |

---

## 4. Categories classification

Endpoint: `GET /wp-json/wp/v2/categories?per_page=100&_fields=id,count,description,link,name,slug,parent`  
Headers: `X-WP-Total: 66`.

Hierarchy: top topics `Family` (46), `Liberalism and Conservatism` (58), `Constitution` (29), `National Sovereignty` (35), plus many children.

### Action / campaign

| id | slug | count | note |
| --- | --- | --- | --- |
| 75 | `legislative-alerts` | 13 | Call-to-action posts |
| 76 | `press-releases` | 894 | Org announcements |
| 152 | `amicus-briefs` | 13 | Legal action |
| 172 | `congressional-review` | 4 | Policy review series |
| 149 | `iwy40` | 13 | Campaign anniversary set |
| 131 | `psr50` | 52 | Anniversary set |

There is **no** category named `events` or `shop`.

### Content / topic (browse taxonomy)

Parent trees and major children (counts from same endpoint):

- **Family (46)** — education, sanctity-of-life, feminism, LGBT, colleges, marriage, …
- **Liberalism and Conservatism (58)** — big-government, elections, donald-trump, economy, media-bias, …
- **Constitution (29)** — congress, judicial-supremacy, free-speech, religious-liberty, patents, …
- **National Sovereignty (35)** — immigration, border-security, foreign-policy, america-first, …

Also: `featured-top` (16), `uncategorized` (1), `affirmative-action` (47 under Family — topic, not hub “action”).

### Media property

See Section 3 table (radio, podcast, columns, sparse `media` / `archives`).

---

## 5. Media library usage

Endpoint: `GET /wp-json/wp/v2/media?per_page=1`  
Headers: `X-WP-Total: 6103`.

### Fields (public)

From a full item: `id`, `source_url`, `mime_type`, `media_type`, `alt_text`, `caption.rendered`, `title.rendered`, `description`, `media_details` (`width`, `height`, `file`, `sizes`, `image_meta`), `author`, `date`, `slug`, `link`, `post` (attached parent id).

`media_details.sizes` keys observed: `thumbnail`, `medium`, `medium_large`, `large`, `custom-thumb-1`, `custom-thumb-2`, `custom-thumb-3`, `full` (plus size-specific `source_url`).

### Counts by filter

| Query | `X-WP-Total` |
| --- | --- |
| `/wp-json/wp/v2/media?media_type=image&per_page=1` | 4770 |
| `/wp-json/wp/v2/media?media_type=video&per_page=1` | **0** |
| `/wp-json/wp/v2/media?media_type=audio&per_page=1` | 2 |
| `/wp-json/wp/v2/media?media_type=application&per_page=1` | 1331 |
| `/wp-json/wp/v2/media?mime_type=image/jpeg&per_page=1` | 3016 |
| `/wp-json/wp/v2/media?mime_type=image/png&per_page=1` | 1731 |
| `/wp-json/wp/v2/media?mime_type=application/pdf&per_page=1` | 1301 |
| `/wp-json/wp/v2/media?mime_type=video/mp4&per_page=1` | **0** |

**Claim:** No embeddable library videos (`video/*`). Video for the hub comes from **YouTube URLs inside page HTML** (example: Eagle Council page id `5414`).

Audio sample: `GET /wp-json/wp/v2/media?media_type=audio&per_page=5&_fields=id,source_url,mime_type,title` returns two `audio/mpeg` leader-call recordings.

### How to pull images for hub surfaces

| Need | Approach | Example |
| --- | --- | --- |
| Event banners / flyers | Parse `<img>` in page content, or media search | `GET /wp-json/wp/v2/pages/294?_fields=id,content` (events hub); `GET /wp-json/wp/v2/media?search=banner&per_page=20` (`X-WP-Total: 51`); `search=event` (`39`); `search=eagle-council` (`24`) |
| Book covers | Books page HTML images | `GET /wp-json/wp/v2/pages/83?_fields=id,content` (22 `<img>` in content); `GET /wp-json/wp/v2/media?search=book&per_page=20` (`X-WP-Total: 110`) |
| Shop thumbs | Products page ASP markup | `GET /wp-json/wp/v2/pages/14053?_fields=id,content` — classes `wp-asp-product-thumb`, product ids in `wp-asp-product-id-*` |
| Video thumbnails | Still images named as thumbs | `GET /wp-json/wp/v2/media?search=eagle-council&per_page=20` (titles include “Thumbnail Video”) |
| PDFs / one-pagers | Application mime | `GET /wp-json/wp/v2/media?mime_type=application/pdf&per_page=20` |
| Featured images on articles | Post embed | `GET /wp-json/wp/v2/posts?_embed=1` → `_embedded["wp:featuredmedia"][0].source_url` |

### Modula galleries (photo events)

`GET /wp-json/wp/v2/modula-gallery?per_page=5&_fields=id,slug,title,link`  
Headers: `X-WP-Total: 7`. Examples: `patent-event-2025`, `eagle-council-51-sept-17-2022-st-louis`.

---

## 6. Users / staff / authors

Endpoint: `GET /wp-json/wp/v2/users?per_page=100&_fields=id,name,slug,description,link,url,avatar_urls`  
Headers: `X-WP-Total: 23`.

Public fields only: `id`, `name`, `slug`, `description`, `link`, `url`, `avatar_urls`.  
**No** `email`, **no** `roles` in the public payload.

### Staff page vs authors API

- **Org staff bios (preferred for People section):** `GET /wp-json/wp/v2/pages/6?_embed=1` — HTML with headshots and roles (President, Director of Communications, etc.). Emails appear obfuscated as `name(at)phyllisschlafly.com`.
- **Byline authors:** `GET /wp-json/wp/v2/users` — many are joint bylines (`John & Andy Schlafly`, radio co-hosts). Several `description` fields are empty.

List author posts: `GET /wp-json/wp/v2/posts?author=<id>&per_page=10&_embed=1`.

Authors observed (id → slug / name): 1 `phyllisschlafly_kjzblc`, 2 `phyllis-wp` / Phyllis Schlafly, 3 `johnandy-wp`, 4 `jordan-wp`, 5 `ryan-wp`, 6 `rjja-wp`, 7 `ed-cherilyn-wp`, 8 `virginia-wp`, 9 `rebekah-wp`, 10 `nancy-wp`, 11 `nancy-bonnie-wp`, 12 `jim-wp`, 13 `nancy-ed-wp`, 14 `ed-wp` / Ed Martin, 15 Singlaub/McConnell, 16 `gwen-wp`, 18 `andy-wp`, 19 `joanna-wp`, 21 `sue-wp`, 22 `edjordan-wp`, 23 `masonm-wp`, 25 `mollymccannsanders`, 26 `veronica-wp`.

---

## 7. Search

Endpoint: `GET /wp-json/wp/v2/search?search=<q>&per_page=10`

Example: `GET /wp-json/wp/v2/search?search=schlafly&per_page=5` → `X-WP-Total: 6409`.

Result fields: `id`, `title`, `url`, `type`, `subtype` (`post` or `page`), plus `_links.self` to the item endpoint.

### Hub search patterns

```bash
# Global
curl -sS 'https://phyllisschlafly.com/wp-json/wp/v2/search?search=eagle&per_page=20'

# Pages only (subtype=page; type stays post in WP search API)
curl -sS 'https://phyllisschlafly.com/wp-json/wp/v2/search?search=eagle&type=post&subtype=page&per_page=20'
# Example total for search=eagle&subtype=page: X-WP-Total: 40

# Posts only
curl -sS 'https://phyllisschlafly.com/wp-json/wp/v2/search?search=eagle&type=post&per_page=20'
# Example: X-WP-Total: 4386

# Then hydrate a hit
curl -sS 'https://phyllisschlafly.com/wp-json/wp/v2/posts/<id>?_embed=1'
# or
curl -sS 'https://phyllisschlafly.com/wp-json/wp/v2/pages/<id>?_embed=1'
```

Tags are sparse: `GET /wp-json/wp/v2/tags?per_page=1` → `X-WP-Total: 5`. Prefer categories + search over tags.

---

## 8. Gaps and workarounds

### No native events API

- `/wp-json/tribe/events/v1/` → 404.
- No `events` category.
- **Workaround:** treat Pages as the event system.
  - Index: `GET /wp-json/wp/v2/pages/294?_embed=1` (Events landing; flyers + links).
  - Flagship: `GET /wp-json/wp/v2/pages/5414?_embed=1` (Eagle Council; includes YouTube ids in HTML).
  - Singles: naples `33972`, trump47 `34003`, collegians `4029`, christmas `5420`, gathering `5416`, etc.
  - Optional galleries: `GET /wp-json/wp/v2/modula-gallery?per_page=100`.

### No native shop / products API

- WooCommerce REST namespaces → 404.
- Cart/checkout pages still contain `[woocommerce_cart]` / `[woocommerce_checkout]` / `[woocommerce_my_account]` shortcodes only (`pages/174|175|176`).
- Live catalog HTML is on **Products** page via Accept Stripe Payments markup (`wp-asp-*`, `wpec_shop_products`), not a JSON product type.
- `GET /wp-json/wp/v2/pages/173` (`shop`) has **empty** `content.rendered`.
- ASP product ids (e.g. `14054`) are **not** valid `/wp/v2/pages/<id>` or `/posts/<id>` resources (404).
- **Workaround:**
  1. `GET /wp-json/wp/v2/pages/14053?_fields=id,slug,title,content` — parse product name, price, thumb from HTML.
  2. `GET /wp-json/wp/v2/pages/83?_fields=id,content` — book covers + copy.
  3. Keep checkout on WordPress/Stripe until a real product API exists.

### YouTube embeds

- Not a dedicated endpoint.
- Extract from `content.rendered` on pages such as `5414` (council) and `4908` (stopera playlist iframe).
- Optional: `GET /wp-json/oembed/1.0/proxy?url=<youtube-url>` (core oEmbed proxy; test per URL).

### Builder / empty REST bodies

Elementor/Thrive power many pages. Empty `content.rendered` means the hub cannot rebuild that page from REST alone (`shop`, `state-chapters`, …).

### Contact forms

`GET /wp-json/contact-form-7/v1/contact-forms` → `403 wpcf7_forbidden`. Hub contact must use the Contact page HTML or a new form backend.

---

### Exact curl examples by hub section

```bash
BASE='https://phyllisschlafly.com'

# 0) Index / plugins
curl -sS "$BASE/wp-json/" | python3 -c 'import json,sys; print(json.load(sys.stdin)["namespaces"])'

# About / org
curl -sS "$BASE/wp-json/wp/v2/pages/4?_embed=1"
curl -sS "$BASE/wp-json/wp/v2/pages/27?_embed=1"
curl -sS "$BASE/wp-json/wp/v2/pages/10?_embed=1"

# Join / chapters
curl -sS "$BASE/wp-json/wp/v2/pages/7115?_embed=1"
curl -sS "$BASE/wp-json/wp/v2/pages/15495?_embed=1"
curl -sS "$BASE/wp-json/wp/v2/pages/4881?_embed=1"   # WARNING: empty content
curl -sS "$BASE/wp-json/wp/v2/pages/4884?_embed=1"   # PA chapter (has content)

# Events
curl -sS "$BASE/wp-json/wp/v2/pages/294?_embed=1"
curl -sS "$BASE/wp-json/wp/v2/pages/5414?_embed=1"
curl -sS "$BASE/wp-json/wp/v2/pages/33972?_embed=1"
curl -sS "$BASE/wp-json/wp/v2/modula-gallery?per_page=100&_fields=id,slug,title,link"

# Shop / books
curl -sS "$BASE/wp-json/wp/v2/pages/14053?_fields=id,slug,title,content"  # ASP products HTML
curl -sS "$BASE/wp-json/wp/v2/pages/83?_embed=1"                         # books
curl -sS "$BASE/wp-json/wp/v2/pages/173?_embed=1"                        # WARNING: empty

# Media / radio / archives (pages + category feeds)
curl -sS "$BASE/wp-json/wp/v2/pages/290?_embed=1"
curl -sS "$BASE/wp-json/wp/v2/pages/7322?_embed=1"
curl -sS "$BASE/wp-json/wp/v2/pages/9087?_embed=1"
curl -sS "$BASE/wp-json/wp/v2/posts?categories=77&per_page=10&_embed=1"   # daily radio
curl -sS "$BASE/wp-json/wp/v2/posts?categories=165&per_page=10&_embed=1"  # Pro America Report
curl -sS "$BASE/wp-json/wp/v2/posts?categories=139&per_page=10&_embed=1"  # Ed Martin Movement
curl -sS "$BASE/wp-json/wp/v2/posts?categories=166&per_page=10&_embed=1"  # Life Matters
curl -sS "$BASE/wp-json/wp/v2/posts?categories=72&per_page=10&_embed=1"   # PSR column

# Action / campaigns
curl -sS "$BASE/wp-json/wp/v2/pages/4908?_embed=1"                       # Stop ERA
curl -sS "$BASE/wp-json/wp/v2/posts?categories=75&per_page=10&_embed=1"  # legislative alerts
curl -sS "$BASE/wp-json/wp/v2/posts?categories=76&per_page=10&_embed=1"  # press releases
curl -sS "$BASE/wp-json/wp/v2/posts?categories=152&per_page=10&_embed=1" # amicus briefs

# People
curl -sS "$BASE/wp-json/wp/v2/pages/6?_embed=1"                          # staff bios
curl -sS "$BASE/wp-json/wp/v2/users?per_page=100"                        # public authors
curl -sS "$BASE/wp-json/wp/v2/posts?author=25&per_page=5&_embed=1"       # Molly McCann Sanders posts

# Articles (secondary)
curl -sS "$BASE/wp-json/wp/v2/posts?per_page=12&_embed=1"
curl -sS "$BASE/wp-json/wp/v2/categories?per_page=100"

# Media assets
curl -sS "$BASE/wp-json/wp/v2/media?search=banner&per_page=20&_fields=id,source_url,mime_type,title,alt_text,media_details"
curl -sS "$BASE/wp-json/wp/v2/media?media_type=image&per_page=20"
curl -sS "$BASE/wp-json/wp/v2/media?mime_type=application/pdf&per_page=20"

# Search
curl -sS "$BASE/wp-json/wp/v2/search?search=schlafly&per_page=20"
```

### Bottom line for the hub

| Hub need | Primary REST source | Gap |
| --- | --- | --- |
| About / join / action landing | `/wp/v2/pages/<id>` | Some empty builder pages |
| Events | Pages (`294`, `5414`, …) + Modula | No events CPT/API |
| Shop | Page `14053` HTML parse; books page `83` | No WC/ASP JSON API; page `173` empty |
| Media properties | `/wp/v2/posts?categories=…` | Audio mostly off-site; 0 library videos |
| Staff | Page `6` | Users endpoint is bylines, not org chart |
| Articles | `/wp/v2/posts` + categories | Secondary to org hub |
| Search | `/wp/v2/search` | Hydrate via posts/pages |
