OnPay · OpenAPI Overlay 1.0.0

API Evangelist enhancements for the OnPay API

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

What the actions change

x-apievangelist-notex-apievangelist-profilex-apievangelist-enrichedx-api-accessx-apievangelist-corrected-tokenUrlx-token-lifetime-secondsx-refresh-tokenx-scope-semantics

Targets 6

$.info
$.servers
$.components.securitySchemes.OAuth2.flows.authorizationCode
$.components.securitySchemes.OAuth2
$.components.schemas.ErrorBadRequest
$.components.schemas.PaySchedule.properties.version

OpenAPI Overlay

Raw ↑
overlay: 1.0.0
info:
  title: API Evangelist enhancements for the OnPay API
  version: 1.0.0
extends: openapi/onpay-api-openapi.json
x-provenance:
  generated: '2026-08-04'
  method: generated
  source: >-
    Enhancements derived from live probes of https://api.onpay.com/v2 and the published docs at
    https://onpay.readme.io. The harvested OpenAPI is never mutated; every correction below is an
    Overlay action so the provider's original document stays verbatim.
  findings:
  - The only servers[] entry is https://onpaydev.com/v2. That domain is parked (GoDaddy lander) and
    is not an OnPay API host. The live production host is https://api.onpay.com/v2, verified by the
    real error envelope it returns.
  - securitySchemes.OAuth2.flows.authorizationCode.tokenUrl is identical to authorizationUrl
    (.../app/oauth/authorize). The docs state the token endpoint is .../app/oauth/token. The spec's
    tokenUrl is wrong and would break any generated client.
  - The six oauth2 "scopes" are role names whose descriptions are the numeric access_type codes
    ("1".."6") returned in the token response, not human-readable scope descriptions.
  - All 58 operations lack an operationId, so no generated SDK, Arazzo workflow, or MCP tool can bind
    to a stable identifier.
  - ErrorBadRequest omits error_code, error_message and more_info, all of which the live API returns.
actions:
- target: $.info
  update:
    x-apievangelist-profile: https://apis.io/provider/onpay/
    x-apievangelist-enriched: '2026-08-04'
    x-api-access: partner-only
- target: $.servers
  update:
  - url: https://api.onpay.com/v2
    description: >-
      Production (verified live 2026-08-04). Added by API Evangelist — the document's only declared
      server, https://onpaydev.com/v2, resolves to a parked domain.
    x-apievangelist-added: true
- target: $.components.securitySchemes.OAuth2.flows.authorizationCode
  update:
    x-apievangelist-corrected-tokenUrl: https://app.onpay.com/app/oauth/token
    x-apievangelist-note: >-
      The document's tokenUrl duplicates authorizationUrl. https://onpay.readme.io/reference/authorization
      documents the token endpoint as /app/oauth/token.
    x-token-lifetime-seconds: 7200
    x-refresh-token: single-use
- target: $.components.securitySchemes.OAuth2
  update:
    x-scope-semantics: >-
      Scopes are OnPay role names; the description value on each is the numeric access_type code
      returned in the OAuth token response (Owner=1, Approver=2, Controller=3, Manager=4,
      Accountant=5, Employee=6).
- target: $.components.schemas.ErrorBadRequest
  update:
    x-apievangelist-observed-fields: [resp, error_code, error_message, message, more_info]
    x-apievangelist-note: >-
      The live API returns error_code, error_message and more_info in addition to the two declared
      properties. more_info points at https://docs.onpay.com, which does not resolve.
- target: $.components.schemas.PaySchedule.properties.version
  update:
    x-concurrency-token: true
    x-apievangelist-note: >-
      OnPay uses `version` for optimistic concurrency — a PATCH without the latest version is rejected
      with a version mismatch. See https://onpay.readme.io/reference/versioning.