npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

scrape-indeed

v0.6.0

Published

Scrape ca.indeed.com job postings.

Readme

Scrape Indeed

What is it?

  • Node.js package that allows flexible job searching of Indeed's job postings.
  • Uses ES6 Promises to handle asynchronous control flow.

Why use it?

  • Allows your web app to get full job posting data from Indeed.
  • Can use it for 63 countries (see https://www.indeed.com/worldwide)
  • You don't have to deal with Indeed's cluttered interface.

How to use it?

Installation

Install from NPM registry:

npm install scrape-indeed

Basic usage.

// Require our module.
const IndeedService = require('scrape-indeed')();

// Test with: node test.js 'Programmer' 'Vancouver' 25 50
let options = {
    title: process.argv[2],     // Programmer
    location: process.argv[3],  // Vancouver
    country: process.argv[4],   // Canada
    radius: process.argv[5],    // 25 kilometer radius
    count: process.argv[6]      // 50 job postings
};

IndeedService.query(options)
.then(function(data) {
    // Do something with data ...
    console.log(data.jobList);
})
.catch(function(err) {
    console.log('Error: ' + err);
});

That's great. But that only gives us n job postings.

  • We can ask for the next n ads by using IndeedService.nextPage()
  • We can see which ad index we're currently at by using IndeedService.parameters.adIndex
  • Once we've performed a search, the returned data object has a property containing the total number of job postings: data.featuredAdCount
// Require our module.
const IndeedService = require('scrape-indeed')();

let options = {
    title: process.argv[2],
    location: process.argv[3],
    country: process.argv[4],   // Canada
    radius: process.argv[5],    // 25 kilometer radius
    count: process.argv[6]      // 50 job postings
};

// Get initial Indeed data using IndeedService.query()
IndeedService.query(options)
.then(function(data) {
    console.log(data.jobList);

    // Get next `n` job postings, depending on your options
    // NOTE: This will overwrite the current data ...
    return IndeedService.nextPage();
})
.then(function(data) {
    // Do something with next `n` job postings
    console.log(data.jobList);

    // View the current jobs index and total jobs
    console.log(`You've viewed [${IndeedService.parameters.adIndex}] jobs out of [${data.featuredAdCount}] total jobs.`);
})
.catch(function(err) {
    console.log('Error: ' + err);
});

What does the data look like?

Look at the table to see the different kinds of data available.

IndeedService.query() returns an object containing ...

| name | datatype | description | |------|----------|-------------| | salaryList | array | List of links to job searches sorted by salary ($50000+, $70000+, etc.) | | jobTypeList | array | ... sorted by job type (SALARY, CONTRACT, HOURLY, etc.)| | locationList | array | ... sorted by location (Toronto, Newmarket, Richmond Hill, etc.) | | companyList | array | ... sorted by company | | titleList | array | ... sorted by job title (Senior Web Developer, Junior Dev, C Developer, etc.) | | jobList | array | List of all main job postings [JSON format] |


Below is an example of what a main job posting is. jobList contains a list of these main postings. indeed-disection


jobList object contains ...

| name | datatype | description | |------|----------|-------------| | href | string | A complete URL to the Canadian job posting | | title | string | Job title of posting | | isSponsored | boolean | Indicates whether the posting is Sponsored. Sponsored ads are seen first/last | | company | string | Company name of job posting | | location | string | Geographical location of job | | salary | string | Indicates salary/hourly wage | | summary | string | Short summary of the job posting | | datePosted | string | Indicates # of days since inception. Maximum is 30+ days |

Known issues?

  • Some main job postings will be missing data ('N/A')
    • This is because job posters don't provide all information

Backlog

  • ~~Allow all North American jobs to be searched, rather than only Canada.~~ (0.5.0)
  • ~~Allow a single object to be passed into query function, rather than a separate parameter for each search token.~~ (0.4.0)
  • ~~Allow wide range of job postings to be searched, rather than default 10 per query.~~ (0.4.0)
  • ~~Create NPM registry to enable npm install.~~ (0.3.2)