Skip to main content
Files are workbook-level — you upload them to the migration, not to a specific template; the generate run reads whatever’s been uploaded. Uploading is a two-step handshake: ask for a signed URL, then PUT the bytes straight to storage. {migration_id} is the id from creating a migration.

Authentication

Requires an x-api-key header. See Authentication.

Mint signed upload URLs

Request one entry per file, declaring its name (and, ideally, content type):
files
object[]
required
A non-empty array of files to upload. Each entry is { "name": "contacts.csv", "content_type": "text/csv" }. name is required; content_type is optional but recommended.
201 Created — one signed upload per requested file:
files[].name
string
The display name you requested, preserved for the round trip.
files[].storage_path
string
Where the object will land in storage once uploaded.
files[].signed_url
string
The single-use URL to PUT the file’s bytes to. The upload token is embedded in the URL.
files[].token
string
The raw upload token, if you prefer a storage SDK’s uploadToSignedUrl helper over a plain PUT.

Upload the bytes

PUT each file’s raw bytes to its signed_url, with a Content-Type matching what you declared:
Once your files are up, start a generate run.

List uploaded files

Lists the customer-uploaded files for the migration — useful to confirm an upload landed before generating.

Errors

Next

  • Start a run — generate a preview from the uploaded files.
  • Poll a run — track the run to completion.