openapi: 3.0.3 info: title: Okra API (Historical) Accounts Customers 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: Customers description: End-user (customer) management. paths: /customers/list: post: operationId: listCustomers tags: - Customers summary: List customers requestBody: $ref: '#/components/requestBodies/EmptyFilter' responses: '200': $ref: '#/components/responses/OkraData' '401': $ref: '#/components/responses/Unauthorized' /customers/find-customers-by: post: operationId: findCustomersBy tags: - Customers summary: Find customers by attribute requestBody: $ref: '#/components/requestBodies/CustomerFilter' responses: '200': $ref: '#/components/responses/OkraData' '401': $ref: '#/components/responses/Unauthorized' /customers/remove: post: operationId: removeCustomer tags: - Customers summary: Remove a customer requestBody: $ref: '#/components/requestBodies/CustomerFilter' responses: '200': $ref: '#/components/responses/OkraData' '401': $ref: '#/components/responses/Unauthorized' components: 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' requestBodies: CustomerFilter: description: Modeled customer-scoped filter body. required: true content: application/json: schema: $ref: '#/components/schemas/CustomerFilter' EmptyFilter: description: Modeled empty/optional filter body. required: false content: application/json: schema: type: object additionalProperties: true schemas: CustomerFilter: type: object description: Modeled. Customer-scoped filter, optionally with a date range. properties: customer: type: string from: type: string format: date to: type: string format: date page: type: integer limit: type: integer 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.'