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

GET/contacts

Returns 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"
Response · 200
{
  "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

  • qstring

    Text the name or e-mail contains, case-insensitively.

    Example solglantan.se

  • statusstring

    active for live contacts, inactive for deleted ones. Any other value lists live contacts.

    One ofactiveinactive

    Default active

Responses

  • Headers

    • X-RateLimit-Limit — Requests this key may make per minute.
    • X-RateLimit-Remaining — Requests left in the current minute.
    • dataarray of objectsrequired

      at most 200 items

      • idstring(uuid)required
      • namestringrequired
      • emailstring(email)nullablerequired

        Null only for contacts synced from a CRM without an address.

      • titlestringnullablerequired

        Job title.

      • phonestringnullablerequired
      • accountobjectnullablerequired

        The customer the contact works for, if any.

      • documents_countintegerrequired

        Signature requests in this organization with a signer at this e-mail.

        ≥ 0

      • rooms_countintegerrequired

        Deal rooms in this organization with a stakeholder at this e-mail.

        ≥ 0

      • created_atstring(date-time)nullablerequired
      • updated_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: feature names the capability (the operation's x-feature) and required_tier the 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.
    Errors
  • 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (module_seat_required — an administrator assigns seats under Settings → Users), or the organization is suspended.
    Errors
  • 429The key has made more requests this minute than its limit allows.
    Errors

Create a contact

POST/contacts
Scope write Permission customers.create

Creates 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"
}'
Response · 201
{
  "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

  • namestringrequired

    1–255 characters

  • emailstring(email)required

    at most 255 characters

  • titlestringnullable

    Job title.

    at most 128 characters

  • phonestringnullable

    at most 32 characters

  • account_idstring(uuid)nullable

    A 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.
    • dataobjectrequired
      • idstring(uuid)required
      • namestringrequired
      • emailstring(email)nullablerequired

        Null only for contacts synced from a CRM without an address.

      • titlestringnullablerequired

        Job title.

      • phonestringnullablerequired
      • accountobjectnullablerequired

        The customer the contact works for, if any.

      • documents_countintegerrequired

        Signature requests in this organization with a signer at this e-mail.

        ≥ 0

      • rooms_countintegerrequired

        Deal rooms in this organization with a stakeholder at this e-mail.

        ≥ 0

      • created_atstring(date-time)nullablerequired
      • updated_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: feature names the capability (the operation's x-feature) and required_tier the 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.
    Errors
  • 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (module_seat_required — an administrator assigns seats under Settings → Users), or the organization is suspended.
    Errors
  • 422The request body or query failed validation.
    Errors
  • 429The key has made more requests this minute than its limit allows.
    Errors

Retrieve a contact

GET/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"
Response · 200
{
  "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)required

    The contact's id.

Responses

  • Headers

    • X-RateLimit-Limit — Requests this key may make per minute.
    • X-RateLimit-Remaining — Requests left in the current minute.
    • dataobjectrequired
      • idstring(uuid)required
      • namestringrequired
      • emailstring(email)nullablerequired

        Null only for contacts synced from a CRM without an address.

      • titlestringnullablerequired

        Job title.

      • phonestringnullablerequired
      • accountobjectnullablerequired

        The customer the contact works for, if any.

      • documents_countintegerrequired

        Signature requests in this organization with a signer at this e-mail.

        ≥ 0

      • rooms_countintegerrequired

        Deal rooms in this organization with a stakeholder at this e-mail.

        ≥ 0

      • created_atstring(date-time)nullablerequired
      • updated_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: feature names the capability (the operation's x-feature) and required_tier the 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.
    Errors
  • 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (module_seat_required — an administrator assigns seats under Settings → Users), or the organization is suspended.
    Errors
  • 404No such record in this organization.
    Errors
  • 429The key has made more requests this minute than its limit allows.
    Errors

Update a contact

PATCH/contacts/{contact}
Scope write Permission customers.update

Changes 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
}'
Response · 200
{
  "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)required

    The contact's id.

Request body

application/json · required

  • namestring

    1–255 characters

  • emailstring(email)

    at most 255 characters

  • titlestringnullable

    at most 128 characters

  • phonestringnullable

    at most 32 characters

  • account_idstring(uuid)nullable

    A 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.
    • dataobjectrequired
      • idstring(uuid)required
      • namestringrequired
      • emailstring(email)nullablerequired

        Null only for contacts synced from a CRM without an address.

      • titlestringnullablerequired

        Job title.

      • phonestringnullablerequired
      • accountobjectnullablerequired

        The customer the contact works for, if any.

      • documents_countintegerrequired

        Signature requests in this organization with a signer at this e-mail.

        ≥ 0

      • rooms_countintegerrequired

        Deal rooms in this organization with a stakeholder at this e-mail.

        ≥ 0

      • created_atstring(date-time)nullablerequired
      • updated_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: feature names the capability (the operation's x-feature) and required_tier the 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.
    Errors
  • 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (module_seat_required — an administrator assigns seats under Settings → Users), or the organization is suspended.
    Errors
  • 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

DELETE/contacts/{contact}
Scope write Permission customers.delete

Deletes 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"
Response · 204
204 — no response body

Path parameters

  • contactstring(uuid)required

    The 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: feature names the capability (the operation's x-feature) and required_tier the 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.
    Errors
  • 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (module_seat_required — an administrator assigns seats under Settings → Users), or the organization is suspended.
    Errors
  • 404No such record in this organization.
    Errors
  • 429The key has made more requests this minute than its limit allows.
    Errors