Skip to content

Contacts

Contacts are people associated with companies. They can be leads, clients, candidates, investors, or any other type. Portal access is controlled via portal_access and portal_role fields.

Routes

GET /api/contacts

List contacts with pagination and filters.

Auth: Required
Query params:

ParamTypeDescription
company_idstringFilter by company
typestringFilter by contact_type (lead, client, candidate, investor, end_user)
sourcestringFilter by source
searchstringSearch full_name or email
pagenumberDefault: 1
limitnumberDefault: 25, max: 100

Response:

json
{
  "ok": true,
  "data": {
    "items": [
      {
        "id": "ct_a1b2c3d4",
        "email": "jane@acme.com",
        "full_name": "Jane Smith",
        "company_id": "co_e5f6g7",
        "company_name": "Acme Corp",
        "contact_type": "client",
        "portal_access": 1,
        "portal_role": "client_admin"
      }
    ],
    "total": 120,
    "page": 1,
    "limit": 25,
    "hasMore": true
  }
}

GET /api/contacts/:id

Get a single contact with company name.

Auth: Required
Path params: id — contact ID


POST /api/contacts

Create a new contact.

Auth: Required
Request body:

FieldTypeRequiredDescription
emailstringyes (or company_id)Email address
company_idstringyes (or email)Link to company
first_namestringnoFirst name
last_namestringnoLast name
full_namestringnoOverrides first+last concat
titlestringnoJob title
rolestringnoRole type
departmentstringnoDepartment
phonestringnoPhone number
contact_typestringnoDefault: end_user
sourcestringnoDefault: manual
pipeline_stagestringnoCRM pipeline stage
funnel_stagestringnoMarketing funnel stage
linkedin_urlstringnoLinkedIn profile URL
tagsstringnoComma-separated tags
notesstringnoInternal notes
portal_accessintegerno1 = can log in to portal
portal_rolestringnoclient_admin, client_viewer

Response: 201 Created

json
{
  "ok": true,
  "data": {
    "id": "ct_a1b2c3d4",
    "full_name": "Jane Smith",
    "email": "jane@acme.com"
  }
}

PATCH /api/contacts/:id

Update contact fields.

Auth: Required
Path params: id
Request body: Any subset of:

company_id, email, first_name, last_name, full_name, title, role, department, phone, contact_type, source, pipeline_stage, funnel_stage, engagement_score, last_engagement_at, enrichment_status, enrichment_data, linkedin_url, photo_url, close_lead_id, close_contact_id, tags, notes, portal_access, portal_role

Response:

json
{ "ok": true, "data": { "id": "ct_a1b2c3d4", "updated": true } }

Portal Access

To grant a contact access to a product portal:

bash
curl -X PATCH https://api.sprintmode.ai/api/contacts/ct_a1b2c3d4 \
  -H "X-SM-Key: <key>" \
  -H "Content-Type: application/json" \
  -d '{ "portal_access": 1, "portal_role": "client_admin" }'

The contact can then log in via magic link or Google SSO. Their products[] array in the JWT will include the product they're tagged with.

Sprint Mode LLC — Internal Platform Documentation