Supported materials
Max file size is 100 MB per document. You choose the clinical target — the platform does not infer
log_type or document_type / note_type from the filename.
Target log types
document_type values (for unstructured_report): clinical_note, radiology_imaging, operative_procedure, cardiology_diagnostic, pathology_report, lab_report, genomic_report, discharge_summary, patient_intake, external_records_package.
note_type values (for clinical_note): progress_note, history_and_physical, social_history, family_history, medical_history, surgical_history, psychosocial_history, financial_history, discharge_summary, consultation_note, other.
Payload schemas: clinical note, unstructured report.
Pipeline
- Upload — request a presigned URL, PUT the file bytes (with matching
Content-Type), then commit. - Textize — for born-digital PDFs (Word→PDF, EHR print-to-PDF), Olira prefers the embedded text layer when quality checks pass (chars/page, letter ratio, nonempty pages).
- Vision OCR — scanned PDFs, sparse text layers, and images fall back to vision OCR.
- Emit — Olira writes an
unstructured_reportorclinical_noteevent log and continues through the normal graph / extraction path.
Two ways to send resources
Live upload (single document)
Best for ongoing document arrival from your backend. Requiressdk:event-log.
POST /v1/documents:upload-url- Presigned
PUTof the binary POST /v1/documents/{id}:commitGET /v1/documents/{id}while you poll
Historical package (bulk PDFs + logs)
Best for onboarding backfills that mix JSONL-style patient/log rows with PDF binaries. Requiressdk:historical-ingest.
POST /v1/ingestion/jobs:begin), PUTs each PDF, builds a manifest.jsonl that includes type=document rows, then creates the historical job. After you confirm, OCR and document log materialization run inside the historical workflow before view backfill. See create_ingestion_job and Backfilling historical data for confirmation, cancel, and progress polling.
Document statuses
Terminal statuses:
log_emitted, ocr_failed.
What you need
- API key with
sdk:event-log(live upload) orsdk:historical-ingest(package jobs). - Patient already in your org (or created in the same historical package via patient rows).
- A PDF or supported image file, plus the correct
log_typelabels. - A stable
idempotency_keyso retries do not create duplicate document resources. This is a separate key from the one onlog_batch/log_fhir(log()has no key) — document uploads have their own idempotency scope.
After emit
Once status islog_emitted, treat the result like any other log: inspect it in Console observability, read it via state / log query APIs, and expect downstream extraction and view updates according to your org configuration. Re-using the same idempotency_key after a document already left pending_upload returns a conflict — pick a new key for a new file.
