Skip to main content
POST
Import a file
Upload a conversation export, document or transcript for import and return immediately with a job id. The file is validated and stored, then a background worker parses, chunks, embeds and links it. Send the file as multipart/form-data. Poll GET /v1/ingest/{job_id}/status for progress and GET /v1/import for history. The job is scoped to the effective subject (the API key owner by default, or the subject named by X-Exo-Subject).

Authorization

This route requires the write scope. A missing or invalid credential returns 401 authentication_error. A valid credential without the scope returns 403 permission_denied, and the problem body names the exact scope required.

Headers

These are request conventions the contract does not declare as parameters, so they do not appear in the schema tables below.

Success responses

Errors

Every error is an RFC 9457 application/problem+json body carrying a stable code, a requestId, and a suggestedAction where Exo has one. See Errors.

Notes

  • This route takes multipart/form-data, not JSON. That is also why it does not honour Idempotency-Key: the replay engine fingerprints a JSON body, and multipart boundaries differ on every client attempt.
  • Poll two different places. GET /v1/ingest/{job_id}/status for this job’s progress, GET /v1/import for the subject’s import history.

Authorizations

X-Exo-API-Key
string
header
required

An Exo API key (exo_...) sent as the X-Exo-API-Key header.

Body

multipart/form-data
file
string
required

Response

The accepted import job.

202 response for /v1/ingest and /v1/import: the durably-queued job.

jobId
string
required
status
string
default:pending