Jobs Data API (v3, current version)

In this guide, you'll learn about the JobFront API, how to authenticate API calls, and response data formats.


Quickstart

Retrieve a paginated list of jobs from SpaceX, using your Bearer token:

curl https://api.jobfront.io/v3/sources/spacex.com/jobs -H "Authorization: Bearer XACCESSTOKENX"
{
    "data": [
        {
            <job_post_object>
        },
        {
             <job_post_object>
        },
        
        ...     
        
    ],
    "limit":10,
    "metrics": {
        "count_jobs": 855,
        "updated_at": 1724032522
    },
    "offset": 25,
}

API Root URL

JobFront's API is hosted at the following root url. Each endpoint is specified below. The most recent API version is currently 'v3'

https://api.jobfront.io/v3/<endpoint>

Data Formatting

All time fields are unix timestamps, returned via the api as numbers.


Authentication

JobFront's API uses Bearer tokens to authenticate API calls. When you make API calls to JobFront, you must include this Bearer token in the Authorization header

Authorization: Bearer <api_token>
curl https://api.jobfront.io/v3/<endpoint> -H "Authorization: Bearer <api_token>"

You can create a Bearer token directly in the JobFront app after logging in (https://app.jobfront.io)

Create API Tokens, in this example the token is XXXXXXXX.

Rate Limits

If you make API requests above the limit, you will receive a 429 HTTP code "Too Many Requests".

Please implement backoffs if this happens.

The current API rate limits are set at 60 requests per minute.

Please connect with us if you need to increase your account limits.


Job Post Object <job_post_object>

See below common fields and descriptions in each job post data object

{
    "job_id": "Jf1f9f4b992f946d7b01cfa78aba62605_O123", #Unique identifier
    "created_at": 1723897640, #unix timestamp when the job was discovered (but importantly not necessarily posted, it's when JobFront first detected the job via our scrapers)
    "job_status": "active", #Options: active, inactive
    "job_title": "Product Manager",    
    "job_description": "XXX", #AI-created and summarized
    "job_level": "senior", #Options: internship, entry_level, junior, mid_level, senior, expert (default: "" blank, if not detected)
    "job_commitment": "full_time", #Options: full_time, part_time, internship, contract, other (default: "" blank, if not detected)
    "job_compensation_min": 150000,
    "job_compensation_max": 180000,
    "job_compensation_currency": "USD",
    "job_compensation_period": "year", #Options: hour, week, month, year
    "is_internship": 0, #AI-created tag based on all job post info (default: 0)
    "is_remote": 0, #AI-created tag based on all job post info (default: 0)    "is_remote": 0, #AI-created tag based on all job post info (default: 0)
    "is_offers_visa_sponsorship": 0, #AI-created tag based on all job post info (default: 0)   
    "url_job": "https://jobs.lever.co/arraylabs.io/2729568b-e714-4ab2-846b-b46207c341b3",
    "job_post_html": "<div></div>", #Full HTML of job post    
    "job_location": "Palo Alto, California, United States", #Freetext primary location
    "job_location_type": "on_site", #Available options: on_site, remote, remote_restricted, hybrid, other (default: "" blank, if not detected)
    "job_locations_list": [{'city':'San Francisco','state':'California','country':'United States','latitude':37.7749,'longitude':122.4194,'zip_code':12345}], #Further expanded list of available locations, with lat/long and city/state/country fields already parsed
    "job_locations_common_list": [], #AI-created, location entities from top 100 global cities
    "job_benefits_list":["Free lunch and dinner on-site"],#AI-created list of freetext job benefits
    "job_requirements_list":["PhD in engineering required"],#AI-created list of freetext job requirements
    "job_categories_list":["Engineering (Software)"],#AI-created tags describing different pre-set job categories    
    "job_tags_list": ["Product"], #(optional) Supports list of multiple tags, personalized for your organizations job board
    "source_object": { 
        <source_object> 
    },
}

Source Object <source_object>

See below common fields and descriptions in each source (organization, job posts origin, hiring company) data object

{
    "source_id": "Sc1f32833b4764abea375f7678b7d2244",
    "source_name": "SpaceX",
    "source_description": "SpaceX is a space launch vehicle and satellite company",   
    "source_icon_url": "https://s3.jobfront-public/123.png",         
    "source_industry_list": [
        "Aerospace",
        "Manufacturing",
        "Transportation",
    ],
    "source_tags_list": [
        "Space Launch",
    ],
    "url_careers": "https://www.spacex.com/careers",
    "url_jobboard": "https://boards.greenhouse.io/embed/job_board?for=spacex",
    "url_source": "spacex.com",
    "url_links_dictionary": {
        "linkedin": "http://www.linkedin.com/company/spacex",
    },
    "count_jobboard_jobs": 855,
    "count_jobboard_jobs_success_at": 1724032522,
}


Job Search - Get jobs list in reverse chronological order based on search query/filters

On JobFront job boards, jobs are displayed in reverse chronological order. You can retrieve jobs from the API using the 2-step approach below:

1) Query Filters - a list of available filters to use in the job search query. View and select filters based on this response, which is personalized to your job board/token.

2) Job Search - highly configurable and filterable list of jobs, in reverse chronological order. These are the jobs that have passed through your filters for your job board and through your query filters from step 1) above.

The query filters are optional, so you can also request jobs directly from the Job Search endpoint.

Query Filters

For your job board, there are certain location, job tags, industry tags, and other filters that you can specify in your API calls to retrieve more customized results.

Please reach out if you'd like to add new filters or tags into the API, we can add new filters based on our Jobs dataset ([email protected])

You can retrieve these filter options with the following API call:

GET https://api.jobfront.io/v3/jobs/options
(Success) - 200 json dictionary of options
(Failure) - 4xx with an error message

200 Example Response

{
  "filters": [
    "Design", 
    "Marketing", 
    "Product"
  ], 
  "locations": [
    "Remote", 
    "Atlanta", 
    "Austin", 
    "Boston",
    
    ...
    
  ]
}

Now you can use these options in the below API to retrieve jobs that match any combination of these filter options. If you'd like to select multiple locations, please separate multiple entries with a ',' comma. For example:

GET https://api.jobfront.io/v3/jobs?locations=Remote,Atlanta,Austin

LOCATION FREETEXT SEARCH - In addition to searching by city, you can search freetext location information such as: locations=california,michigan

You can also include free-text search inputs that will search not only these industry/location/category tags but also the full job posting itself for keywords.

Keep in mind that adding more filter options is done via an OR filter. Specifying multiple locations/filters will match jobs in any of those locations/filters.

NOTE - If you are on a high-volume enterprise plan, your account searching may be limited (filters on category and industries may not be available on your account without a job board attached to it - different customers define these parameters differently for their audiences. We recommend pulling full XML files)

You can use one or more query filter options specified above, or retrieve the full list of jobs in your account by not specifying any query filter options.

In the Response, the 'metrics' dictionary will display total count of all available jobs that match your filters, to help with pagination and user experience (if you are displaying jobs to a user).

GET https://api.jobfront.io/v3/jobs

Optional Fields:
limit (default 10)
offset (defult 0) <- for paginated results, include offset = 10 for example
categories (default empty) <- only available to customers w/ a job board+categories, not api-only
locations (default empty)
search (default empty)

Complex Searches

You can use both 'include' and 'exclude' options in our search interface by adding "-" and "+" in front of your search queries. For example, include both "document" and "extraction" matches but not the phrase "document extraction". By default, all search terms will be inclusive "+" if not explicitly added. Phrases will be separated by each "," comma in the search parameter.

This approach to inclusion vs exclusion is available for both the search and locations search options.

https://api.jobfront.io/v3/jobs?search=+document,+extraction,-document extraction

AND/OR Searches

You can also compose complex and/or searches on both locations= and search= filters. This is done with the | operator. For example:

https://api.jobfront.io/v3/jobs?locations=+california|new york,-san diego&search=+mobile,+engineer,+ios,-android|electron&limit=100

This example search will return jobs in California OR in New York, it will also not include jobs specifically in San Diego. It will return jobs that match all of these 3 keywords together mobile+engineer+ios, but not jobs that match android or electron.

Longer example:

GET https://api.jobfront.io/v3/jobs?limit=10&locations=Atlanta
(Success) - 200 dictionary, including a list of json job post dictionaries
(Failure) - 4xx with an error message

200 Example Response

{
    "data": [
        {
           <job_post_object>
        },
        {
            <job_post_object>
        },
        
        ...
        
    ],
    "limit": 10,
    "metrics": {
        "count_jobs": 448,
        "updated_at": 1724040613
    },
    "offset": 25
}

'count_jobs' is the total number of jobs on your job board or total number of jobs available with your search query. Keep in mind this includes all jobs from all sources that you track, that also meet and pass through your configured filters.

Note that this endpoint uses numerical pagination (see: offset: 0). Some other endpoints use proper string cursors to paginate through the full dataset. This inconsistency will be remedied in future versions of the api, but is designed in this version to enable faster response times for this particular search/ endpoint.

Job Categories

Every job is tagged with up to 5 of these job function categories below. The tagging will try to classify the most likely at the beginning of the list, and least likely tag at the end of the list of responses.

You can use these categories in your own app for sorting/filtering and display, and you can add any of these categories into the jobs api above and return only jobs that match that tag.

  • Engineering (Software)

  • Engineering (Hardware)

  • DevOps

  • Cybersecurity

  • IT & Business Systems

  • Technical Support

  • Quality Assurance

  • Design

  • Product

  • Data & Analytics

  • Artificial Intelligence, Data Science, & Machine Learning

  • Sales

  • Marketing

  • Growth

  • Partnerships

  • Customer Success

  • Social Media

  • Content

  • Community

  • Program Management

  • Operations

  • Business Development

  • People (HR)

  • People (Recruiting)

  • Legal

  • Finance

  • Supply Chain

  • Office & Admin

  • Learning & Development

  • Corporate Strategy

  • Investing & Corporate Development

  • Research

  • Diversity & Inclusion

  • Event Planning

  • Procurement

  • Vertical Specific


Get Jobs List for Source/Company

You can retrieve all jobs for a given company based on that company domain. You can also retrieve jobs by source domain OR by source_id

Option 1) Get jobs by domain (url_source)

GET https://api.jobfront.io/v3/sources/<url_source>/jobs

Required Fields:
url_source - required domain, such as spacex.com

Optional Fields:
limit = 10 (default: 25)
offset = 25 (default: 0)
(Success) - 200 dictionary, including list of json job post dictionaries
(Failure) - 4xx with an error message

200 Example Response

{
    "data": [
        {
            <job_post_object>
        },
        {
            <job_post_object>
        },
        
        ...
        
    ],
    "limit":10,
    "metrics": {
        "count_jobs": 855,
        "updated_at": 1724032522
    },
    "offset":25
}

Option 2) Get jobs by company/source id (source_id)

GET https://api.jobfront.io/v3/sources-id/<source_id>/jobs

Required Fields:
source_id - required id, such as SpaceX's internal unique id 'Sc1f32833b4764abea375f7678b7d2244'

Optional Fields:
limit = 10 (default: 25)
offset = 25 (default: 0)

All other details pertaining to the formatting and response are the same as when you're retrieving jobs based on url_source / domain just above.


Get all sources in my account

This is a 2-step process: 1) get my collections of sources, and 2) get sources within each collection.

Collections of sources are groups of similar companies/organizations, and while many accounts have a single collection it is possible over time that you may need to organize collections of your sources into different groupings.

Step 1) Get my Collections

GET https://api.jobfront.io/v3/collections

This API request will use your Bearer token to retrieve your account/organization, and discover collections that you have activated in your account.

Note: You can add, remove, or edit your collections when you log in to your admin dashboard at https://app.jobfront.io in the "Aggregators & Scrapers" tab

(Success) - 200 dictionary, including list of json collection dictionaries
(Failure) - 4xx with an error message

200 Example Response

{
    "data": [
        {
            "collection_description": "Jobs for transportation products and services",
            "collection_id": "C123xyz",
            "collection_name": "Transportation jobs",
            "count_sources": 8,
            "created_at": 0,
            "is_active": 1,
            "is_private": 0,
            "updated_at": 1725043568
        }    
    ],
    "metrics": {
        "count_collections": 1,
    }
}

Step 2) Get Sources within a Collection

GET https://api.jobfront.io/v3/collections/<collection_id>/sources

Required Fields:
collection_id - required id specifying a given collection (retrieved above, from account list)

Optional Fields:
offset - optional offset field to paginate through results (default 0)
limit - count limit in response (default 1000)
(Success) - 200 dictionary, including list of json sources dictionaries
(Failure) - 4xx with an error message

200 Example Response

{
    "collection_id": "C123xyz",
    "data": [
        {
            <source_object>
        },
        
        ...
        
    ],
    "metrics": {
        "count_sources": 1
    }
}

Another 200 Example Response with pagination

{
    "collection_id": "C123xyz",
    "data": [
        {
            <collection source object>
        },
        {
            <collection source object>
        },
        {
            <collection source object>
        },
        
        ...
        
    ],
    "limit":1000,
    "metrics": {
        "count_sources": 244
    },
    "offset":0
}

Reaching the end of paginated results

If you paginate through all results with no additional results available, you'll receive an empty data field. The metrics field will continue to be returned.

{
    "data": [],
    "metrics": {
        "count_jobs": 855,
        "updated_at": 1724032522
    }
}

Please also note that as you paginate through results, if there are no additional pages, the cursor field will not be available but if it is the final page you will still receive data field entries. For example:


Get Job by job_id

While the above jobs lists will contain all information about a job, sometimes it's important to retrieve only one job post at a time.

GET https://api.jobfront.io/v3/jobs/<job_id>

Required Fields:
job_id - unique job identifier
(Success) - 200 json job post dictionary
(Failure) - 4xx with an error message

Example API Call

GET https://api.jobfront.io/v3/jobs/J825ab25a74a84176aa0b0b995c453a13_O123

Example API Response

{
    <job_post_object>
}


Get Source by domain (url_source)

Retrieve information about a given source, which includes company name/description, location, logo, and other metadata.

GET https://api.jobfront.io/v3/sources/<url_source>

Required Fields:
url_source - domain of the company

Note: When adding the url_source of the company, please use the naked domain. For example, please use 'spacex.com' and not 'https://www.spacex.com'.

(Success) - 200 json company source dictionary
(Failure) - 4xx with an error message

Example API Call

GET https://api.jobfront.io/v3/sources/spacex.com

Example API Response

{
    <source_object>
}

It's important to note that our jobs scrapers run about once per day right now, so you can keep track of when the 'count_jobboard_jobs' was last updated with the field 'count_jobbard_jobs_success_at' to indicate to your users when this active jobboard count was last updated.

Get Company/Source by id (source_id)

If you prefer, you can also retrieve a company/source by their unique internal source_id. This may be helpful for your internal organization, or if you have a domain that is changing. We constantly track domains of the sources we track, and will update the url_source domain when we notice a change.

(We are building a series of webhooks to track these types of company/source changes). In the meantime, you can retrieve sources based on their source_id. Responses will be in the same format as above:

GET https://api.jobfront.io/v3/sources-id/<source_id>

Required Fields:
source_id - internal id of the source

Example API Call

GET https://api.jobfront.io/v3/sources-id/Sc1f32833b4764abea375f7678b7d2244

Example API Response

{
    <source_object>
}

You can retrieve a list of all sources in your account using the above endpoint "Get all sources in my account" documented above


A note on timestamps

By default, 'created_at' unix timestamps signify when jobs are scraped by JobFront systems.

There is one exception:

  • When a Job Board is added to our scraping system, the first time we track/scrape that job board (and only the first time) we will search for a standardized Google-SEO-optimized JobPosting timestamp that helps us determine when that job was originally added to the Job Board

  • If we detect this information about when a job was originally posted in a reputable format, we will adjust the 'created_at' time to represent when the job was actually posted

  • We do not do this on an ongoing basis, because sometimes jobs are toggled 'active' and 'inactive' and this Google-optimized information is not updated. On an ongoing basis, we will assign the created_at time to when the scrape took place.

'updated_at' unix timestamps are updated any time a job is updated. This includes any internal process or data augmentation, any re-scraping that we do, or any adjustments to the job post itself (such as adjustments to the job title)

Last updated