Import contacts or conversations safely within API limits and without duplicate writes.
The public API does not provide a general asynchronous import endpoint. Build imports as resumable jobs over the normal contact and conversation operations.
429 using Retry-After.Keep concurrency below the global 300-requests-per-minute IP limit and reduce it further when other production traffic shares the same egress IP.
for await (const row of importRows()) {
if (await mappings.has(row.sourceId)) continue;
const contact = await createContact(row);
await mappings.put(row.sourceId, contact.id);
}Write validation failures to a dead-letter report with the source row, status code, and field errors.
Do not retry 422 unchanged. Reconcile timeouts before repeating POST requests.