Observatory

What the analytics engineering job market actually looks like.

Counted the same way every day, with the sample behind every figure stated next to it. Nothing is modeled, estimated, or filled in — and the whole dataset is free to download.

What this can say

Point-in-time only. 0 days of comparable history; 42 are needed before movement can be described.

Open postings by role family
Role familyOpenShare of sampleDisclosed pay
Analytics engineersmall sample70.1%
BI developersmall sample20%
Data analyst310.5%48.4%
Data engineersmall sample190.3%
Data leadershipsmall sample10%
Data scientist781.4%43.6%
ML engineer1152%38.3%

Out of 5695 open postings observed. 4.4% of them are data roles at all; the rest are engineering, sales, and everything else these employers are hiring for, and they are counted in the denominator rather than dropped. 4 families are marked small: the count is exact, but the base is too narrow to compare or to read as a trend, so no rate is shown for it.

Disclosed pay

Stated ranges only, from the postings that published one. Never converted between currencies and never annualized, so each currency and pay period stands on its own.

Disclosed pay percentiles by role family and currency
Role family25thMedian75thPostings
ML engineerUSD annual205,500242,125276,00030

Postings that disclose pay are not a random sample of postings — pay transparency tracks jurisdiction and employer size — so these figures describe what gets published, which is not the same as what gets paid. 18 further combinations were computed and withheld for too few disclosing postings.

Release 2026-08-07.11, published August 7, 2026. Newest observation August 7, 2026.

Figures are pinned to this release, so the numbers on this page match the downloadable dataset exactly. Both change only when a new release is promoted.

How to read these numbers

Every figure is a count of postings observed open at a point in time, not a flow. It does not say how many roles opened or closed over a period, and a count that falls can mean fewer openings or a quieter week — the number alone cannot tell you which.

Nothing is estimated, modeled, or filled in. A posting whose salary cannot be read confidently counts with no salary rather than a guess, and a location that does not resolve to a real place stays unresolved rather than being filed under the nearest match. That makes some cells empty on purpose, and an empty cell is never a zero.

Figures appear only once the sample behind them is large enough to mean something, and only once there is enough history to support the kind of statement being made. Where a sample is too thin to report, the row stays visible and its value is withheld, so a gap is never disguised as a small number. The datasets are the same bytes this page renders from, column by column.