Authentic Jobs Listings Scraper avatar

Authentic Jobs Listings Scraper

Pricing

from $3.00 / 1,000 listing returneds

Go to Apify Store
Authentic Jobs Listings Scraper

Authentic Jobs Listings Scraper

Scrape job listings from authenticjobs.com, the job board for designers, developers and creative tech roles: title, company, location, job type, posting date, listing URL, company logo and tagline, one row per listing. No browser, no login.

Pricing

from $3.00 / 1,000 listing returneds

Rating

0.0

(0)

Developer

E A

E A

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Reads the live job listings on authenticjobs.com — the job board where employers post design, development and creative-tech roles — and returns one row per listing: the job title, the company, the location, the job type, the posting date, the link to the listing, the company logo, the company's one-line tagline, the board's own "Posted N ago" wording and the board's numeric id for the listing.

Type a search term such as designer, press Start, and a few seconds later you have a dataset you can download as JSON, CSV or Excel, read through the Apify API, or push into a spreadsheet, a database or an automation.

Why this exists

Authentic Jobs has been running for years and the companies that post there are the ones design and engineering candidates recognise. The board has no public API and no export button: to get its listings out you either copy them by hand or read its pages yourself. People do search for a way in — "authentic jobs api" is a phrase that gets typed — and until now nothing on the Apify Store answered it.

This Actor reads the board the same way the board's own listing page reads it: through the request the page makes for its rows, one page at a time, honouring the site's stated crawl delay. No browser is launched, no account is needed and no proxy is used. It does one thing, it does it politely, and it tells you when it found nothing.

What the board is

authenticjobs.com is a job board aimed at designers, front-end and back-end developers, product people and other creative and technical roles. Employers post the listings; each listing shows a company logo, the position, the company name and tagline, a location, a job type such as "Full-time" and how long ago it was posted. The full job description lives on the employer's own listing page on the board, one click away from the list.

At the time of writing the board holds on the order of a couple of hundred live listings. A search term narrows that. Listings stay up for months, so the posting date matters: the rows carry it both as an exact date and as the board's own relative wording.

What one row looks like

A real row from a run, with the always-empty fields left out for brevity (every row does carry them, as null — see Fields that are always empty on this board):

{
"platform": "authentic jobs",
"official_url": "https://authenticjobs.com/job/36642/pinterest-principal-product-designer-ai-native-core/",
"title": "Principal Product Designer, AI Native, Core",
"posted_date": "2026-07-29",
"location": "San Francisco, California US based applicants only (Remote)",
"is_remote": true,
"job_type": "Full-time",
"company_name": "Pinterest",
"company_logo": "https://authenticjobs.com/wp-content/uploads/job-manager-uploads/company_logo/2026/07/pinterest.png",
"company_tagline": "Find inspiration for your life.",
"posted_text": "Posted 1 month ago",
"source_id": "36642",
"result": "ROW"
}

Every value above was read from the board's listing row for that job. Nothing is inferred except is_remote, which is set to true when the word "remote" appears in the location or job-type text and is left null otherwise.

How do I use Authentic Jobs Listings Scraper?

  1. Open the Actor's page on Apify and press Try for free (or Start if you already have an account).
  2. Enter a keyword — the term you would type into the search box on authenticjobs.com. designer is prefilled so a first run works without typing anything.
  3. Optionally enter a location. The board matches it as text against the location line of each listing.
  4. Optionally lower or raise maximum items. The default is 100 rows; the board itself rarely holds more than a few hundred listings in total.
  5. Press Start. The run reads the board's listing pages, waits three seconds between pages as the site asks, and finishes in well under a minute for a full read.
  6. Open the Output tab to browse the rows, or the Storage tab to download them as JSON, CSV, Excel or XML.

Example input

{
"keyword": "designer",
"maxItems": 100
}

Running it from your own code

Every Apify Actor can be started through the API. This starts a run, waits for it to finish and returns the rows:

curl -X POST "https://api.apify.com/v2/acts/Pradio~authentic-jobs/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "keyword": "engineer", "maxItems": 50 }'

The same call is available from the Apify client libraries for JavaScript and Python, from the Apify MCP server, and from a schedule in the Apify Console if you want the board read every morning.

Reading the whole board

To read every listing rather than a search, use a broad keyword and a maxItems above the number of listings the board currently shows. The board's search decides what a keyword matches; this Actor passes your term through and does not filter the rows again on its side.

Input

FieldTypeRequiredDefaultWhat it does
keywordstringyesprefilled with designerThe search term, sent to the board's own search exactly as you typed it. What matches is decided by the board.
locationstringnoA place name, sent to the board's own location search and matched as text against each listing's location line.
distanceintegernoIgnored on this board. Accepted so the input has the same shape as other job-board inputs, but authenticjobs.com cannot filter by distance. If you set it, the run log says it was ignored.
maxItemsintegerno100The most rows one run returns. Pages are read until the run holds that many; the rest of the board is not fetched. Minimum 1.

keyword

This is the only required field. It goes straight into the board's search as the search keywords, so it behaves exactly as typing the same words into the search box on authenticjobs.com does. Try a role (designer, engineer, product), a technology, or a company name. Results come back newest first.

location

Sent as the board's location search. The board matches it against the free-text location an employer wrote — "San Francisco Bay Area", "Warsaw", "United States (Remote)" — so a country name will not find a listing whose location only names a city. Leave it empty to search every location.

distance

The field is accepted and then set aside. Authentic Jobs has no radius search, so there is nothing for a distance to do. The Actor logs a warning at the start of the run and carries on; the rows you get are the same as if you had left it blank.

maxItems

The board answers 50 listings per page. The Actor keeps requesting pages, three seconds apart, until it holds at least maxItems rows or the board reports no more pages, then returns at most maxItems rows after dropping any listing it has already seen. Lower it for a quick sample; raise it above the board's total to read everything.

Output

Each data row carries 29 fields plus a result field that is always "ROW" on a data row. A value the board does not show is null — the field is always present, never missing, so a parser can rely on the shape.

Fields read from the listing

FieldTypeWhere it comes from
platformstringAlways "authentic jobs". Lets you mix rows from several boards in one table and still know which is which.
official_urlstringThe link on the listing row, e.g. https://authenticjobs.com/job/36642/.... Opens the full listing on the board. Rows are de-duplicated on this value.
titlestringThe position heading on the listing row, e.g. "Product Designer, Growth".
posted_datestringThe machine-readable posting date the board attaches to the listing, as YYYY-MM-DD.
locationstringThe location line of the listing, exactly as the employer wrote it: a city, a region, a country, sometimes with "(Remote)" or a note such as "US based applicants only".
is_remotebooleantrue when the location or job-type text contains the word "remote"; otherwise null. The board has no remote flag of its own, so a null means "the listing did not say", not "on site".
job_typestringThe job-type tag on the listing row, e.g. "Full-time".
company_namestringThe company name shown in bold on the listing row.
company_logostringThe URL of the company logo image the board shows beside the listing, hosted on authenticjobs.com.
company_taglinestringThe one-line tagline the board shows under the company name. Shown exactly as the board shows it, which can be cut short for long taglines.
posted_textstringThe board's own relative wording for the posting date, e.g. "Posted 4 weeks ago".
source_idstringThe board's numeric id for the listing — the number in the listing URL, e.g. 36642. Stable across runs, so it is a good key for tracking new and removed listings.
resultstring"ROW" on every data row. The other two values mark status rows, described below.
reasonstringStatus rows only: one sentence saying why the run returned no rows, or why it stopped early. Absent from data rows.
rowsFetchedintegerStatus rows only: how many listings the board handed over before duplicates were dropped and the cap applied.
rowsReturnedintegerStatus rows only: how many data rows are in the dataset (0 on an empty result).
rowsRemainingintegerStatus rows only: how many fetched listings were not returned (0 on an empty result; the shortfall on STOPPED_EARLY).

Fields that are always empty on this board

These fields exist so that rows from this board line up with rows from other job boards, but authenticjobs.com does not publish the value in its listings, so on this board they are null on every row:

FieldTypeWhy it is always null here
descriptionstringThe board shows no description text in its listing rows; the description lives on the employer's listing page, which official_url links to. This Actor does not fetch those pages (see Honest limits).
job_levelstringThe board does not tag listings with a seniority level.
job_functionstringThe board does not tag listings with a function or department.
listing_typestringThe board does not distinguish listing types.
skillsstringThe board publishes no skills list in its listings.
vacancy_countThe board does not say how many openings a listing covers. Untyped in the schema because it is never filled here.
experience_rangestringThe board publishes no years-of-experience range.
salary_minimumnumberThe board does not publish salary.
salary_maximumnumberThe board does not publish salary.
salary_currencystringThe board does not publish salary.
company_industrystringThe board shows no industry for the company.
company_urlstringThe board's listing rows carry no link to the employer's own website.
company_addressesstringThe board shows no company address.
company_revenuestringThe board shows no company revenue.
company_descriptionstringThe board shows no company profile text in its listing rows.
company_ratingnumberThe board has no company ratings.
emailsThe board publishes no contact email in its listings. Untyped in the schema because it is never filled here.

None of these will start filling in on their own. If a value you need is in this list, this is not the right source for it.

When the run finds nothing

A run that finds no results does not leave you with an empty dataset. It pushes exactly one status row so you can tell "nothing matched" from "something broke":

{
"result": "NO_MATCHING_LISTINGS",
"reason": "the source answered and returned no rows for this input (0 fetched, 0 duplicate(s) dropped)"
}

This row means the board answered and had no listing for your keyword and location. It is not charged. If the board could not be read at all — a network error, an unexpected response, a changed page — the run fails instead, with the error in the log; it never reports a failure as "no results".

When the run stops early

If your account's spending limit for this Actor is reached mid-run, the Actor stops returning rows and pushes one final status row:

{
"result": "STOPPED_EARLY",
"reason": "the run's charge limit was reached after 40 row(s); raise the limit and re-run to see the rest",
"rowsReturned": 40,
"rowsRemaining": 12
}

rowsReturned is how many data rows are in the dataset; rowsRemaining is how many listings were fetched but not returned. This row is not charged. A run that finishes normally never carries it, so a dataset ending in STOPPED_EARLY is always one that was cut short.

The run summary

Alongside the dataset, every run writes a RUN_SUMMARY record to its default key-value store with the counts a buyer needs to check a run without opening the rows:

{
"input": { "keyword": "designer", "maxItems": 100 },
"rowsFetched": 57,
"rowsPushed": 57,
"rowsCharged": 57,
"duplicatesDropped": 0,
"stoppedEarly": false,
"startedAt": "2026-09-02T18:20:11.000Z",
"finishedAt": "2026-09-02T18:20:19.000Z",
"source": "authentic jobs",
"keyField": "official_url"
}

rowsFetched is what the board returned, rowsPushed is what reached the dataset, rowsCharged is what you paid for, and the three agree on a normal run. If the run was aborted from the Console, the summary carries "aborted": true and the counts stop at the moment of the abort.

How the board is read

The listing page on authenticjobs.com is a shell: the rows are loaded by a request the page makes to the board's own listings endpoint, which answers with a small JSON envelope containing the rows as HTML. This Actor makes that same request directly, one page of 50 listings at a time, and parses the rows out of the HTML. Specifically:

  • One request per page, three seconds apart. The site's robots.txt allows this path and asks for a three-second crawl delay; the Actor waits three seconds between pages. Pages are requested until the run has enough rows or the board reports it has no more.
  • No browser. The request is a plain HTTP call with a user-agent string that names this Actor. Nothing is rendered, no JavaScript is executed.
  • No login, no proxy. The board's listings are public and the endpoint answers a plain client, so there is nothing to sign in to and nothing to route around.
  • Newest first. Rows are requested in the board's date order, most recent first.
  • De-duplicated. If the board hands back the same listing twice across pages, the second copy is dropped before anything is returned or charged; duplicatesDropped in the run summary says how many.
  • A failed read is a failed run. If the endpoint answers with anything other than a well-formed page of listings, the run fails with the error in the log. An empty dataset is never used to paper over a broken read.

Honest limits

  • Job descriptions are not returned. The description lives on each listing's own page on the board, and this Actor does not open those pages. Two reasons: the description is the employer's own writing, published on the board, and it belongs there; and fetching one page per listing at a three-second crawl delay would turn a ten-second run into a ten-minute one. Every row carries official_url, so the description is one click away; it just is not in the row. description is null on every row and will stay that way.
  • No salary, seniority, skills or company details. authenticjobs.com does not publish them in its listings, so the seventeen fields in the table above are always null. This Actor cannot return what the board does not show.
  • distance does nothing. The board has no radius search. The field is accepted and ignored, with a warning in the log.
  • is_remote is never false. It is true when the listing text says "remote" and null when it does not. The board has no remote flag, so "not remote" is not something the Actor can know.
  • location is free text. It is whatever the employer typed — a city, a country, a note about eligibility. It is not normalised into city / region / country parts.
  • company_tagline may be cut short. The board itself truncates long taglines in its listing rows; the row carries what the board shows.
  • The board's search decides what matches. A keyword is passed through to authenticjobs.com's own search. If the board's search treats a term loosely or strictly, so does this Actor.
  • The board's RSS feed is not read. The site's robots.txt disallows that path, so the Actor uses the listings endpoint the page itself uses.
  • Small board, small runs. The whole board is a couple of hundred listings at most. If you need thousands of rows per run, this is not the source that will give them to you.
  • If the board changes its markup, the Actor fails rather than guessing. A changed response is reported as an error in the run log, not returned as rows full of null.

Pricing

This Actor is priced per listing returned: $0.003 per listing (USD), one charged listing-returned event per data row, charged only after the row has been written to the dataset. A full read of the board, around 180 listings, therefore costs about $0.54 plus the platform's start event; a keyword search that returns 12 rows costs under four cents. The same figure is shown on the Actor's pricing tab.

What is not charged:

  • the NO_MATCHING_LISTINGS row a run pushes when it finds no results;
  • the STOPPED_EARLY row a run pushes when your spending limit cuts it short;
  • duplicate listings dropped before the dataset is written.

Apify's platform also charges its own Actor start event (apify-actor-start) once per run: $0.00005 at the Actor's 1 GB default memory. The platform charges that event per gigabyte, so a run started with more memory pays proportionally more for the start; this Actor needs no more than 1 GB. It is shown on the pricing tab beside the per-listing price. A typical run of this Actor is a handful of requests and a few seconds of compute.

Set a spending limit on the run if you want a hard cap: the Actor reads the result of every charge and stops cleanly with a STOPPED_EARLY row the moment the limit is reached, so you are never charged past it.

Integrations

The dataset is a standard Apify dataset, so everything the platform offers applies:

  • Export as JSON, CSV, Excel, XML or RSS from the run's Storage tab, or through the dataset API.
  • Schedules — run it every morning and diff source_id against yesterday's run to see new and removed listings.
  • Webhooks — trigger your own endpoint when a run finishes.
  • Zapier, Make, n8n and the other Apify integrations — push new rows into Slack, Google Sheets, Airtable, Notion or a CRM.
  • API and client libraries — start runs and read rows from JavaScript or Python.
  • MCP — call the Actor from an AI agent through the Apify MCP server.

Where this fits with other Actors

This Actor reads one board and stops there. It is the right choice when you want the listings on authenticjobs.com specifically — the design and creative-tech companies that post there — as a clean, keyed table you can refresh on a schedule.

It is the wrong choice if you need the job description text or salary in the row: those are not on this board's listing pages, and the row gives you official_url to follow instead. If you already track other job boards, the field names here are the same ones used across similar job-board datasets, so rows from this board can be appended to the same table; the platform column tells them apart.

Found a problem?

If a run fails, a field looks wrong, or the board changes and the rows stop coming, please report it on the Issues tab of this Actor's page (https://apify.com/Pradio/authentic-jobs/issues) with the run id. The run log says which page and which request failed, and the RUN_SUMMARY record says what was fetched and charged, so both are worth a look first. Feature requests are welcome in the same place — but note that a field the board does not publish cannot be added by this Actor.

Unofficial

This Actor is not affiliated with, endorsed by or connected to Authentic Jobs or authenticjobs.com. It reads publicly visible listing rows from the board's own listings endpoint, honours the site's crawl delay, and does not fetch or store the job descriptions, which remain on the board. Use the data in line with the board's terms of use and the laws that apply to you.