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 schema
See the request body tables below or /platform/openapi.json for the machine-readable schema surface.
Response schema
Responses 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.
Idempotency
Use Idempotency-Key on retried writes when your client cannot guarantee whether a prior attempt succeeded.
Rate limits
See /rate-limits. Page intentionally through list endpoints and apply backoff on 429 responses.
Examples
curl, 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/contacts
limit
fields
https://api.levcapital.com/api/external/v2/contacts?limit=10

Overview

EndpointDescription
GET /contactsList contacts with pagination
GET /contacts/{id}Get a single contact
POST /contactsCreate 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/contacts
List contacts with pagination

Query parameters

ParameterTypeRequiredDescription
limitintegerOptionalResults per page (1–200, default 50)
cursorstringOptionalCursor for next page
fieldsstringOptionalComma-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

ParameterTypeRequiredDescription
contact_idintegerRequiredThe 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/contacts
Create a new contact

Request body

ParameterTypeRequiredDescription
contact_typestringRequiredContact type: lender_contact or sponsor
company_idintegerRequiredAssociated company ID
first_namestringOptionalFirst name
last_namestringOptionalLast name
emailstringOptionalEmail address
titlestringOptionalJob title
departmentstringOptionalDepartment
addressstringOptionalStreet address
citystringOptionalCity
statestringOptionalState
zipstringOptionalZIP code
linkedin_urlstringOptionalLinkedIn profile URL
is_primarybooleanOptionalWhether 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

ParameterTypeRequiredDescription
contact_idintegerRequiredThe 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

FieldTypeDescription
idintegerContact identifier
contact_typestring|nulllender_contact or sponsor
first_namestring|nullFirst name
last_namestring|nullLast name
emailstring|nullEmail address
titlestring|nullJob title
departmentstring|nullDepartment
addressstring|nullStreet address
citystring|nullCity
statestring|nullState
zipstring|nullZIP code
linkedin_urlstring|nullLinkedIn profile URL
is_primarybooleanWhether this is the primary contact
owner_account_idinteger|nullOwning account ID
is_connectedbooleanWhether this is a connected contact
created_atstring|nullCreation timestamp
updated_atstring|nullLast update timestamp