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

# Export payment transactions

> <Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Downloads the app's payments, refunds, and lost disputes for one payment provider as a CSV file, newest first.

The file starts with a header row, then has one row per transaction with these columns:
- `Date`, the transaction time in UTC as the analytics store records it, for example `2026-08-25 10:00:00`
- `Customer`, the customer's name or email, or the provider's customer ID when neither can be resolved
- `Transaction ID`, the provider's ID for the transaction
- `Status`, either `succeeded`, `refunded`, or `failed`
- `Amount`, in the currency's major unit, so `25.00` rather than `2500`
- `Currency`, as an uppercase three-letter ISO 4217 code

Every cell is quoted. A cell a spreadsheet would read as a formula starts with `'`.

The file covers the app's whole history unless you pass `period` or both `start_date` and `end_date`. It stops at 10,000 rows without saying so in the file, so narrow the window when a download reaches that size.

Customer names are looked up from the provider within a 20-second budget for the whole file, so a large export can leave some `Customer` cells with only an ID, or empty.

For `stripe`, transactions come from live mode when the app uses a live Stripe key, and from test mode otherwise. For `wix`, they're live payments. While the app's Wix Payments checkout is in test mode, some accounts see its test payments instead.

Results come from an analytics store and can lag behind the payment provider.

This is limited to 5 requests an hour per user. Some workspaces have a different limit.

<Note>This endpoint accepts a personal API key belonging to a user with write access to the app. A read-only key is refused, and so is a viewer.</Note>



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json get /api/apps/{app_id}/payments/analytics/transactions/export
openapi: 3.1.0
info:
  title: Base44 App Management API
  version: 1.0.0
servers:
  - url: https://app.base44.com
security:
  - PersonalAccessTokenAuth: []
paths:
  /api/apps/{app_id}/payments/analytics/transactions/export:
    get:
      summary: Export payment transactions
      description: >-
        <Info>This API is in beta. Endpoints, fields, and behavior may still
        change, so avoid depending on it in production.</Info>


        Downloads the app's payments, refunds, and lost disputes for one payment
        provider as a CSV file, newest first.


        The file starts with a header row, then has one row per transaction with
        these columns:

        - `Date`, the transaction time in UTC as the analytics store records it,
        for example `2026-08-25 10:00:00`

        - `Customer`, the customer's name or email, or the provider's customer
        ID when neither can be resolved

        - `Transaction ID`, the provider's ID for the transaction

        - `Status`, either `succeeded`, `refunded`, or `failed`

        - `Amount`, in the currency's major unit, so `25.00` rather than `2500`

        - `Currency`, as an uppercase three-letter ISO 4217 code


        Every cell is quoted. A cell a spreadsheet would read as a formula
        starts with `'`.


        The file covers the app's whole history unless you pass `period` or both
        `start_date` and `end_date`. It stops at 10,000 rows without saying so
        in the file, so narrow the window when a download reaches that size.


        Customer names are looked up from the provider within a 20-second budget
        for the whole file, so a large export can leave some `Customer` cells
        with only an ID, or empty.


        For `stripe`, transactions come from live mode when the app uses a live
        Stripe key, and from test mode otherwise. For `wix`, they're live
        payments. While the app's Wix Payments checkout is in test mode, some
        accounts see its test payments instead.


        Results come from an analytics store and can lag behind the payment
        provider.


        This is limited to 5 requests an hour per user. Some workspaces have a
        different limit.


        <Note>This endpoint accepts a personal API key belonging to a user with
        write access to the app. A read-only key is refused, and so is a
        viewer.</Note>
      operationId: >-
        export_transactions_csv_api_apps__app_id__payments_analytics_transactions_export_get
      parameters:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the Base44 app.
            title: App Id
          description: ID of the Base44 app.
          example: 6820f3a4e7b91d003c45a1f2
        - name: start_date
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                format: date-time
              - type: 'null'
            description: >-
              Start of the window as an ISO 8601 timestamp. Send it with
              `end_date`, because a date sent on its own is ignored.
            title: Start Date
          description: >-
            Start of the window as an ISO 8601 timestamp. Send it with
            `end_date`, because a date sent on its own is ignored.
          example: '2026-08-01T00:00:00Z'
        - name: end_date
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                format: date-time
              - type: 'null'
            description: >-
              End of the window as an ISO 8601 timestamp. Send it with
              `start_date`.
            title: End Date
          description: >-
            End of the window as an ISO 8601 timestamp. Send it with
            `start_date`.
          example: '2026-08-31T23:59:59Z'
        - name: period
          in: query
          required: false
          schema:
            anyOf:
              - enum:
                  - 7d
                  - 30d
                  - 90d
                type: string
              - type: 'null'
            description: >-
              Window to use when you don't send both dates, counted back over
              whole UTC days including today. Either `7d`, `30d`, or `90d`.
              Defaults to no window, which covers the app's whole history.
            title: Period
          description: >-
            Window to use when you don't send both dates, counted back over
            whole UTC days including today. Either `7d`, `30d`, or `90d`.
            Defaults to no window, which covers the app's whole history.
          example: 30d
        - name: currencies
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Comma-separated currency codes, for example `usd,eur`. Defaults to
              no currency filter.
            title: Currencies
          description: >-
            Comma-separated currency codes, for example `usd,eur`. Defaults to
            no currency filter.
          example: usd
        - name: provider
          in: query
          required: true
          schema:
            enum:
              - stripe
              - wix
            type: string
            description: >-
              Payment provider whose transactions to use. Either `stripe` or
              `wix`. `stripe` covers payments taken through the app's Stripe
              integration, and `wix` covers payments taken through Wix Payments
              (Base44 Payments). The provider has to be connected to the app.
            title: Provider
          description: >-
            Payment provider whose transactions to use. Either `stripe` or
            `wix`. `stripe` covers payments taken through the app's Stripe
            integration, and `wix` covers payments taken through Wix Payments
            (Base44 Payments). The provider has to be connected to the app.
          example: stripe
        - name: status
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Comma-separated statuses to include, from `succeeded`, `refunded`,
              and `failed`. For example, `succeeded,refunded` leaves out lost
              disputes. Defaults to every status.
            title: Status
          description: >-
            Comma-separated statuses to include, from `succeeded`, `refunded`,
            and `failed`. For example, `succeeded,refunded` leaves out lost
            disputes. Defaults to every status.
          example: succeeded,refunded
      responses:
        '200':
          description: >-
            The CSV file, sent as an attachment named after the app and today's
            date.
          content:
            text/csv:
              schema:
                type: string
              example: "\"Date\",\"Customer\",\"Transaction ID\",\"Status\",\"Amount\",\"Currency\"\r\n\"2026-08-25 10:00:00\",\"Jane Doe\",\"pi_T7mK2p9Q4r6S8v\",\"succeeded\",\"25.00\",\"USD\"\r\n"
        '400':
          description: >-
            `status` has a value other than `succeeded`, `refunded`, or
            `failed`.
        '401':
          description: Missing or invalid credentials.
        '403':
          description: >-
            You don't have write access to the app, it doesn't exist, or your
            API key is read-only. A missing app and an app you cannot reach are
            deliberately the same answer.
        '404':
          description: >-
            The app is outside the credential grant, or `provider` isn't
            connected to the app.
        '409':
          description: The workspace requires an unlocked SSO session.
        '422':
          description: >-
            `provider` is missing or isn't `stripe` or `wix`, or another
            parameter has the wrong type.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '429':
          description: Rate limit reached. Retry later.
components:
  schemas:
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
  securitySchemes:
    PersonalAccessTokenAuth:
      type: http
      scheme: bearer
      description: 'Personal access token, sent as `Authorization: Bearer <token>`.'

````