Where the postings come from
DataRoles.dev collects public job postings from Greenhouse, Ashby and Lever job boards twice a day. A posting enters the feed only when its title names a data role.
The sample is not random. It covers the companies our crawler has found on those three boards, which skews toward tech companies.
Each month is its own sample. We do not follow the same companies from month to month, so a change between issues can be noise rather than a trend.
What counts as one posting
Each row is one company’s first posting in a role family that month. The three families are data engineer, analytics engineer and data analyst. A company hiring in two families counts once in each, and All families pools every row.
Which postings we keep
Postings pass these filters in order. Each figure’s source line gives the number that remain.
| Step | Rule |
|---|---|
| Month | First seen during the month |
| Track | Individual contributors only; manager titles drop out |
| Role family | The title names an analytics engineer, data engineer, data analyst or BI analyst role. Analyst titles that name product, marketing, finance or policy drop out |
| Internships | Intern, internship, co-op and apprentice titles drop out |
| Length | Descriptions of 1,500 characters or more |
| Language | English |
| Duplicates | Identical descriptions count once |
| Duties | Jev confirms the posting describes the role’s own work |
| Data role | Jev confirms the main work is data engineering, analytics engineering or data analysis |
| One per company | The first posting per company per family |
The one-per-company step runs last, so a boilerplate first posting never removes a company from the sample.
What we measure
AI responsibilities. Jev reads each posting and scores seven kinds of AI work as specific, generic or none. A specific reference says what the work is or which tools it uses. A generic one names AI without saying how, such as “AI fluency”. The score depends on the text, not on whether it sits under responsibilities, requirements or nice-to-haves. We report the specific share and the total, which counts specific and generic together.
AI terms. Pattern matching finds postings that name LLMs, agents, RAG, evals, AI coding tools, MCP or context layers. Jev then reads each matching line and drops lines where the employer describes itself, its products or its benefits, so a match counts only in text about the role.
Tools. Pattern matching finds postings that name each of 17 data tools. A match next to an unrelated meaning, such as dbt next to therapy, does not count.
Adjusted Apply Rate. Apply clicks on DataRoles.dev per day a posting is live, compared by work model, pay and role family. We index each group so its lowest segment equals 100.
- It counts every posting live on the site that passes the title, internship, length and English rules, since any live posting can draw clicks.
- Bot clicks are removed, and repeat clicks on one posting within 60 seconds count once.
- Segments with fewer than 20 postings or 30 clicks are not shown.
- It reflects DataRoles.dev visitors, not the whole job market.
- September 2026 uses clicks from September 18 to 30, after a change to our bot filter.
How Jev scores
We pin the Jev model version and the version of our scoring guide: jev-1.13.0 and v1.3 for September 2026. Every score is stored with both.
A published month is never rescored unless the scoring guide changes. When it does, every past month is rescored together so issues stay comparable.
We check Jev against a human-reviewed set of postings.
Known limits
- No seniority cut yet. Titles leave seniority unknown for about half of postings.
- Pay is yes or no. The feed has no currency field, so we report whether pay is listed, not how much.
- Company names come from the job boards, so two spellings of one company can slip past the one-per-company rule.
- We log changes to bot filtering and crawler coverage for each month.