Verify the audit chain for an export job
curl --request GET \
--url https://api.orbit.devotel.io/api/v1/compliance/audit-export/{jobId}/verify \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.orbit.devotel.io/api/v1/compliance/audit-export/{jobId}/verify"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.orbit.devotel.io/api/v1/compliance/audit-export/{jobId}/verify', 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.orbit.devotel.io/api/v1/compliance/audit-export/{jobId}/verify",
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://api.orbit.devotel.io/api/v1/compliance/audit-export/{jobId}/verify"
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://api.orbit.devotel.io/api/v1/compliance/audit-export/{jobId}/verify")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/compliance/audit-export/{jobId}/verify")
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{
"data": {
"organization_id": "org_123",
"from": "2026-07-01T00:00:00.000Z",
"to": "2026-07-31T23:59:59.999Z",
"rows_checked": 40213,
"chain_valid": true,
"issues": [],
"first_hash": "9f2c...a10b",
"last_hash": "4d81...c3ee",
"daily_roots": [
{
"day_utc": "2026-07-01",
"merkle_root": "7a1e...f099",
"row_count": 1320,
"min_id": "aud_01a",
"max_id": "aud_01z",
"anchor_url": "https://storage.googleapis.com/orbit-audit/anchors/org_123/2026-07-01.json",
"created_at": "2026-07-02T00:05:00.000Z"
}
]
},
"meta": {
"request_id": "req_9s8d7f6g5h4j",
"timestamp": "2026-08-03T12:34:56.000Z"
}
}Compliance
Verify the audit chain for an export job
Replays the tamper-evident hash chain over the export job’s date range and returns the verdict (chain_valid, rows_checked, first/last hash) alongside any integrity issues and the persisted daily merkle roots. This is the endpoint auditors hit to prove the exported rows match the chain anchored in WORM storage. Writes a compliance.audit_export_verified audit row. Owner/admin only. Responds 404 when the job id does not belong to the organization.
GET
/
api
/
v1
/
compliance
/
audit-export
/
{jobId}
/
verify
Verify the audit chain for an export job
curl --request GET \
--url https://api.orbit.devotel.io/api/v1/compliance/audit-export/{jobId}/verify \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.orbit.devotel.io/api/v1/compliance/audit-export/{jobId}/verify"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.orbit.devotel.io/api/v1/compliance/audit-export/{jobId}/verify', 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.orbit.devotel.io/api/v1/compliance/audit-export/{jobId}/verify",
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://api.orbit.devotel.io/api/v1/compliance/audit-export/{jobId}/verify"
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://api.orbit.devotel.io/api/v1/compliance/audit-export/{jobId}/verify")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/compliance/audit-export/{jobId}/verify")
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{
"data": {
"organization_id": "org_123",
"from": "2026-07-01T00:00:00.000Z",
"to": "2026-07-31T23:59:59.999Z",
"rows_checked": 40213,
"chain_valid": true,
"issues": [],
"first_hash": "9f2c...a10b",
"last_hash": "4d81...c3ee",
"daily_roots": [
{
"day_utc": "2026-07-01",
"merkle_root": "7a1e...f099",
"row_count": 1320,
"min_id": "aud_01a",
"max_id": "aud_01z",
"anchor_url": "https://storage.googleapis.com/orbit-audit/anchors/org_123/2026-07-01.json",
"created_at": "2026-07-02T00:05:00.000Z"
}
]
},
"meta": {
"request_id": "req_9s8d7f6g5h4j",
"timestamp": "2026-08-03T12:34:56.000Z"
}
}Authorizations
BearerApiKey
Dashboard JWT token from Clerk
Path Parameters
The audit export job id whose range should be verified.
⌘I