Find Career Page
Automatically discover a company’s careers or jobs page URL.
Method
services.company.careers.findPage(params);
Parameters
Company domain (e.g., “acme.com”)
Provide at least one of: domain or companyLinkedinUrl
Returns
Returns a Promise with:
The URL of the careers page
Example
const careerPage = await services.company.careers.findPage({
domain: "microsoft.com",
});
console.log(careerPage.url); // "https://careers.microsoft.com"
Scrape Job Postings
Extract structured job posting data from a careers page URL.
Method
services.company.careers.scrapeJobs(params);
Parameters
The URL of the careers page to scrape
Whether to only return exact matches (more precise but may miss some jobs)
Maximum number of jobs to return
Filter by posting date. Options: - "24h" - Last 24 hours - "week" - Last week - "month" - Last month - "all"
Whether to scrape full job descriptions (slower but more detailed)
Returns
Returns a Promise with an array of job objects:
Full job description (only if scrapeDetails: true)
Example
// Find and scrape in one flow
const careerPage = await services.company.careers.findPage({
domain: "acme.com",
});
const jobs = await services.company.careers.scrapeJobs({
url: careerPage.url,
recent: "month",
maxJobs: 50,
});
console.log(`Found ${jobs.length} jobs`);
jobs.forEach((job) => {
console.log(`${job.title} - ${job.location}`);
console.log(`Posted: ${job.datePosted}`);
});
Use Cases
Get Recent Job Postings
async function getRecentJobs(domain: string) {
// Find career page
const careerPage = await services.company.careers.findPage({ domain });
// Get jobs from last week
const jobs = await services.company.careers.scrapeJobs({
url: careerPage.url,
recent: "week",
});
return jobs;
}
const recentJobs = await getRecentJobs("stripe.com");
console.log(`${recentJobs.length} jobs posted this week`);
Analyze Hiring Trends
async function analyzeHiring(domain: string) {
const careerPage = await services.company.careers.findPage({ domain });
const jobs = await services.company.careers.scrapeJobs({
url: careerPage.url,
recent: "all",
});
// Count by department (inferred from title)
const departments = {
engineering: 0,
sales: 0,
marketing: 0,
product: 0,
other: 0,
};
jobs.forEach((job) => {
const title = job.title.toLowerCase();
if (title.includes("engineer") || title.includes("developer")) {
departments.engineering++;
} else if (title.includes("sales") || title.includes("account")) {
departments.sales++;
} else if (title.includes("marketing")) {
departments.marketing++;
} else if (title.includes("product")) {
departments.product++;
} else {
departments.other++;
}
});
return {
totalJobs: jobs.length,
byDepartment: departments,
locations: [...new Set(jobs.map((j) => j.location).filter(Boolean))],
};
}
Find Specific Roles
async function findEngineeringRoles(domain: string) {
const careerPage = await services.company.careers.findPage({ domain });
const allJobs = await services.company.careers.scrapeJobs({
url: careerPage.url,
recent: "month",
});
// Filter for engineering roles
const engineeringJobs = allJobs.filter((job) => {
const title = job.title.toLowerCase();
return title.includes("engineer") || title.includes("developer") || title.includes("software");
});
return engineeringJobs;
}
Get Full Job Details
async function getDetailedJobs(domain: string) {
const careerPage = await services.company.careers.findPage({ domain });
// Scrape with full descriptions
const jobs = await services.company.careers.scrapeJobs({
url: careerPage.url,
recent: "week",
scrapeDetails: true, // Get full descriptions
maxJobs: 20, // Limit for performance
});
jobs.forEach((job) => {
console.log(`\n${job.title}`);
console.log(`Location: ${job.location}`);
console.log(`Posted: ${job.datePosted}`);
console.log(`\nDescription:\n${job.description}`);
});
return jobs;
}
Monitor New Postings
async function checkForNewJobs(domain: string, lastCheckDate: Date) {
const careerPage = await services.company.careers.findPage({ domain });
const jobs = await services.company.careers.scrapeJobs({
url: careerPage.url,
recent: "24h",
});
// Filter by date if needed
const newJobs = jobs.filter((job) => {
if (!job.datePosted) return true;
const postDate = new Date(job.datePosted);
return postDate > lastCheckDate;
});
if (newJobs.length > 0) {
console.log(`${newJobs.length} new jobs found!`);
newJobs.forEach((job) => {
console.log(`- ${job.title} (${job.location})`);
});
}
return newJobs;
}
Compare Hiring Across Companies
async function compareHiring(domains: string[]) {
const results = await Promise.all(
domains.map(async (domain) => {
try {
const careerPage = await services.company.careers.findPage({ domain });
const jobs = await services.company.careers.scrapeJobs({
url: careerPage.url,
recent: "month",
});
return {
company: domain,
jobCount: jobs.length,
jobs,
};
} catch (error) {
console.error(`Failed to get jobs for ${domain}:`, error);
return {
company: domain,
jobCount: 0,
jobs: [],
};
}
})
);
// Sort by job count
results.sort((a, b) => b.jobCount - a.jobCount);
console.log("\nHiring Activity:");
results.forEach((r) => {
console.log(`${r.company}: ${r.jobCount} open positions`);
});
return results;
}
await compareHiring(["stripe.com", "square.com", "plaid.com"]);
Best Practices
Performance: Set scrapeDetails: false (default) for faster scraping when you only need job titles and
locations. Only enable it when you need full descriptions.
Performance: Scraping job pages can be slow for large companies with hundreds of postings. Use maxJobs to limit
results and recent to filter by date.
Exact Matching: Enable exactMatchingOnly: true for higher precision but potentially fewer results. Leave it
disabled for broader coverage.
Error Handling
async function getJobsSafely(domain: string) {
try {
// Try to find career page
const careerPage = await services.company.careers.findPage({ domain });
if (!careerPage?.url) {
console.log("No career page found");
return [];
}
// Try to scrape jobs
const jobs = await services.company.careers.scrapeJobs({
url: careerPage.url,
recent: "month",
});
return jobs;
} catch (error) {
console.error("Failed to get jobs:", error);
return [];
}
}
Integration Example
// Complete company intelligence workflow
async function getCompanyIntelligence(domain: string) {
// Get company profile
const companyUrl = await services.company.linkedin.findUrl({
website: domain,
});
const company = await services.company.linkedin.enrich({
url: companyUrl,
enrichLevel: "extended",
});
// Get job postings
const careerPage = await services.company.careers.findPage({ domain });
const jobs = await services.company.careers.scrapeJobs({
url: careerPage.url,
recent: "month",
});
return {
company: {
name: company.company_name,
size: company.employees_count,
industry: company.industry,
},
hiring: {
activeJobs: jobs.length,
recentPostings: jobs,
departments: jobs.reduce((acc, job) => {
// Categorize jobs...
return acc;
}, {}),
},
};
}