Skip to main content
GET
/
v1
/
reports
/
redemption-attribution
Get redemption attribution matrix
curl --request GET \
  --url https://api.scrip.dev/v1/reports/redemption-attribution \
  --header 'X-API-Key: <api-key>'
import requests

url = "https://api.scrip.dev/v1/reports/redemption-attribution"

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/redemption-attribution', 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/redemption-attribution",
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/redemption-attribution"

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/redemption-attribution")
.header("X-API-Key", "<api-key>")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.scrip.dev/v1/reports/redemption-attribution")

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": [
    {
      "asset_id": "550e8400-e29b-41d4-a716-446655440000",
      "asset_name": "Loyalty Points",
      "asset_symbol": "POINTS",
      "channel_program_id": "550e8400-e29b-41d4-a716-446655440001",
      "channel_program_name": "Premium Rewards",
      "issuer_program_id": "550e8400-e29b-41d4-a716-446655440002",
      "issuer_program_name": "Partner Rewards",
      "lot_count": 12,
      "redeemed": "850.00",
      "scale": 2
    }
  ],
  "from": "2026-01-01T00:00:00Z",
  "pagination": {
    "has_more": true,
    "next_cursor": "YWJjMTIz"
  },
  "to": "2026-03-31T23:59:59Z"
}
{
"code": "bad_request",
"details": {
"expected": "uuid",
"field": "asset_id",
"fields": [
{
"expected": "<unknown>",
"field": "amount",
"message": "This field is required",
"reason": "required",
"received": "-10.00"
}
],
"reason": "invalid",
"received": "not-a-uuid"
},
"message": "Invalid request parameters"
}
{
"code": "unauthorized",
"details": {
"expected": "uuid",
"field": "asset_id",
"fields": [
{
"expected": "<unknown>",
"field": "amount",
"message": "This field is required",
"reason": "required",
"received": "-10.00"
}
],
"reason": "invalid",
"received": "not-a-uuid"
},
"message": "Missing or invalid credentials"
}
{
"code": "not_found",
"details": {
"expected": "uuid",
"field": "asset_id",
"fields": [
{
"expected": "<unknown>",
"field": "amount",
"message": "This field is required",
"reason": "required",
"received": "-10.00"
}
],
"reason": "invalid",
"received": "not-a-uuid"
},
"message": "Resource not found"
}
{
"code": "internal_error",
"message": "An internal error occurred"
}
Returns gross redemption value by asset, redemption channel program, and original issuer program for a required from/to window. Use this matrix to reconcile cross-program settlement when a shared balance can be earned through one program and redeemed through another. Each row is one asset, channel, and issuer cell. A diagonal cell means the issuing and redemption programs match. An off-diagonal cell means value issued by one program was redeemed through another. This report supports LOT-mode assets because issuer attribution follows the consumed lots. Passing a SIMPLE-mode asset_id returns a 400. The program_id filter selects the redemption channel, not the issuer.
Values are gross and do not net redemption reversals. Reversals are reported through liability rollforward, ledger summary, redemption records, and journal entries; they are not folded back into this issuer/channel matrix. A null issuer_program_id means issuer lineage is unavailable or the original issuance had no program. These rows remain in the response so channel totals still reconcile.

Authorizations

X-API-Key
string
header
required

API key passed in the X-API-Key header.

Query Parameters

from
string<date-time>
required

Period start (inclusive, RFC3339)

to
string<date-time>
required

Period end (inclusive, RFC3339)

program_id
string<uuid>

Filter to cells redeemed through this CHANNEL program

asset_id
string<uuid>

Restrict to a single LOT inventory-mode asset

Response

Redemption attribution matrix

Issuer-vs-channel redemption attribution matrix results, for LOT inventory-mode assets only.

data
object[]

Matrix cells, one per asset x channel program x issuer program with redemption lot consumption in the window

from
string

Period start (inclusive, RFC 3339), echoed from the request

Example:

"2026-01-01T00:00:00Z"

pagination
object

Pagination metadata for list responses

to
string

Period end (inclusive, RFC 3339), echoed from the request

Example:

"2026-03-31T23:59:59Z"