> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pawapay.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Statements

The statements endpoint allows you to generate a financial statement for a wallet. The statement can be downloaded as a CSV file and optionally as a compressed GZIP file.

Learn more about statements from our [Dashboard docs](/dashboard/finances/statements).

* Each wallet is defined by its **country** and **currency**.
* If you have provider specific wallet, also specify the **provider** for the wallet.
* The **date range** must not exceed **31 days** per statement.
* The statement can be downloaded from the `downloadUrl`.
* The `downloadUrl` **expires after 1 day**.
* Statement data for the current day may be up to **20 minutes behind** the latest transactions.
* Since the request can be rejected, you must check the `status` code in the response for each submitted request. The `failureReason` in the response will contain information about the reason of the rejection.

Each request can get one of the statuses on initiation:

| Status     | <Tooltip tip="Will a callback be sent for this statement?">Callback</Tooltip> | Description                                                           |
| ---------- | ----------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| `ACCEPTED` | Yes                                                                           | The statement has been **accepted** by PawaPay for generation.        |
| `REJECTED` | No                                                                            | The statement has been **rejected**. See `failureReason` for details. |

### How to know which wallets i have?

You can find all your wallets with their balances from the [Wallet Balances](/v2/api-reference/finances/wallet-balances) endpoint.

You can iterate over all of them and use the `country` and `currency` from the response as parameters for your request.
If the response includes a not empty `provider`, it should be passed into the request as well to generate a provider specific wallets statement.

### How to find out the final status of this statement?

As the PawaPay Merchant API is an [asynchronous API](/v2/docs/what_to_know#callbacks), you can find out the final status of the `ACCEPTED` statement by either:

<CardGroup cols={2}>
  <Card title="Waiting for a callback" icon="webhook" href="/v2/api-reference/finances/statement-callback" horizontal="true">
    When a statement has been generated, PawaPay will post a callback to the callbackUrl provided in the statement creation request.
  </Card>

  <Card title="Checking the status" icon="code-compare" href="/v2/api-reference/finances/check-statement-status" horizontal="true">
    Or poll the `Check Statement Status` endpoint.
  </Card>
</CardGroup>


## OpenAPI

````yaml openapi_v2 post /v2/statements
openapi: 3.0.0
info:
  title: PawaPay Merchant API V2
  description: Please find complete documentation from https://docs.pawapay.io/.
  version: v2
  x-logo:
    url: >-
      https://global-uploads.webflow.com/62824591015aa314fd308df1/6411b26596e3de3f52551c00_Logopawapay-p-500.png
    href: https://docs.pawapay.io/
    altText: PawaPay logo
servers:
  - url: https://api.sandbox.pawapay.io
    description: PawaPay Merchant API sandbox
  - url: https://api.pawapay.io
    description: PawaPay Merchant API production
security:
  - bearerAuth: []
tags:
  - name: deposits
    x-displayName: Deposits
  - name: split-payments
    x-displayName: Split Payments
  - name: checkouts
    x-displayName: Checkouts
  - name: payouts
    x-displayName: Payouts
  - name: refunds
    x-displayName: Refunds
  - name: remittances
    x-displayName: Remittances
  - name: payment-page
    x-displayName: Payment Page
  - name: toolkit
    x-displayName: Toolkit
  - name: finances
    x-displayName: Finances
paths:
  /v2/statements:
    post:
      tags:
        - finances
      summary: Statements
      operationId: createStatements
      requestBody:
        $ref: '#/components/requestBodies/StatementCreationRequest'
      responses:
        '200':
          description: Request has been accepted for processing by PawaPay
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StatementCreationResponse'
              examples:
                ACCEPTED:
                  value:
                    statementId: f4401bd2-1568-4140-bf2d-eb77d2b2b639
                    status: ACCEPTED
                    created: '2025-10-19T11:17:01Z'
                INVALID_CALLBACK_URL:
                  value:
                    status: REJECTED
                    failureReason:
                      failureCode: INVALID_CALLBACK_URL
                      failureMessage: Callback URL must be HTTPS.
                INVALID_DATE_RANGE:
                  value:
                    status: REJECTED
                    failureReason:
                      failureCode: INVALID_DATE_RANGE
                      failureMessage: Date range exceeds 31 days.
                WALLET_NOT_FOUND:
                  value:
                    status: REJECTED
                    failureReason:
                      failureCode: WALLET_NOT_FOUND
                      failureMessage: Wallet combination does not exist.
        '400':
          description: >-
            Request was rejected due to incompatibility with PawaPay API
            specification
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/StatementCreationFailureReason'
              examples:
                INVALID_INPUT:
                  value:
                    status: REJECTED
                    failureReason:
                      failureCode: INVALID_INPUT
                      failureMessage: >-
                        We are unable to parse the body of the request. Please
                        consult API documentation for valid request payload.
                MISSING_PARAMETER:
                  value:
                    status: REJECTED
                    failureReason:
                      failureCode: MISSING_PARAMETER
                      failureMessage: >-
                        Request does not include the required parameter
                        'amount'.
                INVALID_PARAMETER:
                  value:
                    status: REJECTED
                    failureReason:
                      failureCode: INVALID_PARAMETER
                      failureMessage: >-
                        Value for parameter 'provider' is invalid. Please
                        consult API documentation for validation rules.
                UNSUPPORTED_PARAMETER:
                  value:
                    status: REJECTED
                    failureReason:
                      failureCode: UNSUPPORTED_PARAMETER
                      failureMessage: >-
                        Request includes an unsupported parameter 'amnt'. Please
                        remove unsupported parameters from request body.
        '401':
          description: >-
            Authentication failed. Make sure you have added the API token into
            the header. If using signatures, make sure they are valid.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/AuthenticationFailureResponse'
              examples:
                AUTHENTICATION_ERROR:
                  value:
                    status: REJECTED
                    failureReason:
                      failureCode: AUTHENTICATION_ERROR
                      failureMessage: The API token in the request is invalid.
        '403':
          description: Authorization failure. Please check your authentication token.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/AuthorizationFailureResponse'
              examples:
                AUTHORISATION_ERROR:
                  value:
                    status: REJECTED
                    failureReason:
                      failureCode: AUTHORISATION_ERROR
                      failureMessage: >-
                        The API token in the request is not authorised for this
                        endpoint.
        '500':
          description: An unknown failure has occured.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/UnknownFailureResponse'
              examples:
                UNKNOWN_ERROR:
                  value:
                    failureReason:
                      failureCode: UNKNOWN_ERROR
                      failureMessage: Unable to process request due to an unknown problem.
components:
  requestBodies:
    StatementCreationRequest:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/StatementCreationRequest'
      required: true
  schemas:
    StatementCreationResponse:
      required:
        - status
        - wallet
      type: object
      properties:
        statementId:
          $ref: '#/components/schemas/StatementId'
        status:
          $ref: '#/components/schemas/StatementCreationStatus'
        created:
          $ref: '#/components/schemas/StatementCreatedTimestamp'
        failureReason:
          $ref: '#/components/schemas/StatementCreationFailureReason'
    StatementCreationFailureReason:
      required:
        - failureCode
      type: object
      properties:
        failureCode:
          type: string
          description: >
            Possible statement failure codes:

            * `NO_AUTHENTICATION` - The API token was not found in the request
            headers.

            * `AUTHENTICATION_ERROR` - The API token in the request headers is
            not valid.

            * `AUTHORISATION_ERROR` - The API Token in the request header is not
            authorised to make this request.

            * `INVALID_INPUT` - We were unable to parse the payload of the
            request.

            * `MISSING_PARAMETER` - A mandatory parameter was missing from the
            request body.

            * `UNSUPPORTED_PARAMETER` - An unsupported parameter was found in
            the request body.

            * `INVALID_PARAMETER` - A parameter had an incorrect value.

            * `INVALID_CALLBACK_URL` - Callback URL must be a valid URL and use
            HTTPS schema.

            * `INVALID_DATE_RANGE` - Date range exceeds 31 days. 

            * `WALLET_NOT_FOUND` - Wallet requested does not exist.
          example: WALLET_NOT_FOUND
          enum:
            - NO_AUTHENTICATION
            - AUTHENTICATION_ERROR
            - AUTHORISATION_ERROR
            - INVALID_INPUT
            - MISSING_PARAMETER
            - UNSUPPORTED_PARAMETER
            - INVALID_PARAMETER
            - INVALID_CALLBACK_URL
            - INVALID_DATE_RANGE
            - WALLET_NOT_FOUND
        failureMessage:
          type: string
          description: Description of the reason for this failure
          example: Wallet does not exist.
    AuthenticationFailureResponse:
      required:
        - failureCode
        - failureMessage
      type: object
      properties:
        status:
          type: string
          enum:
            - REJECTED
          description: The status of the response will always be `REJECTED`
          example: REJECTED
        failureReason:
          $ref: '#/components/schemas/AuthenticationFailureReason'
    AuthorizationFailureResponse:
      required:
        - failureCode
        - failureMessage
      type: object
      properties:
        status:
          type: string
          enum:
            - REJECTED
          description: The status of the response will always be `REJECTED`
          example: REJECTED
        failureReason:
          $ref: '#/components/schemas/AuthorizationFailureReason'
    UnknownFailureResponse:
      required:
        - failureCode
        - failureMessage
      type: object
      properties:
        failureReason:
          type: object
          properties:
            failureCode:
              type: string
              description: >
                Reason for the failure:

                * `UNKNOWN_ERROR` - Unable to process request due to an unknown
                problem.
              example: UNKNOWN_ERROR
            failureMessage:
              type: string
              description: A description of the failure
              example: Unable to process request due to an unknown problem.
    StatementCreationRequest:
      allOf:
        - type: object
          required:
            - wallet
            - callbackUrl
            - startDate
            - endDate
          properties:
            wallet:
              $ref: '#/components/schemas/StatementWallet'
            callbackUrl:
              type: string
              description: >
                The URL where PawaPay will `POST` a callback with the
                `downloadUrl` when the statement has been generated.
              example: https://merchant.com/statementCallbacks
            startDate:
              type: string
              description: >-
                The start date of the statement date range. Format defined by
                'date-time' in RFC3339 section 5.6 from
                [IETF](https://tools.ietf.org/html/rfc3339#section-5.6)
              format: date-time
              example: '2025-05-10T10:00:00'
            endDate:
              type: string
              description: >-
                The end date of the statement date range. Format defined by
                'date-time' in RFC3339 section 5.6 from
                [IETF](https://tools.ietf.org/html/rfc3339#section-5.6)
              format: date-time
              example: '2025-05-11T10:00:00'
            compressed:
              type: boolean
              description: >
                If `true`, the statement will be compressed using gzip and
                returned with a `.csv.gz` extension.

                If `false` or not provided, the statement will be returned as a
                CSV file with a `.csv` extension.
    StatementId:
      minLength: 36
      maxLength: 36
      type: string
      format: uuid
      description: The unique ID for this statement as specified by PawaPay.
      example: f4401bd2-1568-4140-bf2d-eb77d2b2b639
    StatementCreationStatus:
      type: string
      description: >
        The initiation status of the statement: 

        * `ACCEPTED` - The statement has been **accepted** by PawaPay for
        generation.

        * `REJECTED` - The statement request has been **rejected** by PawaPay.
        See failureReason for details.
      enum:
        - ACCEPTED
        - REJECTED
    StatementCreatedTimestamp:
      type: string
      description: >-
        The timestamp of when the statement was created in the PawaPay platform.
        Format defined by 'date-time' in RFC3339 section 5.6 from
        [IETF](https://tools.ietf.org/html/rfc3339#section-5.6)
      format: date-time
      example: '2020-02-21T17:32:29Z'
    AuthenticationFailureReason:
      required:
        - failureReason
      type: object
      properties:
        failureCode:
          type: string
          description: >
            Reason for the failure:

            * `NO_AUTHENTICATION` - The API token was not found in the request
            headers.

            * `AUTHENTICATION_ERROR` - The API token in the request headers is
            not valid.

            * `HTTP_SIGNATURE_ERROR` - The signature you have passed with the
            request did not pass verification.
          enum:
            - NO_AUTHENTICATION
            - AUTHENTICATION_ERROR
            - HTTP_SIGNATURE_ERROR
        failureMessage:
          type: string
          description: A description of the failure
    AuthorizationFailureReason:
      required:
        - failureReason
      type: object
      properties:
        failureCode:
          type: string
          description: >
            Reason for the failure:

            * `AUTHORISATION_ERROR` - The API Token in the request header is not
            authorised to make this request.

            * `DEPOSITS_NOT_ALLOWED` - Deposits are not enabled with the
            provider on your PawaPay account.

            * `PAYOUTS_NOT_ALLOWED` - Payouts are not enabled with the provider
            on your PawaPay account.

            * `REMITTANCES_NOT_ALLOWED` - Remittances are not enabled with the
            provider on your PawaPay account.

            * `REFUNDS_NOT_ALLOWED` - Refunds are not enabled with the provider
            on your PawaPay account.
          enum:
            - AUTHORISATION_ERROR
            - DEPOSITS_NOT_ALLOWED
            - PAYOUTS_NOT_ALLOWED
            - REMITTANCES_NOT_ALLOWED
            - REFUNDS_NOT_ALLOWED
        failureMessage:
          type: string
          description: A description of the failure
    StatementWallet:
      description: >
        Specifies which wallet to generate a statement for.


        You can check which wallets you have from the [wallet
        balances](/v2/api-reference/wallet-balances/wallet-balances) endpoint.
      required:
        - country
        - currency
      type: object
      properties:
        country:
          $ref: '#/components/schemas/StatementCountry'
        currency:
          $ref: '#/components/schemas/StatementCurrency'
        provider:
          $ref: '#/components/schemas/StatementProvider'
    StatementCountry:
      type: string
      minLength: 3
      maxLength: 3
      description: >
        Country code for the wallet you are generating a statement for.


        You can check which wallets you have from the [wallet
        balances](/v2/api-reference/wallet-balances/wallet-balances) endpoint.


        Format is ISO 3166-1 alpha-3, three character country code in upper
        case. Read more from
        [Wikipedia](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3#Officially_assigned_code_elements).
      example: ZMB
    StatementCurrency:
      type: string
      description: >
        ISO currency code for the wallet you are generating a statement for.


        You can check which wallets you have from the [wallet
        balances](/v2/api-reference/wallet-balances/wallet-balances) endpoint.


        Format must be the ISO 4217 three character currency code in upper case.
        Read more from
        [Wikipedia](https://en.wikipedia.org/wiki/ISO_4217#Active_codes).
      example: ZMW
    StatementProvider:
      type: string
      description: >
        If you have provider specific wallets, it indicates which provider
        specific wallet to generate the statement for in this country.


        You can check which wallets you have from the [wallet
        balances](/v2/api-reference/wallet-balances/wallet-balances) endpoint.
      example: MTN_MOMO_ZMB
  securitySchemes:
    bearerAuth:
      type: http
      description: >-
        See
        [Authentication](/v2/docs/how_to_start#how-to-authenticate-calls-to-the-merchant-api).
      scheme: bearer
      bearerFormat: JWT

````