Skip to main content
This walks through one customer migration from start to finish. All requests authenticate with an x-api-key header — see Authentication. The base URL is https://app.vern.so/api/v1.
1

Set up your sources and templates (one time, in the UI)

Before any API calls, set up your sources and templates in the Vern dashboard — the target shape you want every customer’s data to land in. There’s no import plan to author or freeze: the managed agent builds and reuses the mapping logic for you at run time. See Core concepts.
2

Discover sources and templates (optional)

To let your customer pick which system they’re migrating from and which objects to import, list your sources and templates and render them in your own UI. Skip this if you already know the names and slugs.
Feed the chosen source name into source and the chosen template slugs into templates below. See List sources and List templates.
3

Create a migration for the customer

Create a migration, optionally naming the source the data comes from. You get back the id used by every later call.
Use migration.id for every later call. See Create a migration for every field.
4

Upload the customer's files

Ask for one signed upload URL per file, then PUT the bytes straight to storage. Files are workbook-level — you don’t map them to templates.
Then PUT each file to its signed_url:
See Upload files for listing and limits.
5

Generate a preview

Start a generate run. The agent authors the mapping logic and stops at a preview. The call is async — it returns a run to poll.
See Start a run for every kind.
6

Poll until the run is awaiting approval

Poll the run every couple of seconds until status is terminal for this phase — for a generate run that’s awaiting_approval.
If it comes back blocked instead, the agent has a question — see the next step. See Poll a run for every status shape.
7

Answer the agent (only if it asks)

A blocked poll response carries plain-language questions — render them in your own UI, then send the answer to the run’s messages sub-resource:
The agent resumes — poll again until it’s awaiting_approval (or it blocks once more with a fresh question). See Answer the agent.
8

Review the preview

Fetch the proposed output, sheet-per-template, and show it to your customer.
Not right yet? Refine it with an update run ({ "kind": "update", "message": "Use the company domain for missing emails" }) or ask a read-only clarify question — both produce a fresh preview / answer. See Get the preview and Start a run.
9

Execute the import

Happy with the preview? Start an execute run to import for real.
Poll until it’s completed:
A completed execute with invalidCellCount > 0 means that many rows still have at least one cell that failed validation — the rest are clean. The default CSV download (?filter=valid) excludes those rows. See Poll a run.
10

Deliver the clean data

Download a sheet’s validated rows as a CSV, addressed by template slug (valid rows only, by default):
See Export CSV for filters and streaming into your own storage.

Next