Quick Start Guide
Transform unstructured healthcare records into clean, FHIR-ready data in minutes with nHance.
This guide walks you through uploading, converting, and downloading your data, along with a quick integration example using the Curiflow’s Python SDK.
Overview
nHance is the first true clinical document intelligence API purpose built for healthcare operations. It extracts key information about the patient, visits, encounters and providers which can enable rapid automation and time to market for our partners. It’s a smart OCR bundled into an API which generates a comprehensive JSON with all the key clinical information distilled from the document
With the sheer amount of information nHance is able to automatically detect and extract from clinical records, it can be used to power downstream workflows like, but not limited to, payment integrity, SDOH, HEDIS, Risk Adjustment, Prior Auth, claims verification, eligibility and referral management. It can also form an integral part of lot of agentic workflows which require trusted information
Upload
- Sign in to your nHance account with your organization email address.
- Upload a document from your system.
- Supported formats: PDF, C-CDA, CSV and eFax.
Convert
Once uploaded, nHance automatically analyzes the document, identifies key medical entities, and converts the unstructured content into a structured, interoperable format.
Download
In under three minutes, nHance produces a FHIR-compliant output. You can:
- Download the file directly.
- Or integrate it into your existing systems for downstream workflows such as analytics or patient data management.
Implementation Guide
Use the Curiflow Python SDK to integrate the entire workflow directly into your application or data pipeline.
import time
import json
import requests
# ==== Configuration ====
BASE_URL = "https://platform.curiflow.com/api/v1"
CLIENT_ID = "YOUR_CLIENT_ID" # You may generate the Client ID and Client Secret from the console
CLIENT_SECRET = "YOUR_CLIENT_SECRET"
FILE_PATH = "path/to/your/file.pdf" # Replace with your file path
FILE_TYPE = "pdf" # One of: pdf, ccda
HEADERS = {
"X-Client-Id": CLIENT_ID,
"X-Client-Secret": CLIENT_SECRET,
}
# ==== Step 1: Upload ====
print("Uploading file...")
with open(FILE_PATH, "rb") as f:
files = {"file": f}
upload_response = requests.post(f"{BASE_URL}/upload", headers=HEADERS, files=files)
upload_response.raise_for_status()
file_id = upload_response.json()["file_id"]
print(f"File uploaded successfully (file_id={file_id})")
# ==== Step 2: Convert ====
print("Starting conversion...")
convert_payload = {
"file_id": file_id,
"file_type": FILE_TYPE,
"process_config": {
"tasks": ["fhir"]
}
}
convert_response = requests.post(
f"{BASE_URL}/convert",
headers={**HEADERS, "Content-Type": "application/json"},
json=convert_payload
)
convert_response.raise_for_status()
job_id = convert_response.json()["job_id"]
print(f"Conversion job started (job_id={job_id})")
# ==== Step 3: Poll Status ====
print("Checking job status...")
while True:
status_response = requests.get(f"{BASE_URL}/status/{job_id}", headers=HEADERS)
status_response.raise_for_status()
status_data = status_response.json()
status = status_data["status"]
print(f" - Current status: {status}")
if status == "success":
print("Job completed successfully.")
break
elif status == "failed":
raise RuntimeError("Conversion job failed.")
time.sleep(5) # Wait 5 seconds before checking again
# ==== Step 4: Retrieve Results ====
print("Fetching FHIR results...")
results = requests.get(f"{BASE_URL}/results/{job_id}", headers=HEADERS)
results.raise_for_status()
results_json = results.json()
# The FHIR data is typically in results_json["fhir_data"]
fhir_data = results_json.get("fhir_data", {})
output_path = "fhir_output.json"
with open(output_path, "w") as f:
json.dump(fhir_data, f, indent=2)
print(f"FHIR data saved to {output_path}")