Use this when you already hold the structured document data (typically the response body from OCR).
Path parameters
| Name | Type | Description |
| document_type | string | payslip or employment_certificate. |
Query parameters
| Name | Type | Required | Description |
| apikey | string | required | Your Fraud Signals API key. |
| region | string | optional | Region code for statutory rules. Defaults to ph. |
Request body
{
"documents": [
{
"type": "payslip",
"document_id": "payslip_1",
"data": { /* extracted JSON, typically from OCR */ }
}
]
}
| Field | Type | Required | Description |
| documents | array | required | At least one document. Every item's type must match the path. |
| documents[].type | string | required | Document type; must equal {document_type}. |
| documents[].document_id | string | optional | Your identifier. Defaults to doc_0, doc_1, … |
| documents[].data | object | required | Extracted structured data for the document. |
Response fields
All three Fraud Signals endpoints (/run, /run-from-session, GET /runs/{run_id}) return the same FraudDetectionResponse shape documented below.
| Field | Type | Description |
| run_id | string (UUID) | Unique identifier for this evaluation. Persist this — you can refetch the result later with GET /runs/{run_id}. |
| document_type | string | payslip or employment_certificate. Echoes the path parameter. |
| timestamp | string (ISO-8601) | When the run was executed (UTC). |
| overall_status | enum | Worst status across all categories: pass, warn, fail, or inconclusive. |
| categories[] | object[] | One entry per category evaluated. See Category below. |
| signals | object | Lender-ready summary derived from the document. See Signals below. |
| gcs | object<string,string> | Internal storage references for the audit trail; safe to ignore in client code. |
| metadata | object | Request context and processing details. See Metadata below. |
| session_data | object[] · nullable | Present only for /run-from-session. Lists the upstream sessions resolved: session_id, product, document_type. |
Category
| Field | Type | Description |
| name | string | Category label (e.g. Arithmetic Integrity, Document Credibility, Cross-Document Checks, Statutory Compliance). |
| description | string | What this category evaluates. |
| status | enum | Worst status across this category's checks. |
| checks[] | object[] | Individual checks. See Check below. |
Check
| Field | Type | Description |
| name | string | Stable check identifier (e.g. net_pay_reconciliation). |
| description | string | Plain-English explanation. |
| status | enum | pass, warn, fail, or inconclusive. |
| checks_performed | string[] | Sub-checks executed within this check. |
| findings[] | object[] | Issues raised by the check. Each finding has: severity (high/medium/low), code (stable identifier), message (description), evidence (object with relevant raw values). |
Signals
| Field | Type | Description |
| signals.financial_summary | object | Normalised financial figures pulled from the document. Each field is nullable. |
| financial_summary.gross_pay | number | Gross compensation for the period. |
| financial_summary.net_pay | number | Take-home amount. |
| financial_summary.basic_pay | number | Base salary component. |
| financial_summary.total_deductions | number | Sum of all deductions. |
| financial_summary.sss_contribution | number | SSS contribution (PH). |
| financial_summary.philhealth_contribution | number | PhilHealth contribution (PH). |
| financial_summary.pagibig_contribution | number | Pag-IBIG contribution (PH). |
| financial_summary.withholding_tax | number | Withholding tax for the period. |
| financial_summary.takehome_ratio | number | net_pay / gross_pay — useful for affordability scoring. |
| signals.lender_signals[] | object[] | Cards summarising the document for underwriting. Each entry has: name (identifier), value (any), status (pass/warn/fail/inconclusive), evidence (object · nullable). |
Metadata
| Field | Type | Description |
| metadata.app_id | string | Your application ID. |
| metadata.developer_email | string | Developer email tied to the API key. |
| metadata.app_name | string | Your application name. |
| metadata.document_type | string | Echo of the path parameter. |
| metadata.processing_time_ms | number | End-to-end processing time in milliseconds. |
| metadata.request_ip | string · nullable | Originating IP, if available. |
| metadata.user_agent | string · nullable | Originating user agent, if available. |
Example — 200 OK
{
"run_id": "3f8c…",
"document_type": "payslip",
"timestamp": "2026-06-16T09:12:33Z",
"overall_status": "pass",
"categories": [
{
"name": "Arithmetic Integrity",
"description": "Net pay calculations, cross-field consistency, and income stability",
"status": "pass",
"checks": [
{
"name": "net_pay_reconciliation",
"description": "gross - deductions = net",
"status": "pass",
"checks_performed": ["sum_deductions", "net_pay_match"],
"findings": []
}
]
},
{ "name": "Document Credibility", "status": "pass", "checks": [] },
{ "name": "Cross-Document Checks", "status": "pass", "checks": [] },
{ "name": "Statutory Compliance", "status": "pass", "checks": [] }
],
"signals": {
"financial_summary": {
"gross_pay": 35000.00,
"net_pay": 30250.00,
"basic_pay": 30000.00,
"total_deductions": 4750.00,
"sss_contribution": 1125.00,
"philhealth_contribution": 875.00,
"pagibig_contribution": 100.00,
"withholding_tax": 2650.00,
"takehome_ratio": 0.864
},
"lender_signals": [
{ "name": "income_stability", "value": "stable", "status": "pass" },
{ "name": "statutory_coverage", "value": "complete", "status": "pass" }
]
},
"metadata": {
"app_id": "app_xxx",
"developer_email": "dev@example.com",
"app_name": "my-app",
"document_type": "payslip",
"processing_time_ms": 412.0
}
}
Overall status values
| Status | Meaning |
| pass | All checks passed; document looks legitimate. |
| warn | One or more soft anomalies; review recommended. |
| fail | At least one hard rule failed; treat as suspicious. |
| inconclusive | Not enough information to decide. |