> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://developer.fortresstech.io/api-reference/compliance-documents/get-application-bundle/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developer.fortresstech.io/_mcp/server. # Get Application Bundle GET https://api.fortresstech.io/v1/compliance-documents/applications/{applicationId}/bundle Defined, not yet publishedEverything CORA needs to review one application, in one place: Application -> Requirements -> Document Types -> Documents -> Extracted fields -> Review result.- Requirement slots done? `requirements[]` - Document types accepted per slot? `requirements[].documentTypes[]` - A document's status, extracted fields or review result? `requirements[].documentTypes[].documents[]` - A rule or mapping for a document type? `requirements[].documentTypes[].rules[]` / `mappings[]`Lists every requirement of the application, including slots with no upload yet (empty `documents`). The bundle is the end goal for CORA's reads: it replaces the requirement manifest, and CORA does not need separate calls for requirements or review criteria. Definitions (fields, mappings, rules) are the versions pinned for this application. A document type with no approved definition has `definitionVersion: null` and empty fields, mappings and rules. Requirement status is derived by Fortress from document statuses.How CORA uses requirement status:- Can CORA start on applicant X? No requirement of applicant X is AWAITING\_UPLOAD. - Is there work to pick up? A requirement is UPLOADED (process its NOT\_YET\_REVIEWED documents). - Is the application done? Every requirement is VALIDATED.CORA reads the bundle on application.signed and on every requirement.upload\_received / requirement.upload\_removed. Documents are never replaced: a rejected document stays as history only (it never counts toward the requirement) and the applicant uploads a new one, or compliance approves it manually.This route is defined for the CORA integration and is not delivered yet. Fortress does not serve it until it moves to Available. Authenticate with the `x-api-key` header. Reference: https://developer.fortresstech.io/api-reference/compliance-documents/get-application-bundle ## Authentication - `x-api-key` header (required) — API Key authentication via header ## Request ### Path parameters - `applicationId` (string, required) — The application (unit of work). ### Query parameters - `exclude` (list of enum, optional) — Parts of the bundle to leave out, as paths. Comma-separated; any combination. Excluded properties are omitted, not returned empty (an empty array means "no definition"). - requirements.documentTypes: omits each requirement's documentTypes, and with them its documents. Returns requirement-level data only (id, type, applicant, status), e.g. for the "all uploaded?" check. - requirements.documentTypes.fields / .mappings / .rules: omits that part of each definition. documentTypeId and definitionVersion are always returned, so CORA can cache definitions by documentTypeId + definitionVersion and read only statuses and documents. - requirements.documentTypes.documents.extractedFields / .reviewResult: omits that part of each document. Document status and reasonCodes are always returned. Excluding requirements.documentTypes makes every other value redundant. The caller chooses what to exclude for each read; anything it excludes is simply not returned (for example, rules that compare across documents need the other documents' extractedFields). - Allowed values: `requirements.documentTypes`, `requirements.documentTypes.fields`, `requirements.documentTypes.mappings`, `requirements.documentTypes.rules`, `requirements.documentTypes.documents.extractedFields`, `requirements.documentTypes.documents.reviewResult` - `hideDocumentTypesOnValidatedRequirement` (boolean, optional, default: false) — When true, requirements whose status is VALIDATED are returned without documentTypes (and so without their documents). Requirements in any other status are returned in full, subject to exclude. Useful once part of the application is validated: CORA reads only what still needs work. Redundant with exclude=requirements.documentTypes, which already omits documentTypes everywhere. ## Response ### 200 The bundle. Parts named in exclude are omitted. - `applicationId` (string, required) - `requirements` (list of BundleRequirement, required) — Every requirement slot of the application, including empty ones. ## Errors ### 401 Unauthorized Error Missing or invalid x-api-key. - `any` ### 404 Not Found Error Application not found, or not in the API key's organization. - `any` ## Types ### BundleRequirement A requirement slot (CertificationRequirement). - `requirementId` (string, required) - `requirementType` (string, required) — Kind of requirement. Allowed values come from the CORA Taxonomy Compliance Authoring Template (requirement_type list), which the compliance team is still completing. Fortress is still aligning the requirementType values with Fission Labs (CORA). - `applicantId` (string, required) — Applicant the slot belongs to. Details via the applicants route. - `status` (enum, required) — Derived by Fortress from the statuses of the slot's documents. Never written by CORA: when CORA writes a document status, Fortress recomputes the requirement status. REJECTED documents never count: they stay in the bundle as history only. Fortress applies the first rule that matches, using the non-rejected documents only: 1. AWAITING_UPLOAD - the slot does not have every non-rejected document it needs (Fortress requirement rules). A slot whose documents are all REJECTED is AWAITING_UPLOAD. 2. UPLOADED - a document is NOT_YET_REVIEWED. Work for CORA to pick up. 3. IN_REVIEW - a document is EXTRACTING or EVALUATING_RULES. 4. WAITING_FOR_APPLICANT - a document is WAITING_FOR_APPLICANT. 5. WAITING_FOR_COMPLIANCE - a document is WAITING_FOR_COMPLIANCE. 6. VALIDATED - every needed document is VALIDATED_BY_CORA or APPROVED. Example: CORA writes REJECTED (reasonCodes [R5]) on a pay stub. The stub no longer counts, so the requirement becomes AWAITING_UPLOAD. The applicant uploads a new stub (requirement.upload_received, NOT_YET_REVIEWED), the requirement becomes UPLOADED, and CORA reviews the new document. How CORA reads it: - Can CORA start on applicant X? No requirement of applicant X is AWAITING_UPLOAD. - Is there work to pick up? A requirement is UPLOADED. - Is the application done? Every requirement is VALIDATED. Fortress then moves the application on. An application-level CORA status is not a separate field: Fortress can derive it from the requirement statuses of the application. - Allowed values: `AWAITING_UPLOAD`, `UPLOADED`, `IN_REVIEW`, `WAITING_FOR_APPLICANT`, `WAITING_FOR_COMPLIANCE`, `VALIDATED` - `documentTypes` (list of BundleDocumentType, optional) — Document types accepted by this slot, each with its definition and its documents. Always present unless exclude=requirements.documentTypes, or the requirement is VALIDATED and hideDocumentTypesOnValidatedRequirement=true. ### BundleDocumentType - `documentTypeId` (string, required) — Fortress ID of the document type. - `documentTypeKey` (string, required) — Stable key of the document type. Referenced by the authoring template and Fission's compiled definitions. - `label` (string, required) - `definitionVersion` (string, required, nullable) — Version pinned for this application. Null when the type has no approved definition. - `documents` (list of BundleDocument, required) — Current documents uploaded for this type in this slot. Empty if none. - `taxonomyDomain` (string, optional) - `recognition` (string, optional) — How to recognize this document type. - `fields` (list of DefinitionField, optional) — Always present unless exclude=requirements.documentTypes.fields. - `mappings` (list of DefinitionMapping, optional) — Always present unless exclude=requirements.documentTypes.mappings. - `rules` (list of DefinitionRule, optional) — Always present unless exclude=requirements.documentTypes.rules. ### BundleDocument - `documentId` (string, required) - `fileName` (string, required) - `uploadedAt` (datetime, required) - `status` (enum, required) — Who writes each status: * NOT\_YET\_REVIEWED (Fortress): uploaded and not processed yet. Every new upload starts here. * EXTRACTING (CORA): quality checks (right document, legible, complete), then reading fields. * EVALUATING\_RULES (CORA): required fields, deterministic, fraud and conformance (LLM) checks. * WAITING\_FOR\_APPLICANT (CORA or compliance): waiting for a clarification from the applicant. CORA writes it when it needs a clarification; the conversation happens in the message thread (POST /v1/messages, message.received). CORA moves it to WAITING\_FOR\_COMPLIANCE when the clarification is ready for compliance. Not used for a failed document (that is REJECTED). * WAITING\_FOR\_COMPLIANCE (CORA): handed to compliance for manual work, including a clarification that is ready for compliance. Compliance reads the clarification in the message thread. CORA stops working on it. * VALIDATED\_BY\_CORA (CORA): every check passed. CORA stops working on it. * APPROVED (Fortress only): approved by a human. * REJECTED (CORA or staff): CORA (or staff) rejected the document; the applicant must upload a new one. CORA writes it for any failure that needs a new upload (unreadable, wrong document, a rule failed). A rejected document stays in the bundle as history only and never counts toward the requirement, so the requirement derives AWAITING\_UPLOAD until the new upload. statusSetBy says who. Flow: NOT\_YET\_REVIEWED -> EXTRACTING -> EVALUATING\_RULES -> VALIDATED\_BY\_CORA EXTRACTING -> REJECTED | WAITING\_FOR\_COMPLIANCE (a quality check failed) EVALUATING\_RULES -> REJECTED | WAITING\_FOR\_APPLICANT | WAITING\_FOR\_COMPLIANCE (a field, rule or mapping failed) WAITING\_FOR\_APPLICANT -> WAITING\_FOR\_COMPLIANCE (the clarification is ready for compliance) WAITING\_FOR\_COMPLIANCE -> APPROVED | REJECTED | WAITING\_FOR\_APPLICANT (compliance decides) How a failure is handled: CORA decides how to deal with a failed check (for rules and mappings, from their onFail; for quality checks, CORA's own policy) and writes only the outcome: the status plus reasonCodes saying why. Needs a new upload -> REJECTED (the requirement derives AWAITING\_UPLOAD). Clarification -> WAITING\_FOR\_APPLICANT, then WAITING\_FOR\_COMPLIANCE. Anything else that needs a human -> WAITING\_FOR\_COMPLIANCE. Fortress does not interpret onFail; it reads the status and derives the requirement status from it (see RequirementStatus). Fortress is still aligning the reasonCodes values with Fission Labs (CORA). See ReasonCode for the proposed list. CORA writes every status through POST /documents/\{documentId}/results. Fortress can refuse a write with 409 Conflict (STATUS\_SET\_BY\_USER, DOCUMENT\_REMOVED, COMPLIANCE\_REVIEW\_OPEN). CORA must handle it: stop, re-read the bundle and continue from the state Fortress returns. - Allowed values: `NOT_YET_REVIEWED`, `EXTRACTING`, `EVALUATING_RULES`, `WAITING_FOR_APPLICANT`, `WAITING_FOR_COMPLIANCE`, `VALIDATED_BY_CORA`, `APPROVED`, `REJECTED` - `statusSetBy` (enum, required) - Allowed values: `cora`, `fortress_user`, `system` - `reasonCodes` (list of string, required) — Why the status was set. Empty when there is no reason (e.g. VALIDATED_BY_CORA). - `extractedFields` (list of ExtractedField, optional, nullable) — Null until CORA has extracted the document. Omitted if excluded. - `reviewResult` (ReviewResult, optional, nullable) — Null until CORA has reviewed the document. Latest run. Omitted if excluded. ### DefinitionField - `canonicalName` (string, required) - `label` (string, required) - `dataType` (string, required) - `required` (boolean, required) - `allowedValues` (list of string, optional, nullable) - `instruction` (string, optional) ### DefinitionMapping Compares a document value with an application field. - `mappingId` (string, required) - `documentValue` (string, required) - `applicationField` (string, required) - `compareMethod` (string, required) - `onFail` (enum, required) — What CORA does when the check fails, and the document status it writes: - reupload -> REJECTED (the document no longer counts and the requirement derives AWAITING_UPLOAD; the applicant uploads a new document and the review starts again). - clarification -> WAITING_FOR_APPLICANT while CORA waits for the applicant's clarification (in the message thread), then WAITING_FOR_COMPLIANCE when the clarification is ready for compliance. - compliance_only -> WAITING_FOR_COMPLIANCE. - note -> does not block; recorded for the reviewer. - fortress_decides -> CORA returns the computed figure; Fortress decides. - Allowed values: `reupload`, `clarification`, `compliance_only`, `note`, `fortress_decides` - `status` (enum, required) — draft items are delivered but not run. - Allowed values: `active`, `draft` - `description` (string, optional) - `allowedDifference` (DefinitionMappingAllowedDifference, optional, nullable) - `aiInstruction` (string, optional, nullable) - `expression` (string, optional) - `applicantMessage` (string, optional, nullable) - `reviewerMessage` (string, optional, nullable) ### DefinitionRule Self-contained: every value a rule needs (for example the 120-day recency window) is written into the rule itself. There are no shared settings. A rule needed by several document types is replicated in each definition; changing a value means a new definitionVersion for every document type that uses it. - `ruleId` (string, required) - `name` (string, required) - `checkType` (enum, required) - Allowed values: `exact`, `ai_judgement` - `ruleType` (enum, required) - Allowed values: `standard`, `fraud` - `checksAcross` (enum, required) - Allowed values: `this_document`, `same_type_for_person`, `same_group_for_person`, `all_income_for_person`, `household` - `onFail` (enum, required) — What CORA does when the check fails, and the document status it writes: - reupload -> REJECTED (the document no longer counts and the requirement derives AWAITING_UPLOAD; the applicant uploads a new document and the review starts again). - clarification -> WAITING_FOR_APPLICANT while CORA waits for the applicant's clarification (in the message thread), then WAITING_FOR_COMPLIANCE when the clarification is ready for compliance. - compliance_only -> WAITING_FOR_COMPLIANCE. - note -> does not block; recorded for the reviewer. - fortress_decides -> CORA returns the computed figure; Fortress decides. - Allowed values: `reupload`, `clarification`, `compliance_only`, `note`, `fortress_decides` - `evaluator` (enum, required) - Allowed values: `cora`, `fortress` - `status` (enum, required) — draft items are delivered but not run. - Allowed values: `active`, `draft` - `description` (string, optional) - `program` (string, optional) - `expression` (string, optional) - `inputs` (list of string, optional) - `applicantMessage` (string, optional, nullable) - `reviewerMessage` (string, optional, nullable) ### ExtractedField - `canonicalName` (string, required) - `value` (ExtractedFieldValue, required, nullable) - `confidence` (double, optional) - `page` (integer, optional) ### ReviewResult - `runId` (string, required) - `definitionVersion` (string, required) - `applicationVersion` (string, optional) - `reviewedAt` (datetime, optional) - `quality` (ReviewQuality, optional) - `checks` (list of ReviewCheck, optional) - `computed` (list of ComputedValue, optional) ### DefinitionMappingAllowedDifference ### ExtractedFieldValue ### ReviewQuality - `documentTypeDetected` (string, optional) — documentTypeKey of the type CORA recognized. - `rightDocument` (enum, optional) - Allowed values: `pass`, `fail` - `legibility` (enum, optional) - Allowed values: `pass`, `fail` - `completeness` (enum, optional) - Allowed values: `pass`, `fail` ### ReviewCheck - `checkId` (string, required) — ruleId or mappingId. - `kind` (enum, required) - Allowed values: `rule`, `mapping` - `checkType` (enum, required) - Allowed values: `exact`, `ai_judgement` - `verdict` (string, required) - `inputs` (list of string, optional) - `observed` (string, optional) - `expected` (string, optional) - `onFail` (enum, optional) — What CORA does when the check fails, and the document status it writes: - reupload -> REJECTED (the document no longer counts and the requirement derives AWAITING_UPLOAD; the applicant uploads a new document and the review starts again). - clarification -> WAITING_FOR_APPLICANT while CORA waits for the applicant's clarification (in the message thread), then WAITING_FOR_COMPLIANCE when the clarification is ready for compliance. - compliance_only -> WAITING_FOR_COMPLIANCE. - note -> does not block; recorded for the reviewer. - fortress_decides -> CORA returns the computed figure; Fortress decides. - Allowed values: `reupload`, `clarification`, `compliance_only`, `note`, `fortress_decides` - `applicantMessage` (string, optional) - `comment` (string, optional) ### ComputedValue - `name` (string, required) - `value` (ComputedValueValue, required) - `sourceCheck` (string, optional) ### ComputedValueValue ## Examples ### 1. Signed, no documents yet (?exclude=requirements.documentTypes) **Response** ```json { "applicationId": "9d8c7b6a-5e4f-4d3c-9b2a-1e0f9d8c7b6a", "requirements": [ { "requirementId": "78b21158-b27e-5a4f-87d6-e6604b1b3912", "requirementType": "income.employment", "applicantId": "6e5d4c3b-2a19-4f08-8e7d-6c5b4a392817", "status": "AWAITING_UPLOAD" }, { "requirementId": "40d30ff4-ad66-5e33-a648-c7432a5a4fba", "requirementType": "identity", "applicantId": "6e5d4c3b-2a19-4f08-8e7d-6c5b4a392817", "status": "AWAITING_UPLOAD" }, { "requirementId": "14478c58-d89b-544a-b7d6-ff33817a8261", "requirementType": "income.employment", "applicantId": "3eebb4dd-3835-5b97-bcc3-2cb65a7bf266", "status": "AWAITING_UPLOAD" }, { "requirementId": "4d80d8df-706b-5129-b2e8-afb1f2cbbe01", "requirementType": "identity", "applicantId": "3eebb4dd-3835-5b97-bcc3-2cb65a7bf266", "status": "AWAITING_UPLOAD" } ] } ``` **SDK Code** ```python 1. Signed, no documents yet (?exclude=requirements.documentTypes) import requests url = "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle" querystring = {"exclude":"requirements.documentTypes"} headers = {"x-api-key": ""} response = requests.get(url, headers=headers, params=querystring) print(response.json()) ``` ```javascript 1. Signed, no documents yet (?exclude=requirements.documentTypes) const url = 'https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes'; const options = {method: 'GET', headers: {'x-api-key': ''}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go 1. Signed, no documents yet (?exclude=requirements.documentTypes) package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("x-api-key", "") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby 1. Signed, no documents yet (?exclude=requirements.documentTypes) require 'uri' require 'net/http' url = URI("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["x-api-key"] = '' response = http.request(request) puts response.read_body ``` ```java 1. Signed, no documents yet (?exclude=requirements.documentTypes) import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes") .header("x-api-key", "") .asString(); ``` ```php 1. Signed, no documents yet (?exclude=requirements.documentTypes) request('GET', 'https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes', [ 'headers' => [ 'x-api-key' => '', ], ]); echo $response->getBody(); ``` ```csharp 1. Signed, no documents yet (?exclude=requirements.documentTypes) using RestSharp; var client = new RestClient("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes"); var request = new RestRequest(Method.GET); request.AddHeader("x-api-key", ""); IRestResponse response = client.Execute(request); ``` ```swift 1. Signed, no documents yet (?exclude=requirements.documentTypes) import Foundation let headers = ["x-api-key": ""] let request = NSMutableURLRequest(url: NSURL(string: "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` ### 2. Signed, some requirements uploaded (?exclude=requirements.documentTypes.fields,requirements.documentTypes.mappings,requirements.documentTypes.rules,requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) **Response** ```json { "applicationId": "9d8c7b6a-5e4f-4d3c-9b2a-1e0f9d8c7b6a", "requirements": [ { "requirementId": "78b21158-b27e-5a4f-87d6-e6604b1b3912", "requirementType": "income.employment", "applicantId": "6e5d4c3b-2a19-4f08-8e7d-6c5b4a392817", "status": "AWAITING_UPLOAD", "documentTypes": [ { "documentTypeId": "3b929155-899e-5fcf-ae13-c1f3ccab66ca", "documentTypeKey": "employment_pay_stub", "label": "Employment: Upload Pay stubs", "definitionVersion": "1.0", "documents": [ { "documentId": "998fa0b8-6604-5b80-9e6c-606a24ea9650", "fileName": "maria_stub_sep12.pdf", "uploadedAt": "2026-09-18T14:02:11Z", "status": "NOT_YET_REVIEWED", "statusSetBy": "system", "reasonCodes": [] } ], "taxonomyDomain": "Income", "recognition": "An earnings statement issued by an employer for one pay period. Shows the employee and employer names, pay period and/or pay date, current and year-to-date gross pay, deductions and net pay. May be a paper check stub or a direct-deposit advice." } ] }, { "requirementId": "40d30ff4-ad66-5e33-a648-c7432a5a4fba", "requirementType": "identity", "applicantId": "6e5d4c3b-2a19-4f08-8e7d-6c5b4a392817", "status": "UPLOADED", "documentTypes": [ { "documentTypeId": "906ea333-6be0-5550-ba86-936eecf538fc", "documentTypeKey": "identity_birth_certificate", "label": "Identity Verification: Upload Birth Certificate", "definitionVersion": "1.0", "documents": [ { "documentId": "8067d1fa-8751-55b3-83ce-3af932982805", "fileName": "maria_birth_cert.pdf", "uploadedAt": "2026-09-18T14:05:30Z", "status": "NOT_YET_REVIEWED", "statusSetBy": "system", "reasonCodes": [] } ], "taxonomyDomain": "Identity", "recognition": "A certified birth record issued by a government vital records office. Shows the person's full name, date and place of birth, and an official seal or certification." } ] }, { "requirementId": "14478c58-d89b-544a-b7d6-ff33817a8261", "requirementType": "income.employment", "applicantId": "3eebb4dd-3835-5b97-bcc3-2cb65a7bf266", "status": "AWAITING_UPLOAD", "documentTypes": [ { "documentTypeId": "3b929155-899e-5fcf-ae13-c1f3ccab66ca", "documentTypeKey": "employment_pay_stub", "label": "Employment: Upload Pay stubs", "definitionVersion": "1.0", "documents": [], "taxonomyDomain": "Income", "recognition": "An earnings statement issued by an employer for one pay period. Shows the employee and employer names, pay period and/or pay date, current and year-to-date gross pay, deductions and net pay. May be a paper check stub or a direct-deposit advice." } ] }, { "requirementId": "4d80d8df-706b-5129-b2e8-afb1f2cbbe01", "requirementType": "identity", "applicantId": "3eebb4dd-3835-5b97-bcc3-2cb65a7bf266", "status": "UPLOADED", "documentTypes": [ { "documentTypeId": "906ea333-6be0-5550-ba86-936eecf538fc", "documentTypeKey": "identity_birth_certificate", "label": "Identity Verification: Upload Birth Certificate", "definitionVersion": "1.0", "documents": [ { "documentId": "a65e155d-8fe8-546e-972d-908b21451760", "fileName": "james_birth_cert.pdf", "uploadedAt": "2026-09-20T16:30:02Z", "status": "NOT_YET_REVIEWED", "statusSetBy": "system", "reasonCodes": [] } ], "taxonomyDomain": "Identity", "recognition": "A certified birth record issued by a government vital records office. Shows the person's full name, date and place of birth, and an official seal or certification." } ] } ] } ``` **SDK Code** ```python 2. Signed, some requirements uploaded (?exclude=requirements.documentTypes.fields,requirements.documentTypes.mappings,requirements.documentTypes.rules,requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) import requests url = "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle" querystring = {"exclude":"requirements.documentTypes"} headers = {"x-api-key": ""} response = requests.get(url, headers=headers, params=querystring) print(response.json()) ``` ```javascript 2. Signed, some requirements uploaded (?exclude=requirements.documentTypes.fields,requirements.documentTypes.mappings,requirements.documentTypes.rules,requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) const url = 'https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes'; const options = {method: 'GET', headers: {'x-api-key': ''}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go 2. Signed, some requirements uploaded (?exclude=requirements.documentTypes.fields,requirements.documentTypes.mappings,requirements.documentTypes.rules,requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("x-api-key", "") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby 2. Signed, some requirements uploaded (?exclude=requirements.documentTypes.fields,requirements.documentTypes.mappings,requirements.documentTypes.rules,requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) require 'uri' require 'net/http' url = URI("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["x-api-key"] = '' response = http.request(request) puts response.read_body ``` ```java 2. Signed, some requirements uploaded (?exclude=requirements.documentTypes.fields,requirements.documentTypes.mappings,requirements.documentTypes.rules,requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes") .header("x-api-key", "") .asString(); ``` ```php 2. Signed, some requirements uploaded (?exclude=requirements.documentTypes.fields,requirements.documentTypes.mappings,requirements.documentTypes.rules,requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) request('GET', 'https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes', [ 'headers' => [ 'x-api-key' => '', ], ]); echo $response->getBody(); ``` ```csharp 2. Signed, some requirements uploaded (?exclude=requirements.documentTypes.fields,requirements.documentTypes.mappings,requirements.documentTypes.rules,requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) using RestSharp; var client = new RestClient("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes"); var request = new RestRequest(Method.GET); request.AddHeader("x-api-key", ""); IRestResponse response = client.Execute(request); ``` ```swift 2. Signed, some requirements uploaded (?exclude=requirements.documentTypes.fields,requirements.documentTypes.mappings,requirements.documentTypes.rules,requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) import Foundation let headers = ["x-api-key": ""] let request = NSMutableURLRequest(url: NSURL(string: "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` ### 3. Signed, every requirement uploaded (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) **Response** ```json { "applicationId": "9d8c7b6a-5e4f-4d3c-9b2a-1e0f9d8c7b6a", "requirements": [ { "requirementId": "78b21158-b27e-5a4f-87d6-e6604b1b3912", "requirementType": "income.employment", "applicantId": "6e5d4c3b-2a19-4f08-8e7d-6c5b4a392817", "status": "UPLOADED", "documentTypes": [ { "documentTypeId": "3b929155-899e-5fcf-ae13-c1f3ccab66ca", "documentTypeKey": "employment_pay_stub", "label": "Employment: Upload Pay stubs", "definitionVersion": "1.0", "documents": [ { "documentId": "998fa0b8-6604-5b80-9e6c-606a24ea9650", "fileName": "maria_stub_sep12.pdf", "uploadedAt": "2026-09-18T14:02:11Z", "status": "NOT_YET_REVIEWED", "statusSetBy": "system", "reasonCodes": [] }, { "documentId": "17bad985-8466-59ad-aa79-696045edb17f", "fileName": "maria_stub_sep26.pdf", "uploadedAt": "2026-09-19T09:40:03Z", "status": "NOT_YET_REVIEWED", "statusSetBy": "system", "reasonCodes": [] } ], "taxonomyDomain": "Income", "recognition": "An earnings statement issued by an employer for one pay period. Shows the employee and employer names, pay period and/or pay date, current and year-to-date gross pay, deductions and net pay. May be a paper check stub or a direct-deposit advice.", "fields": [ { "canonicalName": "paystub.employee.full_name", "label": "Employee Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the employee as printed on the stub." }, { "canonicalName": "paystub.employer.name", "label": "Employer Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Name of the employer or payroll company issuing the stub." }, { "canonicalName": "paystub.period.end_date", "label": "Pay Period End Date", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Last date of the pay period. This is the period end, not the pay/check date." }, { "canonicalName": "paystub.period.frequency", "label": "Pay Frequency", "dataType": "string", "required": false, "allowedValues": [ "weekly", "biweekly", "semimonthly", "monthly", "daily" ], "instruction": "How often the employee is paid." }, { "canonicalName": "paystub.current.gross_pay", "label": "Current Gross Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period gross pay before deductions. Decimal, no symbol. Use the current-period column, not YTD." }, { "canonicalName": "paystub.current.total_deductions", "label": "Current Total Deductions", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period deductions. Decimal, no symbol." }, { "canonicalName": "paystub.current.net_pay", "label": "Current Net Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Current-period net (take-home) pay. Decimal, no symbol." } ], "mappings": [ { "mappingId": "M3", "documentValue": "paystub.employer.name", "applicationField": "application.income.employment.employer", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Employer name (paystub.employer.name) vs application employer", "allowedDifference": null, "aiInstruction": "Decide whether the employer on the stub is the employer on the application, allowing for franchise vs legal entity and abbreviations. Flag genuine mismatches only.", "expression": "ai_compare(paystub.employer.name, application.income.employment.employer)", "applicantMessage": null, "reviewerMessage": "Employer on the pay stub does not match the employer on the application." } ], "rules": [ { "ruleId": "R5", "name": "Pay period is recent", "checkType": "exact", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The pay period end date is within 120 days of the certification effective date.", "program": "All", "expression": "within_days(paystub.period.end_date, application.certification_effective_date, 120)", "inputs": [ "paystub.period.end_date", "application.certification_effective_date" ], "applicantMessage": "Please upload a recent pay stub. The one we have is more than 120 days old.", "reviewerMessage": null }, { "ruleId": "R2", "name": "Gross = Net + Deductions", "checkType": "exact", "ruleType": "fraud", "checksAcross": "this_document", "onFail": "note", "evaluator": "cora", "status": "active", "description": "Current gross pay equals current net pay plus current total deductions.", "program": "All", "expression": "abs(paystub.current.gross_pay - (paystub.current.net_pay + paystub.current.total_deductions)) <= 1.00", "inputs": [ "paystub.current.gross_pay", "paystub.current.net_pay", "paystub.current.total_deductions" ], "applicantMessage": null, "reviewerMessage": "Current gross pay does not equal net pay plus deductions; review for potential fraud." } ] } ] }, { "requirementId": "40d30ff4-ad66-5e33-a648-c7432a5a4fba", "requirementType": "identity", "applicantId": "6e5d4c3b-2a19-4f08-8e7d-6c5b4a392817", "status": "UPLOADED", "documentTypes": [ { "documentTypeId": "906ea333-6be0-5550-ba86-936eecf538fc", "documentTypeKey": "identity_birth_certificate", "label": "Identity Verification: Upload Birth Certificate", "definitionVersion": "1.0", "documents": [ { "documentId": "8067d1fa-8751-55b3-83ce-3af932982805", "fileName": "maria_birth_cert.pdf", "uploadedAt": "2026-09-18T14:05:30Z", "status": "NOT_YET_REVIEWED", "statusSetBy": "system", "reasonCodes": [] } ], "taxonomyDomain": "Identity", "recognition": "A certified birth record issued by a government vital records office. Shows the person's full name, date and place of birth, and an official seal or certification.", "fields": [ { "canonicalName": "birthcert.full_name", "label": "Full Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the person the certificate is for." }, { "canonicalName": "birthcert.date_of_birth", "label": "Date of Birth", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Date of birth as printed on the certificate." } ], "mappings": [ { "mappingId": "BM1", "documentValue": "birthcert.full_name", "applicationField": "application.applicant.full_name", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Name on certificate vs applicant name", "allowedDifference": null, "aiInstruction": "Decide whether the name on the certificate is the applicant, allowing for middle names, initials and common nicknames only when the rest matches.", "expression": "ai_compare(birthcert.full_name, application.applicant.full_name)", "applicantMessage": null, "reviewerMessage": "Name on the birth certificate does not match the applicant's name." }, { "mappingId": "BM2", "documentValue": "birthcert.date_of_birth", "applicationField": "application.applicant.date_of_birth", "compareMethod": "exact", "onFail": "clarification", "status": "active", "description": "Date of birth vs applicant date of birth", "allowedDifference": null, "aiInstruction": null, "expression": "birthcert.date_of_birth == application.applicant.date_of_birth", "applicantMessage": "The date of birth on your birth certificate does not match your application. Please explain the difference.", "reviewerMessage": null } ], "rules": [ { "ruleId": "B1", "name": "Certified copy", "checkType": "ai_judgement", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The document is a certified copy issued by a vital records office (seal or certification visible).", "program": "All", "expression": "ai_judge('certified copy with official seal or certification')", "inputs": [], "applicantMessage": "Please upload a certified copy of your birth certificate. The one we have does not show an official seal.", "reviewerMessage": null } ] } ] }, { "requirementId": "14478c58-d89b-544a-b7d6-ff33817a8261", "requirementType": "income.employment", "applicantId": "3eebb4dd-3835-5b97-bcc3-2cb65a7bf266", "status": "UPLOADED", "documentTypes": [ { "documentTypeId": "3b929155-899e-5fcf-ae13-c1f3ccab66ca", "documentTypeKey": "employment_pay_stub", "label": "Employment: Upload Pay stubs", "definitionVersion": "1.0", "documents": [ { "documentId": "0d9fbbac-9ea6-5ec6-bace-e14ebeedb891", "fileName": "james_stub_sep19.pdf", "uploadedAt": "2026-09-20T16:22:47Z", "status": "NOT_YET_REVIEWED", "statusSetBy": "system", "reasonCodes": [] }, { "documentId": "e8489038-9529-5697-a5b0-2a9c5e07e854", "fileName": "james_stub_sep05.pdf", "uploadedAt": "2026-09-20T16:24:10Z", "status": "NOT_YET_REVIEWED", "statusSetBy": "system", "reasonCodes": [] } ], "taxonomyDomain": "Income", "recognition": "An earnings statement issued by an employer for one pay period. Shows the employee and employer names, pay period and/or pay date, current and year-to-date gross pay, deductions and net pay. May be a paper check stub or a direct-deposit advice.", "fields": [ { "canonicalName": "paystub.employee.full_name", "label": "Employee Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the employee as printed on the stub." }, { "canonicalName": "paystub.employer.name", "label": "Employer Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Name of the employer or payroll company issuing the stub." }, { "canonicalName": "paystub.period.end_date", "label": "Pay Period End Date", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Last date of the pay period. This is the period end, not the pay/check date." }, { "canonicalName": "paystub.period.frequency", "label": "Pay Frequency", "dataType": "string", "required": false, "allowedValues": [ "weekly", "biweekly", "semimonthly", "monthly", "daily" ], "instruction": "How often the employee is paid." }, { "canonicalName": "paystub.current.gross_pay", "label": "Current Gross Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period gross pay before deductions. Decimal, no symbol. Use the current-period column, not YTD." }, { "canonicalName": "paystub.current.total_deductions", "label": "Current Total Deductions", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period deductions. Decimal, no symbol." }, { "canonicalName": "paystub.current.net_pay", "label": "Current Net Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Current-period net (take-home) pay. Decimal, no symbol." } ], "mappings": [ { "mappingId": "M3", "documentValue": "paystub.employer.name", "applicationField": "application.income.employment.employer", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Employer name (paystub.employer.name) vs application employer", "allowedDifference": null, "aiInstruction": "Decide whether the employer on the stub is the employer on the application, allowing for franchise vs legal entity and abbreviations. Flag genuine mismatches only.", "expression": "ai_compare(paystub.employer.name, application.income.employment.employer)", "applicantMessage": null, "reviewerMessage": "Employer on the pay stub does not match the employer on the application." } ], "rules": [ { "ruleId": "R5", "name": "Pay period is recent", "checkType": "exact", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The pay period end date is within 120 days of the certification effective date.", "program": "All", "expression": "within_days(paystub.period.end_date, application.certification_effective_date, 120)", "inputs": [ "paystub.period.end_date", "application.certification_effective_date" ], "applicantMessage": "Please upload a recent pay stub. The one we have is more than 120 days old.", "reviewerMessage": null }, { "ruleId": "R2", "name": "Gross = Net + Deductions", "checkType": "exact", "ruleType": "fraud", "checksAcross": "this_document", "onFail": "note", "evaluator": "cora", "status": "active", "description": "Current gross pay equals current net pay plus current total deductions.", "program": "All", "expression": "abs(paystub.current.gross_pay - (paystub.current.net_pay + paystub.current.total_deductions)) <= 1.00", "inputs": [ "paystub.current.gross_pay", "paystub.current.net_pay", "paystub.current.total_deductions" ], "applicantMessage": null, "reviewerMessage": "Current gross pay does not equal net pay plus deductions; review for potential fraud." } ] } ] }, { "requirementId": "4d80d8df-706b-5129-b2e8-afb1f2cbbe01", "requirementType": "identity", "applicantId": "3eebb4dd-3835-5b97-bcc3-2cb65a7bf266", "status": "UPLOADED", "documentTypes": [ { "documentTypeId": "906ea333-6be0-5550-ba86-936eecf538fc", "documentTypeKey": "identity_birth_certificate", "label": "Identity Verification: Upload Birth Certificate", "definitionVersion": "1.0", "documents": [ { "documentId": "a65e155d-8fe8-546e-972d-908b21451760", "fileName": "james_birth_cert.pdf", "uploadedAt": "2026-09-20T16:30:02Z", "status": "NOT_YET_REVIEWED", "statusSetBy": "system", "reasonCodes": [] } ], "taxonomyDomain": "Identity", "recognition": "A certified birth record issued by a government vital records office. Shows the person's full name, date and place of birth, and an official seal or certification.", "fields": [ { "canonicalName": "birthcert.full_name", "label": "Full Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the person the certificate is for." }, { "canonicalName": "birthcert.date_of_birth", "label": "Date of Birth", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Date of birth as printed on the certificate." } ], "mappings": [ { "mappingId": "BM1", "documentValue": "birthcert.full_name", "applicationField": "application.applicant.full_name", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Name on certificate vs applicant name", "allowedDifference": null, "aiInstruction": "Decide whether the name on the certificate is the applicant, allowing for middle names, initials and common nicknames only when the rest matches.", "expression": "ai_compare(birthcert.full_name, application.applicant.full_name)", "applicantMessage": null, "reviewerMessage": "Name on the birth certificate does not match the applicant's name." }, { "mappingId": "BM2", "documentValue": "birthcert.date_of_birth", "applicationField": "application.applicant.date_of_birth", "compareMethod": "exact", "onFail": "clarification", "status": "active", "description": "Date of birth vs applicant date of birth", "allowedDifference": null, "aiInstruction": null, "expression": "birthcert.date_of_birth == application.applicant.date_of_birth", "applicantMessage": "The date of birth on your birth certificate does not match your application. Please explain the difference.", "reviewerMessage": null } ], "rules": [ { "ruleId": "B1", "name": "Certified copy", "checkType": "ai_judgement", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The document is a certified copy issued by a vital records office (seal or certification visible).", "program": "All", "expression": "ai_judge('certified copy with official seal or certification')", "inputs": [], "applicantMessage": "Please upload a certified copy of your birth certificate. The one we have does not show an official seal.", "reviewerMessage": null } ] } ] } ] } ``` **SDK Code** ```python 3. Signed, every requirement uploaded (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) import requests url = "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle" querystring = {"exclude":"requirements.documentTypes"} headers = {"x-api-key": ""} response = requests.get(url, headers=headers, params=querystring) print(response.json()) ``` ```javascript 3. Signed, every requirement uploaded (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) const url = 'https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes'; const options = {method: 'GET', headers: {'x-api-key': ''}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go 3. Signed, every requirement uploaded (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("x-api-key", "") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby 3. Signed, every requirement uploaded (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) require 'uri' require 'net/http' url = URI("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["x-api-key"] = '' response = http.request(request) puts response.read_body ``` ```java 3. Signed, every requirement uploaded (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes") .header("x-api-key", "") .asString(); ``` ```php 3. Signed, every requirement uploaded (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) request('GET', 'https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes', [ 'headers' => [ 'x-api-key' => '', ], ]); echo $response->getBody(); ``` ```csharp 3. Signed, every requirement uploaded (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) using RestSharp; var client = new RestClient("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes"); var request = new RestRequest(Method.GET); request.AddHeader("x-api-key", ""); IRestResponse response = client.Execute(request); ``` ```swift 3. Signed, every requirement uploaded (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) import Foundation let headers = ["x-api-key": ""] let request = NSMutableURLRequest(url: NSURL(string: "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` ### 4. CORA evaluating (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) **Response** ```json { "applicationId": "9d8c7b6a-5e4f-4d3c-9b2a-1e0f9d8c7b6a", "requirements": [ { "requirementId": "78b21158-b27e-5a4f-87d6-e6604b1b3912", "requirementType": "income.employment", "applicantId": "6e5d4c3b-2a19-4f08-8e7d-6c5b4a392817", "status": "IN_REVIEW", "documentTypes": [ { "documentTypeId": "3b929155-899e-5fcf-ae13-c1f3ccab66ca", "documentTypeKey": "employment_pay_stub", "label": "Employment: Upload Pay stubs", "definitionVersion": "1.0", "documents": [ { "documentId": "998fa0b8-6604-5b80-9e6c-606a24ea9650", "fileName": "maria_stub_sep12.pdf", "uploadedAt": "2026-09-18T14:02:11Z", "status": "EVALUATING_RULES", "statusSetBy": "cora", "reasonCodes": [] }, { "documentId": "17bad985-8466-59ad-aa79-696045edb17f", "fileName": "maria_stub_sep26.pdf", "uploadedAt": "2026-09-19T09:40:03Z", "status": "EXTRACTING", "statusSetBy": "cora", "reasonCodes": [] } ], "taxonomyDomain": "Income", "recognition": "An earnings statement issued by an employer for one pay period. Shows the employee and employer names, pay period and/or pay date, current and year-to-date gross pay, deductions and net pay. May be a paper check stub or a direct-deposit advice.", "fields": [ { "canonicalName": "paystub.employee.full_name", "label": "Employee Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the employee as printed on the stub." }, { "canonicalName": "paystub.employer.name", "label": "Employer Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Name of the employer or payroll company issuing the stub." }, { "canonicalName": "paystub.period.end_date", "label": "Pay Period End Date", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Last date of the pay period. This is the period end, not the pay/check date." }, { "canonicalName": "paystub.period.frequency", "label": "Pay Frequency", "dataType": "string", "required": false, "allowedValues": [ "weekly", "biweekly", "semimonthly", "monthly", "daily" ], "instruction": "How often the employee is paid." }, { "canonicalName": "paystub.current.gross_pay", "label": "Current Gross Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period gross pay before deductions. Decimal, no symbol. Use the current-period column, not YTD." }, { "canonicalName": "paystub.current.total_deductions", "label": "Current Total Deductions", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period deductions. Decimal, no symbol." }, { "canonicalName": "paystub.current.net_pay", "label": "Current Net Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Current-period net (take-home) pay. Decimal, no symbol." } ], "mappings": [ { "mappingId": "M3", "documentValue": "paystub.employer.name", "applicationField": "application.income.employment.employer", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Employer name (paystub.employer.name) vs application employer", "allowedDifference": null, "aiInstruction": "Decide whether the employer on the stub is the employer on the application, allowing for franchise vs legal entity and abbreviations. Flag genuine mismatches only.", "expression": "ai_compare(paystub.employer.name, application.income.employment.employer)", "applicantMessage": null, "reviewerMessage": "Employer on the pay stub does not match the employer on the application." } ], "rules": [ { "ruleId": "R5", "name": "Pay period is recent", "checkType": "exact", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The pay period end date is within 120 days of the certification effective date.", "program": "All", "expression": "within_days(paystub.period.end_date, application.certification_effective_date, 120)", "inputs": [ "paystub.period.end_date", "application.certification_effective_date" ], "applicantMessage": "Please upload a recent pay stub. The one we have is more than 120 days old.", "reviewerMessage": null }, { "ruleId": "R2", "name": "Gross = Net + Deductions", "checkType": "exact", "ruleType": "fraud", "checksAcross": "this_document", "onFail": "note", "evaluator": "cora", "status": "active", "description": "Current gross pay equals current net pay plus current total deductions.", "program": "All", "expression": "abs(paystub.current.gross_pay - (paystub.current.net_pay + paystub.current.total_deductions)) <= 1.00", "inputs": [ "paystub.current.gross_pay", "paystub.current.net_pay", "paystub.current.total_deductions" ], "applicantMessage": null, "reviewerMessage": "Current gross pay does not equal net pay plus deductions; review for potential fraud." } ] } ] }, { "requirementId": "40d30ff4-ad66-5e33-a648-c7432a5a4fba", "requirementType": "identity", "applicantId": "6e5d4c3b-2a19-4f08-8e7d-6c5b4a392817", "status": "UPLOADED", "documentTypes": [ { "documentTypeId": "906ea333-6be0-5550-ba86-936eecf538fc", "documentTypeKey": "identity_birth_certificate", "label": "Identity Verification: Upload Birth Certificate", "definitionVersion": "1.0", "documents": [ { "documentId": "8067d1fa-8751-55b3-83ce-3af932982805", "fileName": "maria_birth_cert.pdf", "uploadedAt": "2026-09-18T14:05:30Z", "status": "NOT_YET_REVIEWED", "statusSetBy": "system", "reasonCodes": [] } ], "taxonomyDomain": "Identity", "recognition": "A certified birth record issued by a government vital records office. Shows the person's full name, date and place of birth, and an official seal or certification.", "fields": [ { "canonicalName": "birthcert.full_name", "label": "Full Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the person the certificate is for." }, { "canonicalName": "birthcert.date_of_birth", "label": "Date of Birth", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Date of birth as printed on the certificate." } ], "mappings": [ { "mappingId": "BM1", "documentValue": "birthcert.full_name", "applicationField": "application.applicant.full_name", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Name on certificate vs applicant name", "allowedDifference": null, "aiInstruction": "Decide whether the name on the certificate is the applicant, allowing for middle names, initials and common nicknames only when the rest matches.", "expression": "ai_compare(birthcert.full_name, application.applicant.full_name)", "applicantMessage": null, "reviewerMessage": "Name on the birth certificate does not match the applicant's name." }, { "mappingId": "BM2", "documentValue": "birthcert.date_of_birth", "applicationField": "application.applicant.date_of_birth", "compareMethod": "exact", "onFail": "clarification", "status": "active", "description": "Date of birth vs applicant date of birth", "allowedDifference": null, "aiInstruction": null, "expression": "birthcert.date_of_birth == application.applicant.date_of_birth", "applicantMessage": "The date of birth on your birth certificate does not match your application. Please explain the difference.", "reviewerMessage": null } ], "rules": [ { "ruleId": "B1", "name": "Certified copy", "checkType": "ai_judgement", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The document is a certified copy issued by a vital records office (seal or certification visible).", "program": "All", "expression": "ai_judge('certified copy with official seal or certification')", "inputs": [], "applicantMessage": "Please upload a certified copy of your birth certificate. The one we have does not show an official seal.", "reviewerMessage": null } ] } ] }, { "requirementId": "14478c58-d89b-544a-b7d6-ff33817a8261", "requirementType": "income.employment", "applicantId": "3eebb4dd-3835-5b97-bcc3-2cb65a7bf266", "status": "UPLOADED", "documentTypes": [ { "documentTypeId": "3b929155-899e-5fcf-ae13-c1f3ccab66ca", "documentTypeKey": "employment_pay_stub", "label": "Employment: Upload Pay stubs", "definitionVersion": "1.0", "documents": [ { "documentId": "0d9fbbac-9ea6-5ec6-bace-e14ebeedb891", "fileName": "james_stub_sep19.pdf", "uploadedAt": "2026-09-20T16:22:47Z", "status": "NOT_YET_REVIEWED", "statusSetBy": "system", "reasonCodes": [] }, { "documentId": "e8489038-9529-5697-a5b0-2a9c5e07e854", "fileName": "james_stub_sep05.pdf", "uploadedAt": "2026-09-20T16:24:10Z", "status": "NOT_YET_REVIEWED", "statusSetBy": "system", "reasonCodes": [] } ], "taxonomyDomain": "Income", "recognition": "An earnings statement issued by an employer for one pay period. Shows the employee and employer names, pay period and/or pay date, current and year-to-date gross pay, deductions and net pay. May be a paper check stub or a direct-deposit advice.", "fields": [ { "canonicalName": "paystub.employee.full_name", "label": "Employee Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the employee as printed on the stub." }, { "canonicalName": "paystub.employer.name", "label": "Employer Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Name of the employer or payroll company issuing the stub." }, { "canonicalName": "paystub.period.end_date", "label": "Pay Period End Date", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Last date of the pay period. This is the period end, not the pay/check date." }, { "canonicalName": "paystub.period.frequency", "label": "Pay Frequency", "dataType": "string", "required": false, "allowedValues": [ "weekly", "biweekly", "semimonthly", "monthly", "daily" ], "instruction": "How often the employee is paid." }, { "canonicalName": "paystub.current.gross_pay", "label": "Current Gross Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period gross pay before deductions. Decimal, no symbol. Use the current-period column, not YTD." }, { "canonicalName": "paystub.current.total_deductions", "label": "Current Total Deductions", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period deductions. Decimal, no symbol." }, { "canonicalName": "paystub.current.net_pay", "label": "Current Net Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Current-period net (take-home) pay. Decimal, no symbol." } ], "mappings": [ { "mappingId": "M3", "documentValue": "paystub.employer.name", "applicationField": "application.income.employment.employer", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Employer name (paystub.employer.name) vs application employer", "allowedDifference": null, "aiInstruction": "Decide whether the employer on the stub is the employer on the application, allowing for franchise vs legal entity and abbreviations. Flag genuine mismatches only.", "expression": "ai_compare(paystub.employer.name, application.income.employment.employer)", "applicantMessage": null, "reviewerMessage": "Employer on the pay stub does not match the employer on the application." } ], "rules": [ { "ruleId": "R5", "name": "Pay period is recent", "checkType": "exact", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The pay period end date is within 120 days of the certification effective date.", "program": "All", "expression": "within_days(paystub.period.end_date, application.certification_effective_date, 120)", "inputs": [ "paystub.period.end_date", "application.certification_effective_date" ], "applicantMessage": "Please upload a recent pay stub. The one we have is more than 120 days old.", "reviewerMessage": null }, { "ruleId": "R2", "name": "Gross = Net + Deductions", "checkType": "exact", "ruleType": "fraud", "checksAcross": "this_document", "onFail": "note", "evaluator": "cora", "status": "active", "description": "Current gross pay equals current net pay plus current total deductions.", "program": "All", "expression": "abs(paystub.current.gross_pay - (paystub.current.net_pay + paystub.current.total_deductions)) <= 1.00", "inputs": [ "paystub.current.gross_pay", "paystub.current.net_pay", "paystub.current.total_deductions" ], "applicantMessage": null, "reviewerMessage": "Current gross pay does not equal net pay plus deductions; review for potential fraud." } ] } ] }, { "requirementId": "4d80d8df-706b-5129-b2e8-afb1f2cbbe01", "requirementType": "identity", "applicantId": "3eebb4dd-3835-5b97-bcc3-2cb65a7bf266", "status": "UPLOADED", "documentTypes": [ { "documentTypeId": "906ea333-6be0-5550-ba86-936eecf538fc", "documentTypeKey": "identity_birth_certificate", "label": "Identity Verification: Upload Birth Certificate", "definitionVersion": "1.0", "documents": [ { "documentId": "a65e155d-8fe8-546e-972d-908b21451760", "fileName": "james_birth_cert.pdf", "uploadedAt": "2026-09-20T16:30:02Z", "status": "NOT_YET_REVIEWED", "statusSetBy": "system", "reasonCodes": [] } ], "taxonomyDomain": "Identity", "recognition": "A certified birth record issued by a government vital records office. Shows the person's full name, date and place of birth, and an official seal or certification.", "fields": [ { "canonicalName": "birthcert.full_name", "label": "Full Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the person the certificate is for." }, { "canonicalName": "birthcert.date_of_birth", "label": "Date of Birth", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Date of birth as printed on the certificate." } ], "mappings": [ { "mappingId": "BM1", "documentValue": "birthcert.full_name", "applicationField": "application.applicant.full_name", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Name on certificate vs applicant name", "allowedDifference": null, "aiInstruction": "Decide whether the name on the certificate is the applicant, allowing for middle names, initials and common nicknames only when the rest matches.", "expression": "ai_compare(birthcert.full_name, application.applicant.full_name)", "applicantMessage": null, "reviewerMessage": "Name on the birth certificate does not match the applicant's name." }, { "mappingId": "BM2", "documentValue": "birthcert.date_of_birth", "applicationField": "application.applicant.date_of_birth", "compareMethod": "exact", "onFail": "clarification", "status": "active", "description": "Date of birth vs applicant date of birth", "allowedDifference": null, "aiInstruction": null, "expression": "birthcert.date_of_birth == application.applicant.date_of_birth", "applicantMessage": "The date of birth on your birth certificate does not match your application. Please explain the difference.", "reviewerMessage": null } ], "rules": [ { "ruleId": "B1", "name": "Certified copy", "checkType": "ai_judgement", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The document is a certified copy issued by a vital records office (seal or certification visible).", "program": "All", "expression": "ai_judge('certified copy with official seal or certification')", "inputs": [], "applicantMessage": "Please upload a certified copy of your birth certificate. The one we have does not show an official seal.", "reviewerMessage": null } ] } ] } ] } ``` **SDK Code** ```python 4. CORA evaluating (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) import requests url = "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle" querystring = {"exclude":"requirements.documentTypes"} headers = {"x-api-key": ""} response = requests.get(url, headers=headers, params=querystring) print(response.json()) ``` ```javascript 4. CORA evaluating (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) const url = 'https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes'; const options = {method: 'GET', headers: {'x-api-key': ''}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go 4. CORA evaluating (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("x-api-key", "") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby 4. CORA evaluating (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) require 'uri' require 'net/http' url = URI("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["x-api-key"] = '' response = http.request(request) puts response.read_body ``` ```java 4. CORA evaluating (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes") .header("x-api-key", "") .asString(); ``` ```php 4. CORA evaluating (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) request('GET', 'https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes', [ 'headers' => [ 'x-api-key' => '', ], ]); echo $response->getBody(); ``` ```csharp 4. CORA evaluating (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) using RestSharp; var client = new RestClient("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes"); var request = new RestRequest(Method.GET); request.AddHeader("x-api-key", ""); IRestResponse response = client.Execute(request); ``` ```swift 4. CORA evaluating (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) import Foundation let headers = ["x-api-key": ""] let request = NSMutableURLRequest(url: NSURL(string: "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` ### 5. Validated by CORA, approved by compliance, one stub rejected (awaiting a new upload), waiting for compliance (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult&hideDocumentTypesOnValidatedRequirement=true) **Response** ```json { "applicationId": "9d8c7b6a-5e4f-4d3c-9b2a-1e0f9d8c7b6a", "requirements": [ { "requirementId": "78b21158-b27e-5a4f-87d6-e6604b1b3912", "requirementType": "income.employment", "applicantId": "6e5d4c3b-2a19-4f08-8e7d-6c5b4a392817", "status": "VALIDATED" }, { "requirementId": "40d30ff4-ad66-5e33-a648-c7432a5a4fba", "requirementType": "identity", "applicantId": "6e5d4c3b-2a19-4f08-8e7d-6c5b4a392817", "status": "VALIDATED" }, { "requirementId": "14478c58-d89b-544a-b7d6-ff33817a8261", "requirementType": "income.employment", "applicantId": "3eebb4dd-3835-5b97-bcc3-2cb65a7bf266", "status": "AWAITING_UPLOAD", "documentTypes": [ { "documentTypeId": "3b929155-899e-5fcf-ae13-c1f3ccab66ca", "documentTypeKey": "employment_pay_stub", "label": "Employment: Upload Pay stubs", "definitionVersion": "1.0", "documents": [ { "documentId": "0d9fbbac-9ea6-5ec6-bace-e14ebeedb891", "fileName": "james_stub_sep19.pdf", "uploadedAt": "2026-09-20T16:22:47Z", "status": "VALIDATED_BY_CORA", "statusSetBy": "cora", "reasonCodes": [] }, { "documentId": "e8489038-9529-5697-a5b0-2a9c5e07e854", "fileName": "james_stub_sep05.pdf", "uploadedAt": "2026-09-20T16:24:10Z", "status": "REJECTED", "statusSetBy": "cora", "reasonCodes": [ "R5" ] } ], "taxonomyDomain": "Income", "recognition": "An earnings statement issued by an employer for one pay period. Shows the employee and employer names, pay period and/or pay date, current and year-to-date gross pay, deductions and net pay. May be a paper check stub or a direct-deposit advice.", "fields": [ { "canonicalName": "paystub.employee.full_name", "label": "Employee Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the employee as printed on the stub." }, { "canonicalName": "paystub.employer.name", "label": "Employer Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Name of the employer or payroll company issuing the stub." }, { "canonicalName": "paystub.period.end_date", "label": "Pay Period End Date", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Last date of the pay period. This is the period end, not the pay/check date." }, { "canonicalName": "paystub.period.frequency", "label": "Pay Frequency", "dataType": "string", "required": false, "allowedValues": [ "weekly", "biweekly", "semimonthly", "monthly", "daily" ], "instruction": "How often the employee is paid." }, { "canonicalName": "paystub.current.gross_pay", "label": "Current Gross Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period gross pay before deductions. Decimal, no symbol. Use the current-period column, not YTD." }, { "canonicalName": "paystub.current.total_deductions", "label": "Current Total Deductions", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period deductions. Decimal, no symbol." }, { "canonicalName": "paystub.current.net_pay", "label": "Current Net Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Current-period net (take-home) pay. Decimal, no symbol." } ], "mappings": [ { "mappingId": "M3", "documentValue": "paystub.employer.name", "applicationField": "application.income.employment.employer", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Employer name (paystub.employer.name) vs application employer", "allowedDifference": null, "aiInstruction": "Decide whether the employer on the stub is the employer on the application, allowing for franchise vs legal entity and abbreviations. Flag genuine mismatches only.", "expression": "ai_compare(paystub.employer.name, application.income.employment.employer)", "applicantMessage": null, "reviewerMessage": "Employer on the pay stub does not match the employer on the application." } ], "rules": [ { "ruleId": "R5", "name": "Pay period is recent", "checkType": "exact", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The pay period end date is within 120 days of the certification effective date.", "program": "All", "expression": "within_days(paystub.period.end_date, application.certification_effective_date, 120)", "inputs": [ "paystub.period.end_date", "application.certification_effective_date" ], "applicantMessage": "Please upload a recent pay stub. The one we have is more than 120 days old.", "reviewerMessage": null }, { "ruleId": "R2", "name": "Gross = Net + Deductions", "checkType": "exact", "ruleType": "fraud", "checksAcross": "this_document", "onFail": "note", "evaluator": "cora", "status": "active", "description": "Current gross pay equals current net pay plus current total deductions.", "program": "All", "expression": "abs(paystub.current.gross_pay - (paystub.current.net_pay + paystub.current.total_deductions)) <= 1.00", "inputs": [ "paystub.current.gross_pay", "paystub.current.net_pay", "paystub.current.total_deductions" ], "applicantMessage": null, "reviewerMessage": "Current gross pay does not equal net pay plus deductions; review for potential fraud." } ] } ] }, { "requirementId": "4d80d8df-706b-5129-b2e8-afb1f2cbbe01", "requirementType": "identity", "applicantId": "3eebb4dd-3835-5b97-bcc3-2cb65a7bf266", "status": "WAITING_FOR_COMPLIANCE", "documentTypes": [ { "documentTypeId": "906ea333-6be0-5550-ba86-936eecf538fc", "documentTypeKey": "identity_birth_certificate", "label": "Identity Verification: Upload Birth Certificate", "definitionVersion": "1.0", "documents": [ { "documentId": "a65e155d-8fe8-546e-972d-908b21451760", "fileName": "james_birth_cert.pdf", "uploadedAt": "2026-09-20T16:30:02Z", "status": "WAITING_FOR_COMPLIANCE", "statusSetBy": "cora", "reasonCodes": [ "BM1" ] } ], "taxonomyDomain": "Identity", "recognition": "A certified birth record issued by a government vital records office. Shows the person's full name, date and place of birth, and an official seal or certification.", "fields": [ { "canonicalName": "birthcert.full_name", "label": "Full Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the person the certificate is for." }, { "canonicalName": "birthcert.date_of_birth", "label": "Date of Birth", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Date of birth as printed on the certificate." } ], "mappings": [ { "mappingId": "BM1", "documentValue": "birthcert.full_name", "applicationField": "application.applicant.full_name", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Name on certificate vs applicant name", "allowedDifference": null, "aiInstruction": "Decide whether the name on the certificate is the applicant, allowing for middle names, initials and common nicknames only when the rest matches.", "expression": "ai_compare(birthcert.full_name, application.applicant.full_name)", "applicantMessage": null, "reviewerMessage": "Name on the birth certificate does not match the applicant's name." }, { "mappingId": "BM2", "documentValue": "birthcert.date_of_birth", "applicationField": "application.applicant.date_of_birth", "compareMethod": "exact", "onFail": "clarification", "status": "active", "description": "Date of birth vs applicant date of birth", "allowedDifference": null, "aiInstruction": null, "expression": "birthcert.date_of_birth == application.applicant.date_of_birth", "applicantMessage": "The date of birth on your birth certificate does not match your application. Please explain the difference.", "reviewerMessage": null } ], "rules": [ { "ruleId": "B1", "name": "Certified copy", "checkType": "ai_judgement", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The document is a certified copy issued by a vital records office (seal or certification visible).", "program": "All", "expression": "ai_judge('certified copy with official seal or certification')", "inputs": [], "applicantMessage": "Please upload a certified copy of your birth certificate. The one we have does not show an official seal.", "reviewerMessage": null } ] } ] } ] } ``` **SDK Code** ```python 5. Validated by CORA, approved by compliance, one stub rejected (awaiting a new upload), waiting for compliance (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult&hideDocumentTypesOnValidatedRequirement=true) import requests url = "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle" querystring = {"exclude":"requirements.documentTypes"} headers = {"x-api-key": ""} response = requests.get(url, headers=headers, params=querystring) print(response.json()) ``` ```javascript 5. Validated by CORA, approved by compliance, one stub rejected (awaiting a new upload), waiting for compliance (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult&hideDocumentTypesOnValidatedRequirement=true) const url = 'https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes'; const options = {method: 'GET', headers: {'x-api-key': ''}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go 5. Validated by CORA, approved by compliance, one stub rejected (awaiting a new upload), waiting for compliance (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult&hideDocumentTypesOnValidatedRequirement=true) package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("x-api-key", "") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby 5. Validated by CORA, approved by compliance, one stub rejected (awaiting a new upload), waiting for compliance (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult&hideDocumentTypesOnValidatedRequirement=true) require 'uri' require 'net/http' url = URI("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["x-api-key"] = '' response = http.request(request) puts response.read_body ``` ```java 5. Validated by CORA, approved by compliance, one stub rejected (awaiting a new upload), waiting for compliance (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult&hideDocumentTypesOnValidatedRequirement=true) import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes") .header("x-api-key", "") .asString(); ``` ```php 5. Validated by CORA, approved by compliance, one stub rejected (awaiting a new upload), waiting for compliance (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult&hideDocumentTypesOnValidatedRequirement=true) request('GET', 'https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes', [ 'headers' => [ 'x-api-key' => '', ], ]); echo $response->getBody(); ``` ```csharp 5. Validated by CORA, approved by compliance, one stub rejected (awaiting a new upload), waiting for compliance (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult&hideDocumentTypesOnValidatedRequirement=true) using RestSharp; var client = new RestClient("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes"); var request = new RestRequest(Method.GET); request.AddHeader("x-api-key", ""); IRestResponse response = client.Execute(request); ``` ```swift 5. Validated by CORA, approved by compliance, one stub rejected (awaiting a new upload), waiting for compliance (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult&hideDocumentTypesOnValidatedRequirement=true) import Foundation let headers = ["x-api-key": ""] let request = NSMutableURLRequest(url: NSURL(string: "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` ### 6. Every requirement uploaded, fields extracted, rules running (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) **Response** ```json { "applicationId": "9d8c7b6a-5e4f-4d3c-9b2a-1e0f9d8c7b6a", "requirements": [ { "requirementId": "78b21158-b27e-5a4f-87d6-e6604b1b3912", "requirementType": "income.employment", "applicantId": "6e5d4c3b-2a19-4f08-8e7d-6c5b4a392817", "status": "IN_REVIEW", "documentTypes": [ { "documentTypeId": "3b929155-899e-5fcf-ae13-c1f3ccab66ca", "documentTypeKey": "employment_pay_stub", "label": "Employment: Upload Pay stubs", "definitionVersion": "1.0", "documents": [ { "documentId": "998fa0b8-6604-5b80-9e6c-606a24ea9650", "fileName": "maria_stub_sep12.pdf", "uploadedAt": "2026-09-18T14:02:11Z", "status": "EVALUATING_RULES", "statusSetBy": "cora", "reasonCodes": [] }, { "documentId": "17bad985-8466-59ad-aa79-696045edb17f", "fileName": "maria_stub_sep26.pdf", "uploadedAt": "2026-09-19T09:40:03Z", "status": "EVALUATING_RULES", "statusSetBy": "cora", "reasonCodes": [] } ], "taxonomyDomain": "Income", "recognition": "An earnings statement issued by an employer for one pay period. Shows the employee and employer names, pay period and/or pay date, current and year-to-date gross pay, deductions and net pay. May be a paper check stub or a direct-deposit advice.", "fields": [ { "canonicalName": "paystub.employee.full_name", "label": "Employee Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the employee as printed on the stub." }, { "canonicalName": "paystub.employer.name", "label": "Employer Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Name of the employer or payroll company issuing the stub." }, { "canonicalName": "paystub.period.end_date", "label": "Pay Period End Date", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Last date of the pay period. This is the period end, not the pay/check date." }, { "canonicalName": "paystub.period.frequency", "label": "Pay Frequency", "dataType": "string", "required": false, "allowedValues": [ "weekly", "biweekly", "semimonthly", "monthly", "daily" ], "instruction": "How often the employee is paid." }, { "canonicalName": "paystub.current.gross_pay", "label": "Current Gross Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period gross pay before deductions. Decimal, no symbol. Use the current-period column, not YTD." }, { "canonicalName": "paystub.current.total_deductions", "label": "Current Total Deductions", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period deductions. Decimal, no symbol." }, { "canonicalName": "paystub.current.net_pay", "label": "Current Net Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Current-period net (take-home) pay. Decimal, no symbol." } ], "mappings": [ { "mappingId": "M3", "documentValue": "paystub.employer.name", "applicationField": "application.income.employment.employer", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Employer name (paystub.employer.name) vs application employer", "allowedDifference": null, "aiInstruction": "Decide whether the employer on the stub is the employer on the application, allowing for franchise vs legal entity and abbreviations. Flag genuine mismatches only.", "expression": "ai_compare(paystub.employer.name, application.income.employment.employer)", "applicantMessage": null, "reviewerMessage": "Employer on the pay stub does not match the employer on the application." } ], "rules": [ { "ruleId": "R5", "name": "Pay period is recent", "checkType": "exact", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The pay period end date is within 120 days of the certification effective date.", "program": "All", "expression": "within_days(paystub.period.end_date, application.certification_effective_date, 120)", "inputs": [ "paystub.period.end_date", "application.certification_effective_date" ], "applicantMessage": "Please upload a recent pay stub. The one we have is more than 120 days old.", "reviewerMessage": null }, { "ruleId": "R2", "name": "Gross = Net + Deductions", "checkType": "exact", "ruleType": "fraud", "checksAcross": "this_document", "onFail": "note", "evaluator": "cora", "status": "active", "description": "Current gross pay equals current net pay plus current total deductions.", "program": "All", "expression": "abs(paystub.current.gross_pay - (paystub.current.net_pay + paystub.current.total_deductions)) <= 1.00", "inputs": [ "paystub.current.gross_pay", "paystub.current.net_pay", "paystub.current.total_deductions" ], "applicantMessage": null, "reviewerMessage": "Current gross pay does not equal net pay plus deductions; review for potential fraud." } ] } ] }, { "requirementId": "40d30ff4-ad66-5e33-a648-c7432a5a4fba", "requirementType": "identity", "applicantId": "6e5d4c3b-2a19-4f08-8e7d-6c5b4a392817", "status": "IN_REVIEW", "documentTypes": [ { "documentTypeId": "906ea333-6be0-5550-ba86-936eecf538fc", "documentTypeKey": "identity_birth_certificate", "label": "Identity Verification: Upload Birth Certificate", "definitionVersion": "1.0", "documents": [ { "documentId": "8067d1fa-8751-55b3-83ce-3af932982805", "fileName": "maria_birth_cert.pdf", "uploadedAt": "2026-09-18T14:05:30Z", "status": "EVALUATING_RULES", "statusSetBy": "cora", "reasonCodes": [] } ], "taxonomyDomain": "Identity", "recognition": "A certified birth record issued by a government vital records office. Shows the person's full name, date and place of birth, and an official seal or certification.", "fields": [ { "canonicalName": "birthcert.full_name", "label": "Full Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the person the certificate is for." }, { "canonicalName": "birthcert.date_of_birth", "label": "Date of Birth", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Date of birth as printed on the certificate." } ], "mappings": [ { "mappingId": "BM1", "documentValue": "birthcert.full_name", "applicationField": "application.applicant.full_name", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Name on certificate vs applicant name", "allowedDifference": null, "aiInstruction": "Decide whether the name on the certificate is the applicant, allowing for middle names, initials and common nicknames only when the rest matches.", "expression": "ai_compare(birthcert.full_name, application.applicant.full_name)", "applicantMessage": null, "reviewerMessage": "Name on the birth certificate does not match the applicant's name." }, { "mappingId": "BM2", "documentValue": "birthcert.date_of_birth", "applicationField": "application.applicant.date_of_birth", "compareMethod": "exact", "onFail": "clarification", "status": "active", "description": "Date of birth vs applicant date of birth", "allowedDifference": null, "aiInstruction": null, "expression": "birthcert.date_of_birth == application.applicant.date_of_birth", "applicantMessage": "The date of birth on your birth certificate does not match your application. Please explain the difference.", "reviewerMessage": null } ], "rules": [ { "ruleId": "B1", "name": "Certified copy", "checkType": "ai_judgement", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The document is a certified copy issued by a vital records office (seal or certification visible).", "program": "All", "expression": "ai_judge('certified copy with official seal or certification')", "inputs": [], "applicantMessage": "Please upload a certified copy of your birth certificate. The one we have does not show an official seal.", "reviewerMessage": null } ] } ] }, { "requirementId": "14478c58-d89b-544a-b7d6-ff33817a8261", "requirementType": "income.employment", "applicantId": "3eebb4dd-3835-5b97-bcc3-2cb65a7bf266", "status": "IN_REVIEW", "documentTypes": [ { "documentTypeId": "3b929155-899e-5fcf-ae13-c1f3ccab66ca", "documentTypeKey": "employment_pay_stub", "label": "Employment: Upload Pay stubs", "definitionVersion": "1.0", "documents": [ { "documentId": "0d9fbbac-9ea6-5ec6-bace-e14ebeedb891", "fileName": "james_stub_sep19.pdf", "uploadedAt": "2026-09-20T16:22:47Z", "status": "EVALUATING_RULES", "statusSetBy": "cora", "reasonCodes": [] }, { "documentId": "e8489038-9529-5697-a5b0-2a9c5e07e854", "fileName": "james_stub_sep05.pdf", "uploadedAt": "2026-09-20T16:24:10Z", "status": "EVALUATING_RULES", "statusSetBy": "cora", "reasonCodes": [] } ], "taxonomyDomain": "Income", "recognition": "An earnings statement issued by an employer for one pay period. Shows the employee and employer names, pay period and/or pay date, current and year-to-date gross pay, deductions and net pay. May be a paper check stub or a direct-deposit advice.", "fields": [ { "canonicalName": "paystub.employee.full_name", "label": "Employee Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the employee as printed on the stub." }, { "canonicalName": "paystub.employer.name", "label": "Employer Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Name of the employer or payroll company issuing the stub." }, { "canonicalName": "paystub.period.end_date", "label": "Pay Period End Date", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Last date of the pay period. This is the period end, not the pay/check date." }, { "canonicalName": "paystub.period.frequency", "label": "Pay Frequency", "dataType": "string", "required": false, "allowedValues": [ "weekly", "biweekly", "semimonthly", "monthly", "daily" ], "instruction": "How often the employee is paid." }, { "canonicalName": "paystub.current.gross_pay", "label": "Current Gross Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period gross pay before deductions. Decimal, no symbol. Use the current-period column, not YTD." }, { "canonicalName": "paystub.current.total_deductions", "label": "Current Total Deductions", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period deductions. Decimal, no symbol." }, { "canonicalName": "paystub.current.net_pay", "label": "Current Net Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Current-period net (take-home) pay. Decimal, no symbol." } ], "mappings": [ { "mappingId": "M3", "documentValue": "paystub.employer.name", "applicationField": "application.income.employment.employer", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Employer name (paystub.employer.name) vs application employer", "allowedDifference": null, "aiInstruction": "Decide whether the employer on the stub is the employer on the application, allowing for franchise vs legal entity and abbreviations. Flag genuine mismatches only.", "expression": "ai_compare(paystub.employer.name, application.income.employment.employer)", "applicantMessage": null, "reviewerMessage": "Employer on the pay stub does not match the employer on the application." } ], "rules": [ { "ruleId": "R5", "name": "Pay period is recent", "checkType": "exact", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The pay period end date is within 120 days of the certification effective date.", "program": "All", "expression": "within_days(paystub.period.end_date, application.certification_effective_date, 120)", "inputs": [ "paystub.period.end_date", "application.certification_effective_date" ], "applicantMessage": "Please upload a recent pay stub. The one we have is more than 120 days old.", "reviewerMessage": null }, { "ruleId": "R2", "name": "Gross = Net + Deductions", "checkType": "exact", "ruleType": "fraud", "checksAcross": "this_document", "onFail": "note", "evaluator": "cora", "status": "active", "description": "Current gross pay equals current net pay plus current total deductions.", "program": "All", "expression": "abs(paystub.current.gross_pay - (paystub.current.net_pay + paystub.current.total_deductions)) <= 1.00", "inputs": [ "paystub.current.gross_pay", "paystub.current.net_pay", "paystub.current.total_deductions" ], "applicantMessage": null, "reviewerMessage": "Current gross pay does not equal net pay plus deductions; review for potential fraud." } ] } ] }, { "requirementId": "4d80d8df-706b-5129-b2e8-afb1f2cbbe01", "requirementType": "identity", "applicantId": "3eebb4dd-3835-5b97-bcc3-2cb65a7bf266", "status": "IN_REVIEW", "documentTypes": [ { "documentTypeId": "906ea333-6be0-5550-ba86-936eecf538fc", "documentTypeKey": "identity_birth_certificate", "label": "Identity Verification: Upload Birth Certificate", "definitionVersion": "1.0", "documents": [ { "documentId": "a65e155d-8fe8-546e-972d-908b21451760", "fileName": "james_birth_cert.pdf", "uploadedAt": "2026-09-20T16:30:02Z", "status": "EVALUATING_RULES", "statusSetBy": "cora", "reasonCodes": [] } ], "taxonomyDomain": "Identity", "recognition": "A certified birth record issued by a government vital records office. Shows the person's full name, date and place of birth, and an official seal or certification.", "fields": [ { "canonicalName": "birthcert.full_name", "label": "Full Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the person the certificate is for." }, { "canonicalName": "birthcert.date_of_birth", "label": "Date of Birth", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Date of birth as printed on the certificate." } ], "mappings": [ { "mappingId": "BM1", "documentValue": "birthcert.full_name", "applicationField": "application.applicant.full_name", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Name on certificate vs applicant name", "allowedDifference": null, "aiInstruction": "Decide whether the name on the certificate is the applicant, allowing for middle names, initials and common nicknames only when the rest matches.", "expression": "ai_compare(birthcert.full_name, application.applicant.full_name)", "applicantMessage": null, "reviewerMessage": "Name on the birth certificate does not match the applicant's name." }, { "mappingId": "BM2", "documentValue": "birthcert.date_of_birth", "applicationField": "application.applicant.date_of_birth", "compareMethod": "exact", "onFail": "clarification", "status": "active", "description": "Date of birth vs applicant date of birth", "allowedDifference": null, "aiInstruction": null, "expression": "birthcert.date_of_birth == application.applicant.date_of_birth", "applicantMessage": "The date of birth on your birth certificate does not match your application. Please explain the difference.", "reviewerMessage": null } ], "rules": [ { "ruleId": "B1", "name": "Certified copy", "checkType": "ai_judgement", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The document is a certified copy issued by a vital records office (seal or certification visible).", "program": "All", "expression": "ai_judge('certified copy with official seal or certification')", "inputs": [], "applicantMessage": "Please upload a certified copy of your birth certificate. The one we have does not show an official seal.", "reviewerMessage": null } ] } ] } ] } ``` **SDK Code** ```python 6. Every requirement uploaded, fields extracted, rules running (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) import requests url = "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle" querystring = {"exclude":"requirements.documentTypes"} headers = {"x-api-key": ""} response = requests.get(url, headers=headers, params=querystring) print(response.json()) ``` ```javascript 6. Every requirement uploaded, fields extracted, rules running (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) const url = 'https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes'; const options = {method: 'GET', headers: {'x-api-key': ''}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go 6. Every requirement uploaded, fields extracted, rules running (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("x-api-key", "") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby 6. Every requirement uploaded, fields extracted, rules running (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) require 'uri' require 'net/http' url = URI("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["x-api-key"] = '' response = http.request(request) puts response.read_body ``` ```java 6. Every requirement uploaded, fields extracted, rules running (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes") .header("x-api-key", "") .asString(); ``` ```php 6. Every requirement uploaded, fields extracted, rules running (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) request('GET', 'https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes', [ 'headers' => [ 'x-api-key' => '', ], ]); echo $response->getBody(); ``` ```csharp 6. Every requirement uploaded, fields extracted, rules running (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) using RestSharp; var client = new RestClient("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes"); var request = new RestRequest(Method.GET); request.AddHeader("x-api-key", ""); IRestResponse response = client.Execute(request); ``` ```swift 6. Every requirement uploaded, fields extracted, rules running (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) import Foundation let headers = ["x-api-key": ""] let request = NSMutableURLRequest(url: NSURL(string: "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` ### 7. Every requirement uploaded, extracted and validated (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) **Response** ```json { "applicationId": "9d8c7b6a-5e4f-4d3c-9b2a-1e0f9d8c7b6a", "requirements": [ { "requirementId": "78b21158-b27e-5a4f-87d6-e6604b1b3912", "requirementType": "income.employment", "applicantId": "6e5d4c3b-2a19-4f08-8e7d-6c5b4a392817", "status": "VALIDATED", "documentTypes": [ { "documentTypeId": "3b929155-899e-5fcf-ae13-c1f3ccab66ca", "documentTypeKey": "employment_pay_stub", "label": "Employment: Upload Pay stubs", "definitionVersion": "1.0", "documents": [ { "documentId": "998fa0b8-6604-5b80-9e6c-606a24ea9650", "fileName": "maria_stub_sep12.pdf", "uploadedAt": "2026-09-18T14:02:11Z", "status": "VALIDATED_BY_CORA", "statusSetBy": "cora", "reasonCodes": [] }, { "documentId": "17bad985-8466-59ad-aa79-696045edb17f", "fileName": "maria_stub_sep26.pdf", "uploadedAt": "2026-09-19T09:40:03Z", "status": "VALIDATED_BY_CORA", "statusSetBy": "cora", "reasonCodes": [] } ], "taxonomyDomain": "Income", "recognition": "An earnings statement issued by an employer for one pay period. Shows the employee and employer names, pay period and/or pay date, current and year-to-date gross pay, deductions and net pay. May be a paper check stub or a direct-deposit advice.", "fields": [ { "canonicalName": "paystub.employee.full_name", "label": "Employee Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the employee as printed on the stub." }, { "canonicalName": "paystub.employer.name", "label": "Employer Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Name of the employer or payroll company issuing the stub." }, { "canonicalName": "paystub.period.end_date", "label": "Pay Period End Date", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Last date of the pay period. This is the period end, not the pay/check date." }, { "canonicalName": "paystub.period.frequency", "label": "Pay Frequency", "dataType": "string", "required": false, "allowedValues": [ "weekly", "biweekly", "semimonthly", "monthly", "daily" ], "instruction": "How often the employee is paid." }, { "canonicalName": "paystub.current.gross_pay", "label": "Current Gross Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period gross pay before deductions. Decimal, no symbol. Use the current-period column, not YTD." }, { "canonicalName": "paystub.current.total_deductions", "label": "Current Total Deductions", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period deductions. Decimal, no symbol." }, { "canonicalName": "paystub.current.net_pay", "label": "Current Net Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Current-period net (take-home) pay. Decimal, no symbol." } ], "mappings": [ { "mappingId": "M3", "documentValue": "paystub.employer.name", "applicationField": "application.income.employment.employer", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Employer name (paystub.employer.name) vs application employer", "allowedDifference": null, "aiInstruction": "Decide whether the employer on the stub is the employer on the application, allowing for franchise vs legal entity and abbreviations. Flag genuine mismatches only.", "expression": "ai_compare(paystub.employer.name, application.income.employment.employer)", "applicantMessage": null, "reviewerMessage": "Employer on the pay stub does not match the employer on the application." } ], "rules": [ { "ruleId": "R5", "name": "Pay period is recent", "checkType": "exact", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The pay period end date is within 120 days of the certification effective date.", "program": "All", "expression": "within_days(paystub.period.end_date, application.certification_effective_date, 120)", "inputs": [ "paystub.period.end_date", "application.certification_effective_date" ], "applicantMessage": "Please upload a recent pay stub. The one we have is more than 120 days old.", "reviewerMessage": null }, { "ruleId": "R2", "name": "Gross = Net + Deductions", "checkType": "exact", "ruleType": "fraud", "checksAcross": "this_document", "onFail": "note", "evaluator": "cora", "status": "active", "description": "Current gross pay equals current net pay plus current total deductions.", "program": "All", "expression": "abs(paystub.current.gross_pay - (paystub.current.net_pay + paystub.current.total_deductions)) <= 1.00", "inputs": [ "paystub.current.gross_pay", "paystub.current.net_pay", "paystub.current.total_deductions" ], "applicantMessage": null, "reviewerMessage": "Current gross pay does not equal net pay plus deductions; review for potential fraud." } ] } ] }, { "requirementId": "40d30ff4-ad66-5e33-a648-c7432a5a4fba", "requirementType": "identity", "applicantId": "6e5d4c3b-2a19-4f08-8e7d-6c5b4a392817", "status": "VALIDATED", "documentTypes": [ { "documentTypeId": "906ea333-6be0-5550-ba86-936eecf538fc", "documentTypeKey": "identity_birth_certificate", "label": "Identity Verification: Upload Birth Certificate", "definitionVersion": "1.0", "documents": [ { "documentId": "8067d1fa-8751-55b3-83ce-3af932982805", "fileName": "maria_birth_cert.pdf", "uploadedAt": "2026-09-18T14:05:30Z", "status": "VALIDATED_BY_CORA", "statusSetBy": "cora", "reasonCodes": [] } ], "taxonomyDomain": "Identity", "recognition": "A certified birth record issued by a government vital records office. Shows the person's full name, date and place of birth, and an official seal or certification.", "fields": [ { "canonicalName": "birthcert.full_name", "label": "Full Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the person the certificate is for." }, { "canonicalName": "birthcert.date_of_birth", "label": "Date of Birth", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Date of birth as printed on the certificate." } ], "mappings": [ { "mappingId": "BM1", "documentValue": "birthcert.full_name", "applicationField": "application.applicant.full_name", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Name on certificate vs applicant name", "allowedDifference": null, "aiInstruction": "Decide whether the name on the certificate is the applicant, allowing for middle names, initials and common nicknames only when the rest matches.", "expression": "ai_compare(birthcert.full_name, application.applicant.full_name)", "applicantMessage": null, "reviewerMessage": "Name on the birth certificate does not match the applicant's name." }, { "mappingId": "BM2", "documentValue": "birthcert.date_of_birth", "applicationField": "application.applicant.date_of_birth", "compareMethod": "exact", "onFail": "clarification", "status": "active", "description": "Date of birth vs applicant date of birth", "allowedDifference": null, "aiInstruction": null, "expression": "birthcert.date_of_birth == application.applicant.date_of_birth", "applicantMessage": "The date of birth on your birth certificate does not match your application. Please explain the difference.", "reviewerMessage": null } ], "rules": [ { "ruleId": "B1", "name": "Certified copy", "checkType": "ai_judgement", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The document is a certified copy issued by a vital records office (seal or certification visible).", "program": "All", "expression": "ai_judge('certified copy with official seal or certification')", "inputs": [], "applicantMessage": "Please upload a certified copy of your birth certificate. The one we have does not show an official seal.", "reviewerMessage": null } ] } ] }, { "requirementId": "14478c58-d89b-544a-b7d6-ff33817a8261", "requirementType": "income.employment", "applicantId": "3eebb4dd-3835-5b97-bcc3-2cb65a7bf266", "status": "VALIDATED", "documentTypes": [ { "documentTypeId": "3b929155-899e-5fcf-ae13-c1f3ccab66ca", "documentTypeKey": "employment_pay_stub", "label": "Employment: Upload Pay stubs", "definitionVersion": "1.0", "documents": [ { "documentId": "0d9fbbac-9ea6-5ec6-bace-e14ebeedb891", "fileName": "james_stub_sep19.pdf", "uploadedAt": "2026-09-20T16:22:47Z", "status": "VALIDATED_BY_CORA", "statusSetBy": "cora", "reasonCodes": [] }, { "documentId": "e8489038-9529-5697-a5b0-2a9c5e07e854", "fileName": "james_stub_sep05.pdf", "uploadedAt": "2026-09-20T16:24:10Z", "status": "VALIDATED_BY_CORA", "statusSetBy": "cora", "reasonCodes": [] } ], "taxonomyDomain": "Income", "recognition": "An earnings statement issued by an employer for one pay period. Shows the employee and employer names, pay period and/or pay date, current and year-to-date gross pay, deductions and net pay. May be a paper check stub or a direct-deposit advice.", "fields": [ { "canonicalName": "paystub.employee.full_name", "label": "Employee Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the employee as printed on the stub." }, { "canonicalName": "paystub.employer.name", "label": "Employer Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Name of the employer or payroll company issuing the stub." }, { "canonicalName": "paystub.period.end_date", "label": "Pay Period End Date", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Last date of the pay period. This is the period end, not the pay/check date." }, { "canonicalName": "paystub.period.frequency", "label": "Pay Frequency", "dataType": "string", "required": false, "allowedValues": [ "weekly", "biweekly", "semimonthly", "monthly", "daily" ], "instruction": "How often the employee is paid." }, { "canonicalName": "paystub.current.gross_pay", "label": "Current Gross Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period gross pay before deductions. Decimal, no symbol. Use the current-period column, not YTD." }, { "canonicalName": "paystub.current.total_deductions", "label": "Current Total Deductions", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period deductions. Decimal, no symbol." }, { "canonicalName": "paystub.current.net_pay", "label": "Current Net Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Current-period net (take-home) pay. Decimal, no symbol." } ], "mappings": [ { "mappingId": "M3", "documentValue": "paystub.employer.name", "applicationField": "application.income.employment.employer", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Employer name (paystub.employer.name) vs application employer", "allowedDifference": null, "aiInstruction": "Decide whether the employer on the stub is the employer on the application, allowing for franchise vs legal entity and abbreviations. Flag genuine mismatches only.", "expression": "ai_compare(paystub.employer.name, application.income.employment.employer)", "applicantMessage": null, "reviewerMessage": "Employer on the pay stub does not match the employer on the application." } ], "rules": [ { "ruleId": "R5", "name": "Pay period is recent", "checkType": "exact", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The pay period end date is within 120 days of the certification effective date.", "program": "All", "expression": "within_days(paystub.period.end_date, application.certification_effective_date, 120)", "inputs": [ "paystub.period.end_date", "application.certification_effective_date" ], "applicantMessage": "Please upload a recent pay stub. The one we have is more than 120 days old.", "reviewerMessage": null }, { "ruleId": "R2", "name": "Gross = Net + Deductions", "checkType": "exact", "ruleType": "fraud", "checksAcross": "this_document", "onFail": "note", "evaluator": "cora", "status": "active", "description": "Current gross pay equals current net pay plus current total deductions.", "program": "All", "expression": "abs(paystub.current.gross_pay - (paystub.current.net_pay + paystub.current.total_deductions)) <= 1.00", "inputs": [ "paystub.current.gross_pay", "paystub.current.net_pay", "paystub.current.total_deductions" ], "applicantMessage": null, "reviewerMessage": "Current gross pay does not equal net pay plus deductions; review for potential fraud." } ] } ] }, { "requirementId": "4d80d8df-706b-5129-b2e8-afb1f2cbbe01", "requirementType": "identity", "applicantId": "3eebb4dd-3835-5b97-bcc3-2cb65a7bf266", "status": "VALIDATED", "documentTypes": [ { "documentTypeId": "906ea333-6be0-5550-ba86-936eecf538fc", "documentTypeKey": "identity_birth_certificate", "label": "Identity Verification: Upload Birth Certificate", "definitionVersion": "1.0", "documents": [ { "documentId": "a65e155d-8fe8-546e-972d-908b21451760", "fileName": "james_birth_cert.pdf", "uploadedAt": "2026-09-20T16:30:02Z", "status": "VALIDATED_BY_CORA", "statusSetBy": "cora", "reasonCodes": [] } ], "taxonomyDomain": "Identity", "recognition": "A certified birth record issued by a government vital records office. Shows the person's full name, date and place of birth, and an official seal or certification.", "fields": [ { "canonicalName": "birthcert.full_name", "label": "Full Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the person the certificate is for." }, { "canonicalName": "birthcert.date_of_birth", "label": "Date of Birth", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Date of birth as printed on the certificate." } ], "mappings": [ { "mappingId": "BM1", "documentValue": "birthcert.full_name", "applicationField": "application.applicant.full_name", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Name on certificate vs applicant name", "allowedDifference": null, "aiInstruction": "Decide whether the name on the certificate is the applicant, allowing for middle names, initials and common nicknames only when the rest matches.", "expression": "ai_compare(birthcert.full_name, application.applicant.full_name)", "applicantMessage": null, "reviewerMessage": "Name on the birth certificate does not match the applicant's name." }, { "mappingId": "BM2", "documentValue": "birthcert.date_of_birth", "applicationField": "application.applicant.date_of_birth", "compareMethod": "exact", "onFail": "clarification", "status": "active", "description": "Date of birth vs applicant date of birth", "allowedDifference": null, "aiInstruction": null, "expression": "birthcert.date_of_birth == application.applicant.date_of_birth", "applicantMessage": "The date of birth on your birth certificate does not match your application. Please explain the difference.", "reviewerMessage": null } ], "rules": [ { "ruleId": "B1", "name": "Certified copy", "checkType": "ai_judgement", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The document is a certified copy issued by a vital records office (seal or certification visible).", "program": "All", "expression": "ai_judge('certified copy with official seal or certification')", "inputs": [], "applicantMessage": "Please upload a certified copy of your birth certificate. The one we have does not show an official seal.", "reviewerMessage": null } ] } ] } ] } ``` **SDK Code** ```python 7. Every requirement uploaded, extracted and validated (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) import requests url = "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle" querystring = {"exclude":"requirements.documentTypes"} headers = {"x-api-key": ""} response = requests.get(url, headers=headers, params=querystring) print(response.json()) ``` ```javascript 7. Every requirement uploaded, extracted and validated (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) const url = 'https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes'; const options = {method: 'GET', headers: {'x-api-key': ''}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go 7. Every requirement uploaded, extracted and validated (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("x-api-key", "") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby 7. Every requirement uploaded, extracted and validated (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) require 'uri' require 'net/http' url = URI("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["x-api-key"] = '' response = http.request(request) puts response.read_body ``` ```java 7. Every requirement uploaded, extracted and validated (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes") .header("x-api-key", "") .asString(); ``` ```php 7. Every requirement uploaded, extracted and validated (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) request('GET', 'https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes', [ 'headers' => [ 'x-api-key' => '', ], ]); echo $response->getBody(); ``` ```csharp 7. Every requirement uploaded, extracted and validated (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) using RestSharp; var client = new RestClient("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes"); var request = new RestRequest(Method.GET); request.AddHeader("x-api-key", ""); IRestResponse response = client.Execute(request); ``` ```swift 7. Every requirement uploaded, extracted and validated (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult) import Foundation let headers = ["x-api-key": ""] let request = NSMutableURLRequest(url: NSURL(string: "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` ### 8. Every uploaded document extracted, evaluation partly validated and partly rejected; Maria's identity document rejected (awaiting a new upload) (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult&hideDocumentTypesOnValidatedRequirement=true) **Response** ```json { "applicationId": "9d8c7b6a-5e4f-4d3c-9b2a-1e0f9d8c7b6a", "requirements": [ { "requirementId": "78b21158-b27e-5a4f-87d6-e6604b1b3912", "requirementType": "income.employment", "applicantId": "6e5d4c3b-2a19-4f08-8e7d-6c5b4a392817", "status": "VALIDATED" }, { "requirementId": "40d30ff4-ad66-5e33-a648-c7432a5a4fba", "requirementType": "identity", "applicantId": "6e5d4c3b-2a19-4f08-8e7d-6c5b4a392817", "status": "AWAITING_UPLOAD", "documentTypes": [ { "documentTypeId": "906ea333-6be0-5550-ba86-936eecf538fc", "documentTypeKey": "identity_birth_certificate", "label": "Identity Verification: Upload Birth Certificate", "definitionVersion": "1.0", "documents": [ { "documentId": "8067d1fa-8751-55b3-83ce-3af932982805", "fileName": "maria_birth_cert.pdf", "uploadedAt": "2026-09-18T14:05:30Z", "status": "REJECTED", "statusSetBy": "cora", "reasonCodes": [ "B1" ] } ], "taxonomyDomain": "Identity", "recognition": "A certified birth record issued by a government vital records office. Shows the person's full name, date and place of birth, and an official seal or certification.", "fields": [ { "canonicalName": "birthcert.full_name", "label": "Full Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the person the certificate is for." }, { "canonicalName": "birthcert.date_of_birth", "label": "Date of Birth", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Date of birth as printed on the certificate." } ], "mappings": [ { "mappingId": "BM1", "documentValue": "birthcert.full_name", "applicationField": "application.applicant.full_name", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Name on certificate vs applicant name", "allowedDifference": null, "aiInstruction": "Decide whether the name on the certificate is the applicant, allowing for middle names, initials and common nicknames only when the rest matches.", "expression": "ai_compare(birthcert.full_name, application.applicant.full_name)", "applicantMessage": null, "reviewerMessage": "Name on the birth certificate does not match the applicant's name." }, { "mappingId": "BM2", "documentValue": "birthcert.date_of_birth", "applicationField": "application.applicant.date_of_birth", "compareMethod": "exact", "onFail": "clarification", "status": "active", "description": "Date of birth vs applicant date of birth", "allowedDifference": null, "aiInstruction": null, "expression": "birthcert.date_of_birth == application.applicant.date_of_birth", "applicantMessage": "The date of birth on your birth certificate does not match your application. Please explain the difference.", "reviewerMessage": null } ], "rules": [ { "ruleId": "B1", "name": "Certified copy", "checkType": "ai_judgement", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The document is a certified copy issued by a vital records office (seal or certification visible).", "program": "All", "expression": "ai_judge('certified copy with official seal or certification')", "inputs": [], "applicantMessage": "Please upload a certified copy of your birth certificate. The one we have does not show an official seal.", "reviewerMessage": null } ] } ] }, { "requirementId": "14478c58-d89b-544a-b7d6-ff33817a8261", "requirementType": "income.employment", "applicantId": "3eebb4dd-3835-5b97-bcc3-2cb65a7bf266", "status": "WAITING_FOR_COMPLIANCE", "documentTypes": [ { "documentTypeId": "3b929155-899e-5fcf-ae13-c1f3ccab66ca", "documentTypeKey": "employment_pay_stub", "label": "Employment: Upload Pay stubs", "definitionVersion": "1.0", "documents": [ { "documentId": "0d9fbbac-9ea6-5ec6-bace-e14ebeedb891", "fileName": "james_stub_sep19.pdf", "uploadedAt": "2026-09-20T16:22:47Z", "status": "VALIDATED_BY_CORA", "statusSetBy": "cora", "reasonCodes": [] }, { "documentId": "e8489038-9529-5697-a5b0-2a9c5e07e854", "fileName": "james_stub_sep05.pdf", "uploadedAt": "2026-09-20T16:24:10Z", "status": "WAITING_FOR_COMPLIANCE", "statusSetBy": "cora", "reasonCodes": [ "M3" ] } ], "taxonomyDomain": "Income", "recognition": "An earnings statement issued by an employer for one pay period. Shows the employee and employer names, pay period and/or pay date, current and year-to-date gross pay, deductions and net pay. May be a paper check stub or a direct-deposit advice.", "fields": [ { "canonicalName": "paystub.employee.full_name", "label": "Employee Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the employee as printed on the stub." }, { "canonicalName": "paystub.employer.name", "label": "Employer Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Name of the employer or payroll company issuing the stub." }, { "canonicalName": "paystub.period.end_date", "label": "Pay Period End Date", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Last date of the pay period. This is the period end, not the pay/check date." }, { "canonicalName": "paystub.period.frequency", "label": "Pay Frequency", "dataType": "string", "required": false, "allowedValues": [ "weekly", "biweekly", "semimonthly", "monthly", "daily" ], "instruction": "How often the employee is paid." }, { "canonicalName": "paystub.current.gross_pay", "label": "Current Gross Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period gross pay before deductions. Decimal, no symbol. Use the current-period column, not YTD." }, { "canonicalName": "paystub.current.total_deductions", "label": "Current Total Deductions", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period deductions. Decimal, no symbol." }, { "canonicalName": "paystub.current.net_pay", "label": "Current Net Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Current-period net (take-home) pay. Decimal, no symbol." } ], "mappings": [ { "mappingId": "M3", "documentValue": "paystub.employer.name", "applicationField": "application.income.employment.employer", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Employer name (paystub.employer.name) vs application employer", "allowedDifference": null, "aiInstruction": "Decide whether the employer on the stub is the employer on the application, allowing for franchise vs legal entity and abbreviations. Flag genuine mismatches only.", "expression": "ai_compare(paystub.employer.name, application.income.employment.employer)", "applicantMessage": null, "reviewerMessage": "Employer on the pay stub does not match the employer on the application." } ], "rules": [ { "ruleId": "R5", "name": "Pay period is recent", "checkType": "exact", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The pay period end date is within 120 days of the certification effective date.", "program": "All", "expression": "within_days(paystub.period.end_date, application.certification_effective_date, 120)", "inputs": [ "paystub.period.end_date", "application.certification_effective_date" ], "applicantMessage": "Please upload a recent pay stub. The one we have is more than 120 days old.", "reviewerMessage": null }, { "ruleId": "R2", "name": "Gross = Net + Deductions", "checkType": "exact", "ruleType": "fraud", "checksAcross": "this_document", "onFail": "note", "evaluator": "cora", "status": "active", "description": "Current gross pay equals current net pay plus current total deductions.", "program": "All", "expression": "abs(paystub.current.gross_pay - (paystub.current.net_pay + paystub.current.total_deductions)) <= 1.00", "inputs": [ "paystub.current.gross_pay", "paystub.current.net_pay", "paystub.current.total_deductions" ], "applicantMessage": null, "reviewerMessage": "Current gross pay does not equal net pay plus deductions; review for potential fraud." } ] } ] }, { "requirementId": "4d80d8df-706b-5129-b2e8-afb1f2cbbe01", "requirementType": "identity", "applicantId": "3eebb4dd-3835-5b97-bcc3-2cb65a7bf266", "status": "VALIDATED" } ] } ``` **SDK Code** ```python 8. Every uploaded document extracted, evaluation partly validated and partly rejected; Maria's identity document rejected (awaiting a new upload) (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult&hideDocumentTypesOnValidatedRequirement=true) import requests url = "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle" querystring = {"exclude":"requirements.documentTypes"} headers = {"x-api-key": ""} response = requests.get(url, headers=headers, params=querystring) print(response.json()) ``` ```javascript 8. Every uploaded document extracted, evaluation partly validated and partly rejected; Maria's identity document rejected (awaiting a new upload) (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult&hideDocumentTypesOnValidatedRequirement=true) const url = 'https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes'; const options = {method: 'GET', headers: {'x-api-key': ''}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go 8. Every uploaded document extracted, evaluation partly validated and partly rejected; Maria's identity document rejected (awaiting a new upload) (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult&hideDocumentTypesOnValidatedRequirement=true) package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("x-api-key", "") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby 8. Every uploaded document extracted, evaluation partly validated and partly rejected; Maria's identity document rejected (awaiting a new upload) (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult&hideDocumentTypesOnValidatedRequirement=true) require 'uri' require 'net/http' url = URI("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["x-api-key"] = '' response = http.request(request) puts response.read_body ``` ```java 8. Every uploaded document extracted, evaluation partly validated and partly rejected; Maria's identity document rejected (awaiting a new upload) (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult&hideDocumentTypesOnValidatedRequirement=true) import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes") .header("x-api-key", "") .asString(); ``` ```php 8. Every uploaded document extracted, evaluation partly validated and partly rejected; Maria's identity document rejected (awaiting a new upload) (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult&hideDocumentTypesOnValidatedRequirement=true) request('GET', 'https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes', [ 'headers' => [ 'x-api-key' => '', ], ]); echo $response->getBody(); ``` ```csharp 8. Every uploaded document extracted, evaluation partly validated and partly rejected; Maria's identity document rejected (awaiting a new upload) (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult&hideDocumentTypesOnValidatedRequirement=true) using RestSharp; var client = new RestClient("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes"); var request = new RestRequest(Method.GET); request.AddHeader("x-api-key", ""); IRestResponse response = client.Execute(request); ``` ```swift 8. Every uploaded document extracted, evaluation partly validated and partly rejected; Maria's identity document rejected (awaiting a new upload) (?exclude=requirements.documentTypes.documents.extractedFields,requirements.documentTypes.documents.reviewResult&hideDocumentTypesOnValidatedRequirement=true) import Foundation let headers = ["x-api-key": ""] let request = NSMutableURLRequest(url: NSURL(string: "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` ### 9. Full payload (no exclude): scenario 5 with definitions, extracted fields and review results **Response** ```json { "applicationId": "9d8c7b6a-5e4f-4d3c-9b2a-1e0f9d8c7b6a", "requirements": [ { "requirementId": "78b21158-b27e-5a4f-87d6-e6604b1b3912", "requirementType": "income.employment", "applicantId": "6e5d4c3b-2a19-4f08-8e7d-6c5b4a392817", "status": "VALIDATED", "documentTypes": [ { "documentTypeId": "3b929155-899e-5fcf-ae13-c1f3ccab66ca", "documentTypeKey": "employment_pay_stub", "label": "Employment: Upload Pay stubs", "definitionVersion": "1.0", "documents": [ { "documentId": "998fa0b8-6604-5b80-9e6c-606a24ea9650", "fileName": "maria_stub_sep12.pdf", "uploadedAt": "2026-09-18T14:02:11Z", "status": "VALIDATED_BY_CORA", "statusSetBy": "cora", "reasonCodes": [], "extractedFields": [ { "canonicalName": "paystub.employee.full_name", "value": "Maria E. Lopez", "confidence": 0.97, "page": 1 }, { "canonicalName": "paystub.employer.name", "value": "GEICO", "confidence": 0.95, "page": 1 }, { "canonicalName": "paystub.period.end_date", "value": "2026-09-12", "confidence": 0.93, "page": 1 }, { "canonicalName": "paystub.period.frequency", "value": "biweekly", "confidence": 0.9, "page": 1 }, { "canonicalName": "paystub.current.gross_pay", "value": 1600, "confidence": 0.98, "page": 1 }, { "canonicalName": "paystub.current.total_deductions", "value": 312.4, "confidence": 0.96, "page": 1 }, { "canonicalName": "paystub.current.net_pay", "value": 1287.6, "confidence": 0.98, "page": 1 } ], "reviewResult": { "runId": "run_9101A", "definitionVersion": "1.0", "applicationVersion": "a17", "reviewedAt": "2026-09-21T10:15:00Z", "quality": { "documentTypeDetected": "employment_pay_stub", "rightDocument": "pass", "legibility": "pass", "completeness": "pass" }, "checks": [ { "checkId": "R2", "kind": "rule", "checkType": "exact", "verdict": "PASS", "inputs": [ "paystub.current.gross_pay", "paystub.current.net_pay", "paystub.current.total_deductions" ], "observed": "1600.00 vs 1287.60 + 312.40 = 1600.00", "expected": "difference <= 1.00" }, { "checkId": "R5", "kind": "rule", "checkType": "exact", "verdict": "PASS", "inputs": [ "paystub.period.end_date", "application.certification_effective_date" ], "observed": "2026-09-12 is 50 days before 2026-11-01", "expected": "within 120 days" }, { "checkId": "M3", "kind": "mapping", "checkType": "ai_judgement", "verdict": "PASS", "inputs": [ "paystub.employer.name", "application.income.employment.employer" ], "observed": "GEICO", "expected": "Government Employees Insurance Co.", "comment": "GEICO and Government Employees Insurance Co. are the same employer." } ], "computed": [ { "name": "annualized_gross", "value": 41600, "sourceCheck": "E1" } ] } }, { "documentId": "17bad985-8466-59ad-aa79-696045edb17f", "fileName": "maria_stub_sep26.pdf", "uploadedAt": "2026-09-19T09:40:03Z", "status": "VALIDATED_BY_CORA", "statusSetBy": "cora", "reasonCodes": [], "extractedFields": [ { "canonicalName": "paystub.employee.full_name", "value": "Maria E. Lopez", "confidence": 0.97, "page": 1 }, { "canonicalName": "paystub.employer.name", "value": "GEICO", "confidence": 0.95, "page": 1 }, { "canonicalName": "paystub.period.end_date", "value": "2026-09-26", "confidence": 0.93, "page": 1 }, { "canonicalName": "paystub.period.frequency", "value": "biweekly", "confidence": 0.9, "page": 1 }, { "canonicalName": "paystub.current.gross_pay", "value": 1600, "confidence": 0.98, "page": 1 }, { "canonicalName": "paystub.current.total_deductions", "value": 312.4, "confidence": 0.96, "page": 1 }, { "canonicalName": "paystub.current.net_pay", "value": 1287.6, "confidence": 0.98, "page": 1 } ], "reviewResult": { "runId": "run_9102A", "definitionVersion": "1.0", "applicationVersion": "a17", "reviewedAt": "2026-09-21T10:15:00Z", "quality": { "documentTypeDetected": "employment_pay_stub", "rightDocument": "pass", "legibility": "pass", "completeness": "pass" }, "checks": [ { "checkId": "R2", "kind": "rule", "checkType": "exact", "verdict": "PASS", "inputs": [ "paystub.current.gross_pay", "paystub.current.net_pay", "paystub.current.total_deductions" ], "observed": "1600.00 vs 1287.60 + 312.40 = 1600.00", "expected": "difference <= 1.00" }, { "checkId": "R5", "kind": "rule", "checkType": "exact", "verdict": "PASS", "inputs": [ "paystub.period.end_date", "application.certification_effective_date" ], "observed": "2026-09-26 is 36 days before 2026-11-01", "expected": "within 120 days" }, { "checkId": "M3", "kind": "mapping", "checkType": "ai_judgement", "verdict": "PASS", "inputs": [ "paystub.employer.name", "application.income.employment.employer" ], "observed": "GEICO", "expected": "Government Employees Insurance Co.", "comment": "GEICO and Government Employees Insurance Co. are the same employer." } ], "computed": [ { "name": "annualized_gross", "value": 41600, "sourceCheck": "E1" } ] } } ], "taxonomyDomain": "Income", "recognition": "An earnings statement issued by an employer for one pay period. Shows the employee and employer names, pay period and/or pay date, current and year-to-date gross pay, deductions and net pay. May be a paper check stub or a direct-deposit advice.", "fields": [ { "canonicalName": "paystub.employee.full_name", "label": "Employee Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the employee as printed on the stub." }, { "canonicalName": "paystub.employer.name", "label": "Employer Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Name of the employer or payroll company issuing the stub." }, { "canonicalName": "paystub.period.end_date", "label": "Pay Period End Date", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Last date of the pay period. This is the period end, not the pay/check date." }, { "canonicalName": "paystub.period.frequency", "label": "Pay Frequency", "dataType": "string", "required": false, "allowedValues": [ "weekly", "biweekly", "semimonthly", "monthly", "daily" ], "instruction": "How often the employee is paid." }, { "canonicalName": "paystub.current.gross_pay", "label": "Current Gross Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period gross pay before deductions. Decimal, no symbol. Use the current-period column, not YTD." }, { "canonicalName": "paystub.current.total_deductions", "label": "Current Total Deductions", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period deductions. Decimal, no symbol." }, { "canonicalName": "paystub.current.net_pay", "label": "Current Net Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Current-period net (take-home) pay. Decimal, no symbol." } ], "mappings": [ { "mappingId": "M3", "documentValue": "paystub.employer.name", "applicationField": "application.income.employment.employer", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Employer name (paystub.employer.name) vs application employer", "allowedDifference": null, "aiInstruction": "Decide whether the employer on the stub is the employer on the application, allowing for franchise vs legal entity and abbreviations. Flag genuine mismatches only.", "expression": "ai_compare(paystub.employer.name, application.income.employment.employer)", "applicantMessage": null, "reviewerMessage": "Employer on the pay stub does not match the employer on the application." } ], "rules": [ { "ruleId": "R5", "name": "Pay period is recent", "checkType": "exact", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The pay period end date is within 120 days of the certification effective date.", "program": "All", "expression": "within_days(paystub.period.end_date, application.certification_effective_date, 120)", "inputs": [ "paystub.period.end_date", "application.certification_effective_date" ], "applicantMessage": "Please upload a recent pay stub. The one we have is more than 120 days old.", "reviewerMessage": null }, { "ruleId": "R2", "name": "Gross = Net + Deductions", "checkType": "exact", "ruleType": "fraud", "checksAcross": "this_document", "onFail": "note", "evaluator": "cora", "status": "active", "description": "Current gross pay equals current net pay plus current total deductions.", "program": "All", "expression": "abs(paystub.current.gross_pay - (paystub.current.net_pay + paystub.current.total_deductions)) <= 1.00", "inputs": [ "paystub.current.gross_pay", "paystub.current.net_pay", "paystub.current.total_deductions" ], "applicantMessage": null, "reviewerMessage": "Current gross pay does not equal net pay plus deductions; review for potential fraud." } ] } ] }, { "requirementId": "40d30ff4-ad66-5e33-a648-c7432a5a4fba", "requirementType": "identity", "applicantId": "6e5d4c3b-2a19-4f08-8e7d-6c5b4a392817", "status": "VALIDATED", "documentTypes": [ { "documentTypeId": "906ea333-6be0-5550-ba86-936eecf538fc", "documentTypeKey": "identity_birth_certificate", "label": "Identity Verification: Upload Birth Certificate", "definitionVersion": "1.0", "documents": [ { "documentId": "8067d1fa-8751-55b3-83ce-3af932982805", "fileName": "maria_birth_cert.pdf", "uploadedAt": "2026-09-18T14:05:30Z", "status": "APPROVED", "statusSetBy": "fortress_user", "reasonCodes": [ "BM1" ], "extractedFields": [ { "canonicalName": "birthcert.full_name", "value": "Maria Elena Gomez", "confidence": 0.96, "page": 1 }, { "canonicalName": "birthcert.date_of_birth", "value": "1988-03-14", "confidence": 0.97, "page": 1 } ], "reviewResult": { "runId": "run_9103A", "definitionVersion": "1.0", "applicationVersion": "a17", "reviewedAt": "2026-09-21T10:15:00Z", "quality": { "documentTypeDetected": "identity_birth_certificate", "rightDocument": "pass", "legibility": "pass", "completeness": "pass" }, "checks": [ { "checkId": "BM1", "kind": "mapping", "checkType": "ai_judgement", "verdict": "FLAG", "inputs": [ "birthcert.full_name", "application.applicant.full_name" ], "observed": "Maria Elena Gomez", "expected": "Maria E. Lopez", "onFail": "compliance_only", "comment": "Different last name (possibly maiden name); needs a human to confirm it is the applicant." }, { "checkId": "BM2", "kind": "mapping", "checkType": "exact", "verdict": "PASS", "inputs": [ "birthcert.date_of_birth", "application.applicant.date_of_birth" ], "observed": "1988-03-14", "expected": "1988-03-14" }, { "checkId": "B1", "kind": "rule", "checkType": "ai_judgement", "verdict": "PASS", "inputs": [], "observed": "State vital records seal visible on page 1", "expected": "certified copy with official seal or certification", "comment": "Certified copy." } ], "computed": [] } } ], "taxonomyDomain": "Identity", "recognition": "A certified birth record issued by a government vital records office. Shows the person's full name, date and place of birth, and an official seal or certification.", "fields": [ { "canonicalName": "birthcert.full_name", "label": "Full Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the person the certificate is for." }, { "canonicalName": "birthcert.date_of_birth", "label": "Date of Birth", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Date of birth as printed on the certificate." } ], "mappings": [ { "mappingId": "BM1", "documentValue": "birthcert.full_name", "applicationField": "application.applicant.full_name", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Name on certificate vs applicant name", "allowedDifference": null, "aiInstruction": "Decide whether the name on the certificate is the applicant, allowing for middle names, initials and common nicknames only when the rest matches.", "expression": "ai_compare(birthcert.full_name, application.applicant.full_name)", "applicantMessage": null, "reviewerMessage": "Name on the birth certificate does not match the applicant's name." }, { "mappingId": "BM2", "documentValue": "birthcert.date_of_birth", "applicationField": "application.applicant.date_of_birth", "compareMethod": "exact", "onFail": "clarification", "status": "active", "description": "Date of birth vs applicant date of birth", "allowedDifference": null, "aiInstruction": null, "expression": "birthcert.date_of_birth == application.applicant.date_of_birth", "applicantMessage": "The date of birth on your birth certificate does not match your application. Please explain the difference.", "reviewerMessage": null } ], "rules": [ { "ruleId": "B1", "name": "Certified copy", "checkType": "ai_judgement", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The document is a certified copy issued by a vital records office (seal or certification visible).", "program": "All", "expression": "ai_judge('certified copy with official seal or certification')", "inputs": [], "applicantMessage": "Please upload a certified copy of your birth certificate. The one we have does not show an official seal.", "reviewerMessage": null } ] } ] }, { "requirementId": "14478c58-d89b-544a-b7d6-ff33817a8261", "requirementType": "income.employment", "applicantId": "3eebb4dd-3835-5b97-bcc3-2cb65a7bf266", "status": "AWAITING_UPLOAD", "documentTypes": [ { "documentTypeId": "3b929155-899e-5fcf-ae13-c1f3ccab66ca", "documentTypeKey": "employment_pay_stub", "label": "Employment: Upload Pay stubs", "definitionVersion": "1.0", "documents": [ { "documentId": "0d9fbbac-9ea6-5ec6-bace-e14ebeedb891", "fileName": "james_stub_sep19.pdf", "uploadedAt": "2026-09-20T16:22:47Z", "status": "VALIDATED_BY_CORA", "statusSetBy": "cora", "reasonCodes": [], "extractedFields": [ { "canonicalName": "paystub.employee.full_name", "value": "James R. Lopez", "confidence": 0.97, "page": 1 }, { "canonicalName": "paystub.employer.name", "value": "The Home Depot", "confidence": 0.95, "page": 1 }, { "canonicalName": "paystub.period.end_date", "value": "2026-09-19", "confidence": 0.93, "page": 1 }, { "canonicalName": "paystub.period.frequency", "value": "biweekly", "confidence": 0.9, "page": 1 }, { "canonicalName": "paystub.current.gross_pay", "value": 1240, "confidence": 0.98, "page": 1 }, { "canonicalName": "paystub.current.total_deductions", "value": 201.15, "confidence": 0.96, "page": 1 }, { "canonicalName": "paystub.current.net_pay", "value": 1038.85, "confidence": 0.98, "page": 1 } ], "reviewResult": { "runId": "run_9201A", "definitionVersion": "1.0", "applicationVersion": "a17", "reviewedAt": "2026-09-21T10:15:00Z", "quality": { "documentTypeDetected": "employment_pay_stub", "rightDocument": "pass", "legibility": "pass", "completeness": "pass" }, "checks": [ { "checkId": "R2", "kind": "rule", "checkType": "exact", "verdict": "PASS", "inputs": [ "paystub.current.gross_pay", "paystub.current.net_pay", "paystub.current.total_deductions" ], "observed": "1240.00 vs 1038.85 + 201.15 = 1240.00", "expected": "difference <= 1.00" }, { "checkId": "R5", "kind": "rule", "checkType": "exact", "verdict": "PASS", "inputs": [ "paystub.period.end_date", "application.certification_effective_date" ], "observed": "2026-09-19 is 43 days before 2026-11-01", "expected": "within 120 days" }, { "checkId": "M3", "kind": "mapping", "checkType": "ai_judgement", "verdict": "PASS", "inputs": [ "paystub.employer.name", "application.income.employment.employer" ], "observed": "The Home Depot", "expected": "The Home Depot Inc.", "comment": "The Home Depot and The Home Depot Inc. are the same employer." } ], "computed": [ { "name": "annualized_gross", "value": 32240, "sourceCheck": "E1" } ] } }, { "documentId": "e8489038-9529-5697-a5b0-2a9c5e07e854", "fileName": "james_stub_sep05.pdf", "uploadedAt": "2026-09-20T16:24:10Z", "status": "REJECTED", "statusSetBy": "cora", "reasonCodes": [ "R5" ], "extractedFields": [ { "canonicalName": "paystub.employee.full_name", "value": "James R. Lopez", "confidence": 0.97, "page": 1 }, { "canonicalName": "paystub.employer.name", "value": "The Home Depot", "confidence": 0.95, "page": 1 }, { "canonicalName": "paystub.period.end_date", "value": "2026-06-02", "confidence": 0.93, "page": 1 }, { "canonicalName": "paystub.period.frequency", "value": "biweekly", "confidence": 0.9, "page": 1 }, { "canonicalName": "paystub.current.gross_pay", "value": 1240, "confidence": 0.98, "page": 1 }, { "canonicalName": "paystub.current.total_deductions", "value": 201.15, "confidence": 0.96, "page": 1 }, { "canonicalName": "paystub.current.net_pay", "value": 1038.85, "confidence": 0.98, "page": 1 } ], "reviewResult": { "runId": "run_9202A", "definitionVersion": "1.0", "applicationVersion": "a17", "reviewedAt": "2026-09-21T10:15:00Z", "quality": { "documentTypeDetected": "employment_pay_stub", "rightDocument": "pass", "legibility": "pass", "completeness": "pass" }, "checks": [ { "checkId": "R2", "kind": "rule", "checkType": "exact", "verdict": "PASS", "inputs": [ "paystub.current.gross_pay", "paystub.current.net_pay", "paystub.current.total_deductions" ], "observed": "1240.00 vs 1038.85 + 201.15 = 1240.00", "expected": "difference <= 1.00" }, { "checkId": "R5", "kind": "rule", "checkType": "exact", "verdict": "FLAG", "inputs": [ "paystub.period.end_date", "application.certification_effective_date" ], "observed": "2026-06-02 is 152 days before 2026-11-01", "expected": "within 120 days", "onFail": "reupload", "applicantMessage": "Please upload a recent pay stub. The one we have is more than 120 days old." }, { "checkId": "M3", "kind": "mapping", "checkType": "ai_judgement", "verdict": "PASS", "inputs": [ "paystub.employer.name", "application.income.employment.employer" ], "observed": "The Home Depot", "expected": "The Home Depot Inc.", "comment": "The Home Depot and The Home Depot Inc. are the same employer." } ], "computed": [ { "name": "annualized_gross", "value": 32240, "sourceCheck": "E1" } ] } } ], "taxonomyDomain": "Income", "recognition": "An earnings statement issued by an employer for one pay period. Shows the employee and employer names, pay period and/or pay date, current and year-to-date gross pay, deductions and net pay. May be a paper check stub or a direct-deposit advice.", "fields": [ { "canonicalName": "paystub.employee.full_name", "label": "Employee Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the employee as printed on the stub." }, { "canonicalName": "paystub.employer.name", "label": "Employer Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Name of the employer or payroll company issuing the stub." }, { "canonicalName": "paystub.period.end_date", "label": "Pay Period End Date", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Last date of the pay period. This is the period end, not the pay/check date." }, { "canonicalName": "paystub.period.frequency", "label": "Pay Frequency", "dataType": "string", "required": false, "allowedValues": [ "weekly", "biweekly", "semimonthly", "monthly", "daily" ], "instruction": "How often the employee is paid." }, { "canonicalName": "paystub.current.gross_pay", "label": "Current Gross Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period gross pay before deductions. Decimal, no symbol. Use the current-period column, not YTD." }, { "canonicalName": "paystub.current.total_deductions", "label": "Current Total Deductions", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Total current-period deductions. Decimal, no symbol." }, { "canonicalName": "paystub.current.net_pay", "label": "Current Net Pay", "dataType": "number", "required": true, "allowedValues": null, "instruction": "Current-period net (take-home) pay. Decimal, no symbol." } ], "mappings": [ { "mappingId": "M3", "documentValue": "paystub.employer.name", "applicationField": "application.income.employment.employer", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Employer name (paystub.employer.name) vs application employer", "allowedDifference": null, "aiInstruction": "Decide whether the employer on the stub is the employer on the application, allowing for franchise vs legal entity and abbreviations. Flag genuine mismatches only.", "expression": "ai_compare(paystub.employer.name, application.income.employment.employer)", "applicantMessage": null, "reviewerMessage": "Employer on the pay stub does not match the employer on the application." } ], "rules": [ { "ruleId": "R5", "name": "Pay period is recent", "checkType": "exact", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The pay period end date is within 120 days of the certification effective date.", "program": "All", "expression": "within_days(paystub.period.end_date, application.certification_effective_date, 120)", "inputs": [ "paystub.period.end_date", "application.certification_effective_date" ], "applicantMessage": "Please upload a recent pay stub. The one we have is more than 120 days old.", "reviewerMessage": null }, { "ruleId": "R2", "name": "Gross = Net + Deductions", "checkType": "exact", "ruleType": "fraud", "checksAcross": "this_document", "onFail": "note", "evaluator": "cora", "status": "active", "description": "Current gross pay equals current net pay plus current total deductions.", "program": "All", "expression": "abs(paystub.current.gross_pay - (paystub.current.net_pay + paystub.current.total_deductions)) <= 1.00", "inputs": [ "paystub.current.gross_pay", "paystub.current.net_pay", "paystub.current.total_deductions" ], "applicantMessage": null, "reviewerMessage": "Current gross pay does not equal net pay plus deductions; review for potential fraud." } ] } ] }, { "requirementId": "4d80d8df-706b-5129-b2e8-afb1f2cbbe01", "requirementType": "identity", "applicantId": "3eebb4dd-3835-5b97-bcc3-2cb65a7bf266", "status": "WAITING_FOR_COMPLIANCE", "documentTypes": [ { "documentTypeId": "906ea333-6be0-5550-ba86-936eecf538fc", "documentTypeKey": "identity_birth_certificate", "label": "Identity Verification: Upload Birth Certificate", "definitionVersion": "1.0", "documents": [ { "documentId": "a65e155d-8fe8-546e-972d-908b21451760", "fileName": "james_birth_cert.pdf", "uploadedAt": "2026-09-20T16:30:02Z", "status": "WAITING_FOR_COMPLIANCE", "statusSetBy": "cora", "reasonCodes": [ "BM1" ], "extractedFields": [ { "canonicalName": "birthcert.full_name", "value": "Jim Lopez", "confidence": 0.96, "page": 1 }, { "canonicalName": "birthcert.date_of_birth", "value": "1986-11-02", "confidence": 0.97, "page": 1 } ], "reviewResult": { "runId": "run_9203A", "definitionVersion": "1.0", "applicationVersion": "a17", "reviewedAt": "2026-09-21T10:15:00Z", "quality": { "documentTypeDetected": "identity_birth_certificate", "rightDocument": "pass", "legibility": "pass", "completeness": "pass" }, "checks": [ { "checkId": "BM1", "kind": "mapping", "checkType": "ai_judgement", "verdict": "FLAG", "inputs": [ "birthcert.full_name", "application.applicant.full_name" ], "observed": "Jim Lopez", "expected": "James R. Lopez", "onFail": "compliance_only", "comment": "Nickname without a middle name or other matching detail; cannot confirm it is the applicant." }, { "checkId": "BM2", "kind": "mapping", "checkType": "exact", "verdict": "PASS", "inputs": [ "birthcert.date_of_birth", "application.applicant.date_of_birth" ], "observed": "1986-11-02", "expected": "1986-11-02" }, { "checkId": "B1", "kind": "rule", "checkType": "ai_judgement", "verdict": "PASS", "inputs": [], "observed": "State vital records seal visible on page 1", "expected": "certified copy with official seal or certification", "comment": "Certified copy." } ], "computed": [] } } ], "taxonomyDomain": "Identity", "recognition": "A certified birth record issued by a government vital records office. Shows the person's full name, date and place of birth, and an official seal or certification.", "fields": [ { "canonicalName": "birthcert.full_name", "label": "Full Name", "dataType": "string", "required": true, "allowedValues": null, "instruction": "Full name of the person the certificate is for." }, { "canonicalName": "birthcert.date_of_birth", "label": "Date of Birth", "dataType": "date", "required": true, "allowedValues": null, "instruction": "Date of birth as printed on the certificate." } ], "mappings": [ { "mappingId": "BM1", "documentValue": "birthcert.full_name", "applicationField": "application.applicant.full_name", "compareMethod": "ai_judgement", "onFail": "compliance_only", "status": "active", "description": "Name on certificate vs applicant name", "allowedDifference": null, "aiInstruction": "Decide whether the name on the certificate is the applicant, allowing for middle names, initials and common nicknames only when the rest matches.", "expression": "ai_compare(birthcert.full_name, application.applicant.full_name)", "applicantMessage": null, "reviewerMessage": "Name on the birth certificate does not match the applicant's name." }, { "mappingId": "BM2", "documentValue": "birthcert.date_of_birth", "applicationField": "application.applicant.date_of_birth", "compareMethod": "exact", "onFail": "clarification", "status": "active", "description": "Date of birth vs applicant date of birth", "allowedDifference": null, "aiInstruction": null, "expression": "birthcert.date_of_birth == application.applicant.date_of_birth", "applicantMessage": "The date of birth on your birth certificate does not match your application. Please explain the difference.", "reviewerMessage": null } ], "rules": [ { "ruleId": "B1", "name": "Certified copy", "checkType": "ai_judgement", "ruleType": "standard", "checksAcross": "this_document", "onFail": "reupload", "evaluator": "cora", "status": "active", "description": "The document is a certified copy issued by a vital records office (seal or certification visible).", "program": "All", "expression": "ai_judge('certified copy with official seal or certification')", "inputs": [], "applicantMessage": "Please upload a certified copy of your birth certificate. The one we have does not show an official seal.", "reviewerMessage": null } ] } ] } ] } ``` **SDK Code** ```python 9. Full payload (no exclude): scenario 5 with definitions, extracted fields and review results import requests url = "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle" querystring = {"exclude":"requirements.documentTypes"} headers = {"x-api-key": ""} response = requests.get(url, headers=headers, params=querystring) print(response.json()) ``` ```javascript 9. Full payload (no exclude): scenario 5 with definitions, extracted fields and review results const url = 'https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes'; const options = {method: 'GET', headers: {'x-api-key': ''}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go 9. Full payload (no exclude): scenario 5 with definitions, extracted fields and review results package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("x-api-key", "") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby 9. Full payload (no exclude): scenario 5 with definitions, extracted fields and review results require 'uri' require 'net/http' url = URI("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["x-api-key"] = '' response = http.request(request) puts response.read_body ``` ```java 9. Full payload (no exclude): scenario 5 with definitions, extracted fields and review results import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes") .header("x-api-key", "") .asString(); ``` ```php 9. Full payload (no exclude): scenario 5 with definitions, extracted fields and review results request('GET', 'https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes', [ 'headers' => [ 'x-api-key' => '', ], ]); echo $response->getBody(); ``` ```csharp 9. Full payload (no exclude): scenario 5 with definitions, extracted fields and review results using RestSharp; var client = new RestClient("https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes"); var request = new RestRequest(Method.GET); request.AddHeader("x-api-key", ""); IRestResponse response = client.Execute(request); ``` ```swift 9. Full payload (no exclude): scenario 5 with definitions, extracted fields and review results import Foundation let headers = ["x-api-key": ""] let request = NSMutableURLRequest(url: NSURL(string: "https://api.fortresstech.io/v1/compliance-documents/applications/applicationId/bundle?exclude=requirements.documentTypes")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ```