Skip to content
    ↑↓ to choose · Enter to open

    · 13 min read

    CareerJunction Jobs Scraper: 29 Data Fields per Record (2026)

    By CrawlerBros Engineering Team

    Extracting data from South Africa's largest job board returns 29 output fields per record, including the full job description, salary bands, and employer details. Each record costs $0.005 on the free-plan price, allowing for high-resolution monitoring of 26 job categories and 27 provinces. The scraper bypasses the site's protection that typically redirects plain HTTP clients to a not-found page, ensuring access to live vacancies without managing browser sessions. This is built for recruitment analysts and lead generation teams targeting the South African labor market, but it is not for those needing direct personal emails of hiring managers which are not disclosed.

    Try it before you read further. Apify's free plan includes $5.00 of usage every month with no credit card, enough for up to 1,000 results at $0.005 each before platform usage. Open CareerJunction Jobs Scraper on Apify and run the prefilled example.

    How reliable is CareerJunction Jobs Scraper in production?

    Across the last 30 days of public runs on the Apify platform, CareerJunction Jobs Scraper recorded 70 runs with the following outcomes.

    Outcome Runs Share
    Succeeded 70 100.0%
    Failed 0 0.0%
    Aborted by the user 0 0.0%
    Timed out 0 0.0%
    Total 70 100.0%

    No run failed or timed out in the last 30 days. Keep a retry and an alert on scheduled runs all the same: a clean month is a record, not a guarantee.

    What does it cost to run CareerJunction Jobs 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

    Worked example: collecting 10,000 results costs $50.00 in result charges before run-start fees and platform usage. No run failed or timed out in the last 30 days, so the list price is a fair budget; keep a retry in place all the same.

    The maxItems control is the primary driver of the bill as it sets the hard cap on the number of result charges. To verify your search logic without significant spend, set this to a low value before running a broad category scrape.

    How do you run CareerJunction Jobs Scraper from the API?

    The schema marks 1 of its 14 controls as required: mode. Nothing in the payload below is illustrative. Those are the schema's prefilled defaults for CareerJunction Jobs Scraper, so the request works once your token is in place.

    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~careerjunction-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"mode":"search"}'
    

    The same run from Python, using the official client:

    from apify_client import ApifyClient
    
    client = ApifyClient("<YOUR_APIFY_TOKEN>")
    
    run_input = {
      "mode": "search"
    }
    
    run = client.actor("crawlerbros~careerjunction-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": "search"
    }
    
    const run = await client.actor('crawlerbros~careerjunction-scraper').call(input)
    const { items } = await client.dataset(run.defaultDatasetId).listItems()
    console.log(items)
    

    Because the call is synchronous, your client waits for the whole run. Keep it for exploration. For scheduled work, start the run without waiting and collect the dataset afterwards, so network trouble costs you a retry rather than the results.

    Which CareerJunction Jobs Scraper inputs matter, and which can you skip?

    The mode control switches the Actor between a broad keyword search and fetching specific listings from a list of URLs. Most users should leave the location text field empty unless they need to match a specific suburb like Sandton that is not covered by the broader province regions.

    • mode (string): What to fetch. Default: "search".
    • keywords (string): Free-text job search query, e.g. developer, accountant, sales manager. Leave empty to browse the latest / a whole category. Default: "developer".
    • category (string): Restrict results to a CareerJunction job category. Default: "".
    • sortBy (string): Order of results (mode=search). Default: "relevance".
    • region (string): Restrict results to a CareerJunction province/region. Applied server-side (same as CareerJunction's own "Location" search filter). Default: "".
    • location (string): Only keep jobs whose location text contains this (e.g. Sandton, Rosebank). Matched client-side against each job's location, case-insensitive substring -- use this for a specific city/suburb not covered by the broader region filter above.
    • minSalary (integer): Drop jobs whose disclosed salary is below this amount. Jobs with an undisclosed salary always pass through (not penalized for missing data).
    • employmentTypes (array): Keep only jobs of these employment type(s), parsed from the listing's own position label. Matched client-side (CareerJunction's own facet is JS-driven, see FAQ). Leave empty for all. Default: [].
    • seniorityLevels (array): Keep only jobs of these seniority level(s), parsed from the listing's own position label. Matched client-side. Leave empty for all. Default: [].
    • employmentEquityOnly (boolean): Only keep jobs explicitly tagged by the employer as an Employment Equity (EE) position. Matched client-side; jobs not tagged EE are never assumed to be non-EE. Default: false.
    • postedWithinDays (integer): Only keep jobs posted within this many days.
    • fetchFullDetails (boolean): Visit each job's detail page for the full description, salary breakdown, employer info, and posting/expiry dates. Turn off for a faster, lighter-weight run using only search-result-card fields (title, company, location, salary snippet). Default: true.

    The other 2 controls, with their defaults, are listed in the input schema on CareerJunction Jobs Scraper on Apify.

    Fixed-choice controls: mode accepts search (Search / browse jobs), byUrls (Fetch by job listing URLs); category accepts 28 values (default ""), including "" (All categories), adminOfficeSupport (Admin, Office & Support), agricultureFishingForestry (Agriculture, Fishing & Forestry), architectureEngineering (Architecture & Engineering); sortBy accepts relevance, newest (Newest first); region accepts 28 values (default ""), including "" (All regions), workFromHome (Work From Home), gauteng, johannesburgSouth (Johannesburg South).

    What does CareerJunction Jobs Scraper return?

    The returned records are excellent for building local job boards or salary benchmarks because they include parsed seniority levels and ISO 8601 timestamps. The output does not contain employer email addresses or company profile data.

    • jobId - CareerJunction's internal listing ID
    • title, companyName, companyUrl, companyLogoUrl (permanent URL - see note below), companyLogoUrlOriginal (CareerJunction's original time-limited link, when rehosting succeeded)
    • location, country, countryCode
    • industry - employer's industry classification
    • positionText - employment type + seniority (e.g. "Permanent Senior position")
    • employmentType, seniorityLevel, isEmploymentEquity - parsed from positionText (only when the label matches a known pattern)
    • salaryText, salaryMin, salaryMax, salaryCurrency, salaryPeriod (only when disclosed)
    • descriptionHtml, descriptionText
    • datePosted, validThrough - ISO 8601 timestamps
    • postedText, expiresText, jobRef - original site-formatted text
    • sourceUrl - canonical listing URL
    • 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 CareerJunction Jobs 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. Set mode to search to browse the latest listings or byUrls to refresh specific job IDs.
    2. Choose a category like informationTechnology or finance to apply server-side filtering on CareerJunction.
    3. Select a region such as gauteng or westernCape to narrow results to specific South African provinces.
    4. Toggle fetchFullDetails to true if your deliverable requires the descriptionHtml and salaryMax fields.
    5. Input keywords to refine the result set by job title or required skills.
    6. Set maxItems to 10 for a test run to inspect how the positionText is parsed into seniorityLevel and employmentType.
    7. Run the scraper and verify the recordType is set to job before scaling to a full category extract.

    How do you apply it? Three worked playbooks

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

    Use case 1: Recruitment intelligence

    Outcome: Track live South African vacancies by category/location

    Configure: mode: "search", category: "informationTechnology", region: "gauteng", sortBy: "newest"

    Working method: Initiate a search for the IT category in Gauteng using the newest sort order to identify active hiring. Compare the resulting jobId list against previous datasets to find new vacancies.

    Deliverable: A spreadsheet of new IT job openings in Gauteng including companyName and datePosted.

    Stop condition: The scraper returns zero results for a known high-volume category filter.

    Use case 2: Salary benchmarking

    Outcome: Aggregate disclosed salary bands across roles

    Configure: mode: "search", keywords: "Accountant", fetchFullDetails: true, minSalary: 15000

    Working method: Run a keyword search for a specific role with full details enabled to access structured salary data. Filter the dataset for non-null salaryMin and salaryMax values to calculate market averages.

    Deliverable: An aggregated report of salary ranges categorized by seniorityLevel and region.

    Stop condition: The frequency of records with disclosed salary data falls below your required sample size.

    Use case 3: Talent sourcing

    Outcome: Bulk-collect employer contact / job data for outreach

    Configure: mode: "search", keywords: "Sales", employmentEquityOnly: true, maxItems: 50

    Working method: Filter for Sales roles and enable the employmentEquityOnly flag to identify specific hiring initiatives. Extract companyUrl and companyName to build a target list of active employers.

    Deliverable: A CSV list of companies with active EE vacancies and links to their public listings.

    Stop condition: The companyUrl field repeatedly returns broken links or generic domain redirects.

    What breaks, and how do you design around it?

    • Over the last 30 days, 0.0% of public runs failed and 0.0% timed out. Build retries and alerting around those rates rather than assuming every run completes.

    When a search query yields more results than the maxItems limit, the Actor will truncate the dataset at your cap. To collect more than 500 items, you must split the task into multiple runs by targeting different provinces or employment types.

    When should you not use CareerJunction Jobs Scraper?

    Do not use this Actor if you require data from Southeast Asia, where Kalibrr Jobs Scraper is the appropriate tool. If your project focuses on the Middle Eastern market, GulfTalent Jobs Scraper provides better coverage. This scraper is also not suitable for extracting data from CareerJunction's specific company profile pages, which are protected by a bot challenge that blocks plain HTTP access. For global job boards with salary estimates, check Salarship Jobs Scraper.

    What should you check before trusting the output?

    • Verify that jobId is a numeric string and not null to ensure unique record identification.
    • Check that sourceUrl does not lead to a /not-found redirect when opened in a standard browser.
    • Confirm salaryMin is an integer when present to allow for mathematical benchmarking.
    • Monitor that datePosted follows the ISO 8601 format for accurate chronological sorting.
    • Ensure companyName is populated as it is a critical field for employer tracking.

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

    Frequently asked questions

    What is the total cost for 1,000 CareerJunction results?

    On the free-plan price, 1,000 results cost $5.00 plus the platform usage fees. The result charge of $0.005 is only applied to items written to the dataset, while a small start fee is charged for the run itself. Apify's free plan includes $5.00 of monthly usage, which effectively covers your first 1,000 results every month without requiring a credit card.

    How reliable is this scraper for automated daily runs?

    Telemetric data shows that 70 of 70 public runs in the last 30 days succeeded, which is a 100.0% success rate. No runs failed or timed out during this period. This performance indicates that the Actor is stable enough for scheduled recruitment intelligence workflows and automated market monitoring without needing frequent manual oversight or complex retry logic.

    Why are salary fields sometimes missing in the results?

    The Actor only extracts data that is publicly disclosed by the employer on the original listing. Many South African job postings do not include salary bands. When this information is absent from the site, the salaryMin, salaryMax, and salaryCurrency fields are omitted from the record to ensure the data remains accurate and free of fabricated estimates.

    Can I filter for specific cities like Sandton or Rosebank?

    Yes. While the region control allows for broad province-level filtering, the location field provides client-side substring matching. By entering a city or suburb name, you can filter the search results to only include listings where the location text contains that specific string, allowing for much finer geographic targeting than the standard server-side categories.

    Why do CareerJunction URLs sometimes fail when I curl them?

    CareerJunction uses bot-detection that redirects plain HTTP clients to a not-found page if they do not exhibit real browser behavior. This Actor uses a specialized fetcher to bypass these blocks. The sourceUrl in your dataset is correct and will resolve to the live job posting when opened in a standard web browser, even if direct curl commands fail.

    Where to go next

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

    Start with the CareerJunction Jobs 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-30.

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

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

    • CareerJunction Jobs Scraper on Apify

    Featured actors

    CareerJunction Jobs Scraper

    Scrape live job listings from CareerJunction.co.za, South Africa's largest job board. Search by keyword and category, filter by location/salary/date, or fetch full job details from listing URLs. No login, no cookies, no paid proxy required.

    Run on Apify ↗