AdaptivMapr

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.

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"
→ 6 canonical fields · 0 validated · low risk

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 columnTypeRequiredValidatorsHeader hints the cascade matches
employee_idstringyes—personalnummermatriculematricolaemployee idnúmero de empleado
typeenumvacationsickparentalunpaid——arttypetipourlaubsart
start_datedateyes—startdatumdate de débutdata iniziostart datefecha de inicio
end_datedateyes—enddatumdate de findata fineend datefecha de fin
daysnumber——tagejoursgiornidaysdías
statusenumrequestedapprovedrejectedcancelled——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.

  1. 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}.

  2. L2Heuristicno LLM

    Normalises accents, punctuation and whitespace, then compares against the column name, the label, and every registered hint (DE / FR / IT / EN / ES).

  3. L3Fuzzyno LLM

    Token-set ratio plus Levenshtein over the normalised strings. Auto-accepts at 0.80 — it absorbs typos and reordered words.

  4. L4Semanticcheap, cached

    Embedding cosine between the header and the field’s label + hints. Catches the long tail of paraphrases.

  5. 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.

bash
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"
→ upload created · mappings ready · confirm before commit

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.

mcp
// 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"]
})
schema-only · headers and ≤3 rows, 80 chars each
MCP install instructions

Questions

Time off CSV import — FAQ

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, and even then only headers plus three clamped sample rows are processed.

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.

Time off CSV import API — AdaptivMapr — AdaptivMapr