curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/{transaction_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/{transaction_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/{transaction_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/{transaction_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/{transaction_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/{transaction_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/{transaction_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"transaction_id": "ch_T7mK2p9Q4r6S8v",
"status": "partially_refunded",
"payment_type": "one_time",
"created_date": "2026-08-25T10:00:00Z",
"currency": "USD",
"amount": 2500,
"fee": 103,
"net": 2397,
"service_fee": 50,
"refunded_amount": 1000,
"refunds": [
{
"amount": 1000,
"created_date": "2026-08-26T09:15:00Z",
"id": "re_T7mK2p9Q4r6S8v",
"status": "succeeded"
}
],
"method_kind": "card",
"method_moto": false,
"card_network": "visa",
"card_masked": "4242",
"card_holder": "Jane Doe",
"provider_id": "stripe",
"merchant_account_id": "4f1c2a7e-9b3d-4e8f-a6c5-2d7e9f0b1a3c",
"display_order_id": "10042",
"items": [
{
"amount": 2500,
"name": "Oak side table",
"quantity": 1
}
],
"billing": {
"address": "500 Terry Francine St",
"city": "San Francisco",
"country_code": "US",
"email": "jane@example.com",
"name": "Jane Doe",
"phone": "+14155550123",
"postal_code": "94158",
"state": "CA"
},
"shipping": {
"address": "500 Terry Francine St",
"city": "San Francisco",
"country_code": "US",
"name": "Jane Doe",
"phone": "+14155550123",
"postal_code": "94158",
"state": "CA"
},
"disputes": [],
"history": [
{
"date": "2026-08-26T09:15:00Z",
"kind": "refund",
"lines": [
{
"amount": 1000,
"label": "refunded_amount"
}
],
"status": "succeeded"
},
{
"date": "2026-08-25T10:00:00Z",
"kind": "payment",
"lines": [
{
"amount": 2500,
"label": "amount"
},
{
"amount": -103,
"label": "processing_fee"
},
{
"amount": 2397,
"label": "net"
}
],
"status": "succeeded"
}
],
"decline_reason": "Your card has insufficient funds."
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Get payment transaction
Returns one payment in full, read live from its payment provider.
That covers the fee and net amount, refunds, disputes, the payment method, purchased items, the billing and shipping details, and a timeline of what happened to the payment.
Get transaction_id from 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.
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.
This is limited to 60 requests a minute per user. Some workspaces have a different limit.
curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/{transaction_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/{transaction_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/{transaction_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/{transaction_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/{transaction_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/{transaction_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/{transaction_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"transaction_id": "ch_T7mK2p9Q4r6S8v",
"status": "partially_refunded",
"payment_type": "one_time",
"created_date": "2026-08-25T10:00:00Z",
"currency": "USD",
"amount": 2500,
"fee": 103,
"net": 2397,
"service_fee": 50,
"refunded_amount": 1000,
"refunds": [
{
"amount": 1000,
"created_date": "2026-08-26T09:15:00Z",
"id": "re_T7mK2p9Q4r6S8v",
"status": "succeeded"
}
],
"method_kind": "card",
"method_moto": false,
"card_network": "visa",
"card_masked": "4242",
"card_holder": "Jane Doe",
"provider_id": "stripe",
"merchant_account_id": "4f1c2a7e-9b3d-4e8f-a6c5-2d7e9f0b1a3c",
"display_order_id": "10042",
"items": [
{
"amount": 2500,
"name": "Oak side table",
"quantity": 1
}
],
"billing": {
"address": "500 Terry Francine St",
"city": "San Francisco",
"country_code": "US",
"email": "jane@example.com",
"name": "Jane Doe",
"phone": "+14155550123",
"postal_code": "94158",
"state": "CA"
},
"shipping": {
"address": "500 Terry Francine St",
"city": "San Francisco",
"country_code": "US",
"name": "Jane Doe",
"phone": "+14155550123",
"postal_code": "94158",
"state": "CA"
},
"disputes": [],
"history": [
{
"date": "2026-08-26T09:15:00Z",
"kind": "refund",
"lines": [
{
"amount": 1000,
"label": "refunded_amount"
}
],
"status": "succeeded"
},
{
"date": "2026-08-25T10:00:00Z",
"kind": "payment",
"lines": [
{
"amount": 2500,
"label": "amount"
},
{
"amount": -103,
"label": "processing_fee"
},
{
"amount": 2397,
"label": "net"
}
],
"status": "succeeded"
}
],
"decline_reason": "Your card has insufficient funds."
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Personal access token, sent as Authorization: Bearer <token>.
Path Parameters
ID of the Base44 app.
ID of the transaction, taken from transaction_id on a row from List payment transactions.
Query Parameters
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.
stripe, wix The row's own timestamp from 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.
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.
payment, refund Response
The payment, as the provider reports it now.
One payment in full, as its payment provider reports it.
Provider ID of the payment. For Stripe this is the charge, which can differ from the ID you looked it up by.
"ch_T7mK2p9Q4r6S8v"
Where the payment stands. Either succeeded, pending, failed, refunded, partially_refunded, pending_refund, or chargeback. Other provider values come through in lowercase.
"partially_refunded"
Either one_time or recurring, or an empty string when the provider doesn't say.
"one_time"
When the payment was made, as an ISO 8601 timestamp. Empty when the provider doesn't say.
"2026-08-25T10:00:00Z"
Three-letter ISO 4217 code of the payment's currency, in uppercase. Defaults to USD.
"USD"
Amount paid, in the smallest unit of the payment's currency.
2500
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.
103
What the merchant kept after the fee, in the smallest unit of the payment's currency, or null when no money moved.
2397
Application fee taken on top of the processing fee, in the smallest unit of the payment's currency, or null when there is none.
50
Total refunded so far, in the smallest unit of the payment's currency.
1000
Refunds against the payment. Empty when there are none.
Show child attributes
Show child attributes
[
{
"amount": 1000,
"created_date": "2026-08-26T09:15:00Z",
"id": "re_T7mK2p9Q4r6S8v",
"status": "succeeded"
}
]
Payment method type as the provider names it, for example card. Empty when the provider doesn't say.
"card"
true when the merchant entered the card for the customer, as in a phone or mail order, and false otherwise. Always false for Stripe.
false
Card network, or null when the payment wasn't by card.
"visa"
Masked card number, or null when the payment wasn't by card. Stripe gives only the last four digits.
"4242"
Cardholder name, or null when the provider doesn't have it.
"Jane Doe"
Processor that handled the payment. Always stripe for Stripe. For Wix, the processor Wix routed the payment through.
"stripe"
Merchant account at the processor, or null when unknown. Always null for Stripe.
"4f1c2a7e-9b3d-4e8f-a6c5-2d7e9f0b1a3c"
Order number shown to the customer, or null when there is none. Always null for Stripe.
"10042"
Items bought. Empty when the provider doesn't list them.
Show child attributes
Show child attributes
[
{
"amount": 2500,
"name": "Oak side table",
"quantity": 1
}
]
Billing details the customer gave, or null when there are none.
Show child attributes
Show child attributes
{
"address": "500 Terry Francine St",
"city": "San Francisco",
"country_code": "US",
"email": "jane@example.com",
"name": "Jane Doe",
"phone": "+14155550123",
"postal_code": "94158",
"state": "CA"
}
Shipping details, or null when the payment has none.
Show child attributes
Show child attributes
{
"address": "500 Terry Francine St",
"city": "San Francisco",
"country_code": "US",
"name": "Jane Doe",
"phone": "+14155550123",
"postal_code": "94158",
"state": "CA"
}
Disputes against the payment. Empty when there are none.
Show child attributes
Show child attributes
[]
Timeline of the payment, its refunds, and its disputes, newest first.
Show child attributes
Show child attributes
[
{
"date": "2026-08-26T09:15:00Z",
"kind": "refund",
"lines": [
{
"amount": 1000,
"label": "refunded_amount"
}
],
"status": "succeeded"
},
{
"date": "2026-08-25T10:00:00Z",
"kind": "payment",
"lines": [
{ "amount": 2500, "label": "amount" },
{ "amount": -103, "label": "processing_fee" },
{ "amount": 2397, "label": "net" }
],
"status": "succeeded"
}
]
Why the payment was declined, as the provider words it, or null when it wasn't declined.
"Your card has insufficient funds."
Was this page helpful?