Skip to content

Export the evidence packet

GET
/v1/loans/{ref}/evidence/export
curl --request GET \
--url http://localhost:8080/v1/loans/example/evidence/export

Verifies the hash chain first and prints the result in the packet. format=json (default) returns the machine bundle: loan, documents with SHA-256 hashes, findings of the latest run, approval events, every evidence event and the chain verification. format=pdf returns the human-readable packet as a download (Content-Disposition: attachment; filename=evidence_{ref}.pdf). Any staff role or an API key with evidence:read. 404 for an unknown loan.

ref
required
string
format
string

OK

Media typeapplication/json

The machine bundle: everything an examiner needs, with document hashes and the chain verification result.

object
generator
required
string
generatedAt
required
string format: date-time
generatedBy
required
string
loan
required
object
id
required
string format: uuid
externalRef
required
string
packageVersion
required
integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
borrowerName
required
string
expectedPrincipal
required
null | string
state
required
string
hasExceptions
required
boolean
assigneeId
required
null | string format: uuid
createdBy
required
null | string format: uuid
createdAt
required
string format: date-time
updatedAt
required
string format: date-time
institutionName
required
null | string
documents
required
Array<object>
object
id
required
string format: uuid
loanId
required
string format: uuid
docType
required
string
originalName
required
string
sha256
required
string
byteSize
required
integer | string format: int64
/^-?(?:0|[1-9]\d*)$/
pageCount
required
null | integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
isScanned
required
null | boolean
isLar
required
boolean
larProfileId
required
null | string format: uuid
uploadedAt
required
string format: date-time
findings
required
Array<object>
object
id
required
string format: uuid
runId
required
string format: uuid
loanId
required
string format: uuid
ruleId
required
string
severity
required
string
status
required
string
title
required
string
detail
required

Stored as findings.detail_json: the human sentence plus every source the finding points at.

object
message
required
string
sources
required
Array<object>

Where a finding points (document / page / box); the provenance the workstation deep-links to.

object
documentId
required
string format: uuid
source
required
string
field
required
null | string
value
required
null | string
pageNo
required
null | integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
bbox
required
One of:
null
data
required
createdAt
required
string format: date-time
blocksApproval
required
boolean
approvals
required
Array<object>
object
id
required
integer | string format: int64
/^-?(?:0|[1-9]\d*)$/
seq
required
integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
eventType
required
string
actorType
required
string
actorId
required
null | string format: uuid
payload
required

A validated JSON document destined for a jsonb / nvarchar(max) ISJSON column. Distinct from string so the persistence layer can bind it with the right provider type on each dialect.

payloadSha256
required
string
prevSha256
required
string
chainSha256
required
string
occurredAt
required
string format: date-time
events
required
Array<object>
object
id
required
integer | string format: int64
/^-?(?:0|[1-9]\d*)$/
seq
required
integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
eventType
required
string
actorType
required
string
actorId
required
null | string format: uuid
payload
required

A validated JSON document destined for a jsonb / nvarchar(max) ISJSON column. Distinct from string so the persistence layer can bind it with the right provider type on each dialect.

payloadSha256
required
string
prevSha256
required
string
chainSha256
required
string
occurredAt
required
string format: date-time
verification
required
object
intact
required
boolean
brokenAtSeq
required
null | integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
length
required
integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
Examplegenerated
{
"generator": "example",
"generatedAt": "2026-04-15T12:00:00Z",
"generatedBy": "example",
"loan": {
"id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"externalRef": "example",
"packageVersion": 1,
"borrowerName": "example",
"expectedPrincipal": "example",
"state": "example",
"hasExceptions": true,
"assigneeId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"createdBy": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"createdAt": "2026-04-15T12:00:00Z",
"updatedAt": "2026-04-15T12:00:00Z"
},
"institutionName": "example",
"documents": [
{
"id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"loanId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"docType": "example",
"originalName": "example",
"sha256": "example",
"byteSize": 1,
"pageCount": 1,
"isScanned": true,
"isLar": true,
"larProfileId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"uploadedAt": "2026-04-15T12:00:00Z"
}
],
"findings": [
{
"id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"runId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"loanId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"ruleId": "example",
"severity": "example",
"status": "example",
"title": "example",
"detail": {
"message": "example",
"sources": [
{
"documentId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"source": "example",
"field": "example",
"value": "example",
"pageNo": 1,
"bbox": {
"x": 1,
"y": 1,
"w": 1,
"h": 1
}
}
],
"data": "example"
},
"createdAt": "2026-04-15T12:00:00Z",
"blocksApproval": true
}
],
"approvals": [
{
"id": 1,
"seq": 1,
"eventType": "example",
"actorType": "example",
"actorId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"payload": "example",
"payloadSha256": "example",
"prevSha256": "example",
"chainSha256": "example",
"occurredAt": "2026-04-15T12:00:00Z"
}
],
"events": [
{
"id": 1,
"seq": 1,
"eventType": "example",
"actorType": "example",
"actorId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"payload": "example",
"payloadSha256": "example",
"prevSha256": "example",
"chainSha256": "example",
"occurredAt": "2026-04-15T12:00:00Z"
}
],
"verification": {
"intact": true,
"brokenAtSeq": 1,
"length": 1
}
}