Write

Bulk Import Contacts

Bulk-import contacts from a JSON array, raw CSV, a public CSV URL, or a storage path, with each record requiring a LinkedIn URL. Choose a merge_strategy of merge (tags union and attributes deep-merge), replace (overwrite), or skip (no-op duplicates), and read per-record skip reasons in skipped[]. Set preview=true to project the import without persisting, then commit it with the returned confirm_token.

import_contactsPOST/api/v1/contacts/import
crispy — bash

Example prompt: Preview importing this CSV of contacts with the merge strategy before committing

{
  "would_import": 240,
  "would_merge": 58,
  "would_skip": 2,
  "confirm_token": "imp_7c1a"
}
Permission scope
core
Access
Write
Category
Lead Management

What you can build

Migrate contacts from another tool by pasting CSV or pointing at a signed URL
Preview an import to see what would merge, replace, or skip before committing
Deep-merge fresh enrichment into existing contacts without losing tags
Import directly into a target list and get the resulting list size back

Parameters

Inputs accepted by import_contacts.

NameTypeDescription
contactsobject[]Array of contact objects. Each must have a LinkedIn URL. Other fields (first_name, email, company, title, etc.) are auto-mapped from common naming conventions. Max 1000/call.
csv_contentstringRaw CSV or TSV text. Server parses headers and rows automatically. No row limit.
csv_urlstringHTTPS URL of a CSV/TSV file (public HTTPS only). Server fetches it server-side, no size limit, no context overhead. Works with Supabase Storage signed URLs, Google Sheets export URLs, etc.
storage_pathstringPath inside the 'imports' Supabase Storage bucket. Must be under your own user folder (e.g. '<your-user-id>/contacts.csv'); cross-tenant paths are rejected. Upload the file under that prefix first, then call this tool with the path.
sourcestringWhere these contacts came from (e.g. 'lemlist', 'heyreach', 'expandi', 'csv'). Stored for tracking.
list_idstringOptional list ID, imported contacts are automatically added to this list. Returns list_size (total in list after import).
merge_strategy"merge" | "replace" | "skip"How to handle duplicate linkedin_url: 'merge' (default; tags UNION, attrs deep-merge), 'replace' (overwrite + null unspecified user-facing fields: first_name,last_name,email,company,title,phone,industry,location,country,status,source,source_detail,tags,custom_attrs,external_ids), 'skip' (no-op dupes).
previewbooleanIf true, project the import without persisting. Returns {would_import, would_merge, would_replace, would_skip, confirm_token}, Plan 04 wires this.
confirm_tokenstringToken from a prior preview=true call to commit the projected import.

The complete LinkedIn API. Ready when you are.

Connect your first LinkedIn profile in under 5 minutes. Every tool, every seat, no feature gates. Safe limits, warm-up, and full permission control built in.