
Global Sources Supplier Scraper
scrape.ly/store/cornerledger/globalsources-scraperLead generationE-commerce
2 monthly users

Export job listings from Jobnet.dk, Denmark's public job portal. Search by keyword, region, postcode and distance, occupation area, employment type and working hours, or paste search and job links. Get employer and CVR number, occupation, workplace, dates, full description, contact persons and apply links. No login needed.
Export job listings from Jobnet.dk, Denmark's official public job portal run by the Danish Agency for Labour Market and Recruitment (STAR). Search by keyword, region, postcode and distance, occupation area, employment type and working hours, or paste Jobnet search and job links, and get clean rows with employer, CVR number, occupation, workplace address, dates, the full job description and the named contact persons with email and phone. No login, no cookies, and you pay only for the jobs you save.
softwareudvikler, pædagog, sygeplejerske), or paste Jobnet links (searches from jobnet.dk/find-job or single jobs).| Field | What it does |
|---|---|
searchQueries | Search terms, one search each. * lists every job (use filters to narrow it). |
startUrls | jobnet.dk search links (https://jobnet.dk/find-job?searchString=python®ions=Midtjylland) or job links (https://jobnet.dk/find-job/<job id>). |
maxResults | Jobs to save in total (default 20, 0 = no limit). |
regions | Capital Region & Bornholm, Central Jutland, North Jutland, Zealand, Southern Denmark. |
postalCode / kmRadius | Danish postcode and distance in km around it. |
occupationAreas | The site's 22 occupation areas, e.g. IT and telecoms, Health, care and personal care. |
employmentType / workHoursType | Permanent or temporary; full-time or part-time. |
jobType / noFixedWorkplace / countries | Flex jobs, Hotjobs and other special job types; jobs without a fixed workplace; jobs abroad (DE, NO, SE, …). |
postedWithinDays | Only jobs posted in the last N days (1 = today). |
includeDetails | Contact persons, apply link, addresses, positions and view count (on by default). |
sortBy | Best match, newest first or application deadline. |
descriptionFormat / descriptionMaxLength / compact / excludeEmptyFields | Make rows smaller: one description format, shorter descriptions, core fields only, no empty fields. |
{
"searchQueries": ["pædagog", "sygeplejerske"],
"regions": ["Midtjylland"],
"employmentType": "Permanent",
"postedWithinDays": 7,
"maxResults": 100,
"includeDetails": true
}
One row per job.
| Field | Description |
|---|---|
jobId, title, portalUrl | Jobnet job id, job title and the job's Jobnet page. |
employerName, cvrNumber, pNumber, employerAddress, employerCity, logoUrl | Employer, Danish company number (CVR), production unit number, address and logo. |
occupation, occupationUri, jobType | Occupation (Danish label and ESCO URI) and the Jobnet job type (regular, Hotjob, flex job, …). |
workplaceAddress, municipality, postalCode, postalDistrictName, country, countryCode, noFixedWorkplace | Where the job is. |
isPartTime, isTemporary, isDisabilityFriendly, availablePositions | Working hours, fixed-term or permanent, "disability no obstacle", number of positions. |
datePosted, applicationDeadline, applicationDeadlineStatus, applicationDeadlineAsap, createdAt, updatedAt | Posting and deadline dates. |
description, descriptionHtml, descriptionMarkdown | The full job ad as plain text, HTML and Markdown. |
contactPersons, contactName, contactEmail, contactPhone | Named contact persons (name, title, email, phone); the first one also in its own columns. |
applyUrl, externalUrl, isExternal | Where to apply; for jobs Jobnet lists from other sites, the original ad. |
extractedEmails, extractedPhones, extractedUrls, socialProfiles | Contacts and links found in the ad text. |
viewCount, driversLicenses, isAnonymousEmployer | Views on Jobnet, required driving licences, anonymous employer flag. |
searchQuery, searchUrl, detailsFetched, contentHash, scrapedAt, source | Which search found the job, whether details were read, a hash of the ad content for change tracking, and when. |
Example row (from a test run; long texts shortened, contact person replaced with a fictional one):
{
"jobId": "ae0978ea-7643-42cf-92c3-a1c315176bc1",
"title": "Pædagog",
"employerName": "KALØVIGSKOLEN",
"cvrNumber": "55133018",
"pNumber": "1003365736",
"occupation": "Pædagog",
"jobType": "Almindelige vilkår",
"municipality": "Aarhus",
"postalCode": 8541,
"postalDistrictName": "Skødstrup",
"country": "Danmark",
"countryCode": "DK",
"isPartTime": false,
"isTemporary": false,
"isExternal": false,
"datePosted": "2026-10-20T00:00:00+02:00",
"applicationDeadline": "2026-10-23T00:00:00+02:00",
"applicationDeadlineStatus": "ExpirationDate",
"availablePositions": 1,
"description": "Gør en forskel hver dag! Kaløvigskolen skal udvide og søger pædagoger til løbende opstart\n\nKaløvigskolen udvider. Derfor søger vi i den kommende tid løbende engagerede pædagoger …",
"contactPersons": [
{"name": "Jens Hansen", "title": "Leder", "email": "jens.hansen@example.dk", "phone": "12345678"}
],
"contactName": "Jens Hansen",
"contactEmail": "jens.hansen@example.dk",
"contactPhone": "12345678",
"applyUrl": "https://aarhus.career.emply.com/ad/paedagog/abc123/da",
"portalUrl": "https://jobnet.dk/find-job/ae0978ea-7643-42cf-92c3-a1c315176bc1",
"viewCount": 54,
"searchQuery": "pædagog",
"scrapedAt": "2026-10-21T17:30:00Z",
"source": "jobnet.dk"
}
You pay $1.50 per 1,000 jobs saved ($0.0015 per job), with no start fee, plus a small amount of platform usage (compute and proxy traffic), which is not included in the job price. Example: 1,000 jobs with details ≈ $1.51 in total ($1.50 for the jobs + about $0.013 platform usage, measured on our test runs); 100 jobs ≈ $0.15. Failed links, jobs that are no longer online and rows you filter out are not charged. Set a maximum total charge on the run and the scraper stops cleanly when it is reached.
Is it legal to scrape Jobnet.dk? Jobnet is a public job portal and this scraper only reads job ads that anyone can see without logging in. Contact persons are named in the ads by the employers themselves. If you store or contact people, follow the GDPR and Danish marketing rules.
Do I need a Jobnet account, cookies or a proxy? No account and no cookies. The default proxy uses Danish residential exits, which Jobnet answers fastest; its traffic is small (about 5 MB per 1,000 jobs in our tests) and is included in the usage shown below. If those exits cannot reach the site, the run switches to datacenter exits by itself.
How many jobs can I get? Jobnet lists around 23,000 jobs at a time. One search shows at most 10,000; set Maximum jobs to 0 and the scraper splits bigger searches by occupation area. A few hundred jobs have no occupation area and can only be reached with narrower searches.
Why are some fields empty?
Part of Jobnet's jobs are ads it collects from other sites (isExternal: true); in our samples that was 9% to 85% of a results page, depending on the search. For those Jobnet has the title, employer, place, dates and description, but no contact persons or detail record; externalUrl links to the original ad. Salary is not published on Jobnet.
Can I get only new jobs every day? Yes: schedule the scraper with Posted within (days): 1 (or 2 to allow for late runs) and send the results to your tools through the API, webhooks or integrations.
Can I use it through the API? Yes. Start runs and read results with the Scrapely API or client libraries; every field above is in the JSON.
externalUrl.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
searchQueriesarrayOptionalSearch terms
Job titles, skills or employer names, one per line, e.g. 'softwareudvikler', 'pædagog', 'sygeplejerske', 'lagerarbejder'. Each term is its own search. Use * to list every job (narrow it down with the filters below).
startUrlsarrayOptionalJobnet links
Optional. Search links copied from jobnet.dk/find-job (filters in the link are kept) or job links (jobnet.dk/find-job/). Job and search links can be mixed.
maxResultsintegerOptionaldefault 20Maximum jobs
How many jobs to save in total across all searches and links. 0 = no limit (up to 100,000). One search on the site shows at most 10,000 jobs; bigger searches are split by occupation area automatically.
regionsarrayOptionalRegions
Only jobs in these Danish regions.
postalCodestringOptionalPostcode
Danish postcode at the centre of a distance search, e.g. '8000' (Aarhus) or '2100' (Copenhagen Ø). Use with Distance.
kmRadiusintegerOptionalDistance (km)
Only jobs within this many km of the postcode. Used only with a postcode; the site's default is 50 km.
occupationAreasarrayOptionalOccupation areas
Only jobs in these occupation areas (the site's job categories).
employmentTypeenumOptionalEmployment type
Permanent or temporary (fixed-term) jobs only.
workHoursTypeenumOptionalWorking hours
Full-time or part-time jobs only.
jobTypeenumOptionalJob type
Special job types on Jobnet, e.g. flex jobs (fleksjob) or Hotjobs that need to be filled quickly.
noFixedWorkplacebooleanOptionalNo fixed workplace only
Only jobs without a fixed workplace (e.g. field work, travelling or home-based).
countriesarrayOptionalCountries
Two-letter country codes, e.g. 'DK', or 'DE', 'NO', 'SE' for the jobs abroad that Jobnet lists. Leave empty for all.
postedWithinDaysintegerOptionalPosted within (days)
Only jobs posted in the last N days, counting today as day 1 (Danish dates): 1 = today, 7 = the last week. Lists the newest jobs first. 0 = no date filter.
includeDetailsbooleanOptionaldefault trueJob details and contacts
Open each job's detail record for the contact persons (name, title, email, phone), apply link, workplace and employer address, number of positions, view count and dates. One small extra request per job. Turn off for the fastest runs; the listing already has the full description.
sortByenumOptionaldefault "BestMatch"Sort by
Order of the results.
maxResultsPerSearchintegerOptionalMaximum jobs per search
Optional cap for each search term or link, so one broad term does not use up the whole limit. 0 = no per-search cap.
descriptionFormatenumOptionaldefault "all"Description format
Keep one description format to make rows smaller, or all three (plain text, HTML and Markdown).
descriptionMaxLengthintegerOptionalDescription length limit
Cut descriptions to this many characters. 0 = full text.
compactbooleanOptionalCompact rows
Only the core fields (id, title, employer, occupation, place, dates, description, links). Handy for AI agents and small exports.
excludeEmptyFieldsbooleanOptionalLeave out empty fields
Drop empty values (null, empty text, empty lists) from each row.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["RESIDENTIA…Proxy
Danish residential exits are the default: Jobnet answers them fastest. If they cannot reach the site, the run switches to datacenter exits by itself (and from any other proxy to Danish residential exits).
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| jobId | string | Jobnet job id |
| title | string | null | |
| employerName | string | null | |
| cvrNumber | string | null | Danish company registration number (CVR) |
| pNumber | string | null | Production unit number (P-nummer) |
| occupation | string | null | Occupation (Danish label) |
| occupationUri | string | null | ESCO occupation URI |
| jobType | string | null | Job type label on Jobnet |
| municipality | string | null | |
| postalCode | number | null | |
| postalDistrictName | string | null | |
| workplaceAddress | string | null | |
| country | string | null | |
| countryCode | string | null | |
| isPartTime | boolean | null | |
| isTemporary | boolean | null | |
| isExternal | boolean | null | The ad lives on another site (externalUrl) |
| noFixedWorkplace | boolean | null | |
| isDisabilityFriendly | boolean | null | |
| datePosted | string | null | |
| applicationDeadline | string | null | |
| applicationDeadlineStatus | string | null | |
| applicationDeadlineAsap | boolean | null | |
| availablePositions | number | null | |
| description | string | null | Full description, plain text |
| descriptionHtml | string | null | |
| descriptionMarkdown | string | null | |
| employerCity | string | null | |
| employerAddress | string | null | |
| isAnonymousEmployer | boolean | null | |
| contactPersons | array | Contact persons: name, title, email, phone |
| contactName | string | null | |
| contactEmail | string | null | |
| contactPhone | string | null | |
| applyUrl | string | null | |
| externalUrl | string | null | |
| portalUrl | string | null | |
| logoUrl | string | null | |
| viewCount | number | null | |
| driversLicenses | array | |
| createdAt | string | null | |
| updatedAt | string | null | |
| extractedEmails | array | |
| extractedPhones | array | |
| extractedUrls | array | |
| socialProfiles | object | null | |
| searchQuery | string | null | |
| searchUrl | string | null | |
| detailsFetched | boolean | null | |
| contentHash | string | null | |
| scrapedAt | string | null | |
| source | string | null |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Job | One saved Jobnet.dk job listing. | $0.0015 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('openrole/jobnet-scraper').call({
"searchQueries": [
"pædagog"
],
"maxResults": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"RESIDENTIAL"
],
"scrapelyProxyCountry": "DK"
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run openrole/jobnet-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=openrole/jobnet-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Ten nursing (sygeplejerske) jobs in Copenhagen and Bornholm with employer, CVR, workplace, deadline, full description and contact persons.
Ten permanent jobs within 20 km of postcode 8000 (Aarhus C), with details and contact persons.
Paste a jobnet.dk/find-job link: here warehouse (lager) jobs in Southern Denmark.
Part-time jobs in health, care and personal care posted in the last 7 days, newest first.
30 teacher (lærer) jobs with listing data only and Markdown descriptions: the fastest and lightest mode.
Jobs in Germany, Norway and Sweden that Jobnet lists for Danish job seekers.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.