Integration Summary
When to use- Create, read, and update CRM contacts.
- Use the read and write examples together so you can validate state before you mutate it.
Required scopes- Access is inherited from the connected user or JWT session.
- Inspect GET /me or the validate-api-key response to confirm the scopes available to the current token.
Headers- Authorization: Bearer <token>
- X-Origin-App: <client-name>
- Content-Type: application/json on write operations
Request schemaSee the request body tables below or /platform/openapi.json for the machine-readable schema surface.
Response schemaResponses use the standard request_id/timestamp/data envelope. This page documents these object schemas: Contact Object.
Enums & values- Enum-like values and filter operators are documented inline on the page where available.
- When a value set is account- or tier-dependent, validate against live responses before hard-coding assumptions.
IdempotencyUse Idempotency-Key on retried writes when your client cannot guarantee whether a prior attempt succeeded.
Rate limitsSee /rate-limits. Page intentionally through list endpoints and apply backoff on 429 responses.
Examplescurl, TypeScript, Python
Starter example: GET /api/external/v2/contacts
bash
curl -X GET "https://api.levcapital.com/api/external/v2/contacts" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "X-Origin-App: my-integration"Contacts
Last updated: March 2026
Contacts represent people in your CRM — lender contacts, sponsor contacts, and other business relationships. Each contact is associated with a company and can be linked to placements.
Connect your API key to explore
Stored in your browser session only. Never sent to our docs server.
GET
/api/external/v2/contactslimitfieldshttps://api.levcapital.com/api/external/v2/contacts?limit=10Overview
| 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
GET
/api/external/v2/contactsList contacts with pagination
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | integer | Optional | Results per page (1–200, default 50) |
cursor | string | Optional | Cursor for next page |
fields | string | Optional | Comma-separated fields to include |
Response (200):
json
{
"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",
"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=="
}
}Error responses
401unauthorized
When: Missing or invalid Authorization header
{
"request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"error": {
"status": 401,
"type": "unauthorized",
"message": "Authentication required",
"details": {}
}
}400bad_request
When: Both cursor and sort params provided
{
"request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"error": {
"status": 400,
"type": "bad_request",
"message": "cursor and sort cannot be combined; use offset pagination when sorting",
"details": {}
}
}Get Contact
GET
/api/external/v2/contacts/{contact_id}Get a single contact by ID
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
contact_id | integer | Required | The contact ID |
Response (200):
json
{
"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",
"is_primary": true,
"is_connected": true,
"owner_account_id": 56,
"created_at": "2025-09-01T11:00:00Z",
"updated_at": "2026-02-20T16:45:00Z"
}
}Error responses
401unauthorized
When: Missing or invalid Authorization header
{
"request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"error": {
"status": 401,
"type": "unauthorized",
"message": "Authentication required",
"details": {}
}
}404not_found
When: The ID doesn't exist or isn't accessible to the authenticated user
{
"request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"error": {
"status": 404,
"type": "not_found",
"message": "Contact not found",
"details": {}
}
}Create Contact
POST
/api/external/v2/contactsCreate a new contact
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
contact_type | string | Required | Contact type: lender_contact or sponsor |
company_id | integer | Required | Associated company ID |
first_name | string | Optional | First name |
last_name | string | Optional | Last name |
email | string | Optional | Email address |
title | string | Optional | Job title |
department | string | Optional | Department |
address | string | Optional | Street address |
city | string | Optional | City |
state | string | Optional | State |
zip | string | Optional | ZIP code |
linkedin_url | string | Optional | LinkedIn profile URL |
is_primary | boolean | Optional | Whether this is the primary contact at the company |
Response (201):
json
{
"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",
"is_primary": false,
"is_connected": false,
"owner_account_id": 56,
"created_at": "2026-03-20T15:30:45Z",
"updated_at": "2026-03-20T15:30:45Z"
}
}Error responses
401unauthorized
When: Missing or invalid Authorization header
{
"request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"error": {
"status": 401,
"type": "unauthorized",
"message": "Authentication required",
"details": {}
}
}403forbidden
When: The user's role doesn't have CREATE permission
{
"request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"error": {
"status": 403,
"type": "forbidden",
"message": "User not authorized to create contact",
"details": {}
}
}422validation_error
When: Missing required contact_type field
{
"request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"error": {
"status": 422,
"type": "validation_error",
"message": "contact_type is required",
"details": {}
}
}Update Contact
PATCH
/api/external/v2/contacts/{contact_id}Update a contact
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
contact_id | integer | Required | The contact ID |
All request body fields are optional. Only provided fields are updated.
Response (200):
json
{
"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",
"is_primary": true,
"is_connected": true,
"owner_account_id": 56,
"created_at": "2025-09-01T11:00:00Z",
"updated_at": "2026-03-20T15:30:45Z"
}
}Error responses
401unauthorized
When: Missing or invalid Authorization header
{
"request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"error": {
"status": 401,
"type": "unauthorized",
"message": "Authentication required",
"details": {}
}
}404not_found
When: The ID doesn't exist or isn't accessible to the authenticated user
{
"request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"error": {
"status": 404,
"type": "not_found",
"message": "Contact not found",
"details": {}
}
}Contact Object
| Field | Type | Description |
|---|---|---|
id | integer | Contact identifier |
contact_type | string|null | lender_contact or 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 |
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 |