Preview. Part of the Migration API — in active design and not yet generally
available. Endpoints and payloads may change. See the
overview.
status is terminal.
Authentication
Requires anx-api-key header. See Authentication.
Response by status
One of
queued, running, needs_attention, completed, failed, or
canceled.status | Body |
|---|---|
queued / running | { status, progress_message } — progress_message is a human-readable update (e.g. "Cleaning your data", "Retrying (attempt 2 of 5)"). |
needs_attention | { status, report, needs_attention: { questions[], proposed_patch } } — some rows failed validation and Vern proposes a fix. Resolve it via the decisions sub-resource below. |
completed | { status, report } — see below. |
failed | { status, error } — the plan couldn’t run even after self-healing (e.g. unrecoverable column drift). No rows were inserted. |
canceled | { status } — the run was stopped before it finished. |
invalidCellCount is the number of rows that still have at least one cell
that failed validation — not a count of individual cells. The import succeeded;
those rows are simply flagged. The clean rows are ready to deliver, and the
default CSV download (?filter=valid) excludes any flagged row entirely — so a
single bad cell drops its whole row. See Export CSV.
Reviewing flagged rows
When a run isneeds_attention, the poll response carries a needs_attention
block with everything you need to render the decision in your own UI:
self-describing questions, and a proposed_patch Vern would apply if you accept
its suggestion as-is.
failed. See Resolve flagged rows for the
full question and answer schema.
Recovering a run
If you lose arun_id (a crash, a dropped response, a page reload), you have two
ways back:
Re-send the original import. Because run creation is deduped on your
idempotency_key, re-POSTing the original import
with the same key returns the existing run instead of starting a new one.
This is the cleanest recovery if you kept the key.
Look up the active run for the company:
{ "run": null } if nothing is in flight. Omit the filter
to get a paginated history of recent runs, newest first:
An import runs for up to ~1 hour. A run whose engine died without writing a
terminal status is treated as
failed (“Import timed out”) once it goes stale,
so a lookup never reports a zombie run as forever-active.Errors
| Status | Meaning |
|---|---|
401 | API key missing or invalid. |
404 | No such run, or the company isn’t in your account. |
429 | Rate limit hit — back off and retry. |
500 | Server error. |
Example
Next
- Export CSV — get the validated rows out.
- Errors & idempotency — the dedup and recovery model.