---
title: "Bulk upload supporting documents to multiple practitioners"
method: POST
path: "/practitioners/supporting-documents/bulk"
tags: ["Practitioner"]
---

# Bulk upload supporting documents to multiple practitioners

`POST /practitioners/supporting-documents/bulk`

Uploads one or more files exactly once each and links them as shared supporting-document attachments (source: "Bulk") to every selected practitioner. Practitioners may be selected explicitly via certifyPractitionerIds (JSON string form field), or via isSelectAll=true plus a filter JSON string (same encoding as GET /practitioners). When isSelectAll is true, certifyPractitionerIds is ignored; when false, filter is ignored. Target set size is capped (default 1000; see api-layer.practitioner.bulk-document-upload.max-practitioners). HTTP 200 is returned for both full and partial success: per-file and per-practitioner outcomes are reported independently in the response body. When the feature kill switch is off, the endpoint returns 404 with an empty body (CP-32986).

## Headers

- `tenant-id` string, required

## Response `200`

Bulk upload processed (full or partial success); see body for per-file and per-practitioner outcomes

- BulkSupportingDocumentUploadResponse — Aggregated result of a bulk practitioner supporting-document upload
  - `batchId` string — Unique identifier for this bulk upload batch
  - `files` BulkUploadFileResult1[] — Per-file upload outcome, one entry per submitted file
    - `originalFileName` string — Original file name as submitted
    - `fileUrl` string — GCS path of the uploaded file; present only when status is success
    - `status` 'success' | 'failed' — Upload status
    - `error` string — Failure reason; present only when status is failed
  - `linkResults` BulkUploadLinkResults1 — Aggregated outcome of linking uploaded files to target practitioners
    - `totalPractitioners` integer — Total number of practitioners targeted by this batch
    - `successCount` integer — Number of practitioners successfully linked to the uploaded files
    - `failureCount` integer — Number of practitioners that failed to link
    - `failed` BulkUploadFailedLink1[] — Details for each practitioner that failed to link
      - `certifyPractitionerId` string — Certify practitioner ID that failed to link
      - `error` string — Failure reason

## Other responses

- `400` — Bad request - missing files/fileType, invalid certifyPractitionerIds/filter JSON, no practitioners resolved, or too many practitioners targeted. Body shape is {"error": "<message>"}.
- `401` — Unauthorized - Authentication required
- `403` — Forbidden - Insufficient permissions
- `404` — Not Found - bulk supporting-document upload is disabled for this environment (empty body)
- `500` — Internal server error. Body shape is {"error": "<message>"}.

---

[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)
