# Document Capture

The Document Capture module captures a supplementary document, such as a proof of address document, medical document, or bank statement. Users can upload a file or take a photo of the document with their device’s camera. For some document types, the server performs [OCR](https://developer.incode.com/docs/glossary#ocr) and returns the extracted data.

For an overview of this module and how it works, see [Document Capture](https://developer.incode.com/docs/document-capture).

How you use this module depends on your integration pattern. When the app defines the steps in code, you add the module to an `IncdOnboardingFlowConfiguration` as shown below; when the flow is defined in Dashboard, you reference it and let the back end drive the steps. See [Integration Approaches](https://developer.incode.com/docs/ios-flow-configuration).

**Availability:** All variants.

**UI:** v1 and v2

## Add Document Capture

Add the module with `addDocumentScan()`.

```swift
flowConfig.addDocumentScan(
    showTutorials: true,
    showDocumentProviderOptions: true,
    documentType: .addressStatement,
    showRetakeScreen: true,
    isSkippable: false,
    documentSources: [.camera, .photoUpload, .fileUpload]
)
```

## Configuration Options

Configure the module with `addDocumentScan()`.

| Option                        | Type                   | Description                                                                                                                                                                                                                                   |
| ----------------------------- | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `documentType`                | `DocumentType`         | Sets the type of document the module looks for: for example, `.addressStatement`, `.paymentProof`, `.medicalDoc`, `.creditCard`, or `.otherDocument1`…`.otherDocument3`.                                                                      |
| `documentSources`             | `Set<DocumentSource>?` | Specifies the upload method for the document: `.camera`, `.photoUpload`, or `.fileUpload`. `.fileUpload` is only for PDF-capable types. `supportPDF` is `false` for `.medicalDoc` and `.creditCard`. See [Document Upload](#document-upload). |
| `showTutorials`               | `Bool?`                | Shows tutorials on how to capture the document.                                                                                                                                                                                               |
| `showRetakeScreen`            | `Bool?`                | Offers a retake screen after manual capture. Default: `true`.                                                                                                                                                                                 |
| `isSkippable`                 | `Bool`                 | Allows skipping. Default: `false`.                                                                                                                                                                                                            |
| `showDocumentProviderOptions` | `Bool?`                | Allows the user to choose between using the camera to scan the document and uploading its file. UI v1 only. Default: `true`.                                                                                                                  |

## Result

```swift
func onDocumentScanCompleted(_ result: DocumentScanResult)
```

`DocumentScanResult` fields:

- `documentImage: UIImage?`
- `data: Data?`
- `mimeType: String?`
- `documentType: DocumentType`
- `insuranceCardData: OmniGetMedicalOCRDataResponse?`
- `addressFieldsFromPoa: OCRDataAddress?`
- `error: DocumentScanError?`

OCR data maps to the field that matches the captured `documentType`:

- `addressFieldsFromPoa` is populated for `.addressStatement`.
- `insuranceCardData` is populated for medical and insurance-card captures.
- Fields that do not apply to the captured type are `nil`.

## Errors

`DocumentScanError` cases:

- `error`
- `permissionsDenied`
- `uploadError`
- `invalidConfiguration`

## Document Upload

Document Upload is **not a standalone module** on iOS. It is enabled as part of Document Capture.

ID documents have their own upload path: `addIdScan(..., digitalIdsUpload: true)` lets users upload an existing digital ID (PDF). See [ID Capture](https://developer.incode.com/docs/module-id-scan).

**Availability:** All variants (same as Document Capture).

**UI:** v1 and v2.

### Add Document Upload

Enable Document Upload by including upload sources in the `documentSources` set.

```swift
flowConfig.addDocumentScan(
    documentType: .addressStatement,
    documentSources: [.photoUpload, .fileUpload]  // omit .camera to make it upload-only
)
```

- `.camera`: Enable the user to capture an image of the document.
- `.photoUpload`: Enable the user to pick an image from the photo library.
- `.fileUpload`: Enable the user to pick a PDF file. This is only available for document types that support PDFs.

Combine `.photoUpload`, `.fileUpload`, or both with `.camera` to offer both live capture and upload.

### Result

The result is delivered through the same `onDocumentScanCompleted(_:)` callback and `DocumentScanResult` as Document Capture.

<br />
