Appointment log CSV import API

appointment_log_v1

lowFHIR · Appointment4 fields · 2 required · 0 validatedPack · Healthcare

Import this template via API. Import past appointments from CSV into a FHIR Appointment-shaped schema. Locale-tolerant date parsing.

30-second curl

curl -X POST https://api.adaptivmapr.com/v1/uploads \
  -H "Authorization: Bearer $ADAPTIVMAPR_API_KEY" \
  -F "template=appointment_log_v1" \
  -F "file=@your_data.csv"

At a glance

Pack
Healthcare
FHIR resource
Appointment
Risk level
low
Fields
4 (2 required, 0 validated)

Why this template?

The Appointment log template is for past appointments, not future ones — the use case is backfilling an EMR with historical visit data, building a no-show-rate dashboard, or migrating from a vendor that is sunsetting its calendar product. Each row carries a patient_id (foreign key to the demographics table), a start_at timestamp, an optional duration in minutes, and a status from a fixed set (booked / arrived / fulfilled / cancelled / noshow). The template emits FHIR Appointment with the participant slot populated from patient_id. It is `low` risk because past appointments without diagnoses are not PHI in most jurisdictions — though the medium-risk treatment kicks in if you pair this with the demographics template in a full-data pipeline. The cascade picks up Termin, Rendez-vous, Cita, Appuntamento at zero cost.

duration_min is optional because many source systems carry end_at instead — fork the template and derive duration downstream, or leave it null. The status enum reflects FHIR Appointment.status values that make sense for historical data; "proposed" and "pending" are excluded because past appointments are not proposed or pending.

Migration scenarios & common foreign headers

Migration scenarios for the Appointment log: building a no-show-rate dashboard that needs a year of history to be meaningful, EMR backfill where the new system needs the old appointment history to display in the patient timeline, replacing a sunset vendor calendar with a modern alternative, and ad-hoc analytics imports for capacity planning. Foreign headers seen in the wild: "Patient ID / Patientennr / PID / Termin / Rendez-vous / Cita / Appuntamento / Start / Beginn / Heure / Inicio / Dauer / Durée / Duración / Durata / Status / Statut / Stato / Estado". The cascade picks up multilingual time and duration vocabulary at zero cost — appointment data is one of the highest-volume historical imports in healthcare and the heuristic layer carries the bulk of the work without LLM escalation.

Schema

The canonical column set, with the type each row carries, whether it is required, the field-level validators that fire on commit, and the multilingual header hints the cascade resolves against.

ColumnTypeRequiredValidatorsHints
patient_idstringyespatient · patient_id · pid
start_atdateyestermin · rendez-vous · cita
duration_minnumberdauer · durée · duración
statusenum

How AdaptivMapr maps your headers to this template

Five layers run in order, cheapest first. Layer 1 (Statistics) auto-accepts headers that have been mapped the same way across past uploads. Layer 2 (Heuristic) compares your header to the column name, the optional label, and every registered hint (DE / FR / IT / EN / ES) after a Unicode-and-punctuation-normalising pass. Layer 3 (Fuzzy) catches typos and reordered words. Layer 4 (Semantic) uses cached embeddings to catch the long tail of paraphrases. Layer 5 (LLM) only fires on genuinely ambiguous columns, constrained to the template’s allowed column set so it cannot invent a field. When a layer auto-accepts, the lower-cost layers below it never run — that is the cost lever.

REST · POST /v1/uploads

Pass the template_id; the cascade picks up the rest.

curl -X POST https://api.adaptivmapr.com/v1/uploads \
  -H "Authorization: Bearer $ADAPTIVMAPR_API_KEY" \
  -F "template=appointment_log_v1" \
  -F "file=@your_data.csv"

The canonical template definition is read-only at GET /v1/templates/appointment_log_v1.

MCP · Cursor / Claude Desktop

Drop AdaptivMapr into your IDE. Schema-only calls are free and unlimited.

// In Cursor or Claude Desktop with the AdaptivMapr MCP server installed:
adaptivmapr.match_headers({
  template: "appointment_log_v1",
  headers: ["patient_id", "start_at", "duration_min", "status"]
})
MCP install instructions →

FAQ — Appointment log CSV import

How do I model recurring appointments?

Each occurrence is one row. The template does not carry an RRULE because recurring is a calendar concept, not a log concept — the log is what actually happened, not what was scheduled.

What if I have appointments without a patient_id?

patient_id is required because the resulting FHIR Appointment needs a participant. Walk-in or anonymous appointments should carry a synthetic id (e.g., walkin_2026_06_04_001).

Is start_at expected in local time or UTC?

Both parse. We do not enforce a timezone — store consistently per workspace. If your source mixes timezones in one file, normalise upstream.

How do I import future appointments instead of historical ones?

The template works for both — the date_range validator is intentionally permissive. The name "log" reflects the most common use case (historical backfill); future-dated rows ingest cleanly.

Keep exploring

Browse other templates in the Healthcare pack

Appointment log CSV import API — AdaptivMapr — AdaptivMapr