Required Documents
Returns the documents needed to support a loan application, resolved against the scenario you submitted to a serviceability check. Pass the preSubmissionRequestUid from a completed serviceability check: Slate resolves the requirements against that exact declared scenario, so the broker collects only the evidence the application actually needs. Once you have the list, upload each file against the same preSubmissionRequestUid.
The list is filtered to the declared data. A document appears only when the scenario contains the fact it evidences: declare a credit card liability and credit_card_statement is returned. Self-employed evidence (notice_of_assessment, business_financial_returns) is absent from the example below because that scenario declared no self-employed income.
Request
GET https://api.slateos.ai/api/v1/pre-submission/{preSubmissionRequestUid}/required-documents
Authorization: Bearer <token>
preSubmissionRequestUid is the psr_-prefixed identifier returned by a completed serviceability check.
The recommended pattern is to call this endpoint on page load, when the broker reaches the document-upload step for a resolved scenario, so the upload UI opens pre-populated with exactly the evidence this scenario needs. Calling it then (rather than on file drop) lets the broker see the full checklist up front. Target integration pattern, confirm before go-live.
Response
The example below is resolved against a scenario that declared PAYG base income, a credit-card liability, and an owner-occupied purchase, so those facts each pull in their evidence.
{
"preSubmissionRequestUid": "psr_01ARZ3NDEKTSV4RRFFQ69G5DOC",
"productCode": "OHDBOO",
"requiredDocuments": [
{
"type": "payslip",
"label": "Payslip",
"count": 2,
"triggeredBy": { "source": "income", "detail": "PAYG base income" },
"maxAgeDays": 60,
"reason": "Verify PAYG base income (two consecutive payslips)"
},
{
"type": "credit_card_statement",
"label": "Credit Card Statement",
"count": 1,
"triggeredBy": { "source": "liability", "detail": "Credit card ($15,000 limit)" },
"maxAgeDays": 45,
"reason": "Verify the declared credit card liability"
},
{
"type": "bank_statement",
"label": "Bank Statement",
"count": 3,
"triggeredBy": { "source": "baseline", "detail": "Every application" },
"maxAgeDays": null,
"reason": "Confirm savings and funds to complete (three months)"
},
{
"type": "property_contract_of_sale",
"label": "Property Contract of Sale",
"count": 1,
"triggeredBy": { "source": "loan", "detail": "Owner-occupied purchase" },
"maxAgeDays": null,
"reason": "Evidence of the property being purchased"
}
]
}
Requirements come from the lender's credit policy, resolved against the declared scenario.
preSubmissionRequestUid: echo of the serviceability call the documents were resolved against.productCode: the product the scenario routed to (theselectedProductCodeon the serviceability response).requiredDocuments[]: documents needed to support this scenario.type: Slate document-type code, for examplepayslip,notice_of_assessment,bank_statement,property_contract_of_sale.label: human-readable name.count: how many to provide.triggeredBy: the declared fact that produced this requirement.source: where the fact came from. One ofincome,liability,loan,baseline.baselineapplies to every application regardless of the declared specifics (for example bank statements).detail: human-readable description of the specific declared fact, for examplePAYG base incomeorCredit card ($15,000 limit).
maxAgeDays: maximum age in days at submission, or null when the requirement is anchored to a financial year rather than a day count.reason: what the document evidences.
Upload the documents
Upload each file directly to Slate against the same preSubmissionRequestUid, in a single request: POST the file as multipart/form-data with its document type. Documents uploaded against the preSubmissionRequestUid are carried into the application when you submit. The carry-over keys on that unique psr_ uid, passed in the X-PreSubmission-Ref header rather than the non-unique X-Partner-Scenario-Reference.
Use the type values returned above (for example payslip, bank_statement). Any recognised Slate document-type code is accepted, not only the types this scenario returned.
Upload a file
Send the file bytes and the document type as multipart form fields. The filename and Content-Type are taken from the file part.
POST https://api.slateos.ai/api/v1/pre-submission/{preSubmissionRequestUid}/documents
Authorization: Bearer <token>
Content-Type: multipart/form-data
curl -X POST \
https://api.slateos.ai/api/v1/pre-submission/psr_01ARZ3NDEKTSV4RRFFQ69G5DOC/documents \
-H "Authorization: Bearer <token>" \
-F "type=payslip" \
-F "file=@payslip-2026-05.pdf;type=application/pdf"
Slate stores the file and returns the document record, already Uploaded and counted as evidence.
{
"documentUid": "doc_01K1D3R6G2XNKDWA62G0BCJ4JN",
"type": "payslip",
"filename": "payslip-2026-05.pdf",
"contentType": "application/pdf",
"status": "Uploaded",
"sizeBytes": 248173,
"uploadedAt": "2026-06-25T04:03:00Z"
}
status is one of:
| Status | Meaning |
|---|---|
Uploaded | Stored; counted as scenario evidence. |
Failed | Stored but rejected by a later check. |
If a document shows Failed, upload the file again for the same type; a failed documentUid is not reused.
Track what's outstanding
List everything uploaded against the scenario, with a per-type tally of what is still missing, to check the evidence is complete before lodging.
GET https://api.slateos.ai/api/v1/pre-submission/{preSubmissionRequestUid}/documents
Authorization: Bearer <token>
{
"preSubmissionRequestUid": "psr_01ARZ3NDEKTSV4RRFFQ69G5DOC",
"documents": [
{
"documentUid": "doc_01K1D3R6G2XNKDWA62G0BCJ4JN",
"type": "payslip",
"filename": "payslip-2026-05.pdf",
"contentType": "application/pdf",
"status": "Uploaded",
"sizeBytes": 248173,
"uploadedAt": "2026-06-25T04:03:00Z"
}
],
"outstanding": [
{ "type": "payslip", "required": 2, "uploaded": 1 },
{ "type": "credit_card_statement", "required": 1, "uploaded": 0 },
{ "type": "bank_statement", "required": 3, "uploaded": 0 },
{ "type": "property_contract_of_sale", "required": 1, "uploaded": 0 }
]
}
documents[]: every document uploaded so far.outstanding[]: required types with uploads still to come.requiredis the type'scountfrom the required-documents list;uploadedcounts stored files. Empty once every requirement is met.
File constraints
- Accepted types: PDF, JPEG, PNG, and TIFF (
application/pdf,image/jpeg,image/png,image/tiff). - Maximum size: 20 MB per file.
A file outside these constraints is rejected on upload: unsupported_content_type for the MIME type, file_too_large for the size. See the Error Reference.
Errors
A 404 is returned for an unknown or expired preSubmissionRequestUid, or one that references a rejected serviceability call (which routed no product). Required documents are available only for a completed serviceability result. Upload errors (unknown document type, unsupported content type, an oversized file) are listed under Document codes. See the Error Reference.