Time off CSV import API
time_off_v1
Import this template via API. Import leave and absence records from any CSV. Type and status enum-bounded, start/end dates locale-detected, multilingual headers.
30-second curl
curl -X POST https://api.adaptivmapr.com/v1/uploads \ -H "Authorization: Bearer $ADAPTIVMAPR_API_KEY" \ -F "template=time_off_v1" \ -F "file=@your_data.csv"
At a glance
- Pack
- HR & People
- FHIR resource
- —
- Risk level
- low
- Fields
- 6 (3 required, 0 validated)
Why it exists
Why this template?
The Time off template is the canonical schema for leave and absence records — the file an HRIS leave export, an absence-tracking dump, or a hand-kept holiday spreadsheet reduces to. Each row carries an employee_id (required), a type enum (vacation / sick / parental / unpaid), a start_date and end_date (both required), an optional days count, and a status enum that walks the request through requested → approved → rejected → cancelled. HR and people-ops teams reach for it when migrating between absence systems, when backfilling a leave-balance engine with history, and when consolidating absence data after an acquisition. It is the lowest-risk template in the HR pack — leave metadata, not salary or bank detail — so it runs in schema-only mode for free, with only headers and clamped sample cells processed to decide the mapping.
employee_id, start_date, and end_date are required — an absence without a window is not a record. type lands in {vacation, sick, parental, unpaid} and status in {requested, approved, rejected, cancelled}, or each surfaces as an error in the dry-run. start_date and end_date auto-detect ISO, US, and EU formats. days is an optional number because many sources carry the date window and compute duration downstream. Hints cover DE / FR / IT / ES / EN so a multilingual absence export does not escalate to the LLM.
Migration scenarios & common foreign headers
Migration scenarios for the Time off template: porting absence history between HRIS or dedicated leave tools (Personio → Workday absence, Absence.io → a new system) so balances carry over, backfilling a leave-accrual engine with prior-year history, building an absence-rate dashboard that needs a year of data to be meaningful, and consolidating leave records after a headcount acquisition. Foreign headers we see weekly: "Personalnummer / Matricule / Matricola / Número de empleado / Urlaubsart / Art / Type / Tipo / Startdatum / Date de début / Data inizio / Fecha de inicio / Enddatum / Date de fin / Data fine / Fecha de fin / Tage / Jours / Giorni / Días / Status / Statut / Stato / Estado". The cascade catches every one through the registered hints without an LLM call.
Canonical columns
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.
| Column | Type | Required | Validators | Hints |
|---|---|---|---|---|
| employee_id | string | yes | — | personalnummer · matricule · matricola · employee id · número de empleado |
| type | enum | — | — | art · type · tipo · urlaubsart |
| start_date | date | yes | — | startdatum · date de début · data inizio · start date · fecha de inicio |
| end_date | date | yes | — | enddatum · date de fin · data fine · end date · fecha de fin |
| days | number | — | — | tage · jours · giorni · days · días |
| status | enum | — | — | status · statut · stato · estado |
The cascade
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=time_off_v1" \ -F "file=@your_data.csv"
The canonical template definition is read-only at GET /v1/templates/time_off_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: "time_off_v1",
headers: ["employee_id", "type", "start_date", "end_date"]
})MCP install instructions →Questions
FAQ — Time off CSV import
Can I extend the type enum (e.g. "bereavement", "jury_duty")?
Yes — fork the template and edit enum_values. The canonical set (vacation / sick / parental / unpaid) is the cross-system intersection; jurisdiction- or company-specific leave types are first-class in the workspace fork.
Do I have to provide the days count?
No — days is optional. Many sources carry only the start/end window; downstream logic computes working days against your holiday calendar. The template preserves days when the source ships it.
How are half-days or partial-day absences handled?
Carry the fraction in the optional days field (e.g. 0.5). The canonical row models the window plus a numeric duration; finer-grained part-day rules live in the workspace fork.
Is time-off data sensitive?
It is the lowest-risk template in the HR pack — leave metadata, not salary or health detail. It runs in schema-only mode for free, and even then only headers plus three clamped sample rows are processed.