Quick Start
Make your first API call in under 2 minutes.
Get your API key
Sign up for a free trial — your API key is in your dashboard under Settings → API Key. You get free credits to start.
Make your first call
All requests go to one endpoint: POST https://api.linkfinderai.com. Change the type field to select the enrichment you need.
Handle the response
Every response includes a status field ("success" or "error") and a result field with your data. Some requests respond differently — see Sync vs Async below.
# Find a company's website — your first API call curl -X POST "https://api.linkfinderai.com" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_API_KEY" \ -d '{ "type": "company_name_to_website", "input_data": "Tesla" }'
import requests API_KEY = "YOUR_API_KEY" response = requests.post( "https://api.linkfinderai.com", headers={ "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json", }, json={ "type": "company_name_to_website", "input_data": "Tesla", } ) data = response.json() print(data["result"]) # "tesla.com"
const API_KEY = "YOUR_API_KEY"; const response = await fetch("https://api.linkfinderai.com", { method: "POST", headers: { "Authorization": `Bearer ${API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ type: "company_name_to_website", input_data: "Tesla", }), }); const data = await response.json(); console.log(data.result); // "tesla.com"
// Success { "result": "tesla.com", "status": "success" } // Not found { "result": null, "status": "error", "message": "Company not found" }
linkedin_profile_to_phone. Each endpoint below shows its own cost. Every request is charged including failed lookups where no data is found. Check your remaining credits in your dashboard.Authentication
Pass your API key in the Authorization header on every request.
Authorization: Bearer YOUR_API_KEY
headers = {"Authorization": "Bearer YOUR_API_KEY"}
headers: { "Authorization": `Bearer ${API_KEY}` }
Sync vs Async Requests
Most endpoints respond immediately with your data. One endpoint — linkedin_profile_to_linkedin_info — always returns a job_id instead, which you then poll for the result. Look for the Sync / Async tag on each endpoint below; the async one shows the exact request + poll calls side by side in its section.
202 response with status: "processing" is not an error — it's the expected response for the always-async endpoint. Poll the returned poll_url until status is "done". Job results expire after 10 minutes.linkedin_profile_to_linkedin_info triggers a live LinkedIn scrape, which normally takes about one minute. Wait ~60s before your first poll, then poll every 10-15s after that — polling immediately or more frequently will just return "status": "processing" until the scrape finishes, and can trip our rate limits.202 / job_id / poll_url shape instead of an immediate result, even for endpoints tagged Sync. This is most likely on company_domain_to_employees, since bulk employee lookups can take longer than average. Don't assume a fixed response shape based on endpoint name alone — always check whether the response contains a job_id before parsing it as a final result.Credits & Rate Limits
1 credit = 1 API request, regardless of endpoint. Credits reset at the start of each billing cycle.
| Plan | Credits / month | Requests / second | Batch size |
|---|---|---|---|
| Starter | 5,000 | 5 req/s | Up to 500 URLs |
| Professional | 20,000 | 10 req/s | Up to 500 URLs |
| Enterprise | 50,000 | 20 req/s | Up to 500 URLs |
| HyperGrowth | 250,000 | 50 req/s | Up to 500 URLs |
input_data value, no bulk parameter), space requests out to roughly one per second per API key — firing them back-to-back is the most common cause of 429 errors. If you need to process a large list of URLs, contact support about bulk/batch access rather than looping individual calls.429 Too Many Requests. Implement exponential backoff — wait 1s, then 2s, then 4s between retries.Company Enrichment
Look up company details from a name or domain. Each request costs 1 credit. All endpoints in this section are Sync.
curl -X POST "https://api.linkfinderai.com" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{"type": "company_name_to_website", "input_data": "Tesla"}'requests.post(url, headers=headers, json={
"type": "company_name_to_website",
"input_data": "Tesla"
})curl -X POST "https://api.linkfinderai.com" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{"type": "company_name_to_phone", "input_data": "Tesla"}'curl -X POST "https://api.linkfinderai.com" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{"type": "company_name_to_email", "input_data": "Tesla"}'curl -X POST "https://api.linkfinderai.com" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{"type": "company_name_to_employee_count", "input_data": "Tesla"}'curl -X POST "https://api.linkfinderai.com" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{"type": "company_name_to_linkedin_url", "input_data": "Tesla"}'| Parameter | Type | Required | Description |
|---|---|---|---|
input_data | string | Required | Company domain e.g. tesla.com |
department | string | Optional | Filter by department e.g. "marketing", "engineering" |
seniority | string | Optional | Filter by seniority e.g. "director", "manager" |
employee_count | integer | Optional | Max results to return |
curl -X POST "https://api.linkfinderai.com" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"type": "company_domain_to_employees",
"input_data": "tesla.com",
"department": "marketing",
"seniority": "director",
"employee_count": 20
}'202 with a job_id instead — if so, follow the same polling flow described in Sync vs Async.B2B Data Lookup
Look up business contacts profiles, company pages, and posts without using your own LinkedIn account. Zero ban risk. One endpoint below is always async — look for the purple Async tag.
Always async — this call returns a job_id, then you poll for the result. Request and poll shown side by side below.
1 Make the request
curl -X POST "https://api.linkfinderai.com" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{"type": "linkedin_profile_to_linkedin_info", "input_data": "https://linkedin.com/in/john-doe"}'
// Returns immediately:
{
"job_id": "c9f1e2a0-...",
"status": "processing",
"poll_url": "https://api.linkfinderai.com/status/c9f1e2a0-..."
}
2 Poll for the result
curl "https://api.linkfinderai.com/status/c9f1e2a0-..." \
-H "Authorization: Bearer YOUR_API_KEY"
// Wait ~60s before your first poll, then repeat every 10-15s until:
{
"status": "done",
"data": { "result": {...}, "status": "success" }
}
result object can include company, education history, experience history, follower count, headline, job title, location, email, mobile number, and website — each field is only present when it was publicly discoverable for that profile. If contact data (email/phone) is your primary goal, the dedicated linkedin_profile_to_email and linkedin_profile_to_phone endpoints are purpose-built for that and may find results this endpoint doesn't.| Parameter | Type | Required | Description |
|---|---|---|---|
input_data | string | Required | Full LinkedIn profile URL e.g. https://linkedin.com/in/john-doe |
curl -X POST "https://api.linkfinderai.com" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"type": "linkedin_profile_to_email",
"input_data": "https://linkedin.com/in/john-doe"
}'response = requests.post(url, headers=headers, json={
"type": "linkedin_profile_to_email",
"input_data": "https://linkedin.com/in/john-doe"
})
print(response.json()["result"]) # "[email protected]"// Success { "result": "[email protected]", "status": "success" } // Not found { "result": null, "status": "error", "message": "Email not found" }
202 with a job_id instead — if so, follow the same polling flow described in Sync vs Async.| Parameter | Type | Required | Description |
|---|---|---|---|
input_data | string | Required | Full LinkedIn profile URL e.g. https://linkedin.com/in/john-doe |
curl -X POST "https://api.linkfinderai.com" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"type": "linkedin_profile_to_phone",
"input_data": "https://linkedin.com/in/john-doe"
}'response = requests.post(url, headers=headers, json={
"type": "linkedin_profile_to_phone",
"input_data": "https://linkedin.com/in/john-doe"
})
print(response.json()["result"]) # "+1 415 555 0198"// Success { "result": "+1 415 555 0198", "status": "success" } // Not found { "result": null, "status": "error", "message": "Phone not found" }
202 with a job_id instead — if so, follow the same polling flow described in Sync vs Async.curl -X POST "https://api.linkfinderai.com" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{"type": "linkedin_company_to_linkedin_info", "input_data": "https://linkedin.com/company/tesla"}'curl -X POST "https://api.linkfinderai.com" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{"type": "linkedin_company_to_employee_count", "input_data": "https://linkedin.com/company/tesla"}'curl -X POST "https://api.linkfinderai.com" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{"type": "lead_full_name_to_linkedin_url", "input_data": "Bill Gates Microsoft"}'| Parameter | Type | Required | Description |
|---|---|---|---|
input_data | string | Required | Professional email address e.g. [email protected] |
curl -X POST "https://api.linkfinderai.com" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"type": "email_to_linkedin_url",
"input_data": "[email protected]"
}'response = requests.post(url, headers=headers, json={
"type": "email_to_linkedin_url",
"input_data": "[email protected]"
})
print(response.json()["result"]) # "https://linkedin.com/in/john-doe"// Success { "result": "https://linkedin.com/in/john-doe", "status": "success" } // Not found { "result": null, "status": "error", "message": "LinkedIn profile not found" }
curl -X POST "https://api.linkfinderai.com" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{"type": "linkedin_post_to_reactions", "input_data": "https://www.linkedin.com/feed/update/urn:li:activity:1234567890"}'Instagram lookup
Extract profile data from public Instagram accounts.
curl -X POST "https://api.linkfinderai.com" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{"type": "instagram_profile_to_instagram_info", "input_data": "https://www.instagram.com/username"}'requests.post(url, headers=headers, json={
"type": "instagram_profile_to_instagram_info",
"input_data": "https://www.instagram.com/username"
})Error Codes
All errors return a JSON body with status: "error" and a message field.
| HTTP Code | Meaning | What to do |
|---|---|---|
| 200 | Success | Check result field — may be null if data wasn't found (still costs 1 credit) |
| 202 | Accepted — processing async | Not an error. Save the job_id and poll poll_url until status is "done" or "error". Always returned by linkedin_profile_to_linkedin_info — and may occasionally be returned by any other endpoint (most commonly company_domain_to_employees) if it takes longer than ~27 seconds to resolve. |
| 401 | Unauthorized | Missing or invalid API key — check your Authorization header |
| 402 | Insufficient credits | Top up credits or wait for next billing cycle |
| 404 | Job not found or expired | On /status/:job_id — job results expire after 10 minutes. Poll sooner next time. |
| 422 | Invalid request | Check the type value and input_data format |
| 429 | Rate limit exceeded | Implement exponential backoff — wait 1s, 2s, 4s between retries |
| 500 | Server error | Retry after 30 seconds. If persistent, contact support |
Integrations
Connect LinkFinder AI to your CRM, automation tools, and data pipelines. No code required for Zapier and Make.
linkedin_profile_to_linkedin_info requires polling and is harder to wire up in Zapier/Make without a native integration. For this endpoint, add a "Delay" step followed by a second HTTP GET call to the poll_url, repeated until status is "done". Every other endpoint can also occasionally fall back to this same job_id/poll shape if a lookup runs long (most commonly company_domain_to_employees on larger employee lists), so it's worth adding the same Delay + poll pattern as a fallback branch even on your "single step" Zaps.In the meantime, you can use the REST API directly with any HTTP action in Zapier or Make — no native integration needed.
# In Zapier: "Webhooks by Zapier" → POST action
URL: https://api.linkfinderai.com
Method: POST
Headers: Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
Body: {"type": "company_name_to_website", "input_data": "{{company_name}}"}# In Make: HTTP → Make a request module
URL: https://api.linkfinderai.com
Method: POST
Headers: Authorization: Bearer YOUR_API_KEY
Body: JSON - {"type": "company_name_to_website", "input_data": "{{company}}"}