# Individual Document Verification

Individual Document Verification lets you verify the identity documents stored against an Entity in BNDRY. BNDRY checks the structured document data — document number, expiry date, issuing authority, and other typed fields — against authoritative government sources, returning a result you can use to drive compliance decisions.

## What You Can Do

- Verify government-issued identity documents stored against an individual Entity
- Trigger verification programmatically via the API or automatically through Policies
- Track verification results as Activity Logs on the Entity profile
- Verify Passports, Driver's Licences, Birth Certificates, Medicare Cards (AU), and Visas


## How It Works

The job checks the structured fields of a stored [Document](/docs/core-concepts/documents) against authoritative records. The process is asynchronous — you create a job, run it, then poll for the result.

1. **Store a Document** against the Entity with the relevant identity fields (e.g., document number, date of birth, expiry date).
2. **Create an ID Verification Job** — a named, reusable job configuration.
3. **Run the job**, specifying the Entity and the document type to verify.
4. **Poll for the result** using the operation ID returned from the run.


## Prerequisites

Before running an ID Verification job:

- The Entity must exist in BNDRY as an individual entity.
- The Entity must have a Document of the relevant type stored against it, with all required fields populated.


Storing Documents first
Documents can be created via the BNDRY UI or [Documents API](/docs/core-concepts/documents). The `idType` you supply when running a verification job must match a Document type stored against the entity — for example, if you pass `PASSPORT`, the entity must have a Passport Document with all required fields.

## Using the API

Why 'Job' in the API?
You'll notice we use "verification" when describing the product capability, but "job" appears in API resource names like `IndividualEntityIDVerificationJob`. This follows Google's API design standards for long-running operations ([AIP-152](https://google.aip.dev/152)), ensuring reliable and predictable behaviour for asynchronous workflows.

### Step 1: Create an ID Verification Job

Create a job by `POST`ing to `/v1alpha/individualEntityIDVerificationJobs`. You must supply a unique `individualEntityIdVerificationJobId` — this becomes the final component of the job's resource name and must be 4–63 lowercase alphanumeric characters or hyphens.

```shell curl
curl -i -X POST \
  'https://api.bndry.app/v1alpha/individualEntityIDVerificationJobs?individualEntityIdVerificationJobId=individual-entity-id-verification-job-001' \
  -H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "individualEntityIDVerificationJobs/individual-entity-id-verification-job-2024-0127-743891",
    "createTime": "2023-01-15T01:30:15.01Z",
    "updateTime": "2023-01-15T01:30:15.01Z"
  }'
```

BNDRY returns the created job resource:

```json
{
  "name": "individualEntityIDVerificationJobs/id-verification-job-001",
  "createTime": "2024-01-27T10:00:00Z",
  "updateTime": "2024-01-27T10:00:00Z"
}
```

### Step 2: Run the Job

Run the job with a `POST` to `/v1alpha/individualEntityIDVerificationJobs/{job}:run`, specifying the entity to verify and the document type to check. The `idType` must match a Document type stored against the entity.

What if multiple documents exist for the specified type?
The most recently updated document of the specified type will be used for the verification.

```shell curl
curl -i -X POST \
  https://api.bndry.app/v1alpha/individualEntityIDVerificationJobs/id-verification-job-001:run \
  -H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
  -H 'Content-Type: application/json' \
  -d '{
    "entityResourceName": "entities/acme-corp-001",
    "idType": "PASSPORT"
  }'
```

BNDRY returns a reference to the long-running operation. The job runs asynchronously, so `done` will initially be `false`.

```json
{
  "name": "individualEntityIDVerificationJobs/id-verification-job-001/operations/4f61bfab-def3-426f-9c1f-77032c8eb551",
  "metadata": {
    "@type": "type.googleapis.com/bndry.api.risk.entities.v1alpha.RunIndividualEntityIDVerificationJobMetadata"
  },
  "done": false
}
```

### Step 3: Poll for the Result

Use the operation name returned in Step 2 to poll for the verification result. When verification is complete, `done` is `true`.

```shell curl
curl -i -X GET \
  https://api.bndry.app/v1alpha/individualEntityIDVerificationJobs/id-verification-job-001/operations/4f61bfab-def3-426f-9c1f-77032c8eb551 \
  -H 'Authorization: Bearer <YOUR_TOKEN_HERE>'
```

```json
{
  "name": "individualEntityIDVerificationJobs/id-verification-job-001/operations/4f61bfab-def3-426f-9c1f-77032c8eb551",
  "metadata": {
    "@type": "type.googleapis.com/bndry.api.risk.entities.v1alpha.RunIndividualEntityIDVerificationJobMetadata"
  },
  "done": true
}
```

## Managing Jobs

### Retrieve a Job

Retrieve the details of an existing job by its resource name.

```shell curl
curl -i -X GET \
  https://api.bndry.app/v1alpha/individualEntityIDVerificationJobs/id-verification-job-001 \
  -H 'Authorization: Bearer <YOUR_TOKEN_HERE>'
```

### List Jobs

List all ID Verification jobs. Results are paginated — use `pageSize` (max 100) and `pageToken` to page through results.

```shell curl
curl -i -X GET \
  'https://api.bndry.app/v1alpha/individualEntityIDVerificationJobs?pageSize=25&pageToken=ChAIAhABGAEiAggC&skip=0' \
  -H 'Authorization: Bearer <YOUR_TOKEN_HERE>'
```

## API Reference

| Operation | Endpoint |
|  --- | --- |
| [Create an ID Verification Job](/apis/openapi/individual-id-document-verification/individualentityidverificationjobservice_createindividualentityidverificationjob) | `POST /v1alpha/individualEntityIDVerificationJobs` |
| [Run an ID Verification Job](/apis/openapi/individual-id-document-verification/individualentityidverificationjobservice_runindividualentityidverificationjob) | `POST /v1alpha/individualEntityIDVerificationJobs/{job}:run` |
| [Get Operation](/apis/openapi/individual-id-document-verification/individualentityidverificationjobservice_getoperation) | `GET /v1alpha/individualEntityIDVerificationJobs/{job}/operations/{operation}` |
| [Retrieve a Job](/apis/openapi/individual-id-document-verification/individualentityidverificationjobservice_getindividualentityidverificationjob) | `GET /v1alpha/individualEntityIDVerificationJobs/{job}` |
| [List Jobs](/apis/openapi/individual-id-document-verification/individualentityidverificationjobservice_listindividualentityidverificationjobs) | `GET /v1alpha/individualEntityIDVerificationJobs` |