curl --request GET \
--url https://{host}/primula/api/v3/payments \
--header 'Authorization: Bearer <token>'import requests
url = "https://{host}/primula/api/v3/payments"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://{host}/primula/api/v3/payments', 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://{host}/primula/api/v3/payments",
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://{host}/primula/api/v3/payments"
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://{host}/primula/api/v3/payments")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://{host}/primula/api/v3/payments")
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[
{
"payment_id": "66666666-6666-4666-8666-666666666666",
"family_id": "77777777-7777-4777-8777-777777777777",
"family_name": "Example family",
"transaction_date": "2026-01-15",
"amount": 100,
"total_amount": 100,
"state": "paid"
}
]List payments
Scoped to company_id; the handler does not restrict this read to the session school assignments. Without group_by, returns sparse payment rows. With group_by and metrics, returns nested PaymentAggregate rows. school_id and school_ids are both applied when provided (their intersection); omitted school filters read the company scope. Row queries support family_id/family_ids; these IDs do not filter the aggregate representation. fields and pagination apply only to rows. Aggregate responses use limit, X-Total-Count and X-Truncated, without Link.
An explicit date range requires both bounds and date_to >= date_from. These date checks occur in the data layer; failures currently produce HTTP 500 rather than 400. last_n_days and explicit bounds can both restrict the result. Item and collection school filters are independent of the session school assignments.
curl --request GET \
--url https://{host}/primula/api/v3/payments \
--header 'Authorization: Bearer <token>'import requests
url = "https://{host}/primula/api/v3/payments"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://{host}/primula/api/v3/payments', 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://{host}/primula/api/v3/payments",
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://{host}/primula/api/v3/payments"
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://{host}/primula/api/v3/payments")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://{host}/primula/api/v3/payments")
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[
{
"payment_id": "66666666-6666-4666-8666-666666666666",
"family_id": "77777777-7777-4777-8777-777777777777",
"family_name": "Example family",
"transaction_date": "2026-01-15",
"amount": 100,
"total_amount": 100,
"state": "paid"
}
]Authorizations
Access token issued by POST /sessions and associated with a valid server-side session.
Query Parameters
Company UUID. Must equal the authenticated session company when that session has a company assigned; the equality check is skipped for sessions without one.
School UUID. Omit to use the operation's documented company/session scope.
Optional school UUID filter. When school_id is also supplied, both filters apply. Accepts repeated query parameters or comma-separated values; empty entries are dropped and surrounding whitespace is trimmed.
Row view only: optional family UUID. When family_ids is also supplied, the reader first restricts to this family; family_ids cannot widen that scope.
Optional family UUIDs; row view only. Accepts repeated query parameters or comma-separated values; empty entries are dropped and surrounding whitespace is trimmed.
Case-insensitive family-name substring filter.
Inclusive start date in YYYY-MM-DD. Optional; both date bounds must be supplied together and date_to must not precede date_from.
Inclusive end date in YYYY-MM-DD. Optional; both date bounds must be supplied together and date_to must not precede date_from.
Rolling lookback on payment created_at (not transaction_date). Positive values add this filter; zero/negative values do not. May be combined with a transaction-date range.
Case-insensitive payment state filter.
Filter by posted state; omit for both states. Accepts true/1 and false/0, case-insensitive.
Include payments that are posted or whose normalized state is success, succeeded, completed, paid, posted, processed, settled or state_success. Only true/1 enables the filter; other values disable it.
Case-insensitive payment mode filter.
Case-insensitive payment method subtype filter.
Inclusive minimum payment amount.
Inclusive maximum payment amount.
Select response properties. Unknown names return 400. Default: payment_id, family_id, family_name, transaction_date, amount, total_amount, state. Row view only. Accepts repeated query parameters or comma-separated values; empty entries are dropped and surrounding whitespace is trimmed.
payment_id, transaction_id, school_id, family_id, family_name, transaction_date, amount, fee_amount, total_amount, balance, state, receipt_number, payment_mode, payment_method_sub_kind, description, is_posted, payd_online, auto_billing, created_at Rows: transaction_date, amount, total_amount, created_at or family_name with _asc/_desc (default transaction_date_desc). Aggregates: group or any supported metric with _asc/_desc. Unrecognized sort keys fall back to the backend default. Aggregate default: count_desc.
Select an aggregate representation; metrics must also be supplied.
school_id, family_id, month, state, payment_mode, payment_method_sub_kind Metrics to calculate; required with group_by and invalid without it. Accepts repeated query parameters or comma-separated values; empty entries are dropped and surrounding whitespace is trimmed.
count, sum_amount, sum_total_amount, sum_fee_amount, avg_amount, avg_total_amount, avg_fee_amount Aggregate result limit. Defaults to 50 and clamps values above 200 to 200. Zero and negative values use the default.
One-based page number. Row view only.
x >= 1Items per page; values greater than 200 are clamped to 200. Row view only.
x >= 1Response
Successful response.
- Option 1 · object[]
- Option 2 · object[]
A sparse row containing only the selected fields. Default fields: payment_id, family_id, family_name, transaction_date, amount, total_amount, state.
Payment id.
Transaction id.
School id.
Family id.
Local timestamp in YYYY-MM-DD HH:mm:ss format; no timezone suffix.
"2026-01-15 09:30:00"