Contact Import Upload Init
Contacts
Start a CSV Upload
Issue a presigned S3 PUT URL so the browser uploads the CSV directly
(bypassing the Next.js server-action body limit). Returns the URL + the
s3_key to pass to preview/import.
POST
Contact Import Upload Init
Importing contacts is a 3-step flow so a large file is uploaded directly to storage rather than proxied through an API request body, and so mapping columns is a separate, correctable step from committing rows: upload-init (this endpoint — get a presigned URL, PUT the file directly to S3) → preview (see detected columns + a sample) → import (confirm the mapping, get an
import_id back immediately, poll for the result). All three calls share a 15 MB file-size cap and require CRM manage scope.
Issues a presigned S3 PUT URL scoped to the caller’s organization (object key is {org_id}/imports/{random}/{sanitized filename}). The client uploads the raw CSV bytes directly to upload_url with a text/csv content type, then passes the returned s3_key to preview/import. A client that understates the declared size isn’t blocked here — it’s still caught later, when Preview reads the actual object back.
Auth
Requires a CRM manage scope and an active organization on the token. Any*:manage scope qualifies — in practice contacts:manage, deals:manage, companies:manage, or activities:manage.
Response
Errors
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Response
Successful Response
The response is of type Response Contact Import Upload Init Contacts Import Upload Init Post · object.