Statements
Luqra generates a monthly statement for each originator: a PDF report and a CSV export itemizing every transaction in the period. Use the Statements API to list available statements and download either format.
List statements
curl "https://{api-host}/v1/statements" \
-H "Authorization: Bearer $YOUR_API_KEY"
Query parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
cursor |
string | -- | Opaque pagination token. Omit on the first request; pass the nextCursor from the previous response to fetch the next page. |
limit |
integer | 20 |
Results per page (1--100) |
originatorId |
UUID | -- | Filter to a single originator |
periodYear |
integer | -- | Filter by year (2000--2999) |
periodMonth |
integer | -- | Filter by month (1--12) |
Response
All total*MinorUnits fields are numbers in minor units (cents for USD). For example, 5000000 = $50,000.00.
{
"data": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"originatorId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"periodYear": 2026,
"periodMonth": 3,
"timezone": "America/New_York",
"generatedAt": "2026-04-01T02:00:00.000Z",
"pdfReady": true,
"csvReady": true,
"pdfSizeBytes": 102400,
"csvSizeBytes": 8192,
"totalPaymentCount": 150,
"totalReturnCount": 3,
"totalFeeCount": 150,
"totalProcessingVolumeMinorUnits": 5000000,
"totalReturnVolumeMinorUnits": 75000,
"totalDiscountFeesMinorUnits": 5000,
"totalDiscountRateMinorUnits": 5000,
"totalTransactionFeesMinorUnits": 3750,
"totalReturnFeesMinorUnits": 7500,
"totalServiceFeesMinorUnits": 3000
}
],
"meta": {
"timestamp": "2026-05-01T10:00:00.000Z",
"pagination": {
"limit": 20,
"nextCursor": null
}
}
}
Fields
| Field | Type | Description |
|---|---|---|
id |
UUID | Statement ID |
originatorId |
UUID | Originator this statement belongs to |
periodYear |
integer | Billing year |
periodMonth |
integer | Billing month (1--12) |
timezone |
string | IANA timezone used for period boundaries |
generatedAt |
ISO 8601 | When the statement was generated. Generation is anchored to the 1st of the month following the period end in the originator's configured timezone, then shifted forward by the originator's configured delay. As a result, generatedAt can vary across originators even for the same period |
pdfReady |
boolean | Whether the PDF is available for download |
csvReady |
boolean | Whether the CSV export is available for download |
pdfSizeBytes |
integer | null | PDF file size in bytes. null until the PDF is rendered. |
csvSizeBytes |
integer | null | CSV file size in bytes. null until the CSV is generated. |
totalPaymentCount |
integer | Payments processed in the period |
totalReturnCount |
integer | Returns in the period |
totalFeeCount |
integer | Fee transactions in the period |
totalProcessingVolumeMinorUnits |
number | Total payment volume processed |
totalReturnVolumeMinorUnits |
number | Total returned payment volume |
totalDiscountFeesMinorUnits |
number | Volume-based discount fees charged in the period |
totalDiscountRateMinorUnits |
number | Deprecated. Mirrors totalDiscountFeesMinorUnits. The name is a misnomer -- the value is an amount, not a rate. Migrate to totalDiscountFeesMinorUnits; this field will be removed in a future release. |
totalTransactionFeesMinorUnits |
number | Per-transaction flat fees |
totalReturnFeesMinorUnits |
number | Return fees charged |
totalServiceFeesMinorUnits |
number | Monthly service fees charged |
Error responses
| Code | Reason |
|---|---|
400 |
Invalid query parameters |
401 |
Missing or invalid API key |
Get a statement download URL
Returns a short-lived signed URL for downloading the statement PDF or its CSV export. The URL expires in 15 minutes.
curl "https://{api-host}/v1/statements/STATEMENT_ID/download" \
-H "Authorization: Bearer $YOUR_API_KEY"
To download the CSV export instead:
curl "https://{api-host}/v1/statements/STATEMENT_ID/download?format=csv" \
-H "Authorization: Bearer $YOUR_API_KEY"
Query parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
format |
string | pdf |
Which rendition to download: pdf or csv |
The CSV export contains every line item in the statement period -- one row per transaction with the columns Date, Type, Counterparty, Description, External ID, Amount, Discount Fee, Transaction Fee, and Return Fee. Type is one of PAYMENT, RETURN, FEE_COLLECTION, or REFUND, and amounts are decimal dollar values. Unlike the PDF, whose itemized section lists only returns, refunds, and fee collections, the CSV is the complete transaction ledger.
Response
{
"data": {
"url": "https://storage.googleapis.com/luqra-statements/...",
"expiresAt": "2026-05-01T10:15:00.000Z"
},
"meta": { "timestamp": "2026-05-01T10:00:00.000Z" }
}
The url is a pre-signed download URL that streams the file directly with an attachment content disposition (application/pdf or text/csv). Use it before expiresAt; request a fresh URL whenever you need to download again.
Error responses
| Code | Reason |
|---|---|
400 |
Invalid statement ID format, or format is not pdf or csv |
401 |
Missing or invalid API key |
404 |
Statement not found or does not belong to your organization |
409 |
Requested file is not yet generated -- check pdfReady: true (or csvReady: true for format=csv) before requesting a download URL |