openapi: 3.1.0 info: title: Gotham Greens Discovery API version: wp/v2 summary: Public site, content-type, taxonomy and status metadata. description: >- The self-describing surface of the gothamgreens.com WordPress REST API — the root index that enumerates every namespace and route with its methods and argument schemas, plus the content-type, taxonomy and post-status registries. This is what makes the whole site content surface machine-discoverable. Verified live on 2026-08-01: the root index advertises 406 routes across 17 namespaces, of which the operations documented across this repo's specs are the ones readable without credentials. contact: name: Gotham Greens url: https://www.gothamgreens.com/contact/ license: name: Site content — all rights reserved, see Terms of Use url: https://www.gothamgreens.com/terms-of-use/ x-apis-io-provenance: method: derived source: https://www.gothamgreens.com/wp-json/ derived_on: '2026-08-01' note: >- Routes enumerated from the live wp-json discovery document (406 routes across 17 namespaces); each operation below was probed anonymously and returned HTTP 200. Schemas reflect the fields observed in live responses on 2026-08-01. No fabricated operations. servers: - url: https://www.gothamgreens.com/wp-json description: Production tags: - name: Discovery description: Route index, content types, taxonomies and post statuses. paths: /: get: tags: - Discovery operationId: getRootIndex summary: Get the API root index description: >- Returns the site's REST index — name, description, home and gmt_offset, the list of registered namespaces, the full route table with per-route methods and argument schemas, the authentication methods advertised, and site link relations. responses: '200': description: The REST root index. content: application/json: schema: $ref: '#/components/schemas/RootIndex' /wp/v2: get: tags: - Discovery operationId: getNamespaceIndex summary: Get the wp/v2 namespace index description: Returns the route table scoped to the `wp/v2` namespace. responses: '200': description: The namespace index. content: application/json: schema: type: object additionalProperties: true /wp/v2/types: get: tags: - Discovery operationId: listTypes summary: List registered content types description: >- Returns every registered post type keyed by slug. Verified live: post, page, attachment, nav_menu_item, wp_block, wp_template, wp_template_part, wp_global_styles, wp_navigation, wp_font_family, wp_font_face. Gotham Greens registers no custom public post types. responses: '200': description: The content-type registry. content: application/json: schema: type: object additionalProperties: $ref: '#/components/schemas/ContentType' /wp/v2/types/{type}: get: tags: - Discovery operationId: getType summary: Get a content type description: Returns a single registered post type by slug. parameters: - name: type in: path required: true description: Slug of the registered post type, e.g. `post`. schema: type: string responses: '200': description: The requested content type. content: application/json: schema: $ref: '#/components/schemas/ContentType' '404': $ref: '#/components/responses/NotFound' /wp/v2/taxonomies: get: tags: - Discovery operationId: listTaxonomies summary: List registered taxonomies description: >- Returns every registered taxonomy keyed by slug. Verified live: category, post_tag, nav_menu, wp_pattern_category. responses: '200': description: The taxonomy registry. content: application/json: schema: type: object additionalProperties: $ref: '#/components/schemas/Taxonomy' /wp/v2/taxonomies/{taxonomy}: get: tags: - Discovery operationId: getTaxonomy summary: Get a taxonomy description: Returns a single registered taxonomy by slug. parameters: - name: taxonomy in: path required: true description: Slug of the taxonomy, e.g. `category`. schema: type: string responses: '200': description: The requested taxonomy. content: application/json: schema: $ref: '#/components/schemas/Taxonomy' '404': $ref: '#/components/responses/NotFound' /wp/v2/statuses: get: tags: - Discovery operationId: listStatuses summary: List post statuses description: >- Returns the publicly visible post statuses. Verified live: `publish` and `acf-disabled`. responses: '200': description: The post-status registry. content: application/json: schema: type: object additionalProperties: true components: parameters: id: name: id in: path required: true description: Unique numeric identifier for the object. schema: type: integer page: name: page in: query description: Current page of the collection. Defaults to 1. schema: type: integer minimum: 1 default: 1 perPage: name: per_page in: query description: >- Maximum number of items to be returned in the result set. Verified live: values outside 1-100 return HTTP 400 `rest_invalid_param`. schema: type: integer minimum: 1 maximum: 100 default: 10 search: name: search in: query description: Limit results to those matching a string. schema: type: string order: name: order in: query description: Order sort attribute ascending or descending. schema: type: string enum: [asc, desc] orderby: name: orderby in: query description: Sort collection by object attribute. schema: type: string context: name: context in: query description: >- Scope under which the request is made; determines fields present in the response. Only `view` and `embed` are available anonymously. schema: type: string enum: [view, embed] default: view headers: XWPTotal: description: Total number of items in the collection. schema: type: integer XWPTotalPages: description: Total number of pages in the collection at the current per_page. schema: type: integer LinkPagination: description: RFC 8288 Link header carrying `next` and `prev` pagination relations. schema: type: string responses: NotFound: description: The requested object does not exist. content: application/json: schema: $ref: '#/components/schemas/Error' example: code: rest_no_route message: No route was found matching the URL and request method. data: status: 404 InvalidParam: description: One or more query parameters failed validation. content: application/json: schema: $ref: '#/components/schemas/Error' example: code: rest_invalid_param message: 'Invalid parameter(s): per_page' data: status: 400 params: per_page: per_page must be between 1 (inclusive) and 100 (inclusive) Unauthorized: description: >- The route exists but is not readable anonymously. Verified live on the users, settings, themes, plugins, menus, block-types and revisions routes. content: application/json: schema: $ref: '#/components/schemas/Error' example: code: rest_forbidden message: Sorry, you are not allowed to do that. data: status: 401 schemas: RenderedText: type: object description: WordPress rendered-text object. properties: rendered: type: string required: [rendered] Error: type: object description: >- The WordPress REST error envelope, verified live. Note this is NOT RFC 9457 application/problem+json — it is served as application/json with a WordPress-specific shape. properties: code: type: string message: type: string data: type: object properties: status: type: integer params: type: object additionalProperties: type: string details: type: object additionalProperties: true required: [status] required: [code, message, data] RootIndex: type: object description: The WordPress REST API root index document. properties: name: type: string description: type: string url: type: string format: uri home: type: string format: uri gmt_offset: type: [number, string] timezone_string: type: string namespaces: type: array items: type: string authentication: description: >- Authentication methods advertised by the site. Observed live as an empty array — the site advertises no additional authentication scheme beyond WordPress core cookie authentication. oneOf: - type: array - type: object additionalProperties: true routes: type: object additionalProperties: true description: Route table keyed by route pattern, each with methods, endpoints and args. _links: type: object additionalProperties: true required: [name, url, home, namespaces, routes] ContentType: type: object description: A registered WordPress post type. properties: description: type: string hierarchical: type: boolean has_archive: type: [boolean, string] name: type: string slug: type: string icon: type: [string, 'null'] taxonomies: type: array items: type: string rest_base: type: string rest_namespace: type: string supports: type: object additionalProperties: true visibility: type: object additionalProperties: true labels: type: object additionalProperties: true _links: type: object additionalProperties: true required: [name, slug, rest_base] Taxonomy: type: object description: A registered WordPress taxonomy. properties: name: type: string slug: type: string description: type: string types: type: array items: type: string hierarchical: type: boolean rest_base: type: string rest_namespace: type: string visibility: type: object additionalProperties: true labels: type: object additionalProperties: true _links: type: object additionalProperties: true required: [name, slug, rest_base]