SOC 15-1252
Software Developers
U.S. median: $135,980
Loading WageScope
Analytics and advertising stay off unless you allow them. Private data stays out.
Where the data comes from
BLS shared the May 2025 OEWS data on May 15, 2026. BEA shared the 2024 Regional Price Parities on February 19, 2026. We check each source file before use. Pay and price data stay separate.
Citeable resources
These three starting points use the approved May 2025 BLS release. Open a role for its full distribution, citation, CSV table, and reusable SVG chart.
SOC 15-1252
U.S. median: $135,980
SOC 29-1141
U.S. median: $97,550
Price-level source
We matched 438 BLS state and metro codes to BEA price data from 2024. We do not use a metro index for a nonmetro area. We do not fill a gap with a nearby place.
Official downloads
These links open the BLS ZIP files. The short codes below are digital fingerprints of the files we checked. The full SHA-256 codes are in our source record.
Release ledger
Plain-language guide
Trace the BLS and BEA data we use. Start with the source files. See how we check each file part on the server, work out new values, and build public pages.
From market data to your evidence
Pick a job post. Then build your résumé from work you have checked. BLS pay data is not proof of your skills or experience.
Private work begins only after sign-in and your confirmation. Nothing on this public page is saved.

SOC 47-2111
U.S. median: $63,190
WageScope compares BLS data. You may name us as a source, but you do not need to add a link to reuse an export.
Current wage release
The wage source is May 2025 OEWS estimates. BLS released it on 2026-05-15. MeritLog got and checked the files at 2026-08-31T23:35:00Z. These are three different dates. One says when the data is about, one says when BLS shared it, and one says when we got it.
The index has 830 job types and 584 state or local areas. The full set has 223,555 BLS estimates for job and place pairs. These counts describe our source files. They do not count site visits, users, or job posts.
BLS is the source for each pay and job count field. We format and compare those rows. When we work out a new value, we label it as our own math. Links to the BLS tables and method let you check the source for yourself.
Source ledger
The source pin names each official BLS archive and workbook member. It records the expected byte count and SHA-256 digest. SHA-256 is a file fingerprint. If one byte changes, the fingerprint changes. The refresh stops instead of treating an unreviewed file as the same release.
We check each column, value type, source group, job code, and area code. We look for repeated rows and missing values. A bad page address or repeated path fails the check. Before a page can use the data, we also check row counts and each file's digital fingerprint.
A release list records each file, its size, and its digital fingerprint. The site checks a file against that list before it reads it. If a file is missing, changed, or not on the list, the page shows a source error. It does not use an old unchecked copy.
Server output
The runtime reads a small release index plus gzip files scoped to one occupation or one area. An occupation shard holds the official rows for that SOC code. An area shard holds the all-occupations row and a bounded set of detailed role rows. The page requests only what it needs.
Your browser gets the page values, labels, links, charts, and source notes. It does not get the full BLS files, private server paths, database keys, or private job data. We check each page address before we choose a source file. Only a valid lowercase path can pass that check.
We keep source files on the server so pages can load less data. If a job type file fails, it cannot open some other path. If BEA data fails, the price view stops but BLS pay stays. If job posts fail, cards stop but both government sources stay intact.
Typed fields
The schema checks finite nonnegative numbers or a clear null. It checks SOC codes, area IDs, slugs, titles, map types, and state links. Extra fields fail. A bad identity between the index and a shard also fails. This stops a page from quietly using the wrong role or place.
Suppressed fields carry a reason such as not available, not released, or top coded. The page formatter uses that reason. It can show a lower bound for a top code or not published for a blank. The value never becomes zero just to keep a chart or sentence full.
BEA rows have their own checks. They must use state or metro codes, price values above zero, and the checked 2024 source. BEA data cannot change a BLS pay row. We bring the two sources together only in a labeled formula that shows how we use them.
Current price release
The current price artifact uses 2024 Regional Price Parities. BEA published it on 2026-02-19. MeritLog pinned 438 exact BLS state or metro matches. A state row never stands in for a metro, and a nearby metro never fills a missing place.
We keep the overall price index and each part: goods, housing, utilities, and other services. The U.S. level is 100. We use the overall index to compare pay after prices. You can still see each part. Housing or utility costs may look quite different from the broad index.
The price source can fail or go stale without changing the BLS source. A missing exact row removes the proxy. A newer BEA release blocks price-current claims until its files and pages pass review. The wage page remains clear about its own May 2025 source period.
Derived math
A percent wage gap is value minus base, divided by base, times 100. The page uses the same annual or hourly field on both sides. It does not compare an annual value with an hourly value. A missing or zero base makes the gap unavailable.
We divide pay by the overall price index divided by 100. This gives a rough view of pay after local prices. To find matching pay elsewhere, we keep that result fixed and apply the other area's price index. These are MeritLog calculations. They are not fields published by the government.
Derived values keep both source periods and a plain limit. They are not personal pay, take-home pay, or a full budget. They do not include taxes, benefits, household size, debt, commute, or taste. JSON-LD never labels the proxy as a BLS wage.
Job posts stay separate
Job cards come from MeritLog's public job list. They do not come from BLS or BEA. Each card shows only details cleared for public use. It cannot read your saved private jobs, pasted text, Career Memory facts, or private pay. Public and private job data stay separate.
After a public search, we check the employer's job title against our match rules. This is a MeritLog match, not a BLS claim. To filter by place, we also need an exact checked place code. If we cannot match safely, we say so. We do not guess a city.
The number of job posts does not prove that a field is growing. Posted pay does not change wage medians. We do not copy job posts to make these pages longer. Posts can come and go while the BLS and BEA source files stay the same.
Updates and fixes
Each week, we check for new BLS and BEA data. If a full new release is out, we stop calling our older data the latest. We must check the new files, process them, and test sample rows. We also review the content and pages, then check the hosted site.
If a source fixes or removes data, we can take affected pages off our approved list and release the change. Search and AI discovery lists use those same paths. Based on the problem, a removed page can stay out of search results or show a clear page-not-found message.
Our release record ties the source files to the code, paths, content checks, and human review. If a part is missing or does not match, release stops. A test on our own machine does not prove the live page works. We must check the hosted page and its content too.
Source clock
May 2025 OEWS estimates is the wage source used across WageScope. The reference period is May 2025. BLS published the release on May 15, 2026. A current job post may have a newer date, but that does not make the government wage row newer. Each source keeps its own clock.
We check the BLS tables each week. If a full new release is out, we stop calling our older data the latest. We check the new files and review their use before release. We do not change an old date to look fresh. Each new source must pass the same data and page checks.
BEA price-level data has a separate clock. The current WageScope price source is for 2024. It was published on February 19, 2026. WageScope shows the wage and price periods together when both are used. It never says the two sources describe the same month.
Jobs stay separate
A job card shows a firm, title, place, source, and check date. We keep only close matches between the employer's title and the BLS job type. A wage page may have no matching cards. We leave out unclear matches, even when this means a useful post does not appear.
A listing may show posted pay. That range belongs to one employer post. It never enters the BLS median, mean, percentile, employment count, or price-level proxy. A list of posts also does not become a hiring score. The BLS row and the public catalog answer different questions on different clocks.
Each wage page must explain its source data well enough to stand on its own. We do not count job-post text toward that review. Posts can change or close at any time. If no jobs match, or job search is down, you can still read the wage data. We say what happened and do not fill the list with sample jobs.
Public and read only
This page uses public government facts and job details cleared for public use. It does not read your Career Memory, private jobs, pasted job text, private pay, or saved résumé. Opening a role or place does not add a fact to your private record. It does not start an AI task.
This page does not build a private profile from your search, role, place, pay, or job cards. Public analytics tools may get the page URL while they are on. These tools are GA4, Ahrefs, and Meta. Use Your Privacy Choices or Global Privacy Control to turn that off. You can use WageScope without signing in.
To work on a résumé, choose a job and enter the private MeritLog flow. You check the work facts used in each draft. A BLS wage, area rank, job count, or price estimate cannot become a claim about your work. You can still use the public page when the private tools are closed.