Contacts
The people you sell to: create, update, merge and restore them.
List contacts
GET/api/v1/contacts/
Parameters
cursorquery, string- Opaque pagination cursor (follow next/previous URLs).
searchquery, stringorderingquery, string- Field to order by; prefix with '-' for descending.
Response fields 27
created_sourceenumcreated_source_labelstringidstring (uuid)organisationstring (uuid)companyobjectfirst_namestringlast_namestringfull_namestringjob_titlestringemailstring (email)email_secondarystring (email)phone_country_codestringphonestringphone_secondary_country_codestringphone_secondarystringwhatsapp_country_codestringwhatsapp_numberstringopted_out_channelsobjectlast_activity_atstring (date-time)created_atstring (date-time)updated_atstring (date-time)created_by_uuidobjectcreated_by_usernameobjectcreated_by_first_nameobjectcreated_by_last_nameobjectcreated_by_nameobjectcustom_fieldsobject
curl "https://api.vivrecrm.com/api/v1/contacts/" \
-H "X-Api-Key: $VIVRE_API_KEY"
import os, requests
resp = requests.get(
"https://api.vivrecrm.com/api/v1/contacts/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
)
print(resp.json())
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/", {
method: "GET",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
},
});
console.log(await resp.json());
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"created_source": "api_key",
"created_source_label": "",
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"organisation": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"company": {
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"name": "Kaveri Foods"
},
"first_name": "Asha",
"last_name": "Rao",
"full_name": "Asha Rao",
"job_title": "Head of Operations",
"email": "[email protected]",
"email_secondary": "[email protected]",
"phone_country_code": "+91",
"phone": "9876543210",
"phone_secondary_country_code": "",
"phone_secondary": "",
"whatsapp_country_code": "+91",
"whatsapp_number": "9876543210",
"opted_out_channels": {},
"last_activity_at": "2026-10-17T09:30:00+05:30",
"created_at": "2026-10-17T09:30:00+05:30",
"updated_at": "2026-10-17T09:30:00+05:30",
"created_by_uuid": null,
"created_by_username": null,
"created_by_first_name": null,
"created_by_last_name": null,
"created_by_name": null,
"custom_fields": {}
}
]
}
Create contact
POST/api/v1/contacts/
Parameters
Idempotency-Keyheader, string- Unique key for safe retries (24h replay window).
Body
first_namestringRequiredcompany_public_idstring (uuid), can be nulllast_namestringjob_titlestringemailstring (email), can be nullemail_secondarystring (email), can be nullphone_country_codestringphonestring, can be nullphone_secondary_country_codestringphone_secondarystring, can be nullwhatsapp_country_codestringwhatsapp_numberstring, can be nullopted_out_channelsobjectcustom_fieldsobject
Response fields 27
created_sourceenumcreated_source_labelstringidstring (uuid)organisationstring (uuid)companyobjectfirst_namestringlast_namestringfull_namestringjob_titlestringemailstring (email)email_secondarystring (email)phone_country_codestringphonestringphone_secondary_country_codestringphone_secondarystringwhatsapp_country_codestringwhatsapp_numberstringopted_out_channelsobjectlast_activity_atstring (date-time)created_atstring (date-time)updated_atstring (date-time)created_by_uuidobjectcreated_by_usernameobjectcreated_by_first_nameobjectcreated_by_last_nameobjectcreated_by_nameobjectcustom_fieldsobject
Can also return 400.
curl -X POST "https://api.vivrecrm.com/api/v1/contacts/" \
-H "X-Api-Key: $VIVRE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"first_name": "Asha", "last_name": "Rao", "job_title": "Head of Operations", "email": "[email protected]"}'
import os, requests
resp = requests.post(
"https://api.vivrecrm.com/api/v1/contacts/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
json={
"first_name": "Asha",
"last_name": "Rao",
"job_title": "Head of Operations",
"email": "[email protected]"
},
)
print(resp.json())
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/", {
method: "POST",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"first_name": "Asha",
"last_name": "Rao",
"job_title": "Head of Operations",
"email": "[email protected]"
}),
});
console.log(await resp.json());
{
"created_source": "api_key",
"created_source_label": "",
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"organisation": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"company": {
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"name": "Kaveri Foods"
},
"first_name": "Asha",
"last_name": "Rao",
"full_name": "Asha Rao",
"job_title": "Head of Operations",
"email": "[email protected]",
"email_secondary": "[email protected]",
"phone_country_code": "+91",
"phone": "9876543210",
"phone_secondary_country_code": "",
"phone_secondary": "",
"whatsapp_country_code": "+91",
"whatsapp_number": "9876543210",
"opted_out_channels": {},
"last_activity_at": "2026-10-17T09:30:00+05:30",
"created_at": "2026-10-17T09:30:00+05:30",
"updated_at": "2026-10-17T09:30:00+05:30",
"created_by_uuid": null,
"created_by_username": null,
"created_by_first_name": null,
"created_by_last_name": null,
"created_by_name": null,
"custom_fields": {}
}
Retrieve a contact
GET/api/v1/contacts/{public_id}/
Parameters
public_idpath, stringRequired- The record's public id (a UUID).
Response fields 27
created_sourceenumcreated_source_labelstringidstring (uuid)organisationstring (uuid)companyobjectfirst_namestringlast_namestringfull_namestringjob_titlestringemailstring (email)email_secondarystring (email)phone_country_codestringphonestringphone_secondary_country_codestringphone_secondarystringwhatsapp_country_codestringwhatsapp_numberstringopted_out_channelsobjectlast_activity_atstring (date-time)created_atstring (date-time)updated_atstring (date-time)created_by_uuidobjectcreated_by_usernameobjectcreated_by_first_nameobjectcreated_by_last_nameobjectcreated_by_nameobjectcustom_fieldsobject
Can also return 404.
curl "https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/" \
-H "X-Api-Key: $VIVRE_API_KEY"
import os, requests
resp = requests.get(
"https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
)
print(resp.json())
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/", {
method: "GET",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
},
});
console.log(await resp.json());
{
"created_source": "api_key",
"created_source_label": "",
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"organisation": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"company": {
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"name": "Kaveri Foods"
},
"first_name": "Asha",
"last_name": "Rao",
"full_name": "Asha Rao",
"job_title": "Head of Operations",
"email": "[email protected]",
"email_secondary": "[email protected]",
"phone_country_code": "+91",
"phone": "9876543210",
"phone_secondary_country_code": "",
"phone_secondary": "",
"whatsapp_country_code": "+91",
"whatsapp_number": "9876543210",
"opted_out_channels": {},
"last_activity_at": "2026-10-17T09:30:00+05:30",
"created_at": "2026-10-17T09:30:00+05:30",
"updated_at": "2026-10-17T09:30:00+05:30",
"created_by_uuid": null,
"created_by_username": null,
"created_by_first_name": null,
"created_by_last_name": null,
"created_by_name": null,
"custom_fields": {}
}
Replace a contact
PUT/api/v1/contacts/{public_id}/
Parameters
public_idpath, stringRequired- The record's public id (a UUID).
Body
first_namestringRequiredcompany_public_idstring (uuid), can be nulllast_namestringjob_titlestringemailstring (email), can be nullemail_secondarystring (email), can be nullphone_country_codestringphonestring, can be nullphone_secondary_country_codestringphone_secondarystring, can be nullwhatsapp_country_codestringwhatsapp_numberstring, can be nullopted_out_channelsobjectcustom_fieldsobject
Response fields 27
created_sourceenumcreated_source_labelstringidstring (uuid)organisationstring (uuid)companyobjectfirst_namestringlast_namestringfull_namestringjob_titlestringemailstring (email)email_secondarystring (email)phone_country_codestringphonestringphone_secondary_country_codestringphone_secondarystringwhatsapp_country_codestringwhatsapp_numberstringopted_out_channelsobjectlast_activity_atstring (date-time)created_atstring (date-time)updated_atstring (date-time)created_by_uuidobjectcreated_by_usernameobjectcreated_by_first_nameobjectcreated_by_last_nameobjectcreated_by_nameobjectcustom_fieldsobject
curl -X PUT "https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/" \
-H "X-Api-Key: $VIVRE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"first_name": "Asha", "last_name": "Rao", "job_title": "Head of Operations", "email": "[email protected]"}'
import os, requests
resp = requests.put(
"https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
json={
"first_name": "Asha",
"last_name": "Rao",
"job_title": "Head of Operations",
"email": "[email protected]"
},
)
print(resp.json())
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/", {
method: "PUT",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"first_name": "Asha",
"last_name": "Rao",
"job_title": "Head of Operations",
"email": "[email protected]"
}),
});
console.log(await resp.json());
{
"created_source": "api_key",
"created_source_label": "",
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"organisation": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"company": {
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"name": "Kaveri Foods"
},
"first_name": "Asha",
"last_name": "Rao",
"full_name": "Asha Rao",
"job_title": "Head of Operations",
"email": "[email protected]",
"email_secondary": "[email protected]",
"phone_country_code": "+91",
"phone": "9876543210",
"phone_secondary_country_code": "",
"phone_secondary": "",
"whatsapp_country_code": "+91",
"whatsapp_number": "9876543210",
"opted_out_channels": {},
"last_activity_at": "2026-10-17T09:30:00+05:30",
"created_at": "2026-10-17T09:30:00+05:30",
"updated_at": "2026-10-17T09:30:00+05:30",
"created_by_uuid": null,
"created_by_username": null,
"created_by_first_name": null,
"created_by_last_name": null,
"created_by_name": null,
"custom_fields": {}
}
Update a contact
PATCH/api/v1/contacts/{public_id}/
Parameters
public_idpath, stringRequired- The record's public id (a UUID).
Body
first_namestringRequiredcompany_public_idstring (uuid), can be nulllast_namestringjob_titlestringemailstring (email), can be nullemail_secondarystring (email), can be nullphone_country_codestringphonestring, can be nullphone_secondary_country_codestringphone_secondarystring, can be nullwhatsapp_country_codestringwhatsapp_numberstring, can be nullopted_out_channelsobjectcustom_fieldsobject
Response fields 27
created_sourceenumcreated_source_labelstringidstring (uuid)organisationstring (uuid)companyobjectfirst_namestringlast_namestringfull_namestringjob_titlestringemailstring (email)email_secondarystring (email)phone_country_codestringphonestringphone_secondary_country_codestringphone_secondarystringwhatsapp_country_codestringwhatsapp_numberstringopted_out_channelsobjectlast_activity_atstring (date-time)created_atstring (date-time)updated_atstring (date-time)created_by_uuidobjectcreated_by_usernameobjectcreated_by_first_nameobjectcreated_by_last_nameobjectcreated_by_nameobjectcustom_fieldsobject
curl -X PATCH "https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/" \
-H "X-Api-Key: $VIVRE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"first_name": "Asha", "last_name": "Rao", "job_title": "Head of Operations", "email": "[email protected]"}'
import os, requests
resp = requests.patch(
"https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
json={
"first_name": "Asha",
"last_name": "Rao",
"job_title": "Head of Operations",
"email": "[email protected]"
},
)
print(resp.json())
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/", {
method: "PATCH",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"first_name": "Asha",
"last_name": "Rao",
"job_title": "Head of Operations",
"email": "[email protected]"
}),
});
console.log(await resp.json());
{
"created_source": "api_key",
"created_source_label": "",
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"organisation": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"company": {
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"name": "Kaveri Foods"
},
"first_name": "Asha",
"last_name": "Rao",
"full_name": "Asha Rao",
"job_title": "Head of Operations",
"email": "[email protected]",
"email_secondary": "[email protected]",
"phone_country_code": "+91",
"phone": "9876543210",
"phone_secondary_country_code": "",
"phone_secondary": "",
"whatsapp_country_code": "+91",
"whatsapp_number": "9876543210",
"opted_out_channels": {},
"last_activity_at": "2026-10-17T09:30:00+05:30",
"created_at": "2026-10-17T09:30:00+05:30",
"updated_at": "2026-10-17T09:30:00+05:30",
"created_by_uuid": null,
"created_by_username": null,
"created_by_first_name": null,
"created_by_last_name": null,
"created_by_name": null,
"custom_fields": {}
}
Delete a contact
DELETE/api/v1/contacts/{public_id}/
Parameters
public_idpath, stringRequired- The record's public id (a UUID).
curl -X DELETE "https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/" \
-H "X-Api-Key: $VIVRE_API_KEY"
import os, requests
resp = requests.delete(
"https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
)
print(resp.status_code)
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/", {
method: "DELETE",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
},
});
console.log(resp.status);
Restore soft-deleted contact
POST/api/v1/contacts/{public_id}/restore/
Parameters
public_idpath, stringRequired- The record's public id (a UUID).
Response fields 27
created_sourceenumcreated_source_labelstringidstring (uuid)organisationstring (uuid)companyobjectfirst_namestringlast_namestringfull_namestringjob_titlestringemailstring (email)email_secondarystring (email)phone_country_codestringphonestringphone_secondary_country_codestringphone_secondarystringwhatsapp_country_codestringwhatsapp_numberstringopted_out_channelsobjectlast_activity_atstring (date-time)created_atstring (date-time)updated_atstring (date-time)created_by_uuidobjectcreated_by_usernameobjectcreated_by_first_nameobjectcreated_by_last_nameobjectcreated_by_nameobjectcustom_fieldsobject
curl -X POST "https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/restore/" \
-H "X-Api-Key: $VIVRE_API_KEY"
import os, requests
resp = requests.post(
"https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/restore/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
)
print(resp.json())
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/restore/", {
method: "POST",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
},
});
console.log(await resp.json());
{
"created_source": "api_key",
"created_source_label": "",
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"organisation": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"company": {
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"name": "Kaveri Foods"
},
"first_name": "Asha",
"last_name": "Rao",
"full_name": "Asha Rao",
"job_title": "Head of Operations",
"email": "[email protected]",
"email_secondary": "[email protected]",
"phone_country_code": "+91",
"phone": "9876543210",
"phone_secondary_country_code": "",
"phone_secondary": "",
"whatsapp_country_code": "+91",
"whatsapp_number": "9876543210",
"opted_out_channels": {},
"last_activity_at": "2026-10-17T09:30:00+05:30",
"created_at": "2026-10-17T09:30:00+05:30",
"updated_at": "2026-10-17T09:30:00+05:30",
"created_by_uuid": null,
"created_by_username": null,
"created_by_first_name": null,
"created_by_last_name": null,
"created_by_name": null,
"custom_fields": {}
}
Contact activity timeline
GET/api/v1/contacts/{public_id}/activities/
Parameters
public_idpath, stringRequired- The record's public id (a UUID).
Response fields 19
sourceenumsource_labelstringidstring (uuid)organisationstring (uuid)entity_typeenumentity_idstringentity_public_idobjecttypeenumactor_typeenumcreated_by_uuidobjectcreated_by_usernameobjectcreated_by_first_nameobjectcreated_by_last_nameobjectcreated_by_nameobjectis_outboundbooleanresponse_time_secondsintegercontentstringcreated_atstring (date-time)emailobject
curl "https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/activities/" \
-H "X-Api-Key: $VIVRE_API_KEY"
import os, requests
resp = requests.get(
"https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/activities/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
)
print(resp.json())
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/activities/", {
method: "GET",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
},
});
console.log(await resp.json());
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"source": "api_key",
"source_label": "",
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"organisation": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"entity_type": "Contact",
"entity_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"entity_public_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"type": "email_sent",
"actor_type": "human",
"created_by_uuid": null,
"created_by_username": null,
"created_by_first_name": null,
"created_by_last_name": null,
"created_by_name": null,
"is_outbound": true,
"response_time_seconds": 1,
"content": "Called, wants a demo on Friday.",
"created_at": "2026-10-17T09:30:00+05:30",
"email": "[email protected]"
}
]
}
Merge duplicate contacts
POST/api/v1/contacts/bulk-merge/
Body
primary_contact_idstring (uuid)Requiredduplicate_contact_idsarray of string (uuid)Required- Must not contain the primary. All must be live contacts of the organization.
fieldsobject- Values to set on the primary contact. Only these keys are accepted (400 otherwise).
opted_out_channelsmust be an object andcompany_public_ida company of the organization; other values are set as given.email,phoneandphone_country_codenever replace the primary's own: they fill an empty field, or else are kept as its secondary.
Response fields 3
primary_contact_idstring (uuid)merged_countinteger- Duplicates merged in and soft-deleted.
contactobject
curl -X POST "https://api.vivrecrm.com/api/v1/contacts/bulk-merge/" \
-H "X-Api-Key: $VIVRE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"primary_contact_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7", "duplicate_contact_ids": ["7c9e6679-7425-40de-944b-e07fc1f90ae7"]}'
import os, requests
resp = requests.post(
"https://api.vivrecrm.com/api/v1/contacts/bulk-merge/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
json={
"primary_contact_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"duplicate_contact_ids": [
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
]
},
)
print(resp.json())
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/bulk-merge/", {
method: "POST",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"primary_contact_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"duplicate_contact_ids": [
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
]
}),
});
console.log(await resp.json());
{
"primary_contact_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"merged_count": 1,
"contact": {
"created_source": "api_key",
"created_source_label": "",
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"organisation": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"company": {
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"name": "Kaveri Foods"
},
"first_name": "Asha",
"last_name": "Rao",
"full_name": "Asha Rao",
"job_title": "Head of Operations",
"email": "[email protected]",
"email_secondary": "[email protected]",
"phone_country_code": "+91",
"phone": "9876543210",
"phone_secondary_country_code": "",
"phone_secondary": "",
"whatsapp_country_code": "+91",
"whatsapp_number": "9876543210",
"opted_out_channels": {},
"last_activity_at": "2026-10-17T09:30:00+05:30",
"created_at": "2026-10-17T09:30:00+05:30",
"updated_at": "2026-10-17T09:30:00+05:30",
"created_by_uuid": null,
"created_by_username": null,
"created_by_first_name": null,
"created_by_last_name": null,
"created_by_name": null,
"custom_fields": {}
}
}
Bulk add tags
POST/api/v1/contacts/bulk-tag/
Body
entity_idsarray of string (uuid)Required- Public ids of the records. All must be live records of the organization, else 400.
tag_idstring (uuid)Required- The tag's public id.
Response fields 3
created_countinteger- Assignments added (records that already had the tag are not counted).
entity_idsarray of string (uuid)- Public ids of the records acted on, leaving out leads and deals the caller cannot see.
tag_idstring (uuid)
curl -X POST "https://api.vivrecrm.com/api/v1/contacts/bulk-tag/" \
-H "X-Api-Key: $VIVRE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"entity_ids": ["7c9e6679-7425-40de-944b-e07fc1f90ae7"], "tag_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7"}'
import os, requests
resp = requests.post(
"https://api.vivrecrm.com/api/v1/contacts/bulk-tag/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
json={
"entity_ids": [
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
],
"tag_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7"
},
)
print(resp.json())
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/bulk-tag/", {
method: "POST",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"entity_ids": [
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
],
"tag_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7"
}),
});
console.log(await resp.json());
{
"created_count": 1,
"entity_ids": [
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
],
"tag_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7"
}
Bulk remove tags
POST/api/v1/contacts/bulk-untag/
Body
entity_idsarray of string (uuid)Required- Public ids of the records. All must be live records of the organization, else 400.
tag_idstring (uuid)Required- The tag's public id.
Response fields 3
removed_countinteger- Tag assignments deleted.
entity_idsarray of string (uuid)- Public ids of the records acted on, leaving out leads and deals the caller cannot see.
tag_idstring (uuid)
curl -X POST "https://api.vivrecrm.com/api/v1/contacts/bulk-untag/" \
-H "X-Api-Key: $VIVRE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"entity_ids": ["7c9e6679-7425-40de-944b-e07fc1f90ae7"], "tag_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7"}'
import os, requests
resp = requests.post(
"https://api.vivrecrm.com/api/v1/contacts/bulk-untag/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
json={
"entity_ids": [
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
],
"tag_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7"
},
)
print(resp.json())
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/bulk-untag/", {
method: "POST",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"entity_ids": [
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
],
"tag_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7"
}),
});
console.log(await resp.json());
{
"removed_count": 1,
"entity_ids": [
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
],
"tag_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7"
}
Delete many contacts (their leads and deals go with them)
POST/api/v1/contacts/bulk-delete/
Body
idsarray of string (uuid)Required- Contact public ids. A value that is not a UUID is not rejected; it is reported in failed.
Response fields 4
deletedarray of string (uuid)- The ids that were deleted, as strings, in request order (duplicates removed).
deleted_countintegerfailedarray of object- Ids not deleted. An id that is not a UUID, is in another organization, is already deleted or is outside the caller's visibility is reported as "Not found.".
failed_countinteger
curl -X POST "https://api.vivrecrm.com/api/v1/contacts/bulk-delete/" \
-H "X-Api-Key: $VIVRE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"ids": ["7c9e6679-7425-40de-944b-e07fc1f90ae7"]}'
import os, requests
resp = requests.post(
"https://api.vivrecrm.com/api/v1/contacts/bulk-delete/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
json={
"ids": [
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
]
},
)
print(resp.json())
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/bulk-delete/", {
method: "POST",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"ids": [
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
]
}),
});
console.log(await resp.json());
{
"deleted": [
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
],
"deleted_count": 1,
"failed": [
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"reason": ""
}
],
"failed_count": 1
}
How many leads and deals deleting these contacts would take with them
POST/api/v1/contacts/delete-impact/
Body
idsarray of string (uuid)Required- Contact public ids. Values that are not UUIDs or not found are ignored.
Response fields 3
contactsinteger- How many of the ids name a contact the caller can see.
leadsinteger- Live leads of those contacts.
dealsinteger- Live deals of those contacts.
curl -X POST "https://api.vivrecrm.com/api/v1/contacts/delete-impact/" \
-H "X-Api-Key: $VIVRE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"ids": ["7c9e6679-7425-40de-944b-e07fc1f90ae7"]}'
import os, requests
resp = requests.post(
"https://api.vivrecrm.com/api/v1/contacts/delete-impact/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
json={
"ids": [
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
]
},
)
print(resp.json())
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/delete-impact/", {
method: "POST",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"ids": [
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
]
}),
});
console.log(await resp.json());
{
"contacts": 1,
"leads": 1,
"deals": 1
}
Contact counts for the list header
GET/api/v1/contacts/stats/
Response fields 7
totalintegermineinteger- Created by the caller.
unassignedinteger- No
created_by. taggedintegerthis_monthinteger- Created since the 1st of the organization's current month.
with_companyintegerwith_emailinteger
curl "https://api.vivrecrm.com/api/v1/contacts/stats/" \
-H "X-Api-Key: $VIVRE_API_KEY"
import os, requests
resp = requests.get(
"https://api.vivrecrm.com/api/v1/contacts/stats/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
)
print(resp.json())
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/stats/", {
method: "GET",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
},
});
console.log(await resp.json());
{
"total": 1,
"mine": 1,
"unassigned": 1,
"tagged": 1,
"this_month": 1,
"with_company": 1,
"with_email": 1
}
Ids of every contact the list shows
GET/api/v1/contacts/ids/
"Select all N matching". Takes the list's own query (search, filter (compound JSON) and ordering), and answers the public ids in the list's order, up to 10,000, with the total. Pass them in batches to the bulk actions.
Response fields 3
countinteger- Every match, which may be more than
limit. idsarray of string (uuid)- Public ids of the first
limitmatches, in the list's order. limitinteger- The most ids answered: 10,000.
curl "https://api.vivrecrm.com/api/v1/contacts/ids/" \
-H "X-Api-Key: $VIVRE_API_KEY"
import os, requests
resp = requests.get(
"https://api.vivrecrm.com/api/v1/contacts/ids/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
)
print(resp.json())
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/ids/", {
method: "GET",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
},
});
console.log(await resp.json());
{
"count": 1,
"ids": [
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
],
"limit": 1
}
A contact's deals, paginated
GET/api/v1/contacts/{public_id}/deals/
Parameters
public_idpath, stringRequired
Response fields 25
created_sourceenumcreated_source_labelstringidstring (uuid)organisationstring (uuid)contactobjectleadobjectpipelineobjectstageobjecttitlestringstatusenumvaluestringcurrencystringexpected_close_datestring (date)closed_atstring (date)lost_reasonstringlast_activity_atstring (date-time)assigned_to_uuidobjectassigned_to_usernameobjectassigned_to_first_nameobjectassigned_to_last_nameobjectassigned_to_nameobjectstage_namestringcreated_atstring (date-time)updated_atstring (date-time)custom_fieldsobject
curl "https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/deals/" \
-H "X-Api-Key: $VIVRE_API_KEY"
import os, requests
resp = requests.get(
"https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/deals/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
)
print(resp.json())
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/deals/", {
method: "GET",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
},
});
console.log(await resp.json());
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"created_source": "api_key",
"created_source_label": "",
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"organisation": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"contact": {
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"first_name": "Asha",
"last_name": "Rao",
"full_name": "Asha Rao",
"email": "[email protected]",
"phone": "9876543210",
"phone_country_code": "+91",
"job_title": "Head of Operations",
"whatsapp_number": "9876543210",
"whatsapp_country_code": "+91",
"company_name": null,
"company_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7"
},
"lead": {
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"lead_origin": "import",
"source": "website",
"status": "new",
"score": 1,
"created_at": "2026-10-17T09:30:00+05:30"
},
"pipeline": {
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"organisation": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"name": "Kaveri Foods",
"is_default": true,
"stages": [],
"created_at": "2026-10-17T09:30:00+05:30",
"updated_at": "2026-10-17T09:30:00+05:30"
},
"stage": {
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"name": "Kaveri Foods",
"order": 1,
"probability": 1,
"stage_type": "open",
"color": "",
"created_at": "2026-10-17T09:30:00+05:30"
},
"title": "Kaveri Foods renewal",
"status": "open",
"value": "",
"currency": "INR",
"expected_close_date": "2026-10-31",
"closed_at": "2026-10-17T09:30:00+05:30",
"lost_reason": "",
"last_activity_at": "2026-10-17T09:30:00+05:30",
"assigned_to_uuid": null,
"assigned_to_username": null,
"assigned_to_first_name": null,
"assigned_to_last_name": null,
"assigned_to_name": null,
"stage_name": "",
"created_at": "2026-10-17T09:30:00+05:30",
"updated_at": "2026-10-17T09:30:00+05:30",
"custom_fields": {}
}
]
}
A contact's leads, paginated
GET/api/v1/contacts/{public_id}/leads/
Parameters
public_idpath, stringRequired
Response fields 31
created_sourceenumcreated_source_labelstringidstring (uuid)organisationstring (uuid)contactobjectlead_originenumstatusstringsourcestringmediumstringchannelstringplatformstringcampaignstringprioritystringlead_datestring (date)scoreintegerassigned_to_uuidobjectassigned_to_usernameobjectassigned_to_first_nameobjectassigned_to_last_nameobjectassigned_to_nameobjecttagsobjectcustom_fieldsobjectimport_job_idstring (uuid)is_potential_duplicatebooleanduplicate_reasonenumnotes_countobjectactivities_countobjectdeals_countobjecttasks_countobjectcreated_atstring (date-time)updated_atstring (date-time)
curl "https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/leads/" \
-H "X-Api-Key: $VIVRE_API_KEY"
import os, requests
resp = requests.get(
"https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/leads/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
)
print(resp.json())
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/leads/", {
method: "GET",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
},
});
console.log(await resp.json());
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"created_source": "api_key",
"created_source_label": "",
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"organisation": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"contact": {
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"first_name": "Asha",
"last_name": "Rao",
"full_name": "Asha Rao",
"email": "[email protected]",
"phone": "9876543210",
"phone_country_code": "+91",
"job_title": "Head of Operations",
"whatsapp_number": "9876543210",
"whatsapp_country_code": "+91",
"company_name": null,
"company_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7"
},
"lead_origin": "import",
"status": "new",
"source": "website",
"medium": "",
"channel": "",
"platform": "",
"campaign": "",
"priority": "",
"lead_date": "2026-10-31",
"score": 1,
"assigned_to_uuid": null,
"assigned_to_username": null,
"assigned_to_first_name": null,
"assigned_to_last_name": null,
"assigned_to_name": null,
"tags": null,
"custom_fields": {},
"import_job_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"is_potential_duplicate": true,
"duplicate_reason": "duplicate",
"notes_count": null,
"activities_count": null,
"deals_count": null,
"tasks_count": null,
"created_at": "2026-10-17T09:30:00+05:30",
"updated_at": "2026-10-17T09:30:00+05:30"
}
]
}
curl "https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/tags/" \
-H "X-Api-Key: $VIVRE_API_KEY"
import os, requests
resp = requests.get(
"https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/tags/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
)
print(resp.json())
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/tags/", {
method: "GET",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
},
});
console.log(await resp.json());
[
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"organisation": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"name": "Kaveri Foods",
"color_hex": "",
"created_at": "2026-10-17T09:30:00+05:30"
}
]
Tag a contact
POST/api/v1/contacts/{public_id}/tags/
Parameters
public_idpath, stringRequired
Body
tag_public_idstring (uuid)Required- A tag of the organization not already on this record (400 otherwise).
Response fields 5
idstring (uuid)organisationstring (uuid)namestringcolor_hexstringcreated_atstring (date-time)
curl -X POST "https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/tags/" \
-H "X-Api-Key: $VIVRE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"tag_public_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7"}'
import os, requests
resp = requests.post(
"https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/tags/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
json={
"tag_public_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7"
},
)
print(resp.json())
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/tags/", {
method: "POST",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"tag_public_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7"
}),
});
console.log(await resp.json());
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"organisation": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"name": "Kaveri Foods",
"color_hex": "",
"created_at": "2026-10-17T09:30:00+05:30"
}
Remove a tag from a contact
DELETE/api/v1/contacts/{public_id}/tags/{tag_id}/
Parameters
public_idpath, stringRequiredtag_idpath, stringRequired
curl -X DELETE "https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/tags/7c9e6679-7425-40de-944b-e07fc1f90ae7/" \
-H "X-Api-Key: $VIVRE_API_KEY"
import os, requests
resp = requests.delete(
"https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/tags/7c9e6679-7425-40de-944b-e07fc1f90ae7/",
headers={"X-Api-Key": os.environ["VIVRE_API_KEY"]},
)
print(resp.status_code)
const resp = await fetch("https://api.vivrecrm.com/api/v1/contacts/7c9e6679-7425-40de-944b-e07fc1f90ae7/tags/7c9e6679-7425-40de-944b-e07fc1f90ae7/", {
method: "DELETE",
headers: {
"X-Api-Key": process.env.VIVRE_API_KEY,
},
});
console.log(resp.status);