GET
/api/external/v2/contactsGET
/api/external/v2/contacts/{contact_id}Overview
| Endpoint | Description |
|---|---|
GET /contacts | List contacts with pagination |
GET /contacts/{id} | Get a single contact |
POST /contacts | Create a new contact |
PATCH /contacts/{id} | Update a contact |
Contacts are scoped to your account. Only connected contacts (active relationships) are returned by default.
List Contacts
/api/external/v2/contactsList contacts with pagination
Query parameters
limitintegerResults per page (1–200, default 50)
cursorstringCursor for next page
fieldsstringComma-separated fields to include
Response (200):
{
"request_id": "b8c9d0e1-f2a3-4567-1234-678901234567",
"timestamp": "2026-03-20T15:30:45Z",
"data": [
{
"id": 78,
"contact_type": "lender_contact",
"first_name": "Sarah",
"last_name": "Chen",
"email": "schen@meridiancapital.com",
"title": "Senior Vice President",
"department": "Originations",
"address": "1 Battery Park Plaza",
"city": "New York",
"state": "NY",
"zip": "10004",
"linkedin_url": "https://linkedin.com/in/sarah-chen-cre",
"phones": [
{
"id": null,
"type": "office",
"raw": "(212) 555-0184",
"country": "US",
"e164": "+12125550184",
"extension": ""
}
],
"is_primary": true,
"is_connected": true,
"owner_account_id": 56,
"created_at": "2025-09-01T11:00:00Z",
"updated_at": "2026-02-20T16:45:00Z"
}
],
"pagination": {
"total": 128,
"limit": 50,
"has_more": true,
"next_cursor": "eyJpZCI6IDc4fQ=="
}
}401
unauthorizedAuthentication required— Missing or invalid Authorization header
400
bad_requestcursor and sort cannot be combined; use offset pagination when sorting— Both cursor and sort params provided
Get Contact
/api/external/v2/contacts/{contact_id}Get a single contact by ID
Path parameters
contact_idintegerrequiredThe contact ID
Response (200):
{
"request_id": "c9d0e1f2-a3b4-5678-2345-789012345678",
"timestamp": "2026-03-20T15:30:45Z",
"data": {
"id": 78,
"contact_type": "lender_contact",
"first_name": "Sarah",
"last_name": "Chen",
"email": "schen@meridiancapital.com",
"title": "Senior Vice President",
"department": "Originations",
"address": "1 Battery Park Plaza",
"city": "New York",
"state": "NY",
"zip": "10004",
"linkedin_url": "https://linkedin.com/in/sarah-chen-cre",
"phones": [
{
"id": null,
"type": "office",
"raw": "(212) 555-0184",
"country": "US",
"e164": "+12125550184",
"extension": ""
}
],
"is_primary": true,
"is_connected": true,
"owner_account_id": 56,
"created_at": "2025-09-01T11:00:00Z",
"updated_at": "2026-02-20T16:45:00Z"
}
}401
unauthorizedAuthentication required— Missing or invalid Authorization header
404
not_foundContact not found— The ID doesn't exist or isn't accessible to the authenticated user
Create Contact
/api/external/v2/contactsCreate a new contact
Request body
contact_typestringrequiredContact type: lender_contact or sponsor
company_idintegerrequiredAssociated company ID
first_namestringFirst name
last_namestringLast name
emailstringEmail address
titlestringJob title
departmentstringDepartment
addressstringStreet address
citystringCity
statestringState
zipstringZIP code
linkedin_urlstringLinkedIn profile URL
phonesPhoneIn[]Phone numbers. Each object: { raw, type?, country?, extension? }. raw accepts any common format and is normalized to E.164 server-side (unparseable numbers return 422). type is mobile, office, or fax (default mobile). country is a 2-letter ISO region used to parse numbers without a + prefix (default US).
is_primarybooleanWhether this is the primary contact at the company
Response (201):
{
"request_id": "d0e1f2a3-b4c5-6789-3456-890123456789",
"timestamp": "2026-03-20T15:30:45Z",
"data": {
"id": 142,
"contact_type": "lender_contact",
"first_name": "James",
"last_name": "Rodriguez",
"email": "jrodriguez@eastdilsecured.com",
"title": "Managing Director",
"department": "Debt Capital Markets",
"address": "40 West 57th Street",
"city": "New York",
"state": "NY",
"zip": "10019",
"linkedin_url": "https://linkedin.com/in/james-rodriguez-cre",
"phones": [
{
"id": null,
"type": "mobile",
"raw": "(917) 555-0142",
"country": "US",
"e164": "+19175550142",
"extension": ""
}
],
"is_primary": false,
"is_connected": false,
"owner_account_id": 56,
"created_at": "2026-03-20T15:30:45Z",
"updated_at": "2026-03-20T15:30:45Z"
}
}401
unauthorizedAuthentication required— Missing or invalid Authorization header
403
forbiddenUser not authorized to create contact— The user's role doesn't have CREATE permission
422
validation_errorcontact_type is required— Missing required contact_type field
Update Contact
/api/external/v2/contacts/{contact_id}Update a contact
Path parameters
contact_idintegerrequiredThe contact ID
Request body
first_namestringFirst name
last_namestringLast name
emailstringEmail address
titlestringJob title
departmentstringDepartment
addressstringStreet address
citystringCity
statestringState
zipstringZIP code
linkedin_urlstringLinkedIn profile URL
phonesPhoneIn[]Replaces the contact's entire phone list — send [] to clear all numbers. Same object shape as Create Contact.
All request body fields are optional. Only provided fields are updated. contact_type, company_id, and is_primary are not updatable.
Response (200):
{
"request_id": "e1f2a3b4-c5d6-7890-4567-901234567890",
"timestamp": "2026-03-20T15:30:45Z",
"data": {
"id": 78,
"contact_type": "lender_contact",
"first_name": "Sarah",
"last_name": "Chen",
"email": "schen@meridiancapital.com",
"title": "Executive Vice President",
"department": "Originations",
"address": "1 Battery Park Plaza",
"city": "New York",
"state": "NY",
"zip": "10004",
"linkedin_url": "https://linkedin.com/in/sarah-chen-cre",
"phones": [
{
"id": null,
"type": "office",
"raw": "(212) 555-0184",
"country": "US",
"e164": "+12125550184",
"extension": ""
}
],
"is_primary": true,
"is_connected": true,
"owner_account_id": 56,
"created_at": "2025-09-01T11:00:00Z",
"updated_at": "2026-03-20T15:30:45Z"
}
}401
unauthorizedAuthentication required— Missing or invalid Authorization header
404
not_foundContact not found— The ID doesn't exist or isn't accessible to the authenticated user
Contact Object
| Field | Type | Description |
|---|---|---|
id | integer | Contact identifier |
contact_type | string|null | First entry from contact_types, kept as a string for backwards compatibility. lender_contact or sponsor. |
contact_types | string[] | All contact types assigned to the contact (a contact can be both a lender and a sponsor contact). Values: lender_contact, sponsor. |
first_name | string|null | First name |
last_name | string|null | Last name |
email | string|null | Email address |
title | string|null | Job title |
department | string|null | Department |
address | string|null | Street address |
city | string|null | City |
state | string|null | State |
zip | string|null | ZIP code |
linkedin_url | string|null | LinkedIn profile URL |
phones | Phone[] | Phone numbers ([] when none). Each: {id, type, raw, country, e164, extension} — e164 is the normalized canonical number (always server-computed from raw); type is mobile, office, or fax; fields may be null on records created before phone support. |
is_primary | boolean | Whether this is the primary contact |
owner_account_id | integer|null | Owning account ID |
is_connected | boolean | Whether this is a connected contact |
created_at | string|null | Creation timestamp |
updated_at | string|null | Last update timestamp |