---
title: "Upload a new supporting document for a practitioner"
method: POST
path: "/practitioners/{id}/supporting-documents"
tags: ["Practitioner"]
---

# Upload a new supporting document for a practitioner

`POST /practitioners/{id}/supporting-documents`

Uploads and creates a new supporting document for the specified practitioner using a `multipart/form-data` request. Use this when attaching a new document, such as a license, certification, or credential, to a practitioner record for the first time; to update or delete an existing document, use `PUT /practitioners/{id}/supporting-documents` instead. `{id}` is the `certifyPractitionerId`. The request must be `multipart/form-data` with the following fields: `file` (required, the document binary), `fileType` (the document category), `state` (optional), and `expirationDate` (optional). `fileType` is a free-text string with no allowlist enforced. The file is stored in Google Cloud Storage, in a bucket configured per environment.

## Path parameters

- `id` string, required

## Headers

- `tenant-id` string

## Response `201`

The created supporting document.

- PractitionerResponse
  - `certifyId` string
  - `crosswalkId` string
  - `sourceId` string
  - `sourceUrl` string
  - `sourceType` string
  - `sourceName` string
  - `sourceDescription` string
  - `data` JsonNode
    - `empty` boolean
    - `valueNode` boolean
    - `containerNode` boolean
    - `missingNode` boolean
    - `array` boolean
    - `object` boolean
    - `nodeType` 'ARRAY' | 'BINARY' | 'BOOLEAN' | 'MISSING' | 'NULL' | 'NUMBER' | 'OBJECT' | 'POJO' | 'STRING'
    - `pojo` boolean
    - `number` boolean
    - `integralNumber` boolean
    - `floatingPointNumber` boolean
    - `short` boolean
    - `int` boolean
    - `long` boolean
    - `float` boolean
    - `double` boolean
    - `bigDecimal` boolean
    - `bigInteger` boolean
    - `textual` boolean
    - `boolean` boolean
    - `null` boolean
    - `binary` boolean
  - `survivorId` string
  - `tenantPractitionerId` string

## Other responses

- `400` — Bad request - Invalid input, e.g., file is missing
- `401` — Unauthorized - Authentication required
- `403` — Forbidden - Insufficient permissions
- `500` — Internal server error

---

[API](https://skmtc.net/certifyos/apis/certify-api-layer.md) · [All operations](https://skmtc.net/certifyos/apis/certify-api-layer/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/certifyos/certify-api-layer/revisions/563848e0ecc0/schema)
