Job Board Market Demand Analyzer
Pricing
from $16.15 / 1,000 privacy-bounded demand report delivereds
Job Board Market Demand Analyzer
Aggregate buyer-authorized job-board observations into privacy-bounded sample demand metrics.
Turn 3–500 job observations you are authorized to process into one privacy-bounded sample-demand report. The Actor makes no network requests, returns no raw titles, company names, or source job IDs, and keeps every claim scoped to the supplied sample.

What you get
- One aggregate row per successful run. Counts, date range, coverage, frequent groups, salary distributions, rights notices, and a deterministic input fingerprint stay together.
- A visible privacy threshold. Group labels and salary distributions appear only when at least three observations contribute (
k >= 3). - Honest sample scope.
sampleCompletenessrecords whether the rows represent a complete source snapshot or a bounded/partial sample. - Deterministic processing. The same normalized input produces the same aggregate and fingerprint; the Actor performs no crawling, enrichment, classification, or model call.
- Paid delivery after storage. One
result-foundis emitted only after the complete report is successfully written to the default Dataset.
Use the report to compare observed hiring mix, location concentration, field coverage, remote share, and supplied salary ranges across recurring authorized snapshots. It is an analysis of your input and not a measure of total labour-market demand.
Quick start
Run the public Task Job Board Demand — Synthetic Sample (Task ID Pf4ZEZM1bDIeYqHtT). Its six explicitly synthetic engineering observations create a complete example without contacting a job board or using private data.
For your own report, replace the observations and choose the correct completeness declaration:
{"schemaVersion": "1.0","analysisId": "weekly-authorized-sample","sampleCompleteness": "BOUNDED_OR_PARTIAL_SAMPLE","observations": [{"sourceBoard": "authorized-export","sourceJobId": "job-001","title": "Backend Engineer","company": "Example Company","location": "Tbilisi","category": "Engineering","employmentType": "Full-time","remote": false,"salaryMin": 3000,"salaryMax": 4500,"salaryCurrency": "GEL","salaryPeriod": "month","postedAt": "2026-08-28T09:00:00.000Z"},{"sourceBoard": "authorized-export","sourceJobId": "job-002","title": "Data Engineer","location": "Tbilisi","postedAt": "2026-08-29T09:00:00.000Z"},{"sourceBoard": "authorized-export","sourceJobId": "job-003","title": "Platform Engineer","location": "Tbilisi","postedAt": "2026-08-30T09:00:00.000Z"}]}
The three-row example demonstrates the minimum accepted shape. A group with fewer than three contributing observations is withheld from the aggregate.
Input reference
| Field | Required | Limits | Meaning |
|---|---|---|---|
schemaVersion | Yes | 1.0 | Closed input contract version. |
analysisId | Yes | 1–64 safe characters | Stable buyer-defined identifier for this sample. |
sampleCompleteness | Yes | COMPLETE_SOURCE or BOUNDED_OR_PARTIAL_SAMPLE | Explicit scope declaration carried into output. |
observations | Yes | 3–500 unique rows | Buyer-authorized normalized job facts supplied inline. |
Every observation requires sourceBoard, sourceJobId, title, location, and an exact UTC postedAt. Optional fields are company, category, employmentType, remote, and the complete four-field salary tuple: salaryMin, salaryMax, salaryCurrency, salaryPeriod.
Unknown fields, duplicate normalized source-board/job-ID pairs, invalid timestamps, unsafe text, and incomplete salary tuples reject the whole input before output.
How the privacy boundary works
Raw titles and company names participate only in input validation and fingerprinting; source job IDs participate in validation, deduplication, and fingerprinting. None is returned in the report.
Exact normalized labels may appear in topGroups only when their count is at least three. Salary rows are grouped by the exact supplied currency and period, and a distribution appears only with at least three complete ranges. The Actor does not infer categories, convert currencies or periods, geocode locations, or interpret titles.
Apify retains the original run INPUT in the run's key-value store according to your account's storage and retention settings. The privacy boundary applies to the Actor's Dataset output; it does not erase the source payload you submit to Apify. Do not submit credentials, candidate records, personal data, or observations you lack the right to process.
Output Dataset
The default Dataset contains exactly one closed aggregate report on success:
{"schemaVersion": "1.0","analysisType": "JOB_BOARD_SAMPLE_MARKET_DEMAND","analysisId": "synthetic-engineering-demand-sample","sourceMode": "BUYER_AUTHORIZED_INLINE_OBSERVATIONS","sampleCompleteness": "BOUNDED_OR_PARTIAL_SAMPLE","privacyThreshold": 3,"counts": {"observations": 6,"sourceBoards": 1,"locations": 2,"categories": 1,"employmentTypes": 1},"coverage": {"remoteKnown": 6,"remoteTrue": 3,"salaryRangeKnown": 6},"topGroups": {"locations": [{ "value": "batumi", "count": 3, "sampleShare": 0.5 },{ "value": "tbilisi", "count": 3, "sampleShare": 0.5 }]}}
The complete row also includes inputFingerprint, scopeNotice, rightsNotice, postedAtRange, full coverage counts, source-board/category/employment groups, and salary-distribution percentiles.

Pricing and charge safety
Pay Per Event uses only the automatic Actor Start event and one primary result-found event. The maximum charge is fixed because a successful run produces at most one report.
| Tier | Actor start | Report delivered | Maximum total |
|---|---|---|---|
| FREE | $0.00600 | $0.01900 | $0.02500 |
| BRONZE | $0.00570 | $0.01805 | $0.02375 |
| SILVER | $0.00540 | $0.01710 | $0.02250 |
| GOLD | $0.00510 | $0.01615 | $0.02125 |
| PLATINUM | $0.00492 | $0.01558 | $0.02050 |
| DIAMOND | $0.00480 | $0.01520 | $0.02000 |
result-found is charged only after the complete report is written successfully to the default Dataset. Invalid input, insufficient budget, pricing mismatch, or failed delivery emits no result-found; the automatic start charge can still apply.
API and automation
Start the public synthetic Task and wait for completion:
curl -X POST \'https://api.apify.com/v2/actor-tasks/Pf4ZEZM1bDIeYqHtT/runs?token=APIFY_TOKEN&waitForFinish=120'
Read defaultDatasetId from the terminal Run and request /v2/datasets/DATASET_ID/items?clean=true. In Make or n8n, branch on Run status before consuming the single report. Check the original Run before retrying a timed-out request so a completed paid run is not duplicated.
Security, privacy, and source rights
- The Actor runs with
LIMITED_PERMISSIONS, makes zero network requests, and accepts no provider key, cookie, proxy, URL, Dataset ID, or Run ID. - You must own or be authorized to process every supplied observation. Source-board labels are provenance only; they imply no affiliation and grant no source-data rights.
- Closed input rejects extra fields, so descriptions, application contents, contact details, candidate records, and arbitrary payloads do not enter the contract.
- Formula-leading exported labels, control characters, duplicate identities, non-finite salaries, and invalid dates fail before Dataset delivery.
- Raw INPUT remains visible to authorized users of the run storage; output aggregation is not anonymization of the stored input.
Limits and interpretation
- Results describe only the supplied 3–500 observations and their declared completeness.
COMPLETE_SOURCEis a buyer assertion; the Actor cannot independently prove source completeness.- A group count of three is a disclosure threshold, not a statistical significance test or guarantee of anonymity.
sampleShareis the group's share of supplied observations, not market share.- Salary percentiles summarize supplied range midpoints without tax, seniority, currency, period, purchasing-power, or inflation conversion.
- The Actor does not forecast hiring, infer skill demand, classify titles, remove stale listings, or compare external markets.
Troubleshooting
- Input is rejected: confirm there are 3–500 rows, required top-level fields are present, and source-board/job-ID pairs remain unique after normalization.
- Salary data is rejected: provide all four salary fields together and keep
salaryMinless than or equal tosalaryMax. - A group is missing: fewer than three supplied observations contributed to that exact normalized label.
- No report appears: inspect the failed Run, correct the input or charge cap, and start a new run; failed delivery is not retried automatically.
FAQ
Does this Actor scrape job boards? No. It makes no network requests and analyzes only inline observations.
Does a report measure the total job market? No. It describes the supplied sample only.
Why are raw titles, companies, and job IDs absent? They are row-level identifiers not required for the aggregate report.
Can I combine currencies or salary periods? They remain separate exact groups; the Actor performs no conversion.