Automating Company Searches at Scale
Automate LinkedIn Sales Navigator company searches via API—no LinkedIn account, cookies, or browser extensions needed.
What You'll Build
A Python script that:
- Initiates a company search with your criteria
- Polls for completion
- Retrieves all matching companies
Example output:
Search initiated: search-companies-1765182228712-o0d7sgs9t
Status: processing (30/100 results)
Status: done (100/100 results)
Found 100 companies
Search Criteria Example
We'll search for companies matching:
- Size: 1,001-10,000 employees (codes F, G)
- Headquarters: United States
- Hiring on LinkedIn: No
For all available filters, see Company Search Filters.
Step-by-Step Implementation
Step 1: Initiate the Search
import requests
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.infoplug.io"
def initiate_search():
response = requests.post(
f"{BASE_URL}/search-companies",
headers={
"X-INFOPLUG-API-KEY": API_KEY,
"Content-Type": "application/json"
},
json={
"company_headcounts": ["F", "G"], # F=1001-5000, G=5001-10000
"headquarters_location": [103644278], # United States
"hiring_on_linkedin": "false",
"limit": 100
}
)
response.raise_for_status()
return response.json().get("request_id")
Response:
{
"message": "Company search job created",
"request_id": "search-companies-1765182228712-o0d7sgs9t",
"status": "pending",
"search_type": "filters",
"limit": 100
}
Step 2: Poll for Completion
import time
def wait_for_completion(request_id):
while True:
response = requests.get(
f"{BASE_URL}/get-company-search-status",
headers={"X-INFOPLUG-API-KEY": API_KEY},
params={"request_id": request_id}
)
response.raise_for_status()
data = response.json()
status = data.get("status")
results_found = data.get("results_found", 0)
limit = data.get("limit", 0)
print(f"Status: {status} ({results_found}/{limit} results)")
if status == "done":
return True
if status == "failed":
return False
time.sleep(30) # Check every 30 seconds
Response:
{
"status": "done",
"message": "Found 100/100 results. Use /get-company-results to retrieve data.",
"total_count": 250,
"results_found": 100,
"limit": 100
}
Step 3: Fetch Results
def fetch_results(request_id):
all_results = []
page = 1
while True:
response = requests.get(
f"{BASE_URL}/get-company-results",
headers={"X-INFOPLUG-API-KEY": API_KEY},
params={"request_id": request_id, "page": page}
)
response.raise_for_status()
data = response.json().get("data", [])
if not data:
break
all_results.extend(data)
page += 1
return all_results
Full Script
Copy this complete script to get started:
import requests
import time
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.infoplug.io"
def initiate_search():
response = requests.post(
f"{BASE_URL}/search-companies",
headers={
"X-INFOPLUG-API-KEY": API_KEY,
"Content-Type": "application/json"
},
json={
"company_headcounts": ["F", "G"], # F=1001-5000, G=5001-10000
"headquarters_location": [103644278],
"hiring_on_linkedin": "false",
"limit": 100
}
)
response.raise_for_status()
return response.json().get("request_id")
def wait_for_completion(request_id):
while True:
response = requests.get(
f"{BASE_URL}/get-company-search-status",
headers={"X-INFOPLUG-API-KEY": API_KEY},
params={"request_id": request_id}
)
response.raise_for_status()
data = response.json()
status = data.get("status")
results_found = data.get("results_found", 0)
limit = data.get("limit", 0)
print(f"Status: {status} ({results_found}/{limit} results)")
if status == "done":
return True
if status == "failed":
return False
time.sleep(30)
def fetch_results(request_id):
all_results = []
page = 1
while True:
response = requests.get(
f"{BASE_URL}/get-company-results",
headers={"X-INFOPLUG-API-KEY": API_KEY},
params={"request_id": request_id, "page": page}
)
response.raise_for_status()
data = response.json().get("data", [])
if not data:
break
all_results.extend(data)
page += 1
return all_results
if __name__ == "__main__":
print("Initiating search...")
request_id = initiate_search()
print(f"Request ID: {request_id}")
if wait_for_completion(request_id):
results = fetch_results(request_id)
print(f"Found {len(results)} companies")
for company in results[:3]: # Preview first 3
print(f" - {company.get('name')} ({company.get('employee_count')} employees)")
else:
print("Search failed")
Pricing
- Initiation: 25 credits (charged even if no results)
- Status checks: Free
- Results: 0.5 credits per company
Example: 100 companies = 25 + (0.5 × 100) = 75 credits
Headcount Codes
| Code | Range |
|---|---|
| A | 1-10 |
| B | 11-50 |
| C | 51-200 |
| D | 201-500 |
| E | 501-1000 |
| F | 1001-5000 |
| G | 5001-10000 |
| H | 10001+ |