# CMX MedGen All-In-One Contract

Permanent URL: `https://cmx-medgen-contract.pages.dev/medgen.md`

This single document contains every public instruction MedGen needs to return CMX-compatible page content.

## 1. Short Response Instruction

# CMX MedGen Response Instructions

Permanent public links:

- `https://cmx-medgen-contract.pages.dev/medgen.md`
- `https://cmx-medgen-contract.pages.dev/instructions.md`
- `https://cmx-medgen-contract.pages.dev/contract.md`
- `https://cmx-medgen-contract.pages.dev/page-format-registry.json`
- `https://cmx-medgen-contract.pages.dev/contract.json`

## Purpose

CMX sends MedGen one task for one exact page target. MedGen returns generated content already placed into the CMX page skeleton.

CMX owns routes, content paths, page type, module order, global header/footer, forms, favicon, logo, CSS, responsive layout, canonical URLs, schema assembly, preview, approval and deploy.

MedGen owns generated words, headings, body fragments, FAQ, CTA labels, image URLs or image suggestions, alt text, sources, relations and page-specific content values.

## Primary Response Shape

CMX prefers:

```text
result.cmx_page
```

Fallback:

```text
article.body
```

Minimal successful response:

```json
{
  "status": "succeeded",
  "stage": "done",
  "progress": 100,
  "result": {
    "cmx_page": {
      "version": "cmx-page-skeleton-v1",
      "content_type": "technical_page",
      "route": "/about/",
      "locale": "bg_BG",
      "seo": {
        "title": "Localized SEO title",
        "description": "Localized SEO description",
        "robots": "index,follow"
      },
      "modules": [
        {
          "type": "page_header",
          "slot": "header",
          "props": {
            "h1": "Generated H1",
            "lead": "Generated lead."
          }
        },
        {
          "type": "rich_text",
          "slot": "main",
          "props": {
            "html": "<section><h2>Generated H2</h2><p>Generated paragraph.</p></section>"
          }
        }
      ],
      "faq": [],
      "media": [],
      "sources": [],
      "relations": {}
    }
  },
  "article": {
    "title": "Localized page title",
    "h1": "Localized H1",
    "seo_title": "Localized SEO title",
    "seo_description": "Localized SEO description",
    "body": "<section><h2>Fallback H2</h2><p>Fallback paragraph.</p></section>",
    "blocks": [],
    "metadata": {}
  }
}
```

## Accepted Fragment HTML

CMX accepts fragment HTML inside approved module props such as `rich_text.html`, `review_body.html`, `summary_html`, `answer_html` and similar page-specific slots.

Accepted tags:

```text
section, article, header, div, h1, h2, h3, p, ul, ol, li, dl, dt, dd,
strong, em, small, blockquote, table, thead, tbody, tr, th, td, a
```

CMX treats full HTML documents, CSS, JavaScript, forms, scripts, inline styles, event handlers and deployment/configuration data as outside the content response contract.

## Locale And Routes

CMX sends the final `route`, `content_path`, `content_type` and `locale`.

For `locale=bg_BG`, visible content is Bulgarian at root-domain routes:

```text
/
/about/
/bady/example-product/
/obzory/example-product-review/
/experts/example-reviewer/
```

For another locale, MedGen uses the language of that locale while preserving the route CMX sent.

## Supported Page Content Types

The full page-by-page contract is in:

```text
https://cmx-medgen-contract.pages.dev/page-format-registry.json
```

Current content types:

- `home_page`
- `technical_page`
- `category_index`
- `product_card`
- `product_review`
- `expert_profile`
- `guide_article`

## Product Bundle

A product content bundle has three linked pages:

- product card: `/bady/{product_slug}/`
- product review: `/obzory/{product_slug}-review/`
- expert/reviewer profile: `/experts/{expert_slug}/`

The product page points to the review page. The review page carries the leading expert/reviewer relation. The expert page carries profile text, portrait/media data when available and dynamic profile/social links when MedGen has them.

## Final Check

Before returning a successful task, make sure:

- `result.cmx_page.version` is `cmx-page-skeleton-v1`;
- `result.cmx_page.content_type` matches the requested format;
- `result.cmx_page.route` matches the requested route;
- `result.cmx_page.locale` matches the requested locale;
- visible strings are generated in the requested locale;
- module props contain generated values rather than placeholders;
- `faq`, `media`, `sources` and `relations` are present as arrays/objects even when empty.


## 2. Page Skeleton Contract

# MedGen Page Skeleton Contract For CMX

## Permanent Public Source

MedGen should read these permanent links before producing CMX content:

- All-in-one instruction: `https://cmx-medgen-contract.pages.dev/medgen.md`
- Short instruction: `https://cmx-medgen-contract.pages.dev/instructions.md`
- Markdown contract: `https://cmx-medgen-contract.pages.dev/contract.md`
- Machine-readable page registry: `https://cmx-medgen-contract.pages.dev/page-format-registry.json`
- Combined JSON contract: `https://cmx-medgen-contract.pages.dev/contract.json`
- Public landing page: `https://cmx-medgen-contract.pages.dev/`

If CMX adds a new page type, changes a module structure, changes accepted fragment HTML, or changes a page-specific response format, CMX updates and redeploys the same public links before requesting that page from MedGen.

## Division Of Responsibility

CMX creates the site skeleton:

- routes and content paths;
- page type and module order;
- global header, footer, forms, logo and favicon;
- CSS, spacing and responsive layout;
- canonical URL and schema assembly;
- preview, approval and deploy gates.

MedGen fills the skeleton:

- localized headings and body fragments;
- SEO title and description;
- module props and labels;
- FAQ;
- media URLs or media suggestions;
- image alt text;
- sources;
- relations between product, review and expert pages.

MedGen is responsible for its own editorial/content decisions. CMX only defines the response format it can accept and validate.

## Canonical Response

Preferred response path:

```text
result.cmx_page
```

Backward-compatible fallback:

```text
article.body
```

Canonical shape:

```json
{
  "article": {
    "title": "Localized page title",
    "h1": "Localized H1",
    "seo_title": "Localized SEO title",
    "seo_description": "Localized SEO description",
    "body": "<section><h2>Fallback section</h2><p>Fallback HTML fragment.</p></section>",
    "blocks": [],
    "metadata": {}
  },
  "result": {
    "cmx_page": {
      "version": "cmx-page-skeleton-v1",
      "content_type": "technical_page",
      "route": "/editorial-policy/",
      "locale": "bg_BG",
      "seo": {
        "title": "Localized SEO title",
        "description": "Localized SEO description",
        "robots": "index,follow"
      },
      "modules": [
        {
          "type": "page_header",
          "slot": "header",
          "props": {
            "h1": "Generated H1",
            "lead": "Generated lead paragraph."
          }
        },
        {
          "type": "rich_text",
          "slot": "main",
          "props": {
            "html": "<section><h2>Generated H2</h2><p>Generated paragraph.</p></section>"
          }
        }
      ],
      "faq": [],
      "media": [],
      "sources": [],
      "relations": {}
    }
  }
}
```

## Shared Rules

- Each public site has one root locale.
- CMX sends the final `route`, `content_path`, `content_type` and `locale`.
- MedGen returns content for that target in the language of the requested locale.
- `result.cmx_page.route` should match the requested target route.
- Fragment HTML lives only inside approved module props.
- Full website documents, CSS, JS, forms, scripts and deployment/runtime config are outside the content response contract.
- Page-specific details live in `page-format-registry.json`; the registry is the most precise source.

## Accepted Fragment HTML

Accepted tags inside module HTML strings:

```text
section, article, header, div, h1, h2, h3, p, ul, ol, li, dl, dt, dd,
strong, em, small, blockquote, table, thead, tbody, tr, th, td, a
```

## Page Families

### Home Page

Route: `/`
Content path: `content/pages/home.json`
Content type: `home_page`

MedGen fills homepage copy and media direction:

- SEO title/description;
- brand slogan;
- hero H1 and lead;
- hero CTA labels;
- brand visual URL or visual prompt;
- brand visual alt/caption;
- search placeholder;
- product carousel heading/lead;
- trust and methodology block text;
- expert/trust block text;
- FAQ preview;
- footer disclaimer.

### Technical Pages

Content type: `technical_page`

Current page keys and routes:

| page_key | route |
|---|---|
| `about` | `/about/` |
| `methodology` | `/methodology/` |
| `editorial_policy` | `/editorial-policy/` |
| `information_sources` | `/sources/` |
| `affiliate_disclosure` | `/affiliate-disclosure/` |
| `contact` | `/contact/` |
| `faq` | `/faq/` |
| `how_to_use` | `/how-to-use/` |
| `suggest_supplement` | `/suggest-supplement/` |
| `disclaimer` | `/disclaimer/` |
| `privacy_policy` | `/privacy-policy/` |
| `terms_of_use` | `/terms/` |
| `cookie_policy` | `/cookie-policy/` |

Typical modules: `page_header`, `rich_text`, `faq`, `related_pages`.

### Index Pages

Content type: `category_index`

Current routes:

```text
/bady/
/obzory/
/experts/
/guides/
/popular-products/
/sravneniya/
/brands/
/vitamins-minerals/
```

MedGen fills index-level copy: SEO, H1, lead, intro sections, widget headings, empty-state labels and FAQ.

### Product Card

Route: `/bady/{product_slug}/`
Content path: `content/pages/supplements/{product_slug}.json`
Content type: `product_card`

MedGen fills product page fields: product name, brand, summary, long description, facts/specifications, price labels, seller labels, product image, image alt, review CTA label, notes, FAQ, media, sources, SEO and relations.

The product page relation points to the review route:

```json
{
  "relations": {
    "review_route": "/obzory/{product_slug}-review/"
  }
}
```

### Product Review

Route: `/obzory/{product_slug}-review/`
Content path: `content/pages/technical/{product_slug}-review.json`
Content type: `product_review`

MedGen fills review page fields: H1, lead, review summary, verdict, rating, pros/cons, main sections, FAQ, media, sources, SEO and relations.

The review page carries the product and expert relations:

```json
{
  "relations": {
    "product_route": "/bady/{product_slug}/",
    "expert_route": "/experts/{expert_slug}/"
  }
}
```

### Expert / Reviewer Profile

Route: `/experts/{expert_slug}/`
Content path: `content/pages/authors/{expert_slug}.json`
Content type: `expert_profile`

MedGen fills profile fields: display name, role/title, bio, qualification/profile sections, portrait image URL when available, portrait alt text, dynamic social/profile links when available, reviewed routes, sources and SEO.

### Guide Article

Route: `/guides/{guide_slug}/`
Content path: `content/pages/technical/{guide_slug}.json`
Content type: `guide_article`

MedGen fills article fields: H1, lead, sections, lists/tables, FAQ, related labels/routes, media, sources and SEO.


## 3. Scope And Page Targets

# MedGen Content Scope And Response Contract For CMX

## Permanent Links

Give these links to the MedGen developer:

- `https://cmx-medgen-contract.pages.dev/medgen.md`
- `https://cmx-medgen-contract.pages.dev/instructions.md`
- `https://cmx-medgen-contract.pages.dev/contract.md`
- `https://cmx-medgen-contract.pages.dev/page-format-registry.json`
- `https://cmx-medgen-contract.pages.dev/contract.json`

## Scope

CMX Admin sends a task for one exact page target. MedGen returns generated page content in the CMX skeleton response shape.

MedGen decides what content, sources, images and wording it generates. CMX defines only the structure it can accept:

- requested route;
- requested locale;
- requested page content type;
- module props;
- fragment HTML slots;
- media/source/relation arrays;
- SEO fields.

## Transport

Public MedGen API task types:

- `content_page`
- `tech_page`
- `author`
- `placeholder`

CMX local page formats are passed through `extra.cmx_content_type`:

- `home_page`
- `technical_page`
- `category_index`
- `product_card`
- `product_review`
- `expert_profile`
- `guide_article`

## Response Shape

Preferred:

```text
result.cmx_page
```

Fallback:

```text
article.body
```

Minimal response:

```json
{
  "status": "succeeded",
  "stage": "done",
  "progress": 100,
  "result": {
    "cmx_page": {
      "version": "cmx-page-skeleton-v1",
      "content_type": "technical_page",
      "route": "/about/",
      "locale": "pl_PL",
      "seo": {
        "title": "SEO title",
        "description": "SEO description",
        "robots": "index,follow"
      },
      "modules": [
        {
          "type": "page_header",
          "slot": "header",
          "props": {
            "h1": "Page H1",
            "lead": "Page lead"
          }
        },
        {
          "type": "rich_text",
          "slot": "main",
          "props": {
            "html": "<section><h2>Section H2</h2><p>Paragraph.</p></section>"
          }
        }
      ],
      "faq": [],
      "media": [],
      "sources": [],
      "relations": {}
    }
  }
}
```

## Accepted Page Targets

### Home

| content_type | route | content_path |
|---|---|---|
| `home_page` | `/` | `content/pages/home.json` |

### Technical Pages

| page_key | route | content_path |
|---|---|---|
| `about` | `/about/` | `content/pages/technical/about.json` |
| `methodology` | `/methodology/` | `content/pages/technical/methodology.json` |
| `editorial_policy` | `/editorial-policy/` | `content/pages/technical/editorial-policy.json` |
| `information_sources` | `/sources/` | `content/pages/technical/sources.json` |
| `affiliate_disclosure` | `/affiliate-disclosure/` | `content/pages/technical/affiliate-disclosure.json` |
| `contact` | `/contact/` | `content/pages/technical/contact.json` |
| `faq` | `/faq/` | `content/pages/technical/faq.json` |
| `how_to_use` | `/how-to-use/` | `content/pages/technical/how-to-use.json` |
| `suggest_supplement` | `/suggest-supplement/` | `content/pages/technical/suggest-supplement.json` |
| `disclaimer` | `/disclaimer/` | `content/pages/technical/disclaimer.json` |
| `privacy_policy` | `/privacy-policy/` | `content/pages/technical/privacy-policy.json` |
| `terms_of_use` | `/terms/` | `content/pages/technical/terms.json` |
| `cookie_policy` | `/cookie-policy/` | `content/pages/technical/cookie-policy.json` |

### Index Pages

| page_key | route | content_path |
|---|---|---|
| `catalog` | `/bady/` | `content/pages/categories/bady.json` |
| `reviews_index` | `/obzory/` | `content/pages/categories/obzory.json` |
| `experts_index` | `/experts/` | `content/pages/authors/experts.json` |
| `guides_index` | `/guides/` | `content/pages/categories/guides.json` |
| `popular_products` | `/popular-products/` | `content/pages/categories/popular-products.json` |
| `comparisons` | `/sravneniya/` | `content/pages/categories/sravneniya.json` |
| `brands` | `/brands/` | `content/pages/categories/brands.json` |
| `vitamins_minerals` | `/vitamins-minerals/` | `content/pages/categories/vitamins-minerals.json` |

### Product Bundle

| content_type | route | content_path |
|---|---|---|
| `product_card` | `/bady/{product_slug}/` | `content/pages/supplements/{product_slug}.json` |
| `product_review` | `/obzory/{product_slug}-review/` | `content/pages/technical/{product_slug}-review.json` |
| `expert_profile` | `/experts/{expert_slug}/` | `content/pages/authors/{expert_slug}.json` |

### Guides

| content_type | route | content_path |
|---|---|---|
| `guide_article` | `/guides/{guide_slug}/` | `content/pages/technical/{guide_slug}.json` |

## Fragment HTML

CMX accepts fragment HTML inside module props such as:

- `html`
- `summary_html`
- `lead_html`
- `answer_html`
- `verdict_html`
- `safety_note_html`
- `affiliate_note_html`

Accepted tags:

```text
section, article, header, div, h1, h2, h3, p, ul, ol, li, dl, dt, dd,
strong, em, small, blockquote, table, thead, tbody, tr, th, td, a
```

Full website documents, CSS, JavaScript, forms, inline styles, event handlers, secrets and deploy/server configuration are outside the response contract and are ignored/rejected by CMX validation.

## Product Bundle Relations

For a complete product bundle, MedGen returns linked page relations:

```json
{
  "relations": {
    "product_route": "/bady/{product_slug}/",
    "review_route": "/obzory/{product_slug}-review/",
    "expert_route": "/experts/{expert_slug}/"
  }
}
```

CMX considers the bundle complete after product, review and expert pages all have preview packages and approval.

## Update Rule

When CMX adds or changes a page format, these public links must be updated first:

```text
https://cmx-medgen-contract.pages.dev/instructions.md
https://cmx-medgen-contract.pages.dev/contract.md
https://cmx-medgen-contract.pages.dev/page-format-registry.json
https://cmx-medgen-contract.pages.dev/contract.json
```


## 4. Machine-Readable Page Format Registry

```json
{
  "version": "cmx-medgen-page-format-registry-v1",
  "updated_at": "2026-05-24",
  "canonical_all_in_one_url": "https://cmx-medgen-contract.pages.dev/medgen.md",
  "canonical_instructions_url": "https://cmx-medgen-contract.pages.dev/instructions.md",
  "canonical_contract_url": "https://cmx-medgen-contract.pages.dev/contract.md",
  "canonical_registry_url": "https://cmx-medgen-contract.pages.dev/page-format-registry.json",
  "update_rule": "Whenever CMX adds a new public page type, changes a page module structure, changes accepted HTML, or edits a page-specific content format, update this registry and redeploy the same Pages project before asking MedGen to generate that page.",
  "response_mode": "cmx_page_skeleton_response",
  "primary_response_path": "result.cmx_page",
  "fallback_response_path": "article.body",
  "global_rules": {
    "locale_strategy": "single_root",
    "cmx_owns": [
      "routes",
      "content paths",
      "global header",
      "global footer",
      "logo",
      "favicon",
      "CSS",
      "responsive spacing",
      "canonical URLs",
      "schema assembly",
      "preview",
      "approval",
      "deploy"
    ],
    "medgen_owns": [
      "localized headings",
      "localized body fragments",
      "module props",
      "FAQ",
      "CTA labels",
      "media suggestions",
      "alt text",
      "sources",
      "relations"
    ],
    "product_bundle_rule": {
      "bundle_type": "cmx_product_bundle",
      "required_roles": [
        "product_card",
        "expert_profile",
        "product_review"
      ],
      "completion_rule": "complete_only_after_product_expert_review_preview_approval",
      "preview_rule": "CMX considers the bundle ready for approval only after all three linked tasks are succeeded and preview packages exist for all three target pages."
    },
    "allowed_html_tags": [
      "section",
      "article",
      "header",
      "div",
      "h1",
      "h2",
      "h3",
      "p",
      "ul",
      "ol",
      "li",
      "dl",
      "dt",
      "dd",
      "strong",
      "em",
      "small",
      "blockquote",
      "table",
      "thead",
      "tbody",
      "tr",
      "th",
      "td",
      "a"
    ],
    "outside_response_contract_html": [
      "doctype",
      "html",
      "head",
      "body",
      "script",
      "style",
      "iframe",
      "form",
      "input",
      "textarea",
      "button",
      "svg",
      "canvas",
      "link",
      "meta",
      "inline style attributes",
      "on* event attributes"
    ]
  },
  "response_schema": {
    "required": [
      "result.cmx_page.version",
      "result.cmx_page.content_type",
      "result.cmx_page.route",
      "result.cmx_page.locale",
      "result.cmx_page.seo",
      "result.cmx_page.modules"
    ],
    "example": {
      "result": {
        "cmx_page": {
          "version": "cmx-page-skeleton-v1",
          "content_type": "technical_page",
          "route": "/editorial-policy/",
          "locale": "bg_BG",
          "seo": {
            "title": "{{localized SEO title}}",
            "description": "{{localized SEO description}}"
          },
          "modules": [
            {
              "type": "page_header",
              "props": {
                "h1": "{{page H1}}",
                "lead": "{{page lead}}"
              }
            },
            {
              "type": "rich_text",
              "props": {
                "html": "<section><h2>{{section heading}}</h2><p>{{paragraph}}</p></section>"
              }
            }
          ],
          "faq": [],
          "media": [],
          "relations": {}
        }
      }
    }
  },
  "page_formats": {
    "home": {
      "content_type": "home_page",
      "route": "/",
      "content_path": "content/pages/home.json",
      "medgen_api_type": "content_page",
      "required_modules": [
        "trust_hero",
        "product_carousel",
        "evidence_panel",
        "review_grid",
        "link_list"
      ],
      "required_slots": [
        "seo_title",
        "seo_description",
        "brand_slogan",
        "hero_kicker",
        "hero_h1",
        "hero_lead",
        "hero_primary_cta_label",
        "hero_secondary_cta_label",
        "brand_visual_prompt",
        "brand_visual_alt",
        "brand_visual_caption",
        "product_carousel_heading",
        "product_carousel_lead",
        "product_card_trust_badges",
        "methodology_block_heading",
        "methodology_block_lead",
        "trust_cards",
        "experts_block_heading",
        "faq_preview",
        "footer_disclaimer",
        "search_placeholder"
      ],
      "accepted_markup": {
        "trust_hero.lead": "<p>{{homepage lead}}</p>",
        "product_carousel.lead": "<p>{{commercial product discovery lead}}</p>",
        "evidence_panel.items.body": "<p>{{trust evidence body}}</p>",
        "link_list.groups.links.title": "{{localized anchor text only}}"
      }
    },
    "technical.about": {
      "content_type": "technical_page",
      "page_key": "about",
      "route": "/about/",
      "content_path": "content/pages/technical/about.json",
      "medgen_api_type": "tech_page",
      "required_modules": [
        "page_header",
        "rich_text",
        "related_pages"
      ],
      "required_slots": [
        "page_h1",
        "page_lead",
        "sections",
        "related_pages",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "rich_text.html": "<section><h2>{{section heading}}</h2><p>{{paragraph}}</p></section>"
      }
    },
    "technical.methodology": {
      "content_type": "technical_page",
      "page_key": "methodology",
      "route": "/methodology/",
      "content_path": "content/pages/technical/methodology.json",
      "medgen_api_type": "tech_page",
      "required_modules": [
        "page_header",
        "rich_text",
        "faq"
      ],
      "required_slots": [
        "page_h1",
        "page_lead",
        "method_sections",
        "evaluation_steps",
        "faq",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "rich_text.html": "<section><h2>{{method heading}}</h2><p>{{method body}}</p><ol><li>{{step}}</li></ol></section>"
      }
    },
    "technical.editorial_policy": {
      "content_type": "technical_page",
      "page_key": "editorial_policy",
      "route": "/editorial-policy/",
      "content_path": "content/pages/technical/editorial-policy.json",
      "medgen_api_type": "tech_page",
      "required_modules": [
        "page_header",
        "rich_text",
        "related_pages"
      ],
      "required_slots": [
        "page_h1",
        "page_lead",
        "editorial_principles",
        "review_process",
        "corrections_policy",
        "related_pages",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "rich_text.html": "<section><h2>{{policy heading}}</h2><p>{{policy paragraph}}</p><ul><li>{{policy item}}</li></ul></section>"
      }
    },
    "technical.information_sources": {
      "content_type": "technical_page",
      "page_key": "information_sources",
      "route": "/sources/",
      "content_path": "content/pages/technical/sources.json",
      "medgen_api_type": "tech_page",
      "required_modules": [
        "page_header",
        "rich_text",
        "source_list"
      ],
      "required_slots": [
        "page_h1",
        "page_lead",
        "source_policy_sections",
        "source_groups",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "rich_text.html": "<section><h2>{{source heading}}</h2><p>{{source explanation}}</p></section>"
      }
    },
    "technical.affiliate_disclosure": {
      "content_type": "technical_page",
      "page_key": "affiliate_disclosure",
      "route": "/affiliate-disclosure/",
      "content_path": "content/pages/technical/affiliate-disclosure.json",
      "medgen_api_type": "tech_page",
      "required_modules": [
        "page_header",
        "rich_text",
        "related_pages"
      ],
      "required_slots": [
        "page_h1",
        "page_lead",
        "commercial_disclosure_sections",
        "related_pages",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "rich_text.html": "<section><h2>{{disclosure heading}}</h2><p>{{disclosure body}}</p></section>"
      }
    },
    "technical.contact": {
      "content_type": "technical_page",
      "page_key": "contact",
      "route": "/contact/",
      "content_path": "content/pages/technical/contact.json",
      "medgen_api_type": "tech_page",
      "required_modules": [
        "page_header",
        "rich_text"
      ],
      "cmx_fixed_modules_after_medgen": [
        "contact_form"
      ],
      "required_slots": [
        "page_h1",
        "page_lead",
        "contact_intro_sections",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "rich_text.html": "<section><h2>{{contact heading}}</h2><p>{{contact paragraph}}</p></section>"
      }
    },
    "technical.faq": {
      "content_type": "technical_page",
      "page_key": "faq",
      "route": "/faq/",
      "content_path": "content/pages/technical/faq.json",
      "medgen_api_type": "tech_page",
      "required_modules": [
        "page_header",
        "faq"
      ],
      "required_slots": [
        "page_h1",
        "page_lead",
        "faq",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "faq.answer_html": "<p>{{answer}}</p>"
      }
    },
    "technical.how_to_use": {
      "content_type": "technical_page",
      "page_key": "how_to_use",
      "route": "/how-to-use/",
      "content_path": "content/pages/technical/how-to-use.json",
      "medgen_api_type": "tech_page",
      "required_modules": [
        "page_header",
        "rich_text",
        "faq"
      ],
      "required_slots": [
        "page_h1",
        "page_lead",
        "usage_steps",
        "faq",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "rich_text.html": "<section><h2>{{step group heading}}</h2><ol><li>{{step}}</li></ol></section>"
      }
    },
    "technical.suggest_supplement": {
      "content_type": "technical_page",
      "page_key": "suggest_supplement",
      "route": "/suggest-supplement/",
      "content_path": "content/pages/technical/suggest-supplement.json",
      "medgen_api_type": "tech_page",
      "required_modules": [
        "page_header",
        "rich_text"
      ],
      "required_slots": [
        "page_h1",
        "page_lead",
        "submission_guidance",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "rich_text.html": "<section><h2>{{guidance heading}}</h2><p>{{guidance paragraph}}</p><ul><li>{{required info}}</li></ul></section>"
      }
    },
    "technical.disclaimer": {
      "content_type": "technical_page",
      "page_key": "disclaimer",
      "route": "/disclaimer/",
      "content_path": "content/pages/technical/disclaimer.json",
      "medgen_api_type": "tech_page",
      "required_modules": [
        "page_header",
        "rich_text"
      ],
      "required_slots": [
        "page_h1",
        "page_lead",
        "disclaimer_sections",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "rich_text.html": "<section><h2>{{disclaimer heading}}</h2><p>{{disclaimer text}}</p></section>"
      }
    },
    "technical.privacy_policy": {
      "content_type": "technical_page",
      "page_key": "privacy_policy",
      "route": "/privacy-policy/",
      "content_path": "content/pages/technical/privacy-policy.json",
      "medgen_api_type": "tech_page",
      "required_modules": [
        "page_header",
        "rich_text"
      ],
      "required_slots": [
        "page_h1",
        "page_lead",
        "privacy_sections",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "rich_text.html": "<section><h2>{{privacy heading}}</h2><p>{{privacy text}}</p></section>"
      }
    },
    "technical.terms_of_use": {
      "content_type": "technical_page",
      "page_key": "terms_of_use",
      "route": "/terms/",
      "content_path": "content/pages/technical/terms.json",
      "medgen_api_type": "tech_page",
      "required_modules": [
        "page_header",
        "rich_text"
      ],
      "required_slots": [
        "page_h1",
        "page_lead",
        "terms_sections",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "rich_text.html": "<section><h2>{{terms heading}}</h2><p>{{terms text}}</p></section>"
      }
    },
    "technical.cookie_policy": {
      "content_type": "technical_page",
      "page_key": "cookie_policy",
      "route": "/cookie-policy/",
      "content_path": "content/pages/technical/cookie-policy.json",
      "medgen_api_type": "tech_page",
      "required_modules": [
        "page_header",
        "rich_text"
      ],
      "required_slots": [
        "page_h1",
        "page_lead",
        "cookie_sections",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "rich_text.html": "<section><h2>{{cookie heading}}</h2><p>{{cookie text}}</p></section>"
      }
    },
    "index.catalog": {
      "content_type": "index_page",
      "page_key": "catalog",
      "route": "/bady/",
      "content_path": "content/pages/categories/bady.json",
      "medgen_api_type": "content_page",
      "required_modules": [
        "category_header",
        "index_intro"
      ],
      "required_slots": [
        "h1",
        "lead",
        "intro_html",
        "widget_headings",
        "empty_state_text",
        "faq",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "index_intro.html": "<section><h2>{{catalog heading}}</h2><p>{{catalog intro}}</p></section>"
      }
    },
    "index.reviews": {
      "content_type": "index_page",
      "page_key": "reviews_index",
      "route": "/obzory/",
      "content_path": "content/pages/categories/obzory.json",
      "medgen_api_type": "content_page",
      "required_modules": [
        "category_header",
        "index_intro",
        "review_grid"
      ],
      "required_slots": [
        "h1",
        "lead",
        "intro_html",
        "empty_state_text",
        "faq",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "index_intro.html": "<section><h2>{{reviews heading}}</h2><p>{{reviews intro}}</p></section>"
      }
    },
    "index.experts": {
      "content_type": "index_page",
      "page_key": "experts_index",
      "route": "/experts/",
      "content_path": "content/pages/authors/experts.json",
      "medgen_api_type": "author",
      "required_modules": [
        "page_header",
        "authors_grid_intro"
      ],
      "required_slots": [
        "h1",
        "lead",
        "intro_html",
        "empty_state_text",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "authors_grid_intro.html": "<section><h2>{{experts heading}}</h2><p>{{experts intro}}</p></section>"
      }
    },
    "index.guides": {
      "content_type": "index_page",
      "page_key": "guides_index",
      "route": "/guides/",
      "content_path": "content/pages/categories/guides.json",
      "medgen_api_type": "content_page",
      "required_modules": [
        "category_header",
        "index_intro"
      ],
      "required_slots": [
        "h1",
        "lead",
        "intro_html",
        "empty_state_text",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "index_intro.html": "<section><h2>{{guides heading}}</h2><p>{{guides intro}}</p></section>"
      }
    },
    "dynamic.product_card": {
      "content_type": "product_card",
      "route_pattern": "/bady/{product_slug}/",
      "content_path_pattern": "content/pages/supplements/{product_slug}.json",
      "medgen_api_type": "content_page",
      "required_modules": [
        "product_hero",
        "product_details",
        "product_notes"
      ],
      "required_slots": [
        "product_name",
        "product_brand",
        "product_summary",
        "product_long_description",
        "product_image",
        "product_image_alt",
        "price_label",
        "seller_label",
        "safety_note",
        "affiliate_note",
        "review_cta_label",
        "review_route",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "product_hero.summary_html": "<p>{{short product summary}}</p>",
        "product_details.html": "<section><h2>{{details heading}}</h2><p>{{long product description}}</p><dl><dt>{{fact label}}</dt><dd>{{fact value}}</dd></dl></section>",
        "product_notes.safety_note_html": "<p>{{safety note}}</p>"
      },
      "notes": [
        "The product page links to the product review page.",
        "The review page carries the leading expert/reviewer relation."
      ]
    },
    "dynamic.product_review": {
      "content_type": "product_review",
      "route_pattern": "/obzory/{product_slug}-review/",
      "content_path_pattern": "content/pages/technical/{product_slug}-review.json",
      "medgen_api_type": "content_page",
      "required_modules": [
        "review_header",
        "review_verdict",
        "review_body",
        "review_relations"
      ],
      "required_slots": [
        "review_h1",
        "review_lead",
        "review_summary",
        "rating",
        "verdict",
        "pros",
        "cons",
        "review_sections",
        "product_route",
        "product_anchor_label",
        "expert_route",
        "expert_anchor_label",
        "faq",
        "sources",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "review_header.summary_html": "<p>{{review summary}}</p>",
        "review_verdict.verdict_html": "<p>{{verdict}}</p>",
        "review_body.html": "<section><h2>{{section heading}}</h2><p>{{section body}}</p></section>",
        "review_relations.expert_callout": "<aside><h2>{{expert callout heading}}</h2><p>{{expert lead}}</p><a href=\"/experts/{expert_slug}/\">{{expert anchor}}</a></aside>"
      },
      "notes": [
        "The expert/reviewer link is the leading relation for the review page.",
        "CMX renders the expert relation as a right-side callout on desktop."
      ]
    },
    "dynamic.expert_profile": {
      "content_type": "expert_profile",
      "route_pattern": "/experts/{expert_slug}/",
      "content_path_pattern": "content/pages/authors/{expert_slug}.json",
      "medgen_api_type": "author",
      "required_modules": [
        "author_header",
        "author_body",
        "author_disclosure"
      ],
      "required_slots": [
        "expert_name",
        "expert_role",
        "short_bio",
        "full_bio",
        "qualification_heading",
        "reviewed_materials_heading",
        "review_refs",
        "disclosure_text",
        "portrait_image",
        "portrait_image_alt",
        "same_as_links",
        "official_social_links",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "author_header.bio_html": "<p>{{short bio}}</p>",
        "author_body.html": "<section><h2>{{qualification heading}}</h2><p>{{full bio}}</p></section>",
        "author_disclosure.html": "<p>{{disclosure text}}</p>"
      },
      "notes": [
        "portrait_image may be a remote https URL when it is an official or licensed portrait/headshot source.",
        "same_as_links and official_social_links are dynamic; return only real official profiles, personal/professional blogs or institutional pages found for the expert, and omit missing networks."
      ]
    },
    "dynamic.guide_article": {
      "content_type": "guide_article",
      "route_pattern": "/guides/{guide_slug}/",
      "content_path_pattern": "content/pages/technical/{guide_slug}.json",
      "medgen_api_type": "content_page",
      "required_modules": [
        "article_header",
        "article_body"
      ],
      "required_slots": [
        "guide_h1",
        "guide_lead",
        "sections",
        "related_products",
        "related_reviews",
        "faq",
        "seo_title",
        "seo_description"
      ],
      "accepted_markup": {
        "article_body.html": "<section><h2>{{section heading}}</h2><p>{{section body}}</p></section>"
      }
    }
  }
}
```
