Your sales team needs to find all SaaS companies in San Francisco with 50-200 employees that are actively hiring.
Manually, this would take days. You'd search LinkedIn one by one, check each company page, verify they're hiring, export to a spreadsheet.
With a company search API: 30 seconds. 147 matching companies. Complete data on each.
But here's the problem: LinkedIn's official API doesn't let you search companies. At all.
You can post to your company page. You can pull analytics. But searching? Finding companies that match your ideal customer profile? LinkedIn says no.
So how do sales teams, marketers, and investors actually find and enrich company data at scale?
Unofficial company search APIs.
This guide shows you exactly how to find companies on LinkedIn, enrich them with detailed data, and build automated workflows that would take weeks manually. We'll cover real use cases (not theory), working code examples, and the best APIs for the job.
By the end, you'll be able to build a company intelligence system that updates itself automatically.
Why You Need a Company Search API
Let's be honest about what manual company research actually costs:
The Manual Approach
Scenario: You need to find 200 SaaS companies in your ICP (Ideal Customer Profile).
Your ICP:
- Industry: Software/SaaS
- Location: United States
- Size: 50-500 employees
- Currently hiring (growth signal)
Manual process:
11. Search LinkedIn: "software company United States"
22. Click each result
33. Check employee count (is it 50-500?)
44. Check location (is it really US-based?)
55. Check Jobs tab (are they hiring?)
66. Copy data to spreadsheet
77. Repeat 200 times
8
9Time per company: 5-7 minutes
10Total time: 1,000-1,400 minutes (16-23 hours)
11Cost at $50/hour: $800-1,150And you still have incomplete data: no tech stack, no growth rate, no decision-maker contacts.
The API Approach
Same task with LinkdAPI:
1from linkdapi import LinkdAPI
2
3api = LinkdAPI("your_api_key")
4
5# Search companies matching your ICP
6companies = api.search_companies(
7 keyword="software saas",
8 geo_urn="103644278", # United States
9 company_size=["51-200", "201-500"],
10 has_jobs=True
11)
12
13# Get full data for each
14for company in companies['data']:
15 details = api.get_company_info(company_id=company['id'])
16 jobs = api.get_company_jobs(company['id'])
17
18 # You now have everything
19 print(f"{details['data']['name']}: {len(jobs['data'])} open roles")
20
21# Time: 30 seconds
22# Cost: $0.20 (200 companies × $0.001 per search)Savings: 16-23 hours → 30 seconds. $800-1,150 → $0.20.
That's a 4,000-5,750x ROI.
Real Business Impact
Sales teams:
- Build target account lists 100x faster
- Keep account data always up-to-date
- Identify buying signals (hiring, expansion)
- Never waste time on companies outside ICP
Marketing teams:
- Segment accounts for ABM campaigns
- Personalize ads by company attributes
- Track market trends and shifts
- Identify early adopters in new markets
Investors:
- Monitor portfolio companies automatically
- Find similar companies to investments
- Track hiring trends (growth indicator)
- Identify acquisition targets
Example ROI:
1Sales team (10 reps):
2- Manual research: 10 hours/week/rep = 100 hours/week
3- API automation: 10 minutes/week total
4- Time saved: 99.5 hours/week
5- Value at $50/hour: $4,975/week = $258,700/year
6
7API cost: $150-300/month = $1,800-3,600/year
8
9ROI: 7,186-14,372%Official vs Unofficial APIs
Let's clear this up: LinkedIn's official API cannot search companies.
LinkedIn Official API (Marketing Developer Platform)
What you CAN do:
- ✅ Post to your company page
- ✅ Get analytics for your page
- ✅ Manage sponsored content
- ✅ Access your own company data
What you CANNOT do:
- ❌ Search for companies
- ❌ Get competitor data
- ❌ Access public company pages
- ❌ List companies by criteria
- ❌ Get employee counts
- ❌ See job postings
The reality: The official API is for managing your company page, not researching other companies.
Unofficial Company APIs
These APIs access LinkedIn's publicly available company data programmatically.
How they work:
- You provide search criteria (industry, size, location)
- API searches LinkedIn's public company pages
- Returns structured data (JSON format)
- No LinkedIn account needed (account-less)
Legal status: The hiQ Labs vs. LinkedIn case (2022) established that scraping publicly available data is legal. These APIs operate within this framework.
Key difference:
1Official API:
2- Manage YOUR company page ✓
3- Research OTHER companies ✗
4
5Unofficial API:
6- Manage YOUR company page ✗
7- Research OTHER companies ✓For 99% of use cases (sales, marketing, research), you need an unofficial API.
What Data You Can Get
Here's everything you can access about companies through a good LinkedIn company API:
Basic Company Information
1{
2 "name": "Stripe",
3 "universalName": "stripe",
4 "description": "Online payment processing for internet businesses",
5 "website": "https://stripe.com",
6 "logo": "https://media.licdn.com/...",
7 "banner": "https://media.licdn.com/...",
8 "tagline": "Financial infrastructure for the internet",
9 "industry": "Financial Services",
10 "specialties": ["Payments", "API", "Developer Tools"]
11}Size & Location
1{
2 "employeeCount": 7500,
3 "employeeCountRange": "5001-10000",
4 "headquarters": {
5 "city": "San Francisco",
6 "country": "United States",
7 "geographicArea": "California",
8 "postalCode": "94103",
9 "line1": "510 Townsend St"
10 },
11 "locations": [
12 {"city": "San Francisco", "country": "United States"},
13 {"city": "Dublin", "country": "Ireland"},
14 {"city": "Singapore", "country": "Singapore"}
15 ]
16}Social Proof & Engagement
1{
2 "followerCount": 850000,
3 "entityUrn": "urn:li:organization:2135371",
4 "url": "https://www.linkedin.com/company/stripe",
5 "founded": 2010
6}Affiliated Companies
1{
2 "affiliatedCompanies": [
3 {
4 "name": "Stripe Climate",
5 "logo": "https://...",
6 "url": "https://www.linkedin.com/company/stripe-climate"
7 }
8 ]
9}Job Postings (Hiring Signals!)
1{
2 "jobs": [
3 {
4 "title": "Senior Backend Engineer",
5 "location": "San Francisco, CA",
6 "workplaceType": "On-site",
7 "listedAt": "2025-01-02",
8 "url": "https://www.linkedin.com/jobs/view/..."
9 },
10 {
11 "title": "Product Manager - Payments",
12 "location": "Remote",
13 "workplaceType": "Remote",
14 "listedAt": "2025-01-05"
15 }
16 ],
17 "totalJobs": 127
18}Why jobs matter: Companies that are actively hiring are growing. This is a massive buying signal for B2B sales.
Company Posts & Updates
1{
2 "posts": [
3 {
4 "text": "Excited to announce Stripe's new instant payouts feature...",
5 "postedAt": "2025-01-08",
6 "likes": 1240,
7 "comments": 58,
8 "shares": 89
9 }
10 ]
11}Similar Companies
1{
2 "similarCompanies": [
3 {"name": "Square", "id": "1049"},
4 {"name": "Adyen", "id": "244447"},
5 {"name": "PayPal", "id": "1065"}
6 ]
7}Use case: Find more companies like your best customers.
LinkdAPI Company Endpoints
LinkdAPI provides 9 endpoints for comprehensive company intelligence:
1. Search Companies (The Starting Point)
Find companies matching criteria:
1from linkdapi import LinkdAPI
2
3api = LinkdAPI("your_api_key")
4
5# Search by keyword and filters
6results = api.search_companies(
7 keyword="artificial intelligence",
8 geo_urn="103644278", # United States
9 company_size=["51-200", "201-500"],
10 has_jobs=True,
11 industry="6" # Computer Software
12)
13
14print(f"Found {len(results['data'])} companies")
15
16for company in results['data']:
17 print(f"- {company['name']} ({company['employeeCount']} employees)")Available filters:
keyword: Search term (company name, industry keywords)geo_urn: Geographic location (country, city, region)company_size: Employee count ranges ("1-10", "11-50", "51-200", etc.)has_jobs: Only companies with open positionsindustry: LinkedIn industry codesstart: Pagination (0, 25, 50, etc.)
Response:
1{
2 "success": true,
3 "data": [
4 {
5 "id": "1441",
6 "name": "OpenAI",
7 "universalName": "openai",
8 "logo": "https://...",
9 "employeeCount": 500,
10 "location": "San Francisco, CA"
11 }
12 ]
13}2. Company Name Lookup (Quick Search)
Search companies by name (useful for fuzzy matching):
1# Find company by partial name
2results = api.company_name_lookup(query="micro")
3
4# Returns: Microsoft, Micro Focus, MicroStrategy, etc.
5for company in results['data']:
6 print(f"{company['name']} - {company['id']}")Use case: User types "goo" → suggest Google, Goodreads, Goodyear
3. Get Company Info (Full Profile)
Get complete company details:
1# By company ID
2company = api.get_company_info(company_id="1441")
3
4# Or by name
5company = api.get_company_info(name="OpenAI")
6
7data = company['data']
8print(f"Name: {data['name']}")
9print(f"Description: {data['description']}")
10print(f"Website: {data['website']}")
11print(f"Employees: {data['employeeCount']}")
12print(f"Founded: {data['founded']}")
13print(f"Headquarters: {data['headquarters']['city']}")
14print(f"Followers: {data['followerCount']}")Response includes:
- Full company profile
- All locations
- Industry details
- Social proof (followers)
- Founded date
- Specialties/keywords
4. Get Company Employees Data
Get employee count and growth metrics:
1employees = api.get_company_employees_data(company_id="1441")
2
3print(f"Total employees: {employees['data']['employeeCount']}")
4print(f"Growth: {employees['data']['employeeGrowth']}%")Why this matters: Employee growth = company growth = buying power
5. Get Company Jobs (Hiring Signals!)
See all open positions:
1jobs = api.get_company_jobs(company_ids="1441", start=0)
2
3print(f"Open positions: {len(jobs['data'])}")
4
5for job in jobs['data']:
6 print(f"- {job['title']}")
7 print(f" Location: {job['location']}")
8 print(f" Posted: {job['listedAt']}")
9 print(f" Type: {job['workplaceType']}") # Remote/On-site/HybridMultiple companies at once:
1# Check multiple competitors
2jobs = api.get_company_jobs(
3 company_ids=["1441", "2382910", "791962"]
4)
5
6# Compare hiring activity
7for company_jobs in jobs['data']:
8 print(f"{company_jobs['company']}: {len(company_jobs['jobs'])} openings")6. Get Similar Companies
Find competitors and adjacent companies:
1similar = api.get_similar_companies(company_id="1441")
2
3for company in similar['data']:
4 print(f"- {company['name']}")
5 print(f" Employees: {company['employeeCount']}")
6 print(f" Industry: {company['industry']}")Use case: You land Stripe as a customer. Find 50 more payment companies.
7. Get Company Affiliated Pages
Find subsidiaries and related pages:
1affiliated = api.get_company_affiliated_pages(company_id="1035")
2
3for page in affiliated['data']:
4 print(f"- {page['name']}")
5 print(f" URL: {page['url']}")Example: Google → YouTube, Google Cloud, Waymo, etc.
8. Get Company Posts
See recent company updates:
1posts = api.get_company_posts(company_id="1441", start=0)
2
3for post in posts['data']:
4 print(f"Posted: {post['postedAt']}")
5 print(f"Text: {post['text'][:100]}...")
6 print(f"Engagement: {post['likes']} likes, {post['comments']} comments")Use case: Track competitor announcements, product launches, hiring news
9. Get Company ID from Username
Convert LinkedIn URL to company ID:
1# You have: https://linkedin.com/company/openai
2# You need: Company ID for other API calls
3
4company_id = api.get_company_id(universal_name="openai")
5print(f"OpenAI ID: {company_id['data']['id']}")
6
7# Now use this ID for other endpoints
8info = api.get_company_info(company_id=company_id['data']['id'])Use Case 1: Find Target Companies
Scenario: You're selling HR software. You need to find tech companies with 100-500 employees that are actively hiring.
Step 1: Search with Filters
1from linkdapi import LinkdAPI
2
3api = LinkdAPI("your_api_key")
4
5# Define your ICP
6target_companies = api.search_companies(
7 keyword="technology software",
8 company_size=["101-250", "251-500"],
9 has_jobs=True, # Must be hiring (buying signal!)
10 geo_urn="103644278" # United States
11)
12
13print(f"Found {len(target_companies['data'])} target companies")Step 2: Enrich Each Company
1enriched_companies = []
2
3for company in target_companies['data']:
4 # Get full company details
5 details = api.get_company_info(company_id=company['id'])
6
7 # Get hiring data
8 jobs = api.get_company_jobs(company['id'])
9
10 # Combine data
11 enriched = {
12 'name': details['data']['name'],
13 'website': details['data']['website'],
14 'employees': details['data']['employeeCount'],
15 'location': details['data']['headquarters']['city'],
16 'open_positions': len(jobs['data']),
17 'hiring_for': [job['title'] for job in jobs['data'][:5]],
18 'founded': details['data']['founded'],
19 'industry': details['data']['industry']
20 }
21
22 enriched_companies.append(enriched)
23
24# Save to CSV
25import csv
26
27with open('target_companies.csv', 'w', newline='') as f:
28 writer = csv.DictWriter(f, fieldnames=enriched_companies[0].keys())
29 writer.writeheader()
30 writer.writerows(enriched_companies)
31
32print(f"Exported {len(enriched_companies)} companies to target_companies.csv")Step 3: Prioritize by Signals
1# Score companies by buying signals
2for company in enriched_companies:
3 score = 0
4
5 # More hiring = higher score
6 if company['open_positions'] > 20:
7 score += 3
8 elif company['open_positions'] > 10:
9 score += 2
10 elif company['open_positions'] > 5:
11 score += 1
12
13 # Growing companies
14 if company['employees'] > 300:
15 score += 2
16
17 # Recently founded (high growth phase)
18 if company['founded'] > 2015:
19 score += 1
20
21 # Hiring HR roles (direct signal!)
22 hr_keywords = ['human resources', 'people ops', 'recruiter', 'talent']
23 if any(keyword in job.lower() for job in company['hiring_for'] for keyword in hr_keywords):
24 score += 5 # MAJOR signal!
25
26 company['priority_score'] = score
27
28# Sort by score (highest first)
29enriched_companies.sort(key=lambda x: x['priority_score'], reverse=True)
30
31# Your top 20 targets
32top_targets = enriched_companies[:20]
33
34for i, company in enumerate(top_targets, 1):
35 print(f"{i}. {company['name']} (Score: {company['priority_score']})")
36 print(f" {company['open_positions']} open roles, hiring {company['hiring_for'][0]}")Result: Prioritized list of companies most likely to buy, with clear reasons why.
Use Case 2: Build Company Profiles
Scenario: You have a list of 500 companies. You need complete profiles on each.
The Full Company Intelligence System
1def build_complete_profile(company_name):
2 """
3 Create comprehensive company intelligence report
4 """
5 # 1. Find the company
6 lookup = api.company_name_lookup(query=company_name)
7
8 if not lookup['data']:
9 return None
10
11 company_id = lookup['data'][0]['id']
12
13 # 2. Get full details
14 info = api.get_company_info(company_id=company_id)
15
16 # 3. Get hiring data
17 jobs = api.get_company_jobs(company_id)
18
19 # 4. Get similar companies
20 similar = api.get_similar_companies(company_id)
21
22 # 5. Get recent activity
23 posts = api.get_company_posts(company_id, start=0)
24
25 # 6. Get affiliated companies
26 affiliated = api.get_company_affiliated_pages(company_id)
27
28 # 7. Compile report
29 profile = {
30 'basic_info': {
31 'name': info['data']['name'],
32 'website': info['data']['website'],
33 'description': info['data']['description'],
34 'founded': info['data']['founded'],
35 'industry': info['data']['industry']
36 },
37 'size_and_location': {
38 'employees': info['data']['employeeCount'],
39 'headquarters': info['data']['headquarters']['city'],
40 'all_locations': [loc['city'] for loc in info['data'].get('locations', [])]
41 },
42 'social_proof': {
43 'followers': info['data']['followerCount'],
44 'linkedin_url': info['data']['url']
45 },
46 'hiring_signals': {
47 'open_positions': len(jobs['data']),
48 'top_roles': [job['title'] for job in jobs['data'][:10]],
49 'hiring_locations': list(set(job['location'] for job in jobs['data'])),
50 'remote_jobs': sum(1 for job in jobs['data'] if 'remote' in job.get('workplaceType', '').lower())
51 },
52 'competitive_landscape': {
53 'similar_companies': [comp['name'] for comp in similar['data'][:10]]
54 },
55 'recent_activity': {
56 'latest_post': posts['data'][0]['text'][:200] if posts['data'] else None,
57 'post_engagement': posts['data'][0]['likes'] if posts['data'] else 0
58 },
59 'company_structure': {
60 'subsidiaries': [aff['name'] for aff in affiliated['data']]
61 }
62 }
63
64 return profile
65
66# Build profiles for your list
67company_names = ["Stripe", "Square", "Adyen", "PayPal"]
68
69profiles = {}
70for name in company_names:
71 print(f"Building profile for {name}...")
72 profile = build_complete_profile(name)
73 if profile:
74 profiles[name] = profile
75
76# Save profiles
77import json
78
79with open('company_profiles.json', 'w') as f:
80 json.dump(profiles, f, indent=2)
81
82print(f"Built {len(profiles)} complete company profiles")Generate Reports
1def generate_company_report(profile):
2 """
3 Create human-readable report from profile data
4 """
5 report = f"""
6COMPANY INTELLIGENCE REPORT
7============================
8
9Company: {profile['basic_info']['name']}
10Website: {profile['basic_info']['website']}
11Industry: {profile['basic_info']['industry']}
12
13OVERVIEW
14--------
15{profile['basic_info']['description']}
16
17Founded: {profile['basic_info']['founded']}
18Employees: {profile['size_and_location']['employees']}
19Headquarters: {profile['size_and_location']['headquarters']}
20LinkedIn Followers: {profile['social_proof']['followers']:,}
21
22HIRING ACTIVITY (BUYING SIGNAL)
23-------------------------------
24Open Positions: {profile['hiring_signals']['open_positions']}
25Remote Roles: {profile['hiring_signals']['remote_jobs']}
26
27Top Hiring Areas:
28"""
29
30 for role in profile['hiring_signals']['top_roles'][:5]:
31 report += f" • {role}\n"
32
33 report += f"""
34COMPETITIVE LANDSCAPE
35--------------------
36Similar Companies:
37"""
38
39 for competitor in profile['competitive_landscape']['similar_companies'][:5]:
40 report += f" • {competitor}\n"
41
42 report += f"""
43RECENT ACTIVITY
44---------------
45Latest Post: {profile['recent_activity']['latest_post']}
46Engagement: {profile['recent_activity']['post_engagement']} likes
47
48COMPANY STRUCTURE
49-----------------
50"""
51
52 if profile['company_structure']['subsidiaries']:
53 report += "Subsidiaries:\n"
54 for sub in profile['company_structure']['subsidiaries'][:5]:
55 report += f" • {sub}\n"
56 else:
57 report += "No affiliated companies listed\n"
58
59 return report
60
61# Generate reports for all profiles
62for company_name, profile in profiles.items():
63 report = generate_company_report(profile)
64
65 # Save to file
66 filename = f"{company_name.replace(' ', '_')}_report.txt"
67 with open(filename, 'w') as f:
68 f.write(report)
69
70 print(f"Generated {filename}")Output: Professional intelligence reports on every company.
Use Case 3: Track Competitors
Scenario: You want to monitor your top 10 competitors daily for changes.
Automated Competitor Monitoring
1import schedule
2import time
3from datetime import datetime
4
5competitors = [
6 {"name": "Competitor A", "id": "12345"},
7 {"name": "Competitor B", "id": "67890"},
8 {"name": "Competitor C", "id": "11223"}
9]
10
11def monitor_competitor(company_id, company_name):
12 """
13 Check for changes in competitor activity
14 """
15 # Get current data
16 info = api.get_company_info(company_id=company_id)
17 jobs = api.get_company_jobs(company_id)
18 posts = api.get_company_posts(company_id, start=0)
19
20 # Load previous data
21 import json
22 import os
23
24 filename = f"competitor_{company_id}_history.json"
25
26 if os.path.exists(filename):
27 with open(filename, 'r') as f:
28 previous = json.load(f)
29 else:
30 previous = {}
31
32 # Detect changes
33 changes = []
34
35 # Employee count changed
36 current_employees = info['data']['employeeCount']
37 if previous.get('employees') and current_employees != previous['employees']:
38 change = current_employees - previous['employees']
39 changes.append(f"Employee count: {previous['employees']} → {current_employees} ({change:+d})")
40
41 # New job postings
42 current_jobs = len(jobs['data'])
43 if previous.get('jobs') and current_jobs > previous['jobs']:
44 new_jobs = current_jobs - previous['jobs']
45 changes.append(f"New job postings: {new_jobs} added")
46
47 # Show what roles they're hiring for
48 recent_jobs = jobs['data'][:new_jobs]
49 for job in recent_jobs:
50 changes.append(f" • {job['title']} ({job['location']})")
51
52 # New posts
53 if posts['data']:
54 latest_post_time = posts['data'][0]['postedAt']
55 if previous.get('latest_post') != latest_post_time:
56 changes.append(f"New LinkedIn post: {posts['data'][0]['text'][:100]}...")
57
58 # Follower count changed
59 current_followers = info['data']['followerCount']
60 if previous.get('followers') and current_followers != previous['followers']:
61 change = current_followers - previous['followers']
62 changes.append(f"Followers: {previous['followers']:,} → {current_followers:,} ({change:+,})")
63
64 # Save current state
65 current_state = {
66 'employees': current_employees,
67 'jobs': current_jobs,
68 'followers': current_followers,
69 'latest_post': posts['data'][0]['postedAt'] if posts['data'] else None,
70 'last_checked': datetime.now().isoformat()
71 }
72
73 with open(filename, 'w') as f:
74 json.dump(current_state, f, indent=2)
75
76 # Alert if changes detected
77 if changes:
78 alert = f"""
79🚨 COMPETITOR ALERT: {company_name}
80{'='*50}
81Detected changes:
82"""
83 for change in changes:
84 alert += f" • {change}\n"
85
86 alert += f"\nChecked: {datetime.now().strftime('%Y-%m-%d %H:%M')}"
87
88 print(alert)
89
90 # Send to Slack/email (implement your notification system)
91 send_notification(alert)
92 else:
93 print(f"✅ {company_name}: No changes detected")
94
95def daily_competitor_scan():
96 """
97 Run daily competitor monitoring
98 """
99 print(f"\n=== Daily Competitor Scan: {datetime.now().strftime('%Y-%m-%d %H:%M')} ===\n")
100
101 for competitor in competitors:
102 monitor_competitor(competitor['id'], competitor['name'])
103 time.sleep(2) # Be nice to the API
104
105# Schedule daily checks
106schedule.every().day.at("09:00").do(daily_competitor_scan)
107
108# Or run immediately for testing
109daily_competitor_scan()
110
111# Keep running
112while True:
113 schedule.run_pending()
114 time.sleep(3600) # Check every hourStart building with 100 free credits
Access profiles, companies, jobs, and more through our reliable, high-performance API. No credit card required.
Alerts you'll get:
1🚨 COMPETITOR ALERT: Competitor A
2==================================================
3Detected changes:
4 • Employee count: 450 → 478 (+28)
5 • New job postings: 12 added
6 • Senior Backend Engineer (Remote)
7 • Product Manager - Enterprise (SF)
8 • Sales Director (NYC)
9 • New LinkedIn post: Excited to announce our Series B funding...
10 • Followers: 45,230 → 47,891 (+2,661)
11
12Checked: 2025-01-08 09:00Why this matters:
- Hiring surge = competitor growing fast
- New funding announcement = they have budget to spend
- Executive hires = strategic shifts
- Sales roles = aggressive growth mode
Use Case 4: Identify Hiring Signals
Scenario: You sell recruitment software. Companies that are actively hiring are perfect prospects.
Find Companies With Massive Hiring Activity
1def find_hiring_companies(min_jobs=10):
2 """
3 Find companies with significant hiring activity
4 """
5 # Search for companies with jobs
6 companies = api.search_companies(
7 company_size=["51-200", "201-500", "501-1000"],
8 has_jobs=True
9 )
10
11 hiring_intelligence = []
12
13 for company in companies['data']:
14 # Get detailed job data
15 jobs = api.get_company_jobs(company['id'])
16
17 if len(jobs['data']) >= min_jobs:
18 # Analyze the jobs
19 job_analysis = analyze_hiring_patterns(jobs['data'])
20
21 hiring_intelligence.append({
22 'company': company['name'],
23 'company_id': company['id'],
24 'total_jobs': len(jobs['data']),
25 'hiring_analysis': job_analysis
26 })
27
28 # Sort by hiring activity
29 hiring_intelligence.sort(key=lambda x: x['total_jobs'], reverse=True)
30
31 return hiring_intelligence
32
33def analyze_hiring_patterns(jobs):
34 """
35 Extract insights from job postings
36 """
37 analysis = {
38 'departments': {},
39 'locations': {},
40 'remote_ratio': 0,
41 'seniority': {'senior': 0, 'mid': 0, 'entry': 0}
42 }
43
44 for job in jobs:
45 # Department analysis
46 title = job['title'].lower()
47 if 'engineer' in title or 'developer' in title:
48 analysis['departments']['Engineering'] = analysis['departments'].get('Engineering', 0) + 1
49 elif 'sales' in title or 'account' in title:
50 analysis['departments']['Sales'] = analysis['departments'].get('Sales', 0) + 1
51 elif 'product' in title or 'manager' in title:
52 analysis['departments']['Product'] = analysis['departments'].get('Product', 0) + 1
53 elif 'marketing' in title:
54 analysis['departments']['Marketing'] = analysis['departments'].get('Marketing', 0) + 1
55
56 # Location analysis
57 location = job.get('location', 'Unknown')
58 analysis['locations'][location] = analysis['locations'].get(location, 0) + 1
59
60 # Remote work
61 if 'remote' in job.get('workplaceType', '').lower():
62 analysis['remote_ratio'] += 1
63
64 # Seniority
65 if 'senior' in title or 'lead' in title or 'principal' in title:
66 analysis['seniority']['senior'] += 1
67 elif 'junior' in title or 'entry' in title or 'associate' in title:
68 analysis['seniority']['entry'] += 1
69 else:
70 analysis['seniority']['mid'] += 1
71
72 # Calculate remote percentage
73 analysis['remote_ratio'] = (analysis['remote_ratio'] / len(jobs)) * 100
74
75 return analysis
76
77# Find companies with big hiring pushes
78hiring_companies = find_hiring_companies(min_jobs=15)
79
80# Generate report
81print("\n🔥 TOP HIRING COMPANIES\n")
82
83for i, company in enumerate(hiring_companies[:20], 1):
84 analysis = company['hiring_analysis']
85
86 print(f"{i}. {company['company']}")
87 print(f" Total Open Roles: {company['total_jobs']}")
88 print(f" Remote: {analysis['remote_ratio']:.0f}%")
89 print(f" Top Department: {max(analysis['departments'], key=analysis['departments'].get)}")
90 print(f" Hiring Locations: {', '.join(list(analysis['locations'].keys())[:3])}")
91 print()
92
93# Export for sales team
94with open('hiring_hotlist.csv', 'w', newline='') as f:
95 writer = csv.writer(f)
96 writer.writerow(['Company', 'Open Roles', 'Remote %', 'Top Department', 'Locations'])
97
98 for company in hiring_companies:
99 analysis = company['hiring_analysis']
100 writer.writerow([
101 company['company'],
102 company['total_jobs'],
103 f"{analysis['remote_ratio']:.0f}%",
104 max(analysis['departments'], key=analysis['departments'].get) if analysis['departments'] else 'N/A',
105 ', '.join(list(analysis['locations'].keys())[:3])
106 ])
107
108print("✅ Exported hiring_hotlist.csv for sales team")


