Organization Data API · v1

Push your clinical data
into MEDHAS.

One API key covers every clinic in your organization. Send patient visits, pharmacy stock, diet plans and lab results — they land in the same records MEDHAS clinicians work with, and flow straight into the Organization dashboard, trend charts and AI assistant. No separate reporting path to keep in sync.

Base URLhttps://medhas.co.in/api/external/v1/organizations

Authentication

Every request carries your organization’s API key as a bearer token. There is no separate login step and no token exchange.

Header on every request
Authorization: Bearer <YOUR_API_KEY>
Use your key on this pageFills every code sample below and unlocks the live console.

Kept in this browser tab only (session storage) and sent nowhere except the MEDHAS endpoint you invoke. It is cleared when you close the tab.

Treat the key like a password.

It authorizes writes to every clinic in your organization and is shown only once when generated. Keep it in a server-side secret store, never in client code or version control. If it leaks, ask your MEDHAS contact to revoke it — revocation takes effect immediately.

StatusMeaning
200 AcceptedCheck the per-record status field — a batch can succeed overall and still contain individual record errors.
400 Bad requestMalformed JSON, an empty array, or a batch over the 500-record limit.
401 UnauthorizedAuthorization header missing, key unrecognized, or key revoked.
500 Server errorSomething failed on our side. Safe to retry — idempotency keys prevent duplicates.

Quickstart

The shortest path from a fresh API key to data appearing in MEDHAS.

  1. 1
    Get your API keyMEDHAS provisions one per organization and shares it with you out of band.
  2. 2
    Choose a stable clinic codeYour own identifier per clinic — a branch code works well. That value becomes externalClinicId; the format is entirely yours.
  3. 3
    Send your first visitInclude clinicName the first time a new code appears and the clinic is created for you. After that the code alone is enough.
  4. 4
    Give every record an external idWith externalVisitId set, resending is safe — you get updated back instead of a duplicate.
  5. 5
    Read results per recordBatches return one result per item. Inspect each status rather than assuming the whole batch shared one outcome.
Clinics create themselves.

There is no setup call and no clinic registry to sync first. The first record you send for an unknown externalClinicId creates the clinic from the clinicName on that record. If an unknown code arrives with no name, that single record is rejected with a clear message — it never guesses which clinic you meant.

Severity scale

MEDHAS scores symptom severity on a fixed 0–10 scale internally. Send ratings on whatever scale your system already uses and declare it — the conversion is linear and lossless.

Stored severity7.5/10

normalized = (ratingRaw − 1) ÷ (ratingScale − 1) × 10Your raw value is stored alongside it, so nothing about your original scale is lost.

Visits

Patient encounters — symptoms, diagnosis, medicines, vitals.

POST/api/external/v1/organizations/visits

Create or update a visit

Records one patient encounter — identity, rated symptoms, diagnosis, medicines, vitals and billing in a single call.

idempotent on externalVisitId

Routing

FieldTypeDescription
externalClinicIdrequiredstringYour own clinic code. You choose the format — just keep it stable.
clinicNamestringRequired only the first time a code appears. Auto-creates the clinic.
clinicCitystringUsed only when auto-creating.
clinicStatestringUsed only when auto-creating.

Visit

FieldTypeDescription
externalVisitIdstringYour visit id. Re-sending the same id updates that visit instead of duplicating it.
visitDaterequireddateYYYY-MM-DD.
visitTimestringHH:MM, 24-hour. Defaults to 09:00.
nextVisitDatedateYYYY-MM-DD.
treatmentDaysnumberOverall course length.
medicineDaysnumberMedicine course length, if tracked separately.
externalDoctorIdstringYour prescriber id. First sighting creates an attribution record so per-doctor reporting includes your data.
doctorNamestringUsed only when creating that doctor record.
notesstringFree text.

patient

The identity key is externalId — sending it again updates the same patient rather than creating a second one.

FieldTypeDescription
patient.externalIdrequiredstringYour patient id.
patient.namestring—
patient.sexstringM / F / O.
patient.ageYearsnumber—
patient.dobdateYYYY-MM-DD.
patient.mobilestring—
patient.whatsappstring—
patient.emailstring—
patient.addressobjectFree-form; stored as sent.
patient.occupationstring—

symptoms[]

One entry per condition. Rate each symptom on your own scale and declare the scale — MEDHAS normalizes it.

FieldTypeDescription
symptoms[].namerequiredstringCondition name. No fixed vocabulary required.
symptoms[].diseaseIdstringAn NAMC code if you have one — improves catalog matching.
symptoms[].symptoms[].labelrequiredstringSymptom name, free text.
symptoms[].symptoms[].ratingRawrequirednumberSeverity on your scale.
symptoms[].symptoms[].ratingScalenumberTop of your scale, e.g. 5. Defaults to 5.

diseases[]

Diagnosed conditions for this visit, separate from the rated symptom list.

FieldTypeDescription
diseases[].namerequiredstring—
diseases[].diseaseIdstring—
diseases[].statusstringnew / ongoing / resolved. Defaults to ongoing.

medicines[]

Matched by name against the organization product catalog for adoption reporting — consistent naming improves accuracy.

FieldTypeDescription
medicines[].medicineNamerequiredstring—
medicines[].medicineTypestring—
medicines[].doseMorningnumber—
medicines[].doseAfternoonnumber—
medicines[].doseNightnumber—
medicines[].quantitynumber—
medicines[].daysnumberCourse length for this line.
medicines[].instructionstringe.g. "after food".
medicines[].externalInventoryItemIdstringLinks the line to stock you registered via /inventory/batch.

Clinical objects

FieldTypeDescription
diagnosisobject{ ayurved, modern, modernSystem, icdCode } — all optional strings.
doshaBalanceobject{ vata, pitta, kapha } — integers 0–10.
investigationsarray[{ name, result? }] — tests ordered or reviewed at the visit, up to 30.
labResultsarray[{ name, value, unit?, ref?, flag? (low|high) }] — results recorded at the visit, up to 80.
dietAdvicearrayDiet lines for the patient (strings), up to 40.
exercisesarrayYoga / exercise lines (strings), up to 40.
vitalsobject{ bpSystolic, bpDiastolic, temperature, temperatureUnit, height, heightUnit, weight, weightUnit, spo2, pulse }.
billingobject{ consultingFee, medicineFee, paidAmount, paymentMode }.
curl -X POST 'https://medhas.co.in/api/external/v1/organizations/visits' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"externalClinicId":"PUNE-07","clinicName":"Pune Koregaon Park Clinic","clinicCity":"Pune","clinicState":"Maharashtra","externalVisitId":"V-88213","externalDoctorId":"D-42","doctorName":"Dr. Aditi Rao","visitDate":"2026-01-15","patient":{"externalId":"P-10234","name":"Ravi Kumar","sex":"M","ageYears":45},"symptoms":[{"name":"Type 2 Diabetes","symptoms":[{"label":"Frequent urination","ratingRaw":4,"ratingScale":5},{"label":"Excessive thirst","ratingRaw":3,"ratingScale":5}]}],"diseases":[{"name":"Type 2 Diabetes","status":"ongoing"}],"medicines":[{"medicineName":"Nishamalaki Churna","doseMorning":1,"doseNight":1,"quantity":60,"days":30}],"diagnosis":{"ayurved":"Madhumeha","modern":"Type 2 Diabetes Mellitus"},"vitals":{"bpSystolic":130,"bpDiastolic":85,"weight":78,"weightUnit":"kg"},"billing":{"consultingFee":500,"medicineFee":800,"paidAmount":1300,"paymentMode":"cash"}}'
Response · 200
{
  "externalVisitId": "V-88213",
  "status": "created",
  "clinicId": "66f1a2b3c4d5e6f7a8b9c0d1",
  "patientId": "66f1a2b3c4d5e6f7a8b9c0d2"
}
Try itAdd your API key at the top of the page to enable this
/api/external/v1/organizations/visits
POST/api/external/v1/organizations/visits/batch

Send a batch of visits

Up to 500 visits per request. Each record is processed independently — one bad record never fails the rest.

max 500 per requestidempotent on externalVisitId

Body

FieldTypeDescription
visits[]requiredarrayEach element uses exactly the same shape as the single-visit endpoint above.
curl -X POST 'https://medhas.co.in/api/external/v1/organizations/visits/batch' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"visits":[{"externalClinicId":"PUNE-07","externalVisitId":"V-1","visitDate":"2026-01-15","patient":{"externalId":"P-1","name":"Meera Nair"},"medicines":[{"medicineName":"Triphala Churna","quantity":30}]},{"externalClinicId":"PUNE-07","externalVisitId":"V-2","visitDate":"2026-01-15","patient":{"externalId":"P-2","name":"Arjun Shetty"},"diagnosis":{"modern":"Hypertension"}}]}'
Response · 200
{
  "results": [
    {
      "externalVisitId": "V-1",
      "status": "created",
      "clinicId": "…",
      "patientId": "…"
    },
    {
      "externalVisitId": "V-2",
      "status": "error",
      "error": "visitDate is required (YYYY-MM-DD)."
    }
  ],
  "summary": {
    "received": 2,
    "created": 1,
    "error": 1
  }
}
Try itAdd your API key at the top of the page to enable this
/api/external/v1/organizations/visits/batch

Inventory

Pharmacy stock levels, batches and pricing per clinic.

POST/api/external/v1/organizations/inventory/batch

Sync pharmacy stock

Registers or updates stock items for a clinic. Up to 500 items per request.

max 500 per requestidempotent on externalItemId

Routing

FieldTypeDescription
items[].externalClinicIdrequiredstringYour own clinic code. You choose the format — just keep it stable.
items[].clinicNamestringRequired only the first time a code appears. Auto-creates the clinic.
items[].clinicCitystringUsed only when auto-creating.
items[].clinicStatestringUsed only when auto-creating.

Item

FieldTypeDescription
items[].externalItemIdstringYour stock id. Re-sending updates the same item.
items[].medicineNamerequiredstringMatched against the organization product catalog.
items[].medicineTypestring—
items[].companystring—
items[].alternateNamestring—
items[].batchNostring—
items[].mfgDatedate—
items[].expDatedate—
items[].packagingSizestring—
items[].packagingTypestring—
items[].stocknumberDefaults to 0 when omitted.
items[].minimumStocknumberDrives low-stock alerts.
items[].ratenumberCost price.
items[].sellRatenumberSelling price.
items[].gstnumber—
items[].hsnstring—
items[].barcodeNostring—
items[].medicineCodestring—
items[].supplierNamestring—
items[].billNostring—
items[].billDatedate—
items[].otcProductboolean—
items[].withBillboolean—
items[].exclusiveGstboolean—
items[].notesstring—
curl -X POST 'https://medhas.co.in/api/external/v1/organizations/inventory/batch' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"items":[{"externalClinicId":"PUNE-07","externalItemId":"SKU-4471","medicineName":"Nishamalaki Churna","stock":120,"minimumStock":15,"sellRate":180,"expDate":"2028-06-30"}]}'
Response · 200
{
  "results": [
    {
      "externalItemId": "SKU-4471",
      "status": "created",
      "id": "66f1a2b3c4d5e6f7a8b9c0d3"
    }
  ],
  "summary": {
    "received": 1,
    "created": 1
  }
}
Try itAdd your API key at the top of the page to enable this
/api/external/v1/organizations/inventory/batch

Diet plans

Custom diet plans built from named food items.

POST/api/external/v1/organizations/diet-plans

Create or update a diet plan

Food items MEDHAS has not seen for this clinic are registered automatically — you never need to match an existing catalog.

idempotent on externalPlanId

Routing

FieldTypeDescription
externalClinicIdrequiredstringYour own clinic code. You choose the format — just keep it stable.
clinicNamestringRequired only the first time a code appears. Auto-creates the clinic.
clinicCitystringUsed only when auto-creating.
clinicStatestringUsed only when auto-creating.

Plan

FieldTypeDescription
externalPlanIdstringRe-sending updates the same plan.
namerequiredstringPlan name.
notestring—

items[]

Only name is required. Every classification field falls back to a sane default rather than rejecting the item.

FieldTypeDescription
items[].namerequiredstringFood name, free text.
items[].sanskritstring—
items[].groupenumgrains · legumes · vegetables · fruits · spices · dairy · oils · nuts_seeds · sweeteners · beverages · animal · condiments · prepared. Anything else falls back to prepared.
items[].viryaenumheating / cooling / neutral.
items[].gunaenumsattvic / rajasic / tamasic.
items[].doshaobject{ vata, pitta, kapha }, each favor / moderate / avoid / neutral.
curl -X POST 'https://medhas.co.in/api/external/v1/organizations/diet-plans' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"externalClinicId":"PUNE-07","externalPlanId":"DIET-118","name":"Diabetic Management Plan A","items":[{"name":"Bitter Gourd Soup","group":"prepared"},{"name":"Steamed Millets","group":"grains"}]}'
Response · 200
{
  "externalPlanId": "DIET-118",
  "status": "created",
  "id": "66f1a2b3c4d5e6f7a8b9c0d4"
}
Try itAdd your API key at the top of the page to enable this
/api/external/v1/organizations/diet-plans

Lab results

Lab report values — blood work, vitals, any metric you track — for trend charts and research.

POST/api/external/v1/organizations/lab-results

Send a lab report

Records one report’s worth of lab values for a patient — the same destination as a doctor typing results into the app, so they show up in trend charts, research and the AI assistant immediately.

idempotent on clinic + patient + reportDate

Routing

FieldTypeDescription
externalClinicIdrequiredstringYour own clinic code. You choose the format — just keep it stable.
clinicNamestringRequired only the first time a code appears. Auto-creates the clinic.
clinicCitystringUsed only when auto-creating.
clinicStatestringUsed only when auto-creating.

Report

FieldTypeDescription
reportDaterequireddateYYYY-MM-DD. Resending this date merges into the same report instead of creating a duplicate.

patient

The identity key is externalId — sending it again updates the same patient rather than creating a second one.

FieldTypeDescription
patient.externalIdrequiredstringYour patient id.
patient.namestring—
patient.sexstringM / F / O.
patient.ageYearsnumber—
patient.dobdateYYYY-MM-DD.
patient.mobilestring—

values

An object keyed by metric name — letters, digits and underscore only. Recognized keys (hba1c, glucose_fasting, systolic_bp, diastolic_bp, hemoglobin, and more) get a friendly label and unit automatically; any other key is stored and labeled as sent. Each value is a number or short text (under 200 characters). 1–100 entries per report.

FieldTypeDescription
values.<metricKey>requirednumber | stringOne entry per lab value on this report, e.g. values.hba1c, values.systolic_bp.
curl -X POST 'https://medhas.co.in/api/external/v1/organizations/lab-results' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"externalClinicId":"PUNE-07","reportDate":"2026-01-15","patient":{"externalId":"P-10234","name":"Ravi Kumar"},"values":{"hba1c":7.2,"glucose_fasting":118,"systolic_bp":130,"diastolic_bp":85,"notes":"Sample slightly hemolyzed"}}'
Response · 200
{
  "status": "created",
  "clinicId": "66f1a2b3c4d5e6f7a8b9c0d1",
  "patientId": "66f1a2b3c4d5e6f7a8b9c0d2",
  "reportDate": "2026-01-15",
  "metricCount": 5
}
Try itAdd your API key at the top of the page to enable this
/api/external/v1/organizations/lab-results
POST/api/external/v1/organizations/lab-results/batch

Send a batch of lab reports

Up to 500 reports per request. Each record is processed independently — one bad record never fails the rest.

max 500 per requestidempotent on clinic + patient + reportDate

Body

FieldTypeDescription
reports[]requiredarrayEach element uses exactly the same shape as the single-report endpoint above.
curl -X POST 'https://medhas.co.in/api/external/v1/organizations/lab-results/batch' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"reports":[{"externalClinicId":"PUNE-07","reportDate":"2026-01-15","patient":{"externalId":"P-1","name":"Meera Nair"},"values":{"hemoglobin":12.4,"wbc":6400}},{"externalClinicId":"PUNE-07","reportDate":"2026-01-15","patient":{"externalId":"P-2","name":"Arjun Shetty"},"values":{"systolic_bp":142,"diastolic_bp":92}}]}'
Response · 200
{
  "results": [
    {
      "status": "created",
      "clinicId": "…",
      "patientId": "…",
      "reportDate": "2026-01-15",
      "metricCount": 2
    },
    {
      "status": "created",
      "clinicId": "…",
      "patientId": "…",
      "reportDate": "2026-01-15",
      "metricCount": 2
    }
  ],
  "summary": {
    "received": 2,
    "created": 2
  }
}
Try itAdd your API key at the top of the page to enable this
/api/external/v1/organizations/lab-results/batch

Dravyas

Ayurvedic drugs and the classical combinations built from them — shared across your whole organization, optionally dispensed straight into a clinic’s inventory.

POST/api/external/v1/organizations/moolikas

Create or update a herb (Dravya)

Registers one raw herb into your organization’s shared Dravya catalog — the ingredient list combinations are built from. Unlike visits/inventory/diet/lab-results, this is organization-scoped, not per-clinic: no externalClinicId routing is needed, and every clinic in the org sees and can edit the same catalog.

idempotent on externalHerbId (falls back to name)

Herb

FieldTypeDescription
externalHerbIdstringYour herb id. Re-sending the same id updates that herb. Omit it and re-sending the same name updates instead.
namerequiredstring—
botanicalNamestring—
sanskritstring—
partUsedstringRoot, leaf, bark, seed, etc.
rasaarrayTaste(s): madhura, amla, lavana, katu, tikta, kashaya.
gunastringProperty, e.g. laghu, snigdha.
doshaobject{ vata, pitta, kapha }, each increase / decrease / neutral.
viryastring—
vipakastring—
karmastring—
usesstring—
dosestring—
kindstringplant / mineral / animal / salt / sugar / liquid / formulation. Defaults to plant.
englishNamestring—
aliasesarrayOther names and spellings; search matches them.
processedFormstringe.g. bhasma, kshara, sattva.
varietiesarray—
substitutesarray—
requiresShodhanabooleanTrue when it must be purified before use.
sourcestringSupplier or origin.
notesstring—
curl -X POST 'https://medhas.co.in/api/external/v1/organizations/moolikas' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"externalHerbId":"HERB-ASH-01","name":"Ashwagandha","botanicalName":"Withania somnifera","sanskrit":"Ashwagandha","partUsed":"Root","rasa":["tikta","kashaya"],"dosha":{"vata":"decrease","kapha":"increase"}}'
Response · 200
{
  "externalHerbId": "HERB-ASH-01",
  "status": "created",
  "id": "66f1a2b3c4d5e6f7a8b9c0d5"
}
Try itAdd your API key at the top of the page to enable this
/api/external/v1/organizations/moolikas
POST/api/external/v1/organizations/moolikas/batch

Sync a batch of herbs

Up to 500 herbs per request. Each record is processed independently — one bad record never fails the rest.

max 500 per requestidempotent on externalHerbId (falls back to name)

Body

FieldTypeDescription
herbs[]requiredarrayEach element uses exactly the same shape as the single-herb endpoint above.
curl -X POST 'https://medhas.co.in/api/external/v1/organizations/moolikas/batch' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"herbs":[{"name":"Tulsi","botanicalName":"Ocimum sanctum"},{"name":"Guduchi","botanicalName":"Tinospora cordifolia"}]}'
Response · 200
{
  "results": [
    {
      "status": "created",
      "id": "…"
    },
    {
      "status": "created",
      "id": "…"
    }
  ],
  "summary": {
    "received": 2,
    "created": 2
  }
}
Try itAdd your API key at the top of the page to enable this
/api/external/v1/organizations/moolikas/batch
POST/api/external/v1/organizations/moolika-combinations

Create or update a herb combination

Builds a formulation (Kashayam, Choornam, Rasayana, ...) from named herbs in your organization’s shared Dravya catalog — an herb name not already in it is auto-registered first. Also organization-scoped, not per-clinic. Set autoDispense (plus externalClinicId/clinicName) to also push the result into that clinic’s medicine inventory in the same call.

idempotent on externalCombinationId

Combination

FieldTypeDescription
externalCombinationIdstringYour combination id. Re-sending the same id updates that combination.
namerequiredstring—
preparationTypestringkashayam / choornam / kwath / rasayana / arishta / ghrita / taila / other. Defaults to other.
indicationstring—
dosagestring—
anupanastringVehicle it’s taken with, e.g. warm water, honey.
categorystringFormulary group id, e.g. asava-arishta, taila, churna, vati, bhasma.
routestringinternal / external / both.
methodstringHow it is prepared.
preservationstringHow long it keeps and how it is stored.
aliasesarray—
diseasesarrayDisease terms it is indexed under.
notesstring—
autoDispensebooleanWhen true, immediately adds the saved combination to a clinic’s medicine inventory as a stock item.

Dispensing (only used with autoDispense)

FieldTypeDescription
externalClinicIdstringYour own clinic code. You choose the format — just keep it stable. Only read when autoDispense is true.
clinicNamestringRequired only the first time a code appears. Auto-creates the clinic. Only read when autoDispense is true.
clinicCitystringUsed only when auto-creating. Only read when autoDispense is true.
clinicStatestringUsed only when auto-creating. Only read when autoDispense is true.

herbs[]

Referenced by name, not id — a name not already in the catalog is registered automatically.

FieldTypeDescription
herbs[].namerequiredstring—
herbs[].quantitynumberDefaults to 1.
herbs[].unitstringe.g. part, g, kg, ml, l, q.s. Defaults to "part".
herbs[].rolestringmain / liquid / prakshepa / bhavana / pralepana / dhupana / other. Defaults to main.
herbs[].partstringPart of the plant, e.g. Root.
curl -X POST 'https://medhas.co.in/api/external/v1/organizations/moolika-combinations' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"externalClinicId":"PUNE-07","externalCombinationId":"COMBO-DASHA-01","name":"Dashamoola Kashayam","preparationType":"kashayam","indication":"Vata disorders, postpartum care","dosage":"15ml twice daily before food","anupana":"Warm water","herbs":[{"name":"Bilva","quantity":1,"unit":"part"},{"name":"Shyonaka","quantity":1,"unit":"part"}],"autoDispense":true}'
Response · 200
{
  "externalCombinationId": "COMBO-DASHA-01",
  "status": "created",
  "id": "66f1a2b3c4d5e6f7a8b9c0d6",
  "inventoryItemId": "66f1a2b3c4d5e6f7a8b9c0d7"
}
Try itAdd your API key at the top of the page to enable this
/api/external/v1/organizations/moolika-combinations
POST/api/external/v1/organizations/moolika-combinations/batch

Sync a batch of herb combinations

Up to 500 combinations per request. Each record is processed independently — one bad record never fails the rest.

max 500 per requestidempotent on externalCombinationId

Body

FieldTypeDescription
combinations[]requiredarrayEach element uses exactly the same shape as the single-combination endpoint above.
curl -X POST 'https://medhas.co.in/api/external/v1/organizations/moolika-combinations/batch' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"combinations":[{"name":"Triphala Choornam","preparationType":"choornam","herbs":[{"name":"Amalaki"},{"name":"Bibhitaki"},{"name":"Haritaki"}]}]}'
Response · 200
{
  "results": [
    {
      "status": "created",
      "id": "…",
      "inventoryItemId": null
    }
  ],
  "summary": {
    "received": 1,
    "created": 1
  }
}
Try itAdd your API key at the top of the page to enable this
/api/external/v1/organizations/moolika-combinations/batch

Responses & retries

Ingestion endpoints report an outcome per record, never a single pass/fail for a whole batch.

Record statusMeaning
createdA new record was inserted.
updatedAn existing record with the same external id was found and updated in place.
errorThis one record was rejected — read its error string. Other records in the batch are unaffected.

Retrying safely

Every endpoint is idempotent when you supply an external id — externalVisitId,externalItemId or externalPlanId. If a request times out or you cannot tell whether it landed, send it again unchanged: you will get updated rather than a duplicate. Records sent without an external id are always inserted as new, so set one wherever you can. Lab results have no separate id to set — the report date itself is the key, so resending the same clinic/patient/date always merges into that one report rather than duplicating it.

What happens to your data

  • Symptom severity is normalized to 0–10 and feeds trend charts and the AI assistant exactly like an assessment typed in at the clinic.
  • Medicine names are matched against your organization’s product catalog for adoption reporting. Matching is exact on name, so consistent naming between your visit and inventory records improves accuracy.
  • Doctors identified by externalDoctorId get an attribution record — not a login — so per-prescriber reporting includes your data without provisioning accounts.
  • Auto-created clinics can be renamed or remapped later by your organization admin without affecting data already ingested.
  • Lab values land in the same place a doctor typing results into the app writes to, so they appear on the patient’s report history and trend charts immediately — recognized metric keys (e.g. hba1c, systolic_bp) get a proper label and unit; unrecognized ones are still stored, labeled as sent.

Organization Data API · v1 · Questions about your API key or clinic mapping go to your MEDHAS platform contact.