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.
Pages use offset and limit. Pass the number of rows you’ve read so far as offset, and stop when has_more is false. New transactions are added at the top, so one recorded while you page shifts the rest down and can repeat a row at a page boundary.
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. Read is_live on each row to tell them apart.
Results come from an analytics store and can lag behind the payment provider.
This is limited to 120 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 \
--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>.
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 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?