curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/export \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/export"
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/export', 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/export",
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/export"
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/export")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/export")
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"\"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"{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Export payment transactions
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 example2026-08-25 10:00:00Customer, the customer’s name or email, or the provider’s customer ID when neither can be resolvedTransaction ID, the provider’s ID for the transactionStatus, eithersucceeded,refunded, orfailedAmount, in the currency’s major unit, so25.00rather than2500Currency, 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.
curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/export \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/export"
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/export', 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/export",
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/export"
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/export")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/payments/analytics/transactions/export")
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"\"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"{
"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 Comma-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 Comma-separated statuses to include, from succeeded, refunded, and failed. For example, succeeded,refunded leaves out lost disputes. Defaults to every status.
Response
The CSV file, sent as an attachment named after the app and today's date.
The response is of type string.
Was this page helpful?