> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bluumfinance.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Verify Identity

> Submit KYC documents and track approval before funding.

The investor is created but must pass identity verification (KYC) before it can fund or trade. Submit a government-issued ID and track it to approval.

You need the `INVESTOR_ID` from [Create an investor](/get-started/journey/create-investor).

## Upload a KYC document

`POST /v1/documents` is a `multipart/form-data` request. Set `account_id` to the investor's ID so the document is owned by that investor, and set `purpose` to `KYC`.

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "$BASE_URL/documents" \
    -H "Authorization: Basic $AUTH" \
    -F "account_id=$INVESTOR_ID" \
    -F "purpose=KYC" \
    -F "document_type=drivers_license" \
    -F "file=@/path/to/drivers-license.jpg"
  ```

  ```javascript Node.js theme={null}
  import { readFile } from "node:fs/promises";

  const form = new FormData();
  form.append("account_id", INVESTOR_ID);
  form.append("purpose", "KYC");
  form.append("document_type", "drivers_license");
  form.append(
    "file",
    new Blob([await readFile("/path/to/drivers-license.jpg")]),
    "drivers-license.jpg",
  );

  const res = await fetch(`${BASE_URL}/documents`, {
    method: "POST",
    headers: { Authorization: `Basic ${auth}` },
    body: form,
  });

  const doc = await res.json();
  console.log(doc.id); // doc_...
  ```

  ```python Python theme={null}
  res = requests.post(
      f"{BASE_URL}/documents",
      headers={"Authorization": f"Basic {auth}"},
      data={"account_id": INVESTOR_ID, "purpose": "KYC", "document_type": "drivers_license"},
      files={"file": open("/path/to/drivers-license.jpg", "rb")},
  )

  doc = res.json()
  doc_id = doc["id"]  # doc_...
  ```
</CodeGroup>

### Response

```json theme={null}
{
  "id": "doc_a1b2c3d4e5f6g7h8",
  "object": "document",
  "owner_type": "INVESTOR",
  "owner_id": "inv_01j9x8m2k7qpzwv3t5r6y8n0ab",
  "purpose": "KYC",
  "document_type": "drivers_license",
  "status": "processing",
  "created_at": "2026-07-01T10:35:00Z"
}
```

Store the document ID:

```bash theme={null}
DOCUMENT_ID="doc_a1b2c3d4e5f6g7h8"
```

<Note>
  Omit `account_id` to attach a document to the tenant instead of an investor. Accepted `purpose` values: `KYC`, `KYB`, `EDD`, `TAX`, `FUNDING_VERIFICATION`, `AGREEMENT`, `OTHER`.
</Note>

## Track approval

Poll the document until verification resolves:

```bash theme={null}
curl -X GET "$BASE_URL/documents/$DOCUMENT_ID" \
  -H "Authorization: Basic $AUTH"
```

<Tip>
  In sandbox, KYC is auto-approved within seconds. In production, verification runs against real identity providers — subscribe to KYC webhooks (see [Webhooks](/get-started/journey/webhooks)) and react to events instead of polling.
</Tip>

Once verification passes, the investor advances to an active state and can be funded. For verification states, provider behavior, and document requests, see [Compliance & KYC](/concepts/compliance-kyc).

<Tip>
  Next → [Fund the wallet](/get-started/journey/fund-wallet).
</Tip>
