Silverflow · OpenAPI Overlay 1.0.0
API Evangelist enrichment overlay for the Silverflow API
9 actions
9 updates
update
Generated by API Evangelist
Written by API Evangelist tooling for Silverflow's API. It is a proposal applied on top of the contract, not a document Silverflow publishes.
What the actions change
x-sourcex-reversal-ofx-windowx-on-window-expiryx-apievangelist-enrichmentx-runtime-semanticsx-actual-typex-modelling-note
Targets 9
$.info
$
$.components.securitySchemes.MutualTLS
$.paths['/charges/{chargeKey}/reverse'].post
$.paths['/charges/{chargeKey}/cancel'].post
$.paths['/charges/{chargeKey}/refund'].post
$.paths['/disputes/{disputeKey}/accept'].post
$.components.parameters.IdempotencyKey
$.components.schemas.isoFieldResponseCode
OpenAPI Overlay
overlay: 1.0.0
info:
title: API Evangelist enrichment overlay for the Silverflow API
version: 1.0.0
x-provenance:
generated: '2026-08-27'
method: generated
source: openapi/silverflow-openapi.yml
extends: openapi/silverflow-openapi.yml
note: >-
Non-destructive overlay carrying API Evangelist's enrichment findings back onto Silverflow's
published contract. It asserts nothing Silverflow does not already document — every action
below annotates an operation or component that exists in the spec, using facts sourced from
Silverflow's own guides. The original spec is never mutated. Applying this overlay is
optional; its purpose is to make runtime semantics (idempotency, reversibility, retry,
pagination) legible to a code generator or an agent that reads only the contract.
actions:
- target: $.info
description: Record the enrichment provenance and the runtime-semantics artifacts on the
document root.
update:
x-apievangelist-enrichment:
profiled: '2026-08-27'
conventions: conventions/silverflow-conventions.yml
errors: errors/silverflow-problem-types.yml
decline_codes: errors/silverflow-decline-codes.yml
lifecycle: lifecycle/silverflow-lifecycle.yml
events: asyncapi/silverflow-events-webhooks.yml
data_model: data-model/silverflow-data-model.yml
conformance: conformance/silverflow-conformance.yml
- target: $
description: Declare the cross-cutting runtime semantics Silverflow documents in prose but
does not express in the contract.
update:
x-runtime-semantics:
idempotency:
header: Idempotency-Key
retention_hours: 24
match_scope: full URL + byte-identical request body INCLUDING JSON attribute order
fails_open: true
source: https://docs.silverflow.com/guides/idempotency
conditional_updates:
header: If-Match
value: ETag response header or the object's `version` attribute
conflict_status: 412
source: https://docs.silverflow.com/guides/idempotency
pagination:
style: cursor
params: [limit, offsetToken, sortOrder]
limit_default: 10
limit_max: 100
terminator: absence of offsetToken in the response
source: https://docs.silverflow.com/guides/pagination
errors:
standard: RFC 7807
media_type: application/json
deviation: not application/problem+json
type_namespace: /silverflow/problems/
source: https://docs.silverflow.com/guides/error-handling
retry:
retriable_status_codes: [429, 502, 503, 504]
retry_after_header: Retry-After
source: https://docs.silverflow.com/guides/error-handling
events:
envelope: CloudEvents 1.0
delivery: at-least-once, unordered, thin payload
dedup_key: id
signature_verification: not documented
source: https://docs.silverflow.com/guides/event-notifications
- target: $.components.securitySchemes.MutualTLS
description: >-
Flag the mTLS scheme modelling defect. OpenAPI 3.0.3 has no `mutualTLS` type, so Silverflow
declared it as `type: apiKey, in: header, name: '-'`, which makes a generator emit a bogus
header parameter named '-'. Annotated rather than corrected, because rewriting the type
would break 3.0.3 validity.
update:
x-actual-type: mutualTLS
x-modelling-note: Declared as apiKey because OpenAPI 3.0.3 predates the mutualTLS scheme
type. Clients must not send a header named '-'; they must present an X.509 client
certificate at the TLS handshake.
x-upgrade-path: 'On a move to OpenAPI 3.1, replace with `type: mutualTLS`.'
- target: $.paths['/charges/{chargeKey}/reverse'].post
description: Record the reversal window so an agent can tell before calling whether this is
the right undo operation.
update:
x-reversal-of: authorization
x-window: while clearingMode = manual AND the charge is not yet cleared
x-on-window-expiry: use POST /charges/{chargeKey}/refund
x-source: https://docs.silverflow.com/guides/charge-actions
- target: $.paths['/charges/{chargeKey}/cancel'].post
description: Record the cancel window, including the one explicit clock-based boundary in the
charge surface.
update:
x-reversal-of: scheduled clearing + authorization
x-window: while clearingMode = auto AND the charge is not yet sent for clearing; where the
charge carries `clearAfter`, up until that timestamp
x-on-window-expiry: >-
HTTP 409 /silverflow/problems/charge/clearing-already-submitted; use
POST /charges/{chargeKey}/refund
x-source: https://docs.silverflow.com/guides/charge-actions
- target: $.paths['/charges/{chargeKey}/refund'].post
description: Record that the refund window is unbounded in Silverflow's own documentation.
update:
x-reversal-of: a cleared charge
x-window-stated: false
x-window-note: Silverflow publishes no maximum refund age; the card networks' own rules
apply and are not restated in the contract.
x-source: https://docs.silverflow.com/guides/charge-actions
- target: $.paths['/disputes/{disputeKey}/accept'].post
description: Mark the one-way door on the dispute surface.
update:
x-irreversible: true
x-warning: Accepting a dispute concedes the chargeback. There is no un-accept operation and
the terminal state is closedAccepted. Never call speculatively.
x-recoverable-alternative: POST /disputes/{disputeKey}/defend
- target: $.components.parameters.IdempotencyKey
description: Make the strict byte-match requirement visible at the parameter, not only in the
guide.
update:
x-retention-hours: 24
x-match-scope: full URL + byte-identical request body INCLUDING JSON attribute order
x-mismatch-response: '409 /silverflow/problems/idempotency/request-mismatch'
x-in-flight-response: '409 /silverflow/problems/idempotency/request-is-still-being-processed'
x-fails-open: Silverflow processes the request WITHOUT idempotency if its idempotency store
is unavailable, so this header is not an absolute exactly-once guarantee.
x-source: https://docs.silverflow.com/guides/idempotency
- target: $.components.schemas.isoFieldResponseCode
description: Name the standard the field belongs to, so a consumer knows whose registry
defines its values.
update:
x-standard: ISO 8583 field 39
x-registry-owner: the card network named in authorizationResponse.network — values differ
per network
x-documented-values: errors/silverflow-decline-codes.yml