Skip to content
    ↑↓ to choose · Enter to open

    · 12 min read

    JobsDB Scraper: 33 Data Fields, Up to 1,000 Free Results/Month (2026)

    By CrawlerBros Engineering Team

    Each record carries 33 output fields, including title, companyName, salaryLabel, workTypes, and direct jobUrl links. Covering Hong Kong and Thailand, this Actor features six modes with filters for numeric salary ranges, work arrangements, and posting dates. Results cost $5.00 per 1,000 items on Apify's free plan.

    Try it: open JobsDB Scraper on Apify, sign in on the free plan and run the prefilled example.

    Can you try JobsDB Scraper before paying?

    Yes. Apify's free plan includes $5.00 of prepaid usage every month and asks for no credit card. At $0.005 per result, that covers up to 1,000 results of JobsDB Scraper a month, before run-start charges and platform usage.

    JobsDB Scraper was last updated on 2026-08-12. It is one of 1,725 Actors CrawlerBros publishes on Apify, which together have 686,270 lifetime public runs and an average rating of 4.63 out of 5 across 416 reviews.

    What does it cost to run JobsDB Scraper?

    Each result costs $0.005 on Apify's free plan, which is $5.00 per 1,000 results. Starting a run is charged separately at $0.005 per GB of Actor memory. Apify also bills the platform usage each run consumes, at the rates of your Apify plan, on top of these charges.

    Apify plan Per result Per 1,000 results
    FREE $0.005 $5.00
    BRONZE $0.00433 $4.33
    SILVER $0.00367 $3.67
    GOLD $0.003 $3.00
    PLATINUM $0.003 $3.00
    DIAMOND $0.003 $3.00

    The maxItems control dictates the total dataset items written during an execution. Result charges apply only to items written to the dataset alongside platform usage fees, so setting a small maxItems value limits overall costs while testing inputs. Keep maxItems low on initial test runs to confirm your search parameters before collecting large datasets.

    How do you run JobsDB Scraper from the API?

    The schema marks 2 of its 16 controls as required: mode, country. Every value in the payload below comes from the published schema's own prefills, which means you can paste it, swap the token, and get a real result.

    Call the synchronous endpoint to start a run and receive dataset items in one request:

    curl -X POST "https://api.apify.com/v2/acts/crawlerbros~jobsdb-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"mode":"searchJobs","country":"HK"}'
    

    The same run from Python, using the official client:

    from apify_client import ApifyClient
    
    client = ApifyClient("<YOUR_APIFY_TOKEN>")
    
    run_input = {
      "mode": "searchJobs",
      "country": "HK"
    }
    
    run = client.actor("crawlerbros~jobsdb-scraper").call(run_input=run_input)
    
    for item in client.dataset(run["defaultDatasetId"]).iterate_items():
        print(item)
    

    And from Node.js:

    import { ApifyClient } from 'apify-client'
    
    const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' })
    
    const input = {
      "mode": "searchJobs",
      "country": "HK"
    }
    
    const run = await client.actor('crawlerbros~jobsdb-scraper').call(input)
    const { items } = await client.dataset(run.defaultDatasetId).listItems()
    console.log(items)
    

    That endpoint blocks until the run completes. Fine while you are testing a handful of records, risky once a run takes minutes: a dropped connection loses the response even though the run itself finished. Switch to an asynchronous start with polling or a webhook before you schedule anything.

    Which JobsDB Scraper inputs matter, and which can you skip?

    The mode and country parameters are required for every run. Setting mode to searchJobs with keywords isolates specific job roles, whereas mode browseByCompany requires an advertiserId. Optional controls like subclassification or dateRange can be left empty on initial runs to prevent over-filtering.

    • mode (string): What to fetch. Default: "searchJobs".
    • country (string): Which JobsDB market to scrape. Default: "HK".
    • keywords (string): Job title, skill, or company to search for (mode=searchJobs). Also works as an optional refinement in browseByCategory / browseByLocation. Default: "engineer".
    • location (string): Free-text location/area to browse or filter by, e.g. Central, Kowloon, Bangkok. Required for mode=browseByLocation. Default: "".
    • classification (array): Job categor(y/ies). Pick one or more (OR match) - required for mode=browseByCategory; optional filter for other modes. Leave empty for any category. Default: [].
    • subclassification (string): One or more numeric JobsDB sub-category IDs (comma-separated for OR match) to narrow a classification further (e.g. 6038 = Project Engineering under Engineering). Get valid IDs from the subCategoryId field on a previously scraped job. Optional filter for any mode. Default: "".
    • workType (array): Filter by employment type. Pick one or more (OR match). Leave empty for any work type. Default: [].
    • workArrangement (array): Filter by on-site/hybrid/remote work arrangement. Pick one or more (OR match). Leave empty for any arrangement. Default: [].
    • advertiserId (string): One or more numeric JobsDB advertiser IDs (comma-separated for OR match) to browse all current listings from one or more employers/agencies. Required for mode=browseByCompany; get an ID from the advertiserId field on any previously scraped job. Also works as an optional filter in other modes. Default: "".
    • jobId (string): One or more numeric JobsDB job IDs (comma-separated, or pass an array) to look up specific listings directly. Required for mode=byJobId; get an ID from the jobId field on any previously scraped job. Ignored in other modes. Default: "".
    • salaryMin (integer): Minimum salary (in the local currency, per salaryType period). Leave unset for no lower bound.
    • salaryMax (integer): Maximum salary (in the local currency, per salaryType period). Leave unset for no upper bound.

    The other 4 controls, with their defaults, are listed in the input schema on JobsDB Scraper on Apify.

    Fixed-choice controls: mode accepts searchJobs (Search jobs by keyword), browseByCategory (Browse jobs by category), browseByLocation (Browse jobs by location), browseByCompany (Browse jobs by company (advertiserId)), latestJobs (newest first, site-wide), byJobId (Look up job(s) by jobId); country accepts HK (Hong Kong (hk.jobsdb.com)), TH (Thailand (th.jobsdb.com)).

    What does JobsDB Scraper return?

    Returned records provide structured employment data including company identifiers, parsed salary ranges, work arrangements, and job listing URLs. They suit recruitment analysis, salary benchmarking, and job market tracking.

    • jobId - unique JobsDB listing ID
    • title, teaser, bulletPoints[] - job highlights
    • companyName, companyUrl, logoUrl
    • employerId, companyId, advertiserId - internal JobsDB identifiers for the employer/advertiser account (feed advertiserId back into mode=browseByCompany to pull every current listing from that employer; companyId is the ID embedded in companyUrl)
    • category, categoryId, subCategory, subCategoryId
    • location, locations[], countryCode
    • workTypes[] - e.g. Full time, Part time, Contract/Temp, Casual/Vacation
    • workArrangements[] - e.g. On-site, Hybrid, Remote
    • salaryLabel - as displayed on the listing (when the advertiser disclosed one)
    • salaryMinValue, salaryMaxValue, salaryPeriod (hourly/monthly/annual), salaryCurrency (HKD/THB) - structured numbers parsed from salaryLabel when it's a clear numeric range (omitted for non-numeric labels like Negotiable or Competitive)
    • listingDate, listingDateDisplay
    • isFeatured
    • tags[] - urgency/status badges shown on the listing, e.g. Urgently hiring, Expiring soon, Be an early applicant
    • roleId
    • country - market the job was scraped from
    • jobUrl - link to the live listing
    • recordType: "job", scrapedAt

    These are the documented fields. Optional ones can be empty on a given record, so measure how often each field your deliverable depends on is populated across a real sample before automating the handoff.

    How do you build the workflow end to end?

    Open JobsDB Scraper and work through these in order. Each step ends with something to check, so a bad configuration surfaces on a small run rather than a scheduled one.

    1. Select mode searchJobs and set country to HK or TH based on your target market.
    2. Supply a target job title or role keyword into keywords or supply an area string in location.
    3. Set maxItems to 1 and execute a test run to inspect the resulting dataset.
    4. Confirm that the dataset contains required fields such as jobId, title, and jobUrl.
    5. Extract any advertiserId or subCategoryId values from the output for downstream filter configurations.
    6. Apply classification, workType, or workArrangement selections to narrow the query.
    7. Set maxItems to your desired extraction batch size and schedule the full run.

    How do you apply it? Three worked playbooks

    These are JobsDB Scraper's own documented use cases, each worked through as an operating pattern rather than a description.

    Use case 1: Job seekers & career sites

    Outcome: Aggregate fresh listings by role, category, location, or remote/hybrid arrangement

    Configure: mode="searchJobs", country="HK", keywords="engineer", workArrangement=["3"], maxItems=50

    Working method: Run an initial search with workArrangement set to remote work. Inspect the output array to verify workArrangements reflects remote postings. Increase maxItems to collect broader results across the region.

    Deliverable: A dataset of live job listings including titles, work arrangements, category values, and direct jobUrl links.

    Stop condition: The run emits zero results or jobUrl values are missing from output records.

    Use case 2: Recruiters & staffing agencies

    Outcome: Monitor competitor job postings and market salary ranges

    Configure: mode="browseByCompany", country="HK", advertiserId="61282529", maxItems=50

    Working method: Execute mode browseByCompany using a target employer's numeric advertiserId string. Check companyName and listingDate values across returned items. Filter by listingDate to identify newly posted job openings.

    Deliverable: A collection of current postings from specified employer accounts detailing job titles and salary labels.

    Stop condition: The dataset returns zero listings for an active advertiserId.

    Use case 3: HR tech / salary benchmarking tools

    Outcome: Collect posted salary ranges by role and market

    Configure: mode="browseByCategory", country="TH", classification=["6281"], salaryType="monthly", maxItems=100

    Working method: Pull targeted category records using browseByCategory across specific industry IDs. Separate items containing numeric salaryMinValue bounds from unparsed text labels. Group numerical salary output by subCategory to build compensation metrics.

    Deliverable: A structured dataset of listings containing parsed numeric salary ranges, salaryCurrency, and category IDs.

    Stop condition: More than 80% of emitted dataset records lack populated salaryMinValue fields.

    What breaks, and how do you design around it?

    If maxItems reaches its cap, restrict search parameters using dateRange or subclassification to fetch smaller dataset batches. Listing links in jobUrl sit behind bot protection against non-browser tools; open those links directly in a regular web browser instead. Structured numeric fields like salaryMinValue are omitted when advertisers enter non-numeric text like Negotiable in salaryLabel.

    When should you not use JobsDB Scraper?

    Do not use this Actor if you require employment data outside Hong Kong and Thailand. For European market coverage, refer to HelloWork Jobs Scraper or eJobs.ro Scraper. For US federal listings or dedicated remote boards, tools like USAJobs Scraper or Remote Jobs Scraper provide targeted coverage.

    What should you check before trusting the output?

    • Confirm country matches the target HK or TH selection across all emitted records.
    • Verify that jobId contains a populated numeric identifier string.
    • Ensure salaryMinValue is populated whenever salaryLabel contains explicit numbers.
    • Check that jobUrl contains a valid web link pointing to JobsDB.
    • Halt execution if a broad keyword query returns an empty dataset array.

    None of this proves a record is correct. It gives a scheduled JobsDB Scraper run defined points where it should stop instead of quietly passing bad data downstream.

    Frequently asked questions

    How much does running JobsDB Scraper cost?

    Results cost $0.005 per item on the free plan, which equals $5.00 per 1,000 results. Apify's free plan includes $5.00 of monthly platform usage, covering up to 1,000 results per month before run-start and platform usage charges.

    Why are salaryMinValue and salaryMaxValue missing on some items?

    Structured numeric salary fields are included only when the listing provides clear numeric figures. When advertisers write non-numeric text like Negotiable or Competitive inside salaryLabel, structured numeric bounds are omitted to prevent inaccurate parsed values.

    How do I use browseByCompany mode?

    Provide a numeric JobsDB company identifier in the advertiserId field and set mode to browseByCompany. You can retrieve valid advertiserId values from the advertiserId output field of previously scraped job records.

    Can I search for locations using Thai script?

    Yes, location accepts Thai text inputs like กรุงเทพ.

    Why do jobUrl links fail when checked with non-browser HTTP clients?

    JobsDB listing pages sit behind bot-detection that blocks non-browser HTTP requests. The URLs returned in jobUrl are valid, live links that open normally when loaded inside a regular web browser.

    Where to go next

    When you are ready to run it, open JobsDB Scraper on Apify; the free plan covers up to 1,000 results a month.

    Start with the JobsDB Scraper Actor page for the current input schema, pricing tier, and run history.

    Other Actors we maintain for related data:

    Related guides:

    Resources

    • Actor documentation, input schema, and pricing: verified against the published Actor on 2026-09-28.

    • Actor last updated by its maintainers on 2026-08-12.

    • Run outcome figures cover the 30 day public window ending 2026-09-28.

    • JobsDB Scraper on Apify

    Featured actors

    JobsDB Scraper

    Scrape live job listings from JobsDB (Hong Kong & Thailand) - search by keyword, browse by category or location, or pull the newest postings. Salary, work-type, date-range and sort filters included.

    Run on Apify ↗