curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions"
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', 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",
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"
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")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions")
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{
"transactions": [
{
"action": "payment",
"amount": 2500,
"currency": "usd",
"customer_email": "jane@example.com",
"customer_id": "cus_T7mK2p9Q4r6S8v",
"customer_name": "Jane Doe",
"is_live": true,
"status": "succeeded",
"timestamp": "2026-08-25T10:00:00Z",
"transaction_id": "pi_T7mK2p9Q4r6S8v"
}
],
"total": 347,
"has_more": true
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}List payment transactions
Returns one page of the app’s payments, refunds, and lost disputes for one payment provider, newest first.
Unlike Get recent payment transactions, this covers the app’s whole history unless you pass period or both start_date and end_date. Each row carries the customer’s name and email when the provider can resolve them, including for a guest checkout.
New transactions are added at the top of the list, so one recorded while you’re paging shifts the rest down and can cause a row to repeat at a page boundary.
Each row’s is_live comes from the payment provider’s own record of the payment, so it tells a real payment from a test one. Without mode, the list covers one mode per provider:
- Stripe: Live when the app’s stored key is a live key, test otherwise.
- Wix Payments: Live, unless test-mode reporting is enabled for your account. Then it follows the app’s Wix Payments test-mode setting.
Pass mode to choose instead. To see both, list live and test separately.
Results come from an analytics store and can lag behind the payment provider.
curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions"
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', 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",
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"
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")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions")
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{
"transactions": [
{
"action": "payment",
"amount": 2500,
"currency": "usd",
"customer_email": "jane@example.com",
"customer_id": "cus_T7mK2p9Q4r6S8v",
"customer_name": "Jane Doe",
"is_live": true,
"status": "succeeded",
"timestamp": "2026-08-25T10:00:00Z",
"transaction_id": "pi_T7mK2p9Q4r6S8v"
}
],
"total": 347,
"has_more": true
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Personal access token, sent as Authorization: Bearer <token>. Each operation lists the permission it needs: read_only or full_access. A full-access token can call every operation. A read-only token can call only the operations that list read_only; anything else returns 403 read_only_credential_route_not_allowed.
Path Parameters
ID of the Base44 app.
Query Parameters
Start of the window as an ISO 8601 timestamp. Send it with end_date, because a date sent on its own is ignored.
End of the window as an ISO 8601 timestamp. Send it with start_date.
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.
7d, 30d, 90d Number of rows to skip, which is the number you've already read. Defaults to 0.
x >= 0Items per page. Max 100. Defaults to 50.
1 <= x <= 100Comma-separated currency codes, for example usd,eur. Defaults to no currency filter.
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 Which payments to list. Either live for real payments or test for test payments. Defaults to one mode per provider, as the endpoint description explains.
live, test Response
One page of the app's transactions.
One page of an app's payment transactions.
Transactions on this page, newest first. Empty when none match or offset is past the end.
Show child attributes
Show child attributes
[
{
"action": "payment",
"amount": 2500,
"currency": "usd",
"customer_email": "jane@example.com",
"customer_id": "cus_T7mK2p9Q4r6S8v",
"customer_name": "Jane Doe",
"is_live": true,
"status": "succeeded",
"timestamp": "2026-08-25T10:00:00Z",
"transaction_id": "pi_T7mK2p9Q4r6S8v"
}
]
Total number of matching transactions.
347
Whether there are more items to fetch.
true
Was this page helpful?