From fd4c31599da46c1646dc47ea1a9e53aa046d8183 Mon Sep 17 00:00:00 2001 From: AKibuuka <43401148+AKibuuka@users.noreply.github.com> Date: Wed, 13 Apr 2022 19:41:32 +0200 Subject: [PATCH 1/4] Payments BB APIs and Diagrams --- ...P_VMS_API-1.0.2-1.0.3-resolved_asynch.json | 1850 +++++++++++++++++ ...P_VMS_API-1.0.2-1.0.3-resolved_asynch.yaml | 1323 ++++++++++++ ... Gateway in the bulk payment use cases.png | Bin 0 -> 44313 bytes ... Gateway in the bulk payment use cases.txt | 17 + ...G Mobile Money Payment with QR code -2.png | Bin 0 -> 52104 bytes ...G Mobile Money Payment with QR code -2.txt | 27 + .../P2G Mobile Money Payment with QR code.png | Bin 0 -> 52104 bytes .../P2G Mobile Money Payment with QR code.txt | 27 + ...d as a high level block diagram.drawio.svg | 4 + ...ding block diagrams-Centralised.drawio.svg | 4 + ...ng block diagrams-Decentralised.drawio.svg | 4 + ...diagrams-High Level G2P diagram.drawio.svg | 4 + ...diagrams-Payments BB components.drawio.svg | 4 + ...lding block diagrams-Scenario 1.drawio.svg | 4 + ... block diagrams-Scenario 2A, 2B.drawio.svg | 4 + ...lding block diagrams-Scenario 3.drawio.svg | 4 + ...lding block diagrams-Scenario 4.drawio.svg | 4 + ...lding block diagrams-Scenario 5.drawio.svg | 4 + ...lding block diagrams-Scenario 6.drawio.svg | 4 + ...ock diagrams-Voucher Management.drawio.svg | 4 + Payments/Diagrams/Voucher Activation v3.png | Bin 0 -> 40959 bytes Payments/Diagrams/Voucher Activation v3.txt | 34 + Payments/Diagrams/Voucher Cancellation v3.png | Bin 0 -> 28231 bytes Payments/Diagrams/Voucher Cancellation v3.txt | 20 + .../Diagrams/Voucher Pre-activation v3.png | Bin 0 -> 51816 bytes .../Diagrams/Voucher Pre-activation v3.txt | 46 + Payments/Diagrams/Voucher Redemption v3.png | Bin 0 -> 69476 bytes Payments/Diagrams/Voucher Redemption v3.txt | 48 + Payments/Diagrams/Voucher Status Check v3.png | Bin 0 -> 32242 bytes Payments/Diagrams/Voucher Status Check v3.txt | 26 + Payments/Diagrams/Voucher management.png | Bin 0 -> 26359 bytes Payments/Diagrams/Voucher management.txt | 11 + 32 files changed, 3477 insertions(+) create mode 100644 Payments/APIS/VMS-API2-VMS-API2-GS_P_VMS_API-1.0.2-1.0.3-resolved_asynch.json create mode 100644 Payments/APIS/VMS-API2-VMS-API2-GS_P_VMS_API-1.0.2-1.0.3-resolved_asynch.yaml create mode 100644 Payments/Diagrams/Bulk Payment BB - Payment Gateway in the bulk payment use cases.png create mode 100644 Payments/Diagrams/Bulk Payment BB - Payment Gateway in the bulk payment use cases.txt create mode 100644 Payments/Diagrams/P2G Mobile Money Payment with QR code -2.png create mode 100644 Payments/Diagrams/P2G Mobile Money Payment with QR code -2.txt create mode 100644 Payments/Diagrams/P2G Mobile Money Payment with QR code.png create mode 100644 Payments/Diagrams/P2G Mobile Money Payment with QR code.txt create mode 100644 Payments/Diagrams/Payments building block diagrams- Bulk Payments expressed as a high level block diagram.drawio.svg create mode 100644 Payments/Diagrams/Payments building block diagrams-Centralised.drawio.svg create mode 100644 Payments/Diagrams/Payments building block diagrams-Decentralised.drawio.svg create mode 100644 Payments/Diagrams/Payments building block diagrams-High Level G2P diagram.drawio.svg create mode 100644 Payments/Diagrams/Payments building block diagrams-Payments BB components.drawio.svg create mode 100644 Payments/Diagrams/Payments building block diagrams-Scenario 1.drawio.svg create mode 100644 Payments/Diagrams/Payments building block diagrams-Scenario 2A, 2B.drawio.svg create mode 100644 Payments/Diagrams/Payments building block diagrams-Scenario 3.drawio.svg create mode 100644 Payments/Diagrams/Payments building block diagrams-Scenario 4.drawio.svg create mode 100644 Payments/Diagrams/Payments building block diagrams-Scenario 5.drawio.svg create mode 100644 Payments/Diagrams/Payments building block diagrams-Scenario 6.drawio.svg create mode 100644 Payments/Diagrams/Payments building block diagrams-Voucher Management.drawio.svg create mode 100644 Payments/Diagrams/Voucher Activation v3.png create mode 100644 Payments/Diagrams/Voucher Activation v3.txt create mode 100644 Payments/Diagrams/Voucher Cancellation v3.png create mode 100644 Payments/Diagrams/Voucher Cancellation v3.txt create mode 100644 Payments/Diagrams/Voucher Pre-activation v3.png create mode 100644 Payments/Diagrams/Voucher Pre-activation v3.txt create mode 100644 Payments/Diagrams/Voucher Redemption v3.png create mode 100644 Payments/Diagrams/Voucher Redemption v3.txt create mode 100644 Payments/Diagrams/Voucher Status Check v3.png create mode 100644 Payments/Diagrams/Voucher Status Check v3.txt create mode 100644 Payments/Diagrams/Voucher management.png create mode 100644 Payments/Diagrams/Voucher management.txt diff --git a/Payments/APIS/VMS-API2-VMS-API2-GS_P_VMS_API-1.0.2-1.0.3-resolved_asynch.json b/Payments/APIS/VMS-API2-VMS-API2-GS_P_VMS_API-1.0.2-1.0.3-resolved_asynch.json new file mode 100644 index 0000000..d41ef2d --- /dev/null +++ b/Payments/APIS/VMS-API2-VMS-API2-GS_P_VMS_API-1.0.2-1.0.3-resolved_asynch.json @@ -0,0 +1,1850 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "GovStack Payment BB Voucher Management APIs for external BB", + "description": "This schema is part of the Govstack Payments Building Block.\n", + "contact": { + "email": "oscar.correia@maarifaeducation.com" + }, + "version": "1.0.3" + }, + "servers": [ + { + "url": "https://virtserver.swaggerhub.com/VMS-API2/VMS-API2-GS_P_VMS_API-1.0.2/1.0.3", + "description": "SwaggerHub API Auto Mocking" + }, + { + "url": "https://virtserver.swaggerhub.com/GovStack/PaymentBuildingBlock/v1.0.1" + } + ], + "security": [ + { + "app_id": [] + } + ], + "tags": [ + { + "name": "VoucherPreactivation", + "description": "The **VoucherPreactivation** API is used by a non Payment Building Blocks in the GovStack Framework to request for a voucher to be used. This call reserves the voucher (for a period of time, which is to be implemented). This API requests a single voucher from the voucher server that can be used for a future redemption process. The caller sends an amount, a voucher group (depending on the use case), the currency and the name of the calling GovStack Building Block. If the API call is successful, the Payment Building Block will respond with a voucher number, a voucher serial number and an expiry date.\n" + }, + { + "name": "VoucherActivation", + "description": "The **VoucherActivation** API is used by a non Payment Building Blocks in the GovStack Framework to activate a pre-activated voucher. This is second function call is intended to ensure that the voucher is only activated when it is disbursed. This API requests for the activation of a voucher when the caller sends the voucher number to be activated. If the API call is successful, the activation is confirmed and the voucher can now be used by the beneficiary.\n" + }, + { + "name": "VoucherRedemption", + "description": "The **VoucherRedemption** API is used by a non Payment Building Blocks in the GovStack Framework to redeem a voucher. The calling Building Block will capture the voucher number and the voucher serial number from the merchant point. The external Building Block will also acquire the merchant name and payment details from the merchant registry. The calling Building Block will then send the voucher number, the voucher serial number, the merchant name and payment details. The Payment Building Block will verify that the voucher has been activated and has not been used or blocked or cancelled. If so, the Payment Building Block will then send a payment request to the funding agency / FSP. The Payment Gateway of the Payments Building Block will facilitate the debit of the funding account, and the credit of the merchant as well as handle any intermediary fees. Once the payment has been successfully done the Payment Building Block will mark the voucher as consumed and notify the merchant (and beneficiary if possible).\n" + }, + { + "name": "VoucherStatusCheck", + "description": "The **VoucherStatus** API is used by a non Payment Building Blocks in the GovStack Framework to check the status of a voucher. The calling Building Block will capture the voucher number and send it to the Payments Building Block to determine the status of a voucher. The Payments Building will respond with one of the status of Pre-Activated, Activated, Suspended, Blocked or Not Existing.\n" + }, + { + "name": "VoucherCancellation", + "description": "The **VocuherCancellation** API is used by a non Payment Building Blocks in the GovStack Framework to cancel a voucher. The calling Building Block will capture the voucher number and send it to the Payments Building Block to canel the voucher. The Payments Building Block will respond with a status of Cancelled, Already Cancelled or Not existing. The VoucherCancellation will override the Blocked status and render the voucher permanently unusable. \n" + } + ], + "paths": { + "/vouchers/voucher_preactivation": { + "post": { + "tags": [ + "VoucherPreactivation" + ], + "description": "Requests for voucher number, voucher serial number and expiry date by sending voucher group, amount and currency", + "operationId": "VoucherPreactivationPOST", + "parameters": [ + { + "name": "X-Callback-URL", + "in": "header", + "description": "The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string", + "format": "uri", + "example": "https://myserver.com/send/callback/here" + } + }, + { + "name": "X-Date", + "in": "header", + "description": "Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "X-CorrelationID", + "in": "header", + "description": "Header parameter to uniquely identify the request. Must be supplied as a UUID.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "pattern": "^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$", + "type": "string" + } + }, + { + "name": "X-API-Key", + "in": "header", + "description": "Used to pass pre-shared client's API key to the server.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-User-Bearer", + "in": "header", + "description": "Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-Client-Id", + "in": "header", + "description": "Used to pass pre-shared client's identifier to the server.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "maxLength": 256, + "type": "string" + } + }, + { + "name": "X-Content-Hash", + "in": "header", + "description": "SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-User-Credential-1", + "in": "header", + "description": "The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-User-Credential-2", + "in": "header", + "description": "The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-Channel", + "in": "header", + "description": "String containing the channel that was used to originate the request. For example USSD, Web, App.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "maxLength": 256, + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/voucher_preactivation_request" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successfully pre-activated voucher", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/preactivation_response" + } + } + } + }, + "400": { + "description": "Invalid resquest", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/invalid_preactivation_request" + } + } + } + }, + "452": { + "description": "Invalid amount", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/invalid_amount" + } + } + } + }, + "453": { + "description": "Invalid currency", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/invalid_currency" + } + } + } + }, + "454": { + "description": "Invalid voucher group", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/invalid_voucher_group" + } + } + } + }, + "455": { + "description": "Voucher group exhausted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/voucher_group_exhausted" + } + } + } + }, + "460": { + "description": "Gov Stack Building Block does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GovStack_BB_does_not_exist" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/internal_server_error" + } + } + } + }, + "503": { + "description": "Service Unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/service_unavailable" + } + } + } + }, + "599": { + "description": "Network connection timeout error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/network_timeout_error" + } + } + } + } + } + } + }, + "/vouchers/voucher_activation": { + "patch": { + "tags": [ + "VoucherActivation" + ], + "description": "Request for voucher activation by sending the voucher serial number", + "operationId": "VoucherActivationPATCH", + "parameters": [ + { + "name": "X-Callback-URL", + "in": "header", + "description": "The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string", + "format": "uri", + "example": "https://myserver.com/send/callback/here" + } + }, + { + "name": "X-Date", + "in": "header", + "description": "Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "X-CorrelationID", + "in": "header", + "description": "Header parameter to uniquely identify the request. Must be supplied as a UUID.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "pattern": "^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$", + "type": "string" + } + }, + { + "name": "X-API-Key", + "in": "header", + "description": "Used to pass pre-shared client's API key to the server.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-User-Bearer", + "in": "header", + "description": "Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-Client-Id", + "in": "header", + "description": "Used to pass pre-shared client's identifier to the server.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "maxLength": 256, + "type": "string" + } + }, + { + "name": "X-Content-Hash", + "in": "header", + "description": "SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-User-Credential-1", + "in": "header", + "description": "The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-User-Credential-2", + "in": "header", + "description": "The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-Channel", + "in": "header", + "description": "String containing the channel that was used to originate the request. For example USSD, Web, App.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "maxLength": 256, + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Voucher_activate_request" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successfully activated voucher", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/activation_response" + } + } + } + }, + "400": { + "description": "Invalid resquest", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/invalid_activation_request" + } + } + } + }, + "456": { + "description": "Invalid voucher serial number", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/invalid_voucher_serial_number" + } + } + } + }, + "460": { + "description": "Gov Stack Building Block does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GovStack_BB_does_not_exist" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/internal_server_error" + } + } + } + }, + "503": { + "description": "Service Unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/service_unavailable" + } + } + } + }, + "599": { + "description": "Network connection timeout error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/network_timeout_error" + } + } + } + } + } + } + }, + "/vouchers/voucher_redeemption": { + "post": { + "tags": [ + "VoucherRedemption" + ], + "description": "Request for voucher redemption by sending the voucher number, the merchant name and merchant payment details", + "operationId": "VoucherRedemptionPOST", + "parameters": [ + { + "name": "X-Callback-URL", + "in": "header", + "description": "The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string", + "format": "uri", + "example": "https://myserver.com/send/callback/here" + } + }, + { + "name": "X-Date", + "in": "header", + "description": "Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "X-CorrelationID", + "in": "header", + "description": "Header parameter to uniquely identify the request. Must be supplied as a UUID.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "pattern": "^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$", + "type": "string" + } + }, + { + "name": "X-API-Key", + "in": "header", + "description": "Used to pass pre-shared client's API key to the server.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-User-Bearer", + "in": "header", + "description": "Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-Client-Id", + "in": "header", + "description": "Used to pass pre-shared client's identifier to the server.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "maxLength": 256, + "type": "string" + } + }, + { + "name": "X-Content-Hash", + "in": "header", + "description": "SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-User-Credential-1", + "in": "header", + "description": "The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-User-Credential-2", + "in": "header", + "description": "The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-Channel", + "in": "header", + "description": "String containing the channel that was used to originate the request. For example USSD, Web, App.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "maxLength": 256, + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Voucher_redeem_request" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Voucher is successfully redeemed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/redemption_response" + } + } + } + }, + "400": { + "description": "Invalid resquest", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/invalid_redemption_request" + } + } + } + }, + "460": { + "description": "Gov Stack Building Block does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GovStack_BB_does_not_exist" + } + } + } + }, + "461": { + "description": "Invalid voucher number", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/invalid_voucher_number" + } + } + } + }, + "462": { + "description": "Insufficient funds in funding a/c", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/insufficient_funds" + } + } + } + }, + "463": { + "description": "Cannot credit merchant", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cannot_credit_merchant" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/internal_server_error" + } + } + } + }, + "503": { + "description": "Service Unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/service_unavailable" + } + } + } + }, + "599": { + "description": "Network connection timeout error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/network_timeout_error" + } + } + } + } + } + } + }, + "/vouchers/voucherstatuscheck/{voucherserialnumber}": { + "get": { + "tags": [ + "VoucherStatusCheck" + ], + "description": "Check the status of the Voucher. The API will respond with Not Preactivated, Preactivated, Activated, Active, Consumed, Blocked, Suspended and Purged.", + "operationId": "VoucherStatusCheckGET", + "parameters": [ + { + "name": "X-Callback-URL", + "in": "header", + "description": "The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string", + "format": "uri", + "example": "https://myserver.com/send/callback/here" + } + }, + { + "name": "voucherserialnumber", + "in": "path", + "description": "Voucher serial number to check status of", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-Date", + "in": "header", + "description": "Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "X-CorrelationID", + "in": "header", + "description": "Header parameter to uniquely identify the request. Must be supplied as a UUID.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "pattern": "^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$", + "type": "string" + } + }, + { + "name": "X-API-Key", + "in": "header", + "description": "Used to pass pre-shared client's API key to the server.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-User-Bearer", + "in": "header", + "description": "Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-Client-Id", + "in": "header", + "description": "Used to pass pre-shared client's identifier to the server.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "maxLength": 256, + "type": "string" + } + }, + { + "name": "X-Content-Hash", + "in": "header", + "description": "SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-User-Credential-1", + "in": "header", + "description": "The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-User-Credential-2", + "in": "header", + "description": "The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-Channel", + "in": "header", + "description": "String containing the channel that was used to originate the request. For example USSD, Web, App.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "maxLength": 256, + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Voucher status", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/voucher_status" + } + } + } + }, + "400": { + "description": "Invalid request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/invalid_validation_request" + } + } + } + }, + "456": { + "description": "Invalid voucher number", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/invalid_voucher_number" + } + } + } + }, + "458": { + "description": "Voucher number already used", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/voucher_already_used" + } + } + } + }, + "459": { + "description": "Voucher has expired", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/voucher_expired" + } + } + } + }, + "460": { + "description": "Gov Stack Building Block does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GovStack_BB_does_not_exist" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/internal_server_error" + } + } + } + }, + "503": { + "description": "Service Unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/service_unavailable" + } + } + } + }, + "599": { + "description": "Network connection timeout error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/network_timeout_error" + } + } + } + } + } + }, + "patch": { + "tags": [ + "VoucherCancellation" + ], + "description": "This operation cancels a specific voucher number.", + "operationId": "VoucherCancelPATCH", + "parameters": [ + { + "name": "X-Callback-URL", + "in": "header", + "description": "The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string", + "format": "uri", + "example": "https://myserver.com/send/callback/here" + } + }, + { + "name": "voucherserialnumber", + "in": "path", + "description": "Voucher serial number to check status of", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-Date", + "in": "header", + "description": "Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "X-CorrelationID", + "in": "header", + "description": "Header parameter to uniquely identify the request. Must be supplied as a UUID.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "pattern": "^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$", + "type": "string" + } + }, + { + "name": "X-API-Key", + "in": "header", + "description": "Used to pass pre-shared client's API key to the server.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-User-Bearer", + "in": "header", + "description": "Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-Client-Id", + "in": "header", + "description": "Used to pass pre-shared client's identifier to the server.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "maxLength": 256, + "type": "string" + } + }, + { + "name": "X-Content-Hash", + "in": "header", + "description": "SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-User-Credential-1", + "in": "header", + "description": "The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-User-Credential-2", + "in": "header", + "description": "The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + { + "name": "X-Channel", + "in": "header", + "description": "String containing the channel that was used to originate the request. For example USSD, Web, App.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "maxLength": 256, + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/voucher_cancel_request" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Voucher cancelled", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/voucher_cancelled" + } + } + } + }, + "400": { + "description": "Invalid request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/invalid_validation_request" + } + } + } + }, + "463": { + "description": "Invalid voucher", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/invalid_voucher" + } + } + } + }, + "464": { + "description": "Voucher is already cancelled", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/already_cancelled" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "voucher_preactivation_request": { + "required": [ + "Gov_Stack_BB", + "voucher_amount", + "voucher_currency", + "voucher_group" + ], + "type": "object", + "properties": { + "voucher_amount": { + "maxLength": 23, + "minLength": 1, + "pattern": "^([0]|([1-9][0-9]{0,17}))([.][0-9]{0,3}[0-9])?$", + "type": "string", + "example": "15.21" + }, + "voucher_currency": { + "type": "string", + "enum": [ + "AED", + "AFN", + "ALL", + "AMD", + "ANG", + "AOA", + "ARS", + "AUD", + "AWG", + "AZN", + "BAM", + "BBD", + "BDT", + "BGN", + "BHD", + "BIF", + "BMD", + "BND", + "BOB", + "BOV", + "BRL", + "BSD", + "BTN", + "BWP", + "BYN", + "BZD", + "CAD", + "CDF", + "CHE", + "CHF", + "CHW", + "CLF", + "CLP", + "CNY", + "COP", + "COU", + "CRC", + "CUC", + "CUP", + "CVE", + "CZK", + "DJF", + "DKK", + "DOP", + "DZD", + "EGP", + "ERN", + "ETB", + "EUR", + "FJD", + "FKP", + "GBP", + "GEL", + "GHS", + "GIP", + "GMD", + "GNF", + "GTQ", + "GYD", + "HKD", + "HNL", + "HRK", + "HTG", + "HUF", + "IDR", + "ILS", + "INR", + "IQD", + "IRR", + "ISK", + "JMD", + "JOD", + "JPY", + "KES", + "KGS", + "KHR", + "KMF", + "KPW", + "KRW", + "KWD", + "KYD", + "KZT", + "LAK", + "LBP", + "LKR", + "LRD", + "LSL", + "LYD", + "MAD", + "MDL", + "MGA", + "MKD", + "MMK", + "MNT", + "MOP", + "MRO", + "MUR", + "MVR", + "MWK", + "MXN", + "MXV", + "MYR", + "MZN", + "NAD", + "NGN", + "NIO", + "NOK", + "NPR", + "NZD", + "OMR", + "PAB", + "PEN", + "PGK", + "PHP", + "PKR", + "PLN", + "PYG", + "QAR", + "RON", + "RSD", + "RUB", + "RWF", + "SAR", + "SBD", + "SCR", + "SDG", + "SEK", + "SGD", + "SHP", + "SLL", + "SOS", + "SRD", + "SSP", + "STD", + "SVC", + "SYP", + "SZL", + "THB", + "TJS", + "TMT", + "TND", + "TOP", + "TRY", + "TTD", + "TWD", + "TZS", + "UAH", + "UGX", + "USD", + "USN", + "UYI", + "UYU", + "UZS", + "VEF", + "VND", + "VUV", + "WST", + "XAF", + "XAG", + "XAU", + "XBA", + "XBB", + "XBC", + "XBD", + "XCD", + "XDR", + "XOF", + "XPD", + "XPF", + "XPT", + "XSU", + "XTS", + "XUA", + "XXX", + "YER", + "ZAR", + "ZMW", + "ZWL" + ] + }, + "voucher_group": { + "type": "string" + }, + "Gov_Stack_BB": { + "type": "string" + }, + "voucher_comment": { + "type": "string" + } + } + }, + "preactivation_response": { + "required": [ + "expiry_date_time", + "voucher_number", + "voucher_serial_number" + ], + "properties": { + "voucher_number": { + "maxLength": 25, + "minLength": 16, + "type": "string", + "description": "This is a random secret number that uniquely identifies the value and validity of the voucher." + }, + "voucher_serial_number": { + "maxLength": 25, + "minLength": 16, + "type": "string", + "description": "This is a sequential number that is used to identify a voucher without necessarily revealing the voucher secret number. There is no relationship between the voucher serial number and the voucher number." + }, + "expiry_date_time": { + "type": "string", + "format": "date-time" + } + } + }, + "invalid_preactivation_request": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "invalid_amount": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "invalid_currency": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "invalid_voucher_group": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "voucher_group_exhausted": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "GovStack_BB_does_not_exist": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "internal_server_error": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "service_unavailable": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "network_timeout_error": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "Voucher_activate_request": { + "required": [ + "Gov_Stack_BB", + "voucher_serial_number" + ], + "type": "object", + "properties": { + "voucher_serial_number": { + "type": "integer", + "format": "int64" + }, + "Gov_Stack_BB": { + "type": "string" + } + } + }, + "activation_response": { + "required": [ + "result_status" + ], + "properties": { + "result_status": { + "type": "string" + } + } + }, + "invalid_activation_request": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "invalid_voucher_serial_number": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "Voucher_redeem_request": { + "required": [ + "Gov_Stack_BB", + "merchant_bank_details", + "merchant_name", + "merchant_voucher_group", + "override", + "voucher_number" + ], + "type": "object", + "properties": { + "voucher_number": { + "type": "integer", + "format": "int64" + }, + "Gov_Stack_BB": { + "type": "string" + }, + "merchant_name": { + "type": "string" + }, + "merchant_bank_details": { + "type": "string" + }, + "merchant_voucher_group": { + "type": "string" + }, + "override": { + "type": "boolean" + } + } + }, + "redemption_response": { + "required": [ + "result_status" + ], + "properties": { + "result_status": { + "type": "string" + } + } + }, + "invalid_redemption_request": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "invalid_voucher_number": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "cannot_credit_merchant": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "insufficient_funds": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "voucher_status": { + "properties": { + "voucher_status": { + "type": "string", + "enum": [ + "Not Pre-Activated", + "Pre-Activated", + "Activated", + "Suspended", + "Blocked", + "Purged", + "Not Existing" + ] + }, + "voucher_amount": { + "type": "string" + } + } + }, + "invalid_validation_request": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "voucher_already_used": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "voucher_expired": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "invalid_voucher": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "already_cancelled": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "voucher_cancel_request": { + "required": [ + "Gov_Stack_BB", + "voucherserialnumber" + ], + "type": "object", + "properties": { + "voucherserialnumber": { + "type": "string" + }, + "Gov_Stack_BB": { + "type": "string" + } + } + }, + "voucher_cancelled": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + }, + "parameters": { + "voucherserialnumber": { + "name": "voucherserialnumber", + "in": "path", + "description": "Voucher serial number to check status of", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "X-CorrelationID": { + "name": "X-CorrelationID", + "in": "header", + "description": "Header parameter to uniquely identify the request. Must be supplied as a UUID.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "pattern": "^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$", + "type": "string" + } + }, + "X-Date": { + "name": "X-Date", + "in": "header", + "description": "Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + "X-API-Key": { + "name": "X-API-Key", + "in": "header", + "description": "Used to pass pre-shared client's API key to the server.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "X-User-Bearer": { + "name": "X-User-Bearer", + "in": "header", + "description": "Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "X-Client-Id": { + "name": "X-Client-Id", + "in": "header", + "description": "Used to pass pre-shared client's identifier to the server.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "maxLength": 256, + "type": "string" + } + }, + "X-Content-Hash": { + "name": "X-Content-Hash", + "in": "header", + "description": "SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "X-User-Credential-1": { + "name": "X-User-Credential-1", + "in": "header", + "description": "The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "X-User-Credential-2": { + "name": "X-User-Credential-2", + "in": "header", + "description": "The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "X-Channel": { + "name": "X-Channel", + "in": "header", + "description": "String containing the channel that was used to originate the request. For example USSD, Web, App.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "maxLength": 256, + "type": "string" + } + }, + "X-Callback-URL": { + "name": "X-Callback-URL", + "in": "header", + "description": "The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT.", + "required": false, + "style": "simple", + "explode": false, + "schema": { + "type": "string", + "format": "uri", + "example": "https://myserver.com/send/callback/here" + } + } + }, + "securitySchemes": { + "app_id": { + "type": "apiKey", + "description": "API key to authorize request", + "name": "appid", + "in": "query" + } + } + } +} \ No newline at end of file diff --git a/Payments/APIS/VMS-API2-VMS-API2-GS_P_VMS_API-1.0.2-1.0.3-resolved_asynch.yaml b/Payments/APIS/VMS-API2-VMS-API2-GS_P_VMS_API-1.0.2-1.0.3-resolved_asynch.yaml new file mode 100644 index 0000000..309919f --- /dev/null +++ b/Payments/APIS/VMS-API2-VMS-API2-GS_P_VMS_API-1.0.2-1.0.3-resolved_asynch.yaml @@ -0,0 +1,1323 @@ +--- +openapi: 3.0.0 +info: + title: GovStack Payment BB Voucher Management APIs for external BB + description: | + This schema is part of the Govstack Payments Building Block. + contact: + email: oscar.correia@maarifaeducation.com + version: 1.0.3 +servers: +- url: https://virtserver.swaggerhub.com/VMS-API2/VMS-API2-GS_P_VMS_API-1.0.2/1.0.3 + description: SwaggerHub API Auto Mocking +- url: https://virtserver.swaggerhub.com/GovStack/PaymentBuildingBlock/v1.0.1 +security: +- app_id: [] +tags: +- name: VoucherPreactivation + description: | + The **VoucherPreactivation** API is used by a non Payment Building Blocks in the GovStack Framework to request for a voucher to be used. This call reserves the voucher (for a period of time, which is to be implemented). This API requests a single voucher from the voucher server that can be used for a future redemption process. The caller sends an amount, a voucher group (depending on the use case), the currency and the name of the calling GovStack Building Block. If the API call is successful, the Payment Building Block will respond with a voucher number, a voucher serial number and an expiry date. +- name: VoucherActivation + description: | + The **VoucherActivation** API is used by a non Payment Building Blocks in the GovStack Framework to activate a pre-activated voucher. This is second function call is intended to ensure that the voucher is only activated when it is disbursed. This API requests for the activation of a voucher when the caller sends the voucher number to be activated. If the API call is successful, the activation is confirmed and the voucher can now be used by the beneficiary. +- name: VoucherRedemption + description: | + The **VoucherRedemption** API is used by a non Payment Building Blocks in the GovStack Framework to redeem a voucher. The calling Building Block will capture the voucher number and the voucher serial number from the merchant point. The external Building Block will also acquire the merchant name and payment details from the merchant registry. The calling Building Block will then send the voucher number, the voucher serial number, the merchant name and payment details. The Payment Building Block will verify that the voucher has been activated and has not been used or blocked or cancelled. If so, the Payment Building Block will then send a payment request to the funding agency / FSP. The Payment Gateway of the Payments Building Block will facilitate the debit of the funding account, and the credit of the merchant as well as handle any intermediary fees. Once the payment has been successfully done the Payment Building Block will mark the voucher as consumed and notify the merchant (and beneficiary if possible). +- name: VoucherStatusCheck + description: | + The **VoucherStatus** API is used by a non Payment Building Blocks in the GovStack Framework to check the status of a voucher. The calling Building Block will capture the voucher number and send it to the Payments Building Block to determine the status of a voucher. The Payments Building will respond with one of the status of Pre-Activated, Activated, Suspended, Blocked or Not Existing. +- name: VoucherCancellation + description: "The **VocuherCancellation** API is used by a non Payment Building Blocks in the GovStack Framework to cancel a voucher. The calling Building Block will capture the voucher number and send it to the Payments Building Block to canel the voucher. The Payments Building Block will respond with a status of Cancelled, Already Cancelled or Not existing. The VoucherCancellation will override the Blocked status and render the voucher permanently unusable. \n" +paths: + /vouchers/voucher_preactivation: + post: + tags: + - VoucherPreactivation + description: Requests for voucher number, voucher serial number and expiry date by sending voucher group, amount and currency + operationId: VoucherPreactivationPOST + parameters: + - name: X-Callback-URL + in: header + description: The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT. + required: false + style: simple + explode: false + schema: + type: string + format: uri + example: https://myserver.com/send/callback/here + - name: X-Date + in: header + description: Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API. + required: false + style: simple + explode: false + schema: + type: string + format: date-time + - name: X-CorrelationID + in: header + description: Header parameter to uniquely identify the request. Must be supplied as a UUID. + required: false + style: simple + explode: false + schema: + pattern: ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$ + type: string + - name: X-API-Key + in: header + description: Used to pass pre-shared client's API key to the server. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Bearer + in: header + description: Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Client-Id + in: header + description: Used to pass pre-shared client's identifier to the server. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + - name: X-Content-Hash + in: header + description: SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-1 + in: header + description: The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-2 + in: header + description: The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Channel + in: header + description: String containing the channel that was used to originate the request. For example USSD, Web, App. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/voucher_preactivation_request' + required: true + responses: + "200": + description: Successfully pre-activated voucher + content: + application/json: + schema: + $ref: '#/components/schemas/preactivation_response' + "400": + description: Invalid resquest + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_preactivation_request' + "452": + description: Invalid amount + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_amount' + "453": + description: Invalid currency + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_currency' + "454": + description: Invalid voucher group + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_voucher_group' + "455": + description: Voucher group exhausted + content: + application/json: + schema: + $ref: '#/components/schemas/voucher_group_exhausted' + "460": + description: Gov Stack Building Block does not exist + content: + application/json: + schema: + $ref: '#/components/schemas/GovStack_BB_does_not_exist' + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/internal_server_error' + "503": + description: Service Unavailable + content: + application/json: + schema: + $ref: '#/components/schemas/service_unavailable' + "599": + description: Network connection timeout error + content: + application/json: + schema: + $ref: '#/components/schemas/network_timeout_error' + /vouchers/voucher_activation: + patch: + tags: + - VoucherActivation + description: Request for voucher activation by sending the voucher serial number + operationId: VoucherActivationPATCH + parameters: + - name: X-Callback-URL + in: header + description: The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT. + required: false + style: simple + explode: false + schema: + type: string + format: uri + example: https://myserver.com/send/callback/here + - name: X-Date + in: header + description: Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API. + required: false + style: simple + explode: false + schema: + type: string + format: date-time + - name: X-CorrelationID + in: header + description: Header parameter to uniquely identify the request. Must be supplied as a UUID. + required: false + style: simple + explode: false + schema: + pattern: ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$ + type: string + - name: X-API-Key + in: header + description: Used to pass pre-shared client's API key to the server. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Bearer + in: header + description: Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Client-Id + in: header + description: Used to pass pre-shared client's identifier to the server. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + - name: X-Content-Hash + in: header + description: SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-1 + in: header + description: The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-2 + in: header + description: The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Channel + in: header + description: String containing the channel that was used to originate the request. For example USSD, Web, App. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Voucher_activate_request' + required: true + responses: + "200": + description: Successfully activated voucher + content: + application/json: + schema: + $ref: '#/components/schemas/activation_response' + "400": + description: Invalid resquest + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_activation_request' + "456": + description: Invalid voucher serial number + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_voucher_serial_number' + "460": + description: Gov Stack Building Block does not exist + content: + application/json: + schema: + $ref: '#/components/schemas/GovStack_BB_does_not_exist' + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/internal_server_error' + "503": + description: Service Unavailable + content: + application/json: + schema: + $ref: '#/components/schemas/service_unavailable' + "599": + description: Network connection timeout error + content: + application/json: + schema: + $ref: '#/components/schemas/network_timeout_error' + /vouchers/voucher_redeemption: + post: + tags: + - VoucherRedemption + description: Request for voucher redemption by sending the voucher number, the merchant name and merchant payment details + operationId: VoucherRedemptionPOST + parameters: + - name: X-Callback-URL + in: header + description: The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT. + required: false + style: simple + explode: false + schema: + type: string + format: uri + example: https://myserver.com/send/callback/here + - name: X-Date + in: header + description: Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API. + required: false + style: simple + explode: false + schema: + type: string + format: date-time + - name: X-CorrelationID + in: header + description: Header parameter to uniquely identify the request. Must be supplied as a UUID. + required: false + style: simple + explode: false + schema: + pattern: ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$ + type: string + - name: X-API-Key + in: header + description: Used to pass pre-shared client's API key to the server. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Bearer + in: header + description: Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Client-Id + in: header + description: Used to pass pre-shared client's identifier to the server. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + - name: X-Content-Hash + in: header + description: SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-1 + in: header + description: The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-2 + in: header + description: The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Channel + in: header + description: String containing the channel that was used to originate the request. For example USSD, Web, App. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Voucher_redeem_request' + required: true + responses: + "200": + description: Voucher is successfully redeemed + content: + application/json: + schema: + $ref: '#/components/schemas/redemption_response' + "400": + description: Invalid resquest + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_redemption_request' + "460": + description: Gov Stack Building Block does not exist + content: + application/json: + schema: + $ref: '#/components/schemas/GovStack_BB_does_not_exist' + "461": + description: Invalid voucher number + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_voucher_number' + "462": + description: Insufficient funds in funding a/c + content: + application/json: + schema: + $ref: '#/components/schemas/insufficient_funds' + "463": + description: Cannot credit merchant + content: + application/json: + schema: + $ref: '#/components/schemas/cannot_credit_merchant' + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/internal_server_error' + "503": + description: Service Unavailable + content: + application/json: + schema: + $ref: '#/components/schemas/service_unavailable' + "599": + description: Network connection timeout error + content: + application/json: + schema: + $ref: '#/components/schemas/network_timeout_error' + /vouchers/voucherstatuscheck/{voucherserialnumber}: + get: + tags: + - VoucherStatusCheck + description: Check the status of the Voucher. The API will respond with Not Preactivated, Preactivated, Activated, Active, Consumed, Blocked, Suspended and Purged. + operationId: VoucherStatusCheckGET + parameters: + - name: X-Callback-URL + in: header + description: The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT. + required: false + style: simple + explode: false + schema: + type: string + format: uri + example: https://myserver.com/send/callback/here + - name: voucherserialnumber + in: path + description: Voucher serial number to check status of + required: true + style: simple + explode: false + schema: + type: string + - name: X-Date + in: header + description: Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API. + required: false + style: simple + explode: false + schema: + type: string + format: date-time + - name: X-CorrelationID + in: header + description: Header parameter to uniquely identify the request. Must be supplied as a UUID. + required: false + style: simple + explode: false + schema: + pattern: ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$ + type: string + - name: X-API-Key + in: header + description: Used to pass pre-shared client's API key to the server. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Bearer + in: header + description: Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Client-Id + in: header + description: Used to pass pre-shared client's identifier to the server. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + - name: X-Content-Hash + in: header + description: SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-1 + in: header + description: The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-2 + in: header + description: The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Channel + in: header + description: String containing the channel that was used to originate the request. For example USSD, Web, App. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + responses: + "200": + description: Voucher status + content: + application/json: + schema: + $ref: '#/components/schemas/voucher_status' + "400": + description: Invalid request + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_validation_request' + "456": + description: Invalid voucher number + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_voucher_number' + "458": + description: Voucher number already used + content: + application/json: + schema: + $ref: '#/components/schemas/voucher_already_used' + "459": + description: Voucher has expired + content: + application/json: + schema: + $ref: '#/components/schemas/voucher_expired' + "460": + description: Gov Stack Building Block does not exist + content: + application/json: + schema: + $ref: '#/components/schemas/GovStack_BB_does_not_exist' + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/internal_server_error' + "503": + description: Service Unavailable + content: + application/json: + schema: + $ref: '#/components/schemas/service_unavailable' + "599": + description: Network connection timeout error + content: + application/json: + schema: + $ref: '#/components/schemas/network_timeout_error' + patch: + tags: + - VoucherCancellation + description: This operation cancels a specific voucher number. + operationId: VoucherCancelPATCH + parameters: + - name: X-Callback-URL + in: header + description: The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT. + required: false + style: simple + explode: false + schema: + type: string + format: uri + example: https://myserver.com/send/callback/here + - name: voucherserialnumber + in: path + description: Voucher serial number to check status of + required: true + style: simple + explode: false + schema: + type: string + - name: X-Date + in: header + description: Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API. + required: false + style: simple + explode: false + schema: + type: string + format: date-time + - name: X-CorrelationID + in: header + description: Header parameter to uniquely identify the request. Must be supplied as a UUID. + required: false + style: simple + explode: false + schema: + pattern: ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$ + type: string + - name: X-API-Key + in: header + description: Used to pass pre-shared client's API key to the server. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Bearer + in: header + description: Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Client-Id + in: header + description: Used to pass pre-shared client's identifier to the server. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + - name: X-Content-Hash + in: header + description: SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-1 + in: header + description: The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-2 + in: header + description: The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Channel + in: header + description: String containing the channel that was used to originate the request. For example USSD, Web, App. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/voucher_cancel_request' + required: true + responses: + "200": + description: Voucher cancelled + content: + application/json: + schema: + $ref: '#/components/schemas/voucher_cancelled' + "400": + description: Invalid request + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_validation_request' + "463": + description: Invalid voucher + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_voucher' + "464": + description: Voucher is already cancelled + content: + application/json: + schema: + $ref: '#/components/schemas/already_cancelled' +components: + schemas: + voucher_preactivation_request: + required: + - Gov_Stack_BB + - voucher_amount + - voucher_currency + - voucher_group + type: object + properties: + voucher_amount: + maxLength: 23 + minLength: 1 + pattern: ^([0]|([1-9][0-9]{0,17}))([.][0-9]{0,3}[0-9])?$ + type: string + example: "15.21" + voucher_currency: + type: string + enum: + - AED + - AFN + - ALL + - AMD + - ANG + - AOA + - ARS + - AUD + - AWG + - AZN + - BAM + - BBD + - BDT + - BGN + - BHD + - BIF + - BMD + - BND + - BOB + - BOV + - BRL + - BSD + - BTN + - BWP + - BYN + - BZD + - CAD + - CDF + - CHE + - CHF + - CHW + - CLF + - CLP + - CNY + - COP + - COU + - CRC + - CUC + - CUP + - CVE + - CZK + - DJF + - DKK + - DOP + - DZD + - EGP + - ERN + - ETB + - EUR + - FJD + - FKP + - GBP + - GEL + - GHS + - GIP + - GMD + - GNF + - GTQ + - GYD + - HKD + - HNL + - HRK + - HTG + - HUF + - IDR + - ILS + - INR + - IQD + - IRR + - ISK + - JMD + - JOD + - JPY + - KES + - KGS + - KHR + - KMF + - KPW + - KRW + - KWD + - KYD + - KZT + - LAK + - LBP + - LKR + - LRD + - LSL + - LYD + - MAD + - MDL + - MGA + - MKD + - MMK + - MNT + - MOP + - MRO + - MUR + - MVR + - MWK + - MXN + - MXV + - MYR + - MZN + - NAD + - NGN + - NIO + - NOK + - NPR + - NZD + - OMR + - PAB + - PEN + - PGK + - PHP + - PKR + - PLN + - PYG + - QAR + - RON + - RSD + - RUB + - RWF + - SAR + - SBD + - SCR + - SDG + - SEK + - SGD + - SHP + - SLL + - SOS + - SRD + - SSP + - STD + - SVC + - SYP + - SZL + - THB + - TJS + - TMT + - TND + - TOP + - TRY + - TTD + - TWD + - TZS + - UAH + - UGX + - USD + - USN + - UYI + - UYU + - UZS + - VEF + - VND + - VUV + - WST + - XAF + - XAG + - XAU + - XBA + - XBB + - XBC + - XBD + - XCD + - XDR + - XOF + - XPD + - XPF + - XPT + - XSU + - XTS + - XUA + - XXX + - YER + - ZAR + - ZMW + - ZWL + voucher_group: + type: string + Gov_Stack_BB: + type: string + voucher_comment: + type: string + preactivation_response: + required: + - expiry_date_time + - voucher_number + - voucher_serial_number + properties: + voucher_number: + maxLength: 25 + minLength: 16 + type: string + description: This is a random secret number that uniquely identifies the value and validity of the voucher. + voucher_serial_number: + maxLength: 25 + minLength: 16 + type: string + description: This is a sequential number that is used to identify a voucher without necessarily revealing the voucher secret number. There is no relationship between the voucher serial number and the voucher number. + expiry_date_time: + type: string + format: date-time + invalid_preactivation_request: + required: + - message + type: object + properties: + message: + type: string + invalid_amount: + required: + - message + type: object + properties: + message: + type: string + invalid_currency: + required: + - message + type: object + properties: + message: + type: string + invalid_voucher_group: + required: + - message + type: object + properties: + message: + type: string + voucher_group_exhausted: + required: + - message + type: object + properties: + message: + type: string + GovStack_BB_does_not_exist: + required: + - message + type: object + properties: + message: + type: string + internal_server_error: + required: + - message + type: object + properties: + message: + type: string + service_unavailable: + required: + - message + type: object + properties: + message: + type: string + network_timeout_error: + required: + - message + type: object + properties: + message: + type: string + Voucher_activate_request: + required: + - Gov_Stack_BB + - voucher_serial_number + type: object + properties: + voucher_serial_number: + type: integer + format: int64 + Gov_Stack_BB: + type: string + activation_response: + required: + - result_status + properties: + result_status: + type: string + invalid_activation_request: + required: + - message + type: object + properties: + message: + type: string + invalid_voucher_serial_number: + required: + - message + type: object + properties: + message: + type: string + Voucher_redeem_request: + required: + - Gov_Stack_BB + - merchant_bank_details + - merchant_name + - merchant_voucher_group + - override + - voucher_number + type: object + properties: + voucher_number: + type: integer + format: int64 + Gov_Stack_BB: + type: string + merchant_name: + type: string + merchant_bank_details: + type: string + merchant_voucher_group: + type: string + override: + type: boolean + redemption_response: + required: + - result_status + properties: + result_status: + type: string + invalid_redemption_request: + required: + - message + type: object + properties: + message: + type: string + invalid_voucher_number: + required: + - message + type: object + properties: + message: + type: string + cannot_credit_merchant: + required: + - message + type: object + properties: + message: + type: string + insufficient_funds: + required: + - message + type: object + properties: + message: + type: string + voucher_status: + properties: + voucher_status: + type: string + enum: + - Not Pre-Activated + - Pre-Activated + - Activated + - Suspended + - Blocked + - Purged + - Not Existing + voucher_amount: + type: string + invalid_validation_request: + type: object + properties: + message: + type: string + voucher_already_used: + required: + - message + type: object + properties: + message: + type: string + voucher_expired: + required: + - message + type: object + properties: + message: + type: string + invalid_voucher: + required: + - message + type: object + properties: + message: + type: string + already_cancelled: + required: + - message + type: object + properties: + message: + type: string + voucher_cancel_request: + required: + - Gov_Stack_BB + - voucherserialnumber + type: object + properties: + voucherserialnumber: + type: string + Gov_Stack_BB: + type: string + voucher_cancelled: + required: + - message + type: object + properties: + message: + type: string + parameters: + voucherserialnumber: + name: voucherserialnumber + in: path + description: Voucher serial number to check status of + required: true + style: simple + explode: false + schema: + type: string + X-CorrelationID: + name: X-CorrelationID + in: header + description: Header parameter to uniquely identify the request. Must be supplied as a UUID. + required: false + style: simple + explode: false + schema: + pattern: ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$ + type: string + X-Date: + name: X-Date + in: header + description: Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API. + required: false + style: simple + explode: false + schema: + type: string + format: date-time + X-API-Key: + name: X-API-Key + in: header + description: Used to pass pre-shared client's API key to the server. + required: false + style: simple + explode: false + schema: + type: string + X-User-Bearer: + name: X-User-Bearer + in: header + description: Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication. + required: false + style: simple + explode: false + schema: + type: string + X-Client-Id: + name: X-Client-Id + in: header + description: Used to pass pre-shared client's identifier to the server. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + X-Content-Hash: + name: X-Content-Hash + in: header + description: SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed. + required: false + style: simple + explode: false + schema: + type: string + X-User-Credential-1: + name: X-User-Credential-1 + in: header + description: The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + X-User-Credential-2: + name: X-User-Credential-2 + in: header + description: The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + X-Channel: + name: X-Channel + in: header + description: String containing the channel that was used to originate the request. For example USSD, Web, App. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + X-Callback-URL: + name: X-Callback-URL + in: header + description: The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT. + required: false + style: simple + explode: false + schema: + type: string + format: uri + example: https://myserver.com/send/callback/here + securitySchemes: + app_id: + type: apiKey + description: API key to authorize request + name: appid + in: query diff --git a/Payments/Diagrams/Bulk Payment BB - Payment Gateway in the bulk payment use cases.png b/Payments/Diagrams/Bulk Payment BB - Payment Gateway in the bulk payment use cases.png new file mode 100644 index 0000000000000000000000000000000000000000..d97f3fbdbc3baefce88e76566e43cae294461095 GIT binary patch literal 44313 zcmc$`cRbg9|2D2knU#c;6s63JghI$J%3jIJEIXSz6G>zXWn}NHtWZgIvP(v0R#wX9 zK0eO#y1(E1dtbkQe!uU1|6J$eI-U5u$7?*F$MZOj=gU{=sxEH5cL zdpWyI#QuaY`*ROb9XuYdVR*^X_nM)VHo+du_g%GjdE`$$H&K~q%78*idA^VJ_ z&|!XiWnsJ^=*t%kEgt(ZC9U9~pm+H}adF4$Hb{1EzkU0*ot+&e<Vekn|JtSOL5LS%EzPF%*!%uG$KbGo;zt+h2q)U(27=;K4uLuV4@*H;&<`rbHe zYHD7+`YG42=0=5EUEb8fc-!jY4A*{N>ei%g+p*8_2Tom`&1n`D`b{PM;UU%hWKN~W z=KA77p`V}pk54Ze>g%(0O6C{FmBnj2v$VAf&H0V%L$zXa^2R^MSEXJ{AYn>QPUbh0 zc914Yl)&Td=AlzE_wewj@}d0E_h+WRQoHDmSKwiRJFMyQ4~Qv`3fZ%|m%A;`t7U1G zyZkuFEI5bx8O}?Cj0sGPCvT~ zy#iG;)LQ%!sK2(93Rr%5rC;TJy7Ukck!%3a5$cMww~mY3iCN#9kg=ed5FwB`w&1j%@3*5NAd-ckoYKfhnUe(~}V zzNWfz`Z3|bAt64LjCah<&2QfPT;@0<{q(5p-IE*~x8Hm1Id|?{cXu}h1%-05f~>s! zkVsNZj*yTLCaEp?N`8KRTT6>sM|#Jn7s6({L`5s#Y-4zb z22+w!MSI|YgnR&_=v8@f2?+}pzJsc7)FnsHt25gT<5eQK^rpXmk4s3v(?rkCTGuHi z)#yIPI<~4@?`&*T(9^3_&$)qrMnuw!nvVEKX|Q|zp6I9zI#F$q8xwP*Ip!kP+-c1# zKf6wg?6{$(_NRfXvf%bNH9b8&d3h`*^Y3r(FHZLk^$*A$q@mfEt)k@6eogHwIXXIe z=gyrG8t&5%^w`P=+qU1kesf!>qO~=*u88B$?#uFW^76{puNU`gDn37dsbQR-*(>l6 z*A45C!*q1}#6?!8cvtRr7nl`%>Me6LtHb6nm31L}l_n&dVDi#`cG2~ZN=K4r{;d|- zKhwQzn$tr=Cp3>9Il@7`mo3}Wb8U{eAx}DhA>PX5)APDQZj(<8T25Go;l|j~awKO3 z1P=L1Zoe;fY^lGQ9J5D5L*qqtrD^kpTwy_h+vdi_+rz&nyMle5hQ4^wo1va#`cO9H zWQ$oezl9V@&=m6#3|zl$h+P$nqy17>=;6WlnB;?5v)|wC5Ro|Lu8$)a-rnAeGyM^+ z`mC(1W35T@)wevC28cxn!yf!~`@LYXlRN4k32)DqIYz~P* zu;!tQIV7T=jHMI$7nCi4oC>qHH&UG=1pNB ziywK;RUfjiz_XubO2m-5mA*TL%@I~7L-*rxI{min)4IC7{T{0bK^6(pPm@`8>?Zq8 zxA?eNK}t_=GeXb9Hz44sz#WFJAHl)#vs6G7$Bfj&6KuPaoqBJL|KW&`5DAM;>#nOsqh5hnc(OD5F-NEG z#3CLfVC73nN?IRi?Jw8S(HYa8_Q|f?Sn)H~oW7Kuf2--`!Q%4Oa@R%EJ&sH}7a#Q8 z-$86zhj-Kr#~^U53)*3k_PC8_Ybh&-Y=qbS>~);_a)~W8JiJwVfUvyfJ9G3DCmBTC ziq&3LRVMdP9ZFA4ebm{~))vBEl$(26;ABr7TcqK2n+mszeHUqeFD{yB-bKFaar^!I zx4fKOafW@dG9N$XmCM(8=uQvmTuVC9%wOoXY^!x$M@J#ryzh-*^R@Ix4Mra8ztyt? z`>slnl-Q2!)qWZ+%o(z0&z^z3C99vaZa9hORStmx+4kaW1QRe!~c z7cZ``H574cXlm{gMC<)f z^+I-|3T|#|;T+l<8>=&8V`EW8o=da(EAKlxRHvnoChlSw^aLzAGZ9lxpFWM8TIu}j zmc70G_3QhY5)%`>)My25hq)@(#7P95W^W>lP#h7GY$%Z+4)F6Mb&t=S@Rrtb24f@Qz2kmK~)NQ7SZmoJ~aqyru@@e{tns9Im&)}EeR90y#B7122| z{y^{74Ttg8%Pyou^*bWTSPN}2DV&_spW`JgEvKrHU~jznQts+FeL`*UDNiE9V^!mU z_Yb#i+vaw(>syK<cYDR#QpAzM=mZM^D+fuGBZ1P z=#X8+y&{XQfN3U*qZf*8N90N!9c^sP+LHZ;b-cux9R1G=a1=%V;C%72UxWvP`3tt@r@F)7g?V?pU4a{9@*d*MCMCay#+j@>taF`p(wIE{O9L4_J+O^ zyAVEsgZSCx2t29#1tCF9u;znYl6SQSs_i6g;ufIqSaq1LX>to0OO^$Nk zyvIPgW06bydJGe%`>aJDTO@}JBj>#pFO!J-XIffY2LoKj4=(q3WEU4dt6=5eNUD4? zKQJ~Xv)N3@c!$qfe&>}H6MLHuRF=dDXpQ^%0{-?%O3DX~63cU#NI zXc+e!TQ3Zj_BkOP!0dIweT5L779s_MrI%Hbn(MMAs6zUVT_TATcDz%4ASbwTShd48 zE0y*|RM#-2%|P}Mw+}9rxS?}xp#kmA?!GoxlBfg9OVz` zDcHq0#82)>Pt44G;!4K4J`%iI$IZg>u%g&?k#pTR^eJAqF;+D8#@9;Z&q&b-ImgLP zj?$r6A%_WX^208R(^&`xp6kIqDHMz%&!??UUVSbjnm*vEXDw6kmKSp%B3etF5h#^Q5Q^DJ(1u5AVdj*s)_r zf2C(7lEm~?B|+;hK2eXg;>=71)C)buLDP?m59jS+0@6n6yWlv@&?|g*ytVq>yGzrN z`^5q8FJ8RZj47P#%)(l|g9k(~)O~HKiKu|Y#ImU+DRif(991L2c!m3_kf5M!8W*pS zZF?puIWy<$*RK)v}{E-0Yh`_R_jsqxuaHnmIuJ!?C=XiV0%Yb}(bYht4Fb8~eK4GB3J^nXvr zg&Mjz5tR$MByrZ)W1KJF{_^U6r-H2P0EIWJw6yffg9FW?8aFjx1EV=ic6w38D=n=p z|B@?H>DUaHIm5y6^GoiDtkLh^#S|AU%*=v3kM?}%=qa=~)HTrWxv87C&t*sI>(}Sh z^GsWgYw?~r^EljEG|`6gp3D5OZ%K)B$u%CNK!K~T_Ba1>UKrcg#pB*XzWA&iV=8~u z12KYL%E$9c2@~fCs=<=i4R+SbMp^x_102{NhgYbuma2dj0Q1d*DP7g9*iLkP>0qw2o#|OOvK?ykj8m;S#<^EzNmiBVm{7 z=<1?O3kbM6^wFP~f}t3xA0WVnvh`n!mPbI~M?gVw8`pvw-Eo@`vgSKVg-7W{hHso0 z4k&y5`VWW&09d0tcd|1wCPzk)rCFwz$$wXt2-}Z+ZckIj)w8p+Q&N7Qlt#8!pl=ka zHhBx2;tuS@#l>Y|VR7Zk6<%ImE2|l#`=@lgQqvTEk}r{y*mX} z%~Qq{#k5i0CH|SPMjE2fomKU#tdvB7+6oF}3m?jeGLcli%NQPw3&Q5z&Mq$PwfVFhb)8yhxZ(!512o?c8Z|&49%JvG{kQIFDl? z+fqe$?b_9oV7rIui16J|H`2#{6|-`9NnK{LCQ=f$jwKUY&n+kbwrlU~e4U%S{O6k$ zs!*npO5wP^W1MoN@z<`AFc7s<_MG|`S5_JHf0P;fZzAHP^R)`;ywegq#3VlES*kMX z2PyBkKB#TgZh7gtH&Ygk1HGqZPTW=fZOU3CSKJ3Hqcd)tRL)A?wiH;hVHl)rR-f;# z9=%J}*}Fii-Eb|p{4b%0yA;fr_u~GhfsS}%&l%&L3P*AY& z`!_iyWlr@UtDfS0M~>+Fk)L_ctu>5Fmd^V$J3I4ZZK6E1N^0Bs@GEY?F^qP0U5tiS_7pKc2;`(Iu<1 z!NI{aTsL}vj*1wWaDKUKIqNJww8ZU_|B#-@DrY0|l zVdSxB0V~2X0C9z4rn5aWCBeSqqnfnCWIp?01_lL^uZ0#7M*67A0dq*0_U+r(aa-xm z*|TT80_TQm>{t-D)6&xLq&z7jdik$=D%_)~2B)SN7#W)nih#I9QFyRMSp-$zaWBi> z(!$Xz9bO9$ivXpFf$_*=5W^*J>V=&}{EaNHVfF%vRD9WwMn@mZpvdy8ILRJT z(u|^*RN{y1wsA-APWPA@81T6Mu{?1i;pexaHh*?cjflys@%kg!}{#4R#y!D=6ipw@1@i7#^H{fDDqQk^BDr z`{QTMq~rN@NinNP0gR4{ib}^{?tREXvk(diV4wOt67EdpW?x;MES6_y=iSys z+41r5o|FZiG2Ea0=!Gw!Kh@QXHJVoZjAb)IK@_AQBiD7z_*yp1*j3 z4dO#aN1*+@^})@uxJHMDGE${P={)tJV^5%o4C7*8NXp zOiYZguPo}7t1pBuXOIIget5LcD-grNL-q@dV$8Kyg@x{GOEy3%7y&XeGE^Pw!*wBz zjg9ytEe#D?Iy!d{V8H3Y^GVc6J;&AOqCSD3^45p+aVkFzRrh1b;}{wYhN@P)UZsaY z?h-@?P=c*(ZM*^kj6(LN;^Kc99XTx@)L2`8=uuRrfhq^LIbl~K=>1w)0LzP@B(Ij52O>Wim%z zUcN;9^w6;yk1XA?yNKDr!ha#$@sQaKyx)~=1Wkyn3NhoQ_cf(6=XWbRncn@`t$O`B z52zea0k({hQBm3W;PU)Pu;_EZt|x~DKD~c0uBe!Um@)E4vb9F?){;4GzilFeTc>ZS zaIb`_%Pn54OMIxbv=jj;jP~qTmz1~zR6W>D-un5owY|ODuTk=>&qY>xC@x4z z{lNR!qP_s4OF%61_Wp?Yv|R8CbW~l)sRQDec7iH2*_D&OSz*L_@#2e^+PjX9vHTV^ zx+6fEf3Q+*`9bb*?)SxHNj;(6M@`Ll^DPn3leaz)zl7`HY<~`xbo*`MpoACn>V@5+f%Wre)g7iefo5jokrAo-b*d8g1YWWCd2*Ifir63+pByS z_GOaVIvRpR@d|_<^NL-*s2XBUc;>NR6Fef5wuP*9fogsX?xS`Nbj`V06MH$sjaL`O zB}kTkHH$j`N$)IDzp$E|txdMl&;r%Oi6UabCeW}FiDA2VZHe6v(^ag~1kp7vo#Mb~ zP(W97b#%;+?h>Icl=yJ=nF2tt%l&?^TgIJ<>JeYReG@QmH^m@{h=`C?nVOnfcO}*_ z9Ecpq(0BXl$;cxsxHO!mHKeH+sQ`u*>=^cdBfiwt)j><~^5!FP+IAqHOK-T73pJhG zv3>iPHhpbQgpsKCfn{;?egbA-=EgSeTzT zpdE!Gr_+STlKS7No&W<5wNrHKHy_Y>qgsQwP=sv{_eiW0K6u_7l>_%qt%Azg;zw zlapiT;28#7S4e%(M{pNV=eOOASYWZkQ^PUDSGBbkiL(+VGEV9esq;j^^L}|6@*E|*`ug!8Xo|^d5RVWYH`@}~-y^t3bvLAy~2z{lh z>Ona3$&>rVL2@lM>INKf7ku2!G)SwEjQn=-VAT&3J)tFR<))^lBo*&a#KVUnaP~a=mYmPNI?<7V1$Cp;-gkXb%N}!r;#~IALlOGsuC9oRB#UeI z_60^S@WXxLm_F%#FoZr-gcvoR5D^$i#lSE%IQZT_`u_cQ81<5z(@9^~*4#j70vqY@ z=idL97ocvn9o&$V=fF)i%eiIgfx&7&B&$P{*y9h_K+iCBlt||Xoa<>lB&e3HFp9-? z_wHTrMZv_^!(Q%SDbdu|?CkH?Q&#?k(8T_fFlWlWV(o4R4G$Zglu&#xGrjNBl_+Mq zL*aTStL8N#mX(815eTj*L=?$gzI<7>6Zn-++xqU^QQLS#RV{7p1L9-+rwV^x9$t$2 zd#{m_l8VcCcvKh-G)D5et{)aS6gi~SyRKzsmZrfDI(G*L0f0tEetop>gyivkz3O-R z-b88-o6}<7KP=MG)pg2?`ryHR;!8zJX~V-v;!|7|OXBl3UMLMj*JdTE>-qYylgmK6KrlKg z;^wqGZ!G?3_~9F`K(H^8^FQM*JvgZt^9H|ki9S+(FziMP+r#|)Uj%M6ODilYivHk1 zhxy^U+1XjFkP65JRo>*S(Fc7cv32@h-;ORXcL)1ej(@qkk5k?Z8x-}1*4UGBJm?YC z@#XWEFN z8x8Ho{nX_%o!l*#S&kjM$F_%zZ0%=JKk$W_&QeGTr$o|U4;~oz%{JLtVmW>6{gRxN z#6sh@`sb&x^SqIwVzbcN_O;rn=+Zl96|P)?aUnV~^0f1bB|tUgLsm`y8_zzNFw_tH zx(q~7j{F8~5t6KKvGu#&-f|EO1WN=w1*ITc=;+LhjM}rb1w`y3tfciQt;v$T;?MH( z%3ry{!O9xPmY@(U+WG9+GX&J(k&%|73pJ9X-CAsOS<~-KnofV0?LbICeSX1qSOx?} z)%*8^Q6=z}&KT5S7Wp%s5pSZE<>fPaQurK(`o)t>cS%S{h^#AKy&8kUCtkv5Y?J0| zcXw$?NiSH*^~D4J3kwU({q(f73zJ<|m|GMm4tMYNl{s1=^n#JIJIza2HXR*FIa!&R zAZyRTaj^XB2e`wZU3#8SfP35n{jbBq$% z>dznBTsw2{kl;#)i392?R~MHUFx^-Jmo8muWs8oAYCW-oqF1Zjb2DaEgV^4?dlJu?1Xzj&7M0V`v?5tV0QnYhT+QVm$`?=6g2PCjFL{mb@N5yeuv4IMF^nP~`(F0bX6039&O7 znFjK}?4Li$i#1(x)YKF;H|6%zpE{M&-rkOqx$W?+df6*iM($jRKXdXzkNW7=Htc?E zRY)OXaaF&WlVD#!_5@}S7vJ8rwtdGAHb~g($R z3q^})tD>TU!V`69SB_ru54NZD{Ew;jA3f>;s1_PZ?P6$gwf{mC+wR)cHyHeg6s$(ZTpF6fxH6 zv7hlSdyWl=$!+WDacg;bd127(^!)rh^JYQ>m3Ztt6OErU=jF9Sw2|#1#STmtF1(40 zivx%m+VtNTx=~W|T_s6tl1D|picXuq&){=^u(ODtPQW@>ELSU*4TwFs2BI!GJ2~-L z_4T0qIC*juj|J&x!8~c@srZZcXP>>7knkA+_zv?ZMFEGDtP&*{svL55Agy#RtCO(S z=ldn}D%@mAusQ6&I<>Zzf+v=h^&Mu60$+WWi_40z;wkrLhQg(DMJw*Jn7q zIyya|#X%A_xJNyIu0RqWaY)|m50*O&Sjd~uYYTI8=|FIzbU}b{g%1U5qO7zueAT3% zJ|JH1JB{Fca}qUPwueiAl2Ig7q$DFFBQ0$lBT%_K8olShNg2=d@A%M6Pf1(0u5dQi zoRqY53Lf=B#PJQ%Cklo8d%XXsFW6V>72P>f{>m%l`SYo+TJVim|M}WnJ+O?EC=EebYJ_8nB&qLmb#i(R z%>^hIZ2aBKjRd7GYqFE&9=e2WooC#DP%7ZD=9H_!zI;tiuHJKVRZqP3-nJb^ueT;g zYc9-rR+CLPIPsYs57GxfD`-t7_q~bP+0zL9`wtu#?|*R}BmqEQcZuDp*aHFlmY0;3 z?P>#=2*tzG2XSiII+|)~YSa78R{|O8`uAYr5kL&dX->{?5y+PQ0NuTBob3>3Azl>Z z<_2AN2B*Q^u(G;}s;(HiGOQ;w*&4Zncny#~J)-YaJ2C?TJ|W4_uxq^S&ASe7#{7sp z5QEFn*chqAL&8DyPve8xifZ?Xk5%5A`BwB)t+t_I=+_W2lM$v8>;F!7`c7ivL)6rt zyM*sfJ@WTI!ejI(Cgx~!QmPi|6MM{wE$I^%i1m+seQm6*QQyVaMxh zZsxjp(Y-zO+Q{_lER`!Cy;97p)koi%{LENTxu%+~9h)_~Q*7lXO_V!0kr&X<)Lc=V zmA9qhe!M21P)|V|K}r>Q{nz@BlD)x{qDlKE5CEHL5=FOhb8z_gk&lmzppI`(kfs!W zL;%IXyVdhC^fy|*fMx=d^eKwJ0mX`atpzn(OO}{ccf7j;{rUg%w{2IiQ?b2wj#+dfDY^1W&LR+wZ@vsWHJAfIP%1fP0E(Q_|9+r%K^U37&%k;;D(rWpPn$7(Ii2#z$ zhZA=VzvdZx1#YhW5DoK?kh${#vhwT8XkshBcj^r z87QgTR+9f{KS3QvfB5hLaXx;2(e;Hk6x}wb+NOT~Eb)vU;H9vg>e2`=cbKGk(Tn^E zm&xN8;ajQB)Jsb36#Hs!@^rYEYJ_ueawd1Z*(a`rggG?SR_b7Z3|- z!8?NpWW3A~$y25NYf0`XkF4m@aDvuQ+PxHR(ud-Z$q75B#7;WzmWvCD+qNSN3|lfu z6MUTxGkq7Ql_L|_^LLF~>}$w_&GzZ4(O%`PUD3 zgMhf;Jf8?i09L_mIXJA8CYOD3aFF1ux=5{43Q~gd@VQ3Fip=}L6cw6xn8URb_FBg* zAHf0q;+=1=vvPAGh};1N0_k*SIkXCsLAOPeN=r)4(n%bwH(Fx1{m~pd0}fS&dB0yZ zfDK%7dAYd*A$6}dGgIL>x}D@6x8va9!;`SA?f1>h$~vX+EHFI$qiSFYwapp-Ot*ig zGDx=Kr)yTm9f7EGx8+FECT26@;_e-F0%Fcd_j$fw{M_yC4_DrM>Sq6*c}X@r#@npm zJ#zMSdQ9Cb@|%7^;o+~5S2=Y{HMF$$J`{&i1N$LRUWBVHTdYm$w1>a(R~V?k!IZX) z?ltorzLDU4?YjhwCkzi{)el9&J#1`jj6^)~ttclXBm^l1X#*Zga5*foj_emh^qrr` zHu2J_skyOGMj9P;t5?aIGx{>2bGe4QBZG3}jpt@xYwLVQPDSv%`kwkW%k{ttrL?i* zfCQDuW63Eg5oJq-r7A*sp}~?$vZdG9ROZT34Px1nhQG1#e=$hCA0>II?hv=C&*#*~ z=Kd+~V{|*Yvu>1^zIqk75s@`7K)Tnbb~};h7X#KEl9!-Tn9Bw=b6P0%^!9?yT8E$s z{=KxUjLkVe&iWBM(X0=LH;))~D2;f+N9(J}G0&o+;B<9ycK-P_UwS!u*F(5n?}=KT z4c+!Ku7HZ3-+R?a?49+`G#BMyk~6Xb<`2(!98#UKOM3MmvdEsre+<)6|94!~d>O*q zs<<6mDDS1;40@n-f0t}7eeIG!V9uV$e{BghkKeyy&lnR)J>~uG%U_lnSKIfzOcSGZ z8}Xs#H+odTqtw6(g?>v-QMy=bwDpbHZ|G%P-*r4t_*>yoq2!_a@B5>NbD%cb{h&5J zq2r~#m`%9y=VRRL4QEOzCw%pdo@6!dJ@X^ls)A4efxLA2GnF=0kxKSkn~a`EQu#jj zQa$Ba^I9r**XrJXHR5K5lPm55@7?sIUY%Pp?js? z3cJlUi|+IWHWL0qOc#?>NLjb#dT-}9;!!&F&o5rU?cuQNpI;ooFMR&_#gP^jdt$My z3vNr?z>PWsz<9)DwA@f+S>(f66V(Zqjq_-q<+2Tx+_7fT2poz^O?~AWLKZxZNU#$n z^7V@AG!MMVT2zjaRm@8~!8_^Er5aPW&$6BN-Tkc28Voq;-o5Nln@BsBRy%ikUw&~c zYOmKjb&p5aB)rGib`(C@J{@vR3a*epi;Dt)LEPM9Jtem>fFm}bg&|RxiRr%n zGf+u#8SvqPLIu>8OUX)~1A|P67~!s4?|p1rbkR z^J@(N6vFZg$O=Vi8J17Ya5${^czLz+jAT)M9p*PL0O1XZ8?m$d{d)sob+5n=A0#hc zEJyi_omyntVgMTxd&8|;wC3^QDV9=3~ z-w^0;6k9WGArRz!yflG2fzfnsZVrQe*Ukyk%%OG&!k#rxO?%rgx|-0HnYfPu<+yph^*Za!Ez7AY;g}x+`*X=ip@pcszR#EW~$0Ex8$-O%($d1Z+p~9X zcZIv~`lDOIM}+K;dAXs>fUJt|c6WPiE$ivizG@n;Zf;}x@b>LZfO#}2qBQqk1!L2+z_fxqgg_ zjNv>t6VpIZzXuy9CoG=e1A1{C=hx78bd;2=acOuD900fvvMsHyrX(k$pouRoUP9@v z=QdXja5N?j9FemT6de5iitXA+IdSJ~PUZdNKUe3y^sk+Il)PPkHjL4r zJ&5{{eA+4{r!J&{j@CK0fq{Y*F~|10R1sR_L;Joc4+lY;P9XeT1}=;=Y% zE<<7lNEASUeeN6u85z=&0)qItb2rLe902`b)j~0%s-x4GXK8H>5wZ}5FRUB`L&H5x zSPQtXd^o!qiVyG>;Xt3bGRkmm4Gqw@kEntpBLz)A$Dt~cxhs}uh+47_(TvH<_$#go z5xr#|ADIFto1XKQzoBwRn8#`HT39`_3eAn-6`q-4q@v>X+*otjLqd3;_A@jS-aJok z<6fU)E;i&%p)lIR1bePKDlWXnL-7Hy9dN$S4L%GD>wwc>Zm=30wvv((7%eoD6c+wQ z$T)uD1VP5(;eoVq>(g@-io*WVfiGe|ttKOmhJ!+)?zFcKHxG?C!@Y-L~(Rl-JH6-Sy zX!RPKn+Y#prmx7*g&#=e_&4jHyf#rbgr48L9eWlWIJPqHsZ*y;oB&yR9A4{;x7<&* zsP`(oIf5Ws#=rz`!r=~n6rBp*7UnS7dIds*r4p}L|D)}#k7B~y$OuF;bN*pCb_L<5 zY{&znei(@q*a^BchNH}W99rc2UuCm1VkKM-=<$Jz5yc~#1_hJqfb;Lxxzhp8_%xFy0E zYTc_>ufo5oqs%u#^}i+)qq_;<>5%tObRlJ;)4&R;T|uD{C%bA#j3DfcwnGcu=6rJnui9*8~3Mf*D>>C`lx3Sv51b->CP>1^y zHh5TH)wMYqLStiRW@erm5i)6m1-0m{P`Ox?SW@HhPTk@g&}GVlNATDmCICVF5q2>SaHocwF~iY)Qro{4)4 zDH?o*F7X{Cd62V4m4F&UeYZK?uIK*^^&EYvm)A~j{k^25%Zl^ZVBY$9`T3Kj@(veI z;1QJw&m`syC&WV^pULs@)1`!;#@VBP`0ZvHh6sxwDCio{u*b%-$%@I_Fq-RtlHjH% z;ex`3FR>GbSb*6>h0xyC1{9WER^|%F5)G%0#vG+LCBu1ms9lwnm4R-u#ZwA&3*i;DZMX zp%Om!SJCcORTv<4ZojC~iAf+8)@*}rK;ok#y*QAF98z6eIXAeO= zyLt0i`3Q_2RN^2pKL#8rgVI>{6pRq#1*gwgv(KMDhq(v#6R0(hIaIWozI-_kI~E_` z0<29pz)B-Enwv2vqF}kigGC)jwsr5sq$I)f=dG;}b+FgjI1&l`4Gi{-Xd*JR=utKL z8>BB3qS+HKVZ_hDK``JzNrSJz7RnpE1P8f9Gt#yG4OU-t{E-tE_qMC+5TRhc_ns+a z+r7=)q9V_^!Ci|4aRK-=jHa~8@FHWL>Y$DpIr_Qdhy#UC5e3bfE32Mt3-r5zM4swG~igmgCKNSL9hsPz zP(a|q0QN&#sA@P_S&L!ofMY|*Wx=#A@|KCo`5chkqk=R5Azssu9y8dC+NnTKNpe z@JWQjv^Nj8`c!myeNqyo{vMS z?1haKNPw8w2RYK8_Uv)=wHx%G$)cg6nnj`NHq z%D2Xk((X1S%}ZOi4Sx0v`sTCfXzf@*sTT&cQuA3LI1#v^2FUJsl+080olW#ZDwD)Q z*nKUjZ9hO74g2u&V&otH1-d9sYKtmi^`eitb$!3N^Il5xBURkk$Xay|w`aWvpFPS=?d;F}{hml}VV#OHGB;_Hv0FMa)XA!hfI2e1|NMzQhwk)S zU05DiTB;d7&}R*435Jl4sPxyhE&4=6rlwmLeCxI606O+#V`H1c-gvAF@$lH9W4-kh zIGKM)p3W(h3mK}Fad9_cQ~*>U;EuwRnH(KIxdG|K2t!OA2MPfA0Z~t<4&-ldPY*~D z5++E!ru`M=u+8S?+T6T(6Al}74(OYo<1T^cKjtMVC53QuT~W~rq8=hjfq1nU*t0EjE z@HHgli~=anu6rKKrSt#7H79INQp|kX#J1ogbEk9S(g<=oP{0l9W>|9(=jlVt)0TF`(8Egs3Z&?A3+tA=(14~PVegtEWmGP7j zt-b;?WLE{FyVuR#-R2fzA}b+O z?j0H#Ny^GX5kSVs$OsKc>)DGJSs?Ik-TIh^I@=Xm%ng_|Y`T#^(MW87x*1{@DorS4 zd7)+~V`D|!qaq@H%*@0_MU_I6!;*%ALujst${uKW7bOke699{ z$Gdm`;EV~i>(^}|fx$mBHa@PZbsktB=6;A^Sx`3Np~it5sJaUB@>;vPQo7QALbm1P zyjovteS}jz1{KZZq$?QVC^BILapJ8vs^V@$qtGG>VYn)@XJJJm=yCu!4<1y3G$B}P z85#9#v~W5FG(p@9PUweTUQVvA@{xDJ)}c~a8c&IZ`3ZwgusncyD8wp4EJeW;VtEc8 zGj49Bybl1VZEbeItT>4Pl`0}O>iWZH4L+b0hNps!1N|ciK|LVXQG&OnG$Xfzh&#UD z7umc36e~6YsEC$T>-6^y#e>qz%gboVmbryBleRE#kt+Bf8jWTbGnXLtzyG60V_)-6 zE$-W`SH~npPWLj0tet1?c|sRbIyRoT>$ z>PJeGub!tK@YY8LE-UA;a4RV|0pO*RXK^w?Y1`ewR}b-p)@#TwTecf zyB|gY4e(0bOL7!!GXK&YvN>^U)yr+P(|d56&v9E)Q5YfT#@*kNywZsYId|*F2Okhp zG0E0bamX0rHCv&c;F*_TC?~9LA0Hne0ssde0#yDtF&GzFV6VYCKrcGDmP+}w*vLrDF5O^3KbJ9# z7!l$8q_{>jn1M&Y7hK+mVHHb*1QxmFDI^yt6)1f~Ag_P^th8lH!63ml4EuX{VBlMB z1!U7Kklut`k4h|8-uP^C`p5kz&fWc9R3AkWlHUKd50iz0m=PKk=@1(-ozK;I+@6WqJ7B)ou# zk293EdU(X+;m%t23IxNbh~R_$i=#u_x}WozUB|#67>-$Z>whq?@u4^pBjSEW^MBS) z?Lb&iu(n@X)~oot+?oaIfJxNI$Owa!n4DbyysYsSpuE$2&YeVY6mZwAuB@~cT%tfJ z@YLU*uuM#1-2u)2#BQ!hOGrGR3jRCStUZN06f}XHoG^QXZ4SCSi@OYRpH+PR{250} zg*;CL)CF=tZKWJ^T)B zc?)-Lccf11C=Q?C)v%YptZ~_H*S;37Fy`K-{Sq@e++u>PDO6N@0+-j%7WHHf=IW0| zS=?x@d^WjMQW0xm*}qzTYcycUQM0O?f|TfO!tpvHv7*|#x=3#Q_rQMkwtT|EWtbYY z34Exo-opfq^URquAe?ci4y+Zhy8?+kq(XiNM+FWP8v|(zdXUAPJAGiuZrtcgh{1tB z0(^W0C|nWE!4Ci;eEgXF>omj|$aH9{=cm7N{dy}fHTcG(8vpSq_om0seKdvn5Di+R zIOl;2z1P;(=i!+H^@gSbbbf$kJ96N_39m;10dOOa13&$Z*ytGNs1I-{H0-0M`SbSTiMxp-)M^3>ywy>aZ^(qdsf=AW!Ci$WeI}y=SxzbI; zCMV0_4_^k~6)T1&CPeFgq^0l8a$>7vyvSp0uSY@sb=N59n21uta|pma{>(dwge0D9 zBNDTsKHtQA;PLbK4?fw%vidU10<$b`o-?v%?33fE5p_&{GTm_hcv;+A`QSa5`#3)f zP9IwN@9I~qv1EeVp*7_sbbBKs%YJO26M zBH@Sj0>NZN_N4ETAbKC;p?YChKE}_lnslA66l@LkBf`&Exw&D{YQlVceu$*N$4o~w zcH{p2`vAAz*;xBY*S;$b*LofI^dJ$caev8d-*%7IZ8<^upJ#vj99JhI8j=VmP%k&# zWDuf>h@Md5agc!Km{3;{5pj#)s`&co!@Pr42O6@maZ-H7=M3T-d3yr(Ag1HfPkgho zvh1~i2~b(!&>=#%&+63R%#0__TX^vtAzw2%5nVv@b9cEoIKr6IKwO`y4vmPw8BJ|p zzkY3PZT}TDIG=UB0tSS}WiQ;urYrw-Fu1+PZFPno0nzECK?K;7+lcbpVp%yE8u7o%}l2@B}hPS)^EM(i0Ct+b> zcvO5L0uWkNtY<+7Wa);*#^Tfjz#LcfVk2cRNrD4VRVBE`kyH?6SY*xb-08f-uzx?H z%@B+WT)?1f2$VELM)N`!oP-2=0c|aw<4FFza9WF6M}rx|338sEo=lSP)Dnlpsx!+*NM2VFte~Uy%1i!K}@Jp zU%v*+^9-M)&oz&hN z2`!Dd42l_?yfWTfwpdQ_4U`=G#&B&SYp(ya^7MQ9bmom(a3V4^4hQiB=q1qYfZQ4y zUw{<6s9tcD0P~^-$2j8)`LLOSZOg!6__tUjc|+W~{)>@2>mzP+)(c9Bjm>1{6NS`Uch z^c)ByKl_83QSE^!dKnk@{r+llVj`G-cAetSJw0oYCNY{Q)lqww;bk|%)Ncp^48q6( zoH6Y=OyDF)T5t#&4#jfDa&gS`fBF;_D|bXzoDtAr{u}>4lik_W^b=2m^oHY4ah%3!TE_$mH3*GZ@HPPazz&o>yAU)OWp@X@KwAb5X@N&Jzo8I3m=K|!Js}-~ zS`90&{CB4|bSWxvEEMdu46D`e4=8bR+>BlLr)CSxW6qEjSg@ar_#;y*E6`79YWc3c!%iJ%Y1CK;=0U=>l_ca9kl_k`2DQ1C<4nWR0|* zkmp3XVRX%Bkk-(M0wU0+@*pF_B7(Hg(-T_%SoOAdzvPCYO5 zq5>U*=AApHrk^VoAmcCgIyN*ko$OXS`=r{v0y_s*4L+J zW$ES`RD;M^st3q7LRhYq!6`5xj|yUSJdgc<&b~tjH4%qgw4I%oQ6eD{fn#s&?nYHv z1a%l52Zs`+va*K{tJ!kiwBpUXZn$0{v58F&=h6c`-GrVK_k|YemX?+m79@N2*f=^; zl9CFekOYGRW<>;K3R1DFv$I3RaA_${c4C82<}Vcz8VU%X23SBGAPZj-LM4%t~++kiS$u9`@3M-S7$Hq?QwB&X{AlcQ=RQ z2r%V@7E_aJAh`;pW55H$-7OS5IZfP$HNr=K<<6by%~j9M98k?LkZod-cYh;n#uwbn zb2W^>Cg{3CiwCx3gsK^v^N_y)!I#wAi!kc6s02l|DdyrgbO`nIya6JF*#j7^BYUEF z7^@biK7u7iJ2V;w1ciiLFesD^2k<^1%gahi(p1u6_JB=x_-yH(i-xl!Pmf0OlyVV2 zp86}XWJY=DALt=89l~j1sPKmd!5)W9i2?B<1;tx9?|d^!{^(tVsEbkkSOo)X9_a<$ z-L!otE~*eR@TK5wWC64Q^s}`8fkkA4hX)31Hgn{?_YLS;v95)%c`nq3wzvx_86Bc_ zlI4l7{kBW!6t>0HWMshU!XELD4;{<5on4xjeyTv%8?oc^-TNsGL_0{gpvWs5_W}?_ zZ@(is4D7=KCOUc$ab*_)cDy|S0APFR83D&TG1G}j5nu@sr7u>vJo*dF&C}(QcDJ4!h*eoI<9d{Z||BfL!{DhGv%cpz+zr^=&2rX{l~*2 zJ>ydU4usgki_csq0XY^j8u`Ve_%rcY-_7Y0r{@e+KbQEFC=T0kVO*xBo`;6=A^1vk z9haUT58Y$%pXOsb%I2f*z;PTuejE$`&X_oXN;pwR7>|4Jf{chRP!Pt0n?0E9UX3JSJa$V4Z<}2rjK}}z?#$zAUf+Jd*d$~Zie$(l zQ)nP_iiIediK0m)nKq(G%2viQgvyXgLdsldZW|IA5*ZqVM21wRLc@9AW$(@2p65L0 zdCvLg^m_e%FPmDe_5FVD`@XKvbR~~hF29_?Ro5i>K{zt`0^?yS5bZpaJo?pI9%2Y$4QIC}Ibdc(||oXA@%pBWhh_8O{?SaG}K zB%`u|A=@p-KkjtZv%{j6h5N4WFr}HLV}$-ux3_z{!YKL2vJOnGQ}-S{c4~yvYez** z_B{wBI;bz}-yCgk!tyfGn4I6v=yx9-NJ)Qgy)m9`0mYbvtvr}OzZ)CQMfM2dR;vb4 zSrAw-xB8xg9!xesPIDPaPzve>If%WFnX#2Guexi3YKn7=PzAjBsi~?sCQQN*OIX<1 zg)UzkS0-{ojvn2#VZ#HAeM%j$A(F#`5|!-$cjlKwai!fyQb>-Y>jzn)qV-hb$VK>G z3m1bSaSXC(P*2Q3-S#WI^=L)~T@}$jB@cGqREhx)J4{l;9@feA^r-h2j zu7H64xRwx2ICk`@Jtm=7`L|CfH2d}KyZp0CClwVHnvJ&F0RAO9U;S!N?@Y&{Gysql zuCC7cDik;R^2TyHCT#4WhvN8hb}oDWzPb1e_`T3Tq0Me6g#wGsxt*H}Vv>+Qn@fOZ zBH-Lh{42$Yq+#f!UV-~OHL7eM|>#Q;HyL|#|=s_Vke?H7>1lgB9J~V7SyLTt5 z1EFDNegSViM?6>&TtNSt4&Y3F7%U5aK74o%0uvC`)vK#=U1MTnMLx2Y7HUM28nrYu zo*8__AEnLV53mUD$W0pz7EeGO9}626ec^`{r`R5x$3Nccc8$Jgl*+&|owALmaz>|2 zoKt37PvM8n_WHjX9DX*roW_hVRdpILzW(do5#O9#UfZ&m`f3dG=fB%)vvI!FQ}YQK z&3|ocE4sj+Z*u(g_nj91`9FLk-+zkJR8@$!<`!y7k{!f9l*dre=+4d1;It>kf;Iwm zP?7GhwJlrB`W&1(Q@%J8m*(QVqpnBktGR{TH=Tvhx%>MqdIWA<^~klD+LVfru&q^y zMOepMo%SIN9hoHx5AFC8*_AXPFT;$t5}P+-cYj=pFfQTUweISxN`|6DB3eg(@L)=L zH-Kcyfe+v=vJL<2n$&#Y@W%TdeE!_Ns3}A@39IVu+F4DRqSCZ!NZ>6%9iS~ThZ2Yf zPiVHCKaA{>rE#ZVi{er}iOxXLytd0jBhp$;&59@VX5*lhufnO0i}I4Hab>{<(F{;= z3z-W^uf-o9KjgS4E`b_I53Mat8lFcEGK93OL`q-6Jqm3%y zDwS?M)SNpC>X$(!1HKaXQdyF|26Q1gzxANy0+c2qO?6xU9#R#p`E@9eKzM6 z;t51~(1Kifs5{ytk=yk2@@7shXvptDE%~Cw2SP(3rQn6+s4)=>^D^mBqfnesEjT9? zCmH(>GWc|RwWvP^Z+p91zvV!wv3JjQ-d~3s7apo}^|uoCKIAa{aHkJzd0=W=#nic! z&rbUGoiDZ&f6%db%iwR{$Huxb zE=a4n?8xM!z}gUvTiWgJ@hD_TaH>|#%`DW)QoXn+O;Y%)Sd!^IH|R=YsWoXL+Ud#- zai$WJNZNKxk);13_TBVOGZiG2g*Drb#}Zx>z6dGPu$Fa)e6Fb!V{I2K7~@?hxSx2n z;MO2smsBMyLz9D2w>KP7RiWgxrS=;AQ25r89|FnxbAOG&J>vV}LRQwmL4&f>{lWH2 zsOXaSnRb0=JG?OGVosNpasC>{OO`JmYhv&LoM(oWQm)%EJt zQxb*Eg!We@<^4Q)pEkq&^%lNtFmuC?r{k)zaykaY zgJdkAI^p;y|6wM-)NOfbP5GFUaIZznmZN>|V(V;jnbX0kv9E$nB*3gYWe`LscMMlx z5+Fp`!}Es@87=bSEfm(FYB6I8m6ntgvIC=-#+wMk5uHY$J?Ty&aNjJVW5`t>)6;SkCy{k)JY zjGtPQ#h*`11Lly*%1XLRgwtV`(Tnqq0Gz1JIH9O>u1fst@kpkZx3Ev1_OUpx+CQlx zOzG*=q%Tu|m-f4TdI)X>RQV<+W-0PsZWPzW2@ywI>&e120TZ>wpJJ)GjOdnzQlR?i z##C?FSy>;PJ8`A9ZUNL?)Au->bC*90N5?r9l#NlXS^1URfl%(F-4(P0zmhTlaJ5pK z2l?@wCog*?Pvarn#WCXNCt{L-M{o(1U)EkdVd~U5vu76+79P3nKp8HYnv9GNo+tm> za~n1ckBG=d2tn-u4K_7$TFAt31-EYE9eIm;hZhW(6^LpPeFC6QP1|vuHvQJETOc!J zY_ZuwWI%Dr6Fr!KHHvNv928~<9%|&sE94!Qm%A`%VVE_;Ws*Bi`mrK3ecNgGPU#$l z?LT(L|K1>YOaC8Lf{#N;hMR0=rWVUZsiH-f%sLz&zY3U{ZGihoKUN(7ek`};)&QGP zqf)sAgS6)^Tk zRSxum0+k4(`IuxAT%9m5*P&I%>J!*S8mH5msEZMcY=b9_Hk<`Lnb< zg~m#HiJuArsK>v72FncvOxp(DTeqs~*mzJ;jAS7=wQLgGz;5&UKVVk|zIje4i9Qw$ zp2dpyLDlmKmYl|OybOOFNiJMpB<=KRtSAaY=_N`*kSeYxH7{~1w}NXbRF0P}T>_y7 zS(lemFWvvFOnIg(gIL9jOu;BG-M`{FA!>3yMw2E_o@HyxEwOf}79j(0s)uenQ0QPb zIC`5zUPnl9B5;Y!c$YcVn#uqQ&1kw28wUM4`x^TJrize=IxE^gGWiZ5Vi{};1mb1^ zz9=Xd6F6|nF*AfY(ZRt() z$#s5_b6RnLdbgUbU0GJ~YHAYn$o(_73|zTU?5vRWsAt4(k0fT{{P}ks^a9IbfihpL z#S3pL&ox|Rn&UutBu!f}ToP;tx9!Q}$09!?Z$4Seqfp&5TZyU!lM@0?`D&Q#5VFR?`-> zK&&`!f?cm)mlQ6nEsDj9)D*=|EiWi|ybVom@SMs|v7_vThA}p-Ox%_VToR{2Rc9Pd zm#dEu)pgerU%uyDFL(%Pxz0`HgQa=j(# zQc-CawxDpXp_nC3TUCDvj-v*Zcx-8ES5vF;@6B}OJXY7h8j>LcCTog&ZDSK0(zs6W zsu}<#_vG2LovGVf*VOHVNI6luC;VS#o;j_i{>eQ{Jl4x#tcS=;DdIGYiRlJgd=+=eLA+VndU_~e6ffRh9?LNOKsVQdn z8QhYWY!&2xa`mY*XR--}y^6rIvZ4!Tx92_&p<}NM^S5$bu;2&O_TR*^d7y%}q|jF`ckQXm7a!L)mu0Og zfP~iTj}m9_)6Lq6CrJp$$pB5`>KcbeyQTFisV9r8tET4ZlP3{%Y4cBTdjN=rU*DYJ z8p}%^=gni=K+yH-_3J)rH(0B<1pxPW@@U?9e>nBt_7B8{1_|-07>U&J>E~`j#vM2y ziEeP#w<{QzpEl^1=lwQiKu5#v1ve6W2_Um_!U%j>MptDG?Vq>!&K8(q?Jvr5CMFDOp zPz01v&1C4Qeufi$odI_)xNyGCp0xtlhl1uhc`1RYRo+jk0v}`MQj`Nd&%WjFy0mYf zO!^K4=w79n@VuOHn!8L~j}QnmMIK$Iyz~;8_!`D5-(Bs3>N<|_k!nV@J^PT|&@&t|PN07ya~E?MWN8RWPjHkyP!Q!Y`~{O7)5yqh z3Jq+1`*)i+jND#8!w zH$nK(UqCcaDl8Z*+raa5@Sp|^BJCP~-ZG3((#BHWoTpNjUYOg%M~_wq&EzPIa_5u? z1tMI!;GabFi!N^^LprZii>2Uq(gwpr@I+RZ?x!XV8)6i?Nw19$G>V!6BkY7YM(J_z zYW3?kbz`@2 zq9U*?^Yrba>Ph0kmTfqB@+3z-mzsno^UR_GaA;gg59GiB9+cz;Spq3J#*X4tgZpfyvnBk995vNYANCg@fMTtbYU`~qa zG43C0!g+O+>CevOEhp5P%WxJUh=A#Uc)j$;A5XZah_0O$FD`xm9w)97*z&Ob1GzoD zdYyjn%V*iDZkX6{HJ;?|AP4V5XP1?Yx;*?ZCV@P2WG57dQ83#ZH$G&T%CTcb!}d3o zd>Ho1C8cF-r|&SgWeThPb&YJ@NSSbdee9g~+j-kptPQB;eCrB?wyWn@d%I_E=$yDs z;s`<3(ZsT`M77;G|2mSLLrQgxtCCts0)FLm z9wMc_u$d^3>Vo#yB_1zpuDTbDXXoEJ`o^mPGX~TZ-?#<@fVOOk<}S{8DhBa)y8(yU zc#-Fcsw{ZAIN&y^sHz6+-@g!IL6R$5W4OIz^Gy|>rG;(EHu|QI`4>>e+WJ9V=CQCJ z)4*U#hRppNbo=XP>kPrWlS@J*sZ9io==8+B>V-Ru6z45GAiS zbiEQnYlYe;Vq&->1GWG3Y3!&`N;1#&>!(hcGGh4f`EWIFLo44pCw;9fc6Wc75f(QU#*cS% z?dHveScq8X(6xbzQzlL7jgf?INjzTk6&oC7D@sHMjihxEa!)Abe5J@O!4di?qx9i^ud zzs1de9>w+BSFhBXH|L4*#R2j5?S4PMznasPWuMR-l`~%A5D{6$#d%p-^sDIqPcy}c zzLsQUJG=L{N20?ro}7?gTcjW)w0JlC3W@cWIL!=9;n3kHwOi_{0~%O z>MlnpkwK_PLBctR>k%VR1~=iSoO9ulvakD`V2^%KpzR7i11W^fvUO~u0Kfg~(DzAF zp#nB5iGdh`l2v-j!x8wY<5%|5YEBN$b8);nMla8=C6NtF0=Q=Q7Rql`SKQjRZQB;F zf2h9Ut#xU5d)In?ZIQl>6cytbdJ`h0Ollw2XeUpTO==_oBaGq&e=5c zs6joId^K{bPvWUFXWAEV(CgQ)qep)!D?Z^CIr{Z__0_*ETjusSL|ZpjtSF#9hiU-0P*cN>;Rr*tF)--1+oD5JG zoYU2x9evZJBK!b!!!0q#RKE0WT=CJ&S1>n@)}pvSdGa?FI#dr}5o>NAF%rKhsx)gh zkz7Phc#b;m%Kkp!$_7Lt5F_87 zw-&8UjVKyfUtbC$5zt)2PqpN3J4O!#cONj|;qBYHV5>wsF+>+$i`N8nLHvRAn@XL1 z$+F!mt1e#0mF$E2WhCtHaQT+TcPFH7xyK*5rR{?#xg8x}QOMRW9>0R-v*sc2*rMC} zm%%l=>cW1rQkB^I-8xhnq#~{b$6Mtlv{`=SoZA+PQEo; zkWOp%ix!y{4|J-zUGSX$uC7VqvCx@(+;7LD@Xt4(;7VUc0M9BVc*LXf`?E+ z0jnVI9?}o7zeHkrIy!pS!q*Sa5FU{Yp+Hq0_M%rs&5?Kb#g4k^U26LBQ#@q?Vv58! zT0y6Pkl1eU{qd6~g}&%rH@$bw_vj-3!xz98d?bYVpxS5`4cT_7BzIjubBmJc{}Xi zl`KbLFn|5}>+`*f8cCs|@&K0j;A~s3iYL}76o7Z|tQwr~4`l>_N7)c9fS-gR1(DMY ze476OzA2QW+01kp0E{KQ#P~r9q_@i+XgO2pvu}I@T%Z`gE^=eGL7r-=Kjt;%M;Lj~_m)qJ#v$l6n$9)=gWR7t6ZA4J;@svgBBL z`}WbPVi>YwgWyljITaupjX`paiOYl8>?i=# zVwEO|*!KUOi1r5gY1G_ydE{A2J-;#dQ{u*dEv?jY*6!A=6*eaHKd@p<(Ll-@R{3tW zvG0dfnUW7sHInhcY$K>k?ClhUPG`UX5rRa;^B=ShEv;NaVq?FAZZ)9E7dq4$JfQI3 z6#d(1*PrQ5ef|azZ=dWa3H~Y;wh5}#-b_Ja&sB|8l9zg(I8iKe$=oY@U2MDjPc6Vl zh9v!*XGe^6lW2vpV}%iswL$uVmM5szBcfMPafOEFBak6l!BffdZM&vTb#Z5b;6joB z>QlGDrZtlO&E@}MZRoME<6L!pubalr>^3*}M!N?#sD7(D%-WkrB^4aXzvp!OLRoO{ ziuYarEO85Lu%MUyMFIg8R9IABs;tPpbw3$FFxk9 zzr8ByJ(bIw4?sv6r2hL4yL-3LuL9+)DaQU=nkX9?^m3T{xtW(YT`{nzCAF4KYv-~4 z{+)D$^pe6%3KDCVCth3pc@X;A=t|nP79B@&)B_MWCxXn2@q2vR+8pLsfDfVCM=Hc) zLe)~0FY47KCq(p1m%iq)A~}VWE!QipsM0`?i45$` z@rUKi`O%6Ow1aI1IvuHE-3!VqIjiRZFopQUsKMc<)giBOau&U=Ct$a;uil`D^L|Hb=-k!3cjF~qgc!p&| zlIV)E5Y{GgDbgCt5F3#_NIny04e)M$@^+sb9jL}-MdrQn=$>cFkR}lwed4ep}6Q&SOa$l`28h%`no6{fW0+sgX*oBs*rtHrkVrK_FVtl{9FWcjHeaemSZnb4}sZ z*rT597zd=bYv)dm0NAX588*Pi;i*X>oFE;J5dl{Y@CR)#?IY3T(4L$+=_JfB>iM;c zhfNftXdNcnu44g6Ow(M86P!QwEqZU^%zbX_K8Sgf)c_GA!E8s2AlYZ+l`I$}d8yHs zHZj2dMA1M-13y6TY2BK)Xpy!j83xT|A6{jSj!P$*nv4~mDQ<3{qAQ~`@ISLF^UXA! zJeKGl8%w_x@qc1uhI90SHEOk6zArsni6dNx>}aiVIcVez7Z0*@FqG@)c_chM=DwJo zPJ%&OZ9IRTN`K);f4djpl+?oy0+l!$ya9=V9n}<;Ji*{$gB6f)MMYG7F5=x>#>a+1 zXpJ1$a_6z{E9);qgpKUbaU8-_x*P#$M@0T4Q?>8=VeZBx`$gQ5tSq+JGDcrFk`e<7 zgoFf#j*a^bv_M2&yKs+xi@Jo6tC>uJT+{Hw`&T02k80lQKR9BpBrWMW0qS|$w195k zuF5jdE7~5MH_lE@1k(P7uPfm!7Sh3#6~Lo`ftV3zj2gvYkq#YZ(mS#*@fpDQi1ZQ} z0tf4|hy0{!o;MZmKwK?@p5^~@Nou>Y*pO+Ro7o?{IqrAadX0^zF0cK*dS!oG+0l67 z3;(|uB9%r(wUCEL-EOPxYaTaA*Bz%Xde=R?8>VNHOO4mC2K>pu3IUpGhnjsz;?6Sl zZdGyFmgRYRE~(YfTJ^-BfqEGXv)c*bG+^`Vx&woz;fE9Yq6P!^+1b{v zp4dYq&RNs$+i zBbiDFvko=4tC!^c(5<{_*T2z%v>*JJeCrP?3)KXutJbmgBp!*~O4baZGQPOs+ow); zE0NRv+qwDApZun-^;kH;%F2K_LJSHbr5lMP`|ROk$8MyL0E7#zDbBjyp`0WaW#^tf zM5z)1m*jB!0G}WOU9fNe{)eS&Yul#qSo!5*bj!$V!4??jM`ZMC@*!g-dEb z<4Pvg{9UI?3YUXZ2OzIP!C*FdvQz2P5mahuZnvzzHqgO6ya?i5DB>FnwA?HrZpJh$ zp;lJM6N}a=8c^f3<;IY=!U;@(2Lv`yfR~ab-t(?<#zyX(MdUg%Ql^GFjl;Orf6yQd z%?{Sg`xYk}M;p{0<3*awmSjyrIDqU6WCX2X?R=_WH9l2Ki@&| z93@G4VtV^}?}tJ*4bU0-b?#Kj_;@B+@$&!*{BFk0KcW7E-Ds`vauN$1%oi;P9y59; z=c24#=-_h`f5MC}u|)#HCeB`oF%t9uD>Z-qS(QA-zj2enWDw=v4t8~FmyP}L$YjlR zZJqP&$2W^zv7R;y+yLeqjUAzkbD(OVT(YL%tZ$>|uno~IMkDKk^Sm-y1wxvRfJAb}{DR=^8(o?&E{H^Hu^FtHE8FR7nS!&ZFKT9po zp?|Mf58nIzvfi)t+DgC10_D`e*R)@U6p6=b zg;u>Tr6XDUFlNmi(_Z-gY83U7D*ty?bKJ)bYZ*K%Yrt+6Z`{;w#bYnzPk1&gqVwh- zEJn|&uim^fJD1v2fZ}ZLAPejshIE42oq$rOeq2#fWc!E#-)$L_9MgY0~( z{r^%p+&r@5dS$D*4-MBhv^u@&``27^>#D@)>b-krvBx0cSQ7;4#$ase7kKQpOEk3{BoGRJBP+FGBTIi5SCWV6Qb8>P{00|AcKV1*p*oE@dSvR zJOAmA+)}h|9VmOv-8~c`PQH==)Nxd2UP{mvBKqgRh|SDw)%G0q7p|=|^Djq2HA+4@ z7XKdR9Xy3vf-xZQ_|$Od`bnJZ>gn=)_Z$)D;`ViU_wEsK=h&3u^WRwR7s2aa+Omdh zV)2-rLWegA%@z!YmD|TDsBGv(A`rdHHh@K9V~DmmmivY+hlb`G?)<_?&ve0;2Vi2yPdOH=Bu*yIa-1sPIp`hpXtMxhE%VS_C zjnEc1#P|berEa6(RUfoG((XxZ&HD;#Wtks};`8GDhwVMCjMR0Z5JInnGzI=dJGf!< z=H@a+hE16~`BF*>+lb$;U0^y_Qc@@Y#DGMs2+)V**FrFj51%Y5U+5^ruI$>FzNs4K z+}M*@;O86^m3F4EGNTSe97vwYHd-U-LSq0JU;?0b7ITIudk%1Wm@eLbiKFM$w98C2Bnp~ zZ+ShDGq<=naCh0cLGJ~1vEk2=8A|FRC5W%~1|mFZfF_Sjy(uj~*Vr65xn&^q}3&=k}8^V^#b^M7^O?~D4C?mFESbRxXcqcolz9j^CE{^w>t~$4S&8)$eM_XnWy05_rpMu*egDiW?|L@=b2s+n2@q3 z+g|_4NCqA+yuP=eu#JOV5GEwJ3TQGkzc;=dI9BJm&Ano{d#YUeI={364i!Uh)G?Qfm?Q7oh4Ln z$nN<{O`Udj{_X)*QBzK>Ykr{cxlPaDkPzvhL9RHQdZb}uA`N`X)Tu%I94=9CGZKXS zhiAynI4!pO7_w-E-)y8l@=`8Kg%8Im?Mi3qEDDn^W)3Ggon@mO9W~E|;Z+uFZKBnS zrC$DeyC5)|%XXR+&~c?M=%J;>Wm}jNv<@L&M^AttE~XIHv6KYJrfUVkQt+FGTjPoA8j!l*L- z1V3pK=Bsp?8Kyguj%1$BYJQ;fQlAF%u0IR0HDAsh_1p%iFNUvWyHNMTl{A$d8W%M7 z93mDa8PH1;myInh2K8z+?nG78b+=xPyq@BA>nOc+vUp3AVM(J3-1on#;YaP}9FA-5 z$wdKClcl29f^bM#pn$LYjC~X7EJ}i&_nKwfY?n4TYYP=d%cSo1VLQAKkl)LpX8qr! zJ-3^c2bQ$8&4712g&>%H=M8FNb7Mj85XvUl2_M@4J}infKX>0EU`wk0qM{<$)gBLI zdp!pP^r0=XjB?nHDglXN-pbcK7se$eRkPqI`~8TWnJ~fjj~1J}F0ZR!c@4dfPd2j| zcW}DubnTjoofvN$?J+k$CzM(8w4x#uA}wvSmOr7;LHkoY?=o!pL}8(WY}E4QeJ|=D z%#r#WkB>Zl9E5(d=B{45BZZ{Q+?=F_FvYn$k@10wfmH4=31fjG_owoi(OU!=;`yF7 zjlQQ~$!8We6n(PJbr81C#}XFjuL}&!1;9HT=8x8+&)E-{mPl?+`kGtJ5SEAq4h}*$ z$1CBmuMII-Qu27H#hZk(N2866rJkny^>^C_K$xtVQ1bpg$fhfaA<$faM936DyvT6v zk0+0IABi8ik1&ajD<=6J(0!(6edjZy5Z2k!qb@UJ0Iu2>ul1XxDK)UkVyZxGW<7?0?+S*L*s(KD-~hVob$ zRh(v{VE4t(D)tj`-)Ew(_g7nR=4!_j@>mGQ-sbBILak<~)~s1Cw%D>f_oT$c{n|St!HvB8JIi@=`Webg7C|gbNle%46502ESbwbqu@`H6iIrw{G0vQ->pS1uUh? z@w$5wi95ct-)$7;W03;9Zz^Hd598sM(dRQ=g9+d4q%#gf!6Z}H$q7K37Pn|DNBFjtBd5-xc zBnt3q0EUd{Sc%A}b6R0!UknCH&04kkjA*6uiK07DyN#+nZj&BqnAjbt*FCp^LX#g5 z9~*07qs&huUZ55fKxl?m5&kVoQb;6P1&UeJ5szH*eL$MbUpxqAe|z5~CMC}^iov8B9bzxjnUi2h}_Noq!Gr(;_EJ@3C|@3J1Hqi7SdH)`*8iJtsMfl_i3+W z^mgW$Usa_w`(chZG89=Vu*o#Puq#h#=1UqE#>bkbCPudG{&Hf1YP!92s(-^b+0TzZ zo@xGxa4xAQ!lN-Z5vHr-n?2||eelfmaa%aqx}J=SDqCCUMKq%tWLS1aI#klI9#F4v zM@pKrS-{1-%aoBra({!E6S?$JiI#D04?cIt)Kh@~`j_%zf7wt`JQTWaQLg3J~ z>th10Iz-(t+p5a$-o;ZsspY6ShJ~(Hq7avtLdzdgE!NlNryC}gGOfhW$4b6R(+ynM-|&Vf6| zNh5W4%r({Ag~6Rv+}~$E~hcA?W4-M*=)qagIx7)I6b~+@NC-JUPAoKh$>9)C0!ggi`skVU4CG;`)azjZTTGG8+)IBp;6kbX?4Dy{>>~SY^84S z4X5}%FG2n)d9U;++H3%Eb45LVbjI*;K8q+K9$Lffpug{&U45B+`ylw zk6x^5i6^3VA=_)+@=)n&bjKn|%qoG=1WR7s?Ix42mRZSCTQ7?LquQB&L>}@Wenszu z8(SW2GC5J0DGQ(c91Qi@GvYv4)D__F05qbs$K8WOCjmLsXMCM~`(n;;nADKO1VY;#^YY0;1^j zv@X2N@eeVkAQ`x*yv2iaAQuG-=P&*3xA9$-IlA~%st~)a@;r0~X4^-MQ~>rsstg6S z&Anqe$Ues3tJ+4|rp+=G)jZ=FqZWYE)?mfEOQ-=ke>Hah zdlu%P+vgzPPAW=xaHsWw4{In&29vv%telyWB7 zB$M5M&jxDbO#Ug>K<3%JryP-uqBA2$KI^=G^}@0EA$>;9ebqUBUFX|%+2opLh!|S? zS+lSi@2Fb1owOBh2ic7m6B7??KXaycwKWb$iV#4c3f$(CGhLt z4!fg%H$djX{2F>YKo(*C0E#AK_e4S#Ap>6P*5Tt2W;Wyv0e$9~QGmgdgQo?hXm^QM zj4@lRcIEO>y>?4JbR6e4n7l?XDl!GlW0uUew?Fjh0%y0AeR9ai2)J#fI-#RdJ({+Y z&v!m$Cc=8S(Vac%8fWB(fHxH>=c$zg3BkZ;u?!p$A^xmc8q$M6{Onv@ z+RZ*bVP#kLYBXxGen7x3&(2-D9-*m;jP!n_6B=^h!0&N=yd3wH{I_o|AR6hF{G#P}FRafq}d z0|gTl@ENU((mOw{;3)ZrV7`11h9r(&WI8_sfN*v%b5=_JdKy*UB;iQ6j$JztX0dU2 zFA8nmAWLk~gOf~kOvItX{{wHujMeGf$ZU(Dm>GXYy{bzKpNq$A5g=eUpN9^a!sX@V zI~E9_OWeiG_^F?H^6QS=UQ#D?$BhQ}+mLl)HFatkDNSLCTdJP!PwCbF#_f65atTrU z6QiGWl&kDv{@CJ~+&*_N@${>bm&fwUP(XjEsiAQRdVv8B0=45Qc$sO^Q@#F~3vI4H z4GGD`Ho2y=I^laGD4h0OZ=MACc);rMQR8 z4tIF#-MV&i?jgyYnZB7BpjJ51jSE|_h|1KFbAt(u)iV#$Xi&GOT)I?&%KAlLKY#z` zb<~G9!39FX6IZ~sqWl!hF;vvjP5`94OlC8301Y&%2fcO)E8cgOdRkdUhGjtk&SkH_ zW}p>UL|bFqbbMx|Lm}M&0=7FcwXcU2woY zW6LR`t&TpS$q2PHBpK+zmrf@UFmT^K_^tX|Iz0KssLPIe=b|f>2j_|*oMW|nJRv<# z1gUekrXyD-x$~3Bhb;f0+Q$wrT2Q`07f~LKb^ls{pHEVShUaguOPbkM+9ahIR&pX z^D+_HFj@2-^fCT7$8P(!Z~x=;8w%otdH1!VEynZ{IsME|h1VwtF@JT#<1vn0KcPK5 zb0%iG83rddU|#BFS^0-~!&jbat{ba(Y+uT@j-Kh(b@F1Db?=F0vg5OhiZU@=uJH1m zoTYnr?AitFF|zs*iAJK;B@zePc}?i36LmrZjen2OwV9ty7&EtuW2v?KGckt`VFfm! z*KH&_OWaz0$TazKZ{1c^`i~D|3y@Fp6lG-Z4Ce{t=WrSM+o}#6#~HCM@IECP3ZzQiN!Q@X4A~ z9H&*@XusAhY00qoP2S$h)7E}ckrd}8jVoT~P3J^srRSg|)u0GIe(;Z7lOr-eY)av1 zqh*^jYZk>6?O|HMJ5+-fJu5rMUY$J{tk5(rFlnagQiJlxzgRpVv8+drNDk8vnqq27 zHT{DgsI zrINtslsMGnYjCf;ZQZ+d+dfJI6dz#<=L>*i!^Vx-z>eL_+hJ>d_Q;V@9k$a=ZP6Nj zPqm1q=>!cnqo8hEf8@+P(EUW?RwE`a6+Ki+@l2lv-b!-A)7yMlkV0D_FLnQNCuq;A zomL9N?hkU*f7GACHKf3+IPJNM_Pu0}zKuT*Ze=zt&++q(7H+#MTsj?G(AWJ^IVT4K z&$05ntE4ZPCs4)4XbV;8dF#DRGZf|aF(`g8e5_jx=Rii!oT(pj_We=bRo*tdd57mV z19$7|^+-!x`Eirgdn0*q($Y|3h@pEbTF-NJXQt1fpxNd`4R6>WZ}uSdZYzWQ{IsB6 zbAwhj3YqF|VWVOnK3PpkX&X786wa%!;(I{TgQ_unGK#H1j(3kRyK(W>S8rwq_HoGD z%+PxG>MFzr@avtL84nqf4A^@$+LdEKi#T1B_Dfbb}v}c;1 zrTbeFvv0cc46(HnomyW`?%J$gSl)5}BaiK8zH~<>GI}b2k8g7c;bEYSP%VG;UfxN0jXq=N)&>wE|X|+vUL7t&|f?d&Wh3>)Qyl>5#W?5P=Znx7|gJl^JhONwkA_`TF zlHLUi6c@;xu>Op9lN#Qev>+|r;K=ZS&p?)#@G;5UJbZC!MB?za=GRO*ICQ$9(@;0D zrS91nW3$!qr`L2`*F>D_2FaIx4Qbjq;me(w^ZcX7!kVsN6j^1@>90?;=<)0J`jRKV zT{R88D5S4uHPQ3~Wo>3Fuv@sFoU z<`Sh}M=H$o=sK;ZXUe)K2CYu&%y4zgj@0{+|*(|3`eqPZ*<(iQ{ZkQ`!_s9DZHbCZL|2@9b#bszsd^HSbaXm+OvF xJwL|7&wJUo<{gpQK2;bD{s+9&UvIZcQ6>7^AD;DAz89}&JYwwd<1(Ay{}&tL0Ji`D literal 0 HcmV?d00001 diff --git a/Payments/Diagrams/Bulk Payment BB - Payment Gateway in the bulk payment use cases.txt b/Payments/Diagrams/Bulk Payment BB - Payment Gateway in the bulk payment use cases.txt new file mode 100644 index 0000000..47416f8 --- /dev/null +++ b/Payments/Diagrams/Bulk Payment BB - Payment Gateway in the bulk payment use cases.txt @@ -0,0 +1,17 @@ +title Bulk Payment BB - Payment Gateway in the bulk payment use cases +note right of Beneficiary System: CompileList +Beneficiary System->Bulk payment: transmit w timing +Bulk payment->ALS: lookup alias +ALS->FSP: Validate Account +FSP->ALS: Return status +ALS->Bulk payment: Return Lookup Status +note right of Bulk payment: validate +FSP->Payment Gateway: Qoute Fee +note right of Bulk payment: Batch +Bulk payment->Payment Gateway: Send Batch +Payment Gateway->FSP: Make PAyments +FSP->Beneficiary: Get Notifcation +Beneficiary->FSP: Request +FSP->Channels: Funds move +Channels->Beneficiary System: Success +note right of Bulk payment: Recocile diff --git a/Payments/Diagrams/P2G Mobile Money Payment with QR code -2.png b/Payments/Diagrams/P2G Mobile Money Payment with QR code -2.png new file mode 100644 index 0000000000000000000000000000000000000000..dcd74f16e4a13eb3cbab51b1a917149a468f0ff0 GIT binary patch literal 52104 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 BB: Send Transaction details +Payments BB --> Registration BB: Generates payment reference + +Registration BB -> Registration BB: Generate QR code + +Registration BB -> Payer: QR code is reads Payment reference +Payer --> FSP: Invoke Bill Payment service + +FSP -> FSP: Debit Payer + +FSP -> FSP: Credit Gov + +FSP -> Payments BB: Payment notification +Payments BB --> FSP: Confirm payment + +Payments BB --> Registration BB: Payment success notification +Registration BB --> Payer: Payment success notification + +alt Error 401: Incorrect Payment Reference + FSP -> FSP: Rollback Payer Debit + FSP -> FSP: Rollback Gov Credit + FSP --> Payments BB: Rollback successful + Payments BB --> Registration BB: Payment failure notification + Registration BB --> Payer: Payment failure notification +end diff --git a/Payments/Diagrams/P2G Mobile Money Payment with QR code.png b/Payments/Diagrams/P2G Mobile Money Payment with QR code.png new file mode 100644 index 0000000000000000000000000000000000000000..dcd74f16e4a13eb3cbab51b1a917149a468f0ff0 GIT binary patch literal 52104 zcmce;2Rzn&|2M2HSs{rsLTK0-nH^@fBt?ttm7;7K2cfJ|X7-A#tSG6dWbYZ0JxWGo zKkuXSfBm29{@>$uKd;w)Kd$RKomX@mzvKJ+em|f0`uzNLv{a}lm?_A}$f!=KDxM}I z+x#8>ny;i7!igOh(2|c1rQ&8JC!;UT1l|jt%i&^vaue zvY0-g)YXlVzaIbnC}ZVCB?{}zTb6ABS?z|`!`tn2PbwYrlgK=~zb%9Ou;GsH$~uY+ zVI1tnKG);q>Wde@2<)V#)$p6{xcucyiAC?@p~vnGWdnkg3V3_6u;8df7Sg}4vwUE{ zH=WbudiW-PibG=)zH|EsZo{`QhW`UUl)W%FQa9+QtEV?OP@4KEi8D}Pn(z|x^NDD|2{PRttymr{H%|UPvLN+hy`_>&*~FLnEEP0x6)$LUeJ-!s9*pS?DU$2L~yg5%;YM~m4N6cpf{Uf=q$ytde1?lMC- z*mHN=E{W4)MmJm2b;a$!S}L|p*SEDjsTdd=8{IAuju*F%ejSQ+<)ho0RB-+r7-b(6`k%P6pHh?85Knb{{~ zQkiLxW2mDvJUr~><)z?D*@c&x8*Mmp_;BA_PxsOKXUA>Y3v4?04;@PFqZ>2&J=T;| z=Dw(dfKYjxRs?MYC=9H|gwF(-! zH?DKO<|}^&gYnMZ-`;IX(2;N)sjUeYXrUu0D3oukyDxWs`SRQ#=hE@x$HN6KYiVk7 z6K(t7mN|~r_j|2m#r!C782Avzr#Ch@vVMAFEGhVqW|Shikg%}zTf;t!;3)lGJ*B2B zcOLKcrBQ!+o~SqH#&@;@W!7*ln?7ru0a^d-v|xem{SIWBOeb z6fd%}td_Aws;jF-k00O3F<;|9GTxlBt4`<4nM%Rh$2{6D(ySbcnwoY!MRvBjZEbDX zxk-}8jvec&OR0+xx@RsTCU%Ipb?er~`RZylH{Q<5N}~BIhk?7R2lfk@Z0*g6kC$K1 zGH;00EXF=~e=^|iINadj~A8HmW3E{@%1hJGiPWC z=52aSO`XaabO94B%tkB)Xg_gj7;gx*crE;%}ybN@N<%J(d zL^cL0?(d*swZ*B+%IYm~9Nlx|EVi(!MNLgj^og4pd3kw3LG|$`?`2;o`S6x&R4oj5 z%zN#3$Jw)IrCA%=+ZTGSm3yu&-z@93nq_U;LuqJexNY0Ee2WJA-qOOSPtRiGa&mGG z+y00Ux@zf7Pfy>qidRVUzw9yNBmFFqE0w}CBqZe9;NVp|ySm{Ufq{W5zb8M(I)|iL z)6mdR-ya+p2#txE8XQbYBYlbA7^<3|pC4_A^Iqt(P*zqhEiGm9UY)79PcuCAQhIP? zaB!~IxxeXil5${%o$UN%M{vbJfmMsI=F(JtgXPNL;GmV7t?g0GuDq)|LZhzyK6~c; z`4W?l6h=ly$Bt#;=CMh;Av1T)bE(sDXvET3=b5 z7SHCM(*9Ct)6u-+`Sa(L6)y}6186@C&Uh^i?~UU3nmQ@XWpeZ9S4na4aPup{seax$ zw1ig|_*W(`FL(MoRpVfDtFaRc?0c6#KG-{5qEc{fvjpf0`F- zhJWjJjxw>g*P+X*MzMV_mvD@Xdr^_qr&!hM`ue9{H9$7DWtEm1 z)}O75krd(NyjL-B^!&@A<`i|C_7_c!ja9X^F(MX01h+H#`ubBzBT2jsk@IfmLY4brsZo~G5zKJ2M}a-@8H z*(T~GRsct`$gbyX=^&0u8cltSqyo9?@;smWajMsU!eafd-@I9vn;XKP&=S&Of)UoV_c=*Ye}es6x>$v+%b;pIPVZ36w}RC64z~&zw2a*k4Ty!Oavh zQPD%M>na^P&qS!g*4!r zQsh&7bPEP62@3ZutD}zF3{BlA8~jvNCg$_A4%JtLl79E@_tbZTg0%GY_qd+YcB zcDJoe%Q_$hE+B)n$$XMcIQe&$&st)`~ta+98+VYTnk>AS36eh(g84Zn_3s(n!V z?Ai9g&%sva3t{x(HP24mJnVV&`o)w#PpGF{1JFmRT4Ifg?b}*gX$k9qT<S28WwqVbrlfd z`nPv?un$X0OU+G98#Ao7FJ+ns*X9+sTzUN>Elq{3s(;w+v!>Vl3(X4`E|{4OqrUCr zKr_gTii*2uR8-xB(#;xC+1dP_Iu|Y+6{+YczBayPnL0}W zm3Cu!G6z`We)gZIPoI&#G|8`Dzi#}wzoTQZHc|x8>}O|Qk~IAvyoZvK5-|k3Jzu>F zzxYvm=FLhE)fpOo)$QLWCntx7lC!h3Q&Lc$Sd~YBaw2lvGq*pPl@-a43$L7+Im~&fls0q0MD@`u@mR=%2FOF@maV?AcK_=;CAnzxDB&$7sR{7Kb}4tVe&=TezkMVM}qa+%i}fJD#E zojd0X`~m~1+&`owP*PHI8LE~SrHoHb0@pDzFyLdIK!aMhO;1m!^;Zhs93~~iikX}8TJAes_>2BbWU2@B39`~PjQQYfwp!7AQraYJ?Jw+$B&y$ zdvV>7VdZ=ql>Fkw6p9M&FMtS^uZY(Ff&UFh$F9%Q>$kSF-Fqyn6O41J5h?6r%tU=3 zc#PBY`G@3FkH>;rtE#F1GXgfG10OtCLBnG{a}juX{JcYHrT+3NIY(t}?ZZn9&q6{R zHr73(&H*<$j%qEx^4?hgzO*>q-ykdNwJPDsK019-tOtFmt1?ABydIPXsDCy_*fNN< z?5d62%9P0R%|CVG{j>y${q>dp^uv7R)L>%qncP6Ig~k=W!E)>8R8;P-OEA(waNVat^K&C!%OgjE$SXi%QoQhrT?X-_?nO+I!^DXM@Y0N^Dzq z>}XMt0_;smNqPVNyNIX?IJD2p1QZwDg;6{cqS=_j5kRYwO3aM#12`x>cBE z(Y3WTH3L(}CMMcF--oU4X#*p$!CMnU9zA+=XUmS|3`DQJ(OZl3u9$Ez`>@lonXRdMki}Ul`rG4tLJNMJl%9Eq4*MZDL#>K@weJWX1TzHQqwf0#3U?_^g<1;!AwzV{415TvhT`KSRC`dU6p&`Gg zdD1^Q=K)ah%-r1L>`binl%44K6WNiGk$JK3qq1>v5fQ3$RgV2(pM%-dV;nh%W8>pZ zdnBjxRc!Onu}vovkI;039mKaQD=FpW*mu252`a0o64%ej%FEJ!HS1_tGNrfir z;C26)d8bF`Lu+3*suk#@HaDMUe%_i2I5(dtmb$Q#D(&$nB#;a^)6ht1YJCsz@QJ9C zu{&2$DuND31(auGXKQgXEu4O@{H9mFaKMtH)ra-e)6b-pd-P})SOqFTMP;R;x_Ty% z=+#dT{U1K`m>oLRYjc?^_cLouOiZ#|E-&@{e1PXIJE$pHr8}#tRMpjMy1HD4tDm6c z(_I!+Cm)z`0ilW$y1Kn=W;ldHfsT%@^SJ1&gOihnn%eSgjlj6KqS5*DOG`_@LV;`M zZVfWlkJ^Knj|Z$*wYRpe&bMd}3zUmlTU%olqD8G9`S>VZx&$cOcddMlL=blqh=hbc zCFO^5mV2FPIg)Xwju>PY6c>-qxS%Fl&`_VUY0KEN;#0>eVcg-}`dUzFJzyvyE6WoQ z0NRj7gy8#6pL{yS8@sD`$N2AE*jIpKpiZqzkTk0k|z2&zPG_^0D9;#bUS zo=Qqe&bUbH>9uUyvc2-tr+?dJNC7=H|Ii0bNquV zMkZ}!jW-5FHhi>^Fq}tYAH{if zl=0R?9{+pVa)1VnoIa`*{3|=OtiH|+Edw64$V7o&HqQFNW9Mf zOyN9sRAVO<)v)To+!7QRNNY5#(v}}ep*z+LI9w`oB#>0@ne~L3f-`1I#pmU zNU;C=)|QsZ=9HR%JE1XPwViPMij`{PgJ)wl-*lzSCr1n^e8go(Q>&GVcMI zo_veod2xm#Vq#D0T%o;y(?vx`14n_hUAs1o+8wahC-O_Pj?)(AB(x#GXOlR9BQ9=k z9D-@|LXslck=^TV-!R^iR#sL9^d}=D^CTh0ccL-jUS#Axj%4T^>FHzO8FG+0(O|Wn zo%lH5K)OIllqDmhmd~InIH}l@fDa~yhTY#kKG@S!q->M1l)8CNg?mweR}B#9$B!Q= zEl^v=?=8)ZZs3sar~V9z*3=}#!!tTR-U2K-zqlA25J2ZGb;X>HK%OKKm<~wq%|k?c z5}+H0_(ad6#YOzHv~*l|G6I6!)YKG^s+%Kf>25;Nwf^;><7(lY-Ym=(IE=)Q^mN{t z%CBF)0@%_Mg4pEx;%#Rwuj|?Wo@gV6{GRMkPmYsx^sO028G+!3*X%2Hjw`Mf^Ok+L zmf4AoWmDPNyx6+BG&fo0I5(n6@Vj@f0upFvB@nFhSmVi6yJn(Dev0-Z##_y4Vi2Ox z(|Cv^ec^evsGy*rxVV9y-ViNcGS#6&he!>aV+hT2I#yGkYM-#_{8$t8IZcV-Gxw}( z*`_XA9zumULmpvTcK!$*X*J2u~pO6ZNlO} z{Aj=-&dRc=jR=j7KJxZUOPV(1zq-1*n@&z|-n;?Fnx2~ans1@KobjhL1l#G!5rbPl zy7k#I}M}3Y;v*Y zfO)YJ*Aoj1kB8T^b#zRFHh=?8@T!>DscC7|gSpt*+P=DwU0C>=)H9wu`FQJo>^M5a z7sw0NwzjpSbJ)k4{d80*2?;03n>sqKJ+jRRVC|@DXh_qZ>@0zLH0mG$SW4S3&B>{t zsre(nL6(#FaKB`8clUBrk_u2axMxRO+Zq&QHaV{t(0izmkcB)w*HD*17U6?ZytzGGS!uji$1{0`t#?{b*Law1Ej;^z8K{1f8Eg$?dP<$b;kYs zJ61A?@$vCW4;c3`Gehoh{6O4!>eQ*ezCLViE}}-1C?D7-t?>2lmHplu5T#@6XVG^- zX$q~|sw*mzJXaQoA*c=5pE%OD(1{?Su!2RIn0!yyO|sOvU?lkheRFZF=_=sNty{Ms zjNSy;#YP#Kn1Jf9Cl;*3JJtKTSci8NY8cw>@}HTjXduA;;+9-o^i4Q@}0bvzu!$M2@Zoq+y@vV}IiU_5`)olb-U0q%9BiJTlSYXr_^hHqk`RRT+ zPR^^Ko4C552M^|c|IT{xB6(@@*+6pr61(HuHlc>$G~v0lor^irQtHd}Th2898mIt8 zXM`FI_hhC&5~mhAaRmVIzFa1hyhUHQZ>_D^2pQGIw!JD1j$9 zOuJs1*=jAf+`srn_{NYbp$a&EtmXUn?{7U<=m_X>R@D%E$vL{Zx&XqVrT_(Bc~I)U z$bY|LW_C7FJEdX9-QAs@uzAatk1TSgRkYOi9S1*Ai4DKIvxOMKrVqw}sR&k?_tmYTXSJFG6Ifa8rLnwgQobbiIY zG5#bm1c0HnwY4$qe7^Z^0{`W=8gcDX6_d|s=;pHeT=_M-MuMAv_PaSht<|P<1GxxnwMzI4g5{>Up3fqsv+k2em` zK(#x0^5ncoSz_YdhS6fH7G;weE3j)(QBlzB{x_~k+1d5VT&>_J*1Pmt+u9E7-*5R! zUdDAc8Gl1I`6ZPTzrAvQna)NQdy?a|$uA_9Z!Mz}m%hYS< zx4m|R`9;ow){&%rt+!N(JW|S;-&1X|7m`R<9W)em@+By5ongOzIS{IFp!Z3dOK^Vn z2%*-Sh#hSXvs>pKU4LR>@ny9#$l0PW$UM_;Ii^JB9?A;T9GlCkc>Nvt5G+@urTe6-}1aj<};d3nbg z8~aQ5xcB^;PbxITB`!mej>b*0|J{pac8nBp_k)YZGhU;Frc1k~cuig^VzPeT*j z*w_dN1iIg7F!?N!?Ji?Eu?S2YB|*=?AWqm!&BH@lGr61@ZQP9YgOml8)FlEo_N^6MKA-^-UT z$0*uAJ$LpM&+c@N8x0Gni*x>3URRJG&z+H;-q_y$6Jpf7Itn6_oR`PVo5#zhsLvgf z)!-mHP4{`i7{$3*Utb62CDKBu*3_&+n>Wzc_a7xG3-Amc1O${iPuCAPK>IknZmp(9 zvDV8;>aw_Q>FeLOa#U7VTLVPE9DMusEsl|s>=#FxI*9Zjw7*aU`d*qnNK50PI*M(i zQR&s&uB(OS2fYVihs%qirAlLUtA*Z|+FGs~Tjg(<>)FjtT_99ppQ2_1MX<84WI`mq zrrIg-yWYW-A~fRK@A|pzx+zO@K`X_lZZW2BXAK_x_AMkPM#Dhhl*{_6Bu8ay>wH z4*#LR-cZj?awoK7BxXnm1Y!w#A2jU`ZWgbkeN=0U-9}4d&Rko6Gq`T|=-IZzoV>h# z#t~5W*d%Wd11~_2G048)3aZE|*{WA+hiJSl4j>ddl#o)PaoCUr zG11cg0w}zE`7-tW$B~hI`TJ+Y1Suasc>+oP^7-@Uua|rU-a~{#Z?#+3O^9G`&mT?j zp7@OhQ#2Fy_H(}mgwqm)4hlVOg=f=&_kB)mTLM_@& zASpXx5OH=Bz&Spqw#rltNB#$-Ir$gTTuy!ajC+n=fi=KW;dznr!z}5IafN46&i2?z z=ywp6H{XfJod^5O|Fbp3(Y!h-MVpSgC8S0^it&C@RX32oot@psoO@OE^+g2*F~Vlm z*mQf^4nIlje3sqWy^{m}2?RP+*sQ^I3Z46iEoYCwjdz?STD4YFHrF2L@Ozqf(rw_ z2dVP+_eZ*dRq)E~^78V;=VCk_@u^ma!Z)`-KzG8iwTsGVIwyGVwu!t*zO9M##@0-2!`>RoK+85>A2jyT5;Lp0LSfL-to8->;xB54-A> z#Z9-C%5)?1?8Xng4@J5EzZbq@4#w53+PZph z2G|KF`X$bcGhZVlWyDs#^Kq&K4XNf87J8=LD!&IR(FeRmJNy0PF6#Sw=gxIq8iT_}EU=S5#Ca z`ufrl&b~Mo`sfkeo;^zBO^rI87pg&VX&wd!0{!sPlJ{AVUL7^dohEP-nU20hRN`qS z-x81?u=;5*&2QfXO)CAcH(=c~8cg@T7RTvVP^iE;`q7zpk9KydOJvKId!*zIm<0MG zQXkM0h#^4Hz?i$X-qn^{JHyMM){2COEslttT~<<3#o)}?RY%9Uf&x)s8g$sn@o|t{ zwC*ar3O3`rcklZ9%ip}YV1ARbqBc&hzq$D(JX)}+SDq_kSxRn>1d?gvw)m4|^If}E z?!IVGs6yF86cNh2@M|7V!qGkR$<+J9S z(~+8cuI+qnV|t68jBMh=?SrEIRoc;Fb--jW(a|pU`YYPH>FS1-lpvr{qjXUB#*LRx zp6KJFxVeE1BEkf`Qc_Za2m`Q7U2Sb^dwUSHk{2%?K77bUd~vDF(EK8Z4(wT>6%_R+ zw8F5ipoI6nafOQ(E9D$y909q1*RBV^stV>e(WQ#=^U*^<%A%y4e?pcXJJcLKIywqR zG5d1)B`!MdLx*OUR-?tQ2~%D*H@}6ZuU)T|wxMpw#pz$h;8! z4oOP70vB!Hz8yY!(qAiK^hOE#1?;FPD1;rCz02%+#7e(B+$REr3?!h!<{1_hQI*w3sRKhoKn*(`ZW?^ZF6j9OB1J#d3eJd(14)5}X_zjsGF*XJK0E-X4-c#b3 zR@?ot_)*u)iBEx#y3ULr`Z8rc=rQ|+2Z%keZ$DZ5wv!QwKz3>#o}S|g55mG2kkW#) zh?a{RhP2GR4I+^U1@SIKauWg@a7ssOtEq(r9FhEO-CbSB(>EdDd5CCfZ4JHeypa($ zxxmFz>~LX9&ioV3&WqT+*!xgND*F0lPn;+%s=ExiwJ#UJFnr7^+X~2YAH(PIS~A}2 z7tDWrH~KQ=a$r!otx4~?@arxK2#hG^erL$ODclxRO4%>t20~u&>Q#hnVNubgJQF1- zCFbU-IAo6>>kW9vO1sjrupG&!MJ&Y4i|DpAYj&?28VWfFM9qPLfti^ZBp&6wR$rBr zxY{j=2n&OsK?3?qhsMkG3{9 z3yX=FGoieVOtfVl3{^F+hjjwsCpk5BcF6+=6u8j}^pTKFsnbgqIx&%yk<;s;ZyQf_<-Jb%p&eX?NPnmOWf2wb2 zcmh~Q@i19@H*IP<15$CXUP-vSuOMJ~YqH%AG8$4z-WzMhAnKu^O>lZ4-3h?G-@7*) z3>hEmf;k5|JQx-^4GqLW5YFpDvkvAtKq9&uNp$ZdWTrY;HWrp}grf&8F=6O_r`(H=ne%MaCs9 zk!3Sk;~O|Y@jgxM?aB`~ld+M1HBuIGFkrL9QFzsD!tig6{%SH)#Iwfz_$b@{@bb7+JhO$g|}~$;aKs9+nAaC{eQ?>jlCt_zuyooE^zEvU1epmRrFRevO*L2-OMLu;gUq5Xu1TbaxFt5);mq= z%h)!^qyld5KX3rNsa{aS&8_t9TQ5~rzs$_cloT^ui7MBlNRi{m+d4a4z-h2qAz{k6 z{K6GxCL|=heY*}7pr*Q-l#GU+WMcC2>SyXmZqyh^p)?2v;K)IzfMiS;sI9F%I=4hp zI-uO5IFq8yQBlmk#>taWK<9sE2D_+`uVUS^=Sgg=y{Tz|>6b@1@sUwc{1;1|aNJ1< zx-Fv(R*aRFq>6l^z)}B`A^ce=EH6roHs?ITBO-o3kRj?kHXNA>~F+U!If1A`n0_na2cYIkzr_QN@VT!*zsTS!qk zUTJhNf9pRD8rs*lZ&v_7AD!2f)mDc+9hBc)8bBEvdM*^aMbTF@v{HpE8n^rRpzV`~ehrc+yHs zqgZc-u!~rnI<=F7STR6LfG!A66#hAyh&K7muV3+!B7z8yA1lzeG&dWfGV_3~viZ`_sSi4c1s;+GO{xZ0&5wo@`)v9z=_Hx~n34+x+rrAq_?GiMSp z*Klyit&MTgRXTruUxgqc!2t#;DjCikG(nPpE^fcSLJ;vQ)c!AzxP{fPFpVHo22Fs0 zd@HKr5)Kl#p%%*=Oy%gvNJt&Pli5L~OujpJ?cyYI@$fvjrnPeV{P|Plu77@Ucz)^Z zjL4RFO8S5w=-7ze%T?K$&z+fAT4SL*y12L?+9P@5#7_k8gSJ;~nYR2F{k>PQ+W&FK zFE0m)4HnnP&$?%9)1=)OYU}H>U%f)kOeJ;|s{92Ed*G%;zc$Xe|IFZ5tnpC7Zb7@D zJB54!XBJChX>@Rel$Ae0K}*$+%N{F25aYYCUBCx+<|p- z&&TvZH~O7Z)Q>v1j;n@ieHJqP*9C1so5lzSt7fR{mz}pLM5$$e|69M-Wr8FP%jio< z2IjZEZ6OLOh0;C;fp6Vp9B`N8G+sWP>I1_^g=BPCcKQztDYsRT50Pj7z+eWHdwuoK zb^q5R*s&f}ICHxJ={q~m0U|;$!Ef<>OSHq4-B<#o!;cnw_Ur6^MRhOn%71)bq0^ML zT9(ui2LDNfw3hMS|9h#EjBP|dh{_-%0rsTG%A0GmzI=eZl;q^OFJFGYQ37BLhZla4 zKvbdGi+^ao%K9phIe!Jt%4spDT`Hn8!|85-6{il7pdK98Ch9xg;iF!eAM zX<>K_A|6FVjD7!(S%`({e&ooCFp!m?(}`Rq{`vI>Cvj+Wv?k6Kr3;{3#%*2#CkH+7 z?b1lJ&#t}b&rj-LAn0AVpb^|ivg@GU!b7t1J&V)9#x1Ei#0-b#&laEN$gtq^{cU^1qtyVp8{DRcQW}(-kdm-ru7UM7fL9E zuY9-P6K*}Hu1WDWRBaI@A9?bx+pfF81YmTVc6O|ZGct#9&z{KWXcCME#pdBLI)DD- zr%$PAY4ijzB_t>wM@QROS&^KozaMfZ2P_c0avLgn$p!vE9yIl1M~}jAqVYAx!~hbY zMn)IE2TFo@pVg z%$1e5$2HJUQSI?pL^$qcLBUsKK0*45if%bMIe{UXnsRZN;>~{-J$^q$9J%9~@~=+X zDyIy1#Z4sXHEEzs467C}Y1|j4;93}q1#I!f{hPoO%UyekbTJ?)|wvPSyz|iVo+@irUQux4JeQz zIn*>X?_mbT%8eEKv3@7|amxd&^MCo{8~NLY%^ zU~B}$=66xP4>o+#n%Vn~J@oj*B;G^@bz@G(@vYPNBWW4^O+cbDz|qLfGCLh$ zL|3V(a=pRJ%{@HVActfCvPj28M4|LnOi}U%|cw^mRkO88M z@%q3A!j8>_d`=1Xba)~06yUz2Z06)lBi0Sw63oQGK@jHtOH=<^y5wkPHnwRvr7BypZWz>q)|dYL_czR>y!<|kMGs^x?W^*+YgIojBz+1ZK*T(ZtZ>;^H6_CjOH^F0eK8lLwOu(;B!+Q0{d zGiH|x760Qv7u?>M-<0xka0YYAq_D@BFS@NYAtKQU_mQEOxE;AQ-lIp)I32+{ALr1} zoaGJt7)IxZT;qx{8CRna;3x?xDFDE~Sm6w?#YdY2Aqoyt(%`f5L!H0Z zVAi$~C)@bK(Ei~KD8rqdogi+!r5w1Hmky#zp`<@Y{lgA~33-K-Q59v|uc;fsxHsty z1Zyd&6%-PP0NQG50S_PU7qtvYWC2#lpmd(lr=-50G0-(FgAT>K|9MgWJJL&Ap6M4lCGpZ~r}ckj0XC7v^9@u+n0yQ4x_$V) z6!Twhi{UJwr+-iQvISr_#Ki1ZD&9;Mzlk1D(G!934?&15<~& zu-!x~v|!)r>Hqi#Gr8rLLCUQdK(<3nzwGAYe0?G<%E~Q|KOSEFZ#^N5_J6I*Q~+m2 zfok!iQczHUZwiVxH#-~kMxTuArhLTan_U_c_88J(h9_k zX@CD1>`tK7mQ>A_wl=s6nYAYPj2M)#wzN#o$&o{%kYp=lWfb%K8oNmMk%j`((9DS; zi0oCpFoPO}IUx%Xte_04p^Qv#Rh1qRkCJCuK zcap|53ko27G59MYdkKmtA|!-aW|e!NlK&eu>HNhq?kZbtyZpqTo>>Kkl~T-MRR0J_ zO$W_KaY;x3A`ipe3@nDQ>U&imKD0#;IMVb>73MOoSz5k=6%nc$77@2L0IVA z*d)~ZgcTFHv7W>b1ntV)eq%K*mUcp_;SX28m-}yqQ07F|gQap~we#n@po3!#UgqbU zwLc08c{e)eL*S?o#4VsD-%3ajBe6VM+Rw&((weJ&*P>XX? zQxA!YcL1(oA5&If)aMz3!UHIPC^_z{$VnU3yYzW(oa%*q6RhW0^6 zzIC1$1}%wduW9=S!G~pKo=#4p6@oCnK+mo)`Fg#V^Ing!S0Y~m7P1=f_4UPdhjr~L z)rY~SxnJ@IX{tH$L`B$%PsH83^i0jui?>Gp2$eiC(c3|hoRxJ^CAs-vUsJp-Xmi4h ztk%(!HKxYK$Uqxmj&yYHV@v+amq5}gY&me^#~Ksx4Fs?V8Hf))yAZG8u6F%B@dQcc zl>+Fr#1J5FfX$cwU^u8w4fXYm4OSKwD&$}O6X5#eZ`uB!L)H{37Bg%2l{0^ZE0An3CJQJ0Uf-z0k(M%~ruYbLfQ)&Mqv}Zw?Zh@4Q3u_fYi+kk|^TfPHA+v--d~EC`IN5-IJ2?Ob3&28(ih_cJHwNyr zS+asG0zDfU^#C&U)YTnhXGh$43*9h+b9ijYT~E@i7oLiN;38>CRTD9W=P+BJJZVFw zu&Wa64_gTXdBE6t;pv!UZoMT0y}}m(c`#iZbF2_1Ebmk9GXb*+4J1ivri?5&wXCdO z!_|9`#3lG4GF`{ldsuSvWp1t|tWU+nT0?S<|4uH;52iC+xXbDssw{Qsv-)r9!dgl| z@tfi7`Ts0{AqU?55U8b5+Egje*VPR z;2(tK)J)quI{Hyk03IOnabJQLiLl|N67wo zB*#7$7EEQ+(>vnGg{pGp>r-W@-z6;uH8nMKR@m5x&&_w9DjQ$5eD{|BmD)JX%~#s|)(j7JzKa0~2AO-&JfK`;RESTxGE_Kea=ljQ7qQADg=T5 zi6Q9O%VF6Qy!`y;OsSYjr=9&Zps@TXFHh*=VUFHiGg(Z&kV;5c{ogb{DrS0RTf2Z- z%HL0QjNGv@rHh4|{k?5LE=xBXuIeitr!?e8DgEXhj9R)e*a|}lLsqzw%rW2ec!-E3 ze-;EOz@A+7k%ZYN)RBhuf-zKJ3iL7z5HZ)bw=)WjUV-AKu0vk}3fiy8ukU>3!>Nv}E%9oA0oTi7{@3Q2vs|Y#*8Y8fH{?Cy~AJ zer0JS5cIN*Wt`V*o&_{`9Ep;tkj)?*|+xcI{#*(06r}9F+t70n!0lX{f8)BOrL}7)nQ2 zcz8Yy7e!NZv&k-m`bcchdwuowVtNw@nJY;4$dU5v3RIe#f&Sm^7=@(42xTu##@n| zUZq2NfD)1et8f9q!yzUiqZAPNh+mU@a2y0O>}B*2k~ByA8XoAUPwx zO3GvZc@SLtU-CacyQ_(ZDsCTyrc2rFFRddsT073 z{)R~?e7=K^T;MNGOeFk}Z>?uaIdhZ|TQJoi1ad2e?N@#j_oD*k-WaY%Xu>**%{&4L z>zvF?DUUz76RSroQuFe3x#)l~H2K3}rt7lPUMO`swGtBtWRQ0>nul@3@4&fd@igZQ zY+b`dl@2`?!hG%O4R}I;hkm;`F&ci7FEA*`Yci{tHwB0t&|SBPBs_V0dynKhBKmy282i$C?eNE56XMU0}QEO|m zXFV?TxY=QsiV2g5_23RLb7gSv+ARPsK7{wfH@N9eL0i|+(J?n4!J3kD0AQmPS6>AA z1(k^S42cTYifyxNC%nQlXV2oPX+0Q(@9OUDg<7TBrgibcg;=j;D?$}ASV(?HCf~BRzmA=Fy{<@DljLrMy;M4!IsAB1!;@5>N^yJuzAkwB7*qT979X*=d(|2 zsDYT{?o_9tM6lCD&%x{e_U)VZ#!A1TmoZC$JlOx0bBT$GxZAikgp!5^2Ng(f$U*s3aDr4x{qYeb%>|DI?GeU!qpu@Cp-#BYB>KWvW zoDY!r@M^28*hS6+Re5 zexjBcpfe;RtN1=V{JU19VfDu~Z%h`LsF7@hvuBIYukkRJ=VyRz+cA}HP7jq2u_ru5 z1L$lg2LwY@W4ND?e4+j0!8vE~kTUDN;Kjgg_$t9ejX(wA-mSLkY0J0`0sRBcfi|6v z3JulO(P0m-*~!7m%8E9Ca1d;z+Pug2o3FD2+C7F(jQthsgGpJ)ff!K(5rFE8%EV4P z*8Bp8wCvCK2Y5xCNRMCN-qXmf=9cBy%p$qj~(4Pvj2Iccmuk zaprG33i)b>GsBvJPKAcUnt^huS;Ssoioe9b%WIvak3xL?{vEV69!Bq84IMSiz(68^ z)5MzsTNv1c-e1uq4-Y9B#=~V~+%2*-busW^n0w_U204CAa~H^9Rq7DqM<4q5ksEP# zNC?u>F~}XX*vm15Ltc9b`Lz)f>b5(UQF$-|@yU@Ix-{eQXW%~e z9b8*46opDMA9t%mD}tp<42N7gY#Q9Nvg@QldhvtYKV939_h#O<>p=4e=cV2wpr4ye==BGeEyE{Q!+G@9?L1Hqe{B0ck+MNfb75dq08L@82+N7 zxd*n5QCLBwWa5{NYZ!1qy9X*!<)YZRv*gx~sHe*yw)?3u)s|&ptf@(LzrxDi{t#&# z8~Dy<+^=E)z9IG%3W#)Hp8P+b^4@V$O05>p}D0~P6 z)vH&N7J~2ujFi*kc+4X*g)m9jj=Q;tlCJq(d{<{DWMaABt$G0H>)#&;V3KVH<1d2I zkosXHaM1ZH2kkGp)-OBE4=wQOt*%$slL!fxwzib8X~3<)fg$DPBd!5BXfsg-j|Dk! zq@+lXG2`RoAbKnfhd0QsyueOJ#u(2y!S5kzv-jw^_^;QItH$BC9^^Z6Bp+xkD5xkm z7n8Hamw2pIKL~Jb!4(>tnu?-K2)zAsm-Yr;6b*ylsAvj~0#t=KJdh0qvA9^AV+e%? zK0*467Z_AdGPXas%5DcUv z*8OJ*yjewM<@Es??^n*#v3T$lW@XT=XRD9oqz78S;{~Dw&O?m>l-?q!q(B*j?fveG zFlMDTR!8NCA@JE)gBRcLU}Iuo31$)hiKpXWLYzjA6yO0aMp*?^)Pw|>H;my*BrWlU z#4uDWHVKD!_;FLy3@RZUK*Ya)BK8gdZD3@C8R9F~u5BQdNKb(Hh299hS6G>E+a;WL z4iWU;%+Ih6>f>RcSDNINmv4YR;el?mE|+w({_ghek9~c&BiBn%g#`!vhiRCISwH}E z9y$V|^Qcgf1OtN(tiag+!`zz()VQ#1-zzqfVr`O8h&GiZNm3+{lA;Nr5JD+KLZW0V zAxe}6M5)M>P-LiNXQ(J8$vl;!WXKfN_q$g1{p|hR`+45`{p^GoV+zYwAb;A9)}3X^bQzi zG4)JKD+SXL+s>T%=Jo6Qr`s@ANM7EqT|400S%H)ZdP>09x{!Jph};nY4tyBBgPtKs!g5E5RH zPXLm!+g!DvmRprXooufWW*&7Y=6UxV6n%jGtLh#fUwgmol~&XWckOI_rGk+o{is|o z7mSXkP)$W4K{eAT)3<9#~3Q2NJ|%sHm)bbCqVz$1h)+ z-(Tzf>5je-Dg86m|DGQ{bDab=Uh?vX!WAeQj*@f!l4rMfQ3yhgXiRJNhDrqTT9v#U zA}_Z~ACNLmfwQ5^*bTy4W?M7jZriTiYA>&o%I3WhBdBNHd7C;`IFWP2fKJTBD0#{| zCM;d@By*5L@XtdLeP()g6E;Ii+r4E;`Y%e&y{XiRhlLcj!TD3r<2R?OvY#YEip87%1`)=HzUA}8KSTYyN4jHpr$y6&6%Y}WT*BkK*2Hv(l;OdPP zYQLD--TS@yl5y{oC+__o9pneVNnHp0?cT1q9n(kE&KVajfK-n&HQnBQ==dk2o*&Qc z_`|04zux@HGi@`wJ53k0r^>g;hVK0;7B6GoO~grWJ;YIxwH!8Dni@*dr@Ki~d>ctZ z+pS`E`xhZuiN5bhJ}k*~*?ln7#qG1YuBTJGev-f6)R%Flq2Yr&cfxCpW!t>{w6I;K zi&VYTo2`SQ)>O3{ln*37oWb*)D?_Zk7pJyff9GExCHvIvHZ5GF4JMNLSX)VM6e+4n zUU|*|p=J>I|LvFA>ro1{WYQmPt#cqDwla78hn0Nlv7q z?n}>aAnn85@4ajKUMKWklSh5JGjr*s2z=MxKQ|Q`=jh|dJ-ocmz}H1;Ndft{q?;s+ zwH1PhLNF=Qh&LyLa!%43v#unB0N+Kg?RcKE*FmbNYwKtRF5+0D*Z4zx*$` z6%-D}fSv^Wz_AfF2>dB1N(aJ`i(dS6cVACnh9d1g3jL>P=1;X;O*Hf>K#40(~?BY4^@J_Q|= z!G?*son4oIwbZ8}jr0>N&&GNjLNw88LmzeZ33Sbw>&k&)Kyd_b1pwa*=g+Gp;>K|{ zJ^d{gHLahDDn2}Eq0N3gJSd4U+X&vWMO{nF?@pv$JISN8@hVeH+))VoyA6=%b_vb} zoO=4+yZ5?x8?b+<`*=4SZ!1Q)v34#4r6N;b9BOg)Wl-JFj zH&0-e0$&fFnO*?xoRawH)Z+%A;1m}73r7oL9@RmEJa`=*#$hem)+FAw4~7a!xnBI;Gmg}S}H0GHef^D zEia!wz2xRitH?>YbBCw|jHoh^Uh`u6aEQ%(!8CcuAIzRzC*;GMWGk)6fnnzKKrcPl zP+(wZB|^5k zal@5iVZp4zQD64bx6;^_cAURRa}Vd7#_8y-doOh4D;H_^=y9}*tehk{wALIr@J(}L zR`Ws%kp&B?Hg6~EwCo6|tgBmJb8kq}#f32@>M-c`>UqSNt9A~~1v^@(H5YSSI5oc; z_lcqn7d&th)hRw854sKRF6b0zH+_htlER=a)#2it%fCbA4=WGfzaLs}A?600Y}m_c z@-j&RNr>B+Ldni>tIBD2qDR=iea8=79T9Fjs@G8|xxZxav7=?9T~1?5hgD?n-YFz) z4^mc*HKd96~Q?fJR6TTuYKRyR}8kI7N^QP-yBb{bjV`n0=lh1#a9 zczBh&wVY;P*S2fdJVA#uOHvK{D{p+OztvGo!135{z%Q7XCDv0vHRRh!ha{bB)4X=W zpN${FGdS+hFzz)?C$d_3BR2(t_jZ&;{Ev*ZwgxSo!P0w*PwbpexQHN#Os< zOLDi)eVWjTvuxO^RjWy{Be_kkuIjU?gCx5y-jTd0NT_1`t*+Zkup&{m&U}rSmh;qG zr)!!d4=M(rt)i`H^gZ}yj-=_$wnpJbUqHw`rMx*V`%+U)_E}B;Kacl-OSw=LwQbwc zUB9i&(m|`9hW7Xw(u+Dd=$+4=(3>OrTifbwPv_wtB+}M>_J^Y3GKLrdui78dlUI>Uz#*3ht3Fq*qZ)Ve)qVq~1aSBKR|!br9^aLEftJI8~a{=2KY z`#Q&;?W|5#hh2O3UX-BQr*L*s@6bEd%3sQKgIv^_qISmyK8lWtqC!#M51UkM0x`I! z1!p^niMzQfWK+j8i)_ryuHnUry-Lb4tS|mx;2v$cz{5kC8A@%f$HIl(kTgU^eFfiQ z+PDrjh~-VlroXglLluf}ruNZ=NL!6vH{byPpaQm1)`4kOczzq0axtgElaqqFt!$`y zT7-Hc*+&|#^vRR&>gyr8UNDKPDmMZ4QAtQn#@l+S;G=o>E^@{^6ARZdV>X~|M@x#) z1>)+f^@#>!V%j$K;ILivxjHK4|t*s+$e_J%#Np9rCnOw zLw-?Er&dlp9oa>Z|B5a8(B6gd5f@IB>ir1>3#~L7 zbZ4euuU@Uja1szU?cmf47j{4XuB#?emYZitJCi~igCeIgp>6#cav>Gba($&Z>qYp= z$s_+gl#o#KBx`?u1^#)lBYroL1`i@7Q_*pnr!D9iAPzGhC;iMbBS1`jn}oxMhWyr_ z)xz}YLjo~1rCFcf3u=W>dF?TQ3!Vr&=B@TN65ci^J}F9qZpYOiLPIlx$y z72ut1vVGsMs(axS{1g;iLoJ11{&bf2vp{G&i;pOEg=uu54jR zyLvDu7%KTOSz5XDa$X)~xgA}3dTJ^+fWT_PbT!H5XnJz;YSF06b-hwsXX&?TIN&(V zZH2sMhM89jI195sRasj0*ROqw+MM7zx-Cpk8R~`@^o_-!)3=h)sOjd!Bmtje!B5#oaCR7zz$z})Ox-6 zQ@dtwWh9U44v01XY9XaW-m=7g*(Ks1#ZJmUPRdm#yC?w7?Iw|M z9u;)DiWF;vKXjodA(TQeMW;?s zh(L5{r?+>2^yAwtnX4rZ{@G({_7o0^T=q|maRFu6+{#}AFuPJ%}-qITZETGYnC2#BM_M_em9glvBiilYgV-J0$ zN!&g2LU(m-NpkLHQj=wb*0tH}f9xSM)Bl#e@QdmgJ$ov?jq?qE@!n}Yr}ctfV%N^q91$E(TMS%l?`g z4`oez)_%kAV_Mo~HQBF!;d=OZk);B5G&K06&4g>!rqvi*+ntVD5V21Y^XZ#NY%24C z;h59%wDM6Qv4`7M_K`_ELuoBNJ#*a}C#Odgfs(wIHwkFDt4uDkn{$p!(0mm7MQcUb zSJRXc?;n6HTlS|L;@KNy#}NI0$dXrUP9&xvU<5ekNya%S+5Yv*m*Ldau8wn4zk(6? z_;!sIGv90_*s(ML#u_?ml`-zFy(^4%5zo}ze@Dk>{aDd#-hL;?DAJ@yImGNvhp)5E`{-zh62q-x}2qbZrj z{@3g_E-{#{M6Gx5xV|RRk@>#~hcz@1C^M}MQ;qq0mb1wQ*WL5^B9yBYm}J6OFi!$rcPy6Xlr zIl9ht5D(n!qw*_mK{!S5#Z@OK*d{}%IL`CeTHyh(J$5W$O{jrEN%0Ft^2r*7MBRS< z4zhJhE3%8p$dMx{9Oog5>f1MJ-hfVBd-Rwwb0)H$d!?n!PVp#NfE9|{5tcaF;-kn; zrh9Gm?xdYP3+4^c=cMxW140Y%v{@KkFbYSOiu8T|n#yR1Il}Z}+&HlbYG!6Z5n*A@ zix>A)Q1~p^cH^VaTHzkx3YQg_OVE!2d;SA73>C%_w;G_~`yaQ3uA)fAuul+tIcR=< z|9;K0z;2lMr6haW+uylRmw5sH%QfwU0pp<^BIMAC@XPKbbF%g53K8AVFnic1Sag8g z#Y9I}+ctBkNR$A$i&xKiXFaMgto<*)bC+WaF>v@Zx$o9Ouc7V5g@k>+^x?T71_m*; z4hM!S*;Tg_!fU98kx^`|xQPu-51%}lt=f6e^iu(~4#slxHGBj6O{&RGH4-|3^f{Gd zx}*&sKV;#02r9zd@MjOS@pbQU6*_Oy+E;|0bWJ~w9N0QJY`a!in1Tp6S5$8`BKv>q)Nq+84j=P^u{R2OzIIzA zf}A1mJ$n4O%fP6sSI4KH@1>Y0g@M_hvqw+Q4@5r-Fu|5VbKM_$QX=D?GVWDx3b^0@ zf6}T2n!JC!wvMtFIv5=@oKah<$BFG#hzgebM*n!$NpP?X$JzVq_wPuXnLqfltgK*a zTHq0z^a(gSU^>*j5CnnAZ@w#+p@bLAng*cfvSD`{SRr-Pn@XBUir_BpGfQTeh^9SWpy1w@P&=Sm#AuM8#uk0R`Q! zq52R*umP&7))q8DFyhq`2`dris`XzwRTKOd3^ut=tiGzIg}F4F1ClrCCK8(ahym0P@26e3ut(i~PZG3#`XG(fP%_+c8~p3XOLs3v zuygR(=@y38krgrVdJC)uZ*^<=NawR>k0JoY^%nRNi|u61B`}%x3KO$ZVGYFAtqHcS z00k5+%uU;?{2#NWT2J;@28adX-H_qK7s_NfBJpI(jRGsZv<^BQw9Y7*zvO83CJdJa zGa@b^q{_J;R7(vky?-`=IhX;!El(a~-!tNVh*!1KO3k0-tK%FeysMbDhb=q`VrI!t znc-8m{FanxQ@XQzJ5h5)WMsF_or@noK9T(U{{;o9)iO`d9w-4nH0^_}`}XY;fse!t zcLoPhjlvyX~LzTi4%$1h9oHlAWxwceS+F4#ZYhf z@Q>ftF)y-krM3Wcanu?RfZYI|B3J1h$Bon8k~21N( z`wBhQJ{iJM5^eO~lU^QIvFe*-0-n7=uH7c-b#kr$_5S}s|0}E90_BR{>HoxX=cu7Z zlzg;*!*bvKAp|3!Ttk^r#n(hZKN6(;oteq{;AB4{tBdq643Tc$xZymc7s@_#z6!02 zhF6Gy!X+*6P!&~m^&2GkhYv3vK5Rby>t>HuqN<+7@`}=^tk)28P`KG^?8A2%zN&}E zpqZC-_4H1ae#*A)SakJjf0k~2ixVU+xF9k;*xqB9#n0DJZlgESX6Vwnb9Y8WB(8&` zJw{q6<<%0wNNIWdhFwSO#SKU}fNB;!dVS`p4-}VppUl^ZPD@)U@!UB}4*~I#E_!I; z$e}QFD6oeN!*B*g8RZ8zMjFNk7Ri?VPoFtsX>R`R(kmi_w$KxDDD_y_uPd}3nmzs+@ruEjgmBF-9`7aK)}Ajh-S zPzWyEJECOZb#4u+A;F{#g`Go&X9bP1kWT-R5A6|m|L~nv3F#*Xq|F1OqHKVN1ul#M zB~86${{*Euh2g)C*j#+t+M~d2w!8%WF4@~jiZ-j{)TjUU@m(d$evk^TNHW$`7~0#3 zu`isg@M21Y{qTYrK7x&e+rqHMjnkqUvD$B)+c!3jJ zf-AMPEv#zA(~*|_=gF{Huj1=h?|-L0FOVrsA_A&&{qmFrH-ea$J1v>Xt;1SdLxi&F zU%!4;dxJMa>60h>U+?`H>h34qe?08wH}M>7fqt`F6aV=3yK{5Ot6G&MWgC;-%n<$A zYe4_Q`E%yEWhyFvK+OB?w_J8RvBwlfc)_poCY#6gMKO0E9OCjs)y^*c`i5;5Gj?b% z81z}HMCRimz*EFPH@(3L-U~cJyUTa)?p`xz{`>@MHC`K`jIE&N4P(Mo@c- z`CG!gS>HM57XX;FK(~Xo55lxA9Sup$%zRv0Iwb=O)Z<5vSd@sSBuj#}#l$*;Ti>2y z@ecK8@18yR;C7RD3q`_YcD4OS#4JFf^JnTLljcPgjfNP6QN|T4?>0rLqgfjEGR26v zx#J*(;#PsQ97bRNU7ZOg@4v14@ZBW=a3N0#jsZmt&wt@*` z-XWfFs*9GAhBL!$RjN1alTkoRJH61wh5Z-%Y8^ze@&v|XP%bMai-p3Ai274)cn~6=iY|7`Akv$ZM&muJjHF^-TL^$V8mbIjziGX)eV1S_*yDf(>->%&+nsbhCX>S zsdpl^2`>)5aN*oJY!$%60)v8v?t$ZFB^_pwSYTJVHHe*Z7OsD%7;oJGPn2l|_zB}@ zJP|nGv1@HC*oN1wXU~c1%yoth8N#ZHH(d*Zdix36*5zgJcUTQ^DTz(rx%v4M`-nAX zoH6ekroFo12Se)uWi5&ZQ0@h8T(0dFc4lrJB6PR^#u8pgtY`7ITD}~6Icp&v9&WrZ zFDZWRq$l6Mkfa~vAG=^q*XS$=3?TjuxJE0W5478-4JkvUIk!fV&+i+;LEHAOPPRmDb6l8EF+fnZIC6bf)Wos|{$#j>pIUUaLmY(sl>}B5K3MdG^b66Pu%yT(~Gg z>tVP%=p14qXz~pHXcO~RX^O@c5$=R#5h1PGcGv7_a(&|9OZANK9%rqeZPzA2JrtR! zrj}Mnty-_Xa7ei`SjwoMEq!2s_lhx`#;B;MMJfIh7s&;h#LWRZ{~;J3u9EiEJ{RA{ ze}Gi6yx{)oslS&ERh6#9e>kU@sf^UVbT%z*x!*L_#n?czwpuR*%n4ctAg(hR=SaYA zTEijy-}=TkvqvpHG5s|BF~;a_uE$TD2)XiXB^gbq=**6rSihlJ?@)M?O_}b#b47?&X0jf1O zHwQTfgM)L{RDWo+6F@j~9}r12Dz`^Bz3((CaELa%v<@zMcRLJyMT*9HL{m*ox?{)P zH$Z3>v{rJSJR=^`4G~2(;CjUet{~H}q858)WbhUiM^aLn5p6Nms_**t$}z_bVg0#4 z1INI`d!$-@x1mt0Qhgu259~IpPr#3Fh3gl@LMs!S0K4^C>OBgtDUGqzm%jyEtS_Dz zUJQ@NWHZh`ueIpF#h8p5kaduwffRpQHv{GpJm+73g>%l*Erd*5+2r%naBE9hPZ0h$gc{RMHz7{R4rSmGU02)uV;HI65)5(}P0&hptJ7BJM)m*Ena zTxZRbS|Y)?pa|nZB9Rf0F%A$(xLCPjH3~at%Q##?zZR}EDKNab+HA5e&Va0exP zvj%|wIFj5LyT1rNRQHpw_YRGm^Qxl4#sc_3kRtU8C7%pKJV^<{Jg~E{XQ;p)Bd@0) zzd>bNxVwlf#uY$q#*W_RwHOWamnd2wCAnxE-E_ot>lw3w3c(S-A%dyNaGY{MahO~9 zsbokBr7}l?$9>Tsb}8I#b~yOZuO6+rgQA}?V!gc?@G#-lZ(r=8on=VuQLBxPThDHQD{bLJbPC?QEt-;9nle^t8E0q9JW+gFzxXm{ks~gAQklg#*S?Ql$z`C51q+PDp|It+iZf^TV*d5d26#gLZ$ZQ>8y zGVI2foMw{JeX3!iuaA1^rZHhj{+F+uiZi#Xx0o1n3TGxkTrL#H_fe;I$ zrzBRuyqwGulV?TlFWHa*Zs3BtenYwt%F>~t~9q>*1q<|fXIBpI}~@ur+0~S);*L7%rR36`S8X!dg7?_7cM}TkXC^?Yx(W> zHXUMtd5z@8d<#!L$znAIpwza2#eBpg9<$f(fXtFsHY+$JWEQj#78S2#>x{{D>Nq`N zV>>gZgJw{OqQvpmYM|}#5C~?NVw4^<3nhfB4fb-;`ptRCtDZ*d^nf2isHr&`wORiXTey6IOoUYlyy%lE0b0YZoBIsG#QPFJ9q6uu+d&n z$_4Cz7Gom4Yx-yzt+T5?++26WDa&u)ng*IW!0sW@0U=|pjp#>l{l`WOQ3R?Crr?wd z#IYl_>+5fu&G2i&n14uc!Xe1DbivgSaHePZHG=z~)Aw4S32_8A5->UiEG9!qA6hN! zKh4_r*l+e$cH??|o_CxuKn+lga&!0K*+zg+)b-S!gPca{wym{0qCP2Y@NXZN`tQ~j z&3Tt|TmF*%s+y>?XU{Sq&gV|VEe+@_RXI!#(Z$jqv-6I&(~ag(u7~vl4p100qy8?8 zYpCL&dIf2%V$=%P-0n5N7o#YWr7-_ug2mYFD!x4c3NbUhzdTya5%6b zn2<2e%#0?whEW`QACVsaDM;EsT3zz7fIC^v~ zgI%a8i4*r0*vMr#&a$z&{IKE=B@e-88s%@tUL(z=Z#Q0DnHJ}koHFqY!S^mkY|!AE zKA+91E)LWhQqPCCW4MrGv|V1*wu|q+B|fdRyBzlM$U`th;+ANbS&`tGv3EpVwqu(K zQ{L7)8+kiiEHNu(ycccBe&Z6GK(oRh%kB2TO zV5R1IfOX-F#FqLv?TLS}&q%=TUccq{fSZi!`l~=_KNr3b5r&E z_aBd;xZ8T>-efh-G>Bi`qqK)kD;w#X4cD8f5 zwWG<=X)(p&Og^>uM2$XxA`J;#-+&*Db?X;u)LYm^)vejXR!t;pOP7|J9gYE;(u^9o z4k9{z>&EuQ^4iNB^yDLpPCW;%aXI0J;->kW^Od&1U6qv!K77yZek5vXJIwoav1UTK zl>LkPt{ZSc1oqB`>W&Sy5ZjRRQgkr`4*Ret_*opRvAl-`ZA2S;6o+3cBqvsP{ZM)j2wF9B7%l+uK6B`74ZT*Nf2*N6BI>}DC zUw2ok@v@`|5u32qECr{1YK7{yqm-<=KL>&z%C>2w$41=Af;Z}eXB74IQpMqMf;k?| zy0DsxTSG7xUv~-X+3YzRbX~5SgfJJ~sGJ%2*@nG;8@~0|8q46@lQ*U*7tRkby?cse@S*Q-=07Gg)`uabYQVkRZ>A0y|QcW?&&QlmdNTpQhVJ4<=xwF*zPG#iv)#I_y$ zP_A@+f!vM8J;o1%{)<_=Tkf*l4USIR`ya%Xf2Xt}2>p*`n*aPSjk9Q-Ii2@H=2{Cn zm3J@MNb=&x5~!PCRs*LVgY*MBlVsMJpDyaEW}juK_CN&Bo!~y~xAErRmWV z&K%4`E{|RM#@Ds~ID%F7?*-WoTg02MK4M&eioE=g0xU(27??~Y0Z?wVb4Oo+x*fZS zqEPT|D=2^sq^dd}5Cfg?(9`M|Wc*zt;^sD=a-a5JAk-7_yUMgtc}dV+2e=6gf`$+p z18Z<6OMk=q2m$2?n2I!ALflx`K_+l65fwiDLo^Xn9zf_@&Mm>L;lqdf_!J_jrpI7a zi?Z@1>Z6JfT1I355|>xpB*&_D-i}ojdKO8N!cVEHY7tz2Uh8P>`{YBhF+56CghQy~ zQCkF*C)^LeKjD8+roQ=cD!WdtzU-i79|_ND>!6LRE2(Zs(-D)izP~jDxM8PHxGg7+ zOT`0@bce|Z_%d|^Ge-+)@K$Rhcvk^CfP{!}82kdX@<|>0?|Scj5r)NXfgB8zhPX~A zq9!R$`@@W#brJUjmIv4iKrc;FQy0{}@aQPDO8WpMF%pQn#ygQBpMU%Y=IpkX)ayB0h5XGnU4o=D6N3)k#zO6UD>k7lasgniPtW64A{YN zN5SZ8Z=q?UzTdxpHf+k}%ikY7G1}tVw(eu4!8LE&JDz+FKjW4)dh)RXlUrEN)#JFDZ>)gp`KZ$L7Xa#8FrL%;mnzE z+xx}E!iM|p*hrz!2O%mcu`8cL!;L!VEv9l=sY@)t$ z_3FtJCmsyP<8*4@Fl!3{Gz=iZ<#-ZRG&Q$%&mkF>e!e%*>Kmz;)@RtT#8sWWCfJ?1 zsJjV$5pH|yN$P}YIL#!myY)w^tKwYqPHwpM2f=KI;1|s^K#f>;@nZ^T>hqfRQc=h_VK&Yp;M`bk~Jg$NQ zw_r@G@q+cl=&D4C#5Q7$qeNdD!_n^DD=cH-ga%~@FWKh&b-HriYtM`DP!19w3^P7o{RD6e+)Fm z%>=(NuQW6){nV}z|Y%NK=uT2#0HqSj?|i_Jv-(|zA&MHbmwFuMdp zUH`43n}zGYn@il8wWqIGTHs)yS|GWSvUl0S4bxlw))Af$yL!+Wu!;gfxkWV*iS0T( zT+b>hR%TwjkaS$@qKmJe!n_D<|P(taIRVLE>#bsjmfWW`Wl*XEI1EZNRSDkTce)|WhBX_bFC4FoWF#i;c zrek|t6Y2zQFJYM?G*Wl7_lKbqvkS81@#9;o`qW&xEm$`Qs-~VwN)K<}zPzf>d6*Qo zeqjakB$^zQ#T6Aix3VW*sL^C81n2s=DM1jVa=DIri%0c&>B z?1_Jt1w%=0{It1FkV4NfW5&6=E^2u8lPMT!FcBqKU^U3#qhRods;-h3TJ=Y6F3ZH` zAwzUq@9e$k$MeE|ITH2H-^SQKjVu^r-k6uNB?`RR+K`z zCHSQuR16pRq1nwid@lDxR;!Jo2gC;7^~FbKPo0YK55-8zIyO9DeFn7K(9QTyH;ucq z1f!(RTmE1p$+Z{g5~;iw3zEY(Hq~se=p-kXh5_F2;rN#nHZ|8iT5DWV+C2K*&^fKs zmz#Ch{x#!e8(SOsKa#!W+9YdER1tqq@U^h(lGVHM>yQZDcwL*Z?Jv&X@O;3J-ECCd z`de)FGny48mE7mL>6kWBW3*a-Zfbhp^r`81>Se{JSG|pz?%%rgeQ(+Ky+c1g_bs=z zD_sl^Zz&<{l;Lxhkl`%QYtwLTp~UsiLT~^Md#IC$fg_r+13Pn&l1 z(JhhWhHt{y8W9%+84y_%XEZ1fq9Xj*F+35b-;kk0+1N}J8*FNm*8`t+1(`sGiR8&} z3t$9+1|Fq-8QksR!;vg9Aqb1H%<76wB9R282p!t>^ga<5@Nk*Q#~S%+lzlzrlK+@S z0l0%L3*ajfe_CO)gWy9gtAiE=C2f7WyeZ2-n(CUHQrtHJCa`0KqEN8*NP&$ki`gq^z09!dSZZPTtHjt^Qsr3oKj9^G7*ud>okn|i&NnvC{Z6_pj+|z=tjKF=u)P@j8 zX@~CF3aSJnI!6CYd2ijS^vs|~Wg^=zfHGHAQ`1tl^C;g2d#xNSpG>ZkhvcuOXkSN& zCEG*yFy1Qhhj|w^Y_OB%`jUv~XvwCPxE#G|Cp_nbWWIcPDqUo{$DVP0e+|y%#(<>6 zkI7g-trw6id zbzSf&6G(0+PRX4Ac-NqK$0Ra>u_AZn>h2T%L zuA2PCG+2S^7;ag}uS|M&OICL_RI|T1=X(hf-mY!SSy(v#`VMFSTjPP3GCeCSGW4>V zo7Unm>N3xy?mh%_^{p0`mR`%2&6#zdl@xR4JSAiB>u3{p)^;tCcNyh2Xv;WEGOq~e z2ZMb?XUESzw$(Q~@12teA7CJ8^1puoTzX|9VG4~(#=SaLP& z!l;GUcc=(UwRZAkMK!DAUJNe|%ez%(FjJG3Ie3YDbtx0ov7ZC$c)3g;IzAPFZ&^Pf zSbq(MzQ(Z3XU&>@_-u2VQ^k8_Y~0w|Hz8oEy}hbfT0R{a&5YTzCyzdH`0z3>FEG$W zj*bs`m|)X_!&M3Mx|-S%v>x?0x|v+(ITCm8{tbcDs*4rZnBC;&x&Rf`+wtcx{rQ43 zKk0YbmURe%a(3xb)-ri#unKJyA7U?}!YqfUmg|lbB5K;}>u0i~aRV#OJC`RNc5z~gdC{x@I3@Y{#xj)sq`3U6CRX04#0_~;bX#N`Y2Ny9u*R0{U=>; zGm5frz$#-_BQ!({=kxrJ_6otjtu9`OT{D*b2rMFNZHDi@NfR#Y%{sgI$dxp8UujpF zMLmxVw7Q)b7CF&QZ7bZ1m+!p^$Z=|~Ic7dCOtqEEmZ5wG%#|sT*NS9vIfJE;H2s)| z+Q^q;Sx-C1Rph|4v$H8ovD&khUn#NQo$uxby6N-d>+-Gf^G81dEEu6QiA4_A^l5n{ zOrq{O>;|KIhCNWl)S^?P?X^DDA6WjOsHlj}L*v00rdP~7(G#%lVZyHd$Z2+JMOtyN z=drs*z>V5oP-h;WVLE#|81{%&H4c)2Mh#SmyhPy+AEK-K5T|$d)dmRWspcu-AE!Gd zscTw%tDRpoqM=W$PwVS*onOX%advXWn)S|sq4^8Q$(jlSS+la;0|fZnA!*vH|kED7J9Fg_~{t$ zYH$q!qpc?y;OWu)W_I)I3$t1d!Lm6Iqss{p=eVK*3%aJp(&i4+o^tn9Pd+UwT5Sc^ zXFPyKYxi%gE?E4mPGg0>5)`Qc0|tbd*Mk}rWwAuI<+ZMY7A(X`iCasE-6^lH4sNO! zOFUr~ZNqzV8|B6(#mh>*yUBNA$#=)GnQQT+xlaoU zSYQ7r^89B*iA}+o&4@?jQ?&)SuBzqtE}}pqy3)-pj)IjhtG57 z?Ad`wXFE7tpPPyvD7qbJ(!5j$7*DU;SkIbuYi=rjY^9G{-`vd7Q~Yv<3`u6j`c-47 ze&J~Cq6r-CoTn{=c#d#=eU;6+bw8e62@>`gRv$P+-^z{r29ICD&oJcIf=`9WD@=;ft>z}+{V61-DzrCV8gJ}0s=M*F zk@ank9bNM5y|=K|=VLwiI;aF8>yX-!galk@VQORH$=1dP<>mNy95`^mU(6l*$4LCF z`v+(`o;#VDX~Z@Fq*IK5sIQbdzJg39Z;F*3kjgFp8Seg>~jLf z6@S3t>EuamZrA#1y9{ZjWI=L0r{Y+C_ij4YS3uZy^11bs%GOjTMxtYmJLwx32rUgV zG(`*i0Zj#zl@JOwYRsKgOl?^H3*{=(QJ~8C)B_n1@kDa$1%wUVKpPHQ2bVbPBFd30RStrAvsu(tjKss5}^e6 z{CU-RYiG{`!UuulhBb}lGvq7WzFk)(oZMj&Q@r-w7~|v}Ni^mDZ$YG^hA)lfxf##N zqlZF~-;2=^J%=9FdnqZCh4p@M2M_jRkNrt!MjA3Rsc@L#_~8xUKv%ZlG|mZ3J1$&U zi;R2UdP2HRsk90Z&#>Xc5A}{@b|mq_%AEHCz8HfL4TlIpD|Bv$WZ;Y{+0>bPWiyEFWFL+*+U$p`ETHgI>4ve2hvuEl4=tq~<65yve zo5^%=xnif--nfqFaUdU@zICfsBKZg#1Qx$LyJrDDU+_~?m zml@zicubr)j=-+>9?p%}2IXukhX|m$u z=Mu+=Im96>7;nJ=5N;Q1y^(=oqWV*>RyIs%_i4Up$cLhCFYij`kcB3i86hvV;u6&~ zbaZxJd+{h^MNs@9k3hM_cqlMmfK0Kp%%80yfu3KqVB?XV&OYE;kz!vcT&Q43Vc^pM`Ekep&j43 zv+wtO#0rhlBthj@Z{E;Wqgg*zZ7dRTW%x@;+lQu1F^ zE|T=g4A7Prr#$$F+}iTX17);J>{&N2vGJNYJK)jepjIN|2YsxnuTdsBtY_mSAjCIh zyTcSisi3LC4R>Gr;|~Bl;;84qZr^2*{P@6k$ebo{u3h?qhOEYf>q%i1vq$_%Lp%BIN1%gDszI`F)HX<2fC*>l_O|P3z zpemu&<&%)HffWv@9XWT72!u^=9=Qn#zpgF~-$h3D6wy4nG)Cca#pEC=Z+Lu+hGbex zFa#bk?sl=DMvQ9b)j^sUMUc`5UGkg_v$st#-8N@5-U2}|_BuXx zL%+pe!9F9O(wiMr%VPl`A4&N|LMQX0%U-gUpL7Gor|=Y_bZ0GBh|P`9hqZGU?GYZj zbm7kqBQ6Sb*E3X6d4_>H7m0>6E)**OzJMWw{f79Xl^3q0 zK`_}I8{12T&l#Y_ipO0RiR3Rj90)0gI&d$~_I}o;VaSR&c86u!YfSlVhRcSPlhSYP zP#G(&vTxjP6SZ<+bHe`DNfG?H&z!N3IO)n5fU0AS0nML*Ue_;&cRemuoPhGHmFw2@ z>jed@Nn%i3b9ZWbdOGtk&p;rs?ZLsUK<82KqB2gk^X&>C4x}X25F(gf>L7ldav#!B z?-8D=E1GW!G_D5^mJNNIq&7VK6$;UjPI;UmDW&>g7!nycDrFp4%hKGmX zED#aV)zpSd%y0(h)&Mc1QrvGr;7}tObge3;@W8#8*zt%yA9NVtw&wArnbTcBgCXJ) zn%=hUf9=1g^XIYSa=mNQ%4i-0)2jRT(e+@@gCD^Wi+j4zUx3f)=&354GCW;S&T>u5 zd#!Z0n_fr2Zl9nYQ+8nl`vif9St+s_lLbH@02(6Ok|kP=wyaNc(Cpa0y-lh*crvN6 ziP_*II}GEpU?~r4wadlbT?uVw@7_yU%Sq}3JNlxkvB|g(3)5IJ z$bQm}va&y(ZtP_A^=a!VIZ2phF(K|f+V5dro(A$=BO^Z;(0QK^&)buS{L_EZN&5_a zk$ilonxn)0HSe-9I&g%=6DtcS!IZ_Q-y0757HKYUy1ZhOc~Q+K(Vd8J;uAL5EI~$joROf(TtC@nVs$eN%G!# zX>z~_RkhV0H}|OUvbghcmGz066{OBzT(@2=V)^0YIq~oMnU%j1=h<`=9XQGzFz;^} zTaq_*+eb4{F&?lZX^|q?StN4dyIzv-0{O1Zd<}l4tYURrp>G(gI|Hx106*YI9vgH` zgVDC4Po=P2EcqEwgXsm~XNidb5B!nvgE#!Z%>ZJL@LwPie@oh4L8REEu_95Gl~5m; z3GV2B{@33Vy1&?jeaO8>`6N`Uoj*P}=k1}fQX&Hy=0%%W0Q+V#V{-b>tfq#eZCUgD zIg{LP1%&#je^}OFb#gc>h2zPVv#Jb!W5QhL-T{hN#{;Wqyf@xjmx{RD`a+9vPI^XxR0u1@a(qR0ZH> zpl1*keVNO9%~t+m?z~54?KFi~*#WC{4@>25iig%c{#TR#YE~^KUr!PikT4(6*3mhF zxXZ(8x{)kp7(1RqqRCg$GW`ldF(Q~^7vA0{Ri zQ(!?H;B28ko76`P1H%e6Tkc$mSG&E>QOMqip&4)qO}^o(ZGTQ9R&Cp5)Mre)k|Elq zCGsZMv6rA&fih<}{lH#lvIN^5^3Wf~t1rWS>vVf@^j%H5H|;twMyOOSv>V z$A{2OGWukifcS>frOcsyI)NC0iViZ%l?A8q&0|j=owNOugOhxw%~SoJ4BW_;?L`JM z{!-VBOQf>15x_p?L!5TNv>x-uDiggu`|u`)%sgt;r6Kc(QP$EVLKO~}cGw8wZOyCm zfq`vQ#!a3aDuxqb(v8srm+I$eVb7kDKnOU4FTQKl7?n{pj@`)`5l1>7Kb37TU}nn@ zVp9Ch-@1Web%OB}Jx#z@X3QYvoI$!DXMKGnS6fqg&(@YIWBzDR(3f>}&2ZjcTpJ@5 zJ3x5y|9_LTJLy8ZYHDht^alkg^3oKw#@E_^6-zXS>F7Y~idSPiSdGRNp}ZKpw5Gbc zJCYA2CCfvtoMJ|=_rp}2=9!gsbx*QJgXZu=3_R+-Xpw`pHCRp2qwJUXl6?5~gC3tQ zfDu5d!^2&N75^C#n9_bv<*QdL3%CH9&Pl?%lA+UvYcJFv91QW$c;hRgb=!+pdco4z zc8b~4 z{Tevm|5bazasE7;$F}k7Z-T#l5x)4kNCgXf3;6U2NVP&@ymL%h%_< z!+)vzmqffBKtxadmiuLJ< zBBEdZhFL+(#uV3Bx85yx6EGFO_41?UcDft6AY<#UoG+H&Hj;!fzU#RFwuk?%aQJ(1 z@E`v&=10;jh2X^G6Js`>e0gAi!SvCsSNOg6c;h=Ra<^U9EY-F#wVAU+l@E`3QMXPr z!|!@OH<}7ZPo1)j$b&u2FsN$HA z$prAD@CU2)_CWlrc=Kj0&5@N^ncXPIvj!*qyw>_X8!-{h@z?gb=2liNZd7lV*h$iA zgTJsDrWINkb~=_Poz&^xHm0MoGKB%|pYvi_fkZ_t?8AoN`w<6KTB*QSN|Swj&I6Ca zA7ZGWcc#RNh2W$Yl>mkntReuLdv!3>r~!{kTmV@$aek)NfDwj<9Rf`nmZN1{x$+a8 ztl*K46E!v5&8tc2k7q0uj?>d`jNK;L?hFd^XHAwG6_Z1 zph5cj`YI}8KG*t3OpsOyuRMJFJK~86(gK6CA`g^_ic4CBobxuZ>M*4j#yL+wbCa5=|+A8RTz5C zljSu)B=xplg)VgyY@2j^#DWYaz5F^HYru?xR#>S4UnW}d6+^pMqBNbdwZ$EQsQuXUK z!<>due9^q)!Sea}&Jwxvseam7MP|i<_=XB7V$=X_w>yXN88EpH5!vv`I?)MBaS%1Wc?mc>dLzDAqvm93K0{Er@lx!$wWdSa(n3R(8tEai7 zbfDm4ulx;|Ur13|Er2rvhH$3S*0N)c23%T&2*wzS(zUN(?y7HKz_!TS<>k@&6&NS) z@p4IZP?DEdm6sWz6cQa>j>vR9TU93A54)gO!I6?!U`w!&0=Y9}QQvn@rA`~xN8dsp zk%`y}3>y6S+O;6RiC&Q#Hb|-bQBZJf+L3CFhI31BKyEy<>&ByWkDkG~2F!wLD(UvY z2N1s~sJx7rHVaWA$K}HW9@Yp16_*@y-)9yy@JfZV+M&f&Xvhrl2K{-*P$HvEE^t`{3;tE;Em+y8L~ z!`*l9-}Ap;Yfcvm6#R!7UBu!Y5O0r%v7zj7+Tw1J`A#@q7apxX$qj0<8IOQ!H%~?% z4w}0k1}-J`B&uz_)m2)B@fDwu$pI5Vxegr+0XmG0v(cn5cI?})9}EBX(Yz@tQioWS z)p-W)npCzi=hNLA2GjQ4I<|k--q}<7AAK=fwrB!ksIroh2gDn|z4^_Bz`4yZ5Z<## zV0HQLHF-*6UGJO;+aDW3W{t4eKXQ#H(>9f{o5Us|N+V1FH!}B%KcJ!>I;?uVZ&dKK zS!*h~nwVph*mx#0(~rh6Knxw{{7Yna{Q{r@k&AmMDq7;;;QE?23)Be#MSV%gtFO?| zB`fDnT}E)SCwDG$f(UhiY9g(|#9_+aj$Hs2v0(|=fqZP|nqlmg5W`}XZK!5Qt@)sb zsZD)gMO{{N=Bf7ygL^0#}<@j=CW^&i1;GB-2hy!P~%H!Va@`Y{pC8;GGI@As1wAqS*FkCg*DiIgHdZ7u% z@D7SQQ>)u$WeasW-{)=)PgHMcXh8Adb>8>_Tj(ZE?9k{iJqC`t%7Z2bQY;TtooPE| zimCMbFJGo{D#uQl(lt0YhHVB9{k_+$`PGE3IC=Ew-BF=Kn0LO|%A;zd7hC_z%#5KE z!NLPi-KoQ-)R*XDZW8@%g|L5ASW6}CyLbPIyA>~cNw$Xwn&fI`b?sG%yKg1$D(T|VCqSrp;7X6y%e_Ivm3Yp(+81)C6W zPtYv^R(&h=op1w)!s#B}^mSgj9GD2hWTI}59z8$;qw}p75hMtS$`>$x1=uq5s@ef{ znt?LW`A1_T6sHT@N^)~eKdU#UzURkWuSRNr0B$_?da5K4yYrLavQMzN!|nDmkBvkE zfil&B(W!YPuB6-6L=?X2B6z93+K%^~_QE2xNgM%Vh0fi&mEF7dm5jaWY|NzdJjyf@ z)z{qhIK~Ey%xB@wgY3F0M{58lGLYyqa#f9@?;|zeIHeU=gRWZk6%1#h#3sG_CEO0) z)f6A5HBEnC*3P%b+NG6cbUemGHoJ7d#J7Xn*8hKvooh6dc^t>2gGfNhO!sv@h6_u8XJ?D!T|JqS?*LCD|cy%B4D)otZWbnUaxd zKV#q2yXLLqnKRGx{D1%7|9ks+!n`NO$3HDQR9G0!GUUS{1{Ry6Cx{6~<5=qd^N#Y= zi_MbSi8?CG$s22qd@{jCoXFf3ZU)E+GJ*Q@7To2b0a^sF3ERp*D+pRJG}}2iGNJP6 zE?1o{sv+(HCF8__(D@*tn@ex~`t@rd>xePtiB(6ViT)Ztd9oTd(>-&wCNkmt(b4f4 zrELWVl|&7ESTKnCoNFPRr0(2-q8h} z>J58yHL1=W&p3hMo#VqB1R8@xlv_s%MdrG$uub~fgX%F409ghB`B`xkCRC+n{>$IC zjANo!x6Tn#WCnMyGXJVT7IbEsmezjE1*Em{yfuh4>8F-s2ha-H*jyU71yLDYCpV=d zy04u&jMp9jykVh7&P_mdL$f{Q#s}3Cs-gnF4Vh{x~Z z9$hS!J-Q>YPyVIs+s3(T3mw);tta_8Ih=avm|`hQyo=k+dWi$#L^_AOp z{vqoN7&Y~;iV7&K3^p3%zmVyMRw!M86QB@?)AI|b7Sof^&!jPGBcZYsRot^2RBu^t z6-l06UPV+^Lc@{`H-v;t89Vj_JT5s~6q-D9?;A^c$=21hAR5>!_H7KXg5Bk7;Zpsi ze#O@Cze}l!6rRVDPk1{7$94~d3BNLF7`Wv8IZ?=k@-+CptOx`f=RR| z8NOlJlzAejM$&iItYJpQs@Q|`qJJpwby}$0(O$4+3sptUN*W{h)o+D;Ko!6~_VI-w z9lvna7=^|$jBkb4wX?Mq&U0>W0DWWUluD&IlWJpzCq>@-c!c+ilZF|2c~gvxl&2X@ z$RPlXLRK>v=bszuJwC}V#6LIOSl*$MKYsJ7cH_Q!9Rq{xnOlja(CBWMiGv;ZMUA=U z;J}t%^rox(&CA>tY9YsA5cSG2y2N6)1wm?Imr%bPZ1V zivpW1Ro?d%mI!$VNRPRN+&?(DUJ}Lu%77GwsIwordeA!pClj8bG&m+MHmPlIiGc#* zl+K>Y1H!U&_^@V3A)z>M;+XvpbXDJS_GkjLRIB?$&}-qgrznJoyjH*J@K9}z19Y7~ zT`7vBMKD|U_37EqTJ<_FSd|npJ(4M4DjTn*RV4$A+ko+{ ztJ~;yL#+xFR1-;X=a}%uO>bX=uz!EQy<_&W*5<_K`Z@RRz1P#^)N+d;y-bXZI7xt>5-}c|v95Mg=%H{@a4S#q2#`v9tV3m1wh5 z;@zYH5seF4?Wdj}0+q`+gQrD_MhG){O(*W{&FS%P{?Ts!)xqdx!p;Xq3wG_<1C?Kf zQNiMDVGAH=;Ov>=?Zl+`lI@S+9gIn-TQ|o!?`~3{XH$2*y&{S%7$!$#h(u1QOdzSp zS&`xx9T^&$pS475k~Q5S?~;kJvBq%&`;($SGSc)PlQW5<+s;|wPaw;TH%k+(fNW+R zkz1yw$?562*$YFfv{i>PGdHo1!c9wJ&gcuZhW<~c2i7y;QA?JyK|uc%i@zTZYm-Qq zZnucmTb#s(vmgd{UqFCEc n`99&e|Ht;dt9bm-E2|A&R=KB!YPY6wpPayments BB: Send Transaction details +Payments BB --> Registration BB: Generates payment reference + +Registration BB -> Registration BB: Generate QR code + +Registration BB -> Payer: QR code is reads Payment reference +Payer --> FSP: Invoke Bill Payment service + +FSP -> FSP: Debit Payer + +FSP -> FSP: Credit Gov + +FSP -> Payments BB: Payment notification +Payments BB --> FSP: Confirm payment + +Payments BB --> Registration BB: Payment success notification +Registration BB --> Payer: Payment success notification + +alt Error 401: Incorrect Payment Reference + FSP -> FSP: Rollback Payer Debit + FSP -> FSP: Rollback Gov Credit + FSP --> Payments BB: Rollback successful + Payments BB --> Registration BB: Payment failure notification + Registration BB --> Payer: Payment failure notification +end diff --git a/Payments/Diagrams/Payments building block diagrams- Bulk Payments expressed as a high level block diagram.drawio.svg b/Payments/Diagrams/Payments building block diagrams- Bulk Payments expressed as a high level block diagram.drawio.svg new file mode 100644 index 0000000..3bc9214 --- /dev/null +++ b/Payments/Diagrams/Payments building block diagrams- Bulk Payments expressed as a high level block diagram.drawio.svg @@ -0,0 +1,4 @@ + + + +
Beneficiary Enrolment & Management System
Beneficiary Enrolm...
Validation/verification checks
Validation/verification ch...
Batch logic | Queue
Batch logic | Queue
Scheduling
Scheduling
Reports | Dashboard
Reports | Dashboard
Payment Transactions
Payment Transactions
Voucher Transactions
Voucher Transactions
Fees Calculation/Mgmnt
Fees Calculation/Mgmnt
Reconciliation
Reconciliation
Logs
Logs
Account creation
Account creation
Destination Accounts
Destination Accounts
Account access/channels
Account access/channels
Source Account
Source Account
Reconciliation/logs
Reconciliation/logs
Access channel (Existing)
Access channel...
Access Channel (new)
Access Channel...
Payments B
Payments B
Bulk Payment
Bulk Payment
Payments Gateway
Payments Gateway
FSP System
FSP System
Account lookup directory service
Account lookup directory service
Beneficiary Recourse & Help System
Beneficiary Recourse &...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Payments/Diagrams/Payments building block diagrams-Centralised.drawio.svg b/Payments/Diagrams/Payments building block diagrams-Centralised.drawio.svg new file mode 100644 index 0000000..db76152 --- /dev/null +++ b/Payments/Diagrams/Payments building block diagrams-Centralised.drawio.svg @@ -0,0 +1,4 @@ + + + +
FMIS
FMIS
Central bank
Treasury Single Account
Central bank...
Bank 4
Bank 4
MoMo
MoMo
Bank 2
Bank 2
Bank 1
Bank 1
Post Office
Post Office
Agent
Agent
Bank Branch
Bank Branch
ATM
ATM
Payment Gateway
Payment Gateway
Retail - Welfare
Payment scroll
R...
Social protection payment system
Social protection p...
Lumpsum Payment request
L...
Retail - Pension
scroll
R...
Pension system
Pension system
Retail -payroll
scroll
R...
Payroll system
Payroll system
Retail Payment scrolls
R...
Payment Portal
Payment Portal
Lumpsum Payment request
L...
Payment Service Providers
Payment Service Prov...
Beneficiary
Beneficiary
Access point
Access point
Retail payments
Retail p...
Bulk payment info
Bulk payment info
Payment
Token
Payment...
Centralised Account Lookup Directory Service
Centralised Acco...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Payments/Diagrams/Payments building block diagrams-Decentralised.drawio.svg b/Payments/Diagrams/Payments building block diagrams-Decentralised.drawio.svg new file mode 100644 index 0000000..c821ef1 --- /dev/null +++ b/Payments/Diagrams/Payments building block diagrams-Decentralised.drawio.svg @@ -0,0 +1,4 @@ + + + +
FMIS
FMIS
Central bank
Treasury Single Account
Central bank...
Bank 4
Bank 4
MoMo
MoMo
Bank 2
Bank 2
Bank 1
Bank 1
Post Office
Post Office
Agent
Agent
Bank Branch
Bank Branch
ATM
ATM
Payment Gateway
Payment Gateway
Social protection payment system
Social protection p...
Lumpsum Payment request
L...
Retail - Pension
scroll
R...
Pension system
Pension system
Retail -payroll
scroll
R...
Payroll system
Payroll system
Retail Payment scrolls
R...
Payment Portal
Payment Portal
Lumpsum Payment request
L...
Payment Service Providers
Payment Service Prov...
Beneficiary
Beneficiary
Access point
Access point
Retail payments
Retail p...
Bulk payment info
Bulk payment info
Payment
Token
Payment...
Decentralised Account Lookup Directory Service
Decentralised Ac...
Retail - Welfare
Payment scroll
R...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Payments/Diagrams/Payments building block diagrams-High Level G2P diagram.drawio.svg b/Payments/Diagrams/Payments building block diagrams-High Level G2P diagram.drawio.svg new file mode 100644 index 0000000..88e6b53 --- /dev/null +++ b/Payments/Diagrams/Payments building block diagrams-High Level G2P diagram.drawio.svg @@ -0,0 +1,4 @@ + + + +
Account lookup directory service
Account lookup direc...
Payer Government program
Payer Government pro...
Bulk Service
Bulk Service
Payment Gateway
Payment Gateway
Transaction switch or Fund Transport service
Transaction switch o...
FSP accounts
FSP accounts
Payee Channel
Payee Channel
Single Treasury Account
Single Treasury Acco...
Payee
Payee
FMIS
FMIS
Central bank
Treasury Single Account
Central bank...
Bank 4
Bank 4
Bank 3
Bank 3
Bank 2
Bank 2
Bank 1
Bank 1
Post Office
Post Office
Agent
Agent
Bank Branch
Bank Branch
ATM
ATM
Payment Gateway
Payment Gateway
Retail - Welfare
Payment scroll
R...
Social protection payment system
Social protection p...
Retail - Pension
scroll
R...
Pension system
Pension system
Retail -payroll
scroll
R...
Payroll system
Payroll system
Payment Service Providers
Payment Service Prov...
Beneficiary
Beneficiary
Access point
Access point
Retail payments
Retail p...
Bulk payment info
Bulk payment info
FMIS
FMIS
Central bank
Treasury Single Account
Central bank...
Bank 4
Bank 4
MoMo
MoMo
Bank 2
Bank 2
Bank 1
Bank 1
Post Office
Post Office
Agent
Agent
Bank Branch
Bank Branch
ATM
ATM
Payment Gateway
Payment Gateway
Retail - Welfare
Payment scroll
R...
Social protection payment system
Social protection p...
Lumpsum Payment request
L...
Retail - Pension
scroll
R...
Pension system
Pension system
Retail -payroll
scroll
R...
Payroll system
Payroll system
Retail Payment scrolls
R...
Payment Portal
Payment Portal
Lumpsum Payment request
L...
Payment Service Providers
Payment Service Prov...
Beneficiary
Beneficiary
Access point
Access point
Retail payments
Retail p...
Bulk payment info
Bulk payment info
Bank 1
Bank 1
Bank 2
Bank 2
MoMo
MoMo
Bank 4
Bank 4
Payment Portal
Payment Portal
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Payments/Diagrams/Payments building block diagrams-Payments BB components.drawio.svg b/Payments/Diagrams/Payments building block diagrams-Payments BB components.drawio.svg new file mode 100644 index 0000000..33a6ecb --- /dev/null +++ b/Payments/Diagrams/Payments building block diagrams-Payments BB components.drawio.svg @@ -0,0 +1,4 @@ + + + +
  Payments BB
  Payments BB
API management Gateway
API management Gateway
Voucher Storage
Voucher Storage
Validation and Verificatiom
Validation and Verificatiom
Reports | dashboard
Reports | dashboard
Batch logic & Queuing
Batch logic & Queuing
Workflow and scheduling
Workflow and scheduling
Account Look Up Directory Service
Account Look Up Di...
Reconciliations
Reconciliations
Audit Trail
Audit Trail
Payment Portal
Payment Portal
Security layer
Security layer
Payment Request Initiation
Payment Request In...
Notifications Service
Notifications Service
API interface
API interface
Payment Orchestration
Payment Orchestration
Voucher Management System
Voucher Management System
Bulk Payment Service
Bulk Payment Service
Payment Gateway
Payment Gateway
Information Mediator Gateway
Information Mediator Gateway
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Payments/Diagrams/Payments building block diagrams-Scenario 1.drawio.svg b/Payments/Diagrams/Payments building block diagrams-Scenario 1.drawio.svg new file mode 100644 index 0000000..832df88 --- /dev/null +++ b/Payments/Diagrams/Payments building block diagrams-Scenario 1.drawio.svg @@ -0,0 +1,4 @@ + + + +
A
A
Data
Data
Government Ministries/Dpts
Government Ministrie...
State owned bank 
State owned bank 
$
$
Treasury
Treasury
Mobile Money Wallet Provider
Mobile Money Wallet...
Bank
Bank
Regional Switch
Regional Switch
Data
Data
Government Ministries/Dpts
Government Ministrie...
State owned bank 
State owned bank 
$
$
Treasury
Treasury
Mobile Money Wallet Provider 
Mobile Money Wallet...
Bank
Bank
Country X
Country X
Country  Y
Country  Y

Scenario 1

Regional Switch (or a switch of switches) connects financial service providers including banks and non-banks. 
Scenario 1...
Payments BB
Payments BB
Payments BB
Payments BB
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Payments/Diagrams/Payments building block diagrams-Scenario 2A, 2B.drawio.svg b/Payments/Diagrams/Payments building block diagrams-Scenario 2A, 2B.drawio.svg new file mode 100644 index 0000000..32e3ae1 --- /dev/null +++ b/Payments/Diagrams/Payments building block diagrams-Scenario 2A, 2B.drawio.svg @@ -0,0 +1,4 @@ + + + +
Central Bank
Central Bank
Data
Data


Government Ministries/Dpts


Government Ministrie...
State owned
bank/Central Bank 
State owned...
$
$
Treasury
Treasury
Mobile Money Wallet Provider
Mobile Money Wallet...
Bank
Bank
Payment Switch
Payment Switch
Data
Data


Government Ministries/Dpts


Government Ministrie...
$
$
Treasury
Treasury
Mobile Money Wallet Provider
Mobile Money Wallet...
Bank
Bank
Payment Switch
Payment Switch
Shared service of Switch
Shared service of Switch

Scenario 2A

A State Owned Bank manages payments into payment scheme
Scenario 2A...

Scenario 2B

Shared Service of the switch manages all aspects
Scenario 2B...
Payments BB
Payments BB
Payments BB
Payments BB
Payments BB
Payments BB
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Payments/Diagrams/Payments building block diagrams-Scenario 3.drawio.svg b/Payments/Diagrams/Payments building block diagrams-Scenario 3.drawio.svg new file mode 100644 index 0000000..9feda89 --- /dev/null +++ b/Payments/Diagrams/Payments building block diagrams-Scenario 3.drawio.svg @@ -0,0 +1,4 @@ + + + +


Government Ministries/Dpts


Government Ministrie...
Treasury
Treasury
Bank 2
Bank 2
Mobile Money Provider 1
Mobile Money Provide...
Mobile Money Provider 2
Mobile Money Provide...
Payment Aggregator
Payment Aggregator
Bank 1
Bank 1
Payment Switch
Payment Switch

Scenario 3

Payment switch is place, but not deployed for non-bank. 
Leverage third-party aggregators to enable mobile money payments
Scenario 3...
State owned
bank/Central Bank 
State owned...
Payments BB
Payments BB
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Payments/Diagrams/Payments building block diagrams-Scenario 4.drawio.svg b/Payments/Diagrams/Payments building block diagrams-Scenario 4.drawio.svg new file mode 100644 index 0000000..30ca59e --- /dev/null +++ b/Payments/Diagrams/Payments building block diagrams-Scenario 4.drawio.svg @@ -0,0 +1,4 @@ + + + +


Government Ministries/Dpts


Government Ministrie...
Bilateral connections
with providers
Bilateral connections...
Treasury
Treasury
Mobile Money Wallet Provider 2
Mobile Money Walle...
Mobile Money Wallet Provider 1
Mobile Money Wallet...
Payment Aggregator
Payment Aggregator
Mobile Money Wallet Provider 
Mobile Money Wallet...

Scenario 4

A payment switch is not place or in the process of being deployed
Scenario 4...
Bank
Bank
State owned
bank/Central Bank 
State owned...
Payments BB
Payments BB
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Payments/Diagrams/Payments building block diagrams-Scenario 5.drawio.svg b/Payments/Diagrams/Payments building block diagrams-Scenario 5.drawio.svg new file mode 100644 index 0000000..59b9c56 --- /dev/null +++ b/Payments/Diagrams/Payments building block diagrams-Scenario 5.drawio.svg @@ -0,0 +1,4 @@ + + + +
State owned
bank/Central Bank 
State owned...


Government Ministries/Dpts


Government Ministrie...
$
$
Treasury
Treasury
Bank 2
CBDC account
Bank 2...
Bank 1
CBDC account
Bank 1...
CBDC
CBDC

Scenario 5

Central Bank mints digital currency and distributes funds via regulated entities
Scenario 5...
Payments BB
Payments BB
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Payments/Diagrams/Payments building block diagrams-Scenario 6.drawio.svg b/Payments/Diagrams/Payments building block diagrams-Scenario 6.drawio.svg new file mode 100644 index 0000000..c544a0b --- /dev/null +++ b/Payments/Diagrams/Payments building block diagrams-Scenario 6.drawio.svg @@ -0,0 +1,4 @@ + + + +
State owned
bank/Central Bank 
State owned...
Data
Data


Government Ministries/Dpts


Government Ministrie...
Direct to beneficiary via
 spendable wallet
Direct to beneficiary via...
$
$
Treasury
Treasury
Mobile Money Wallet Provider
Mobile Money Wallet...
Bank
Bank
Payment Switch
Payment Switch

Scenario 6

Central Bank Digital Accounts
Scenario 6...
Optionally connects to switch for routing to other account systems
Optionally connects to switch for routing...
Payments BB
Payments BB
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Payments/Diagrams/Payments building block diagrams-Voucher Management.drawio.svg b/Payments/Diagrams/Payments building block diagrams-Voucher Management.drawio.svg new file mode 100644 index 0000000..2844207 --- /dev/null +++ b/Payments/Diagrams/Payments building block diagrams-Voucher Management.drawio.svg @@ -0,0 +1,4 @@ + + + +
Voucher provisioning
Voucher provisioning
Merchant / agent Registration
Merchant / agent Reg...
Voucher printing
Voucher printing
Merchant Redemption
Merchant Redemption
Agent Cashout
Agent Cashout
Admin 
Admin 
Voucher Issuing
Voucher Issuing
Redeption
Redeption
Voucher Management
Voucher Management
Text
Text
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Payments/Diagrams/Voucher Activation v3.png b/Payments/Diagrams/Voucher Activation v3.png new file mode 100644 index 0000000000000000000000000000000000000000..d7e502b7619662a986899241fd7073f617130e15 GIT binary patch literal 40959 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 S22K$8m|{HB=)8gLmj445G4sv< literal 0 HcmV?d00001 diff --git a/Payments/Diagrams/Voucher Activation v3.txt b/Payments/Diagrams/Voucher Activation v3.txt new file mode 100644 index 0000000..d164b9c --- /dev/null +++ b/Payments/Diagrams/Voucher Activation v3.txt @@ -0,0 +1,34 @@ +title Voucher Activation v3 + +Source BB->Payment BB: Activate voucher +Payment BB-->Source BB: Voucher successfully Activated + +alt Error 400 + Payment BB-->Source BB: Invalid request +end + +alt Error 456 + Payment BB-->Source BB: Invalid voucher serial number +end + +alt Error 460 + Payment BB-->Source BB: Gov Stack Building Block does not exist +end + +alt Error 455 + Payment BB-->Source BB: Voucher group exhausted +end + +alt Error 500 + Payment BB-->Source BB: Internal Server error +end + +alt Error 503 + Payment BB-->Source BB: Service Unavailable +end + +alt Error 599 + Payment BB-->Source BB: Network connection timeout error +end + + diff --git a/Payments/Diagrams/Voucher Cancellation v3.png b/Payments/Diagrams/Voucher Cancellation v3.png new file mode 100644 index 0000000000000000000000000000000000000000..4b18f050277fd174459ff6a2c568fafe45ea95ee GIT binary patch literal 28231 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 literal 0 HcmV?d00001 diff --git a/Payments/Diagrams/Voucher Cancellation v3.txt b/Payments/Diagrams/Voucher Cancellation v3.txt new file mode 100644 index 0000000..9b5ecf2 --- /dev/null +++ b/Payments/Diagrams/Voucher Cancellation v3.txt @@ -0,0 +1,20 @@ +title Voucher Cancellation v3 + +Source BB -> Payment BB: Cancel Voucher +Payment BB-->Source BB: Voucher Cancelled + +alt Error 499 + Payment BB-->Source BB: Invalid Request +end + +alt Error 463 + Payment BB-->Source BB: Invalid Voucher +end + +alt Error 464 + Payment BB-->Source BB: Voucher is already cancelled +end + +alt Error 599 + Payment BB-->Source BB: Network connection timeout error +end diff --git a/Payments/Diagrams/Voucher Pre-activation v3.png b/Payments/Diagrams/Voucher Pre-activation v3.png new file mode 100644 index 0000000000000000000000000000000000000000..41425cacbe5eb62a5af3d41052185c21cdd2cc27 GIT binary patch literal 51816 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 z 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 BB: Pre-activate voucher +Payment BB-->Source BB: Voucher successfully pre-activated + +alt Error 400 + Payment BB-->Source BB: Invalid request +end + +alt Error 452 + Payment BB-->Source BB: Invalid amount +end + +alt Error 453 + Payment BB-->Source BB: Invalid currency +end + +alt Error 454 + Payment BB-->Source BB: Invalid voucher group +end + +alt Error 455 + Payment BB-->Source BB: Voucher group exhausted +end + +alt Error 460 + Payment BB-->Source BB: Gov Stack Building Block does not exist +end + +alt Error 455 + Payment BB-->Source BB: Voucher group exhausted +end + +alt Error 500 + Payment BB-->Source BB: Internal Server error +end + +alt Error 503 + Payment BB-->Source BB: Service Unavailable +end + +alt Error 599 + Payment BB-->Source BB: Network connection timeout error +end + + diff --git a/Payments/Diagrams/Voucher Redemption v3.png b/Payments/Diagrams/Voucher Redemption v3.png new file mode 100644 index 0000000000000000000000000000000000000000..d8b8bc3756f9e6d001ce08643bcd5c048c814312 GIT binary patch literal 69476 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 F4*Uo8YnJI#sTV5i%>~!1MZYpP!Iq; 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 literal 0 HcmV?d00001 diff --git a/Payments/Diagrams/Voucher Redemption v3.txt b/Payments/Diagrams/Voucher Redemption v3.txt new file mode 100644 index 0000000..cdd0e5c --- /dev/null +++ b/Payments/Diagrams/Voucher Redemption v3.txt @@ -0,0 +1,48 @@ +title Voucher Redemption v3 + +Source BB (Merchant Interface) -> Merchant registry: Submit voucher details +Merchant registry --> Source BB (Merchant Interface): Merchant name and payment details +Source BB (Merchant Interface) -> Payment BB: Submit voucher and merchant details + +alt Error 400 + Payment BB-->Source BB (Merchant Interface): Invalid request +end + +Payment BB -> Payment BB: Check Voucher + +alt Error 458 + Payment BB-->Source BB (Merchant Interface): Voucher number already used +end + +alt Error 461 + Payment BB-->Source BB (Merchant Interface): Invalid voucher number +end + +Payment BB->FSP: Debit request + +alt Error 599 + Payment BB-->Source BB (Merchant Interface): Network connection error +end + +FSP->Funding A/c: Debit request +Funding A/c --> FSP: Debit successful + +alt Error 462 + FSP --> Payment BB: Insufficient funds + Payment BB --> Source BB (Merchant Interface): Insufficient funds +end + +FSP->Merchant A/c: Credit Request +Merchant A/c --> FSP: Credit Request successful + +alt Error 463 + FSP --> Payment BB: Cannot credit merchant + Payment BB --> Source BB (Merchant Interface): Cannot credit merchant +end + +Payment BB -> Payment BB: Consume Voucher +Payment BB -> Source BB (Merchant Interface): Amount credited to merchant account and voucher is consumed + + + + diff --git a/Payments/Diagrams/Voucher Status Check v3.png b/Payments/Diagrams/Voucher Status Check v3.png new file mode 100644 index 0000000000000000000000000000000000000000..120110753737425aeebeadb72854bc106a3d7fd1 GIT binary patch literal 32242 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 Payment BB: Voucher Status Check +Payment BB-->Source BB: Voucher Status + +alt Error 400 + Payment BB-->Source BB: Invalid Request +end + +alt Error 456 + Payment BB-->Source BB: Invalid Voucher Serial number +end + +alt Error 500 + Payment BB-->Source BB: Internal server error +end + +alt Error 503 + Payment BB-->Source BB: Service unavailable +end + +alt Error 599 + Payment BB-->Source BB: Network connection error +end + diff --git a/Payments/Diagrams/Voucher management.png b/Payments/Diagrams/Voucher management.png new file mode 100644 index 0000000000000000000000000000000000000000..f39a4fa18de36f3d8956afe4dd0f8280f16d1519 GIT binary patch literal 26359 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 Issuing: +note left of Admin: Voucher provisioning +note right of Voucher Issuing: Vocher printing +Voucher Issuing-> Redemption: +note right of Redemption: Merchant Redemption +note right of Redemption: Agent Cashout +note left of Admin: Merchant/Agent Registration +Admin->Redemption: + From ae3649a3f66b66f39d96502382344ac8b8a8cc67 Mon Sep 17 00:00:00 2001 From: AKibuuka <43401148+AKibuuka@users.noreply.github.com> Date: Tue, 19 Apr 2022 00:42:33 +0200 Subject: [PATCH 2/4] Create Payee-Initiated Merchant Payment.yaml --- .../Payee-Initiated Merchant Payment.yaml | 1323 +++++++++++++++++ 1 file changed, 1323 insertions(+) create mode 100644 Payments/APIS/Payee-Initiated Merchant Payment.yaml diff --git a/Payments/APIS/Payee-Initiated Merchant Payment.yaml b/Payments/APIS/Payee-Initiated Merchant Payment.yaml new file mode 100644 index 0000000..309919f --- /dev/null +++ b/Payments/APIS/Payee-Initiated Merchant Payment.yaml @@ -0,0 +1,1323 @@ +--- +openapi: 3.0.0 +info: + title: GovStack Payment BB Voucher Management APIs for external BB + description: | + This schema is part of the Govstack Payments Building Block. + contact: + email: oscar.correia@maarifaeducation.com + version: 1.0.3 +servers: +- url: https://virtserver.swaggerhub.com/VMS-API2/VMS-API2-GS_P_VMS_API-1.0.2/1.0.3 + description: SwaggerHub API Auto Mocking +- url: https://virtserver.swaggerhub.com/GovStack/PaymentBuildingBlock/v1.0.1 +security: +- app_id: [] +tags: +- name: VoucherPreactivation + description: | + The **VoucherPreactivation** API is used by a non Payment Building Blocks in the GovStack Framework to request for a voucher to be used. This call reserves the voucher (for a period of time, which is to be implemented). This API requests a single voucher from the voucher server that can be used for a future redemption process. The caller sends an amount, a voucher group (depending on the use case), the currency and the name of the calling GovStack Building Block. If the API call is successful, the Payment Building Block will respond with a voucher number, a voucher serial number and an expiry date. +- name: VoucherActivation + description: | + The **VoucherActivation** API is used by a non Payment Building Blocks in the GovStack Framework to activate a pre-activated voucher. This is second function call is intended to ensure that the voucher is only activated when it is disbursed. This API requests for the activation of a voucher when the caller sends the voucher number to be activated. If the API call is successful, the activation is confirmed and the voucher can now be used by the beneficiary. +- name: VoucherRedemption + description: | + The **VoucherRedemption** API is used by a non Payment Building Blocks in the GovStack Framework to redeem a voucher. The calling Building Block will capture the voucher number and the voucher serial number from the merchant point. The external Building Block will also acquire the merchant name and payment details from the merchant registry. The calling Building Block will then send the voucher number, the voucher serial number, the merchant name and payment details. The Payment Building Block will verify that the voucher has been activated and has not been used or blocked or cancelled. If so, the Payment Building Block will then send a payment request to the funding agency / FSP. The Payment Gateway of the Payments Building Block will facilitate the debit of the funding account, and the credit of the merchant as well as handle any intermediary fees. Once the payment has been successfully done the Payment Building Block will mark the voucher as consumed and notify the merchant (and beneficiary if possible). +- name: VoucherStatusCheck + description: | + The **VoucherStatus** API is used by a non Payment Building Blocks in the GovStack Framework to check the status of a voucher. The calling Building Block will capture the voucher number and send it to the Payments Building Block to determine the status of a voucher. The Payments Building will respond with one of the status of Pre-Activated, Activated, Suspended, Blocked or Not Existing. +- name: VoucherCancellation + description: "The **VocuherCancellation** API is used by a non Payment Building Blocks in the GovStack Framework to cancel a voucher. The calling Building Block will capture the voucher number and send it to the Payments Building Block to canel the voucher. The Payments Building Block will respond with a status of Cancelled, Already Cancelled or Not existing. The VoucherCancellation will override the Blocked status and render the voucher permanently unusable. \n" +paths: + /vouchers/voucher_preactivation: + post: + tags: + - VoucherPreactivation + description: Requests for voucher number, voucher serial number and expiry date by sending voucher group, amount and currency + operationId: VoucherPreactivationPOST + parameters: + - name: X-Callback-URL + in: header + description: The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT. + required: false + style: simple + explode: false + schema: + type: string + format: uri + example: https://myserver.com/send/callback/here + - name: X-Date + in: header + description: Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API. + required: false + style: simple + explode: false + schema: + type: string + format: date-time + - name: X-CorrelationID + in: header + description: Header parameter to uniquely identify the request. Must be supplied as a UUID. + required: false + style: simple + explode: false + schema: + pattern: ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$ + type: string + - name: X-API-Key + in: header + description: Used to pass pre-shared client's API key to the server. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Bearer + in: header + description: Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Client-Id + in: header + description: Used to pass pre-shared client's identifier to the server. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + - name: X-Content-Hash + in: header + description: SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-1 + in: header + description: The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-2 + in: header + description: The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Channel + in: header + description: String containing the channel that was used to originate the request. For example USSD, Web, App. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/voucher_preactivation_request' + required: true + responses: + "200": + description: Successfully pre-activated voucher + content: + application/json: + schema: + $ref: '#/components/schemas/preactivation_response' + "400": + description: Invalid resquest + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_preactivation_request' + "452": + description: Invalid amount + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_amount' + "453": + description: Invalid currency + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_currency' + "454": + description: Invalid voucher group + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_voucher_group' + "455": + description: Voucher group exhausted + content: + application/json: + schema: + $ref: '#/components/schemas/voucher_group_exhausted' + "460": + description: Gov Stack Building Block does not exist + content: + application/json: + schema: + $ref: '#/components/schemas/GovStack_BB_does_not_exist' + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/internal_server_error' + "503": + description: Service Unavailable + content: + application/json: + schema: + $ref: '#/components/schemas/service_unavailable' + "599": + description: Network connection timeout error + content: + application/json: + schema: + $ref: '#/components/schemas/network_timeout_error' + /vouchers/voucher_activation: + patch: + tags: + - VoucherActivation + description: Request for voucher activation by sending the voucher serial number + operationId: VoucherActivationPATCH + parameters: + - name: X-Callback-URL + in: header + description: The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT. + required: false + style: simple + explode: false + schema: + type: string + format: uri + example: https://myserver.com/send/callback/here + - name: X-Date + in: header + description: Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API. + required: false + style: simple + explode: false + schema: + type: string + format: date-time + - name: X-CorrelationID + in: header + description: Header parameter to uniquely identify the request. Must be supplied as a UUID. + required: false + style: simple + explode: false + schema: + pattern: ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$ + type: string + - name: X-API-Key + in: header + description: Used to pass pre-shared client's API key to the server. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Bearer + in: header + description: Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Client-Id + in: header + description: Used to pass pre-shared client's identifier to the server. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + - name: X-Content-Hash + in: header + description: SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-1 + in: header + description: The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-2 + in: header + description: The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Channel + in: header + description: String containing the channel that was used to originate the request. For example USSD, Web, App. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Voucher_activate_request' + required: true + responses: + "200": + description: Successfully activated voucher + content: + application/json: + schema: + $ref: '#/components/schemas/activation_response' + "400": + description: Invalid resquest + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_activation_request' + "456": + description: Invalid voucher serial number + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_voucher_serial_number' + "460": + description: Gov Stack Building Block does not exist + content: + application/json: + schema: + $ref: '#/components/schemas/GovStack_BB_does_not_exist' + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/internal_server_error' + "503": + description: Service Unavailable + content: + application/json: + schema: + $ref: '#/components/schemas/service_unavailable' + "599": + description: Network connection timeout error + content: + application/json: + schema: + $ref: '#/components/schemas/network_timeout_error' + /vouchers/voucher_redeemption: + post: + tags: + - VoucherRedemption + description: Request for voucher redemption by sending the voucher number, the merchant name and merchant payment details + operationId: VoucherRedemptionPOST + parameters: + - name: X-Callback-URL + in: header + description: The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT. + required: false + style: simple + explode: false + schema: + type: string + format: uri + example: https://myserver.com/send/callback/here + - name: X-Date + in: header + description: Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API. + required: false + style: simple + explode: false + schema: + type: string + format: date-time + - name: X-CorrelationID + in: header + description: Header parameter to uniquely identify the request. Must be supplied as a UUID. + required: false + style: simple + explode: false + schema: + pattern: ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$ + type: string + - name: X-API-Key + in: header + description: Used to pass pre-shared client's API key to the server. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Bearer + in: header + description: Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Client-Id + in: header + description: Used to pass pre-shared client's identifier to the server. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + - name: X-Content-Hash + in: header + description: SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-1 + in: header + description: The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-2 + in: header + description: The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Channel + in: header + description: String containing the channel that was used to originate the request. For example USSD, Web, App. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Voucher_redeem_request' + required: true + responses: + "200": + description: Voucher is successfully redeemed + content: + application/json: + schema: + $ref: '#/components/schemas/redemption_response' + "400": + description: Invalid resquest + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_redemption_request' + "460": + description: Gov Stack Building Block does not exist + content: + application/json: + schema: + $ref: '#/components/schemas/GovStack_BB_does_not_exist' + "461": + description: Invalid voucher number + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_voucher_number' + "462": + description: Insufficient funds in funding a/c + content: + application/json: + schema: + $ref: '#/components/schemas/insufficient_funds' + "463": + description: Cannot credit merchant + content: + application/json: + schema: + $ref: '#/components/schemas/cannot_credit_merchant' + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/internal_server_error' + "503": + description: Service Unavailable + content: + application/json: + schema: + $ref: '#/components/schemas/service_unavailable' + "599": + description: Network connection timeout error + content: + application/json: + schema: + $ref: '#/components/schemas/network_timeout_error' + /vouchers/voucherstatuscheck/{voucherserialnumber}: + get: + tags: + - VoucherStatusCheck + description: Check the status of the Voucher. The API will respond with Not Preactivated, Preactivated, Activated, Active, Consumed, Blocked, Suspended and Purged. + operationId: VoucherStatusCheckGET + parameters: + - name: X-Callback-URL + in: header + description: The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT. + required: false + style: simple + explode: false + schema: + type: string + format: uri + example: https://myserver.com/send/callback/here + - name: voucherserialnumber + in: path + description: Voucher serial number to check status of + required: true + style: simple + explode: false + schema: + type: string + - name: X-Date + in: header + description: Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API. + required: false + style: simple + explode: false + schema: + type: string + format: date-time + - name: X-CorrelationID + in: header + description: Header parameter to uniquely identify the request. Must be supplied as a UUID. + required: false + style: simple + explode: false + schema: + pattern: ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$ + type: string + - name: X-API-Key + in: header + description: Used to pass pre-shared client's API key to the server. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Bearer + in: header + description: Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Client-Id + in: header + description: Used to pass pre-shared client's identifier to the server. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + - name: X-Content-Hash + in: header + description: SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-1 + in: header + description: The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-2 + in: header + description: The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Channel + in: header + description: String containing the channel that was used to originate the request. For example USSD, Web, App. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + responses: + "200": + description: Voucher status + content: + application/json: + schema: + $ref: '#/components/schemas/voucher_status' + "400": + description: Invalid request + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_validation_request' + "456": + description: Invalid voucher number + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_voucher_number' + "458": + description: Voucher number already used + content: + application/json: + schema: + $ref: '#/components/schemas/voucher_already_used' + "459": + description: Voucher has expired + content: + application/json: + schema: + $ref: '#/components/schemas/voucher_expired' + "460": + description: Gov Stack Building Block does not exist + content: + application/json: + schema: + $ref: '#/components/schemas/GovStack_BB_does_not_exist' + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/internal_server_error' + "503": + description: Service Unavailable + content: + application/json: + schema: + $ref: '#/components/schemas/service_unavailable' + "599": + description: Network connection timeout error + content: + application/json: + schema: + $ref: '#/components/schemas/network_timeout_error' + patch: + tags: + - VoucherCancellation + description: This operation cancels a specific voucher number. + operationId: VoucherCancelPATCH + parameters: + - name: X-Callback-URL + in: header + description: The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT. + required: false + style: simple + explode: false + schema: + type: string + format: uri + example: https://myserver.com/send/callback/here + - name: voucherserialnumber + in: path + description: Voucher serial number to check status of + required: true + style: simple + explode: false + schema: + type: string + - name: X-Date + in: header + description: Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API. + required: false + style: simple + explode: false + schema: + type: string + format: date-time + - name: X-CorrelationID + in: header + description: Header parameter to uniquely identify the request. Must be supplied as a UUID. + required: false + style: simple + explode: false + schema: + pattern: ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$ + type: string + - name: X-API-Key + in: header + description: Used to pass pre-shared client's API key to the server. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Bearer + in: header + description: Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Client-Id + in: header + description: Used to pass pre-shared client's identifier to the server. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + - name: X-Content-Hash + in: header + description: SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-1 + in: header + description: The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-User-Credential-2 + in: header + description: The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + - name: X-Channel + in: header + description: String containing the channel that was used to originate the request. For example USSD, Web, App. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/voucher_cancel_request' + required: true + responses: + "200": + description: Voucher cancelled + content: + application/json: + schema: + $ref: '#/components/schemas/voucher_cancelled' + "400": + description: Invalid request + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_validation_request' + "463": + description: Invalid voucher + content: + application/json: + schema: + $ref: '#/components/schemas/invalid_voucher' + "464": + description: Voucher is already cancelled + content: + application/json: + schema: + $ref: '#/components/schemas/already_cancelled' +components: + schemas: + voucher_preactivation_request: + required: + - Gov_Stack_BB + - voucher_amount + - voucher_currency + - voucher_group + type: object + properties: + voucher_amount: + maxLength: 23 + minLength: 1 + pattern: ^([0]|([1-9][0-9]{0,17}))([.][0-9]{0,3}[0-9])?$ + type: string + example: "15.21" + voucher_currency: + type: string + enum: + - AED + - AFN + - ALL + - AMD + - ANG + - AOA + - ARS + - AUD + - AWG + - AZN + - BAM + - BBD + - BDT + - BGN + - BHD + - BIF + - BMD + - BND + - BOB + - BOV + - BRL + - BSD + - BTN + - BWP + - BYN + - BZD + - CAD + - CDF + - CHE + - CHF + - CHW + - CLF + - CLP + - CNY + - COP + - COU + - CRC + - CUC + - CUP + - CVE + - CZK + - DJF + - DKK + - DOP + - DZD + - EGP + - ERN + - ETB + - EUR + - FJD + - FKP + - GBP + - GEL + - GHS + - GIP + - GMD + - GNF + - GTQ + - GYD + - HKD + - HNL + - HRK + - HTG + - HUF + - IDR + - ILS + - INR + - IQD + - IRR + - ISK + - JMD + - JOD + - JPY + - KES + - KGS + - KHR + - KMF + - KPW + - KRW + - KWD + - KYD + - KZT + - LAK + - LBP + - LKR + - LRD + - LSL + - LYD + - MAD + - MDL + - MGA + - MKD + - MMK + - MNT + - MOP + - MRO + - MUR + - MVR + - MWK + - MXN + - MXV + - MYR + - MZN + - NAD + - NGN + - NIO + - NOK + - NPR + - NZD + - OMR + - PAB + - PEN + - PGK + - PHP + - PKR + - PLN + - PYG + - QAR + - RON + - RSD + - RUB + - RWF + - SAR + - SBD + - SCR + - SDG + - SEK + - SGD + - SHP + - SLL + - SOS + - SRD + - SSP + - STD + - SVC + - SYP + - SZL + - THB + - TJS + - TMT + - TND + - TOP + - TRY + - TTD + - TWD + - TZS + - UAH + - UGX + - USD + - USN + - UYI + - UYU + - UZS + - VEF + - VND + - VUV + - WST + - XAF + - XAG + - XAU + - XBA + - XBB + - XBC + - XBD + - XCD + - XDR + - XOF + - XPD + - XPF + - XPT + - XSU + - XTS + - XUA + - XXX + - YER + - ZAR + - ZMW + - ZWL + voucher_group: + type: string + Gov_Stack_BB: + type: string + voucher_comment: + type: string + preactivation_response: + required: + - expiry_date_time + - voucher_number + - voucher_serial_number + properties: + voucher_number: + maxLength: 25 + minLength: 16 + type: string + description: This is a random secret number that uniquely identifies the value and validity of the voucher. + voucher_serial_number: + maxLength: 25 + minLength: 16 + type: string + description: This is a sequential number that is used to identify a voucher without necessarily revealing the voucher secret number. There is no relationship between the voucher serial number and the voucher number. + expiry_date_time: + type: string + format: date-time + invalid_preactivation_request: + required: + - message + type: object + properties: + message: + type: string + invalid_amount: + required: + - message + type: object + properties: + message: + type: string + invalid_currency: + required: + - message + type: object + properties: + message: + type: string + invalid_voucher_group: + required: + - message + type: object + properties: + message: + type: string + voucher_group_exhausted: + required: + - message + type: object + properties: + message: + type: string + GovStack_BB_does_not_exist: + required: + - message + type: object + properties: + message: + type: string + internal_server_error: + required: + - message + type: object + properties: + message: + type: string + service_unavailable: + required: + - message + type: object + properties: + message: + type: string + network_timeout_error: + required: + - message + type: object + properties: + message: + type: string + Voucher_activate_request: + required: + - Gov_Stack_BB + - voucher_serial_number + type: object + properties: + voucher_serial_number: + type: integer + format: int64 + Gov_Stack_BB: + type: string + activation_response: + required: + - result_status + properties: + result_status: + type: string + invalid_activation_request: + required: + - message + type: object + properties: + message: + type: string + invalid_voucher_serial_number: + required: + - message + type: object + properties: + message: + type: string + Voucher_redeem_request: + required: + - Gov_Stack_BB + - merchant_bank_details + - merchant_name + - merchant_voucher_group + - override + - voucher_number + type: object + properties: + voucher_number: + type: integer + format: int64 + Gov_Stack_BB: + type: string + merchant_name: + type: string + merchant_bank_details: + type: string + merchant_voucher_group: + type: string + override: + type: boolean + redemption_response: + required: + - result_status + properties: + result_status: + type: string + invalid_redemption_request: + required: + - message + type: object + properties: + message: + type: string + invalid_voucher_number: + required: + - message + type: object + properties: + message: + type: string + cannot_credit_merchant: + required: + - message + type: object + properties: + message: + type: string + insufficient_funds: + required: + - message + type: object + properties: + message: + type: string + voucher_status: + properties: + voucher_status: + type: string + enum: + - Not Pre-Activated + - Pre-Activated + - Activated + - Suspended + - Blocked + - Purged + - Not Existing + voucher_amount: + type: string + invalid_validation_request: + type: object + properties: + message: + type: string + voucher_already_used: + required: + - message + type: object + properties: + message: + type: string + voucher_expired: + required: + - message + type: object + properties: + message: + type: string + invalid_voucher: + required: + - message + type: object + properties: + message: + type: string + already_cancelled: + required: + - message + type: object + properties: + message: + type: string + voucher_cancel_request: + required: + - Gov_Stack_BB + - voucherserialnumber + type: object + properties: + voucherserialnumber: + type: string + Gov_Stack_BB: + type: string + voucher_cancelled: + required: + - message + type: object + properties: + message: + type: string + parameters: + voucherserialnumber: + name: voucherserialnumber + in: path + description: Voucher serial number to check status of + required: true + style: simple + explode: false + schema: + type: string + X-CorrelationID: + name: X-CorrelationID + in: header + description: Header parameter to uniquely identify the request. Must be supplied as a UUID. + required: false + style: simple + explode: false + schema: + pattern: ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$ + type: string + X-Date: + name: X-Date + in: header + description: Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API. + required: false + style: simple + explode: false + schema: + type: string + format: date-time + X-API-Key: + name: X-API-Key + in: header + description: Used to pass pre-shared client's API key to the server. + required: false + style: simple + explode: false + schema: + type: string + X-User-Bearer: + name: X-User-Bearer + in: header + description: Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication. + required: false + style: simple + explode: false + schema: + type: string + X-Client-Id: + name: X-Client-Id + in: header + description: Used to pass pre-shared client's identifier to the server. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + X-Content-Hash: + name: X-Content-Hash + in: header + description: SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed. + required: false + style: simple + explode: false + schema: + type: string + X-User-Credential-1: + name: X-User-Credential-1 + in: header + description: The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + X-User-Credential-2: + name: X-User-Credential-2 + in: header + description: The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + required: false + style: simple + explode: false + schema: + type: string + X-Channel: + name: X-Channel + in: header + description: String containing the channel that was used to originate the request. For example USSD, Web, App. + required: false + style: simple + explode: false + schema: + maxLength: 256 + type: string + X-Callback-URL: + name: X-Callback-URL + in: header + description: The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT. + required: false + style: simple + explode: false + schema: + type: string + format: uri + example: https://myserver.com/send/callback/here + securitySchemes: + app_id: + type: apiKey + description: API key to authorize request + name: appid + in: query From f9bc672cf6042b163b3567c3a126e1a4a8f78283 Mon Sep 17 00:00:00 2001 From: AKibuuka <43401148+AKibuuka@users.noreply.github.com> Date: Tue, 19 Apr 2022 00:43:27 +0200 Subject: [PATCH 3/4] Update Payee-Initiated Merchant Payment.yaml --- .../Payee-Initiated Merchant Payment.yaml | 4437 +++++++++++++---- 1 file changed, 3336 insertions(+), 1101 deletions(-) diff --git a/Payments/APIS/Payee-Initiated Merchant Payment.yaml b/Payments/APIS/Payee-Initiated Merchant Payment.yaml index 309919f..79ff486 100644 --- a/Payments/APIS/Payee-Initiated Merchant Payment.yaml +++ b/Payments/APIS/Payee-Initiated Merchant Payment.yaml @@ -1,1323 +1,3558 @@ ---- openapi: 3.0.0 info: - title: GovStack Payment BB Voucher Management APIs for external BB description: | - This schema is part of the Govstack Payments Building Block. - contact: - email: oscar.correia@maarifaeducation.com - version: 1.0.3 + The purpose of this document is to specify the endpoints, fields, objects, and enumerations for Merchant Payment Mobile Money APIs, which are a subset of the GSMA Mobile Money API Specification. + The Merchant Payment Mobile Money APIs allow merchants to accept payments from mobile money customers. Supported payment mechanisms include: + + - Payee-initiated merchant payment. The merchant initiates the payment and the payer is requested to authenticate to confirm acceptance by the mobile money provider. + + - Payer-initiated merchant payment. The payer initiates the payment by specifying the merchant that is to be paid. + + - Merchant payment via pre-authorised payment code. The payer generates a payment authorisation code up to a maximum payment amount. The merchant then enters or scans (if rendered as a QR code) the payer’s code to perform the payment. + + Closed loop and open-loop merchant payments are supported by the Mobile Money API. Closed loop merchant payments occur where the payer and payee accounts reside with the same mobile money provider. + Open loop payments occur where the payer and payee accounts reside with different mobile money providers. + + You can find out more about what the API can do for your business at [https://developer.mobilemoneyapi.io]. + version: "1.2.0" + title: Mobile Money API for Merchant Payments servers: -- url: https://virtserver.swaggerhub.com/VMS-API2/VMS-API2-GS_P_VMS_API-1.0.2/1.0.3 - description: SwaggerHub API Auto Mocking -- url: https://virtserver.swaggerhub.com/GovStack/PaymentBuildingBlock/v1.0.1 -security: -- app_id: [] + - description: This url points to the GSMA Mobile Money API v1.2 Simulator. + url: https://sandbox.mobilemoneyapi.io/simulator/v1.2/passthrough/mm tags: -- name: VoucherPreactivation - description: | - The **VoucherPreactivation** API is used by a non Payment Building Blocks in the GovStack Framework to request for a voucher to be used. This call reserves the voucher (for a period of time, which is to be implemented). This API requests a single voucher from the voucher server that can be used for a future redemption process. The caller sends an amount, a voucher group (depending on the use case), the currency and the name of the calling GovStack Building Block. If the API call is successful, the Payment Building Block will respond with a voucher number, a voucher serial number and an expiry date. -- name: VoucherActivation - description: | - The **VoucherActivation** API is used by a non Payment Building Blocks in the GovStack Framework to activate a pre-activated voucher. This is second function call is intended to ensure that the voucher is only activated when it is disbursed. This API requests for the activation of a voucher when the caller sends the voucher number to be activated. If the API call is successful, the activation is confirmed and the voucher can now be used by the beneficiary. -- name: VoucherRedemption - description: | - The **VoucherRedemption** API is used by a non Payment Building Blocks in the GovStack Framework to redeem a voucher. The calling Building Block will capture the voucher number and the voucher serial number from the merchant point. The external Building Block will also acquire the merchant name and payment details from the merchant registry. The calling Building Block will then send the voucher number, the voucher serial number, the merchant name and payment details. The Payment Building Block will verify that the voucher has been activated and has not been used or blocked or cancelled. If so, the Payment Building Block will then send a payment request to the funding agency / FSP. The Payment Gateway of the Payments Building Block will facilitate the debit of the funding account, and the credit of the merchant as well as handle any intermediary fees. Once the payment has been successfully done the Payment Building Block will mark the voucher as consumed and notify the merchant (and beneficiary if possible). -- name: VoucherStatusCheck - description: | - The **VoucherStatus** API is used by a non Payment Building Blocks in the GovStack Framework to check the status of a voucher. The calling Building Block will capture the voucher number and send it to the Payments Building Block to determine the status of a voucher. The Payments Building will respond with one of the status of Pre-Activated, Activated, Suspended, Blocked or Not Existing. -- name: VoucherCancellation - description: "The **VocuherCancellation** API is used by a non Payment Building Blocks in the GovStack Framework to cancel a voucher. The calling Building Block will capture the voucher number and send it to the Payments Building Block to canel the voucher. The Payments Building Block will respond with a status of Cancelled, Already Cancelled or Not existing. The VoucherCancellation will override the Blocked status and render the voucher permanently unusable. \n" + - name: Transactions + description: | + Payer-initiated and payee-initiated merchant payments can be created and viewed using **Transactions** APIs. + - name: Accounts + description: | + Using the **Accounts** APIs, merchants can view payments for their account and view their account balance. + + **Identifying a Target Account** + + Two methods are provided for identifying an account, the single identifier method and the multiple identifiers method. + + Single Identifier Method: + + - In the scenario where one identifier suffices to uniquely identify an account, the following path is to be used: **/accounts/{identifierType}/{identifier}**. + + Multiple Identifiers Method: + + - Where a single identifier is not sufficient to identify an account, the following path is to be used: ' **/accounts/{accountIdentifier1}@{value1}${accountIdentifier2}@{value2}${accountIdentifier3}@{value3}**'. The list of permitted account identifiers supported by the Mobile Money API can be found in the API documentation. As there can be multiple identifiers required to identify the target account, the path uses a '$' delimiter to separate each identifier, up to a limit of three account identifiers. + - name: Authorisation Codes + description: | + The **Authorisation** Codes APIs allow a payer to generate a payment code which when presented to the payee, can be redeemed for an amount associated with the code. + Authorisation codes can be set to expire. Note that expiry time can be specified via the API, however the mobile money provider + may mandate a common expiry period for all codes. + Authorisation Codes can be used for pre-authorised codes for merchant payments. The customer generates a code which can be redeemed at a merchant. + - name: Supporting + description: | + Supporting APIs consist of the following: + + - **Heartbeat API:** Used for monitoring purposes and establishes whether the system of an API provider is in a state that enables a client to submit a request for processing within established SLAs. + - **Request State API** : Used to determine the state of an asynchronous request. + - **Responses API** : In some circumstances, the client may not have received the final representation of the resource for which it attempted to create or update. The **Responses** API allows a client to identify and retrieve the final representation of the resource assuming that the resource was created. paths: - /vouchers/voucher_preactivation: + # Transactions APIs. These support creation and viewing of financial transactions in singular and bulk. + + /transactions/type/{transactionType}: post: tags: - - VoucherPreactivation - description: Requests for voucher number, voucher serial number and expiry date by sending voucher group, amount and currency - operationId: VoucherPreactivationPOST + - Transactions + summary: Create a Transaction + description: Provided with a valid object representation, this endpoint allows + for a new transaction to be created for a given transaction type passed via the URL. + operationId: "transactionstypetransactionTypePUT" parameters: - - name: X-Callback-URL - in: header - description: The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT. - required: false - style: simple - explode: false - schema: - type: string - format: uri - example: https://myserver.com/send/callback/here - - name: X-Date - in: header - description: Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API. - required: false - style: simple - explode: false - schema: - type: string - format: date-time - - name: X-CorrelationID - in: header - description: Header parameter to uniquely identify the request. Must be supplied as a UUID. - required: false - style: simple - explode: false - schema: - pattern: ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$ - type: string - - name: X-API-Key - in: header - description: Used to pass pre-shared client's API key to the server. - required: false - style: simple - explode: false - schema: - type: string - - name: X-User-Bearer - in: header - description: Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication. - required: false - style: simple - explode: false - schema: - type: string - - name: X-Client-Id - in: header - description: Used to pass pre-shared client's identifier to the server. - required: false - style: simple - explode: false - schema: - maxLength: 256 - type: string - - name: X-Content-Hash - in: header - description: SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed. - required: false - style: simple - explode: false - schema: - type: string - - name: X-User-Credential-1 - in: header - description: The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. - required: false - style: simple - explode: false - schema: - type: string - - name: X-User-Credential-2 - in: header - description: The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. - required: false - style: simple - explode: false - schema: - type: string - - name: X-Channel - in: header - description: String containing the channel that was used to originate the request. For example USSD, Web, App. - required: false - style: simple - explode: false - schema: - maxLength: 256 - type: string + - $ref: '#/components/parameters/transactionTypePath' + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-User-Credential-1' + - $ref: '#/components/parameters/X-User-Credential-2' + - $ref: '#/components/parameters/X-Channel' + - $ref: '#/components/parameters/X-Callback-URL' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier-Type' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier' requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/voucher_preactivation_request' - required: true + $ref: '#/components/requestBodies/requestTransactionType' + callbacks: + transactionsSuccessEvent: + '{$request.header.X-Callback-URL}': # This is the callback URL provided by the client in the request header + put: + summary: Transaction Success Callback + description: This callback communicates the final representation of the transaction requested by the client. + The client endpoint is identified from the X-Callback-URL supplied in the POST request header. + operationId: "transactionsTransactionTypeSuccessPUT" + parameters: + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + requestBody: + $ref: '#/components/requestBodies/updateTransaction' # The callback consists of the same body as a synchronous /transactions response + responses: + 204: + description: Your server returns this code if it accepts the callback + 400: + description: Your server returns this code if it rejects the callback due to a violation of a business rule + 401: + description: Your server returns this code if it rejects the callback due to an authorisation failure + 404: + description: Your server returns this code if it rejects the callback due to a failure to identify the target resource + 500: + description: Your server returns this code if it rejects the callback due to general server-side issue + 503: + description: Your server returns this code if it rejects the callback due to systems unavailability + transactionsFailureEvent: + '{$request.header.X-Callback-URL}': # This is the callback URL provided by the client in the request header + put: + summary: Transaction Failure Callback + description: This callback communicates the information regarding a transaction failure in the form of an error object. + The client endpoint is identified from the X-Callback-URL supplied in the POST request header. + operationId: "transactionsTransactionTypeFailurePUT" + parameters: + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + requestBody: + $ref: '#/components/requestBodies/updateError' # The callback returns the error object in the event of failure + responses: + 204: + description: Your server returns this code if it accepts the callback + 400: + description: Your server returns this code if it rejects the callback due to a violation of a business rule + 401: + description: Your server returns this code if it rejects the callback due to an authorisation failure + 404: + description: Your server returns this code if it rejects the callback due to a failure to identify the target resource + 500: + description: Your server returns this code if it rejects the callback due to general server-side issue + 503: + description: Your server returns this code if it rejects the callback due to systems unavailability responses: - "200": - description: Successfully pre-activated voucher + 201: + description: Represents a Transaction response content: application/json: schema: - $ref: '#/components/schemas/preactivation_response' - "400": - description: Invalid resquest + $ref: "#/components/schemas/responseTransactionType" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 202: + description: Represents an Asynchronous response content: application/json: schema: - $ref: '#/components/schemas/invalid_preactivation_request' - "452": - description: Invalid amount + $ref: "#/components/schemas/requestStateObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 400: + description: Represents an Error Caused by the Violation of a Business Rule content: application/json: schema: - $ref: '#/components/schemas/invalid_amount' - "453": - description: Invalid currency + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure content: application/json: schema: - $ref: '#/components/schemas/invalid_currency' - "454": - description: Invalid voucher group + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource content: application/json: schema: - $ref: '#/components/schemas/invalid_voucher_group' - "455": - description: Voucher group exhausted + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + /transactions/{transactionReference}: + parameters: + - $ref: '#/components/parameters/transactionReference' + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-User-Credential-1' + - $ref: '#/components/parameters/X-User-Credential-2' + - $ref: '#/components/parameters/X-Channel' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier-Type' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier' + get: + tags: + - Transactions + summary: View A Transaction + description: This endpoint returns the details of a transaction + operationId: "transactionsTransactionReferenceGET" + responses: + 200: + description: Represents a Transaction response content: application/json: schema: - $ref: '#/components/schemas/voucher_group_exhausted' - "460": - description: Gov Stack Building Block does not exist + $ref: "#/components/schemas/responseTransaction" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 400: + description: Represents an Error Caused by the Violation of a Business Rule content: application/json: schema: - $ref: '#/components/schemas/GovStack_BB_does_not_exist' - "500": - description: Internal Server Error + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure content: application/json: schema: - $ref: '#/components/schemas/internal_server_error' - "503": - description: Service Unavailable + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource content: application/json: schema: - $ref: '#/components/schemas/service_unavailable' - "599": - description: Network connection timeout error + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue content: application/json: schema: - $ref: '#/components/schemas/network_timeout_error' - /vouchers/voucher_activation: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' patch: tags: - - VoucherActivation - description: Request for voucher activation by sending the voucher serial number - operationId: VoucherActivationPATCH + - Transactions + summary: Update A Transaction + description: This endpoint allows the transactionStatus of a transaction to be updated. + operationId: "transactionsTransactionReferencePATCH" parameters: - - name: X-Callback-URL - in: header - description: The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT. - required: false - style: simple - explode: false - schema: - type: string - format: uri - example: https://myserver.com/send/callback/here - - name: X-Date - in: header - description: Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API. - required: false - style: simple - explode: false - schema: - type: string - format: date-time - - name: X-CorrelationID - in: header - description: Header parameter to uniquely identify the request. Must be supplied as a UUID. - required: false - style: simple - explode: false - schema: - pattern: ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$ - type: string - - name: X-API-Key - in: header - description: Used to pass pre-shared client's API key to the server. - required: false - style: simple - explode: false - schema: - type: string - - name: X-User-Bearer - in: header - description: Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication. - required: false - style: simple - explode: false - schema: - type: string - - name: X-Client-Id - in: header - description: Used to pass pre-shared client's identifier to the server. - required: false - style: simple - explode: false - schema: - maxLength: 256 - type: string - - name: X-Content-Hash - in: header - description: SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed. - required: false - style: simple - explode: false - schema: - type: string - - name: X-User-Credential-1 - in: header - description: The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. - required: false - style: simple - explode: false - schema: - type: string - - name: X-User-Credential-2 - in: header - description: The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. - required: false - style: simple - explode: false - schema: - type: string - - name: X-Channel - in: header - description: String containing the channel that was used to originate the request. For example USSD, Web, App. - required: false - style: simple - explode: false - schema: - maxLength: 256 - type: string + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-Callback-URL' requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/Voucher_activate_request' - required: true + $ref: '#/components/requestBodies/genericPatch' + callbacks: + transactionsUpdateSuccessEvent: + '{$request.header.X-Callback-URL}': # This is the callback URL provided by the client in the request header + put: + summary: Transactions Update Success Callback + description: This callback communicates a simple message to communicate that the transaction update completed successfully. + operationId: "transactionsTransactionsUpdatePUT" + parameters: + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + requestBody: + $ref: '#/components/requestBodies/genericUpdateSuccess' + responses: + 204: + description: Your server returns this code if it accepts the callback + 400: + description: Your server returns this code if it rejects the callback due to a violation of a business rule + 401: + description: Your server returns this code if it rejects the callback due to an authorisation failure + 404: + description: Your server returns this code if it rejects the callback due to a failure to identify the target resource + 500: + description: Your server returns this code if it rejects the callback due to general server-side issue + 503: + description: Your server returns this code if it rejects the callback due to systems unavailability + transactionsUpdateFailureEvent: + '{$request.header.X-Callback-URL}': # This is the callback URL provided by the client in the request header + put: + summary: Transaction Update Failure Callback + description: This callback communicates the information regarding a failure to update a transaction in the form of an error object. + The client endpoint is identified from the X-Callback-URL supplied in the POST request header. + operationId: "transactionsTransactionsUpdateFailurePUT" + parameters: + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + requestBody: + $ref: '#/components/requestBodies/updateError' # The callback returns the error object in the event of failure + responses: + 204: + description: Your server returns this code if it accepts the callback + 400: + description: Your server returns this code if it rejects the callback due to a violation of a business rule + 401: + description: Your server returns this code if it rejects the callback due to an authorisation failure + 404: + description: Your server returns this code if it rejects the callback due to a failure to identify the target resource + 500: + description: Your server returns this code if it rejects the callback due to general server-side issue + 503: + description: Your server returns this code if it rejects the callback due to systems unavailability + responses: + 202: + description: Represents an Asynchronous response + content: + application/json: + schema: + $ref: "#/components/schemas/requestStateObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 204: + description: An empty response is returned for a synchronous successful patch. + 400: + description: Represents an Error Caused by the Violation of a Business Rule + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + /transactions/{transactionReference}/reversals: + post: + tags: + - Transactions + summary: Create A Reversal + description: Provided with a valid object representation, this endpoint allows for a new reversal to be created + operationId: "transactionsTransactionReferenceReversalsPOST" + parameters: + - $ref: '#/components/parameters/transactionReference' + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-User-Credential-1' + - $ref: '#/components/parameters/X-User-Credential-2' + - $ref: '#/components/parameters/X-Channel' + - $ref: '#/components/parameters/X-Callback-URL' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier-Type' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier' + requestBody: + $ref: '#/components/requestBodies/requestReversal' + callbacks: + reversalsSuccessEvent: + '{$request.header.X-Callback-URL}': # This is the callback URL provided by the client in the request header + put: + summary: Reversal Callback + description: This callback communicates the final representation of the reversal requested by the client. + The client endpoint is identified from the X-Callback-URL supplied in the POST request header. + operationId: "transactionsTransactionReferenceReversalsSuccessPUT" + parameters: + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + requestBody: + $ref: '#/components/requestBodies/updateReversal' # The callback consists of the same body as a synchronous /reversals response + responses: + 204: + description: Your server returns this code if it accepts the callback + 400: + description: Your server returns this code if it rejects the callback due to a violation of a business rule + 401: + description: Your server returns this code if it rejects the callback due to an authorisation failure + 404: + description: Your server returns this code if it rejects the callback due to a failure to identify the target resource + 500: + description: Your server returns this code if it rejects the callback due to general server-side issue + 503: + description: Your server returns this code if it rejects the callback due to systems unavailability + reversalsFailureEvent: + '{$request.header.X-Callback-URL}': # This is the callback URL provided by the client in the request header + put: + summary: Reversal Failure Callback + description: This callback communicates the information regarding a transaction failure in the form of an error object. + The client endpoint is identified from the X-Callback-URL supplied in the POST request header. + operationId: "transactionsTransactionReferenceReversalfailurePUT" + parameters: + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + requestBody: + $ref: '#/components/requestBodies/updateError' # The callback returns the error object in the event of failure + responses: + 204: + description: Your server returns this code if it accepts the callback + 400: + description: Your server returns this code if it rejects the callback due to a violation of a business rule + 401: + description: Your server returns this code if it rejects the callback due to an authorisation failure + 404: + description: Your server returns this code if it rejects the callback due to a failure to identify the target resource + 500: + description: Your server returns this code if it rejects the callback due to general server-side issue + 503: + description: Your server returns this code if it rejects the callback due to systems unavailability + responses: + 201: + description: Represents a Transaction Reversal response + content: + application/json: + schema: + $ref: "#/components/schemas/responseReversal" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 202: + description: Represents an Asynchronous response + content: + application/json: + schema: + $ref: "#/components/schemas/requestStateObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 400: + description: Represents an Error Caused by the Violation of a Business Rule + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + + # Accounts APIs. These support viewing of account-related information. + + /accounts/{accountId}/balance: + get: + tags: + - Accounts + summary: View Account Balance + description: This endpoint returns the balance of an account + operationId: "accountsAccountIdBalanceGET" + parameters: + - $ref: '#/components/parameters/accountId' + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-User-Credential-1' + - $ref: '#/components/parameters/X-User-Credential-2' + - $ref: '#/components/parameters/X-Channel' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier-Type' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier' + responses: + 200: + description: Represents an Account Balance response + content: + application/json: + schema: + $ref: "#/components/schemas/responseAccountBalance" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 400: + description: Represents an Error Caused by the Violation of a Business Rule + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + /accounts/{identifierType}/{identifier}/balance: + get: + tags: + - Accounts + summary: View Account Balance + description: This endpoint returns the balance of an account. + operationId: "accountsIdentifierTypeIdentifierBalanceGET" + parameters: + - $ref: '#/components/parameters/identifierType' + - $ref: '#/components/parameters/identifier' + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-User-Credential-1' + - $ref: '#/components/parameters/X-User-Credential-2' + - $ref: '#/components/parameters/X-Channel' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier-Type' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier' + responses: + 200: + description: Represents an Account Balance response + content: + application/json: + schema: + $ref: "#/components/schemas/responseAccountBalance" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 400: + description: Represents an Error Caused by the Violation of a Business Rule + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + /accounts/balance: + get: + tags: + - Accounts + summary: View Account Balance + description: This endpoint returns the balance of an account. As the account is not passed as a parameter, the account is assumed to be that of the calling client. + operationId: "accountsBalanceGET" + parameters: + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-User-Credential-1' + - $ref: '#/components/parameters/X-User-Credential-2' + - $ref: '#/components/parameters/X-Channel' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier-Type' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier' + responses: + 200: + description: Represents an Account Balance response + content: + application/json: + schema: + $ref: "#/components/schemas/responseAccountBalance" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 400: + description: Represents an Error Caused by the Violation of a Business Rule + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + /accounts/{accountId}/transactions: + get: + tags: + - Accounts + summary: View Account Specific Transaction + description: This endpoint returns transactions linked to a specific account + operationId: "accountsAccountIdTransactionsGET" + parameters: + - $ref: '#/components/parameters/accountId' + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-User-Credential-1' + - $ref: '#/components/parameters/X-User-Credential-2' + - $ref: '#/components/parameters/X-Channel' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier-Type' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier' + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/offset' + - $ref: '#/components/parameters/fromDateTime' + - $ref: '#/components/parameters/toDateTime' + - $ref: '#/components/parameters/transactionStatus' + - $ref: '#/components/parameters/transactionTypeQuery' + responses: - "200": - description: Successfully activated voucher + 200: + description: Represent a list of Transactions + content: + application/json: + schema: + type: "array" + items: + $ref: "#/components/schemas/responseTransaction" + minItems: 0 + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 'X-Records-Available-Count': + $ref: '#/components/headers/X-Records-Available-Count' + 'X-Records-Returned-Count': + $ref: '#/components/headers/X-Records-Returned-Count' + 400: + description: Represents an Error Caused by the Violation of a Business Rule content: application/json: schema: - $ref: '#/components/schemas/activation_response' - "400": - description: Invalid resquest + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure content: application/json: schema: - $ref: '#/components/schemas/invalid_activation_request' - "456": - description: Invalid voucher serial number + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource content: application/json: schema: - $ref: '#/components/schemas/invalid_voucher_serial_number' - "460": - description: Gov Stack Building Block does not exist + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue content: application/json: schema: - $ref: '#/components/schemas/GovStack_BB_does_not_exist' - "500": - description: Internal Server Error + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability content: application/json: schema: - $ref: '#/components/schemas/internal_server_error' - "503": - description: Service Unavailable + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + /accounts/{identifierType}/{identifier}/transactions: + get: + tags: + - Accounts + summary: View Account Specific Transaction + description: This endpoint returns transactions linked to a specific account. + operationId: "accountsIdentifierTypeIdentifierTransactionsGET" + parameters: + - $ref: '#/components/parameters/identifierType' + - $ref: '#/components/parameters/identifier' + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-User-Credential-1' + - $ref: '#/components/parameters/X-User-Credential-2' + - $ref: '#/components/parameters/X-Channel' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier-Type' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier' + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/offset' + - $ref: '#/components/parameters/fromDateTime' + - $ref: '#/components/parameters/toDateTime' + - $ref: '#/components/parameters/transactionStatus' + - $ref: '#/components/parameters/transactionTypeQuery' + responses: + 200: + description: Represent a list of Transactions content: application/json: schema: - $ref: '#/components/schemas/service_unavailable' - "599": - description: Network connection timeout error + type: "array" + items: + $ref: "#/components/schemas/responseTransaction" + minItems: 0 + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 'X-Records-Available-Count': + $ref: '#/components/headers/X-Records-Available-Count' + 'X-Records-Returned-Count': + $ref: '#/components/headers/X-Records-Returned-Count' + 400: + description: Represents an Error Caused by the Violation of a Business Rule content: application/json: schema: - $ref: '#/components/schemas/network_timeout_error' - /vouchers/voucher_redeemption: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + + # Authorisation Codes APIs. These support creation, modification and viewing of authorisation codes. + + /accounts/{accountId}/authorisationcodes: post: tags: - - VoucherRedemption - description: Request for voucher redemption by sending the voucher number, the merchant name and merchant payment details - operationId: VoucherRedemptionPOST + - Authorisation Codes + summary: Create an Authorisation Code + description: this endpoint allows allows a mobile money payer or payee to generate a code which + when presented to the other party, can be redeemed for an amount set by the payer or payee, depending upon the use case + operationId: "accountsAccountIdAuthorisationcodesPOST" parameters: - - name: X-Callback-URL - in: header - description: The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT. - required: false - style: simple - explode: false - schema: - type: string - format: uri - example: https://myserver.com/send/callback/here - - name: X-Date - in: header - description: Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API. - required: false - style: simple - explode: false - schema: - type: string - format: date-time - - name: X-CorrelationID - in: header - description: Header parameter to uniquely identify the request. Must be supplied as a UUID. - required: false - style: simple - explode: false - schema: - pattern: ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$ - type: string - - name: X-API-Key - in: header - description: Used to pass pre-shared client's API key to the server. - required: false - style: simple - explode: false - schema: - type: string - - name: X-User-Bearer - in: header - description: Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication. - required: false - style: simple - explode: false - schema: - type: string - - name: X-Client-Id - in: header - description: Used to pass pre-shared client's identifier to the server. - required: false - style: simple - explode: false - schema: - maxLength: 256 - type: string - - name: X-Content-Hash - in: header - description: SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed. - required: false - style: simple - explode: false - schema: - type: string - - name: X-User-Credential-1 - in: header - description: The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. - required: false - style: simple - explode: false - schema: - type: string - - name: X-User-Credential-2 - in: header - description: The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. - required: false - style: simple - explode: false - schema: - type: string - - name: X-Channel - in: header - description: String containing the channel that was used to originate the request. For example USSD, Web, App. - required: false - style: simple - explode: false - schema: - maxLength: 256 - type: string + - $ref: '#/components/parameters/accountId' + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-User-Credential-1' + - $ref: '#/components/parameters/X-User-Credential-2' + - $ref: '#/components/parameters/X-Channel' + - $ref: '#/components/parameters/X-Callback-URL' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier-Type' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier' requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/Voucher_redeem_request' - required: true + $ref: '#/components/requestBodies/requestAuthorisationCode' + callbacks: + authorisationCodesSuccessEvent: + '{$request.header.X-Callback-URL}': # This is the callback URL provided by the client in the request header + put: + summary: Authorisation Codes Success Callback + description: This callback communicates the final representation of the Authorisation Code requested by the client. + The client endpoint is identified from the X-Callback-URL supplied in the POST request header. + operationId: "authorisationCodesAccountIdSuccessPUT" + parameters: + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + requestBody: + $ref: '#/components/requestBodies/updateAuthorisationCode' # The callback consists of the same body as a synchronous /authorisationcodes response + responses: + 204: + description: Your server returns this code if it accepts the callback + 400: + description: Your server returns this code if it rejects the callback due to a violation of a business rule + 401: + description: Your server returns this code if it rejects the callback due to an authorisation failure + 404: + description: Your server returns this code if it rejects the callback due to a failure to identify the target resource + 500: + description: Your server returns this code if it rejects the callback due to general server-side issue + 503: + description: Your server returns this code if it rejects the callback due to systems unavailability + authorisationCodesFailureEvent: + '{$request.header.X-Callback-URL}': # This is the callback URL provided by the client in the request header + put: + summary: Authorisation Codes Failure Callback + description: This callback communicates the information regarding a failure to receive an authorisation code in the form of an error object. + The client endpoint is identified from the X-Callback-URL supplied in the POST request header. + operationId: "authorisationCodesAccountIdFailurePUT" + parameters: + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + requestBody: + $ref: '#/components/requestBodies/updateError' # The callback returns the error object in the event of failure + responses: + 204: + description: Your server returns this code if it accepts the callback + 400: + description: Your server returns this code if it rejects the callback due to a violation of a business rule + 401: + description: Your server returns this code if it rejects the callback due to an authorisation failure + 404: + description: Your server returns this code if it rejects the callback due to a failure to identify the target resource + 500: + description: Your server returns this code if it rejects the callback due to general server-side issue + 503: + description: Your server returns this code if it rejects the callback due to systems unavailability + responses: + 201: + description: Represents an Authorisation Code response + content: + application/json: + schema: + $ref: "#/components/schemas/responseAuthorisationCode" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 202: + description: Represents an Asynchronous response + content: + application/json: + schema: + $ref: "#/components/schemas/requestStateObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 400: + description: Represents an Error Caused by the Violation of a Business Rule + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + get: + tags: + - Authorisation Codes + summary: View Authorisation Codes for a given account + description: This endpoint allows allows a mobile money payer or payee to view authorisation codes for a given account. + operationId: "accountsAccountIdAuthorisationcodesGET" + parameters: + - $ref: '#/components/parameters/accountId' + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-User-Credential-1' + - $ref: '#/components/parameters/X-User-Credential-2' + - $ref: '#/components/parameters/X-Channel' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier-Type' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier' + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/offset' + - $ref: '#/components/parameters/fromDateTime' + - $ref: '#/components/parameters/toDateTime' + - $ref: '#/components/parameters/codeState' responses: - "200": - description: Voucher is successfully redeemed + 200: + description: Represents an authorisation codes response content: application/json: schema: - $ref: '#/components/schemas/redemption_response' - "400": - description: Invalid resquest + $ref: "#/components/schemas/responseAuthorisationCode" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 'X-Records-Available-Count': + $ref: '#/components/headers/X-Records-Available-Count' + 'X-Records-Returned-Count': + $ref: '#/components/headers/X-Records-Returned-Count' + 400: + description: Represents an Error Caused by the Violation of a Business Rule content: application/json: schema: - $ref: '#/components/schemas/invalid_redemption_request' - "460": - description: Gov Stack Building Block does not exist + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure content: application/json: schema: - $ref: '#/components/schemas/GovStack_BB_does_not_exist' - "461": - description: Invalid voucher number + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource content: application/json: schema: - $ref: '#/components/schemas/invalid_voucher_number' - "462": - description: Insufficient funds in funding a/c + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue content: application/json: schema: - $ref: '#/components/schemas/insufficient_funds' - "463": - description: Cannot credit merchant + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability content: application/json: schema: - $ref: '#/components/schemas/cannot_credit_merchant' - "500": - description: Internal Server Error + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + /accounts/{identifierType}/{identifier}/authorisationcodes: + post: + tags: + - Authorisation Codes + summary: Create an Authorisation Code via an account identifier. + description: This endpoint allows allows a mobile money payer or payee to generate a code which + when presented to the other party, can be redeemed for an amount set by the payer or payee, depending upon the use case. + operationId: "accountsIdentifierTypeIdentifierAuthorisationCodesPOST" + parameters: + - $ref: '#/components/parameters/identifierType' + - $ref: '#/components/parameters/identifier' + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-User-Credential-1' + - $ref: '#/components/parameters/X-User-Credential-2' + - $ref: '#/components/parameters/X-Channel' + - $ref: '#/components/parameters/X-Callback-URL' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier-Type' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier' + requestBody: + $ref: '#/components/requestBodies/requestAuthorisationCode' + callbacks: + authorisationCodesSuccessEvent: + '{$request.header.X-Callback-URL}': # This is the callback URL provided by the client in the request header + put: + summary: Authorisation Codes Success Callback + description: This callback communicates the final representation of the Authorisation Code requested by the client. + The client endpoint is identified from the X-Callback-URL supplied in the POST request header. + operationId: "authorisationCodesIdentifierTypeIdentifierSuccessPUT" + parameters: + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + requestBody: + $ref: '#/components/requestBodies/updateAuthorisationCode' # The callback consists of the same body as a synchronous /authorisationcodes response + responses: + 204: + description: Your server returns this code if it accepts the callback + 400: + description: Your server returns this code if it rejects the callback due to a violation of a business rule + 401: + description: Your server returns this code if it rejects the callback due to an authorisation failure + 404: + description: Your server returns this code if it rejects the callback due to a failure to identify the target resource + 500: + description: Your server returns this code if it rejects the callback due to general server-side issue + 503: + description: Your server returns this code if it rejects the callback due to systems unavailability + authorisationCodesFailureEvent: + '{$request.header.X-Callback-URL}': # This is the callback URL provided by the client in the request header + put: + summary: Authorisation Codes Failure Callback + description: This callback communicates the information regarding a failure to receive an authorisation code in the form of an error object. + The client endpoint is identified from the X-Callback-URL supplied in the POST request header. + operationId: "authorisationCodesIdentifierTypeIdentifierFailurePUT" + parameters: + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + requestBody: + $ref: '#/components/requestBodies/updateError' # The callback returns the error object in the event of failure + responses: + 204: + description: Your server returns this code if it accepts the callback + 400: + description: Your server returns this code if it rejects the callback due to a violation of a business rule + 401: + description: Your server returns this code if it rejects the callback due to an authorisation failure + 404: + description: Your server returns this code if it rejects the callback due to a failure to identify the target resource + 500: + description: Your server returns this code if it rejects the callback due to general server-side issue + 503: + description: Your server returns this code if it rejects the callback due to systems unavailability + responses: + 201: + description: Represents an Authorisation Code response content: application/json: schema: - $ref: '#/components/schemas/internal_server_error' - "503": - description: Service Unavailable + $ref: "#/components/schemas/responseAuthorisationCode" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 202: + description: Represents an Asynchronous response content: application/json: schema: - $ref: '#/components/schemas/service_unavailable' - "599": - description: Network connection timeout error + $ref: "#/components/schemas/requestStateObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 400: + description: Represents an Error Caused by the Violation of a Business Rule content: application/json: schema: - $ref: '#/components/schemas/network_timeout_error' - /vouchers/voucherstatuscheck/{voucherserialnumber}: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' get: tags: - - VoucherStatusCheck - description: Check the status of the Voucher. The API will respond with Not Preactivated, Preactivated, Activated, Active, Consumed, Blocked, Suspended and Purged. - operationId: VoucherStatusCheckGET + - Authorisation Codes + summary: View Authorisation Codes for a given account + description: This endpoint allows allows a mobile money payer or payee to view authorisation codes for a given account. + operationId: "accountsIdentifierTypeIdentifierAuthorisationCodesGET" parameters: - - name: X-Callback-URL - in: header - description: The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT. - required: false - style: simple - explode: false - schema: - type: string - format: uri - example: https://myserver.com/send/callback/here - - name: voucherserialnumber - in: path - description: Voucher serial number to check status of - required: true - style: simple - explode: false - schema: - type: string - - name: X-Date - in: header - description: Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API. - required: false - style: simple - explode: false - schema: - type: string - format: date-time - - name: X-CorrelationID - in: header - description: Header parameter to uniquely identify the request. Must be supplied as a UUID. - required: false - style: simple - explode: false - schema: - pattern: ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$ - type: string - - name: X-API-Key - in: header - description: Used to pass pre-shared client's API key to the server. - required: false - style: simple - explode: false - schema: - type: string - - name: X-User-Bearer - in: header - description: Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication. - required: false - style: simple - explode: false - schema: - type: string - - name: X-Client-Id - in: header - description: Used to pass pre-shared client's identifier to the server. - required: false - style: simple - explode: false - schema: - maxLength: 256 - type: string - - name: X-Content-Hash - in: header - description: SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed. - required: false - style: simple - explode: false - schema: - type: string - - name: X-User-Credential-1 - in: header - description: The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. - required: false - style: simple - explode: false - schema: - type: string - - name: X-User-Credential-2 - in: header - description: The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. - required: false - style: simple - explode: false - schema: - type: string - - name: X-Channel - in: header - description: String containing the channel that was used to originate the request. For example USSD, Web, App. - required: false - style: simple - explode: false - schema: - maxLength: 256 - type: string + - $ref: '#/components/parameters/identifierType' + - $ref: '#/components/parameters/identifier' + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-User-Credential-1' + - $ref: '#/components/parameters/X-User-Credential-2' + - $ref: '#/components/parameters/X-Channel' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier-Type' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier' + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/offset' + - $ref: '#/components/parameters/fromDateTime' + - $ref: '#/components/parameters/toDateTime' + - $ref: '#/components/parameters/codeState' responses: - "200": - description: Voucher status + 200: + description: Represents an authorisation codes response content: application/json: schema: - $ref: '#/components/schemas/voucher_status' - "400": - description: Invalid request + $ref: "#/components/schemas/responseAuthorisationCode" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 'X-Records-Available-Count': + $ref: '#/components/headers/X-Records-Available-Count' + 'X-Records-Returned-Count': + $ref: '#/components/headers/X-Records-Returned-Count' + 400: + description: Represents an Error Caused by the Violation of a Business Rule content: application/json: schema: - $ref: '#/components/schemas/invalid_validation_request' - "456": - description: Invalid voucher number + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure content: application/json: schema: - $ref: '#/components/schemas/invalid_voucher_number' - "458": - description: Voucher number already used + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource content: application/json: schema: - $ref: '#/components/schemas/voucher_already_used' - "459": - description: Voucher has expired + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue content: application/json: schema: - $ref: '#/components/schemas/voucher_expired' - "460": - description: Gov Stack Building Block does not exist + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability content: application/json: schema: - $ref: '#/components/schemas/GovStack_BB_does_not_exist' - "500": - description: Internal Server Error + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + /accounts/{accountId}/authorisationcodes/{authorisationCode}: + parameters: + - $ref: '#/components/parameters/accountId' + - $ref: '#/components/parameters/authorisationCode' + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-User-Credential-1' + - $ref: '#/components/parameters/X-User-Credential-2' + - $ref: '#/components/parameters/X-Channel' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier-Type' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier' + get: + tags: + - Authorisation Codes + summary: View an Authorisation Code + description: This endpoint returns a specific Authorisation Code linked to an account + operationId: "accountsAccountIdAuthorisationCodeAuthorisationCodeGET" + responses: + 200: + description: Represents an Authorisation Code response + content: + application/json: + schema: + $ref: "#/components/schemas/responseAuthorisationCode" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 400: + description: Represents an Error Caused by the Violation of a Business Rule + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource content: application/json: schema: - $ref: '#/components/schemas/internal_server_error' - "503": - description: Service Unavailable + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue content: application/json: schema: - $ref: '#/components/schemas/service_unavailable' - "599": - description: Network connection timeout error + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability content: application/json: schema: - $ref: '#/components/schemas/network_timeout_error' + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' patch: tags: - - VoucherCancellation - description: This operation cancels a specific voucher number. - operationId: VoucherCancelPATCH + - Authorisation Codes + summary: Update an Authorisation Code + description: This endpoint updates a specific Authorisation Code linked to an account. The only permissable modification is to set + codeState to cancelled. + operationId: "accountsAccountIdAuthorisationCodesAuthorisationCodePATCH" parameters: - - name: X-Callback-URL - in: header - description: The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT. - required: false - style: simple - explode: false - schema: - type: string - format: uri - example: https://myserver.com/send/callback/here - - name: voucherserialnumber - in: path - description: Voucher serial number to check status of - required: true - style: simple - explode: false - schema: - type: string - - name: X-Date - in: header - description: Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API. - required: false - style: simple - explode: false - schema: - type: string - format: date-time - - name: X-CorrelationID - in: header - description: Header parameter to uniquely identify the request. Must be supplied as a UUID. - required: false - style: simple - explode: false - schema: - pattern: ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$ - type: string - - name: X-API-Key - in: header - description: Used to pass pre-shared client's API key to the server. - required: false - style: simple - explode: false - schema: - type: string - - name: X-User-Bearer - in: header - description: Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication. - required: false - style: simple - explode: false - schema: - type: string - - name: X-Client-Id - in: header - description: Used to pass pre-shared client's identifier to the server. - required: false - style: simple - explode: false - schema: - maxLength: 256 - type: string - - name: X-Content-Hash - in: header - description: SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed. - required: false - style: simple - explode: false - schema: - type: string - - name: X-User-Credential-1 - in: header - description: The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. - required: false - style: simple - explode: false - schema: - type: string - - name: X-User-Credential-2 - in: header - description: The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. - required: false - style: simple - explode: false - schema: - type: string - - name: X-Channel - in: header - description: String containing the channel that was used to originate the request. For example USSD, Web, App. - required: false - style: simple - explode: false - schema: - maxLength: 256 - type: string + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-Callback-URL' requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/voucher_cancel_request' - required: true + $ref: '#/components/requestBodies/genericPatch' + callbacks: + authorisationCodesSuccessEvent: + '{$request.header.X-Callback-URL}': # This is the callback URL provided by the client in the request header + put: + summary: Authorisation Code Update Success Callback + description: This callback communicates a simple message to communicate that the Authorisation Code update + completed successfully. + operationId: "authorisationCodeUpdateAccountIdSuccessPUT" + parameters: + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + requestBody: + $ref: '#/components/requestBodies/genericUpdateSuccess' + responses: + 204: + description: Your server returns this code if it accepts the callback + 400: + description: Your server returns this code if it rejects the callback due to a violation of a business rule + 401: + description: Your server returns this code if it rejects the callback due to an authorisation failure + 404: + description: Your server returns this code if it rejects the callback due to a failure to identify the target resource + 500: + description: Your server returns this code if it rejects the callback due to general server-side issue + 503: + description: Your server returns this code if it rejects the callback due to systems unavailability + authorisationCodesFailureEvent: + '{$request.header.X-Callback-URL}': # This is the callback URL provided by the client in the request header + put: + summary: Authorisation Code Update Failure Callback + description: This callback communicates the information regarding a failure to update an authorisaton code in the form of an error object. + The client endpoint is identified from the X-Callback-URL supplied in the POST request header. + operationId: "authorisationCodeAccountIdFailurePUT" + parameters: + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + requestBody: + $ref: '#/components/requestBodies/updateError' # The callback returns the error object in the event of failure + responses: + 204: + description: Your server returns this code if it accepts the callback + 400: + description: Your server returns this code if it rejects the callback due to a violation of a business rule + 401: + description: Your server returns this code if it rejects the callback due to an authorisation failure + 404: + description: Your server returns this code if it rejects the callback due to a failure to identify the target resource + 500: + description: Your server returns this code if it rejects the callback due to general server-side issue + 503: + description: Your server returns this code if it rejects the callback due to systems unavailability responses: - "200": - description: Voucher cancelled + 202: + description: Represents an Asynchronous response + content: + application/json: + schema: + $ref: "#/components/schemas/requestStateObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 204: + description: An empty response is returned for a synchronous successful patch. + 400: + description: Represents an Error Caused by the Violation of a Business Rule + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue content: application/json: schema: - $ref: '#/components/schemas/voucher_cancelled' - "400": - description: Invalid request + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability content: application/json: schema: - $ref: '#/components/schemas/invalid_validation_request' - "463": - description: Invalid voucher + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + /accounts/{identifierType}/{identifier}/authorisationcodes/{authorisationCode}: + parameters: + - $ref: '#/components/parameters/identifierType' + - $ref: '#/components/parameters/identifier' + - $ref: '#/components/parameters/authorisationCode' + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-User-Credential-1' + - $ref: '#/components/parameters/X-User-Credential-2' + - $ref: '#/components/parameters/X-Channel' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier-Type' + - $ref: '#/components/parameters/X-Account-Holding-Institution-Identifier' + get: + tags: + - Authorisation Codes + summary: View an Authorisation Code + description: This endpoint returns a specific Authorisation Code linked to an account. + operationId: "accountsIdentifierTypeIdentifierAuthorisationCodesAuthorisationCodeGET" + responses: + 200: + description: Represents an Authorisation Code response content: application/json: schema: - $ref: '#/components/schemas/invalid_voucher' - "464": - description: Voucher is already cancelled + $ref: "#/components/schemas/responseAuthorisationCode" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 400: + description: Represents an Error Caused by the Violation of a Business Rule content: application/json: schema: - $ref: '#/components/schemas/already_cancelled' + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + patch: + tags: + - Authorisation Codes + summary: Cancel an Authorisation Code + description: This endpoint updates a specific Authorisation Code linked to an account. The only permissable modification is to set + codeState to cancelled. + operationId: "accountsIdentifierTypeIdentifierAuthorisationCodesAuthorisationCodePATCH" + parameters: + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-Callback-URL' + requestBody: + $ref: '#/components/requestBodies/genericPatch' + callbacks: + authorisationCodesSuccessEvent: + '{$request.header.X-Callback-URL}': # This is the callback URL provided by the client in the request header + put: + summary: Authorisation Code Update Success Callback + description: This callback communicates a simple message to communicate that the Authorisation Code update + completed successfully. + operationId: "authorisationCodeUpdateIdentifierTypeIdentifierSuccessPUT" + parameters: + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + requestBody: + $ref: '#/components/requestBodies/genericUpdateSuccess' + responses: + 204: + description: Your server returns this code if it accepts the callback + 400: + description: Your server returns this code if it rejects the callback due to a violation of a business rule + 401: + description: Your server returns this code if it rejects the callback due to an authorisation failure + 404: + description: Your server returns this code if it rejects the callback due to a failure to identify the target resource + 500: + description: Your server returns this code if it rejects the callback due to general server-side issue + 503: + description: Your server returns this code if it rejects the callback due to systems unavailability + authorisationCodesFailureEvent: + '{$request.header.X-Callback-URL}': # This is the callback URL provided by the client in the request header + put: + summary: Authorisation Code Update Failure Callback + description: This callback communicates the information regarding a failure to update an authorisaton code in the form of an error object. + The client endpoint is identified from the X-Callback-URL supplied in the POST request header. + operationId: "authorisationCodeIdentifierTypeIdentifierFailurePUT" + parameters: + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-User-Bearer' + - $ref: '#/components/parameters/X-Client-Id' + requestBody: + $ref: '#/components/requestBodies/updateError' # The callback returns the error object in the event of failure + responses: + 204: + description: Your server returns this code if it accepts the callback + 400: + description: Your server returns this code if it rejects the callback due to a violation of a business rule + 401: + description: Your server returns this code if it rejects the callback due to an authorisation failure + 404: + description: Your server returns this code if it rejects the callback due to a failure to identify the target resource + 500: + description: Your server returns this code if it rejects the callback due to general server-side issue + 503: + description: Your server returns this code if it rejects the callback due to systems unavailability + responses: + 202: + description: Represents an Asynchronous response + content: + application/json: + schema: + $ref: "#/components/schemas/requestStateObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 204: + description: An empty response is returned for a synchronous successful patch. + 400: + description: Represents an Error Caused by the Violation of a Business Rule + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + + # Support APIs. These support checking for server health, request state polling and missing response retrieval. + + /heartbeat: + get: + tags: + - Supporting + summary: Check API availability + description: This endpoint returns the current status of the API + operationId: "heartbeatGET" + parameters: + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-Client-Id' + responses: + 200: + description: Represents a Heartbeat response + content: + application/json: + schema: + $ref: "#/components/schemas/responseHeartbeat" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 400: + description: Represents an Error Caused by the Violation of a Business Rule + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + /requeststates/{serverCorrelationId}: + get: + tags: + - Supporting + summary: View A Request State + description: This endpoint returns a specific request state + operationId: "requeststatesServerCorrelationIdGET" + parameters: + - $ref: '#/components/parameters/serverCorrelationId' + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-Client-Id' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-User-Credential-1' + - $ref: '#/components/parameters/X-User-Credential-2' + - $ref: '#/components/parameters/X-Channel' + responses: + 200: + description: Represents an Asynchronous response + content: + application/json: + schema: + $ref: "#/components/schemas/requestStateObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 400: + description: Represents an Error Caused by the Violation of a Business Rule + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + patch: + deprecated: true # This Patch operation is to be deprecated as asynchronous callbacks will be handled by Swagger Callback definitions using PUT. + tags: + - Supporting + summary: Update A Request State + description: This endpoint updates a specific request state. This operation is to be deprecated. Please refer to Callback definitions + for the revised approach to implementing asynchronous callbacks. + operationId: "requeststatesServerCorrelationIdPATCH" + parameters: + - $ref: '#/components/parameters/serverCorrelationId' + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-CorrelationID' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-Client-Id' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-User-Credential-1' + - $ref: '#/components/parameters/X-User-Credential-2' + - $ref: '#/components/parameters/X-Channel' + requestBody: + $ref: '#/components/requestBodies/genericPatch' + responses: + 204: + description: An empty response is returned for a synchronous successful patch. + 400: + description: Represents an Error Caused by the Violation of a Business Rule + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + /responses/{clientCorrelationId}: + get: + tags: + - Supporting + summary: View A Response + description: This endpoint returns a specific response. + operationId: "responsesClientCorrelationIdGET" + parameters: + - $ref: '#/components/parameters/clientCorrelationId' + - $ref: '#/components/parameters/X-Date' + - $ref: '#/components/parameters/X-API-Key' + - $ref: '#/components/parameters/X-Client-Id' + - $ref: '#/components/parameters/X-Content-Hash' + - $ref: '#/components/parameters/X-User-Credential-1' + - $ref: '#/components/parameters/X-User-Credential-2' + - $ref: '#/components/parameters/X-Channel' + responses: + 200: + description: Represents an Response object response + content: + application/json: + schema: + $ref: "#/components/schemas/responseResponse" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 400: + description: Represents an Error Caused by the Violation of a Business Rule + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 401: + description: Represents an Error Caused by an Authorisation Failure + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 404: + description: Represents an Error Caused by a Failure to Identify the Target Resource + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 500: + description: Represents an Error Caused by a General Server-Side Issue + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + 503: + description: Represents an Error Caused by System Unavailability + content: + application/json: + schema: + $ref: "#/components/schemas/errorObject" + headers: + 'X-Date': + $ref: '#/components/headers/X-Date' + +# All the GSMA Mobile Money API Objects and Fields are defined here. + components: schemas: - voucher_preactivation_request: + amount: + type: "string" + minLength: 1 + maxLength: 23 + pattern: ^([0]|([1-9][0-9]{0,17}))([.][0-9]{0,3}[1-9])?$ + example: "15.21" + currency: + type: "string" + enum: + - "AED" + - "AFN" + - "ALL" + - "AMD" + - "ANG" + - "AOA" + - "ARS" + - "AUD" + - "AWG" + - "AZN" + - "BAM" + - "BBD" + - "BDT" + - "BGN" + - "BHD" + - "BIF" + - "BMD" + - "BND" + - "BOB" + - "BOV" + - "BRL" + - "BSD" + - "BTN" + - "BWP" + - "BYN" + - "BZD" + - "CAD" + - "CDF" + - "CHE" + - "CHF" + - "CHW" + - "CLF" + - "CLP" + - "CNY" + - "COP" + - "COU" + - "CRC" + - "CUC" + - "CUP" + - "CVE" + - "CZK" + - "DJF" + - "DKK" + - "DOP" + - "DZD" + - "EGP" + - "ERN" + - "ETB" + - "EUR" + - "FJD" + - "FKP" + - "GBP" + - "GEL" + - "GHS" + - "GIP" + - "GMD" + - "GNF" + - "GTQ" + - "GYD" + - "HKD" + - "HNL" + - "HRK" + - "HTG" + - "HUF" + - "IDR" + - "ILS" + - "INR" + - "IQD" + - "IRR" + - "ISK" + - "JMD" + - "JOD" + - "JPY" + - "KES" + - "KGS" + - "KHR" + - "KMF" + - "KPW" + - "KRW" + - "KWD" + - "KYD" + - "KZT" + - "LAK" + - "LBP" + - "LKR" + - "LRD" + - "LSL" + - "LYD" + - "MAD" + - "MDL" + - "MGA" + - "MKD" + - "MMK" + - "MNT" + - "MOP" + - "MRO" + - "MUR" + - "MVR" + - "MWK" + - "MXN" + - "MXV" + - "MYR" + - "MZN" + - "NAD" + - "NGN" + - "NIO" + - "NOK" + - "NPR" + - "NZD" + - "OMR" + - "PAB" + - "PEN" + - "PGK" + - "PHP" + - "PKR" + - "PLN" + - "PYG" + - "QAR" + - "RON" + - "RSD" + - "RUB" + - "RWF" + - "SAR" + - "SBD" + - "SCR" + - "SDG" + - "SEK" + - "SGD" + - "SHP" + - "SLL" + - "SOS" + - "SRD" + - "SSP" + - "STD" + - "SVC" + - "SYP" + - "SZL" + - "THB" + - "TJS" + - "TMT" + - "TND" + - "TOP" + - "TRY" + - "TTD" + - "TWD" + - "TZS" + - "UAH" + - "UGX" + - "USD" + - "USN" + - "UYI" + - "UYU" + - "UZS" + - "VEF" + - "VND" + - "VUV" + - "WST" + - "XAF" + - "XAG" + - "XAU" + - "XBA" + - "XBB" + - "XBC" + - "XBD" + - "XCD" + - "XDR" + - "XOF" + - "XPD" + - "XPF" + - "XPT" + - "XSU" + - "XTS" + - "XUA" + - "XXX" + - "YER" + - "ZAR" + - "ZMW" + - "ZWL" + type: + type: "string" + description: The harmonised Transaction Type. + enum: + - "billpay" + - "deposit" + - "disbursement" + - "transfer" + - "merchantpay" + - "inttransfer" + - "adjustment" + - "reversal" + - "withdrawal" + typeReversal: + type: "string" + description: The harmonised Transaction Type. + enum: + - "adjustment" + - "reversal" + example: "reversal" + subType: + type: "string" + description: A non-harmonised sub-classification of the type of transaction. + Values are not fixed, and usage will vary according to Provider. + minLength: 0 + maxLength: 256 + descriptionText: + type: "string" + description: Free format text description of the transaction provided by the client. This can be provided as a reference + for the receiver on a notification SMS and on an account statement. + minLength: 0 + maxLength: 160 + requestDate: + type: "string" + format: "date-time" + description: The date and time of the request as supplied by the client. + requestingOrganisationTransactionReference: + type: "string" + description: A reference provided by the requesting organisation that is + to be associated with the transaction. + minLength: 0 + maxLength: 256 + oneTimeCode: + type: "string" + description: A one-time code that can be supplied in the request or can be + generated in the response depending upon the use case. + An authorisation code can be supplied in this field for requests that have been pre-authorised. + minLength: 0 + maxLength: 256 + geoCode: + type: "string" + description: Indicates the geographic location from where the transaction was initiated. + minLength: 0 + maxLength: 256 + pattern: "^(-?(90|(\\d|[1-8]\\d)(\\.\\d{1,6}){0,1}))\\,{1}(-?(180|(\\d|\\d\\d|1[0-7]\\d)(\\.\\d{1,6}){0,1}))$" + example: "37.423825,-122.082900" + originalTransactionReference: + type: "string" + description: For reversals and refunds, this field indicates the transaction which is the subject of the reversal. + minLength: 0 + maxLength: 256 + servicingIdentity: + type: "string" + description: The field is used to identify the servicing identity for transactions, e.g. till, POS ID, assistant ID. + minLength: 0 + maxLength: 256 + transactionStatus: + type: "string" + description: Indicates the status of the transaction as stored by the API provider. + minLength: 1 + maxLength: 256 + creationDate: + type: "string" + format: "date-time" + description: Date and time when the object was created by the API Provider. + modificationDate: + type: "string" + format: "date-time" + description: Date and time when the object was modified by the API Provider. + transactionReference: + type: "string" + description: Unique reference for the transaction. This is returned in the response by API provider. + minLength: 1 + maxLength: 256 + transactionReceipt: + type: "string" + description: Transaction receipt number as notified to the parties. This may differ from the Transaction Reference. + minLength: 0 + maxLength: 256 + party: + type: "object" required: - - Gov_Stack_BB - - voucher_amount - - voucher_currency - - voucher_group - type: object + - "key" + - "value" properties: - voucher_amount: - maxLength: 23 + key: + type: "string" + description: Provides the account identifier type. minLength: 1 - pattern: ^([0]|([1-9][0-9]{0,17}))([.][0-9]{0,3}[0-9])?$ - type: string - example: "15.21" - voucher_currency: - type: string - enum: - - AED - - AFN - - ALL - - AMD - - ANG - - AOA - - ARS - - AUD - - AWG - - AZN - - BAM - - BBD - - BDT - - BGN - - BHD - - BIF - - BMD - - BND - - BOB - - BOV - - BRL - - BSD - - BTN - - BWP - - BYN - - BZD - - CAD - - CDF - - CHE - - CHF - - CHW - - CLF - - CLP - - CNY - - COP - - COU - - CRC - - CUC - - CUP - - CVE - - CZK - - DJF - - DKK - - DOP - - DZD - - EGP - - ERN - - ETB - - EUR - - FJD - - FKP - - GBP - - GEL - - GHS - - GIP - - GMD - - GNF - - GTQ - - GYD - - HKD - - HNL - - HRK - - HTG - - HUF - - IDR - - ILS - - INR - - IQD - - IRR - - ISK - - JMD - - JOD - - JPY - - KES - - KGS - - KHR - - KMF - - KPW - - KRW - - KWD - - KYD - - KZT - - LAK - - LBP - - LKR - - LRD - - LSL - - LYD - - MAD - - MDL - - MGA - - MKD - - MMK - - MNT - - MOP - - MRO - - MUR - - MVR - - MWK - - MXN - - MXV - - MYR - - MZN - - NAD - - NGN - - NIO - - NOK - - NPR - - NZD - - OMR - - PAB - - PEN - - PGK - - PHP - - PKR - - PLN - - PYG - - QAR - - RON - - RSD - - RUB - - RWF - - SAR - - SBD - - SCR - - SDG - - SEK - - SGD - - SHP - - SLL - - SOS - - SRD - - SSP - - STD - - SVC - - SYP - - SZL - - THB - - TJS - - TMT - - TND - - TOP - - TRY - - TTD - - TWD - - TZS - - UAH - - UGX - - USD - - USN - - UYI - - UYU - - UZS - - VEF - - VND - - VUV - - WST - - XAF - - XAG - - XAU - - XBA - - XBB - - XBC - - XBD - - XCD - - XDR - - XOF - - XPD - - XPF - - XPT - - XSU - - XTS - - XUA - - XXX - - YER - - ZAR - - ZMW - - ZWL - voucher_group: - type: string - Gov_Stack_BB: - type: string - voucher_comment: - type: string - preactivation_response: - required: - - expiry_date_time - - voucher_number - - voucher_serial_number - properties: - voucher_number: - maxLength: 25 - minLength: 16 - type: string - description: This is a random secret number that uniquely identifies the value and validity of the voucher. - voucher_serial_number: - maxLength: 25 - minLength: 16 - type: string - description: This is a sequential number that is used to identify a voucher without necessarily revealing the voucher secret number. There is no relationship between the voucher serial number and the voucher number. - expiry_date_time: - type: string - format: date-time - invalid_preactivation_request: - required: - - message - type: object - properties: - message: - type: string - invalid_amount: - required: - - message - type: object - properties: - message: - type: string - invalid_currency: - required: - - message - type: object - properties: - message: - type: string - invalid_voucher_group: - required: - - message - type: object - properties: - message: - type: string - voucher_group_exhausted: - required: - - message - type: object - properties: - message: - type: string - GovStack_BB_does_not_exist: - required: - - message - type: object - properties: - message: - type: string - internal_server_error: - required: - - message - type: object - properties: - message: - type: string - service_unavailable: - required: - - message - type: object - properties: - message: - type: string - network_timeout_error: - required: - - message - type: object - properties: - message: - type: string - Voucher_activate_request: + maxLength: 256 + example: "msisdn" + value: + type: "string" + description: Provides the account identifier type value. + minLength: 1 + maxLength: 256 + example: "+33555123456" + creditPartyArray: + type: "array" + description: A collection of key/value pairs that enable the party to be identified. Keys include MSISDN and Wallet Identifier. + items: + $ref: "#/components/schemas/party" + maxItems: 10 + minItems: 1 + debitPartyArray: + type: "array" + description: A collection of key/value pairs that enable the party to be identified. Keys include MSISDN and Wallet Identifier. + items: + $ref: "#/components/schemas/party" + maxItems: 10 + minItems: 1 + feesArray: + type: "array" + description: Returns all fees that are applicable to the object. + items: + $ref: "#/components/schemas/fees" + maxItems: 20 + minItems: 1 + metadataArray: + type: "array" + description: A collection of key/value pairs. These can be used to populate additional + properties that describe administrative information regarding the resource. + items: + $ref: "#/components/schemas/metadata" + maxItems: 20 + customDataArray: + type: "array" + description: A collection of key/value pairs. These can be used to populate provider specific fields. + items: + $ref: "#/components/schemas/customData" + maxItems: 20 + fees: + type: "object" required: - - Gov_Stack_BB - - voucher_serial_number - type: object + - "feeType" + - "feeCurrency" + - "feeAmount" properties: - voucher_serial_number: - type: integer - format: int64 - Gov_Stack_BB: - type: string - activation_response: + feeType: + type: "string" + description: Defines the type of fee. + minLength: 1 + maxLength: 256 + feeAmount: + description: Defines the amount of the fee. + allOf: + - $ref: '#/components/schemas/amount' + example: "5.46" + feeCurrency: + description: Defines the currency for the given fee. + allOf: + - $ref: '#/components/schemas/currency' + metadata: + type: "object" required: - - result_status + - "key" + - "value" properties: - result_status: - type: string - invalid_activation_request: + key: + type: "string" + description: Identifies the type of additional field. + minLength: 1 + maxLength: 256 + value: + type: "string" + description: Identifies the value of the additional field. + minLength: 1 + maxLength: 256 + customData: + type: "object" required: - - message - type: object + - "key" + - "value" properties: - message: - type: string - invalid_voucher_serial_number: + key: + type: "string" + description: Identifies the type of additional field. + minLength: 1 + maxLength: 256 + value: + type: "string" + description: Identifies the value of the additional field. + minLength: 1 + maxLength: 256 + + link: + type: "string" + description: Provides a URL to the resource. + minLength: 1 + maxLength: 256 + currentBalance: + description: Current outstanding balance on the account. + allOf: + - $ref: '#/components/schemas/amount' + example: "15.00" + availableBalance: + description: Indicates the balance that is able to be debited for an account. + This balance is only provided on some API provider systems. + allOf: + - $ref: '#/components/schemas/amount' + example: "15.00" + reservedBalance: + description: Indicates the portion of the balance that is reserved, i.e. + intended to be debited. This balance is only provided on some API provider systems. + allOf: + - $ref: '#/components/schemas/amount' + example: "15.00" + unclearedBalance: + description: Indicates the sum of uncleared funds in an account, i.e. the funds + that are awaiting a credit confirmation. + allOf: + - $ref: '#/components/schemas/amount' + example: "15.00" + accountStatus: + type: "string" + enum: + - "available" + - "unavailable" + - "unregistered" + description: Indicates a harmonised representation of the account status. + This will be shown as available, unavailable or unregistered. + minLength: 1 + maxLength: 256 + + requestingOrganisation: + type: "object" + description: An object that details the originating organisation of the request. required: - - message - type: object + - "requestingOrganisationIdentifierType" + - "requestingOrganisationIdentifier" properties: - message: - type: string - Voucher_redeem_request: + requestingOrganisationIdentifierType: + type: "string" + description: Identifies the identifier type of the requesting organisation. + enum: + - "lei" + - "swiftbic" + - "organisationid" + requestingOrganisationIdentifier: + type: "string" + description: Contains the requesting organisation identifier. + minLength: 1 + maxLength: 256 + authorisationCode: + type: "string" + description: The code that will be presented to the other party for redemption. + maxLength: 256 + codeState: + type: "string" + description: Indicates the state of the Authorisation Code. + enum: + - "active" + - "expired" + - "cancelled" + codeLifetime: + type: "number" + format: "int32" + minimum: 1 + example: "600" + description: Indicates the expiry time in seconds of the code. + amountType: + type: "string" + description: The amount for the authorisation can be an exact amount or can be a maximum amount. + enum: + - "exact" + - "maximum" + holdFundsIndicator: + type: "boolean" + description: Indicates whether funds should be reserved against the payers account where the payer is the requestor. + redemptionChannels: + type: "array" + description: Indicates the channel(s) that the code can be redeemed against, e.g. ATM, Merchant, etc. + items: + type: "object" + properties: + channelType: + type: "string" + description: Identifies the channel type + minLength: 1 + maxLength: 256 + required: + - "channelType" + maxItems: 50 + redemptionTransactionTypes: + type: "array" + description: Indicates the Transaction Types(s) that the code can be redeemed against + items: + type: "object" + properties: + transactionType: + $ref: '#/components/schemas/type' + transactionSubtype: + $ref: '#/components/schemas/subType' + required: + - "transactionType" + maxItems: 50 + redemptionAccountIdentifiers: + type: "array" + description: A collection of key/value pairs that enable the redemption account + to be identified. Keys include MSISDN and Wallet Identifier. + items: + $ref: '#/components/schemas/party' + maxItems: 50 + serviceStatus: + type: "string" + description: Provides the status of the requested service. + enum: + - "available" + - "unavailable" + - "degraded" + delay: + type: "number" + format: "int64" + description: The anticipated processing delay in milliseconds. + plannedRestorationTime: + type: "string" + format: "date-time" + description: Where the planned restoration time is known (e.g. scheduled maintenance), it can be provided in this field. + + # All the GSMA Mobile Money API Request Schemas are defined here. + + requestStateObject: + type: "object" required: - - Gov_Stack_BB - - merchant_bank_details - - merchant_name - - merchant_voucher_group - - override - - voucher_number - type: object + - "notificationMethod" + - "serverCorrelationId" + - "status" properties: - voucher_number: - type: integer - format: int64 - Gov_Stack_BB: - type: string - merchant_name: - type: string - merchant_bank_details: - type: string - merchant_voucher_group: - type: string - override: - type: boolean - redemption_response: + serverCorrelationId: + type: "string" + description: A unique identifier issued by the provider to enable the client + to identify the RequestState resource on subsequent polling requests. Must be supplied as a UUID. + minLength: 1 + maxLength: 256 + pattern: "^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$" + objectReference: + type: "string" + description: Provides a reference to the subject resource, e.g. transaction reference. + minLength: 0 + maxLength: 256 + status: + type: "string" + enum: + - "pending" + - "completed" + - "failed" + description: Indicates the status of the request. + notificationMethod: + type: "string" + enum: + - "callback" + - "polling" + description: Indicates whether a callback will be issued or whether the client will need to poll. + pendingReason: + type: "string" + description: A textual description that can be provided to describe the reason for a pending status. + minLength: 0 + maxLength: 256 + expiryTime: + type: "string" + format: "date-time" + description: Indicate the time by which the provider will fail the request if completion criteria have not been met. + For an example, a debit party failing to authorise within the allowed period. + pollLimit: + type: "number" + format: "int32" + description: Indicates the number of poll attempts for the given requeststate resource that will be allowed by the provider. + minimum: 0 + exclusiveMinimum: true + error: + description: If the asynchronous processing failed, details of the error will be returned here. + allOf: + - $ref: '#/components/schemas/errorObject' + genericUpdateSuccess: + type: "object" required: - - result_status + - "result" properties: - result_status: - type: string - invalid_redemption_request: + result: + type: "string" + description: The success message provided in a callback to communicate the success of an update operation. + enum: + - "success" + errorObject: + type: "object" required: - - message - type: object + - "errorCategory" + - "errorCode" properties: - message: - type: string - invalid_voucher_number: + errorCategory: + type: "string" + description: The category grouping for the error. + enum: + - "businessRule" + - "validation" + - "authorisation" + - "identification" + - "internal" + - "serviceUnavailable" + errorCode: + type: "string" + description: The harmonised error code identifying the reason for error. + enum: + - "genericError" + - "dailyVolumeLimitExceeded" + - "dailyValueLimitExceeded" + - "weeklyVolumeLimitExceeded" + - "weeklyValueLimitExceeded" + - "monthlyVolumeLimitExceeded" + - "monthlyValueLimitExceeded" + - "accountMaxTotalVolumeExceeded" + - "accountMaxTotalValueExceeded" + - "lessThanTransactionMinValue" + - "greaterThanTransactionMaxValue" + - "maxBalanceExceeded" + - "samePartiesError" + - "duplicateRequest" + - "insufficientFunds" + - "incorrectState" + - "underPaymentNotAllowed" + - "overPaymentNotAllowed" + - "rateLimitError" + - "transactionTypeError" + - "noMandateAuthority" + - "linkViolation" + - "countryofOriginNotPermitted" + - "nationalityNotPermitted" + - "idDocumentNotSupported" + - "issuingCountryNotSupported" + - "quoteHasExpired" + - "identifierError" + - "lengthError" + - "formatError" + - "negativeValue" + - "currencyNotSupported" + - "mandatoryValueNotSupplied" + - "invalidOffset" + - "clientAuthorisationError" + - "requestDeclined" + - "servicingPartyAuthorisationError" + - "requestingPartyAuthorisationError" + errordescription: + type: "string" + description: A textual description of the error. + minLength: 0 + maxLength: 256 + errorDateTime: + type: "string" + format: "date-time" + description: The timestamp indicating when the error occurred. + errorParameters: + description: Diagnostic information in the form of key/value pairs relating to the error. + allOf: + - $ref: '#/components/schemas/metadataArray' + requestTransactionType: + allOf: + - type: "object" + required: + - "amount" + - "currency" + properties: + requestingOrganisationTransactionReference: + $ref: '#/components/schemas/requestingOrganisationTransactionReference' + originalTransactionReference: + $ref: '#/components/schemas/originalTransactionReference' + subType: + $ref: '#/components/schemas/subType' + amount: + description: The transaction amount. + allOf: + - $ref: '#/components/schemas/amount' + example: "15.23" + currency: + description: Currency of the transaction amount. + allOf: + - $ref: '#/components/schemas/currency' + example: "RWF" + descriptionText: + $ref: '#/components/schemas/descriptionText' + fees: + $ref: '#/components/schemas/feesArray' + geoCode: + $ref: '#/components/schemas/geoCode' + oneTimeCode: + $ref: '#/components/schemas/oneTimeCode' + requestingOrganisation: + $ref: '#/components/schemas/requestingOrganisation' + servicingIdentity: + $ref: '#/components/schemas/servicingIdentity' + requestDate: + $ref: '#/components/schemas/requestDate' + customData: + $ref: '#/components/schemas/customDataArray' + metadata: + $ref: '#/components/schemas/metadataArray' + - anyOf: + - type: object # This construct allows for conditionality on credit/debit party. Both can be supplied or one or the other can be supplied. + required: + - creditParty + properties: + creditParty: + $ref: '#/components/schemas/creditPartyArray' + - type: object + required: + - debitParty + properties: + debitParty: + $ref: '#/components/schemas/debitPartyArray' + - type: object + required: + - debitParty + - creditParty + properties: + creditParty: + $ref: '#/components/schemas/creditPartyArray' + debitParty: + $ref: '#/components/schemas/debitPartyArray' + requestReversal: + type: "object" required: - - message - type: object + - "type" properties: - message: - type: string - cannot_credit_merchant: - required: - - message - type: object + requestingOrganisationTransactionReference: + $ref: '#/components/schemas/requestingOrganisationTransactionReference' + creditParty: + $ref: '#/components/schemas/creditPartyArray' + debitParty: + $ref: '#/components/schemas/debitPartyArray' + type: + $ref: '#/components/schemas/typeReversal' + subType: + $ref: '#/components/schemas/subType' + amount: + description: The transaction amount. + allOf: + - $ref: '#/components/schemas/amount' + example: "15.23" + currency: + description: Currency of the transaction amount. + allOf: + - $ref: '#/components/schemas/currency' + example: "RWF" + descriptionText: + $ref: '#/components/schemas/descriptionText' + fees: + $ref: '#/components/schemas/feesArray' + geoCode: + $ref: '#/components/schemas/geoCode' + requestingOrganisation: + $ref: '#/components/schemas/requestingOrganisation' + servicingIdentity: + $ref: '#/components/schemas/servicingIdentity' + requestDate: + $ref: '#/components/schemas/requestDate' + customData: + $ref: '#/components/schemas/customDataArray' + metadata: + $ref: '#/components/schemas/metadataArray' + requestAuthorisationCode: + type: "object" properties: - message: - type: string - insufficient_funds: + amount: + description: Indicates the amount associated with the authorisation code. + allOf: + - $ref: '#/components/schemas/amount' + example: "15.00" + currency: + description: Indicates the Amount Currency. Must be supplied when an amount is supplied. + allOf: + - $ref: '#/components/schemas/currency' + amountType: + $ref: '#/components/schemas/amountType' + codeLifetime: + $ref: '#/components/schemas/codeLifetime' + holdFundsIndicator: + $ref: '#/components/schemas/holdFundsIndicator' + redemptionAccountIdentifiers: + $ref: '#/components/schemas/redemptionAccountIdentifiers' + redemptionChannels: + $ref: '#/components/schemas/redemptionChannels' + redemptionTransactionTypes: + $ref: '#/components/schemas/redemptionTransactionTypes' + requestingOrganisation: + $ref: '#/components/schemas/requestingOrganisation' + requestDate: + $ref: '#/components/schemas/requestDate' + customData: + $ref: '#/components/schemas/customDataArray' + metadata: + $ref: '#/components/schemas/metadataArray' + requestGenericPatchArray: + type: "array" + description: Collection of updates that are to be processed. + items: + $ref: "#/components/schemas/requestGenericPatch" + minItems: 1 + maxItems: 10 + requestGenericPatch: + type: "object" required: - - message - type: object - properties: - message: - type: string - voucher_status: + - "op" + - "path" + - "value" properties: - voucher_status: - type: string + op: + description: Indicates the Patch operation to be performed. 'replace' is used to update a field and 'add' is used to add a new field. + type: "string" enum: - - Not Pre-Activated - - Pre-Activated - - Activated - - Suspended - - Blocked - - Purged - - Not Existing - voucher_amount: - type: string - invalid_validation_request: - type: object - properties: - message: - type: string - voucher_already_used: + - "replace" + - "add" + path: + description: Specify the field to be updated or added preceded by '/'. + type: "string" + maxLength: 256 + value: + description: Specify the value of the field to be updated or added. + type: "string" + maxLength: 256 + + # All the GSMA Mobile Money API Response Schemas are defined here. + + responseTransaction: + type: "object" required: - - message - type: object + - "amount" + - "currency" + - "type" + - "transactionReference" + - "transactionStatus" + - "creditParty" + - "debitParty" properties: - message: - type: string - voucher_expired: + transactionReference: + $ref: '#/components/schemas/transactionReference' + originalTransactionReference: + $ref: '#/components/schemas/originalTransactionReference' + requestingOrganisationTransactionReference: + $ref: '#/components/schemas/requestingOrganisationTransactionReference' + creditParty: + $ref: '#/components/schemas/creditPartyArray' + debitParty: + $ref: '#/components/schemas/debitPartyArray' + type: + $ref: '#/components/schemas/type' + subType: + $ref: '#/components/schemas/subType' + transactionStatus: + $ref: '#/components/schemas/transactionStatus' + amount: + description: The transaction amount. + allOf: + - $ref: '#/components/schemas/amount' + example: "15.23" + currency: + description: Currency of the transaction amount. + allOf: + - $ref: '#/components/schemas/currency' + example: "RWF" + descriptionText: + $ref: '#/components/schemas/descriptionText' + fees: + $ref: '#/components/schemas/feesArray' + geoCode: + $ref: '#/components/schemas/geoCode' + oneTimeCode: + $ref: '#/components/schemas/oneTimeCode' + requestingOrganisation: + $ref: '#/components/schemas/requestingOrganisation' + servicingIdentity: + $ref: '#/components/schemas/servicingIdentity' + transactionReceipt: + $ref: '#/components/schemas/transactionReceipt' + creationDate: + $ref: '#/components/schemas/creationDate' + modificationDate: + $ref: '#/components/schemas/modificationDate' + requestDate: + $ref: '#/components/schemas/requestDate' + customData: + $ref: '#/components/schemas/customDataArray' + metadata: + $ref: '#/components/schemas/metadataArray' + responseTransactionType: + allOf: + - type: "object" + required: + - "amount" + - "currency" + - "type" + - "transactionReference" + - "transactionStatus" + properties: + transactionReference: + $ref: '#/components/schemas/transactionReference' + requestingOrganisationTransactionReference: + $ref: '#/components/schemas/requestingOrganisationTransactionReference' + originalTransactionReference: + $ref: '#/components/schemas/originalTransactionReference' + type: + $ref: '#/components/schemas/type' + subType: + $ref: '#/components/schemas/subType' + transactionStatus: + $ref: '#/components/schemas/transactionStatus' + amount: + description: The transaction amount. + allOf: + - $ref: '#/components/schemas/amount' + example: "15.23" + currency: + description: Currency of the transaction amount. + allOf: + - $ref: '#/components/schemas/currency' + example: "RWF" + descriptionText: + $ref: '#/components/schemas/descriptionText' + fees: + $ref: '#/components/schemas/feesArray' + geoCode: + $ref: '#/components/schemas/geoCode' + oneTimeCode: + $ref: '#/components/schemas/oneTimeCode' + requestingOrganisation: + $ref: '#/components/schemas/requestingOrganisation' + servicingIdentity: + $ref: '#/components/schemas/servicingIdentity' + transactionReceipt: + $ref: '#/components/schemas/transactionReceipt' + creationDate: + $ref: '#/components/schemas/creationDate' + modificationDate: + $ref: '#/components/schemas/modificationDate' + requestDate: + $ref: '#/components/schemas/requestDate' + customData: + $ref: '#/components/schemas/customDataArray' + metadata: + $ref: '#/components/schemas/metadataArray' + - anyOf: + - type: object # This construct allows for conditionality on credit/debit party. Both can be supplied or one or the other can be supplied. + required: + - creditParty + properties: + creditParty: + $ref: '#/components/schemas/creditPartyArray' + - type: object + required: + - debitParty + properties: + debitParty: + $ref: '#/components/schemas/debitPartyArray' + - type: object + required: + - debitParty + - creditParty + properties: + creditParty: + $ref: '#/components/schemas/creditPartyArray' + debitParty: + $ref: '#/components/schemas/debitPartyArray' + responseReversal: + type: "object" required: - - message - type: object + - "type" + - "originalTransactionReference" + - "transactionReference" + - "transactionStatus" properties: - message: - type: string - invalid_voucher: - required: - - message - type: object + transactionReference: + $ref: '#/components/schemas/transactionReference' + requestingOrganisationTransactionReference: + $ref: '#/components/schemas/requestingOrganisationTransactionReference' + originalTransactionReference: + $ref: '#/components/schemas/originalTransactionReference' + creditParty: + $ref: '#/components/schemas/debitPartyArray' + debitParty: + $ref: '#/components/schemas/debitPartyArray' + type: + $ref: '#/components/schemas/typeReversal' + subType: + $ref: '#/components/schemas/subType' + transactionStatus: + $ref: '#/components/schemas/transactionStatus' + amount: + description: The transaction amount. + allOf: + - $ref: '#/components/schemas/amount' + example: "15.23" + currency: + description: Currency of the transaction amount. + allOf: + - $ref: '#/components/schemas/currency' + example: "RWF" + descriptionText: + $ref: '#/components/schemas/descriptionText' + fees: + $ref: '#/components/schemas/feesArray' + geoCode: + $ref: '#/components/schemas/geoCode' + requestingOrganisation: + $ref: '#/components/schemas/requestingOrganisation' + servicingIdentity: + $ref: '#/components/schemas/servicingIdentity' + transactionReceipt: + $ref: '#/components/schemas/transactionReceipt' + creationDate: + $ref: '#/components/schemas/creationDate' + modificationDate: + $ref: '#/components/schemas/modificationDate' + requestDate: + $ref: '#/components/schemas/requestDate' + customData: + $ref: '#/components/schemas/customDataArray' + metadata: + $ref: '#/components/schemas/metadataArray' + responseAccountBalance: + type: "object" properties: - message: - type: string - already_cancelled: + accountStatus: + $ref: '#/components/schemas/accountStatus' + currentBalance: + $ref: '#/components/schemas/currentBalance' + availableBalance: + $ref: '#/components/schemas/availableBalance' + reservedBalance: + $ref: '#/components/schemas/reservedBalance' + unclearedBalance: + $ref: '#/components/schemas/unclearedBalance' + currency: + description: Currency for all returned balances. + allOf: + - $ref: '#/components/schemas/currency' + responseAuthorisationCode: + type: "object" required: - - message - type: object + - "authorisationCode" + - "codeState" properties: - message: - type: string - voucher_cancel_request: + authorisationCode: + $ref: '#/components/schemas/authorisationCode' + codeState: + $ref: '#/components/schemas/codeState' + amount: + description: Indicates the amount associated with the authorisation code. + allOf: + - $ref: '#/components/schemas/amount' + example: "15.00" + currency: + description: Indicates the Amount Currency. Must be supplied when an amount is supplied. + allOf: + - $ref: '#/components/schemas/currency' + amountType: + $ref: '#/components/schemas/amountType' + codeLifetime: + $ref: '#/components/schemas/codeLifetime' + holdFundsIndicator: + $ref: '#/components/schemas/holdFundsIndicator' + redemptionAccountIdentifiers: + $ref: '#/components/schemas/redemptionAccountIdentifiers' + redemptionChannels: + $ref: '#/components/schemas/redemptionChannels' + redemptionTransactionTypes: + $ref: '#/components/schemas/redemptionTransactionTypes' + requestingOrganisation: + $ref: '#/components/schemas/requestingOrganisation' + creationDate: + $ref: '#/components/schemas/creationDate' + modificationDate: + $ref: '#/components/schemas/modificationDate' + requestDate: + $ref: '#/components/schemas/requestDate' + customData: + $ref: '#/components/schemas/customDataArray' + metadata: + $ref: '#/components/schemas/metadataArray' + responseHeartbeat: + type: "object" required: - - Gov_Stack_BB - - voucherserialnumber - type: object + - "serviceStatus" properties: - voucherserialnumber: - type: string - Gov_Stack_BB: - type: string - voucher_cancelled: + serviceStatus: + $ref: '#/components/schemas/serviceStatus' + delay: + $ref: '#/components/schemas/delay' + plannedRestorationTime: + $ref: '#/components/schemas/plannedRestorationTime' + responseResponse: + type: "object" required: - - message - type: object + - "link" properties: - message: - type: string - parameters: - voucherserialnumber: - name: voucherserialnumber - in: path - description: Voucher serial number to check status of + link: + $ref: '#/components/schemas/link' + + # All the GSMA Mobile Money API Request Bodies are defined here. + + requestBodies: + updateError: + required: true + description: Represents the request body of error callback. + content: + application/json: + schema: + $ref: '#/components/schemas/errorObject' + genericUpdateSuccess: + required: true + description: Represents the request body of a success message callback to an update event. + content: + application/json: + schema: + $ref: '#/components/schemas/genericUpdateSuccess' + requestTransactionType: + required: true + description: Represents the request body of a transaction without Type. + content: + application/json: + schema: + $ref: '#/components/schemas/requestTransactionType' + updateTransaction: required: true - style: simple - explode: false + description: Represents the request body of transaction callback. + content: + application/json: + schema: + $ref: '#/components/schemas/responseTransaction' + requestReversal: + required: true + description: Represents the request body of a transaction reversal. + content: + application/json: + schema: + $ref: '#/components/schemas/requestReversal' + updateReversal: + required: true + description: Represents the request body of a reversal callback. + content: + application/json: + schema: + $ref: '#/components/schemas/responseReversal' + genericPatch: + required: true + description: Represents the request body of a batch of generic Patch operation. + content: + application/json: + schema: + $ref: '#/components/schemas/requestGenericPatchArray' + requestAuthorisationCode: + required: true + description: Represents the request body of an Authorisation Code. + content: + application/json: + schema: + $ref: '#/components/schemas/requestAuthorisationCode' + updateAuthorisationCode: + required: true + description: Represents the request body of an Authorisation Code Callback. + content: + application/json: + schema: + $ref: '#/components/schemas/responseAuthorisationCode' + + + # All the GSMA Mobile Money API Response Headers are defined here. + + headers: + X-Date: + description: The date and time that the response message was sent. + schema: + type: "string" + format: "date-time" + X-Records-Available-Count: + description: Integer containing number of records that are available to be returned. schema: - type: string + type: "integer" + format: "int32" + X-Records-Returned-Count: + description: Integer containing number of records that are returned. + schema: + type: "integer" + format: "int32" + + parameters: + + # All the GSMA Mobile Money API Query String, Path and Header parameters are defined here. + X-CorrelationID: - name: X-CorrelationID - in: header + name: "X-CorrelationID" + in: "header" description: Header parameter to uniquely identify the request. Must be supplied as a UUID. required: false - style: simple - explode: false schema: - pattern: ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$ - type: string - X-Date: - name: X-Date - in: header - description: Header parameter to indicate the date and time that the message was originated. It is used for basic message integrity checks, to ensure the request is not stale. Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API. + type: "string" + pattern: "^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$" + X-Date: + name: "X-Date" + in: "header" + description: Header parameter to indicate the date and time that the message + was originated. It is used for basic message integrity checks, to ensure the request is not stale. + Note that the header was previously referenced as 'Date' in version 1.0 of the Mobile Money API. required: false - style: simple - explode: false schema: - type: string - format: date-time + type: "string" + format: "date-time" X-API-Key: - name: X-API-Key - in: header + name: "X-API-Key" + in: "header" description: Used to pass pre-shared client's API key to the server. required: false - style: simple - explode: false schema: - type: string + type: "string" X-User-Bearer: - name: X-User-Bearer - in: header - description: Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication. + name: "X-User-Bearer" + in: "header" + description: Used to pass user’s access token when OAuth 2.0/OIDC authorisation framework is used for end-user authentication required: false - style: simple - explode: false schema: - type: string - X-Client-Id: - name: X-Client-Id - in: header + type: "string" + X-Client-Id: + name: "X-Client-Id" + in: "header" description: Used to pass pre-shared client's identifier to the server. required: false - style: simple - explode: false schema: + type: "string" maxLength: 256 - type: string X-Content-Hash: - name: X-Content-Hash - in: header - description: SHA-256 hex digest of the request content (encrypted or plain). Applicable only if basic data integrity checking is to be performed. + name: "X-Content-Hash" + in: "header" + description: SHA-256 hex digest of the request content (encrypted or plain). + Applicable only if basic data integrity checking is to be performed. required: false - style: simple - explode: false schema: - type: string + type: "string" X-User-Credential-1: - name: X-User-Credential-1 - in: header - description: The end-users encrypted security credential. Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + name: "X-User-Credential-1" + in: "header" + description: The end-users encrypted security credential. + Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. required: false - style: simple - explode: false schema: - type: string + type: "string" X-User-Credential-2: - name: X-User-Credential-2 - in: header - description: The end-users encrypted security credential Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. + name: "X-User-Credential-2" + in: "header" + description: The end-users encrypted security credential + Should only be used when OAuth 2.0/OIDC authorisation framework has not been implemented by the API Provider. required: false - style: simple - explode: false schema: - type: string + type: "string" X-Channel: - name: X-Channel - in: header + name: "X-Channel" + in: "header" description: String containing the channel that was used to originate the request. For example USSD, Web, App. required: false - style: simple - explode: false schema: + type: "string" + maxLength: 256 + transactionTypePath: + name: "transactionType" + in: "path" + required: true + description: Identifies the type of transaction that is to be created. + schema: + type: "string" + enum: + - "billpay" + - "deposit" + - "disbursement" + - "transfer" + - "merchantpay" + - "inttransfer" + - "adjustment" + - "reversal" + - "withdrawal" + transactionReference: + name: "transactionReference" + in: "path" + description: Path variable to uniquely identify the transaction. + required: true + schema: + type: "string" + maxLength: 256 + minLength: 1 + limit: + name: "limit" + in: "query" + description: Supports pagination. If this is not supplied, then the server + will apply a limit of 50 records returned for each request. + required: false + schema: + type: "integer" + format: "int32" + offset: + name: "offset" + in: "query" + description: Supports pagination. This value will indicate the cursor position + from where to retrieve the set of records. For example, a limit of 50 + and offset of 10 will return records 11 to 60. + required: false + schema: + type: "integer" + format: "int32" + fromDateTime: + name: "fromDateTime" + in: "query" + description: Indicates the minimum creation date for which records should be returned. + required: false + schema: + type: "string" + format: "date-time" + toDateTime: + name: "toDateTime" + in: "query" + description: Indicates the maximum creation date for which records should be returned. + required: false + schema: + type: "string" + format: "date-time" + codeState: + name: "codeState" + in: "query" + description: Allows returned records to be filtered on state of the authorisation code. + required: true + schema: + type: "string" + maxLength: 256 + accountId: + name: "accountId" + in: "path" + description: "Path variable to uniquely identify an account. Up to three account identifiers can be supplied. + Identifiers are delimited by $ and values are delimited by @. Example: organisationid@1234$accountid@3333. + Valid account identifiers are accountcategory, bankaccountno, accountrank, identityalias, iban, accountid, + msisdn, swiftbic, sortcode, organisationid, username, walletid, linkref, consumerno, serviceprovider, storeid, + bankname, bankaccounttitle, emailaddress, mandatereference." + required: true + schema: + type: "string" + pattern: ^((accountcategory|bankaccountno|accountrank|identityalias|iban|accountid|msisdn|swiftbic|sortcode|organisationid|username|walletid|linkref|consumerno|serviceprovider|storeid|bankname|bankaccounttitle|emailaddress|mandatereference)@([^$\n]+))(\$(accountcategory|bankaccountno|accountrank|identityalias|iban|accountid|msisdn|swiftbic|sortcode|organisationid|username|walletid|linkref|consumerno|serviceprovider|storeid|bankname|bankaccounttitle|emailaddress|mandatereference)@([^$\n]+)){0,2}$ + transactionStatus: + name: "transactionStatus" + in: "query" + description: Query variable to uniquely identify the transaction status. + required: false + schema: + type: "string" + maxLength: 256 + transactionTypeQuery: + name: "transactionType" + in: "query" + required: false + description: Identifies the type of transaction. + schema: + type: "string" + enum: + - "billpay" + - "deposit" + - "disbursement" + - "transfer" + - "merchantpay" + - "inttransfer" + - "adjustment" + - "reversal" + - "withdrawal" + authorisationCode: + name: "authorisationCode" + in: "path" + description: Path variable to uniquely identify an authorisation code. + required: true + schema: + type: "string" maxLength: 256 - type: string + minLength: 1 + serverCorrelationId: + name: "serverCorrelationId" + in: "path" + description: Path variable to uniquely identify a request state. Must be supplied as a UUID. + required: true + schema: + type: "string" + pattern: "^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$" + clientCorrelationId: + name: "clientCorrelationId" + in: "path" + description: Path variable to uniquely identify a response object. Must be supplied as a UUID. + required: true + schema: + type: "string" + pattern: "^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$" X-Callback-URL: - name: X-Callback-URL - in: header + name: "X-Callback-URL" + in: "header" description: The URL supplied by the client that will be used to return the callback in the form of a HTTP PUT. required: false - style: simple - explode: false schema: - type: string + type: "string" format: uri example: https://myserver.com/send/callback/here - securitySchemes: - app_id: - type: apiKey - description: API key to authorize request - name: appid - in: query + identifierType: + name: "identifierType" + in: "path" + required: true + description: Path variable to specify the type of the identifier that is used to identify the account. + schema: + type: "string" + enum: + - "accountid" + - "msisdn" + - "walletid" + - "linkref" + - "consumerno" + - "serviceprovider" + - "storeid" + - "accountcategory" + - "bankaccountno" + - "accountrank" + - "identityalias" + - "iban" + - "swiftbic" + - "sortcode" + - "organisationid" + - "bankname" + - "bankaccounttitle" + - "username" + - "emailaddress" + - "mandatereference" + identifier: + name: "identifier" + in: "path" + description: Path variable that contains the account identifier. + required: true + schema: + type: "string" + maxLength: 256 + minLength: 1 + X-Account-Holding-Institution-Identifier-Type: + name: "X-Account-Holding-Institution-Identifier-Type" + in: "header" + description: A header variable that identifies the type of the account holding institution. + This header is used to support request routing and should be used in conjunction with + the X-Account-Holding-Institution-Identifier header. + required: false + schema: + type: "string" + enum: + - "lei" + - "swiftbic" + - "organisationid" + X-Account-Holding-Institution-Identifier: + name: "X-Account-Holding-Institution-Identifier" + in: "header" + description: A header variable that identifies the account holding institution. + This header is used to support request routing and should be used in conjunction with + the X-Account-Holding-Institution-Identifier-Type header. + required: false + schema: + type: "string" \ No newline at end of file From bc274bf8067da6657271c82928a61df552a0fe09 Mon Sep 17 00:00:00 2001 From: AKibuuka <43401148+AKibuuka@users.noreply.github.com> Date: Tue, 19 Apr 2022 00:53:08 +0200 Subject: [PATCH 4/4] Update Payee-Initiated Merchant Payment.yaml --- .../Payee-Initiated Merchant Payment.yaml | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Payments/APIS/Payee-Initiated Merchant Payment.yaml b/Payments/APIS/Payee-Initiated Merchant Payment.yaml index 79ff486..f0c34bc 100644 --- a/Payments/APIS/Payee-Initiated Merchant Payment.yaml +++ b/Payments/APIS/Payee-Initiated Merchant Payment.yaml @@ -1,31 +1,31 @@ openapi: 3.0.0 info: description: | - The purpose of this document is to specify the endpoints, fields, objects, and enumerations for Merchant Payment Mobile Money APIs, which are a subset of the GSMA Mobile Money API Specification. - The Merchant Payment Mobile Money APIs allow merchants to accept payments from mobile money customers. Supported payment mechanisms include: + The purpose of this document is to specify the endpoints, fields, objects, and enumerations for government payments. + The Payment Mobile Money APIs allow government to accept payments from mobile money customers. Supported payment mechanisms include: - - Payee-initiated merchant payment. The merchant initiates the payment and the payer is requested to authenticate to confirm acceptance by the mobile money provider. + - Payee-initiated government payment. The Government entity initiates the payment and the payer is requested to authenticate to confirm acceptance by the mobile money provider. - - Payer-initiated merchant payment. The payer initiates the payment by specifying the merchant that is to be paid. + - Payer-initiated government payment. The payer initiates the payment by specifying the government entity that is to be paid. - - Merchant payment via pre-authorised payment code. The payer generates a payment authorisation code up to a maximum payment amount. The merchant then enters or scans (if rendered as a QR code) the payer’s code to perform the payment. + - Government payment via pre-authorised payment code. The payer generates a payment authorisation code up to a maximum payment amount. The government entity then enters or scans (if rendered as a QR code) the payer’s code to perform the payment. - Closed loop and open-loop merchant payments are supported by the Mobile Money API. Closed loop merchant payments occur where the payer and payee accounts reside with the same mobile money provider. + Closed loop and open-loop government entity payments are supported by the Mobile Money API. Closed loop governmnet entity payments occur where the payer and payee accounts reside with the same mobile money provider. Open loop payments occur where the payer and payee accounts reside with different mobile money providers. You can find out more about what the API can do for your business at [https://developer.mobilemoneyapi.io]. version: "1.2.0" - title: Mobile Money API for Merchant Payments + title: Mobile Money API for Government Payments servers: - description: This url points to the GSMA Mobile Money API v1.2 Simulator. url: https://sandbox.mobilemoneyapi.io/simulator/v1.2/passthrough/mm tags: - name: Transactions description: | - Payer-initiated and payee-initiated merchant payments can be created and viewed using **Transactions** APIs. + Payer-initiated and payee-initiated government payments can be created and viewed using **Transactions** APIs. - name: Accounts description: | - Using the **Accounts** APIs, merchants can view payments for their account and view their account balance. + Using the **Accounts** APIs, government entity can view payments for their account and view their account balance. **Identifying a Target Account** @@ -43,7 +43,7 @@ tags: The **Authorisation** Codes APIs allow a payer to generate a payment code which when presented to the payee, can be redeemed for an amount associated with the code. Authorisation codes can be set to expire. Note that expiry time can be specified via the API, however the mobile money provider may mandate a common expiry period for all codes. - Authorisation Codes can be used for pre-authorised codes for merchant payments. The customer generates a code which can be redeemed at a merchant. + Authorisation Codes can be used for pre-authorised codes for Government payments. The customer generates a code which can be redeemed at a government. - name: Supporting description: | Supporting APIs consist of the following: