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
/api/lead-captureList all lead capture endpoints for the authenticated user, newest first.
curl --location --request GET 'https://outreach.weezly.com/api/lead-capture' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{
"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
/api/lead-captureCreate a new capture endpoint. The response includes the generated token; the public intake URL is /api/intake/{token}.
Request Body
| Parameter | Type | Description |
|---|---|---|
namerequired | string | Endpoint name (for your reference) |
leadListId | string | Destination lead list ID. Must be a list you own. Can be set later via PATCH. |
enrich | boolean | Automatically enrich submitted profiles (name, company, title) on capture (default: true) |
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
}'{
"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
| 200 | Endpoint created |
| 400 | Name is required, or the lead list was not found |
Update Capture Endpoint
/api/lead-capture/:idUpdate a capture endpoint's name, active state, enrichment setting, or destination list. Set leadListId to null to detach the list.
Request Body
| Parameter | Type | Description |
|---|---|---|
name | string | Endpoint name |
active | boolean | Pause (false) or resume (true) the endpoint. Inactive endpoints return 404 to submitters. |
enrich | boolean | Toggle automatic enrichment on capture |
leadListId | string|null | Destination lead list ID, or null to detach |
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
}'{
"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
| 200 | Endpoint updated |
| 400 | Lead list not found |
| 404 | Endpoint not found |
Delete Capture Endpoint
/api/lead-capture/:idDelete a capture endpoint. Its public intake URL stops working immediately. Leads already captured are not affected.
curl --location --request DELETE 'https://outreach.weezly.com/api/lead-capture/:id' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{ "ok": true }Response Codes
| 200 | Endpoint deleted |
| 404 | Endpoint not found |
Public Intake
Submit a Lead
/api/intake/:tokenPublic 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
| Parameter | Type | Description |
|---|---|---|
linkedin_urlrequired | string | LinkedIn profile URL. Also accepted as linkedinUrl, url, or linkedin. |
first_name | string | First name. Also accepted as firstName. |
last_name | string | Last name. Also accepted as lastName. |
email | string | Email address |
company | string | Company name |
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"
}'<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>{ "ok": true }Response Codes
| 200 | Lead captured (the response never includes internal IDs) |
| 400 | Invalid JSON body, or no valid LinkedIn profile URL submitted |
| 404 | Unknown or inactive token |
| 409 | The endpoint has no destination list configured, or the list no longer exists |
| 429 | Rate limit exceeded (20 submissions per minute, 500 per day, per endpoint) |
How Captured Leads Are Processed
| Enrichment | When 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. |
| Deduplication | Leads are deduplicated by LinkedIn URL. Re-submitting the same person never creates a duplicate or double-enrolls them. |
| Auto-enrollment | Leads landing in a list connected to an active campaign are enrolled automatically within about a minute. |