curl --request GET \
--url https://api.scrip.dev/v1/reports/liability-rollforward \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.scrip.dev/v1/reports/liability-rollforward"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.scrip.dev/v1/reports/liability-rollforward', 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.scrip.dev/v1/reports/liability-rollforward",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-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.scrip.dev/v1/reports/liability-rollforward"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-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.scrip.dev/v1/reports/liability-rollforward")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scrip.dev/v1/reports/liability-rollforward")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"adjustments_net": "0.00",
"asset_id": "550e8400-e29b-41d4-a716-446655440000",
"asset_name": "Loyalty Points",
"asset_symbol": "POINTS",
"bucket_movements_net": "0.00",
"closing_balance": "561400.00",
"debited": "300.00",
"expired": "2500.00",
"forfeited": "2000.00",
"holds_voided": "0.00",
"issuance_returns": "500.00",
"issued": "150000.00",
"opening_balance": "500000.00",
"program_id": "550e8400-e29b-41d4-a716-446655440001",
"program_name": "Premium Rewards",
"redeemed": "85000.00",
"redemption_receipts": "0.00",
"redemption_reversals": "1200.00",
"reversal_clawbacks": "0.00",
"scale": 2,
"transfers_net": "0.00"
}
],
"from": "2026-01-01T00:00:00Z",
"pagination": {
"has_more": true,
"next_cursor": "YWJjMTIz"
},
"to": "2026-03-31T23:59:59Z"
}{
"code": "bad_request",
"details": {
"expected": "<string>",
"field": "<string>",
"fields": [
{
"expected": "<unknown>",
"field": "<string>",
"message": "This field is required",
"reason": "required",
"received": "<string>"
}
],
"reason": "invalid",
"received": "<string>"
},
"message": "Invalid request parameters"
}{
"code": "unauthorized",
"details": {
"expected": "<string>",
"field": "<string>",
"fields": [
{
"expected": "<unknown>",
"field": "<string>",
"message": "This field is required",
"reason": "required",
"received": "<string>"
}
],
"reason": "invalid",
"received": "<string>"
},
"message": "Missing or invalid credentials"
}{
"code": "internal_error",
"message": "An internal error occurred"
}Get liability rollforward
Returns the period liability rollforward decomposed by action type; lines sum exactly to closing minus opening, with no residual plug.
curl --request GET \
--url https://api.scrip.dev/v1/reports/liability-rollforward \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.scrip.dev/v1/reports/liability-rollforward"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.scrip.dev/v1/reports/liability-rollforward', 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.scrip.dev/v1/reports/liability-rollforward",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-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.scrip.dev/v1/reports/liability-rollforward"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-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.scrip.dev/v1/reports/liability-rollforward")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scrip.dev/v1/reports/liability-rollforward")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"adjustments_net": "0.00",
"asset_id": "550e8400-e29b-41d4-a716-446655440000",
"asset_name": "Loyalty Points",
"asset_symbol": "POINTS",
"bucket_movements_net": "0.00",
"closing_balance": "561400.00",
"debited": "300.00",
"expired": "2500.00",
"forfeited": "2000.00",
"holds_voided": "0.00",
"issuance_returns": "500.00",
"issued": "150000.00",
"opening_balance": "500000.00",
"program_id": "550e8400-e29b-41d4-a716-446655440001",
"program_name": "Premium Rewards",
"redeemed": "85000.00",
"redemption_receipts": "0.00",
"redemption_reversals": "1200.00",
"reversal_clawbacks": "0.00",
"scale": 2,
"transfers_net": "0.00"
}
],
"from": "2026-01-01T00:00:00Z",
"pagination": {
"has_more": true,
"next_cursor": "YWJjMTIz"
},
"to": "2026-03-31T23:59:59Z"
}{
"code": "bad_request",
"details": {
"expected": "<string>",
"field": "<string>",
"fields": [
{
"expected": "<unknown>",
"field": "<string>",
"message": "This field is required",
"reason": "required",
"received": "<string>"
}
],
"reason": "invalid",
"received": "<string>"
},
"message": "Invalid request parameters"
}{
"code": "unauthorized",
"details": {
"expected": "<string>",
"field": "<string>",
"fields": [
{
"expected": "<unknown>",
"field": "<string>",
"message": "This field is required",
"reason": "required",
"received": "<string>"
}
],
"reason": "invalid",
"received": "<string>"
},
"message": "Missing or invalid credentials"
}{
"code": "internal_error",
"message": "An internal error occurred"
}from and to. For each asset and program, the response shows the opening balance, every movement decomposed into named categories (issued, redeemed, forfeited, expired, transfers, and others), and the closing balance.
The lines always sum exactly to closing - opening, with nothing left over. Activity Scrip cannot classify fails the request instead of misstating the report. adjustments_net is reserved and is always 0. Manual adjustments are CREDIT and DEBIT entries, so they appear in issued and debited.
from and to to reconcile a period. For usage patterns, see the Reporting guide.Authorizations
API key passed in the X-API-Key header.
Query Parameters
Period start (inclusive, RFC3339)
Period end (inclusive, RFC3339)
Filter to rows attributed to a specific program
Filter to a specific asset
Response
Liability rollforward
Period liability rollforward results. Every line is attributed to journal action types; lines sum exactly to closing − opening per row (no plug line).
Rollforward rows, one per asset x program with ledger activity at or before to
Show child attributes
Show child attributes
Period start (inclusive, RFC 3339), echoed from the request
"2026-01-01T00:00:00Z"
Pagination metadata for list responses
Show child attributes
Show child attributes
Period end (inclusive, RFC 3339), echoed from the request
"2026-03-31T23:59:59Z"