Skip to main content
PUT
cURL
After requesting an upload URL via Request upload URL API, use HTTP PUT to upload your FHIR bundle directly to the pre-signed URL.
This is Step 2 of the CKG data ingestion workflow. Complete Step 1 first to obtain the upload URL.

FHIR bundle requirements

Your bundle must satisfy the following requirements:
If the upload URL expires before you upload, request a new URL via Request upload URL API.

Best practices for summary generation

For optimal summary generation keep the following in mind:
  • Include key identifiers - Include consistent patient, encounter, and practitioner identifiers in your FHIR resources so they match the fhir_encounter_id and fhir_practitioner_id values you use later.
  • Use correlation IDs - Supply meaningful correlation_id values to track related uploads.
Suki maps generation and retrieval requests to the data ingested through CKG using the encounter and practitioner identifiers you provide.

Troubleshooting

If you see a 403 Forbidden or 410 Gone error, the upload URL has expired (15 minutes). Request a new URL via Step 1 and retry the upload.
If you see a 400 Bad Request mentioning size, your bundle exceeds 500 MB. Options:
  • Split the bundle into multiple smaller bundles.
  • Remove unnecessary resources.
  • Use separate uploads for each encounter or date range.
Ensure your FHIR bundle is valid JSON before uploading. Use a JSON validator or linter to check syntax.
After a successful upload (200 OK response), proceed to Step 3:

Query Parameters

upload_url
string
required

The complete pre-signed upload URL returned from GET /api/v1/fhir-push/upload-url. This is a Google Cloud Storage URL, not a Suki API endpoint.

Example:

"https://storage.googleapis.com/suki-fhir-push/..."

Body

application/json

Your FHIR bundle as raw JSON (not form-encoded, not base64-encoded).

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

Response

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.

The response is of type string.

Example:

""

Last modified on August 7, 2026