HR & People pack
Time off CSV import API
Import leave and absence records from any CSV. Type and status enum-bounded, start/end dates locale-detected, multilingual headers.
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"Canonical columns
The whole schema, printed as it ships.
Every canonical column, 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. This is the shipped definition, not a summary of it.
time_off_v1- fields
- 6
- required
- 3
- validated
- 0
- hints
- 28
| Canonical column | Type | Required | Validators | Header hints the cascade matches |
|---|---|---|---|---|
employee_id | string | yes | — | personalnummermatriculematricolaemployee idnúmero de empleado |
type | enumvacationsickparentalunpaid | — | — | arttypetipourlaubsart |
start_date | date | yes | — | startdatumdate de débutdata iniziostart datefecha de inicio |
end_date | date | yes | — | enddatumdate de findata fineend datefecha de fin |
days | number | — | — | tagejoursgiornidaysdías |
status | enumrequestedapprovedrejectedcancelled | — | — | statusstatutstatoestado |
Read the same definition as JSON at GET /v1/templates/time_off_v1. A hint match resolves on layer 2 — no LLM call, no token spend, just the flat per-map fee. Hover a validator id to see what it checks.
- 6 canonical fields
- 3 required
- 0 validated
- 28 header hints, 5 languages
Why it exists
Written for the file you actually receive.
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, 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 & the foreign headers they ship
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.
The cascade
Six layers, and the cheapest one wins.
Layers run in order and stop the moment a column resolves. That is the single biggest cost lever in the system: a column caught on layer 2 never reaches the metered layer 5.
- L1Statisticsno LLM
Auto-accepts a header that past confirmations already resolved the same way, at {minN:100, minRatio:0.95} or {minN:20, minRatio:1.00}.
- L2Heuristicno LLM
Normalises accents, punctuation and whitespace, then compares against the column name, the label, and every registered hint (DE / FR / IT / EN / ES).
- L3Fuzzyno LLM
Token-set ratio plus Levenshtein over the normalised strings. Auto-accepts at 0.80 — it absorbs typos and reordered words.
- L4Semanticcheap, cached
Embedding cosine between the header and the field’s label + hints. Catches the long tail of paraphrases.
- L5LLMmetered
Everything still unresolved goes up in ONE batched, collision-aware call, constrained to this template’s column set so it cannot invent a field.
Try it
One template id, two ways in.
REST for your import pipeline, MCP for your editor. Both run the same cascade and both honour the same schema-only clamp.
REST · POST /v1/uploads
Name the template; the cascade picks up the rest. The canonical definition is read-only at GET /v1/templates/time_off_v1.
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"MCP · Cursor / Claude Desktop
Drop AdaptivMapr into your editor and call the same cascade as a tool. Schema-only calls leave only column names and up to three clamped sample rows.
// In Cursor or Claude Desktop with the AdaptivMapr MCP server installed:
adaptivmapr.match_headers({
template_id: "time_off_v1",
headers: ["employee_id", "type", "start_date", "end_date"]
})Questions
Time off CSV import — FAQ
Can I extend the type enum (e.g. "bereavement", "jury_duty")?
Do I have to provide the days count?
How are half-days or partial-day absences handled?
Is time-off data sensitive?
Map time off in production — without shipping raw records.
Schema-only mode leaves only headers and a handful of clamped samples. Add full-data when you need row-level AI, routed in-region under a BAA.