curl --request GET \
--url https://api-dev.rain.xyz/v1/issuing/reports/{year}/{month}/{day} \
--header 'Api-Key: <api-key>'import requests
url = "https://api-dev.rain.xyz/v1/issuing/reports/{year}/{month}/{day}"
headers = {"Api-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'Api-Key': '<api-key>'}};
fetch('https://api-dev.rain.xyz/v1/issuing/reports/{year}/{month}/{day}', 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://api-dev.rain.xyz/v1/issuing/reports/{year}/{month}/{day}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Api-Key: <api-key>"
],
]);
$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://api-dev.rain.xyz/v1/issuing/reports/{year}/{month}/{day}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Api-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api-dev.rain.xyz/v1/issuing/reports/{year}/{month}/{day}")
.header("Api-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-dev.rain.xyz/v1/issuing/reports/{year}/{month}/{day}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Api-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"url": "https://storage.googleapis.com/rain-prod-data/teams/037c3597-9b7f-4a97-9712-dced3ec1956d/servicing/reports/2026-02-14.csv?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Signature=SIGNATURE",
"expiresAt": "2026-02-14T13:00:00.000Z"
}Get a tenant's report
Retrieves the daily report of card transactions for the specified date. The response is a JSON object with a short-lived signed URL ({ url, expiresAt }), not the file itself — download it with curl -o report.csv "<url>". The link expires 1 hour after issuance (expiresAt). Use format=csv (default) or format=json.
curl --request GET \
--url https://api-dev.rain.xyz/v1/issuing/reports/{year}/{month}/{day} \
--header 'Api-Key: <api-key>'import requests
url = "https://api-dev.rain.xyz/v1/issuing/reports/{year}/{month}/{day}"
headers = {"Api-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'Api-Key': '<api-key>'}};
fetch('https://api-dev.rain.xyz/v1/issuing/reports/{year}/{month}/{day}', 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://api-dev.rain.xyz/v1/issuing/reports/{year}/{month}/{day}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Api-Key: <api-key>"
],
]);
$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://api-dev.rain.xyz/v1/issuing/reports/{year}/{month}/{day}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Api-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api-dev.rain.xyz/v1/issuing/reports/{year}/{month}/{day}")
.header("Api-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-dev.rain.xyz/v1/issuing/reports/{year}/{month}/{day}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Api-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"url": "https://storage.googleapis.com/rain-prod-data/teams/037c3597-9b7f-4a97-9712-dced3ec1956d/servicing/reports/2026-02-14.csv?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Signature=SIGNATURE",
"expiresAt": "2026-02-14T13:00:00.000Z"
}Subtenants
PassincludeSubtenants=true to return a combined report covering the tenant and all of its subtenants. When the parameter is false or omitted, the report contains only the tenant’s own data.
Subtenant API keys automatically receive a subtenant-specific report. You don’t need to set includeSubtenants. The includeSubtenants parameter applies to the csv and json formats.
Example report file
The response is a signedurl. A csv report looks like this:
transactionId,transactionDate,transactionType,status,merchantName,merchantCategoryCode,authorizationAmount,authorizationCurrency,settlementAmount,settlementCurrency,interchangeAmount,cardId,cardLast4,cardholder,isThreeDSecureTransaction,isATMTransaction,isATMPremiumTransaction,visaProductType,tokenRequestorId,walletName,isNetworkChipAuthentication,isInternationalTransaction,foreignExchangeFees,crossBorderFees,merchantCountryCode,ledgerSettlementAmount,postedAt,tenantId,billingTenantId
123456789-123456789-123456789,2026-02-14T11:59:40.665Z,spend,closed,PAYPAL,8299,63,usd,63,usd,13860,987654321-987654321-987654321,5618,John Doe,false,false,false,Classic,1234567890,,false,false,0,0,US,63,2026-02-14T11:59:40.665Z,11111111-1111-1111-1111-111111111111,11111111-1111-1111-1111-111111111111
Authorizations
Path Parameters
Year of the report
^\d{4}$Month of the report
^\d{2}$Day of the report
^\d{2}$Query Parameters
The format of the report
csv, json Whether to include subtenant data in the report. When true, returns combined data from tenant and all subtenants. When false or omitted, returns only the tenant's direct data. Subtenants automatically receive subtenant-specific reports.
Response
A short-lived signed URL to download the report. Issue a GET to url to download the file; the link expires at expiresAt (1 hour after issuance).