curl --request GET \
--url https://api.scrip.dev/v1/reports/integrity \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.scrip.dev/v1/reports/integrity"
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/integrity', 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/integrity",
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/integrity"
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/integrity")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scrip.dev/v1/reports/integrity")
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{
"all_passed": true,
"chain_head": {
"created_at": "2026-06-10T12:00:00Z",
"hash": "b3a1d9f8c2e4a7b6d1e3f5a8c9b2d4e6f7a1b3c5d7e9f2a4b6c8d0e1f3a5b7c9",
"sequence_number": 48211
},
"hash_chain": {
"anchored_at_genesis": false,
"entries_verified": 1000,
"pass": true,
"violation_count": 0
},
"organization_id": "550e8400-e29b-41d4-a716-446655440000",
"postings_balanced": {
"pass": true,
"violation_count": 0
},
"unsealed_entries": {
"pass": true,
"violation_count": 0
},
"value_conservation": {
"pass": true,
"violation_count": 0
},
"verified_at": "2026-06-10T12:00:00Z",
"window": 1000
}{
"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 ledger integrity
Returns a pass/fail ledger integrity attestation (postings balanced, value conservation, hash chain, unsealed entries) with the current chain head.
curl --request GET \
--url https://api.scrip.dev/v1/reports/integrity \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.scrip.dev/v1/reports/integrity"
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/integrity', 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/integrity",
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/integrity"
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/integrity")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scrip.dev/v1/reports/integrity")
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{
"all_passed": true,
"chain_head": {
"created_at": "2026-06-10T12:00:00Z",
"hash": "b3a1d9f8c2e4a7b6d1e3f5a8c9b2d4e6f7a1b3c5d7e9f2a4b6c8d0e1f3a5b7c9",
"sequence_number": 48211
},
"hash_chain": {
"anchored_at_genesis": false,
"entries_verified": 1000,
"pass": true,
"violation_count": 0
},
"organization_id": "550e8400-e29b-41d4-a716-446655440000",
"postings_balanced": {
"pass": true,
"violation_count": 0
},
"unsealed_entries": {
"pass": true,
"violation_count": 0
},
"value_conservation": {
"pass": true,
"violation_count": 0
},
"verified_at": "2026-06-10T12:00:00Z",
"window": 1000
}{
"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"
}verified_at and the current chain_head. Record the head hash externally at each close; any later alteration of history changes it, making tampering detectable. Hash-chain verification is bounded by window (default 1000 entries, max 10000).
Authorizations
API key passed in the X-API-Key header.
Query Parameters
Number of most recent sealed journal entries to verify in the hash-chain check (1 to 10000)
1 <= x <= 10000Response
Integrity attestation
Ledger integrity attestation for your organization
Whether every check below passed
true
Current chain head; null when the organization has no sealed entries yet
Show child attributes
Show child attributes
Recomputed hashes over the verification window match the stored tamper-evident chain
Show child attributes
Show child attributes
Organization this attestation covers
"550e8400-e29b-41d4-a716-446655440000"
Every journal entry's postings sum to zero
Show child attributes
Show child attributes
Journal entries past the sealing grace period that have not been sealed into the hash chain
Show child attributes
Show child attributes
Every asset's postings sum to zero across all accounts (no value created or destroyed)
Show child attributes
Show child attributes
When the verification ran (RFC 3339)
"2026-06-10T12:00:00Z"
Hash-chain verification window that was applied (number of most recent sealed entries)
1000