HeadHoncho

Commit import

Commit import is a command in the HeadHoncho API. Import every clean row of the staged files: the jobs, then the money on them. Rows already here are skipped, so sending it twice adds nothing.

Read as Markdown

The request

Reference for Commit import, HeadHoncho API v1. It is a command, sent to the base address https://api.headhoncho.app.

POST /api/v1/commands/commit-import

The key needs the Jobs area at do. An answered call costs 1 credit; a refusal costs nothing. See credits.

It runs the app's own command commit-import. Send an Idempotency-Key header with every call: the same key with the same body returns the first answer and runs nothing twice. See the model.

Parameters

NameKindRequiredDescriptionExample
company_idid, in the JSON bodyYesThe company the jobs land in. From Who am I.cmp_14f5
plantext, in the JSON bodyYesThe staged files as a JSON list. Each item: staging_id (from Stage an import file), half (jobs, money or payments), mapping (field to column numbers) and date_order.[{"staging_id": "k3Zp...", "half": "jobs", "mapping": {"ref": [0], "client_name": [1]}}]
status_mapobject, in the JSON bodyNoThe file's status word to a target, from Map statuses.{"Done": "st_06"}
type_mapobject, in the JSON bodyNoThe file's job-type word to a target, from Map job types.{"Local Move": "jt_02"}
worker_mapobject, in the JSON bodyNoThe file's technician name to one of our worker ids, or null to leave that technician's jobs unassigned.{"Dana R.": "wrk_3b90"}
decisionsobject, in the JSON bodyNoYour answers where the two files disagree, from Preview an import's decisions: the decision key to the side chosen, jobs (the jobs file's value) or money (the money file's).{"W-1001:status": "money"}
systemtext, in the JSON bodyNoThe system the file came from, a key from Import sources. The answers are remembered for it.workiz

Try it with your key

Paste your key and change the values. The box builds the call as a cURL line and a fetch line, ready to copy. It never sends anything itself.

Your key stays in this page and is never sent anywhere. Copy the line below and run it yourself.

What comes back

accepted and position, then per row what landed: imported (line, ticket, new job number, gaps), skipped (already here) and refused (with the reasons), counts, gaps, finance and payments (their own imported, skipped, refused and counts), and figures. The answer is 201 when anything landed.

It never deletes anything. It changes only what the command names, and it writes the change to the job's history with who asked for it.

Every field in the answer

Types are read from the example answer. Money is a plain number in the company's currency. A time carries its offset from UTC (Z is UTC). Ids are opaque text. A field with no line of its own here has its name spelled out; the common fields mean the same on every page.

FieldTypeMeaning
acceptedtrue or falseTrue when the command ran. A command that cannot run is an error instead.
positionwhole numberWhere the change landed in the event log. Pass it as after on a read to see your own write.
importedlist of objectsThe imported.
imported[].linewhole numberThe line.
imported[].tickettextThe job number the ticket shows.
imported[].numberwhole numberThe number people say out loud, such as the job number.
imported[].gapslistThe gaps.
skippedlistThe skipped.
refusedlist of objectsThe refused.
refused[].linewhole numberThe line.
refused[].tickettextThe job number the ticket shows.
refused[].reasonslist of textThe reasons.
countsobjectThe counts.
counts.importedwhole numberThe imported.
counts.skippedwhole numberThe skipped.
counts.refusedwhole numberThe refused.
counts.incompletewhole numberThe incomplete.
exampleswhole numberThe examples.
financeobjectThe finance.
finance.importedlistThe imported.
finance.skippedlistThe skipped.
finance.refusedlistThe refused.
finance.countsobjectThe counts.
finance.counts.importedwhole numberThe imported.
finance.counts.skippedwhole numberThe skipped.
finance.counts.refusedwhole numberThe refused.
paymentsobjectThe payments.
payments.importedlistThe imported.
payments.skippedlistThe skipped.
payments.refusedlistThe refused.
payments.countsobjectThe counts.
payments.counts.importedwhole numberThe imported.
payments.counts.skippedwhole numberThe skipped.
payments.counts.refusedwhole numberThe refused.
payments.counts.amountmoney (decimal as text)The amount. In the company's currency.
figuresobjectThe figures.
figures.moneyvalue or nullThe money.
figures.paymentsvalue or nullThe payments.
figures.spanvalue or nullThe span.

Safe to send twice

Every job is stored under its reference from the old system, or a stand-in made from the row's own facts. A row already imported is skipped, so a second commit of the same files lands nothing new. The staged file lives for an hour; after that Commit answers that the upload expired and you stage it again.

Run Rehearse first

Rehearse an import runs the same code and keeps nothing.

What the app does that this leaves out

The app can also close the imported balances in the same step. That option is not offered here; use Close a balance afterwards.

Mapping is remembered

With system, the status, job-type and column answers are saved for the next import from that system, as in the app.

Errors that apply

CodeStatusWhat it means
`missing_key`401Send your key as Authorization: Bearer hh_live_...
`unknown_key`401That key is not one we issued, or it was revoked.
`no_access`403This credential does not reach that. Ask the person who made it for access.
`read_only`403This credential may read this area but not change it.
`not_found`404No such record in the companies this credential reaches.
`out_of_scope`404No such company in the companies this credential reaches.
`invalid`422Some fields were refused. See fields.
`missing_idempotency_key`400Send an Idempotency-Key header on every command.
`idempotency_mismatch`409This Idempotency-Key was used with a different body.
`idempotency_in_progress`409A command with this Idempotency-Key is still running. Wait a moment and send it again.
`no_credits`402Out of credits. Top up on Settings › Credits, or turn on auto top-up.
  • List import systems: The systems a book can be imported from, and for each the steps to get its file out, what the file cannot carry, and which one this workspace used last.
  • Get import fields: Every field an import reads, for the jobs file and the money file: its label, its tier and what leaving it blank costs.
  • Get import template: A CSV to fill in, with every column the import reads and three example rows, for the jobs file, the money file or a payments list.
  • Stage import: Send one export file (CSV or Excel) and get back what each column looks like and the mapping we propose. Nothing is imported yet.
  • List import statuses: The status words the staged files use, how many rows carry each, and which of our statuses each should land on. Nothing is written.
  • List import job types: The job-type words the staged files use, how many rows carry each, and which of our job types each should land on. Nothing is written.
  • Preview import: Read the staged files against this workspace and say what an import would do, row by row: what lands, what is already here, what is refused and why.
  • Rehearse import: Run the whole import for real inside one step that is then thrown away, and say what it would have landed and refused. Nothing is kept.
  • The same records in the app: the Jobs panel.
  • How the API fits together: the model, API keys, errors and the MCP server.