Skip to main content

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:

  1. Initiates a company search with your criteria
  2. Polls for completion
  3. 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

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
CodeRange
A1-10
B11-50
C51-200
D201-500
E501-1000
F1001-5000
G5001-10000
H10001+