generated: '2026-08-02' method: derived source: openapi/*.yml (derived from https://perfectday.com/wp-json/wp/v2) + live response headers observed 2026-08-02 scope: >- Cross-cutting request/response semantics for the one machine-readable API surface Perfect Day operates: the WordPress REST API behind perfectday.com. Perfect Day's precision-fermentation ingredient business itself publishes no developer API, so these conventions describe the site content API only. Everything below was observed in the live route metadata or in live responses on 2026-08-02; nothing is assumed from generic WordPress documentation that was not confirmed on this host. authentication: style: http-basic scheme: WordPress application passwords anonymous_read: true anonymous_read_verified: - posts - pages - news - success_story - modal - categories - tags - news_category - success_story_category - leader_category - media - comments - search - taxonomies - types - statuses authenticated_only_verified: - settings not_registered: - users not_registered_note: >- /wp/v2/users is absent from the published route index and returns 404 rest_no_route — the site has disabled user enumeration. writes_require_auth: true writes_evidence: 'Allow: GET is returned on /wp/v2/posts for anonymous requests.' detail: authentication/perfect-day-authentication.yml idempotency: supported: false note: >- No idempotency-key header or parameter is exposed by any route in the published route metadata, and none is documented. No Idempotency pointer is emitted for this provider. pagination: style: page-number parameters: - name: page in: query default: 1 description: Current page of the collection. - name: per_page in: query default: 10 description: Maximum number of items to be returned in result set. - name: offset in: query description: Offset the result set by a specific number of items (collection routes). response_headers: - name: X-WP-Total description: Total number of items in the collection. Observed value 71 on /wp/v2/posts. - name: X-WP-TotalPages description: Total number of pages available at the current per_page size. link_header: true link_header_note: >- RFC 8288 Link header carries rel="next" / rel="prev" on collection responses — observed verbatim as '; rel="next"'. cors_exposed_headers: [X-WP-Total, X-WP-TotalPages, Link] ordering: parameters: - name: order values: [asc, desc] - name: orderby description: Per-resource sort attribute; allowed values are enumerated per route in the OpenAPI. filtering: parameters: - name: search description: Limit results to those matching a string. - name: include description: Limit result set to specific IDs. - name: exclude description: Ensure result set excludes specific IDs. - name: slug description: Limit result set to items with one or more specific slugs. - name: after description: Limit response to items published after a given ISO 8601 date-time. - name: before description: Limit response to items published before a given ISO 8601 date-time. - name: categories description: Limit result set to items assigned to specific category IDs (post-type routes). field_selection: style: context-and-fields parameters: - name: context values: [view, embed, edit] default: view description: Scope under which the request is made; determines which fields are present in the response. - name: _fields description: Sparse fieldset selection (WordPress core query parameter). - name: _embed description: Inline embedded resources (author, terms, featured media) via the _embedded envelope. hypermedia: style: HAL-like note: Responses carry a `_links` object and, when `_embed` is requested, an `_embedded` object. versioning: scheme: namespace-in-path current: wp/v2 base: https://perfectday.com/wp-json discovery: https://perfectday.com/wp-json/ namespaces_advertised: 19 detail: lifecycle/perfect-day-lifecycle.yml error_envelope: media_type: application/json format: wordpress-rest-error rfc9457: false shape: code: Machine-readable error code, e.g. rest_forbidden. message: Human-readable error message. data.status: Repeated HTTP status code. observed_example: code: rest_forbidden message: Sorry, you are not allowed to do that. data: status: 401 detail: errors/perfect-day-problem-types.yml rate_limits: published: false note: >- No rate-limit policy is published for this host and no RateLimit / X-RateLimit headers were observed on probed responses. robots.txt does declare `Crawl-delay: 10` for crawlers, which is a politeness signal for the HTML site rather than an API rate limit. Not asserted either way. caching: headers_observed: [x-cacheable, x-cache, x-cache-group] note: >- WP Engine edge cache headers are returned on API responses (x-cacheable: SHORT observed on /wp/v2/posts). Cloudflare fronts the origin. request_tracing: request_id_header: null note: No provider-specific request-id header was observed. content_negotiation: request: application/json response: application/json method_override_header: X-HTTP-Method-Override method_override_note: >- WordPress accepts POST with X-HTTP-Method-Override for PUT/PATCH/DELETE where clients cannot issue those verbs. cors_allowed_headers: [Authorization, X-WP-Nonce, Content-Disposition, Content-MD5, Content-Type] related: - authentication/perfect-day-authentication.yml - errors/perfect-day-problem-types.yml - lifecycle/perfect-day-lifecycle.yml - data-model/perfect-day-data-model.yml - conformance/perfect-day-conformance.yml