openapi: 3.0.3 info: title: Okra API (Historical) Accounts Payments API description: RETIRED. Okra was an open finance / open banking infrastructure API for Africa (Nigeria). This OpenAPI documents the historical, now-discontinued REST surface. Okra ceased operations in May 2025 and the host api.okra.ng no longer resolves; the paths and Bearer-secret auth below are CONFIRMED from Okra's official okraHQ/okra-node SDK, but request/response body schemas are MODELED (reconstructed from SDK parameter models and archived documentation) and are illustrative rather than authoritative. Reads and writes alike used POST with a JSON filter body. Account linking happened client-side through the Okra Widget, producing the `record`/`customer` identifiers that data endpoints operate against. version: '2.0' contact: name: Okra (defunct) url: https://okra.ng x-status: retired x-ceased-operations: 2025-05 x-grounding: Endpoint paths, base URL, and Bearer-secret auth confirmed from github.com/okraHQ/okra-node (archived 2024-02-09). Body schemas modeled. servers: - url: https://api.okra.ng/v2 description: Production (retired - no longer resolves) - url: https://api.okra.ng/v2/sandbox description: Sandbox (retired - no longer resolves) security: - okraSecret: [] tags: - name: Payments description: Bank-to-bank payments and direct-debit authorizations. paths: /pay/initiate: post: operationId: initiatePayment tags: - Payments summary: Initiate a bank-to-bank payment requestBody: $ref: '#/components/requestBodies/PaymentFilter' responses: '200': $ref: '#/components/responses/OkraData' '401': $ref: '#/components/responses/Unauthorized' /pay/verify: post: operationId: verifyPayment tags: - Payments summary: Verify a payment requestBody: $ref: '#/components/requestBodies/PaymentFilter' responses: '200': $ref: '#/components/responses/OkraData' '401': $ref: '#/components/responses/Unauthorized' /pay/link/create: post: operationId: createPaymentLink tags: - Payments summary: Create a payment link requestBody: $ref: '#/components/requestBodies/PaymentFilter' responses: '200': $ref: '#/components/responses/OkraData' '401': $ref: '#/components/responses/Unauthorized' /authorization/initiate: post: operationId: initiateAuthorization tags: - Payments summary: Initiate a direct-debit authorization requestBody: $ref: '#/components/requestBodies/PaymentFilter' responses: '200': $ref: '#/components/responses/OkraData' '401': $ref: '#/components/responses/Unauthorized' /bulkfiles/initiate: post: operationId: initiateBulkPayment tags: - Payments summary: Initiate a bulk payment file requestBody: $ref: '#/components/requestBodies/PaymentFilter' responses: '200': $ref: '#/components/responses/OkraData' '401': $ref: '#/components/responses/Unauthorized' components: requestBodies: PaymentFilter: description: Modeled payment body. required: true content: application/json: schema: $ref: '#/components/schemas/PaymentFilter' responses: Unauthorized: description: Missing or invalid Okra Secret. content: application/json: schema: $ref: '#/components/schemas/OkraEnvelope' OkraData: description: MODELED. Okra responses were JSON envelopes of the form {status, message, data}. The exact `data` shape varied per product and is not reproduced authoritatively here. content: application/json: schema: $ref: '#/components/schemas/OkraEnvelope' schemas: PaymentFilter: type: object description: Modeled. Payment / authorization input. properties: amount: type: string currency: type: string example: NGN customer: type: string account_to_debit: type: string account_to_credit: type: string additionalProperties: true OkraEnvelope: type: object description: Modeled Okra response envelope. properties: status: type: string example: success message: type: string data: type: object additionalProperties: true additionalProperties: true securitySchemes: okraSecret: type: http scheme: bearer description: 'Okra Secret key issued in the Okra dashboard, sent as `Authorization: Bearer `. Confirmed from okraHQ/okra-node.'