Every route sits under the base URL. Path parameters are UUIDs from earlier responses.
GET/patientsScope patients:read
List patients
Newest first. Filter by record number to find one.
Query parametersmrnstringoptionalExact record number.limitintegeroptionalHow many rows to return.
Response 200 data[]iduuidname_givenstringGiven name.name_familystringFamily name.date_of_birthdateYYYY-MM-DD.sexfemale | male | intersex | unknownSex assigned at birth.external_patient_refstringYour record number (MRN).monitoring_statusactive | deceased | departed | withdrawnWhether the patient is still monitored on the registry.location_iduuidThe site the patient belongs to.created_atdate-time
POST/patientsScope patients:write
Create a patient
Identifiers need a paid plan and a current BAA; a test key writes to the sandbox.
Write. Needs an Idempotency-Key.
Request bodyname_givenstringoptionalGiven name.name_familystringoptionalFamily name.date_of_birthdateoptionalYYYY-MM-DD.sexfemale | male | intersex | unknownoptionalSex assigned at birth.external_patient_refstringoptionalYour record number (MRN).phonestringoptionalE.164 where possible.emailemailoptionalContact email.preferred_languagestringoptionalBCP 47 tag, such as en or es.location_iduuidoptionalThe site the patient belongs to.
PATCH/patients/{id}Scope patients:write
Update a patient
Send only the fields to change. Null clears a field.
Write. Needs an Idempotency-Key.
Request bodyname_givenstringoptionalGiven name.name_familystringoptionalFamily name.date_of_birthdateoptionalYYYY-MM-DD.sexfemale | male | intersex | unknownoptionalSex assigned at birth.external_patient_refstringoptionalYour record number (MRN).phonestringoptionalE.164 where possible.emailemailoptionalContact email.preferred_languagestringoptionalBCP 47 tag, such as en or es.location_iduuidoptionalThe site the patient belongs to.monitoring_statusactive | deceased | departed | withdrawnoptional
Response 200iduuidname_givenstringGiven name.name_familystringFamily name.date_of_birthdateYYYY-MM-DD.sexfemale | male | intersex | unknownSex assigned at birth.external_patient_refstringYour record number (MRN).monitoring_statusactive | deceased | departed | withdrawnWhether the patient is still monitored on the registry.location_iduuidThe site the patient belongs to.created_atdate-time
GET/appointmentsScope appointments:read
List appointments
Soonest first.
Query parametersfromdate-timeoptionalStarting at or after this instant.todate-timeoptionalStarting before this instant.limitintegeroptionalHow many rows to return.
Response 200 data[]iduuidcase_iduuidlocation_iduuidstarts_atdate-timevisit_typestringYour visit type, as text.providerstringThe clinician, as text.sourcestringHow the appointment arrived: feed, api, or console.external_refstringYour identifier for the appointment.statusscheduled | completed | cancelled | no_show
POST/appointmentsScope appointments:write
Book an appointment on a case
Write. Needs an Idempotency-Key.
Request bodycase_iduuidrequiredlocation_iduuidrequiredstarts_atdate-timerequiredvisit_typestringoptionalproviderstringoptionalexternal_refstringoptionalYour identifier for the appointment.
PATCH/appointments/{id}Scope appointments:write
Reschedule, reassign or close an appointment
Write. Needs an Idempotency-Key.
Request bodystarts_atdate-timeoptionallocation_iduuidoptionalvisit_typestringoptionalproviderstringoptionalexternal_refstringoptionalstatusscheduled | completed | cancelled | no_showoptional
Response 200iduuidcase_iduuidlocation_iduuidstarts_atdate-timevisit_typestringYour visit type, as text.providerstringThe clinician, as text.sourcestringHow the appointment arrived: feed, api, or console.external_refstringYour identifier for the appointment.statusscheduled | completed | cancelled | no_show
GET/pedigreesScope pedigrees:read
List cases with a pedigree
Most recently changed first. Fetch one by id for the family itself.
Query parameterspatient_iduuidoptionalOnly this patient's cases.limitintegeroptionalHow many rows to return.
Response 200 data[]iduuidcase_codestringThe human-readable case code.stateintake_pending | intake_complete | in_review | decided | ordered | result_received | released | on_registry | not_testedpatient_iduuidlocation_iduuidpeopleintegerHow many people are on the pedigree.updated_atdate-time
GET/pedigrees/{caseId}Scope pedigrees:read
Read a pedigree
Every person with their relation to the proband derived from the graph, their diagnoses and current results, and the edges between them. Reading only: the pedigree is edited in Lumagen, where its invariants are enforced.
Response 200caseobjectpersonsobject[]edgesobject[]
GET/eligibility/{caseId}Scope eligibility:read
Read a case's testing criteria
Evaluated on request against the current pedigree and the current guideline versions. Decision support: the clinician decides.
Response 200case_iduuidevaluated_atdate-timeguidelinesobject[]recommend_testingbooleanTrue when at least one indicated criterion is met.metobject[]near_missobject[]Criteria the source words as consider or clinical judgment.not_evaluableobject[]Criteria this engine cannot decide from a pedigree, named so nobody reads a false negative.
GET/resultsScope results:read
List results
Newest first. Findings are read on the pedigree, per person.
Query parameterscase_iduuidoptionalOnly this case.releasedbooleanoptionaltrue for released results only.limitintegeroptionalHow many rows to return.
Response 200 data[]iduuidcase_iduuidpatient_iduuidsourceehr_feed | lab_api | manual_upload | apilab_namestringlab_accessionstringreported_atdateverified_atdate-timeWhen a clinician verified the summary.released_atdate-timeWhen it was released to the patient's record.created_atdate-time
POST/resultsScope results:write
Deliver a lab result
Matched to a patient by order id, record number, or name and date of birth. A result that matches nobody is held for a clinician to link, never dropped.
Write. Needs an Idempotency-Key.
Request bodylab_accessionstringrequiredThe lab's accession number.lab_namestringoptionalThe lab.reported_atdateoptionalYYYY-MM-DD.mrnstringoptionalYour record number for the patient, the surest way to match.patient_namestringoptionalFull name as the lab has it, used to match when there is no record number.date_of_birthdateoptionalYYYY-MM-DD.order_iduuidoptionalA Lumagen order id, when Lumagen placed the order.findingsobject[]requiredOne row per gene reported.rawobjectoptionalThe lab's own payload, kept as sent.
Response 201outcomeattached | heldresult_iduuidcase_iduuidunmatched_iduuidcandidate_countinteger
GET/recontactScope recontact:read
List recontact items
Patients the registry has flagged since their result: a reclassified variant, a family-history change, a guideline change. Open items unless a status is given.
Query parametersstatusopen | actioned | dismissedoptionalDefaults to open.limitintegeroptionalHow many rows to return.
Response 200 data[]iduuidcase_iduuidcase_codestringreasonreclassification | management | testing_criteriastatusopen | actioned | dismissedcreated_atdate-timedispositioned_atdate-time
GET/guidelinesScope guidelines:read
List the guideline versions in force and their criteria
What the eligibility endpoint evaluates against, by id, so a change in version is visible before it changes an answer.
Response 200 data[]keystringNCCN-BOPP or NCCN-CEEG.namestringversionstringversion_datedatecriteriaobject[]
GET/locationsScope locations:read
List sites
Response 200 data[]iduuidnamestringtimezonestringIANA zone, such as America/Phoenix.addressstringphonestringcreated_atdate-time
POST/locationsScope locations:write
Add a site
Write. Needs an Idempotency-Key.
Request bodynamestringrequiredtimezonestringoptionalIANA zone.addressstringoptionalphonestringoptional
Response 201iduuidnamestringtimezonestringIANA zone, such as America/Phoenix.addressstringphonestringcreated_atdate-time
GET/callsScope calls:read
List intake conversations
Every chat, browser voice session or phone call a patient had with the intake agent, with whether it reached the coverage minimum. Transcripts are not exposed.
Query parameterscase_iduuidoptionalOnly this case.limitintegeroptionalHow many rows to return.
Response 200 data[]iduuidcase_iduuidchannelchat | web_voice | phonestatusstarted | ready_for_review | abandonedattempt_numberintegerstarted_atdate-timeended_atdate-timeduration_sintegerSeconds.minimum_metbooleanWhether the conversation reached the coverage minimum.
POST/fhirScope patients:write
Deliver a FHIR Bundle
Patient, Appointment and DiagnosticReport resources, mapped onto Lumagen's own records. Needs patients:write and appointments:write. Fields Lumagen does not hold are named in the response as ignored-field issues.
Write. Needs an Idempotency-Key.
Request bodyresourceTypeBundlerequiredtypestringoptionalentryobject[]required
Response 200createdobject[]issueobject[]
POST/oauth/token
Exchange client credentials for an access token
Form-encoded or JSON: grant_type=client_credentials, client_id, client_secret, and an optional space-separated scope. Basic authentication with the client id and secret also works. Tokens last one hour.
Request bodygrant_typeclient_credentialsrequiredclient_idstringrequiredclient_secretstringrequiredscopestringoptionalSpace-separated, a subset of the key's scopes.
Response 200access_tokenstringtoken_typebearerexpires_inintegerSeconds.scopestring