Contacts
The people you deal with at your customers: name, e-mail, title and phone, optionally attached to a customer. Contacts belong to the customer record every module shares, so they need no module — only the customers.* permissions.
List contacts
/contactsReturns up to 200 contacts, ordered by name, each with how many signature requests and deal rooms they appear in (matched on e-mail within your organization).
This list is not paginated: when you have more than 200 contacts, narrow it with q. status=inactive lists deleted contacts instead of live ones.
curl 'https://api.closepact.com/v1/api/contacts' \
-H "Authorization: Bearer $CLOSEPACT_API_KEY"{
"data": [
{
"id": "01a15d02-6e1f-7b44-a0c9-3d7e5f1b2a96",
"name": "Henrik Ny",
"email": "henrik.ny@solglantan.se",
"title": "Ordförande",
"phone": "+46 70 123 45 67",
"account": {
"id": "01a15b90-2d44-7c1a-8e5f-9b3c7d2e1a08",
"name": "Brf Solgläntan"
},
"documents_count": 2,
"rooms_count": 1,
"created_at": "2026-09-30T07:45:12+00:00",
"updated_at": "2026-10-11T15:20:31+00:00"
}
]
}Query parameters
qstringText the name or e-mail contains, case-insensitively.
Example
solglantan.sestatusstringactivefor live contacts,inactivefor deleted ones. Any other value lists live contacts.One of
activeinactiveDefault
active
Responses
Headers
X-RateLimit-Limit— Requests this key may make per minute.X-RateLimit-Remaining— Requests left in the current minute.
dataarray of objectsrequiredat most 200 items
idstring(uuid)requirednamestringrequiredemailstring(email)nullablerequiredNull only for contacts synced from a CRM without an address.
titlestringnullablerequiredJob title.
phonestringnullablerequiredaccountobjectnullablerequiredThe customer the contact works for, if any.
documents_countintegerrequiredSignature requests in this organization with a signer at this e-mail.
≥ 0
rooms_countintegerrequiredDeal rooms in this organization with a stakeholder at this e-mail.
≥ 0
created_atstring(date-time)nullablerequiredupdated_atstring(date-time)nullablerequired
- 401No key, or the key is invalid, revoked or expired, or its creator no longer has access.Errors
- 402The organization has not bought the module this endpoint belongs to, or it has lapsed to read-only, or its tier does not include what the operation needs:Errors
featurenames the capability (the operation'sx-feature) andrequired_tierthe cheapest tier that grants it. Every operation answers this with"feature": "core.api"when no module the organization holds is on a tier that includes the API. - 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (Errors
module_seat_required— an administrator assigns seats under Settings → Users), or the organization is suspended. - 429The key has made more requests this minute than its limit allows.Errors
Create a contact
/contactswrite Permission customers.createCreates a contact. E-mail addresses are not required to be unique, so creating the same person twice gives two contacts: look them up with q first when you sync from another system.
Not idempotent. No webhook fires.
curl -X POST 'https://api.closepact.com/v1/api/contacts' \
-H "Authorization: Bearer $CLOSEPACT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Henrik Ny",
"email": "henrik.ny@solglantan.se",
"title": "Ordförande",
"phone": "+46 70 123 45 67",
"account_id": "01a15b90-2d44-7c1a-8e5f-9b3c7d2e1a08"
}'{
"data": {
"id": "01a15d02-6e1f-7b44-a0c9-3d7e5f1b2a96",
"name": "Henrik Ny",
"email": "henrik.ny@solglantan.se",
"title": "Ordförande",
"phone": "+46 70 123 45 67",
"account": {
"id": "01a15b90-2d44-7c1a-8e5f-9b3c7d2e1a08",
"name": "Brf Solgläntan"
},
"documents_count": 0,
"rooms_count": 0,
"created_at": "2026-10-18T08:02:11+00:00",
"updated_at": "2026-10-18T08:02:11+00:00"
}
}Request body
application/json · required
namestringrequired1–255 characters
emailstring(email)requiredat most 255 characters
titlestringnullableJob title.
at most 128 characters
phonestringnullableat most 32 characters
account_idstring(uuid)nullableA customer in this organization.
Responses
Headers
X-RateLimit-Limit— Requests this key may make per minute.X-RateLimit-Remaining— Requests left in the current minute.
dataobjectrequiredidstring(uuid)requirednamestringrequiredemailstring(email)nullablerequiredNull only for contacts synced from a CRM without an address.
titlestringnullablerequiredJob title.
phonestringnullablerequiredaccountobjectnullablerequiredThe customer the contact works for, if any.
documents_countintegerrequiredSignature requests in this organization with a signer at this e-mail.
≥ 0
rooms_countintegerrequiredDeal rooms in this organization with a stakeholder at this e-mail.
≥ 0
created_atstring(date-time)nullablerequiredupdated_atstring(date-time)nullablerequired
- 401No key, or the key is invalid, revoked or expired, or its creator no longer has access.Errors
- 402The organization has not bought the module this endpoint belongs to, or it has lapsed to read-only, or its tier does not include what the operation needs:Errors
featurenames the capability (the operation'sx-feature) andrequired_tierthe cheapest tier that grants it. Every operation answers this with"feature": "core.api"when no module the organization holds is on a tier that includes the API. - 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (Errors
module_seat_required— an administrator assigns seats under Settings → Users), or the organization is suspended. - 422The request body or query failed validation.Errors
- 429The key has made more requests this minute than its limit allows.Errors
Retrieve a contact
/contacts/{contact}Returns one live contact, in the same shape as the list. A deleted contact is a 404 here; list it with status=inactive.
curl 'https://api.closepact.com/v1/api/contacts/01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40' \
-H "Authorization: Bearer $CLOSEPACT_API_KEY"{
"data": {
"id": "01a15d02-6e1f-7b44-a0c9-3d7e5f1b2a96",
"name": "Henrik Ny",
"email": "henrik.ny@solglantan.se",
"title": "Ordförande",
"phone": "+46 70 123 45 67",
"account": {
"id": "01a15b90-2d44-7c1a-8e5f-9b3c7d2e1a08",
"name": "Brf Solgläntan"
},
"documents_count": 2,
"rooms_count": 1,
"created_at": "2026-09-30T07:45:12+00:00",
"updated_at": "2026-10-11T15:20:31+00:00"
}
}Path parameters
contactstring(uuid)requiredThe contact's id.
Responses
Headers
X-RateLimit-Limit— Requests this key may make per minute.X-RateLimit-Remaining— Requests left in the current minute.
dataobjectrequiredidstring(uuid)requirednamestringrequiredemailstring(email)nullablerequiredNull only for contacts synced from a CRM without an address.
titlestringnullablerequiredJob title.
phonestringnullablerequiredaccountobjectnullablerequiredThe customer the contact works for, if any.
documents_countintegerrequiredSignature requests in this organization with a signer at this e-mail.
≥ 0
rooms_countintegerrequiredDeal rooms in this organization with a stakeholder at this e-mail.
≥ 0
created_atstring(date-time)nullablerequiredupdated_atstring(date-time)nullablerequired
- 401No key, or the key is invalid, revoked or expired, or its creator no longer has access.Errors
- 402The organization has not bought the module this endpoint belongs to, or it has lapsed to read-only, or its tier does not include what the operation needs:Errors
featurenames the capability (the operation'sx-feature) andrequired_tierthe cheapest tier that grants it. Every operation answers this with"feature": "core.api"when no module the organization holds is on a tier that includes the API. - 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (Errors
module_seat_required— an administrator assigns seats under Settings → Users), or the organization is suspended. - 404No such record in this organization.Errors
- 429The key has made more requests this minute than its limit allows.Errors
Update a contact
/contacts/{contact}write Permission customers.updateChanges the fields you send and leaves the rest alone. Send null to clear title, phone or account_id.
Changing the e-mail changes which signature requests and rooms are counted for the contact — the counts follow the address, not the contact. No webhook fires.
curl -X PATCH 'https://api.closepact.com/v1/api/contacts/01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40' \
-H "Authorization: Bearer $CLOSEPACT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Kassör",
"phone": null
}'{
"data": {
"id": "01a15d02-6e1f-7b44-a0c9-3d7e5f1b2a96",
"name": "Henrik Ny",
"email": "henrik.ny@solglantan.se",
"title": "Kassör",
"phone": null,
"account": {
"id": "01a15b90-2d44-7c1a-8e5f-9b3c7d2e1a08",
"name": "Brf Solgläntan"
},
"documents_count": 2,
"rooms_count": 1,
"created_at": "2026-09-30T07:45:12+00:00",
"updated_at": "2026-10-18T08:10:40+00:00"
}
}Path parameters
contactstring(uuid)requiredThe contact's id.
Request body
application/json · required
namestring1–255 characters
emailstring(email)at most 255 characters
titlestringnullableat most 128 characters
phonestringnullableat most 32 characters
account_idstring(uuid)nullableA customer in this organization, or null to detach the contact.
Responses
Headers
X-RateLimit-Limit— Requests this key may make per minute.X-RateLimit-Remaining— Requests left in the current minute.
dataobjectrequiredidstring(uuid)requirednamestringrequiredemailstring(email)nullablerequiredNull only for contacts synced from a CRM without an address.
titlestringnullablerequiredJob title.
phonestringnullablerequiredaccountobjectnullablerequiredThe customer the contact works for, if any.
documents_countintegerrequiredSignature requests in this organization with a signer at this e-mail.
≥ 0
rooms_countintegerrequiredDeal rooms in this organization with a stakeholder at this e-mail.
≥ 0
created_atstring(date-time)nullablerequiredupdated_atstring(date-time)nullablerequired
- 401No key, or the key is invalid, revoked or expired, or its creator no longer has access.Errors
- 402The organization has not bought the module this endpoint belongs to, or it has lapsed to read-only, or its tier does not include what the operation needs:Errors
featurenames the capability (the operation'sx-feature) andrequired_tierthe cheapest tier that grants it. Every operation answers this with"feature": "core.api"when no module the organization holds is on a tier that includes the API. - 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (Errors
module_seat_required— an administrator assigns seats under Settings → Users), or the organization is suspended. - 404No such record in this organization.Errors
- 422The request body or query failed validation.Errors
- 429The key has made more requests this minute than its limit allows.Errors
Delete a contact
/contacts/{contact}write Permission customers.deleteDeletes the contact. It leaves the live list and lookups at once, and is still listed with status=inactive. Stakeholders and signers with the same e-mail are not touched. No webhook fires.
curl -X DELETE 'https://api.closepact.com/v1/api/contacts/01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40' \
-H "Authorization: Bearer $CLOSEPACT_API_KEY"204 — no response bodyPath parameters
contactstring(uuid)requiredThe contact's id.
Responses
- 204The contact was deleted. No body.
- 401No key, or the key is invalid, revoked or expired, or its creator no longer has access.Errors
- 402The organization has not bought the module this endpoint belongs to, or it has lapsed to read-only, or its tier does not include what the operation needs:Errors
featurenames the capability (the operation'sx-feature) andrequired_tierthe cheapest tier that grants it. Every operation answers this with"feature": "core.api"when no module the organization holds is on a tier that includes the API. - 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (Errors
module_seat_required— an administrator assigns seats under Settings → Users), or the organization is suspended. - 404No such record in this organization.Errors
- 429The key has made more requests this minute than its limit allows.Errors