Contacts
A contact is a person. Leads are enquiries attached to contacts, so one contact can carry many leads over time.
Create
curl -X POST https://api.leadx.in/api/key/protected/contact \
-H "apikey: $KEY" -H "Content-Type: application/json" \
-d '{
"formData": {
"name": "Alan Turing",
"email": "alan@example.com",
"contactNumber": { "countryCode": "44", "number": "7700900123" },
"jobTitle": "Chief Scientist",
"companyData": { "name": "Bletchley Ltd", "website": "bletchley.example", "size": "51-200" },
"social": { "linkedin": "https://linkedin.com/in/example" },
"city": "London",
"country": "United Kingdom"
},
"tags": ["665a..."],
"category": "665b..."
}'
Unlike leads, everything goes inside formData — including nested groups. tags and category sit at the top level. contactcategories is accepted as an alias for category.
Nested paths can be written either way: {"companyData": {"name": "Acme"}} or {"companyData.name": "Acme"}.
See Custom fields for the full system field list and the allowed values for companyData.size and companyData.industry.
Duplicates
Contacts are matched on your company's configured unique key — email by default. Creating a contact that already exists returns ContactAlreadyExists_400. In a bulk create that failure is per-row, so the rest of the batch still lands.
Create many
curl -X POST https://api.leadx.in/api/key/protected/contact/bulk \
-H "apikey: $KEY" -H "Content-Type: application/json" \
-d '{ "items": [ { "formData": { "email": "a@example.com" } },
{ "formData": { "email": "b@example.com" } } ] }'
Up to 500 per request, partial success, per-row errors indexed to your input array. For larger loads use imports.
The same enrich / genie automation block works here, read once from the top level and applied to the batch.
List
curl -G https://api.leadx.in/api/key/protected/contact \
-H "apikey: $KEY" \
--data-urlencode 'p=1' --data-urlencode 'n=100' \
--data-urlencode 'searchBy=name,email' \
--data-urlencode 'searchValue=turing'
Update and delete
PUT /contact/:id— one contact.PUT /contact— bulk update withids/selectAll.DELETE /contact—{ "ids": [...] }. Soft delete, same as leads.
Enrichment
curl -X POST https://api.leadx.in/api/key/protected/enrich/contact \
-H "apikey: $KEY" -H "Content-Type: application/json" \
-d '{ "ids": ["665f..."] }'
Scrapes the contact's company website for firmographics and social profiles, filling companyData, social and description where they are empty. Existing values are not overwritten.
Poll enrichmentStatus on the contact to follow progress.
Organising contacts
| Concept | Endpoints | Notes |
|---|---|---|
| Tags | /tag, /tag/:id | Many-to-many labels. Free-form. |
| Categories | /contact-category, /contact-category/:id | One category per contact. |
| Teams | /team, /team/:id | Ownership and lead visibility. |
| Segments | /segment | Saved filters; the unit campaigns target. |
Tags and categories have no bulk DELETE on the collection — the routes are present in source but commented out. Delete them one at a time through the app, or reassign contacts instead.
Call logs
Telephony activity attaches to contacts:
| Method | Endpoint |
|---|---|
GET / POST / DELETE | /calllog |
POST | /calllog/bulk |
GET / PUT | /calllog/:id |
POST /calllog/bulk is the endpoint to use when syncing a call history export from a dialer.