Weezly Outreach
|Developer Docs

Lead Capture API

Turn a LinkedIn URL submitted from any external website or form into a lead. Each capture endpoint has an unguessable public URL that drops submissions into a lead list, where they auto-enroll into a running campaign connected to that list.

Capture Endpoints

Management endpoints use your standard API key authentication. Each capture endpoint you create gets a unique token used in its public intake URL.

List Capture Endpoints

GET/api/lead-capture

List all lead capture endpoints for the authenticated user, newest first.

Request — cURLcURL
curl --location --request GET 'https://outreach.weezly.com/api/lead-capture' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response - 200 OKJSON
{
  "endpoints": [
    {
      "id": "lce_001",
      "name": "Website demo form",
      "token": "lc_Xk2mP9qRvT4wYzABCDefGhiJkLmN0pQr",
      "active": true,
      "leadListId": "list_abc123",
      "leadList": { "id": "list_abc123", "name": "Website Leads" },
      "enrich": true,
      "capturedCount": 42,
      "lastCaptureAt": "2026-08-18T14:22:00.000Z",
      "lastError": null,
      "createdAt": "2026-08-01T09:00:00.000Z"
    }
  ]
}

Create Capture Endpoint

POST/api/lead-capture

Create a new capture endpoint. The response includes the generated token; the public intake URL is /api/intake/{token}.

Request Body

ParameterTypeDescription
namerequiredstringEndpoint name (for your reference)
leadListIdstringDestination lead list ID. Must be a list you own. Can be set later via PATCH.
enrichbooleanAutomatically enrich submitted profiles (name, company, title) on capture (default: true)
Request — cURLcURL
curl --location --request POST 'https://outreach.weezly.com/api/lead-capture' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "Website demo form",
  "leadListId": "list_abc123",
  "enrich": true
}'
Response - 200 OKJSON
{
  "endpoint": {
    "id": "lce_002",
    "name": "Website demo form",
    "token": "lc_Ab3cD5eF7gH9iJkLmN0pQrStUvWxYz12",
    "active": true,
    "leadListId": "list_abc123",
    "leadList": { "id": "list_abc123", "name": "Website Leads" },
    "enrich": true,
    "capturedCount": 0,
    "lastCaptureAt": null,
    "lastError": null,
    "createdAt": "2026-08-19T10:00:00.000Z"
  }
}

Response Codes

200Endpoint created
400Name is required, or the lead list was not found

Update Capture Endpoint

PATCH/api/lead-capture/:id

Update a capture endpoint's name, active state, enrichment setting, or destination list. Set leadListId to null to detach the list.

Request Body

ParameterTypeDescription
namestringEndpoint name
activebooleanPause (false) or resume (true) the endpoint. Inactive endpoints return 404 to submitters.
enrichbooleanToggle automatic enrichment on capture
leadListIdstring|nullDestination lead list ID, or null to detach
Request — cURLcURL
curl --location --request PATCH 'https://outreach.weezly.com/api/lead-capture/:id' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "active": false
}'
Response - 200 OKJSON
{
  "endpoint": {
    "id": "lce_002",
    "name": "Website demo form",
    "token": "lc_Ab3cD5eF7gH9iJkLmN0pQrStUvWxYz12",
    "active": false,
    "leadListId": "list_abc123",
    "leadList": { "id": "list_abc123", "name": "Website Leads" },
    "enrich": true,
    "capturedCount": 42,
    "lastCaptureAt": "2026-08-18T14:22:00.000Z",
    "lastError": null,
    "createdAt": "2026-08-01T09:00:00.000Z"
  }
}

Response Codes

200Endpoint updated
400Lead list not found
404Endpoint not found

Delete Capture Endpoint

DELETE/api/lead-capture/:id

Delete a capture endpoint. Its public intake URL stops working immediately. Leads already captured are not affected.

Request — cURLcURL
curl --location --request DELETE 'https://outreach.weezly.com/api/lead-capture/:id' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response - 200 OKJSON
{ "ok": true }

Response Codes

200Endpoint deleted
404Endpoint not found

Public Intake

Submit a Lead

POST/api/intake/:token

Public endpoint that accepts a LinkedIn profile URL and drops it into the capture endpoint's lead list. No authentication header is needed: the unguessable token in the path is the credential. CORS is open (POST only, no credentials), so it can be called directly from browser forms on any domain.

Request Body

ParameterTypeDescription
linkedin_urlrequiredstringLinkedIn profile URL. Also accepted as linkedinUrl, url, or linkedin.
first_namestringFirst name. Also accepted as firstName.
last_namestringLast name. Also accepted as lastName.
emailstringEmail address
companystringCompany name
Request - cURLShell
curl --request POST \
  --url https://outreach.weezly.com/api/intake/lc_YOUR_ENDPOINT_TOKEN \
  --header 'Content-Type: application/json' \
  --data '{
    "linkedin_url": "https://www.linkedin.com/in/sarah-chen",
    "first_name": "Sarah",
    "last_name": "Chen",
    "email": "sarah@example.com",
    "company": "Acme Corp"
  }'
Example - HTML formHTML
<form id="lead-form">
  <input name="linkedin_url" placeholder="Your LinkedIn profile URL" required />
  <input name="email" type="email" placeholder="Work email" />
  <button type="submit">Get in touch</button>
</form>
<script>
  document.getElementById("lead-form").addEventListener("submit", async (e) => {
    e.preventDefault();
    const data = Object.fromEntries(new FormData(e.target));
    await fetch("https://outreach.weezly.com/api/intake/lc_YOUR_ENDPOINT_TOKEN", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify(data),
    });
    e.target.innerHTML = "<p>Thanks! We will be in touch.</p>";
  });
</script>
Response - 200 OKJSON
{ "ok": true }

Response Codes

200Lead captured (the response never includes internal IDs)
400Invalid JSON body, or no valid LinkedIn profile URL submitted
404Unknown or inactive token
409The endpoint has no destination list configured, or the list no longer exists
429Rate limit exceeded (20 submissions per minute, 500 per day, per endpoint)

How Captured Leads Are Processed

EnrichmentWhen enrich is on, the profile is automatically enriched on submit (name, headline, job title, company, location, photo). Fields you submit take priority; enrichment fills the gaps. Enrichment is best-effort and never drops a lead.
DeduplicationLeads are deduplicated by LinkedIn URL. Re-submitting the same person never creates a duplicate or double-enrolls them.
Auto-enrollmentLeads landing in a list connected to an active campaign are enrolled automatically within about a minute.