Skip to main content
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

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Body

application/json

Request a presigned S3 PUT URL for a contact-import CSV.

filename
string
required

Original CSV filename; sanitized into the S3 key.

Minimum string length: 1
size
integer | null

Declared file size in bytes, checked against the 15 MB cap before issuing the URL.

Response

Successful Response

The response is of type Response Contact Import Upload Init Contacts Import Upload Init Post · object.