Quick Intake API

Create intake sessions programmatically from your CRM, automation platform, or custom application. Perfect for GoHighLevel, Zapier, Make.com, and custom integrations.

Base URL

https://intake.link/api/t/{slug}/quick-intake
🔑

API Key Auth

Secure authentication via header

âš¡

Instant Sessions

Create intake links in milliseconds

🔄

Deduplication

Smart email-based duplicate prevention

Authentication

All API requests require an API key passed in the X-API-Key header.

Getting Your API Key

  1. Log into your intake.link dashboard
  2. Go to Settings → Integrations
  3. Click Generate API Key
  4. Copy and securely store your key (it won't be shown again)

Security Best Practices

  • Never expose your API key in client-side code
  • Don't commit API keys to version control
  • Use environment variables in production
  • Rotate keys periodically

Create Intake Session

POST/api/t/{slug}/quick-intake

Creates a new intake session and returns a unique URL for the client to complete their intake form. If an active session already exists for the provided email, the existing session is returned instead.

Request Headers

HeaderValueRequired
Content-Typeapplication/jsonYes
X-API-KeyYour API keyYes

Request Body

FieldTypeRequiredDescription
namestringRequiredClient's full name
emailstringOptionalClient's email (used for deduplication)
phonestringOptionalClient's phone number
externalIdstringOptionalYour CRM's contact ID (for linking back)
idstringOptionalAlias for externalId (GHL compatibility)
sourcestringOptionalLead source identifier (e.g., "GHL", "Zapier")
assignedToEmailstringOptionalEmail of staff member to assign. Falls back to default assignee or org owner.

Success Response (New Session)

{
  "success": true,
  "url": "https://yourfirm.intake.link/f/Xk9mQ2bR",
  "shortId": "Xk9mQ2bR",
  "sessionId": "550e8400-e29b-41d4-a716-446655440000",
  "isNew": true,
  "hasEsign": true,
  "externalId": "ghl_contact_123",
  "source": "GHL",
  "message": "New intake session created (e-sign required)"
}

Success Response (Existing Session)

If an active session exists for the provided email, the API returns it instead of creating a duplicate:

{
  "success": true,
  "url": "https://yourfirm.intake.link/f/Xk9mQ2bR",
  "shortId": "Xk9mQ2bR",
  "sessionId": "550e8400-e29b-41d4-a716-446655440000",
  "isNew": false,
  "status": "signing",
  "hasEsign": true,
  "externalId": "ghl_contact_123",
  "source": "GHL",
  "message": "Existing session found for this email"
}

Code Examples

cURL

curl -X POST https://intake.link/api/t/yourfirm/quick-intake \
  -H "Content-Type: application/json" \
  -H "X-API-Key: il_live_your_key_here" \
  -d '{
    "name": "John Doe",
    "email": "john@example.com",
    "phone": "555-123-4567",
    "externalId": "contact_123",
    "source": "GHL"
  }'

JavaScript / Node.js

const response = await fetch(
  'https://intake.link/api/t/yourfirm/quick-intake',
  {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': process.env.INTAKE_LINK_API_KEY,
    },
    body: JSON.stringify({
      name: 'John Doe',
      email: 'john@example.com',
      phone: '555-123-4567',
      externalId: 'contact_123',
      source: 'MyApp',
    }),
  }
);

const data = await response.json();

if (data.success) {
  console.log('Intake URL:', data.url);
  // Send data.url to the client
} else {
  console.error('Error:', data.error);
}

GoHighLevel Workflow

Create a workflow with an HTTP Request action:

Method: POST
URL: https://intake.link/api/t/yourfirm/quick-intake
Headers:
  • Content-Type: application/json
  • X-API-Key: your_api_key

Body (Raw JSON):

{
  "id": "{{contact.id}}",
  "name": "{{contact.first_name}} {{contact.last_name}}",
  "email": "{{contact.email}}",
  "phone": "{{contact.phone}}",
  "source": "GHL"
}

The id field maps to externalId for linking back to your GHL contact.

Zapier Webhook

Configure a Webhooks by Zapier action:

Action: Custom Request
Method: POST
URL: https://intake.link/api/t/yourfirm/quick-intake
Data Pass-Through: False
Data: Map your trigger fields to name, email, phone
Headers:
  • Content-Type: application/json
  • X-API-Key: your_api_key

Errors & Rate Limits

Error Codes

StatusErrorCause
400Name is requiredMissing or empty name field
400Invalid JSON bodyMalformed JSON in request
401API key requiredMissing X-API-Key header
403Invalid API keyAPI key doesn't exist or is revoked
403API key does not match tenantKey belongs to different tenant
403Tenant is disabledAccount has been disabled
429Rate limit exceededToo many requests (see below)
500Failed to create sessionInternal server error

Rate Limits

60 requests per minute

Rate limits are applied per API key. The limit resets after 60 seconds. Responses include a X-RateLimit-Remaining header showing remaining requests.

Webhooks & Events

intake.link can notify your systems when events occur, such as when a client completes their intake form or signs documents.

Available Events

  • intake.completed— Client finished intake (staff approved)
  • intake.walk_in.received— Walk-in client submitted intake
  • esignature.completed— Document was signed

Webhooks are configured in your dashboard under Settings → Integrations. We recommend using Make.com for advanced automation workflows.

Inbound Leads API

Receive leads directly into your pipeline from external systems like Make.com, Zapier, or custom integrations. Leads appear in your dashboard and can be converted to intake sessions.

POST/api/leads/inbound

Request Headers

HeaderValue
AuthorizationBearer il_live_xxxxx
Content-Typeapplication/json

Request Body

FieldTypeRequiredDescription
namestringRequiredLead's full name
emailstringOptionalLead's email address
phonestringOptionalLead's phone number
practiceAreastringOptionalType of case (e.g., "Personal Injury")
notesstringOptionalAdditional notes about the lead
sourceIdstringOptionalExternal ID for deduplication (updates existing lead if matched)
assignedToEmailstringOptionalStaff email to assign this lead to. Falls back to default assignee or org owner.
metadataobjectOptionalCustom key-value data to store with the lead

Success Response

{
  "success": true,
  "lead": {
    "id": "lead_abc123xyz",
    "name": "John Smith",
    "email": "john@example.com",
    "phone": "(555) 123-4567",
    "status": "new",
    "source": "webhook",
    "assignedTo": "user_xyz789",
    "assignedToEmail": "staff@yourfirm.com",
    "createdAt": "2024-01-15T10:30:00Z"
  },
  "created": true
}

Staff Assignment

When assignedToEmail is provided, the system looks up the staff member by email. If not found or not provided, it falls back to your configured default assignee, then to the organization owner. This ensures every lead has an owner for visibility and routing in Make.com.

Need Help?

Questions about the API or need help with your integration?

inbox@intake.link