Pricefinder · OpenAPI Overlay 1.0.0

API Evangelist enhancements for the Pricefinder API

9 actions 9 updates documentation extends openapi/pricefinder-api-swagger.json
Generated by API Evangelist Written by API Evangelist tooling for Pricefinder's API. It is a proposal applied on top of the contract, not a document Pricefinder publishes.
View Overlay File View on GitHub Overlay Specification

What the actions change

x-apievangelist-notex-apievangelist-slugx-apievangelist-enrichedx-apievangelist-artifactshostschemessecurityDefinitionssecurity

Targets 5

$.info
$
$.paths[*][*].responses
$.paths['/features'].get
$.paths['/stubs/{language}'].get

OpenAPI Overlay

Raw ↑
overlay: 1.0.0
info:
  title: API Evangelist enhancements for the Pricefinder API
  version: 1.0.0
extends: openapi/pricefinder-api-swagger.json

# generated: '2026-07-26'
# method: generated
# source: openapi/pricefinder-api-swagger.json + the API Evangelist enrichment round
#   for all/pricefinder (authentication/, conventions/, errors/, lifecycle/,
#   conformance/, data-model/).
#
# This overlay carries API Evangelist's enhancements to Pricefinder's published
# Swagger 2.0 contract WITHOUT mutating the harvested original. The single most
# valuable action below is the securityDefinitions block: Pricefinder's contract
# declares NO security metadata at all even though every one of its 116 operations
# requires an OAuth 2.0 bearer token. The scheme added here is transcribed verbatim
# from Pricefinder's own prose in the POST /oauth2/token description and from the live
# authorize page — nothing is invented.
#
# NOTE ON SPEC VERSION: the target is Swagger 2.0, so the securityDefinitions action
# uses Swagger 2.0 shape (type: oauth2 with flow/authorizationUrl/tokenUrl), not
# OpenAPI 3 shape.

actions:

# ---- Provenance -----------------------------------------------------------------
- target: $.info
  update:
    x-apievangelist-slug: pricefinder
    x-apievangelist-enriched: '2026-07-26'
    x-apievangelist-artifacts:
      authentication: authentication/pricefinder-authentication.yml
      conventions: conventions/pricefinder-conventions.yml
      errors: errors/pricefinder-problem-types.yml
      lifecycle: lifecycle/pricefinder-lifecycle.yml
      conformance: conformance/pricefinder-conformance.yml
      data_model: data-model/pricefinder-data-model.yml
      mcp: mcp/pricefinder-mcp.yml
      packages: packages/pricefinder-packages.yml
      skills: skills/_index.yml

# ---- Make the contract self-locating ---------------------------------------------
# The published document declares neither `host` nor `schemes`, so a generated client
# has no base URL. Both values below are the ones Pricefinder itself uses in the curl
# example inside the /oauth2/token description, confirmed by live probe.
- target: $
  update:
    host: api.pricefinder.com.au
    schemes:
    - https
    x-apievangelist-note: |
      host and schemes are absent from the published contract. Added here so the
      document is self-locating; basePath /v1 is already declared upstream.

# ---- Add the missing security model ----------------------------------------------
- target: $
  update:
    securityDefinitions:
      pricefinder_oauth2_application:
        type: oauth2
        flow: application
        tokenUrl: https://api.pricefinder.com.au/v1/oauth2/token
        scopes: {}
        description: |
          client_credentials grant. client_id is the API user's Pricefinder username
          and client_secret is that user's password; HTTP Basic is an accepted
          alternative to the form parameters. The API defines no scopes — entitlement
          is enforced per commercial subscription and is readable at GET /features.
      pricefinder_oauth2_access_code:
        type: oauth2
        flow: accessCode
        authorizationUrl: https://api.pricefinder.com.au/v1/auth/authorize.html
        tokenUrl: https://api.pricefinder.com.au/v1/oauth2/token
        scopes: {}
        description: |
          authorization_code grant for acting on another Pricefinder user's behalf.
          Direct the user to the authorize page with client_id, state and redirect_uri
          over HTTPS; on approval the callback carries state and code, on refusal
          error=access_denied. Refresh tokens rotate on use.
    security:
    - pricefinder_oauth2_application: []
    x-apievangelist-security-note: |
      TRANSCRIBED, NOT INVENTED. Pricefinder documents this entire model in HTML prose
      inside the POST /oauth2/token operation description and serves the authorize
      page live (HTTP 200, 2026-07-26). The published contract simply never expresses
      it as security metadata, so no code generator or agent can discover it. Every
      operation except getToken requires a bearer token; anonymous calls return 401.

# ---- Record the undocumented 401 that every operation actually returns -------------
- target: $.paths[*][*].responses
  update:
    '401':
      description: |
        Unauthorized — no valid OAuth 2.0 bearer token was presented. NOT DECLARED IN
        THE PUBLISHED CONTRACT but returned by every data path; confirmed by live
        anonymous probes of /v1/features, /v1/suggest/properties and /v1/stubs/java on
        2026-07-26. Added by API Evangelist so generated clients handle it.
      x-apievangelist-added: true

# ---- Runtime semantics the contract omits ----------------------------------------
- target: $.info
  update:
    x-apievangelist-conventions:
      pagination:
        supported: false
        note: '`limit` caps results on 49 operations but there is no cursor, page or
          offset parameter — narrow the query instead of paging.'
      idempotency:
        supported: false
        note: No Idempotency-Key on any of the 5 POST operations. Read state back
          rather than blind-retrying a write.
      rate_limiting:
        documented: false
        note: No 429 is declared and no quota is published; limits are per commercial
          subscription and are not machine-readable.
      request_tracing:
        supported: false
        note: No request-id or correlation header is issued.
      partial_success:
        channel: messages[]
        schema: '#/definitions/Message'
        note: Data-quality and jurisdictional-suppression notices ride inside 200
          responses as a messages array of code+text. A 200 does not mean a complete
          answer.
      error_format:
        rfc9457: false
        note: >-
          Only 3 non-2xx responses are documented across 116 operations; the one
          error schema is a bare {"error": string}.

# ---- Flag the non-standard vendor extension --------------------------------------
- target: $.info
  update:
    x-apievangelist-vendor-extension-warning: |
      The contract attaches a `pds` object ({hidden, extra, enumerate, deprecated}) to
      parameters as a RAW SIBLING KEY. Swagger 2.0 permits vendor extensions only
      under an `x-` prefix, so `pds` is invalid there and strict validators will reject
      the document. It is also the only channel signalling parameter deprecation — the
      _gt/_lt filter generation (beds_gt, price_lt, area_gt, …) is flagged deprecated
      on 47 operations with no Swagger `deprecated` flag and no sunset date. Use the
      min_*/max_* generation.

# ---- Flag the operationId collisions ----------------------------------------------
- target: $.info
  update:
    x-apievangelist-operationid-warning: |
      operationId IS NOT UNIQUE, which violates Swagger 2.0 and breaks every code
      generator and MCP tool-forge keyed on it. 47 of 116 operations collide:
      `properties` repeats across 14 paths, `planProperties` across 8, plus
      volumeFolioProperties, listings, sales, rentals, salesCma, rentalCma, soi, image,
      property, radialSales and streets. Bind to METHOD + PATH, not operationId.
      mcp/pricefinder-mcp.yml carries the disambiguated tool names.

# ---- Surface the entitlement operation --------------------------------------------
- target: $.paths['/features'].get
  update:
    summary: Read the calling user's commercial entitlement set
    x-apievangelist-note: |
      Because the API defines no OAuth scopes, this is the ONLY machine-readable
      authorization surface. Agents should call it first and gate their plan on
      UserFeatures rather than discovering entitlement through 401/403 responses.

# ---- Surface the client-library generator ------------------------------------------
- target: $.paths['/stubs/{language}'].get
  update:
    x-apievangelist-note: |
      First-party but explicitly unsupported client-library generation across 38
      swagger-codegen targets, and auth-gated (anonymous GET → 401, probed
      2026-07-26). Catalogued in packages/pricefinder-packages.yml. Pricefinder ships
      no published, supported SDK to any package registry.