Pexafy · OpenAPI Overlay 1.0.0

API Evangelist enhancements for the Pexafy API

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

What the actions change

x-apievangelist-paginationx-apievangelist-undocumented-responsesx-apievangelist-reversibilityx-apievangelist-notex-apievangelist-enrichedx-apievangelist-notesx-apievangelist-alternate-descriptionx-apievangelist-security-note

Targets 10

$.info
$
$.paths['/api/v1/search/photos'].get
$.paths['/api/v1/search/photos'].post
$.paths['/api/v1/photos/{photo_id}/similar'].get
$.paths['/api/v1/collections'].post
$.paths['/api/v1/collections/{collection_id}'].delete
$.paths['/api/v1/collections/{collection_id}/photos'].post
$.components.schemas.Photo.properties.source
$.components.schemas.ApiError

OpenAPI Overlay

Raw ↑
overlay: 1.0.0
info:
  title: API Evangelist enhancements for the Pexafy API
  version: 1.0.0
extends: openapi/pexafy-api-openapi.json
x-provenance:
  generated: '2026-08-27'
  method: generated
  source: >-
    API Evangelist enrichment pass 2026-08-27. Captures findings measured against the
    SERVED schema (https://api.pexafy.com/openapi.json) that are documented by the provider
    elsewhere but absent from the document itself. The original is never mutated.
actions:
- target: $.info
  update:
    x-apievangelist-enriched: '2026-08-27'
    x-apievangelist-notes: >-
      Pexafy publishes TWO first-party OpenAPI documents. This one is the served,
      FastAPI-auto-generated schema; a richer hand-maintained description (clean
      operationIds, 80 examples, x-extensible-enum, full 4xx/5xx coverage) is versioned at
      github.com/Pexafy/pexafy-openapi and is currently at 1.3.0. The two disagree on the
      image-search path and on the set of usage endpoints.
    x-apievangelist-alternate-description: https://raw.githubusercontent.com/Pexafy/pexafy-openapi/main/openapi/v1.json
- target: $
  update:
    x-apievangelist-security-note: >-
      All 20 operations declare `security: [{ApiKeyAuth: []}]` per-operation, but the
      document has no root-level `security` and no 401 response on any operation — so a
      generated client knows a credential is required and still has no error shape for the
      case where it is missing. An unauthenticated call returns 401 with error.code
      UNAUTHORIZED. Confirmed live on 2026-08-27.
    x-apievangelist-rate-limit-headers:
      limit: x-ratelimit-limit
      remaining: x-ratelimit-remaining
      reset: x-ratelimit-reset
      status_on_exhaustion: 429
      error_code: RATE_LIMITED
      note: Observed on live responses; not declared in this document.
    x-apievangelist-request-id-header: x-request-id
    x-apievangelist-undocumented-operations:
    - path: /health
      method: get
      note: Public unauthenticated liveness check, used as the pre-flight step in the provider's own api-onboarding descriptor. Returns 200 with the standard envelope. Not present in paths[].
- target: $.paths['/api/v1/search/photos'].get
  update:
    x-apievangelist-pagination:
      style: cursor
      request: [per_page, cursor]
      response: [pagination.per_page, pagination.has_more, pagination.next_cursor]
      cursor_ttl: ~5 minutes
    x-apievangelist-undocumented-responses: [400, 401, 403, 422, 429, 500]
- target: $.paths['/api/v1/search/photos'].post
  update:
    x-apievangelist-pagination:
      style: cursor
      note: The cursor remembers the uploaded image; subsequent pages send cursor only, with no re-upload.
    x-apievangelist-undocumented-responses: [400, 401, 403, 422, 429, 500]
- target: $.paths['/api/v1/photos/{photo_id}/similar'].get
  update:
    x-apievangelist-pagination:
      style: cursor
      note: On some plans the similar set is capped to one page, so has_more can be false from the start.
    x-apievangelist-undocumented-responses: [401, 404, 422, 429]
- target: $.paths['/api/v1/collections'].post
  update:
    x-apievangelist-reversibility:
      reversal_operation: delete_collection_api_v1_collections__collection_id__delete
      window: null
      grade: documented
    x-apievangelist-idempotency: none — a retry creates a second identically-named collection
- target: $.paths['/api/v1/collections/{collection_id}'].delete
  update:
    x-apievangelist-reversibility:
      reversal_operation: null
      window: null
      grade: irreversible
      note: No restore/undelete operation exists. Read the collection's photos first; that id list is the only recovery path.
- target: $.paths['/api/v1/collections/{collection_id}/photos'].post
  update:
    x-apievangelist-reversibility:
      reversal_operation: remove_photo_from_collection_api_v1_collections__collection_id__photos__photo_id__delete
      window: null
      grade: documented
- target: $.components.schemas.Photo.properties.source
  update:
    x-apievangelist-note: >-
      Extensible enum. The versioned description carries x-extensible-enum here so a code
      generator can emit an open type; this served schema does not, so generated closed
      types will break the next time a library is indexed (wikimedia, description 1.3.0,
      was the last one). Read GET /api/v1/facets/sources at runtime instead.
- target: $.components.schemas.ApiError
  update:
    x-apievangelist-error-catalog: errors/pexafy-problem-types.yml
    x-apievangelist-note: >-
      16 stable error codes are published at https://docs.pexafy.com/errors and none of them
      appear in this document. error.code is the field to branch on; error.message is
      explicitly documented as subject to change.