● Proof
Ledger
The recovery ledger. Real recorded events with computed rollups, never invented numbers.
| POST | /v1/ledger/recovery-events | Create recovery event |
| POST | /v1/ledger/remittance-events | Create remittance event |
| GET | /v1/ledger/matters/{matter_id} | Get matter ledger |
| POST | /v1/waterfall/calculate | Calculate waterfall |
| GET | /v1/waterfall/matters/{matter_id} | Get matter waterfall |
POST/v1/ledger/recovery-events
Create recovery event
Records frozen, blocked, seized, turned over, remitted, settled, or recovered value.
scope · ledger:write
§ Body
| Field | Type |
|---|---|
| matter_id required | string |
| event_type optional | string |
| asset optional | string |
| gross_amount required | number · Canonical recovered amount. `usd_value` is accepted as a request alias when this field is absent. |
| network optional | string |
| usd_value optional | number · Accepted in the request as an alias for `gross_amount`. Responses always carry both fields. |
| source optional | string |
| packet_id optional | string |
# sandbox: full surface, no production data curl -X POST https://api.kineticanvil.com/v1/ledger/recovery-events \ -H "Authorization: Bearer kx_test_xxxxxxxxxxxxxxxx" \ -H "Anvil-Version: 2026-07-05" \ -H "Content-Type: application/json" \ -d '{"matter_id":"string","event_type":"string","asset":"string","gross_amount":0,"network":"string","usd_value":0,"source":"string","packet_id":"string"}'
import requests
resp = requests.post(
"https://api.kineticanvil.com/v1/ledger/recovery-events",
headers={
"Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx",
"Anvil-Version": "2026-07-05",
},
json={"matter_id":"string","event_type":"string","asset":"string","gross_amount":0,"network":"string","usd_value":0,"source":"string","packet_id":"string"},
)
print(resp.json())const resp = await fetch("https://api.kineticanvil.com/v1/ledger/recovery-events", { method: "POST", headers: { "Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx", "Anvil-Version": "2026-07-05", "Content-Type": "application/json", }, body: JSON.stringify({"matter_id":"string","event_type":"string","asset":"string","gross_amount":0,"network":"string","usd_value":0,"source":"string","packet_id":"string"}), }); console.log(await resp.json());
● 201Anvil-Request-Id: req_01J…
201 Response
{
"recovery_event_id": "string",
"matter_id": "string",
"event_type": "string",
"asset": "string",
"gross_amount": 0,
"status": "string",
"audit": {
"request_id": "string",
"actor_id": "string",
"organization_id": "string",
"matter_id": "string",
"timestamp": "2026-07-05T00:00:00Z"
}
}POST/v1/ledger/remittance-events
Create remittance event
Records remittance to receiver, court registry, custodian, claimant, or waterfall account.
scope · ledger:write
§ Body
| Field | Type |
|---|---|
| matter_id required | string |
| destination optional | string |
| amount required | number |
| asset optional | string |
| waterfall_id optional | string |
| source_recovery_event_id optional | string |
# sandbox: full surface, no production data curl -X POST https://api.kineticanvil.com/v1/ledger/remittance-events \ -H "Authorization: Bearer kx_test_xxxxxxxxxxxxxxxx" \ -H "Anvil-Version: 2026-07-05" \ -H "Content-Type: application/json" \ -d '{"matter_id":"string","destination":"string","amount":0,"asset":"string","waterfall_id":"string","source_recovery_event_id":"string"}'
import requests
resp = requests.post(
"https://api.kineticanvil.com/v1/ledger/remittance-events",
headers={
"Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx",
"Anvil-Version": "2026-07-05",
},
json={"matter_id":"string","destination":"string","amount":0,"asset":"string","waterfall_id":"string","source_recovery_event_id":"string"},
)
print(resp.json())const resp = await fetch("https://api.kineticanvil.com/v1/ledger/remittance-events", { method: "POST", headers: { "Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx", "Anvil-Version": "2026-07-05", "Content-Type": "application/json", }, body: JSON.stringify({"matter_id":"string","destination":"string","amount":0,"asset":"string","waterfall_id":"string","source_recovery_event_id":"string"}), }); console.log(await resp.json());
● 201Anvil-Request-Id: req_01J…
201 Response
{
"remittance_event_id": "string",
"matter_id": "string",
"destination": "string",
"asset": "string",
"amount": 0,
"status": "string",
"audit": {
"request_id": "string",
"actor_id": "string",
"organization_id": "string",
"matter_id": "string",
"timestamp": "2026-07-05T00:00:00Z"
}
}GET/v1/ledger/matters/{matter_id}
Get matter ledger
Gets recovery/remittance/collection ledger for a matter.
scope · ledger:read
§ Path parameters
| Parameter | Type |
|---|---|
| matter_id required · path | string |
# sandbox: full surface, no production data curl https://api.kineticanvil.com/v1/ledger/matters/{matter_id} \ -H "Authorization: Bearer kx_test_xxxxxxxxxxxxxxxx" \ -H "Anvil-Version: 2026-07-05"
import requests
resp = requests.get(
"https://api.kineticanvil.com/v1/ledger/matters/{matter_id}",
headers={
"Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx",
"Anvil-Version": "2026-07-05",
},
)
print(resp.json())const resp = await fetch("https://api.kineticanvil.com/v1/ledger/matters/{matter_id}", { method: "GET", headers: { "Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx", "Anvil-Version": "2026-07-05", }, }); console.log(await resp.json());
● 200Anvil-Request-Id: req_01J…
200 Response
{
"matter_id": "string",
"recovery_events": [
{
"recovery_event_id": "string",
"matter_id": "string",
"event_type": "string",
"asset": "string",
"gross_amount": "string",
"status": "string",
"audit": "string"
}
],
"remittance_events": [
{
"remittance_event_id": "string",
"matter_id": "string",
"destination": "string",
"asset": "string",
"amount": "string",
"status": "string",
"audit": "string"
}
],
"total_recovered": {
"amount": 0,
"currency": "string",
"valuation_time": "2026-07-05T00:00:00Z"
}
}POST/v1/waterfall/calculate
Calculate waterfall
Calculates costs, counsel fees, Meridian economics, claimant distributions, holdbacks, and remittance constraints.
scope · waterfall:calculate
§ Body
| Field | Type |
|---|---|
| matter_id required | string |
| recovery_event_ids optional | array |
| costs optional | object |
| meridian_percentage optional | number |
# sandbox: full surface, no production data curl -X POST https://api.kineticanvil.com/v1/waterfall/calculate \ -H "Authorization: Bearer kx_test_xxxxxxxxxxxxxxxx" \ -H "Anvil-Version: 2026-07-05" \ -H "Content-Type: application/json" \ -d '{"matter_id":"string","recovery_event_ids":[],"costs":{},"meridian_percentage":0}'
import requests
resp = requests.post(
"https://api.kineticanvil.com/v1/waterfall/calculate",
headers={
"Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx",
"Anvil-Version": "2026-07-05",
},
json={"matter_id":"string","recovery_event_ids":[],"costs":{},"meridian_percentage":0},
)
print(resp.json())const resp = await fetch("https://api.kineticanvil.com/v1/waterfall/calculate", { method: "POST", headers: { "Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx", "Anvil-Version": "2026-07-05", "Content-Type": "application/json", }, body: JSON.stringify({"matter_id":"string","recovery_event_ids":[],"costs":{},"meridian_percentage":0}), }); console.log(await resp.json());
● 200Anvil-Request-Id: req_01J…
200 Response
{
"waterfall_id": "string",
"matter_id": "string",
"gross_recovered": {
"amount": 0,
"currency": "string",
"valuation_time": "2026-07-05T00:00:00Z"
},
"costs": {},
"meridian_economics": {
"amount": 0,
"currency": "string",
"valuation_time": "2026-07-05T00:00:00Z"
},
"claimant_distributions": [
{
"claimant_id": "string",
"amount": 0
}
],
"holdbacks": [
{}
],
"review_state": {
"review_required": true,
"review_status": "string",
"review_owner": "string",
"review_notes": "string"
}
}GET/v1/waterfall/matters/{matter_id}
Get matter waterfall
Gets current matter economics and distribution waterfall.
scope · waterfall:read
§ Path parameters
| Parameter | Type |
|---|---|
| matter_id required · path | string |
# sandbox: full surface, no production data curl https://api.kineticanvil.com/v1/waterfall/matters/{matter_id} \ -H "Authorization: Bearer kx_test_xxxxxxxxxxxxxxxx" \ -H "Anvil-Version: 2026-07-05"
import requests
resp = requests.get(
"https://api.kineticanvil.com/v1/waterfall/matters/{matter_id}",
headers={
"Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx",
"Anvil-Version": "2026-07-05",
},
)
print(resp.json())const resp = await fetch("https://api.kineticanvil.com/v1/waterfall/matters/{matter_id}", { method: "GET", headers: { "Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx", "Anvil-Version": "2026-07-05", }, }); console.log(await resp.json());
● 200Anvil-Request-Id: req_01J…
200 Response
{
"waterfall_id": "string",
"matter_id": "string",
"gross_recovered": {
"amount": 0,
"currency": "string",
"valuation_time": "2026-07-05T00:00:00Z"
},
"costs": {},
"meridian_economics": {
"amount": 0,
"currency": "string",
"valuation_time": "2026-07-05T00:00:00Z"
},
"claimant_distributions": [
{
"claimant_id": "string",
"amount": 0
}
],
"holdbacks": [
{}
],
"review_state": {
"review_required": true,
"review_status": "string",
"review_owner": "string",
"review_notes": "string"
}
}