---
title: "Discourse (meta.discourse.org): spec vs live"
date: 2026-10-30
canonical: https://apidrifter.com/research/public-api-spec-drift-2026-11/discourse-meta/
part_of: https://apidrifter.com/research/public-api-spec-drift-2026-11/
---

# Discourse (meta.discourse.org): spec vs live

Part of [We checked 13 public APIs against their own OpenAPI specs. 9 had hard mismatches.](https://apidrifter.com/research/public-api-spec-drift-2026-11/).

## Summary

- Spec: https://docs.discourse.org/openapi.json (OpenAPI 3)
- Base URL: `https://meta.discourse.org`
- Run: 2026-10-30, read-only GET requests, no credentials
- Coverage: 95 operations in the spec, 21 requests sent, 13 successful, 21 operations observed
- Hard violations: 106 distinct schema locations
- Reviewer note: Confirmed: category custom_fields holds plugin keys the spec forbids; topic tags are objects where the spec says strings; permission is null. The spec is generated from test fixtures and lags the live site.

## Hard violations (106)

A typed client generated from the spec would break on these.

- `response-missing-required-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/available_groups`
  - response body at /category/available_groups: required property "available_groups" is missing
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Expected: `"available_groups"`
  - If the spec is the source of truth: Include "available_groups" in the 200 response of GET /c/{id}/show.json.
  - If the implementation is the source of truth: Remove "available_groups" from required at paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].
- `response-missing-required-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/can_delete`
  - response body at /category/can_delete: required property "can_delete" is missing
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Expected: `"can_delete"`
  - If the spec is the source of truth: Include "can_delete" in the 200 response of GET /c/{id}/show.json.
  - If the implementation is the source of truth: Remove "can_delete" from required at paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].
- `response-missing-required-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/can_edit`
  - response body at /category/can_edit: required property "can_edit" is missing
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Expected: `"can_edit"`
  - If the spec is the source of truth: Include "can_edit" in the 200 response of GET /c/{id}/show.json.
  - If the implementation is the source of truth: Remove "can_edit" from required at paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].
- `response-forbidden-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/custom_fields/activity_pub_default_visibility`
  - response body at /category/custom_fields/activity_pub_default_visibility: property "activity_pub_default_visibility" is not allowed
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Actual: `"activity_pub_default_visibility"`
  - If the spec is the source of truth: Stop returning "activity_pub_default_visibility" from GET /c/{id}/show.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "activity_pub_default_visibility" to paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].properties["custom_fields"].properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/custom_fields/activity_pub_post_object_type`
  - response body at /category/custom_fields/activity_pub_post_object_type: property "activity_pub_post_object_type" is not allowed
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Actual: `"activity_pub_post_object_type"`
  - If the spec is the source of truth: Stop returning "activity_pub_post_object_type" from GET /c/{id}/show.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "activity_pub_post_object_type" to paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].properties["custom_fields"].properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/custom_fields/activity_pub_publication_type`
  - response body at /category/custom_fields/activity_pub_publication_type: property "activity_pub_publication_type" is not allowed
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Actual: `"activity_pub_publication_type"`
  - If the spec is the source of truth: Stop returning "activity_pub_publication_type" from GET /c/{id}/show.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "activity_pub_publication_type" to paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].properties["custom_fields"].properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/custom_fields/enable_accepted_answers`
  - response body at /category/custom_fields/enable_accepted_answers: property "enable_accepted_answers" is not allowed
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Actual: `"enable_accepted_answers"`
  - If the spec is the source of truth: Stop returning "enable_accepted_answers" from GET /c/{id}/show.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "enable_accepted_answers" to paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].properties["custom_fields"].properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/custom_fields/enable_open_filter`
  - response body at /category/custom_fields/enable_open_filter: property "enable_open_filter" is not allowed
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Actual: `"enable_open_filter"`
  - If the spec is the source of truth: Stop returning "enable_open_filter" from GET /c/{id}/show.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "enable_open_filter" to paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].properties["custom_fields"].properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/custom_fields/enable_unassigned_filter`
  - response body at /category/custom_fields/enable_unassigned_filter: property "enable_unassigned_filter" is not allowed
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Actual: `"enable_unassigned_filter"`
  - If the spec is the source of truth: Stop returning "enable_unassigned_filter" from GET /c/{id}/show.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "enable_unassigned_filter" to paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].properties["custom_fields"].properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/custom_fields/prioritize_open_filter`
  - response body at /category/custom_fields/prioritize_open_filter: property "prioritize_open_filter" is not allowed
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Actual: `"prioritize_open_filter"`
  - If the spec is the source of truth: Stop returning "prioritize_open_filter" from GET /c/{id}/show.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "prioritize_open_filter" to paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].properties["custom_fields"].properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/disable_topic_resorting`
  - response body at /category/disable_topic_resorting: property "disable_topic_resorting" is not allowed
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Actual: `"disable_topic_resorting"`
  - If the spec is the source of truth: Stop returning "disable_topic_resorting" from GET /c/{id}/show.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "disable_topic_resorting" to paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/doc_index_topic_id`
  - response body at /category/doc_index_topic_id: property "doc_index_topic_id" is not allowed
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Actual: `"doc_index_topic_id"`
  - If the spec is the source of truth: Stop returning "doc_index_topic_id" from GET /c/{id}/show.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "doc_index_topic_id" to paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].properties or allow additionalProperties.
- `response-missing-required-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/email_in`
  - response body at /category/email_in: required property "email_in" is missing
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Expected: `"email_in"`
  - If the spec is the source of truth: Include "email_in" in the 200 response of GET /c/{id}/show.json.
  - If the implementation is the source of truth: Remove "email_in" from required at paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].
- `response-missing-required-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/email_in_allow_strangers`
  - response body at /category/email_in_allow_strangers: required property "email_in_allow_strangers" is missing
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Expected: `"email_in_allow_strangers"`
  - If the spec is the source of truth: Include "email_in_allow_strangers" in the 200 response of GET /c/{id}/show.json.
  - If the implementation is the source of truth: Remove "email_in_allow_strangers" from required at paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].
- `response-missing-required-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/group_permissions`
  - response body at /category/group_permissions: required property "group_permissions" is missing
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Expected: `"group_permissions"`
  - If the spec is the source of truth: Include "group_permissions" in the 200 response of GET /c/{id}/show.json.
  - If the implementation is the source of truth: Remove "group_permissions" from required at paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].
- `response-forbidden-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/has_chat_channels`
  - response body at /category/has_chat_channels: property "has_chat_channels" is not allowed
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Actual: `"has_chat_channels"`
  - If the spec is the source of truth: Stop returning "has_chat_channels" from GET /c/{id}/show.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "has_chat_channels" to paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/moderating_group_ids`
  - response body at /category/moderating_group_ids: property "moderating_group_ids" is not allowed
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Actual: `"moderating_group_ids"`
  - If the spec is the source of truth: Stop returning "moderating_group_ids" from GET /c/{id}/show.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "moderating_group_ids" to paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].properties or allow additionalProperties.
- `response-missing-required-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/notification_level`
  - response body at /category/notification_level: required property "notification_level" is missing
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Expected: `"notification_level"`
  - If the spec is the source of truth: Include "notification_level" in the 200 response of GET /c/{id}/show.json.
  - If the implementation is the source of truth: Remove "notification_level" from required at paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].
- `response-forbidden-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/parent_category_id`
  - response body at /category/parent_category_id: property "parent_category_id" is not allowed
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Actual: `"parent_category_id"`
  - If the spec is the source of truth: Stop returning "parent_category_id" from GET /c/{id}/show.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "parent_category_id" to paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /c/{id}/show.json > response 200 > application/json > /category/sort_topics_by_event_start_date`
  - response body at /category/sort_topics_by_event_start_date: property "sort_topics_by_event_start_date" is not allowed
  - Request: `GET /c/1/show.json -> 200 application/json; charset=utf-8`
  - Actual: `"sort_topics_by_event_start_date"`
  - If the spec is the source of truth: Stop returning "sort_topics_by_event_start_date" from GET /c/{id}/show.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "sort_topics_by_event_start_date" to paths["/c/{id}/show.json"].get.responses["200"].content["application/json"].schema.properties["category"].properties or allow additionalProperties.
- `response-missing-required-property` (hard, breaking) at `GET /categories.json > response 200 > application/json > /category_list/categories/0/can_edit`
  - response body at /category_list/categories/0/can_edit: required property "can_edit" is missing (and 9 more like it)
  - Request: `GET /categories.json -> 200 application/json; charset=utf-8`
  - Expected: `"can_edit"`
  - If the spec is the source of truth: Include "can_edit" in the 200 response of GET /categories.json.
  - If the implementation is the source of truth: Remove "can_edit" from required at paths["/categories.json"].get.responses["200"].content["application/json"].schema.properties["category_list"].properties["categories"].items.
- `response-forbidden-property` (hard, breaking) at `GET /categories.json > response 200 > application/json > /category_list/categories/0/custom_fields`
  - response body at /category_list/categories/0/custom_fields: property "custom_fields" is not allowed (and 9 more like it)
  - Request: `GET /categories.json -> 200 application/json; charset=utf-8`
  - Actual: `"custom_fields"`
  - If the spec is the source of truth: Stop returning "custom_fields" from GET /categories.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "custom_fields" to paths["/categories.json"].get.responses["200"].content["application/json"].schema.properties["category_list"].properties["categories"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /categories.json > response 200 > application/json > /category_list/categories/0/disable_topic_resorting`
  - response body at /category_list/categories/0/disable_topic_resorting: property "disable_topic_resorting" is not allowed (and 9 more like it)
  - Request: `GET /categories.json -> 200 application/json; charset=utf-8`
  - Actual: `"disable_topic_resorting"`
  - If the spec is the source of truth: Stop returning "disable_topic_resorting" from GET /categories.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "disable_topic_resorting" to paths["/categories.json"].get.responses["200"].content["application/json"].schema.properties["category_list"].properties["categories"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /categories.json > response 200 > application/json > /category_list/categories/0/doc_index_topic_id`
  - response body at /category_list/categories/0/doc_index_topic_id: property "doc_index_topic_id" is not allowed (and 9 more like it)
  - Request: `GET /categories.json -> 200 application/json; charset=utf-8`
  - Actual: `"doc_index_topic_id"`
  - If the spec is the source of truth: Stop returning "doc_index_topic_id" from GET /categories.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "doc_index_topic_id" to paths["/categories.json"].get.responses["200"].content["application/json"].schema.properties["category_list"].properties["categories"].items.properties or allow additionalProperties.
- `response-null-not-allowed` (hard, breaking) at `GET /categories.json > response 200 > application/json > /category_list/categories/0/permission`
  - response body at /category_list/categories/0/permission: value is null but the schema does not allow null (and 9 more like it)
  - Request: `GET /categories.json -> 200 application/json; charset=utf-8`
  - Expected: `["integer"]`
  - Actual: `null`
  - If the spec is the source of truth: Return a non-null value in response body at /category_list/categories/0/permission.
  - If the implementation is the source of truth: Allow null at paths["/categories.json"].get.responses["200"].content["application/json"].schema.properties["category_list"].properties["categories"].items.properties["permission"] (add "null" to type, or nullable: true in OpenAPI 3.0).
- `response-forbidden-property` (hard, breaking) at `GET /categories.json > response 200 > application/json > /category_list/categories/0/sort_topics_by_event_start_date`
  - response body at /category_list/categories/0/sort_topics_by_event_start_date: property "sort_topics_by_event_start_date" is not allowed (and 9 more like it)
  - Request: `GET /categories.json -> 200 application/json; charset=utf-8`
  - Actual: `"sort_topics_by_event_start_date"`
  - If the spec is the source of truth: Stop returning "sort_topics_by_event_start_date" from GET /categories.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "sort_topics_by_event_start_date" to paths["/categories.json"].get.responses["200"].content["application/json"].schema.properties["category_list"].properties["categories"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /categories.json > response 200 > application/json > /category_list/categories/6/doc_category_index`
  - response body at /category_list/categories/6/doc_category_index: property "doc_category_index" is not allowed (and 1 more like it)
  - Request: `GET /categories.json -> 200 application/json; charset=utf-8`
  - Actual: `"doc_category_index"`
  - If the spec is the source of truth: Stop returning "doc_category_index" from GET /categories.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "doc_category_index" to paths["/categories.json"].get.responses["200"].content["application/json"].schema.properties["category_list"].properties["categories"].items.properties or allow additionalProperties.
- `response-missing-required-property` (hard, breaking) at `GET /discourse-post-event/events.json > response 200 > application/json > /events/0/at_capacity`
  - response body at /events/0/at_capacity: required property "at_capacity" is missing (and 16 more like it)
  - Request: `GET /discourse-post-event/events.json -> 200 application/json; charset=utf-8`
  - Expected: `"at_capacity"`
  - If the spec is the source of truth: Include "at_capacity" in the 200 response of GET /discourse-post-event/events.json.
  - If the implementation is the source of truth: Remove "at_capacity" from required at paths["/discourse-post-event/events.json"].get.responses["200"].content["application/json"].schema.properties["events"].items.
- `response-missing-required-property` (hard, breaking) at `GET /discourse-post-event/events.json > response 200 > application/json > /events/0/can_act_on_discourse_post_event`
  - response body at /events/0/can_act_on_discourse_post_event: required property "can_act_on_discourse_post_event" is missing (and 16 more like it)
  - Request: `GET /discourse-post-event/events.json -> 200 application/json; charset=utf-8`
  - Expected: `"can_act_on_discourse_post_event"`
  - If the spec is the source of truth: Include "can_act_on_discourse_post_event" in the 200 response of GET /discourse-post-event/events.json.
  - If the implementation is the source of truth: Remove "can_act_on_discourse_post_event" from required at paths["/discourse-post-event/events.json"].get.responses["200"].content["application/json"].schema.properties["events"].items.
- `response-missing-required-property` (hard, breaking) at `GET /discourse-post-event/events.json > response 200 > application/json > /events/0/can_update_attendance`
  - response body at /events/0/can_update_attendance: required property "can_update_attendance" is missing (and 16 more like it)
  - Request: `GET /discourse-post-event/events.json -> 200 application/json; charset=utf-8`
  - Expected: `"can_update_attendance"`
  - If the spec is the source of truth: Include "can_update_attendance" in the 200 response of GET /discourse-post-event/events.json.
  - If the implementation is the source of truth: Remove "can_update_attendance" from required at paths["/discourse-post-event/events.json"].get.responses["200"].content["application/json"].schema.properties["events"].items.
- `response-missing-required-property` (hard, breaking) at `GET /discourse-post-event/events.json > response 200 > application/json > /events/0/is_closed`
  - response body at /events/0/is_closed: required property "is_closed" is missing (and 16 more like it)
  - Request: `GET /discourse-post-event/events.json -> 200 application/json; charset=utf-8`
  - Expected: `"is_closed"`
  - If the spec is the source of truth: Include "is_closed" in the 200 response of GET /discourse-post-event/events.json.
  - If the implementation is the source of truth: Remove "is_closed" from required at paths["/discourse-post-event/events.json"].get.responses["200"].content["application/json"].schema.properties["events"].items.
- `response-missing-required-property` (hard, breaking) at `GET /discourse-post-event/events.json > response 200 > application/json > /events/0/is_expired`
  - response body at /events/0/is_expired: required property "is_expired" is missing (and 16 more like it)
  - Request: `GET /discourse-post-event/events.json -> 200 application/json; charset=utf-8`
  - Expected: `"is_expired"`
  - If the spec is the source of truth: Include "is_expired" in the 200 response of GET /discourse-post-event/events.json.
  - If the implementation is the source of truth: Remove "is_expired" from required at paths["/discourse-post-event/events.json"].get.responses["200"].content["application/json"].schema.properties["events"].items.
- `response-missing-required-property` (hard, breaking) at `GET /discourse-post-event/events.json > response 200 > application/json > /events/0/is_ongoing`
  - response body at /events/0/is_ongoing: required property "is_ongoing" is missing (and 16 more like it)
  - Request: `GET /discourse-post-event/events.json -> 200 application/json; charset=utf-8`
  - Expected: `"is_ongoing"`
  - If the spec is the source of truth: Include "is_ongoing" in the 200 response of GET /discourse-post-event/events.json.
  - If the implementation is the source of truth: Remove "is_ongoing" from required at paths["/discourse-post-event/events.json"].get.responses["200"].content["application/json"].schema.properties["events"].items.
- `response-missing-required-property` (hard, breaking) at `GET /discourse-post-event/events.json > response 200 > application/json > /events/0/is_private`
  - response body at /events/0/is_private: required property "is_private" is missing (and 16 more like it)
  - Request: `GET /discourse-post-event/events.json -> 200 application/json; charset=utf-8`
  - Expected: `"is_private"`
  - If the spec is the source of truth: Include "is_private" in the 200 response of GET /discourse-post-event/events.json.
  - If the implementation is the source of truth: Remove "is_private" from required at paths["/discourse-post-event/events.json"].get.responses["200"].content["application/json"].schema.properties["events"].items.
- `response-missing-required-property` (hard, breaking) at `GET /discourse-post-event/events.json > response 200 > application/json > /events/0/is_public`
  - response body at /events/0/is_public: required property "is_public" is missing (and 16 more like it)
  - Request: `GET /discourse-post-event/events.json -> 200 application/json; charset=utf-8`
  - Expected: `"is_public"`
  - If the spec is the source of truth: Include "is_public" in the 200 response of GET /discourse-post-event/events.json.
  - If the implementation is the source of truth: Remove "is_public" from required at paths["/discourse-post-event/events.json"].get.responses["200"].content["application/json"].schema.properties["events"].items.
- `response-missing-required-property` (hard, breaking) at `GET /discourse-post-event/events.json > response 200 > application/json > /events/0/is_standalone`
  - response body at /events/0/is_standalone: required property "is_standalone" is missing (and 16 more like it)
  - Request: `GET /discourse-post-event/events.json -> 200 application/json; charset=utf-8`
  - Expected: `"is_standalone"`
  - If the spec is the source of truth: Include "is_standalone" in the 200 response of GET /discourse-post-event/events.json.
  - If the implementation is the source of truth: Remove "is_standalone" from required at paths["/discourse-post-event/events.json"].get.responses["200"].content["application/json"].schema.properties["events"].items.
- `response-type-mismatch` (hard, breaking) at `GET /discourse-post-event/events.json > response 200 > application/json > /events/0/post/topic/tags/0`
  - response body at /events/0/post/topic/tags/0: expected "string" but got object (and 16 more like it)
  - Request: `GET /discourse-post-event/events.json -> 200 application/json; charset=utf-8`
  - Expected: `["string"]`
  - Actual: `"object"`
  - If the spec is the source of truth: Return "string" in response body at /events/0/post/topic/tags/0.
  - If the implementation is the source of truth: Change the type at paths["/discourse-post-event/events.json"].get.responses["200"].content["application/json"].schema.properties["events"].items.properties["post"].properties["topic"].properties["tags"].items to "object".
- `response-missing-required-property` (hard, breaking) at `GET /discourse-post-event/events.json > response 200 > application/json > /events/0/should_display_invitees`
  - response body at /events/0/should_display_invitees: required property "should_display_invitees" is missing (and 16 more like it)
  - Request: `GET /discourse-post-event/events.json -> 200 application/json; charset=utf-8`
  - Expected: `"should_display_invitees"`
  - If the spec is the source of truth: Include "should_display_invitees" in the 200 response of GET /discourse-post-event/events.json.
  - If the implementation is the source of truth: Remove "should_display_invitees" from required at paths["/discourse-post-event/events.json"].get.responses["200"].content["application/json"].schema.properties["events"].items.
- `response-missing-required-property` (hard, breaking) at `GET /discourse-post-event/events.json > response 200 > application/json > /events/0/status`
  - response body at /events/0/status: required property "status" is missing (and 16 more like it)
  - Request: `GET /discourse-post-event/events.json -> 200 application/json; charset=utf-8`
  - Expected: `"status"`
  - If the spec is the source of truth: Include "status" in the 200 response of GET /discourse-post-event/events.json.
  - If the implementation is the source of truth: Remove "status" from required at paths["/discourse-post-event/events.json"].get.responses["200"].content["application/json"].schema.properties["events"].items.
- `response-missing-required-property` (hard, breaking) at `GET /groups.json > response 200 > application/json > /groups/0/bio_raw`
  - response body at /groups/0/bio_raw: required property "bio_raw" is missing (and 20 more like it)
  - Request: `GET /groups.json -> 200 application/json; charset=utf-8`
  - Expected: `"bio_raw"`
  - If the spec is the source of truth: Include "bio_raw" in the 200 response of GET /groups.json.
  - If the implementation is the source of truth: Remove "bio_raw" from required at paths["/groups.json"].get.responses["200"].content["application/json"].schema.properties["groups"].items.
- `response-missing-required-property` (hard, breaking) at `GET /groups.json > response 200 > application/json > /groups/0/can_admin_group`
  - response body at /groups/0/can_admin_group: required property "can_admin_group" is missing (and 20 more like it)
  - Request: `GET /groups.json -> 200 application/json; charset=utf-8`
  - Expected: `"can_admin_group"`
  - If the spec is the source of truth: Include "can_admin_group" in the 200 response of GET /groups.json.
  - If the implementation is the source of truth: Remove "can_admin_group" from required at paths["/groups.json"].get.responses["200"].content["application/json"].schema.properties["groups"].items.
- `response-missing-required-property` (hard, breaking) at `GET /groups.json > response 200 > application/json > /groups/0/display_name`
  - response body at /groups/0/display_name: required property "display_name" is missing (and 20 more like it)
  - Request: `GET /groups.json -> 200 application/json; charset=utf-8`
  - Expected: `"display_name"`
  - If the spec is the source of truth: Include "display_name" in the 200 response of GET /groups.json.
  - If the implementation is the source of truth: Remove "display_name" from required at paths["/groups.json"].get.responses["200"].content["application/json"].schema.properties["groups"].items.
- `response-missing-required-property` (hard, breaking) at `GET /groups.json > response 200 > application/json > /groups/0/has_messages`
  - response body at /groups/0/has_messages: required property "has_messages" is missing (and 20 more like it)
  - Request: `GET /groups.json -> 200 application/json; charset=utf-8`
  - Expected: `"has_messages"`
  - If the spec is the source of truth: Include "has_messages" in the 200 response of GET /groups.json.
  - If the implementation is the source of truth: Remove "has_messages" from required at paths["/groups.json"].get.responses["200"].content["application/json"].schema.properties["groups"].items.
- `response-missing-required-property` (hard, breaking) at `GET /groups.json > response 200 > application/json > /groups/0/incoming_email`
  - response body at /groups/0/incoming_email: required property "incoming_email" is missing (and 20 more like it)
  - Request: `GET /groups.json -> 200 application/json; charset=utf-8`
  - Expected: `"incoming_email"`
  - If the spec is the source of truth: Include "incoming_email" in the 200 response of GET /groups.json.
  - If the implementation is the source of truth: Remove "incoming_email" from required at paths["/groups.json"].get.responses["200"].content["application/json"].schema.properties["groups"].items.
- `response-type-mismatch` (hard, breaking) at `GET /groups.json > response 200 > application/json > /groups/10/grant_trust_level`
  - response body at /groups/10/grant_trust_level: expected "null, string" but got integer (and 4 more like it)
  - Request: `GET /groups.json -> 200 application/json; charset=utf-8`
  - Expected: `["null","string"]`
  - Actual: `"integer"`
  - If the spec is the source of truth: Return "null, string" in response body at /groups/10/grant_trust_level.
  - If the implementation is the source of truth: Change the type at paths["/groups.json"].get.responses["200"].content["application/json"].schema.properties["groups"].items.properties["grant_trust_level"] to "integer".
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/accepted_answer`
  - response body at /latest_posts/0/accepted_answer: property "accepted_answer" is not allowed (and 49 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"accepted_answer"`
  - If the spec is the source of truth: Stop returning "accepted_answer" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "accepted_answer" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/can_accept_answer`
  - response body at /latest_posts/0/can_accept_answer: property "can_accept_answer" is not allowed (and 49 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"can_accept_answer"`
  - If the spec is the source of truth: Stop returning "can_accept_answer" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "can_accept_answer" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/can_unaccept_answer`
  - response body at /latest_posts/0/can_unaccept_answer: property "can_unaccept_answer" is not allowed (and 49 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"can_unaccept_answer"`
  - If the spec is the source of truth: Stop returning "can_unaccept_answer" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "can_unaccept_answer" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/current_user_reaction`
  - response body at /latest_posts/0/current_user_reaction: property "current_user_reaction" is not allowed (and 49 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"current_user_reaction"`
  - If the spec is the source of truth: Stop returning "current_user_reaction" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "current_user_reaction" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/current_user_used_main_reaction`
  - response body at /latest_posts/0/current_user_used_main_reaction: property "current_user_used_main_reaction" is not allowed (and 49 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"current_user_used_main_reaction"`
  - If the spec is the source of truth: Stop returning "current_user_used_main_reaction" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "current_user_used_main_reaction" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/customer_flair_customer`
  - response body at /latest_posts/0/customer_flair_customer: property "customer_flair_customer" is not allowed (and 49 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"customer_flair_customer"`
  - If the spec is the source of truth: Stop returning "customer_flair_customer" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "customer_flair_customer" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/event`
  - response body at /latest_posts/0/event: property "event" is not allowed (and 49 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"event"`
  - If the spec is the source of truth: Stop returning "event" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "event" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties or allow additionalProperties.
- `response-type-mismatch` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/flair_group_id`
  - response body at /latest_posts/0/flair_group_id: expected "null, string" but got integer (and 32 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Expected: `["null","string"]`
  - Actual: `"integer"`
  - If the spec is the source of truth: Return "null, string" in response body at /latest_posts/0/flair_group_id.
  - If the implementation is the source of truth: Change the type at paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties["flair_group_id"] to "integer".
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/is_localized`
  - response body at /latest_posts/0/is_localized: property "is_localized" is not allowed (and 49 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"is_localized"`
  - If the spec is the source of truth: Stop returning "is_localized" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "is_localized" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/language`
  - response body at /latest_posts/0/language: property "language" is not allowed (and 49 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"language"`
  - If the spec is the source of truth: Stop returning "language" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "language" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/locale`
  - response body at /latest_posts/0/locale: property "locale" is not allowed (and 49 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"locale"`
  - If the spec is the source of truth: Stop returning "locale" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "locale" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/reaction_users_count`
  - response body at /latest_posts/0/reaction_users_count: property "reaction_users_count" is not allowed (and 49 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"reaction_users_count"`
  - If the spec is the source of truth: Stop returning "reaction_users_count" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "reaction_users_count" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/reactions`
  - response body at /latest_posts/0/reactions: property "reactions" is not allowed (and 49 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"reactions"`
  - If the spec is the source of truth: Stop returning "reactions" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "reactions" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties or allow additionalProperties.
- `response-type-mismatch` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/reply_to_post_number`
  - response body at /latest_posts/0/reply_to_post_number: expected "null, string" but got integer (and 24 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Expected: `["null","string"]`
  - Actual: `"integer"`
  - If the spec is the source of truth: Return "null, string" in response body at /latest_posts/0/reply_to_post_number.
  - If the implementation is the source of truth: Change the type at paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties["reply_to_post_number"] to "integer".
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/reply_to_user`
  - response body at /latest_posts/0/reply_to_user: property "reply_to_user" is not allowed (and 19 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"reply_to_user"`
  - If the spec is the source of truth: Stop returning "reply_to_user" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "reply_to_user" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties or allow additionalProperties.
- `response-missing-required-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/reviewable_id`
  - response body at /latest_posts/0/reviewable_id: required property "reviewable_id" is missing (and 49 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Expected: `"reviewable_id"`
  - If the spec is the source of truth: Include "reviewable_id" in the 200 response of GET /posts.json.
  - If the implementation is the source of truth: Remove "reviewable_id" from required at paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.
- `response-missing-required-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/reviewable_score_count`
  - response body at /latest_posts/0/reviewable_score_count: required property "reviewable_score_count" is missing (and 49 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Expected: `"reviewable_score_count"`
  - If the spec is the source of truth: Include "reviewable_score_count" in the 200 response of GET /posts.json.
  - If the implementation is the source of truth: Remove "reviewable_score_count" from required at paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.
- `response-missing-required-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/reviewable_score_pending_count`
  - response body at /latest_posts/0/reviewable_score_pending_count: required property "reviewable_score_pending_count" is missing (and 49 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Expected: `"reviewable_score_pending_count"`
  - If the spec is the source of truth: Include "reviewable_score_pending_count" in the 200 response of GET /posts.json.
  - If the implementation is the source of truth: Remove "reviewable_score_pending_count" from required at paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/title_is_group`
  - response body at /latest_posts/0/title_is_group: property "title_is_group" is not allowed (and 34 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"title_is_group"`
  - If the spec is the source of truth: Stop returning "title_is_group" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "title_is_group" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/0/topic_accepted_answer`
  - response body at /latest_posts/0/topic_accepted_answer: property "topic_accepted_answer" is not allowed (and 49 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"topic_accepted_answer"`
  - If the spec is the source of truth: Stop returning "topic_accepted_answer" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "topic_accepted_answer" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties or allow additionalProperties.
- `response-missing-required-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/1/actions_summary/0/can_act`
  - response body at /latest_posts/1/actions_summary/0/can_act: required property "can_act" is missing (and 20 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Expected: `"can_act"`
  - If the spec is the source of truth: Include "can_act" in the 200 response of GET /posts.json.
  - If the implementation is the source of truth: Remove "can_act" from required at paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties["actions_summary"].items.
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/1/actions_summary/0/count`
  - response body at /latest_posts/1/actions_summary/0/count: property "count" is not allowed (and 20 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"count"`
  - If the spec is the source of truth: Stop returning "count" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "count" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties["actions_summary"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/17/localization_outdated`
  - response body at /latest_posts/17/localization_outdated: property "localization_outdated" is not allowed (and 2 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"localization_outdated"`
  - If the spec is the source of truth: Stop returning "localization_outdated" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "localization_outdated" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/49/group_moderator`
  - response body at /latest_posts/49/group_moderator: property "group_moderator" is not allowed
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"group_moderator"`
  - If the spec is the source of truth: Stop returning "group_moderator" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "group_moderator" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/6/calendar_details`
  - response body at /latest_posts/6/calendar_details: property "calendar_details" is not allowed (and 6 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"calendar_details"`
  - If the spec is the source of truth: Stop returning "calendar_details" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "calendar_details" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /posts.json > response 200 > application/json > /latest_posts/6/can_vote`
  - response body at /latest_posts/6/can_vote: property "can_vote" is not allowed (and 6 more like it)
  - Request: `GET /posts.json -> 200 application/json; charset=utf-8`
  - Actual: `"can_vote"`
  - If the spec is the source of truth: Stop returning "can_vote" from GET /posts.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "can_vote" to paths["/posts.json"].get.responses["200"].content["application/json"].schema.properties["latest_posts"].items.properties or allow additionalProperties.
- `response-missing-required-property` (hard, breaking) at `GET /posts/{id}.json > response 200 > application/json > /reviewable_id`
  - response body at /reviewable_id: required property "reviewable_id" is missing
  - Request: `GET /posts/1.json -> 200 application/json; charset=utf-8`
  - Expected: `"reviewable_id"`
  - If the spec is the source of truth: Include "reviewable_id" in the 200 response of GET /posts/{id}.json.
  - If the implementation is the source of truth: Remove "reviewable_id" from required at paths["/posts/{id}.json"].get.responses["200"].content["application/json"].schema.
- `response-missing-required-property` (hard, breaking) at `GET /posts/{id}.json > response 200 > application/json > /reviewable_score_count`
  - response body at /reviewable_score_count: required property "reviewable_score_count" is missing
  - Request: `GET /posts/1.json -> 200 application/json; charset=utf-8`
  - Expected: `"reviewable_score_count"`
  - If the spec is the source of truth: Include "reviewable_score_count" in the 200 response of GET /posts/{id}.json.
  - If the implementation is the source of truth: Remove "reviewable_score_count" from required at paths["/posts/{id}.json"].get.responses["200"].content["application/json"].schema.
- `response-missing-required-property` (hard, breaking) at `GET /posts/{id}.json > response 200 > application/json > /reviewable_score_pending_count`
  - response body at /reviewable_score_pending_count: required property "reviewable_score_pending_count" is missing
  - Request: `GET /posts/1.json -> 200 application/json; charset=utf-8`
  - Expected: `"reviewable_score_pending_count"`
  - If the spec is the source of truth: Include "reviewable_score_pending_count" in the 200 response of GET /posts/{id}.json.
  - If the implementation is the source of truth: Remove "reviewable_score_pending_count" from required at paths["/posts/{id}.json"].get.responses["200"].content["application/json"].schema.
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /anonymous_default_navigation_menu_tags`
  - response body at /anonymous_default_navigation_menu_tags: property "anonymous_default_navigation_menu_tags" is not allowed
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"anonymous_default_navigation_menu_tags"`
  - If the spec is the source of truth: Stop returning "anonymous_default_navigation_menu_tags" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "anonymous_default_navigation_menu_tags" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /anonymous_sidebar_sections`
  - response body at /anonymous_sidebar_sections: property "anonymous_sidebar_sections" is not allowed
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"anonymous_sidebar_sections"`
  - If the spec is the source of truth: Stop returning "anonymous_sidebar_sections" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "anonymous_sidebar_sections" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /can_see_styleguide`
  - response body at /can_see_styleguide: property "can_see_styleguide" is not allowed
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"can_see_styleguide"`
  - If the spec is the source of truth: Stop returning "can_see_styleguide" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "can_see_styleguide" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /categories/0/disable_topic_resorting`
  - response body at /categories/0/disable_topic_resorting: property "disable_topic_resorting" is not allowed (and 43 more like it)
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"disable_topic_resorting"`
  - If the spec is the source of truth: Stop returning "disable_topic_resorting" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "disable_topic_resorting" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties["categories"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /categories/0/doc_index_topic_id`
  - response body at /categories/0/doc_index_topic_id: property "doc_index_topic_id" is not allowed (and 43 more like it)
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"doc_index_topic_id"`
  - If the spec is the source of truth: Stop returning "doc_index_topic_id" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "doc_index_topic_id" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties["categories"].items.properties or allow additionalProperties.
- `response-null-not-allowed` (hard, breaking) at `GET /site.json > response 200 > application/json > /categories/0/permission`
  - response body at /categories/0/permission: value is null but the schema does not allow null (and 43 more like it)
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Expected: `["integer"]`
  - Actual: `null`
  - If the spec is the source of truth: Return a non-null value in response body at /categories/0/permission.
  - If the implementation is the source of truth: Allow null at paths["/site.json"].get.responses["200"].content["application/json"].schema.properties["categories"].items.properties["permission"] (add "null" to type, or nullable: true in OpenAPI 3.0).
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /categories/0/sort_topics_by_event_start_date`
  - response body at /categories/0/sort_topics_by_event_start_date: property "sort_topics_by_event_start_date" is not allowed (and 43 more like it)
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"sort_topics_by_event_start_date"`
  - If the spec is the source of truth: Stop returning "sort_topics_by_event_start_date" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "sort_topics_by_event_start_date" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties["categories"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /categories/18/can_vote`
  - response body at /categories/18/can_vote: property "can_vote" is not allowed
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"can_vote"`
  - If the spec is the source of truth: Stop returning "can_vote" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "can_vote" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties["categories"].items.properties or allow additionalProperties.
- `response-type-mismatch` (hard, breaking) at `GET /site.json > response 200 > application/json > /categories/2/sort_ascending`
  - response body at /categories/2/sort_ascending: expected "null, string" but got boolean (and 1 more like it)
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Expected: `["null","string"]`
  - Actual: `"boolean"`
  - If the spec is the source of truth: Return "null, string" in response body at /categories/2/sort_ascending.
  - If the implementation is the source of truth: Change the type at paths["/site.json"].get.responses["200"].content["application/json"].schema.properties["categories"].items.properties["sort_ascending"] to "boolean".
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /categories/28/doc_category_index`
  - response body at /categories/28/doc_category_index: property "doc_category_index" is not allowed (and 13 more like it)
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"doc_category_index"`
  - If the spec is the source of truth: Stop returning "doc_category_index" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "doc_category_index" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties["categories"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /default_gamification_leaderboard_id`
  - response body at /default_gamification_leaderboard_id: property "default_gamification_leaderboard_id" is not allowed
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"default_gamification_leaderboard_id"`
  - If the spec is the source of truth: Stop returning "default_gamification_leaderboard_id" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "default_gamification_leaderboard_id" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /discourse_math_bundle_url`
  - response body at /discourse_math_bundle_url: property "discourse_math_bundle_url" is not allowed
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"discourse_math_bundle_url"`
  - If the spec is the source of truth: Stop returning "discourse_math_bundle_url" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "discourse_math_bundle_url" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /docs_legacy_path`
  - response body at /docs_legacy_path: property "docs_legacy_path" is not allowed
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"docs_legacy_path"`
  - If the spec is the source of truth: Stop returning "docs_legacy_path" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "docs_legacy_path" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties or allow additionalProperties.
- `response-null-not-allowed` (hard, breaking) at `GET /site.json > response 200 > application/json > /homepage_options/1/path`
  - response body at /homepage_options/1/path: value is null but the schema does not allow null
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Expected: `["string"]`
  - Actual: `null`
  - If the spec is the source of truth: Return a non-null value in response body at /homepage_options/1/path.
  - If the implementation is the source of truth: Allow null at paths["/site.json"].get.responses["200"].content["application/json"].schema.properties["homepage_options"].items.properties["path"] (add "null" to type, or nullable: true in OpenAPI 3.0).
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /hosting_tier`
  - response body at /hosting_tier: property "hosting_tier" is not allowed
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"hosting_tier"`
  - If the spec is the source of truth: Stop returning "hosting_tier" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "hosting_tier" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /live_assets_path`
  - response body at /live_assets_path: property "live_assets_path" is not allowed
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"live_assets_path"`
  - If the spec is the source of truth: Stop returning "live_assets_path" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "live_assets_path" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /live_livekit_agent_bot_id`
  - response body at /live_livekit_agent_bot_id: property "live_livekit_agent_bot_id" is not allowed
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"live_livekit_agent_bot_id"`
  - If the spec is the source of truth: Stop returning "live_livekit_agent_bot_id" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "live_livekit_agent_bot_id" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /live_livekit_per_room_available`
  - response body at /live_livekit_per_room_available: property "live_livekit_per_room_available" is not allowed
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"live_livekit_per_room_available"`
  - If the spec is the source of truth: Stop returning "live_livekit_per_room_available" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "live_livekit_per_room_available" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /live_public_access`
  - response body at /live_public_access: property "live_public_access" is not allowed
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"live_public_access"`
  - If the spec is the source of truth: Stop returning "live_public_access" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "live_public_access" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /live_reaction_emojis`
  - response body at /live_reaction_emojis: property "live_reaction_emojis" is not allowed
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"live_reaction_emojis"`
  - If the spec is the source of truth: Stop returning "live_reaction_emojis" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "live_reaction_emojis" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /live_reactions_allow_any_emoji`
  - response body at /live_reactions_allow_any_emoji: property "live_reactions_allow_any_emoji" is not allowed
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"live_reactions_allow_any_emoji"`
  - If the spec is the source of truth: Stop returning "live_reactions_allow_any_emoji" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "live_reactions_allow_any_emoji" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /live_video_available`
  - response body at /live_video_available: property "live_video_available" is not allowed
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"live_video_available"`
  - If the spec is the source of truth: Stop returning "live_video_available" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "live_video_available" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /privacy_policy_url`
  - response body at /privacy_policy_url: property "privacy_policy_url" is not allowed
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"privacy_policy_url"`
  - If the spec is the source of truth: Stop returning "privacy_policy_url" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "privacy_policy_url" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /system_user_avatar_template`
  - response body at /system_user_avatar_template: property "system_user_avatar_template" is not allowed
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"system_user_avatar_template"`
  - If the spec is the source of truth: Stop returning "system_user_avatar_template" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "system_user_avatar_template" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /site.json > response 200 > application/json > /tos_url`
  - response body at /tos_url: property "tos_url" is not allowed
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Actual: `"tos_url"`
  - If the spec is the source of truth: Stop returning "tos_url" from GET /site.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "tos_url" to paths["/site.json"].get.responses["200"].content["application/json"].schema.properties or allow additionalProperties.
- `response-type-mismatch` (hard, breaking) at `GET /site.json > response 200 > application/json > /watched_words_link`
  - response body at /watched_words_link: expected "null, string" but got object
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Expected: `["null","string"]`
  - Actual: `"object"`
  - If the spec is the source of truth: Return "null, string" in response body at /watched_words_link.
  - If the implementation is the source of truth: Change the type at paths["/site.json"].get.responses["200"].content["application/json"].schema.properties["watched_words_link"] to "object".
- `response-type-mismatch` (hard, breaking) at `GET /site.json > response 200 > application/json > /watched_words_replace`
  - response body at /watched_words_replace: expected "null, string" but got object
  - Request: `GET /site.json -> 200 application/json; charset=utf-8`
  - Expected: `["null","string"]`
  - Actual: `"object"`
  - If the spec is the source of truth: Return "null, string" in response body at /watched_words_replace.
  - If the implementation is the source of truth: Change the type at paths["/site.json"].get.responses["200"].content["application/json"].schema.properties["watched_words_replace"] to "object".
- `response-forbidden-property` (hard, breaking) at `GET /user-badges/{username}.json > response 200 > application/json > /badges/0/show_in_post_header`
  - response body at /badges/0/show_in_post_header: property "show_in_post_header" is not allowed (and 2 more like it)
  - Request: `GET /user-badges/system.json -> 200 application/json; charset=utf-8`
  - Actual: `"show_in_post_header"`
  - If the spec is the source of truth: Stop returning "show_in_post_header" from GET /user-badges/{username}.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "show_in_post_header" to paths["/user-badges/{username}.json"].get.responses["200"].content["application/json"].schema.properties["badges"].items.properties or allow additionalProperties.
- `response-missing-required-property` (hard, breaking) at `GET /user-badges/{username}.json > response 200 > application/json > /granted_bies/0/flair_name`
  - response body at /granted_bies/0/flair_name: required property "flair_name" is missing
  - Request: `GET /user-badges/system.json -> 200 application/json; charset=utf-8`
  - Expected: `"flair_name"`
  - If the spec is the source of truth: Include "flair_name" in the 200 response of GET /user-badges/{username}.json.
  - If the implementation is the source of truth: Remove "flair_name" from required at paths["/user-badges/{username}.json"].get.responses["200"].content["application/json"].schema.properties["granted_bies"].items.
- `response-forbidden-property` (hard, breaking) at `GET /user-badges/{username}.json > response 200 > application/json > /user_badges/5/post_number`
  - response body at /user_badges/5/post_number: property "post_number" is not allowed
  - Request: `GET /user-badges/system.json -> 200 application/json; charset=utf-8`
  - Actual: `"post_number"`
  - If the spec is the source of truth: Stop returning "post_number" from GET /user-badges/{username}.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "post_number" to paths["/user-badges/{username}.json"].get.responses["200"].content["application/json"].schema.properties["user_badges"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /user-badges/{username}.json > response 200 > application/json > /user_badges/5/topic_id`
  - response body at /user_badges/5/topic_id: property "topic_id" is not allowed
  - Request: `GET /user-badges/system.json -> 200 application/json; charset=utf-8`
  - Actual: `"topic_id"`
  - If the spec is the source of truth: Stop returning "topic_id" from GET /user-badges/{username}.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "topic_id" to paths["/user-badges/{username}.json"].get.responses["200"].content["application/json"].schema.properties["user_badges"].items.properties or allow additionalProperties.
- `response-forbidden-property` (hard, breaking) at `GET /user-badges/{username}.json > response 200 > application/json > /user_badges/5/topic_title`
  - response body at /user_badges/5/topic_title: property "topic_title" is not allowed
  - Request: `GET /user-badges/system.json -> 200 application/json; charset=utf-8`
  - Actual: `"topic_title"`
  - If the spec is the source of truth: Stop returning "topic_title" from GET /user-badges/{username}.json; the spec forbids unknown properties here.
  - If the implementation is the source of truth: Add "topic_title" to paths["/user-badges/{username}.json"].get.responses["200"].content["application/json"].schema.properties["user_badges"].items.properties or allow additionalProperties.

## Other body findings (20)

Undocumented fields and loose constraints on successful responses. Documentation gaps, not violations.

- `response-undocumented-property` (body, info) at `GET /posts/{id}.json > response 200 > application/json > /accepted_answer`
  - response body at /accepted_answer: property "accepted_answer" is not documented
  - Request: `GET /posts/1.json -> 200 application/json; charset=utf-8`
  - Actual: `"accepted_answer"`
  - If the spec is the source of truth: Stop returning "accepted_answer" from GET /posts/{id}.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "accepted_answer" to paths["/posts/{id}.json"].get.responses["200"].content["application/json"].schema.properties.
- `response-undocumented-property` (body, info) at `GET /posts/{id}.json > response 200 > application/json > /badges_granted`
  - response body at /badges_granted: property "badges_granted" is not documented
  - Request: `GET /posts/1.json -> 200 application/json; charset=utf-8`
  - Actual: `"badges_granted"`
  - If the spec is the source of truth: Stop returning "badges_granted" from GET /posts/{id}.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "badges_granted" to paths["/posts/{id}.json"].get.responses["200"].content["application/json"].schema.properties.
- `response-undocumented-property` (body, info) at `GET /posts/{id}.json > response 200 > application/json > /calendar_details`
  - response body at /calendar_details: property "calendar_details" is not documented
  - Request: `GET /posts/1.json -> 200 application/json; charset=utf-8`
  - Actual: `"calendar_details"`
  - If the spec is the source of truth: Stop returning "calendar_details" from GET /posts/{id}.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "calendar_details" to paths["/posts/{id}.json"].get.responses["200"].content["application/json"].schema.properties.
- `response-undocumented-property` (body, info) at `GET /posts/{id}.json > response 200 > application/json > /can_accept_answer`
  - response body at /can_accept_answer: property "can_accept_answer" is not documented
  - Request: `GET /posts/1.json -> 200 application/json; charset=utf-8`
  - Actual: `"can_accept_answer"`
  - If the spec is the source of truth: Stop returning "can_accept_answer" from GET /posts/{id}.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "can_accept_answer" to paths["/posts/{id}.json"].get.responses["200"].content["application/json"].schema.properties.
- `response-undocumented-property` (body, info) at `GET /posts/{id}.json > response 200 > application/json > /can_unaccept_answer`
  - response body at /can_unaccept_answer: property "can_unaccept_answer" is not documented
  - Request: `GET /posts/1.json -> 200 application/json; charset=utf-8`
  - Actual: `"can_unaccept_answer"`
  - If the spec is the source of truth: Stop returning "can_unaccept_answer" from GET /posts/{id}.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "can_unaccept_answer" to paths["/posts/{id}.json"].get.responses["200"].content["application/json"].schema.properties.
- `response-undocumented-property` (body, info) at `GET /posts/{id}.json > response 200 > application/json > /can_vote`
  - response body at /can_vote: property "can_vote" is not documented
  - Request: `GET /posts/1.json -> 200 application/json; charset=utf-8`
  - Actual: `"can_vote"`
  - If the spec is the source of truth: Stop returning "can_vote" from GET /posts/{id}.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "can_vote" to paths["/posts/{id}.json"].get.responses["200"].content["application/json"].schema.properties.
- `response-undocumented-property` (body, info) at `GET /posts/{id}.json > response 200 > application/json > /current_user_reaction`
  - response body at /current_user_reaction: property "current_user_reaction" is not documented
  - Request: `GET /posts/1.json -> 200 application/json; charset=utf-8`
  - Actual: `"current_user_reaction"`
  - If the spec is the source of truth: Stop returning "current_user_reaction" from GET /posts/{id}.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "current_user_reaction" to paths["/posts/{id}.json"].get.responses["200"].content["application/json"].schema.properties.
- `response-undocumented-property` (body, info) at `GET /posts/{id}.json > response 200 > application/json > /current_user_used_main_reaction`
  - response body at /current_user_used_main_reaction: property "current_user_used_main_reaction" is not documented
  - Request: `GET /posts/1.json -> 200 application/json; charset=utf-8`
  - Actual: `"current_user_used_main_reaction"`
  - If the spec is the source of truth: Stop returning "current_user_used_main_reaction" from GET /posts/{id}.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "current_user_used_main_reaction" to paths["/posts/{id}.json"].get.responses["200"].content["application/json"].schema.properties.
- `response-undocumented-property` (body, info) at `GET /posts/{id}.json > response 200 > application/json > /customer_flair_customer`
  - response body at /customer_flair_customer: property "customer_flair_customer" is not documented
  - Request: `GET /posts/1.json -> 200 application/json; charset=utf-8`
  - Actual: `"customer_flair_customer"`
  - If the spec is the source of truth: Stop returning "customer_flair_customer" from GET /posts/{id}.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "customer_flair_customer" to paths["/posts/{id}.json"].get.responses["200"].content["application/json"].schema.properties.
- `response-undocumented-property` (body, info) at `GET /posts/{id}.json > response 200 > application/json > /event`
  - response body at /event: property "event" is not documented
  - Request: `GET /posts/1.json -> 200 application/json; charset=utf-8`
  - Actual: `"event"`
  - If the spec is the source of truth: Stop returning "event" from GET /posts/{id}.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "event" to paths["/posts/{id}.json"].get.responses["200"].content["application/json"].schema.properties.
- `response-undocumented-property` (body, info) at `GET /posts/{id}.json > response 200 > application/json > /is_localized`
  - response body at /is_localized: property "is_localized" is not documented
  - Request: `GET /posts/1.json -> 200 application/json; charset=utf-8`
  - Actual: `"is_localized"`
  - If the spec is the source of truth: Stop returning "is_localized" from GET /posts/{id}.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "is_localized" to paths["/posts/{id}.json"].get.responses["200"].content["application/json"].schema.properties.
- `response-undocumented-property` (body, info) at `GET /posts/{id}.json > response 200 > application/json > /language`
  - response body at /language: property "language" is not documented
  - Request: `GET /posts/1.json -> 200 application/json; charset=utf-8`
  - Actual: `"language"`
  - If the spec is the source of truth: Stop returning "language" from GET /posts/{id}.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "language" to paths["/posts/{id}.json"].get.responses["200"].content["application/json"].schema.properties.
- `response-undocumented-property` (body, info) at `GET /posts/{id}.json > response 200 > application/json > /locale`
  - response body at /locale: property "locale" is not documented
  - Request: `GET /posts/1.json -> 200 application/json; charset=utf-8`
  - Actual: `"locale"`
  - If the spec is the source of truth: Stop returning "locale" from GET /posts/{id}.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "locale" to paths["/posts/{id}.json"].get.responses["200"].content["application/json"].schema.properties.
- `response-undocumented-property` (body, info) at `GET /posts/{id}.json > response 200 > application/json > /reaction_users_count`
  - response body at /reaction_users_count: property "reaction_users_count" is not documented
  - Request: `GET /posts/1.json -> 200 application/json; charset=utf-8`
  - Actual: `"reaction_users_count"`
  - If the spec is the source of truth: Stop returning "reaction_users_count" from GET /posts/{id}.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "reaction_users_count" to paths["/posts/{id}.json"].get.responses["200"].content["application/json"].schema.properties.
- `response-undocumented-property` (body, info) at `GET /posts/{id}.json > response 200 > application/json > /reactions`
  - response body at /reactions: property "reactions" is not documented
  - Request: `GET /posts/1.json -> 200 application/json; charset=utf-8`
  - Actual: `"reactions"`
  - If the spec is the source of truth: Stop returning "reactions" from GET /posts/{id}.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "reactions" to paths["/posts/{id}.json"].get.responses["200"].content["application/json"].schema.properties.
- `response-undocumented-property` (body, info) at `GET /posts/{id}.json > response 200 > application/json > /topic_accepted_answer`
  - response body at /topic_accepted_answer: property "topic_accepted_answer" is not documented
  - Request: `GET /posts/1.json -> 200 application/json; charset=utf-8`
  - Actual: `"topic_accepted_answer"`
  - If the spec is the source of truth: Stop returning "topic_accepted_answer" from GET /posts/{id}.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "topic_accepted_answer" to paths["/posts/{id}.json"].get.responses["200"].content["application/json"].schema.properties.
- `response-undocumented-property` (body, info) at `GET /tags.json > response 200 > application/json > /extras/tag_groups`
  - response body at /extras/tag_groups: property "tag_groups" is not documented
  - Request: `GET /tags.json -> 200 application/json; charset=utf-8`
  - Actual: `"tag_groups"`
  - If the spec is the source of truth: Stop returning "tag_groups" from GET /tags.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "tag_groups" to paths["/tags.json"].get.responses["200"].content["application/json"].schema.properties["extras"].properties.
- `response-undocumented-property` (body, info) at `GET /tags.json > response 200 > application/json > /tags/0/description`
  - response body at /tags/0/description: property "description" is not documented (and 166 more like it)
  - Request: `GET /tags.json -> 200 application/json; charset=utf-8`
  - Actual: `"description"`
  - If the spec is the source of truth: Stop returning "description" from GET /tags.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "description" to paths["/tags.json"].get.responses["200"].content["application/json"].schema.properties["tags"].items.properties.
- `response-undocumented-property` (body, info) at `GET /tags.json > response 200 > application/json > /tags/0/pm_only`
  - response body at /tags/0/pm_only: property "pm_only" is not documented (and 166 more like it)
  - Request: `GET /tags.json -> 200 application/json; charset=utf-8`
  - Actual: `"pm_only"`
  - If the spec is the source of truth: Stop returning "pm_only" from GET /tags.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "pm_only" to paths["/tags.json"].get.responses["200"].content["application/json"].schema.properties["tags"].items.properties.
- `response-undocumented-property` (body, info) at `GET /tags.json > response 200 > application/json > /tags/0/slug`
  - response body at /tags/0/slug: property "slug" is not documented (and 166 more like it)
  - Request: `GET /tags.json -> 200 application/json; charset=utf-8`
  - Actual: `"slug"`
  - If the spec is the source of truth: Stop returning "slug" from GET /tags.json if it is not part of the contract.
  - If the implementation is the source of truth: Add "slug" to paths["/tags.json"].get.responses["200"].content["application/json"].schema.properties["tags"].items.properties.

## Undocumented error responses (8)

3xx and 4xx statuses the spec does not mention, usually auth or not-found cases.

- `undocumented-status` (errors, breaking) at `GET /c/{slug}/{id}.json > response 301`
  - status 301 is not documented for "GET /c/{slug}/{id}.json"
  - Request: `GET /c/general/1.json -> 301 text/html; charset=utf-8`
  - Expected: `["200"]`
  - Actual: `301`
  - If the spec is the source of truth: Return one of the documented statuses (200) from GET /c/{slug}/{id}.json.
  - If the implementation is the source of truth: Add a "301" response under paths["/c/{slug}/{id}.json"].get.responses.
- `undocumented-status` (errors, breaking) at `GET /groups/by-id/{id}.json > response 404`
  - status 404 is not documented for "GET /groups/by-id/{id}.json"
  - Request: `GET /groups/by-id/1.json -> 404 application/json; charset=utf-8`
  - Expected: `["200"]`
  - Actual: `404`
  - If the spec is the source of truth: Return one of the documented statuses (200) from GET /groups/by-id/{id}.json.
  - If the implementation is the source of truth: Add a "404" response under paths["/groups/by-id/{id}.json"].get.responses.
- `undocumented-status` (errors, breaking) at `GET /groups/{name}.json > response 404`
  - status 404 is not documented for "GET /groups/{name}.json"
  - Request: `GET /groups/general.json -> 404 application/json; charset=utf-8`
  - Expected: `["200"]`
  - Actual: `404`
  - If the spec is the source of truth: Return one of the documented statuses (200) from GET /groups/{name}.json.
  - If the implementation is the source of truth: Add a "404" response under paths["/groups/{name}.json"].get.responses.
- `undocumented-status` (errors, breaking) at `GET /groups/{name}/members.json > response 404`
  - status 404 is not documented for "GET /groups/{name}/members.json"
  - Request: `GET /groups/general/members.json -> 404 application/json; charset=utf-8`
  - Expected: `["200"]`
  - Actual: `404`
  - If the spec is the source of truth: Return one of the documented statuses (200) from GET /groups/{name}/members.json.
  - If the implementation is the source of truth: Add a "404" response under paths["/groups/{name}/members.json"].get.responses.
- `undocumented-status` (errors, breaking) at `GET /tag/{name}.json > response 404`
  - status 404 is not documented for "GET /tag/{name}.json"
  - Request: `GET /tag/general.json -> 404 application/json; charset=utf-8`
  - Expected: `["200"]`
  - Actual: `404`
  - If the spec is the source of truth: Return one of the documented statuses (200) from GET /tag/{name}.json.
  - If the implementation is the source of truth: Add a "404" response under paths["/tag/{name}.json"].get.responses.
- `undocumented-status` (errors, breaking) at `GET /tag_groups.json > response 404`
  - status 404 is not documented for "GET /tag_groups.json"
  - Request: `GET /tag_groups.json -> 404 text/html; charset=utf-8`
  - Expected: `["200"]`
  - Actual: `404`
  - If the spec is the source of truth: Return one of the documented statuses (200) from GET /tag_groups.json.
  - If the implementation is the source of truth: Add a "404" response under paths["/tag_groups.json"].get.responses.
- `undocumented-status` (errors, breaking) at `GET /tag_groups/{id}.json > response 404`
  - status 404 is not documented for "GET /tag_groups/{id}.json"
  - Request: `GET /tag_groups/1.json -> 404 text/html; charset=utf-8`
  - Expected: `["200"]`
  - Actual: `404`
  - If the spec is the source of truth: Return one of the documented statuses (200) from GET /tag_groups/{id}.json.
  - If the implementation is the source of truth: Add a "404" response under paths["/tag_groups/{id}.json"].get.responses.
- `undocumented-status` (errors, breaking) at `GET /u/{username}/emails.json > response 403`
  - status 403 is not documented for "GET /u/{username}/emails.json"
  - Request: `GET /u/system/emails.json -> 403 application/json; charset=utf-8`
  - Expected: `["200"]`
  - Actual: `403`
  - If the spec is the source of truth: Return one of the documented statuses (200) from GET /u/{username}/emails.json.
  - If the implementation is the source of truth: Add a "403" response under paths["/u/{username}/emails.json"].get.responses.

## Reproduce

```sh
curl -s -H 'Accept: application/json' 'https://meta.discourse.org/c/1/show.json'
```

## Data

- Findings: https://github.com/apidrifter/apidrifter/tree/main/tools/survey/results/discourse-meta.findings.json
- Requests sent: https://github.com/apidrifter/apidrifter/tree/main/tools/survey/results/discourse-meta.observations.json
- Tool: https://apidrifter.com/docs/cli/ (reproduce with apidrifter run; target definition in tools/survey/targets.json)
