---
title: "Upload FHIR bundle to pre-signed URL"
method: PUT
path: "/fhir-push/upload"
tags: ["/api/v1/fhir-push"]
---

# Upload FHIR bundle to pre-signed URL

`PUT /fhir-push/upload`

## Request

- Base URL: `https://sdp.suki.ai`
- URL: `https://sdp.suki.ai/fhir-push/upload`
- Auth: none required

Upload your FHIR bundle JSON directly to the pre-signed URL obtained from GET /api/v1/fhir-push/upload-url. This is Step 2 of the CKG Data Ingestion workflow. The upload URL is a Google Cloud Storage pre-signed URL that expires after 15 minutes. Use HTTP PUT with the required headers to upload your FHIR bundle (max 500 MB). A 200 OK response confirms the upload was accepted. Any 4xx response indicates an issue such as an expired URL, invalid headers, or file size violation.

## Query parameters

- `upload_url` string, required

## Request body

- object: FHIR Bundle resource containing Patient, Encounter, Practitioner, and other clinical resources.

## Response `200`

Upload successful. The FHIR bundle has been accepted and will be processed. Continue to Step 3 to poll ingestion status using the transaction_id from Step 1.

## Other responses

- `400`: Bad Request. Common causes: missing required headers (Content-Type or x-goog-content-length-range), file exceeds 500 MB size limit, or invalid JSON.
- `403`: Forbidden. The upload URL has expired (15 minutes from creation). Request a new upload URL via GET /api/v1/fhir-push/upload-url and retry.
- `404`: Not found. The upload URL or target resource was not found.
- `410`: Gone. The upload URL is no longer valid. Request a new URL and retry.

## Changes

- **2026-11-03** `2181be71d4dd`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/suki/apis/suki-developer-platform/changes/fhir-push/upload/put.md)

---

[API](https://skmtc.dev/suki/apis/suki-developer-platform.md) - [All operations](https://skmtc.dev/suki/apis/suki-developer-platform/llms.txt) - [OpenAPI document](https://skmtc.dev/suki/apis/suki-developer-platform/revisions/2181be71d4dd?raw)
