A contact is a person you deal with. You can link a contact to companies, opportunities and projects. This page covers reading, creating, changing and deleting contacts, and linking them to records. All endpoints sit under /api/v1/ and need an account-scoped bearer token. See Drum API authentication, permissions and rate limits.
The contact modal and contact cards in Drum, these endpoints and the MCP tools get_contact, create_contact and update_contact (Clients toolset) run the same operations, so every surface applies the same rules.
Permissions
Contacts use the company permissions of your Drum role. Each request also needs the API verb permission (for example api_create for a POST).
Action | Record permission |
Read contacts |
|
Create a contact |
|
Change or restore a contact |
|
Delete a contact |
|
Link a contact to a record, change the link or remove it | Read access to the contact ( |
A contact or record you can't read answers 404, so the API doesn't reveal that it exists.
The contact
{
"id": 307,
"first_name": "Sam",
"last_name": "Taylor",
"name": "Sam Taylor",
"title": "Accounts manager",
"email": "[email protected]",
"mobile_phone": "0400 000 307",
"office_phone": null,
"description": null,
"deleted": false,
"links": [
{"id": 9001, "record_kind": "company", "record": {"id": 301, "name": "Harbour Joinery"}, "role": null,
"description": "Accounts", "pinned": true, "primary_financial_contact": true}
],
"created_at": "2026-10-07T01:00:00Z",
"updated_at": "2026-10-07T01:00:00Z"
}links lists the companies, opportunities and projects of the contact that you can read, pinned first, then in the order of the contact cards. A link to a record you can't read is left out, and so is a link to a contract (contract links are managed in Drum only).
Link field | Meaning |
| The id of the link. MCP |
|
|
| The linked record as |
|
|
| The note on the contact card |
| Whether the contact is pinned on that record |
| Companies only. The primary financial contact of the company |
GET /api/v1/contacts
Lists the contacts you can read, sorted by last name then first name, one page at a time like the other lists. Each row has the contact fields without links.
Parameter | Meaning |
| Text search over the name, email and phone numbers |
| Only the contacts of companies with this company status id |
|
|
GET /api/v1/contacts/:id
One contact with its links. A deleted contact is shown too, with "deleted": true.
POST /api/v1/contacts
Creates a contact. The request needs api_create and create_companies. Send the fields flat or nested under contact. Only first_name is required.
Field | Meaning |
| Required. 255 characters or fewer |
| Text, 255 characters or fewer |
| Text, 255 characters or fewer. Each is unique in the account, deleted contacts included |
| Notes, 10,000 characters or fewer |
| Optional. One link to make at the same time: |
| Optional. A retry with the same key and input returns the first contact with |
Existing contacts are reused. When a contact that isn't deleted already has the email (any case) or, if no email matches, the mobile number, Drum returns that contact with 200 and "matched_existing": true. It doesn't change any of its fields, and it makes the link to it. A new contact returns 201 with "matched_existing": false. The contact modal in Drum works the same way.
When the match is a deleted contact, the request answers 409 contact_deleted. Restore that contact with PATCH /api/v1/contacts/:id/restore instead of creating a new one. If older records hold a deleted and an active contact with the same email in different case, the active one wins. A match you can't read answers 409 contact_exists, without showing its id or whether it's deleted.
POST /api/v1/contacts
{"first_name": "Alex", "last_name": "Nguyen", "email": "[email protected]",
"link": {"record_kind": "project", "record_id": 104, "role": "contractor"}}
PATCH /api/v1/contacts/:id
Changes only the fields you send. null clears an optional field (last_name, title, email, mobile_phone, office_phone and description). Changing a field needs api_update and update_companies.
links (up to 20) adds links or changes the link a record already has, with the fields of link above. It merges by record: links you leave out are kept, and a link field you don't send keeps its value, so leaving out role keeps the current role. To remove a link, use DELETE on the link (below). A deleted contact answers 404 contact_not_found.
PATCH /api/v1/contacts/307
{"title": "Finance director", "links": [{"record_kind": "opportunity", "record_id": 702, "pinned": true}]}
DELETE /api/v1/contacts/:id
Deletes the contact, the same as Delete in Drum. It's a soft delete: the links stay, and you can restore the contact later. Needs api_delete and delete_companies. Answers 204.
PATCH /api/v1/contacts/:id/restore
Brings back a deleted contact. Needs api_update and update_companies. The response is the contact.
Link a contact to a company, opportunity or project
Request | Effect |
| Links the contact to the company, or changes the link. |
| The same, for an opportunity |
| The same, for a project |
| Removes the link only, the same as Un-assign in Drum. The contact stays, even when it has no other link. |
The body of a PUT has the optional role, description, pinned and primary_financial_contact (company only). A field you don't send keeps its value. Setting primary_financial_contact clears it on the other contacts of that company. The response is the link with contact_id. A PUT needs api_update and a DELETE needs api_delete, plus the update permission of the record.
Links to contracts are managed in Drum only. The API and MCP can't add, change or remove them.
MCP tools
The Clients toolset has get_contact, create_contact and update_contact, with the same fields and rules as the endpoints above. get_contact returns the link ids. To remove one link, use delete_record with kind contact_link and the link id. To delete a contact, use delete_record with kind contact, and bring it back with restore_record with kind contact. get_contact also returns recent_notes (the contact's 5 newest notes, each cut at 2,000 characters) and notes_count (how many notes it has). To read or write a contact's notes, see Notes API. Every agent or API token that had the Sales toolset also has Clients. See How to choose MCP toolsets for Connected Agents and API tokens.
Errors
Status |
| When |
|
|
|
|
| A value doesn't parse, for example an unknown |
|
| The contact doesn't save ( |
|
| The contact is in another account, you can't read it, or (on a change) it's deleted |
|
| The record of a link is deleted, in another account, or you can't read it |
|
| A |
|
| A create matched a deleted contact by email or mobile. Restore that contact instead |
|
| A create matched a contact you can't read |
| A missing verb permission ( | |
|
| You don't have the contact permission, or the update permission of the record of a link |
