Fintech lenders should verify loan documents before underwriting starts. The first pass checks the application file itself: completeness, person-to-company links, parseable income evidence, and fraud signals in the submitted files. Underwriting can start after that evidence is clean enough to trust.
The UAE makes the workflow easy to see. A typical SME or merchant-finance lead may upload an Emirates ID, a trade license, bank statements, and sometimes an MOA, passport, TRN, invoices, or domain evidence. A useful document verification API turns that bundle into JSON: extracted fields, matched people, company details, cross-document mismatches, fraud flags, and review reasons.

Checks before underwriting
Before a lender scores the application, the document layer should answer the evidence questions that decide routing. A clean file moves to underwriting. A weak file asks for fresh documents or goes to review with the exact reason attached.
| Question | Evidence to compare | Typical API output |
|---|---|---|
| Is the file complete? | Required document list, uploaded files, country and product rules | missing_required_document, unexpected_document_type, duplicate_file |
| Can the applicant act for the company? | Emirates ID or passport, trade license, MOA, POA, authorized signatory evidence | person_not_linked_to_company, role_unverified, person_link_found |
| Does the company match across the bundle? | Trade license, bank statement, TRN, invoices, application form | company_name_mismatch, trade_name_unmapped, trn_entity_mismatch |
| Is the bank evidence usable? | Account holder, IBAN, statement period, page sequence, transaction extraction | account_holder_unmatched, statement_stale, missing_statement_pages |
| Does income evidence support the claim? | Declared revenue, bank credits, salary certificate, invoices, settlement flows | declared_revenue_unmatched, salary_unmatched_to_statement, seller_unmatched_to_borrower |
| Can the extracted values be trusted? | PDF metadata, visual edits, page continuity, arithmetic checks, identifier formats | document_tampering_signal, invoice_total_inconsistent, metadata_modified_after_statement_period |
| Can the file be routed now? | Parser status, cross-document checks, fraud severity, lender policy | pre_screen.decision, review_reasons, next_steps |
What is a document verification API for fintech lenders?
A document verification API for fintech lenders checks the documents behind a loan application and returns structured evidence before underwriting. It extracts fields, validates document quality, compares entities across documents, screens for tampering, and gives the lending system a pre-screening result.
That matters because loan applications often fail before credit analysis begins. The applicant may upload an expired license. The bank statement account holder may differ from the borrowing company. The Emirates ID holder may be missing from the trade license or MOA. A salary certificate may show a number that never appears as salary credits in the bank statement.
The output should fit the loan origination system: pass clean applications to underwriting, reject clear document failures, and send uncertain cases to manual review with the exact reason attached.
Why use UAE as the concrete example?
Fintech lenders broadly share the same intake problem, but UAE lending is the best concrete example because the document set is specific: identity, company license, tax evidence, statements, invoices, and director or shareholder evidence.
UAE lending files also show the limit of generic OCR. A lender may need to read an Emirates ID, parse a trade license, verify a TRN, analyze bank statements, and check whether a person is connected to a company. The UAE Government points users to official services for checking business activities and licenses, and the UAE National Economic Register exposes license details held by government sources.
The document bundle for fintech lending
The API should treat the file as one application package. Each document contributes fields that must agree with other documents.

| Document or evidence | Fields to extract | Why it matters |
|---|---|---|
| Emirates ID | Name, ID number, nationality, date of birth, expiry, sponsor or employer where visible | Confirms the natural person behind the application and supports KYC checks. |
| Trade license | Company name, license number, legal form, activity, issuing authority, expiry, shareholders or managers if visible | Confirms the business identity and whether the company can operate in the stated activity. |
| MOA or shareholder document | Shareholders, manager, authorized signatory, ownership percentages | Links the individual applicant to the borrowing company. |
| Bank statements | Account holder, IBAN, statement period, balances, revenue credits, salary credits, loan repayments, returned payments | Supports income, revenue, and affordability checks before underwriting. |
| TRN or tax evidence | TRN, registered name, tax status where available | Helps compare tax identity against the company identity and invoices. |
| Invoices or sales evidence | Seller name, buyer name, TRN, invoice number, issue date, totals, payment terms | Supports revenue checks for SME or merchant lending. |
Parser outputs by document type
The parser for each document should produce three things: extracted fields, evidence coordinates, and a validation state. The evidence coordinates matter because a reviewer needs to see where the API found a name, date, amount, or license number. A plain text extraction without source locations is harder to audit.
| Document | Minimum structured output | Validation output | Common failure modes |
|---|---|---|---|
| Emirates ID | Full name, ID number, nationality, date of birth, expiry, card side, document number where visible | id_expired, name_low_confidence, id_number_invalid_format, front_back_mismatch | Blurry scan, cropped back side, glare over ID number, expired card, mixed Arabic and English name fields. |
| Passport | Full name, passport number, nationality, date of birth, issue date, expiry, MRZ fields | mrz_checksum_failed, passport_expired, name_mismatch_with_eid | Low-quality MRZ, cropped page, old passport used with new Emirates ID. |
| Trade license | Legal name, trade name, license number, authority, legal form, activity, issue date, expiry, manager or partner fields | license_expired, authority_unsupported, activity_mismatch, registry_unverified | Free-zone formats, scanned copies, missing pages, trade name used instead of legal name. |
| MOA or shareholder evidence | Shareholders, ownership percentages, manager, authorized signatory, company name, license number references | person_link_found, person_link_missing, ownership_low_confidence | Long PDF, mixed languages, scanned signatures, many amendments. |
| Bank statement | Account holder, bank name, IBAN or account number, statement period, opening and closing balance, transactions, salary or revenue credits | statement_stale, missing_pages, account_holder_unmatched, cashflow_parse_failed | Password-protected PDF, image-only export, missing pages, edited rows, unsupported bank layout. |
| Salary certificate | Employer, employee name, salary amount, issue date, signer, stamp or letterhead evidence | salary_unmatched_to_statement, certificate_stale, employer_mismatch | Template letters, handwritten edits, salary stated once with no bank-statement support. |
| TRN or tax evidence | TRN, registered name, country, tax status where available | trn_entity_mismatch, trn_format_invalid, trn_unverified | TRN copied from invoice, legal name variants, evidence without official lookup. |
| Invoice or sales evidence | Seller, buyer, TRN, invoice number, issue date, due date, line totals, VAT, total amount, payment terms | seller_unmatched, invoice_duplicate, invoice_total_inconsistent, future_invoice_date | Reused invoice numbers, edited totals, PDF generated from a spreadsheet, buyer unrelated to the application. |
The API should keep raw extraction and normalized extraction separate. Raw extraction preserves the text as seen on the document. Normalized extraction converts names, dates, amounts, currencies, and identifiers into a format that can be compared across the file.
How the pre-screening pipeline works
A fintech lender usually wants an answer in seconds. The fastest architecture treats the application as a bundle of independent jobs, then joins their outputs into one entity graph.
The orchestration usually follows this shape:
upload bundle
-> classify files
-> run document parsers and fraud checks in parallel
-> normalize entities and identifiers
-> build person/company/account/invoice graph
-> run cross-document checks
-> apply lender policy
-> return JSON or send webhook

Intake and classification
The API receives a bundle with an application_id, country hints, expected borrower details, and one or more files. The first job identifies each file: Emirates ID front, Emirates ID back, trade license, bank statement, invoice, MOA, passport, salary certificate, TRN evidence, or unknown document.
Classification should also detect duplicates. A lead may upload the same bank statement twice, submit a screenshot instead of a PDF, or attach an invoice where the trade license was expected. The API should return unexpected_document_type, duplicate_file, or missing_required_document before deeper checks waste time.
Extraction and normalization
Each parser runs independently after classification. Emirates ID extraction should wait only for the Emirates ID images. Bank-statement parsing should wait only for the statement files. Trade-license parsing should wait only for license files. File-level fraud checks can run at the same time because they use the uploaded file itself.
Normalization turns extracted text into comparable values. That includes:
- Arabic and English name variants.
- Dates converted to one format.
- Amounts converted to numeric values with currency.
- Emirates ID, passport, TRN, license, IBAN, and account numbers stripped of formatting noise.
- Company suffixes normalized, for example
LLC,L.L.C, andLimited Liability Company. - Trade names linked to legal names when both appear in the same document.
Generic OCR usually fails at this stage. OCR gives text. A lending pre-screen needs identities, roles, time periods, account ownership, and evidence that can be traced back to the page.
Entity graph
The entity graph is the working model of the application. It links every extracted person, company, account, tax number, invoice, and document.
For a UAE SME lending file, the graph may contain:
{
"people": [
{
"entity_id": "person_1",
"names": ["Ahmed Hassan", "AHMED HASSAN ALI"],
"source_documents": ["emirates_id_front", "passport"],
"roles": ["applicant"]
}
],
"companies": [
{
"entity_id": "company_1",
"names": ["Gulf Sample Trading LLC", "Gulf Sample Trading L.L.C"],
"trade_license_number": "1234567",
"source_documents": ["trade_license", "bank_statement"]
}
],
"accounts": [
{
"entity_id": "account_1",
"iban": "AE070331234567890123456",
"holder_name": "Gulf Sample Trading LLC",
"source_documents": ["bank_statement"]
}
]
}

Cross-document checks then run against this graph. The check engine should never compare raw strings alone. It should compare normalized entities with source evidence and confidence.
Policy layer
The policy layer converts evidence into routing. Lenders differ here. One lender may send person_not_linked_to_company to review. Another lender may reject it unless a power of attorney is present. A merchant-finance lender may tolerate a trade name mismatch if the bank account and license number agree.
Keep the policy layer separate from extraction. Extraction answers what the documents say. Policy answers what the lender does with that evidence.
Cross-document checks that catch bad leads early
Cross-document validation compares the same entity or claim across multiple files. It catches weak applications before an underwriter spends time on them.
A mismatch can have a valid explanation. Arabic and English names can be transliterated differently. Trade licenses may use a legal name while the application uses a trade name. A bank statement may belong to an operating account under a related entity. The API should flag the mismatch, show the evidence, and let lender policy decide the route.
| Check | Inputs | API flag | Usual next step |
|---|---|---|---|
| Person to company | Emirates ID, trade license, MOA, power of attorney | person_not_linked_to_company | Request MOA, POA, board resolution, or authorized signatory proof. |
| Person role | Application role, license roles, MOA roles | role_unverified | Ask whether the applicant is owner, manager, director, UBO, or agent. |
| Company legal name | Trade license, bank statement, TRN, invoices | company_name_mismatch | Check legal name, trade name, branch name, and account ownership evidence. |
| Trade name to legal name | License, invoices, application form | trade_name_unmapped | Request license page or registry evidence that links the names. |
| License status | Trade license, registry result, expiry date | license_expired or registry_unverified | Request renewed license or route to KYB review. |
| License activity | Trade license activity, declared business type, invoices | activity_mismatch | Route to policy review if the stated lending purpose conflicts with activity. |
| Bank account ownership | Bank statement, trade license, application company | account_holder_unmatched | Request account ownership proof or reject unsupported bank evidence. |
| Bank statement period | Statement dates, application date, lender freshness rule | statement_stale | Request fresh statements. |
| Statement completeness | Page numbers, period continuity, transaction sequence | missing_statement_pages | Request complete statement export. |
| Declared income | Application revenue, bank credits, invoices, salary certificate | declared_revenue_unmatched | Send discrepancy notes to underwriting. |
| Salary evidence | Salary certificate, bank statement credits, Emirates ID or passport name | salary_unmatched_to_statement | Request payroll proof or route to manual review. |
| TRN identity | TRN evidence, trade license, invoices | trn_entity_mismatch | Verify TRN and legal name before invoice-based lending. |
| Invoice seller | Invoice seller, trade license, TRN, bank account | seller_unmatched_to_borrower | Request contract, marketplace statement, or sales proof. |
| Duplicate invoices | Invoice number, seller, buyer, amount, date | duplicate_invoice | Remove duplicate revenue evidence or route to fraud review. |
| Date consistency | ID expiry, license expiry, statement period, invoice dates, application date | date_conflict | Request updated evidence or policy review. |
| Document integrity | Metadata, visual layer, page count, layout, semantic checks | document_tampering_signal | Route to fraud review before credit analysis. |
At this point, KYC, KYB, fraud detection, and income verification meet. One pre-screening layer makes the application file easier to trust.
Person-to-company check
The person-to-company check answers a simple question: can the person who submitted the application act for the company that wants credit?
The API should compare the Emirates ID or passport name against visible roles in the trade license, MOA, shareholder register, manager fields, authorized signatory proof, board resolution, or POA. The result should name the exact source fields used. A useful failure message says, for example, Emirates ID holder Ahmed Hassan was found in the application form but no matching manager, shareholder, or signatory role was extracted from the trade license or MOA.
Name matching needs tolerance. Arabic transliteration, initials, compound names, and word order can change across documents. The check should return matched, needs_review, or failed, with the matched strings and confidence attached.
Company-to-bank-account check
For SME lending, bank-account ownership is often the most useful early check. The bank statement may show a different legal entity, a personal account, a group company, a branch name, or a trading name.
The API should compare:
- Trade-license legal name.
- Trade-license trade name.
- Bank-statement account holder.
- IBAN or account number.
- Application company name.
- TRN registered name when available.
The output should distinguish a hard mismatch from a reviewable variant. Gulf Sample Trading LLC versus Gulf Sample Trading L.L.C is usually a normalization issue. Ahmed Hassan as a personal account holder for a company loan needs policy review or rejection depending on the lender.
License and registry checks
The license check should look at status, expiry, authority, activity, legal form, and entity identity. It should also preserve the issuing authority because UAE companies may be licensed through mainland or free-zone authorities.
Useful flags include license_expired, license_expiring_soon, unsupported_issuing_authority, activity_mismatch, legal_form_unsupported, and registry_unverified.
For lending, the activity field can matter. A company applying for merchant financing should have activity that supports the stated trade. A mismatch can be legitimate, but it gives the risk team a reason to ask for more evidence.
Income and cash-flow checks
Income evidence should connect the applicant's claim to bank-statement facts. For SME lending, that means revenue credits, recurring customer payments, settlement flows, returned payments, cash deposits, loan repayments, and average balances. For individual lending, it means salary credits, employer names, payroll patterns, and existing debt payments.
The API should avoid returning a single revenue number without context. Useful pre-screening output includes:
- Statement period covered.
- Total credits and debits.
- Revenue-like credits.
- Salary-like credits.
- Average daily or monthly balance.
- Existing loan repayments.
- Returned payments or failed debits.
- Large unusual credits.
- Cash deposit share.
- Counterparty concentration.
These fields give the underwriting team a cleaner starting point. They also support early rejection when the file is plainly weak, for example a six-month statement request where the applicant submitted only one month.
Invoice and TRN checks
Invoice evidence helps only when it ties back to the borrower. The API should compare the invoice seller to the trade license, TRN, bank account holder, and application company. It should also compare invoice totals to line items and VAT, then look for duplicate invoice numbers or repeated templates.
For UAE files, TRN evidence is useful when invoices drive the credit decision. A TRN mismatch between invoice and trade license should create trn_entity_mismatch, with the exact invoice and license fields attached.
Date and freshness checks
Date checks catch many low-quality leads. A valid-looking bundle can still fail because the bank statement is stale, the license expires before expected disbursement, the ID expired last month, or invoices are dated after the application.
Freshness rules should be configurable by lender. One lender may require bank statements from the last 30 days. Another may accept 60 days for repeat customers. The API should return both the raw dates and the policy result, so the lender can change the threshold without rebuilding the parser.
Check result statuses
Every cross-document check should use a small, stable status set. Free-text statuses make routing hard and break reporting.
| Status | Meaning | Example |
|---|---|---|
passed | The required evidence matched within policy thresholds. | Emirates ID holder appears as manager in the trade license. |
needs_review | The evidence is incomplete or ambiguous. | Bank account holder is a close trade-name variant, but no registry evidence links it. |
failed | The evidence conflicts with policy. | License expired before the application date. |
skipped | The check lacked required inputs. | MOA check skipped because no MOA was uploaded. |
unsupported | The document type, bank format, or issuing authority is outside the configured parser set. | Statement format from an unsupported bank. |
timeout | The check moved to async completion after the sync deadline. | Long bank statement still parsing after the synchronous response window. |
This status model keeps the LOS integration simple. Product can route by status and flag, while reviewers still see the evidence that produced the result.
Where document fraud detection fits
Fraud checks should run before extracted values are used in a lending decision. If a bank statement has edited balances, inserted transaction rows, or altered salary credits, the extracted cash-flow numbers may be technically correct but commercially unsafe.
For fintech lenders, document fraud often appears in small edits: a salary amount changed in a certificate, a removed statement page, a license expiry extended by a few months, or an invoice total replaced while the table still looks consistent.
The check should combine file and visual evidence. Metadata can show how a PDF was created or edited. Layout and font analysis can spot re-rendered text. Pixel analysis can find pasted fields or covered areas. Semantic checks can compare IBAN, TRN, dates, balances, and names against expected formats.
Paperwork's document fraud detection API runs these checks before a lending team trusts the extracted values. In a lending workflow, fraud detection belongs inside the document verification layer.
| Fraud signal | What the API checks | Why it matters for lending |
|---|---|---|
| PDF metadata conflict | Creator tool, modification time, incremental updates, object history | A statement generated by a bank portal should have a different file history from an edited PDF. |
| Visual splice | Text patches, inconsistent background, pasted fields, covered rows | Edited balances, dates, names, and salary amounts often leave visual artifacts. |
| Font and layout inconsistency | Font family, size, spacing, baseline, table alignment | Inserted transaction rows may use slightly different typography. |
| Page sequence issue | Page count, page numbers, statement period continuity | Missing pages can hide overdrafts, returned payments, or loan repayments. |
| Semantic inconsistency | Opening balance, closing balance, transaction totals, dates | Edited statements can fail arithmetic checks even when the page looks normal. |
| Identifier inconsistency | IBAN, account number, TRN, license number format | Fake or copied identifiers often fail format or cross-document checks. |
| Template reuse | Same invoice template, number pattern, buyer, amount, or PDF fingerprint | Reused invoices inflate revenue evidence. |
| Screenshot or print artifact | Low DPI, phone screenshot, cropped page, missing metadata | Some lenders may accept screenshots for intake, but fraud confidence should drop. |
Fraud output should be evidence-based. A result such as fraud_risk: high is hard to defend by itself. A better result says which document triggered the signal, which pages or fields were affected, which detector fired, and how severe the signal is.
Use two levels of fraud result:
- File-level result: the whole document has suspicious metadata, missing pages, or visual edits.
- Field-level result: a specific name, amount, date, transaction row, or license field carries the signal.
Field-level fraud is especially useful for lending. If a trade license looks clean but one invoice total has a visual splice, the lender can still use the license while routing the invoice evidence to review.
What the API response should return
A lending pre-screening response should separate extracted facts from decision logic. That makes the output useful to engineering, risk, and compliance teams.
The exact field names depend on the integration. The important design rule: the API returns evidence alongside any score.
The response should also preserve timing and dependency data. Engineering teams need to know which jobs finished, which jobs timed out, and which checks were skipped because a required document was missing. Risk teams need the same response to explain why an application was routed to review.
| Response object | Purpose | Example fields |
|---|---|---|
processing | Shows status and timing across the pipeline | status, started_at, completed_at, duration_ms, mode, webhook_sent |
documents | Lists every uploaded file and its parser result | document_id, type, status, quality, pages, fraud_risk |
entities | Holds normalized people, companies, accounts, TRNs, invoices | entity_id, names, source_documents, confidence |
extracted_fields | Preserves raw fields with coordinates | field, raw_value, normalized_value, page, bbox, confidence |
cross_document_checks | Gives match results and mismatch evidence | check, status, flag, evidence, source_fields |
fraud_checks | Reports file-level and field-level fraud signals | document_id, signal, severity, affected_fields |
pre_screen | Gives the route suggested by lender policy | decision, risk_level, review_reasons, next_steps |
{
"application_id": "loan_app_8391",
"status": "completed",
"processing": {
"mode": "sync_with_async_fallback",
"duration_ms": 4200,
"completed_jobs": [
"classify_documents",
"parse_emirates_id",
"parse_trade_license",
"parse_bank_statement",
"fraud_screening",
"cross_document_checks"
],
"skipped_jobs": []
},
"pre_screen": {
"decision": "needs_review",
"risk_level": "medium",
"review_reasons": [
"person_not_linked_to_company",
"bank_statement_holder_unmatched"
]
},
"entities": {
"company": {
"entity_id": "company_1",
"name": "Gulf Sample Trading LLC",
"trade_license_number": "1234567",
"issuing_authority": "Dubai Economy",
"license_expiry": "2026-09-30"
},
"people": [
{
"entity_id": "person_1",
"name": "Ahmed Hassan",
"source_documents": ["emirates_id_front", "emirates_id_back"],
"matched_roles": []
}
]
},
"documents": [
{
"type": "emirates_id",
"status": "parsed",
"quality": "usable",
"fraud_risk": "low"
},
{
"type": "trade_license",
"status": "parsed",
"quality": "usable",
"fraud_risk": "low"
},
{
"type": "bank_statement",
"status": "parsed",
"quality": "usable",
"fraud_risk": "medium"
}
],
"cross_document_checks": [
{
"check": "person_to_company",
"status": "failed",
"flag": "person_not_linked_to_company",
"evidence": "Emirates ID holder is absent from visible manager, shareholder, or signatory fields."
},
{
"check": "company_to_bank_account",
"status": "needs_review",
"flag": "company_name_mismatch",
"evidence": "Bank account holder differs from trade license legal name."
}
],
"fraud_checks": [
{
"document": "bank_statement",
"signal": "metadata_modified_after_statement_period",
"severity": "medium"
}
],
"next_steps": [
"Request MOA or authorized signatory document",
"Request bank account ownership evidence",
"Send bank statement to fraud review"
]
}
That response lets the lender route the application without waiting for an analyst to read every page. The underwriting team still owns the credit decision. The API answers a narrower question: whether the document file is coherent enough to underwrite.
The most useful response design has stable flags. A lender can wire license_expired to rejection, person_not_linked_to_company to manual review, and statement_stale to a document refresh request. The same flag should mean the same thing across applications.
Synchronous response vs webhook
For small bundles, a synchronous response can work well. The API can return completed after all parsers and cross-document checks finish.
For larger bundles, webhook delivery is cleaner. The first response can return accepted with an application_id, then later send a webhook with the completed pre-screen. A lender can still show the applicant progress while bank-statement parsing or deeper fraud checks finish.
Use idempotency keys for retries. Lending systems often retry uploads when mobile connections fail, and duplicate processing can create duplicate cases. An idempotency_key tied to the lender application ID prevents that.
Manual review vs automated pre-screening
Manual review works for a small number of applications. It breaks when the same analyst has to read IDs, trade licenses, statements, invoices, and fraud evidence at volume.

| Task | Manual review | Automated pre-screening |
|---|---|---|
| Field extraction | Analyst reads PDFs and rekeys values into a CRM or LOS. | API extracts names, IDs, dates, license fields, account data, and transaction fields. |
| Entity matching | Analyst compares names across documents by eye. | API normalizes names and returns matched or unmatched entities with evidence. |
| Fraud checks | Analyst relies on visual review unless a specialist tool is used. | API checks metadata, layout, fonts, pixels, semantic rules, and document consistency. |
| Routing | Escalation depends on reviewer judgment and notes. | Product can route by explicit flags such as license_expired or person_not_linked_to_company. |
| Audit trail | Evidence sits in case notes, file names, and messages. | Inputs, extracted fields, flags, and review reasons are stored as structured data. |
| Underwriter focus | Underwriter spends time proving the file is usable. | Underwriter starts from a cleaner file with known document risks. |
The better model is triage: clean files move forward, clear failures stop, and ambiguous files go to a reviewer with the exact mismatch already named.
The workflow inside a lending stack
The document verification API sits between lead intake and underwriting. It should run while the applicant is still in the funnel and still preserve enough evidence for later review.

The integration usually looks like this:
- The applicant uploads documents through the lender's app, web form, WhatsApp flow, or partner channel.
- The lender sends the files to the API with an application ID and optional hints such as country, document type, expected company name, or expected bank.
- OCR and parsers extract fields from each document.
- Entity matching links people, company names, license numbers, TRNs, bank accounts, invoices, and declared application fields.
- Fraud detection screens files before extracted values are trusted.
- Policy rules convert mismatches into routing decisions.
- The API returns JSON immediately or sends a webhook when deeper checks finish.
- The loan origination system sends the file to underwriting, rejection, or manual review.
Keep application IDs stable, raw evidence traceable, and fraud confidence separate from credit risk. A reviewer should be able to click from company_name_mismatch back to the exact field and source document.
Running checks in parallel
Speed comes from separating independent work from dependent work. A bank-statement parser can start before the trade-license parser finishes. Emirates ID OCR can start before invoice extraction. File-level fraud checks can begin as soon as each file lands in storage.
| Job | Can start after | Can run in parallel with | Blocks |
|---|---|---|---|
| File classification | Upload | Virus scan, file hashing, duplicate detection | Parser selection. |
| Emirates ID parsing | File classified as Emirates ID | Trade-license parsing, bank-statement parsing, file fraud checks | Person entity creation. |
| Trade-license parsing | File classified as trade license | Emirates ID parsing, bank-statement parsing, registry lookup | Company entity creation. |
| Bank-statement parsing | File classified as bank statement | ID parsing, license parsing, statement fraud checks | Cash-flow checks and account-owner checks. |
| Invoice parsing | File classified as invoice | TRN extraction, license parsing, invoice fraud checks | Invoice-to-company checks. |
| File fraud checks | File available | All document parsers | Fraud flags in final policy. |
| Entity normalization | At least one parser output | Other normalization jobs | Cross-document checks. |
| Cross-document checks | Required entities exist | Independent checks such as date freshness and duplicate invoice detection | Policy routing. |
| Policy routing | Checks complete or timeout reached | Webhook preparation, audit logging | Final response. |
The orchestrator should support partial results. If a bank statement takes longer because it has 50 pages, the API can still finish ID parsing, trade-license parsing, file fraud checks, and registry lookup. The final response should show which checks completed and which checks timed out or moved to async review.
Latency targets that matter
Exact latency depends on file size, document count, OCR mode, bank-statement length, and fraud-check depth. The useful target is product-level: the lender needs enough of an answer to route the lead while the applicant is still active.
A practical design has three timing bands:
| Timing band | What returns | Product use |
|---|---|---|
| Immediate, under a few seconds | Upload accepted, file types, missing documents, obvious duplicates | Tell the applicant what to fix before they leave the funnel. |
| Short synchronous result | Parsed identity, license fields, basic cross-document checks, clear fraud flags | Route clean files and obvious failures. |
| Async completion | Full bank-statement analysis, deeper fraud evidence, registry enrichment, long-document parsing | Update the LOS and notify reviewers with final evidence. |
This keeps the funnel fast while preserving deeper checks for the cases that need them.
What still belongs to underwriting?
Document verification prepares the file for underwriting.
In the UAE, CBUAE's Finance Companies Regulation gives a useful boundary for short-term credit. Article 23 caps total short-term credit by a restricted licence finance company or agent at the lower of AED 20,000 or three months of the borrower's verified net income. Article 24 requires credit information for short-term credit of AED 5,000 or more.
A document verification API can provide verified income evidence, bank statement extraction, fraud flags, and identity consistency. Credit appetite, pricing, exposure limits, bureau interpretation, and exception policy stay with the lender.
The split should be clear:
| Layer | Owned by | Output |
|---|---|---|
| Document extraction | API | Parsed fields and confidence. |
| Cross-document validation | API plus lender policy | Match results and mismatch reasons. |
| Fraud screening | API plus fraud team | File-level and field-level fraud signals. |
| Credit policy | Lender | Affordability, exposure, pricing, reject rules. |
| Underwriting | Lender | Final approve, decline, or conditional approval. |
| Compliance review | Lender | CDD, KYB, sanctions, recordkeeping, and audit response. |
That boundary keeps the API useful without turning it into a black-box credit decision.
How Paperwork handles the workflow
Emirates ID verification extracts identity fields from UAE ID documents. Business due diligence covers KYB checks such as trade license data, director checks, domain checks, and sanctions screening. Bank statement analysis turns statements into income, cash-flow, and transaction signals. Document fraud detection checks files for tampering before their values are trusted.
For a fintech lender, those checks should run as one intake workflow: upload the application bundle, parse identity and company evidence, compare people and companies across the file, flag document fraud, and return JSON that the loan origination system can route.
Paperwork is the document-risk layer that sits before underwriting.
Related reading: the KYC automation guide covers identity controls, the bank statement red flags guide covers lending transaction patterns, and the document fraud guide covers file-level fraud signals.
Frequently asked questions
What is cross-document validation?
Cross-document validation checks whether the same person, company, account, tax number, date, or amount is consistent across submitted documents. For a fintech lender, it compares Emirates ID data against trade license roles, bank statement account holders against company names, and invoice sellers against the borrower.
Is this KYC, KYB, or fraud detection?
At intake, the workflow combines all three. KYC identifies the person, KYB verifies the company, and fraud detection checks whether submitted files can be trusted. The risk often sits between documents: the ID, license, bank account, tax number, and invoice have to agree.
Does a document verification API make the credit decision?
A document verification API should pre-screen the file. It can tell the lender whether documents are complete, parseable, internally consistent, and free of obvious fraud signals. The lender still owns affordability, credit policy, bureau interpretation, pricing, and final approval.
Which UAE documents should fintech lenders verify first?
Start with Emirates ID, trade license, bank statements, and proof that the applicant can act for the company. For SME lending, add MOA or shareholder evidence, invoices, TRN evidence, and bank account ownership proof when needed.
Can this workflow work outside the UAE?
Yes. The pattern works across the GCC and other markets, but the connectors change by country. A lender needs local IDs, company registries, tax identifiers, statement formats, credit-data sources, and screening rules.
How fast should the pre-screen return?
The first routing result should return while the applicant is still active in the funnel. A practical setup returns file classification and missing-document checks first, then parsed identity and company checks, then deeper bank-statement and fraud evidence through the same response or a webhook.
What happens when a required document is missing?
The API should return missing_required_document with the expected document type and the checks that were skipped. The lender can then ask the applicant for the exact missing item instead of sending a generic rejection or sending the file to an analyst.
How should a lender configure policy rules?
Start with routing rules first. Decide which flags stop an application, which flags request new documents, and which flags go to manual review. Keep those rules outside the parser so risk teams can change thresholds without changing extraction code.
When should an application go to manual review?
Manual review should handle mismatches that may have a valid explanation: name transliteration, trade name versus legal name, operating account versus licensed entity, missing MOA, unsupported bank format, low OCR confidence, or medium fraud signals. Clear failures can stop earlier depending on lender policy.
Sources
- CBUAE Guidance for Licensed Financial Institutions on Customer Due Diligence, Know Your Customer, and Record-Keeping
- CBUAE Finance Companies Regulation
- CBUAE Article 23 on short-term credit limits
- CBUAE Article 24 on credit reports
- UAE Government service page for verifying business licences
- UAE National Economic Register
- UAE PASS
- Federal Tax Authority TRN verification
- Federal Tax Authority glossary for TRN
- FATF guidance on beneficial ownership of legal persons
Paperwork verifies UAE identity, business, bank-statement, and fraud evidence through API workflows for fintech and lending teams. See the API docs or try the demo.
If you want to learn more, you can try the demo or read our tool documentation.