---
title: "Get payment transaction"
method: GET
path: "/api/apps/{app_id}/payments/analytics/transactions/{transaction_id}"
---

# Get payment transaction

`GET /api/apps/{app_id}/payments/analytics/transactions/{transaction_id}`

## Request

- Base URL: `https://app.base44.com`
- URL: `https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/{transaction_id}`
- Auth: HTTP bearer

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

Returns one payment in full, read live from its payment provider.

Get the required `transaction_id` from [List payment transactions](/api-reference/list-payment-transactions). Send the row's `timestamp` too when you have it, and send `action=refund` for a refund row, since Wix tracks a refund under its own ID.

<Warning>The response includes the customer's personal details, such as the cardholder name, masked card number, and billing email and phone. Only a user with write access to the app can read it, and only with a personal access token set to Full access.</Warning>

Stripe resolves a Checkout Session, invoice, or dispute ID to the charge behind it, so `transaction_id` in the response can differ from the one you sent. Keep using the ID from the transactions list, since that's the one checked against the app.

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

## Path parameters

- `app_id` string, required: ID of the Base44 app.
- `transaction_id` string, required: ID of the transaction, taken from `transaction_id` on a row from [List payment transactions](/api-reference/list-payment-transactions).

## Query parameters

- `provider` 'stripe' | 'wix', required: 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.
- `timestamp` string, date-time: The row's own `timestamp` from [List payment transactions](/api-reference/list-payment-transactions), which makes the lookup faster. Leave it out rather than guess, since a wrong value can make the transaction look like it isn't the app's.
- `action` 'payment' | 'refund': The row's own `action` from the transactions list. Either `payment` or `refund`. Send `refund` for a refund row so the payment it refunded is returned. Defaults to `payment`.

## Response `200`

The payment, in full.

- TransactionDetails: One payment in full, as its payment provider reports it.
  - `transaction_id` string, required: Provider ID of the payment. For Stripe this is the charge, which can differ from the ID you looked it up by.
  - `status` string: Where the payment stands. Either `succeeded`, `pending`, `failed`, `refunded`, `partially_refunded`, `pending_refund`, or `chargeback`. Other provider values come through in lowercase.
  - `payment_type` string: Either `one_time` or `recurring`, or an empty string when the provider doesn't say.
  - `created_date` string: When the payment was made, as an ISO 8601 timestamp. Empty when the provider doesn't say.
  - `currency` string: Three-letter ISO 4217 code of the payment's currency, in uppercase. Defaults to `USD`.
  - `amount` integer: Amount paid, in the smallest unit of the payment's currency.
  - `fee` integer, nullable: Processing fee the provider took, in the smallest unit of the payment's currency, or `null` when none was taken, as on a declined payment.
  - `net` integer, nullable: What the merchant kept after the fee, in the smallest unit of the payment's currency, or `null` when no money moved.
  - `service_fee` integer, nullable: Application fee taken on top of the processing fee, in the smallest unit of the payment's currency, or `null` when there is none.
  - `refunded_amount` integer: Total refunded so far, in the smallest unit of the payment's currency.
  - `refunds` TransactionRefund[]: Refunds against the payment. Empty when there are none.
    - `id` string: Provider ID of the refund.
    - `amount` integer: Amount refunded, in the smallest unit of the payment's currency.
    - `status` string: Where the refund stands. Either `succeeded`, `pending`, or `failed`. Other provider values come through in lowercase.
    - `arn` string, nullable: Acquirer reference number, which the customer's bank can use to trace the refund, or `null` until one is assigned. Always `null` for Stripe.
    - `note` string, nullable: Private note stored with the refund, or `null` when there is none. Always `null` for Stripe.
    - `created_date` string: When the refund was created, as an ISO 8601 timestamp. Empty when the provider doesn't say.
  - `method_kind` string: Payment method type as the provider names it, for example `card`. Empty when the provider doesn't say.
  - `method_moto` boolean: `true` when the merchant entered the card for the customer, as in a phone or mail order, and `false` otherwise. Always `false` for Stripe.
  - `card_network` string, nullable: Card network, or `null` when the payment wasn't by card.
  - `card_masked` string, nullable: Masked card number, or `null` when the payment wasn't by card. Stripe gives only the last four digits.
  - `card_holder` string, nullable: Cardholder name, or `null` when the provider doesn't have it.
  - `provider_id` string: Processor that handled the payment. Always `stripe` for Stripe. For Wix, the processor Wix routed the payment through.
  - `merchant_account_id` string, nullable: Merchant account at the processor, or `null` when unknown. Always `null` for Stripe.
  - `display_order_id` string, nullable: Order number shown to the customer, or `null` when there is none. Always `null` for Stripe.
  - `items` TransactionOrderItem[]: Items bought. Empty when the provider doesn't list them.
    - `name` string: Name of the item. Empty when the provider doesn't say.
    - `quantity` integer: Number of units bought. Defaults to 1.
    - `amount` integer: Price of one unit, in the smallest unit of the payment's currency, rather than the line total.
  - `billing` TransactionAddress: Billing or shipping details. Each provider fills a different subset of the fields.
    - `name` string, nullable: Full name, or `null` when not provided.
    - `address` string, nullable: Street address, or `null` when not provided.
    - `city` string, nullable: City, or `null` when not provided.
    - `state` string, nullable: State or region, or `null` when not provided.
    - `postal_code` string, nullable: Postal code, or `null` when not provided.
    - `country_code` string, nullable: Two-letter country code, or `null` when not provided.
    - `email` string, nullable: Email address, or `null` when not provided.
    - `phone` string, nullable: Phone number, or `null` when not provided.
  - `shipping` TransactionAddress: Billing or shipping details. Each provider fills a different subset of the fields.
    - `name` string, nullable: Full name, or `null` when not provided.
    - `address` string, nullable: Street address, or `null` when not provided.
    - `city` string, nullable: City, or `null` when not provided.
    - `state` string, nullable: State or region, or `null` when not provided.
    - `postal_code` string, nullable: Postal code, or `null` when not provided.
    - `country_code` string, nullable: Two-letter country code, or `null` when not provided.
    - `email` string, nullable: Email address, or `null` when not provided.
    - `phone` string, nullable: Phone number, or `null` when not provided.
  - `disputes` TransactionDispute[]: Disputes against the payment. Empty when there are none.
    - `id` string: Provider ID of the dispute.
    - `state` string: Where the dispute stands. Either `open`, `won`, `lost`, or `accepted`. An `open` dispute needs a response by `deadline`. Other provider values come through in lowercase.
    - `amount` integer: Amount disputed, in the smallest unit of the payment's currency.
    - `fee` integer: Processing fee returned with the dispute, in the smallest unit of the payment's currency. Always 0 for Stripe.
    - `chargeback_fee` integer: Fee charged for the dispute, in the smallest unit of the payment's currency. Always 0 for Stripe.
    - `deadline` string, nullable: Deadline to respond to the dispute, as an ISO 8601 timestamp, or `null` when there is none.
    - `reason` string, nullable: Reason the provider gives for the dispute, or `null` when it gives none.
    - `created_date` string: When the dispute was opened, as an ISO 8601 timestamp. Empty when the provider doesn't say.
  - `history` TransactionHistoryEvent[]: Timeline of the payment, its refunds, and its disputes, newest first.
    - `date` string: When it happened, as an ISO 8601 timestamp. Empty when the provider doesn't say.
    - `kind` string: What happened. Either `payment`, `refund`, or `chargeback`.
    - `status` string: Status of that step, using the same values as the matching payment, refund, or dispute status.
    - `description` string, nullable: Text from the provider, such as a decline reason or dispute reason, or `null` when there is none.
    - `lines` TransactionHistoryLine[]: Money lines for this entry, such as the amount, fee, and net.
      - `label` string, required: What the line is. Either `amount`, `processing_fee`, `net`, `refunded_amount`, `chargeback_amount`, or `chargeback_fee`.
      - `amount` integer, required: Amount of the line, in the smallest unit of the payment's currency. Money that left the merchant, such as a fee, is negative.
  - `decline_reason` string, nullable: Why the payment was declined, as the provider words it, or `null` when it wasn't declined.

## Other responses

- `401`: Missing or invalid credentials.
- `403`: You don't have write access to the app, it doesn't exist, or your personal access token is read-only. A missing app and an app you cannot reach are deliberately the same answer. Also returned when the app's workspace blocks payment management, with `error.code` `app_payment_management_not_allowed`.
- `404`: The app is outside the credential grant, or `provider` isn't connected to the app. Also returned with `error.code` `transaction_not_found` when the transaction isn't one of the app's in the current mode, or the provider doesn't have it.
- `409`: The workspace requires an unlocked SSO session.
- `422`: `provider` is missing or isn't `stripe` or `wix`, `action` isn't `payment` or `refund`, or `timestamp` isn't a valid timestamp.
- `429`: The base limit is 60 requests per minute, scoped to your account rather than the workspace. See [Rate limits](/developers/references/apps-api/get-started/rate-limits) for the multiplier your plan gets.

## Changes

> 58 revisions in range; 1 not diffed.

- **2026-10-21** `c23775445de2`: 3 breaking, 4 info
  - the `query` request parameter `action` was restricted to a list of enum values
  - `query` request parameter `action` list-of-types was narrowed by removing types `null`
  - `query` request parameter `timestamp` list-of-types was narrowed by removing types `null`
  - added the new enum value `payment` to the `query` request parameter `action`
  - …3 more
- **2026-10-12** `5e139db2e643`: 1 info
  - the endpoint scheme security `PersonalAccessTokenAuth` was added to the API
- **2026-09-29** `d2b7ac8beb0c`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/adexad/apis/base44-app-management-api/changes/api/apps/:app_id/payments/analytics/transactions/:transaction_id/get.md)

---

[API](https://skmtc.dev/adexad/apis/base44-app-management-api.md) · [All operations](https://skmtc.dev/adexad/apis/base44-app-management-api/llms.txt) · [OpenAPI document](https://skmtc.dev/adexad/apis/base44-app-management-api/revisions/fa29e915c226?raw)
