Accessing Maryland State Employee Salary Data Through Toppaid

Most people don't realize that the state of Maryland actually publishes employee salary information, but finding it isn't as straightforward as typing a name into a search box and getting a spreadsheet back. The Toppaid system, which is the portal associated with Maryland's payroll and compensation data, has gone through a few iterations over the years. What works today might not have worked two years ago, and there are some quirks that aren't documented anywhere official. Here's how the process actually goes if you're trying to pull salary information. You need a valid Maryland state employee login through the Toppaid system. The basic URL has changed a couple of times. Right now, the most reliable entry point is through the Comptroller's office portal at marylandpay.maryland.gov or the HR link that routes through the state's main workforce system. You can't just browse around without authenticating. Once you're in, the salary lookup isn't as intuitive as you'd expect. The interface sorts by employee ID and department codes rather than by name or title. I spent about three weeks trying to map department abbreviations to actual agencies because the reference table they provide is outdated. Finance comes up as one thing, Public Safety as another, and transportation isn't where you'd think it is. You have to cross-reference the agency code list that gets posted quarterly and even then it doesn't always match what you see in the actual records.

The real bottleneck most people run into is the filtering. The default view shows base salary only. It doesn't show step increases, longevity pay, differentials, or any of the extra compensation layers that make two people in the same title with the same years of service earning significantly different amounts. I had a situation where I was reconciling budget discrepancies and kept pulling the same job title thinking they were equivalent. Turns out one person had a specialized certification differential and the other had a shift premium. The base salary field made them look identical until I dug into the line-item breakdown.

What the Data Actually Shows

When you do get past the navigation issues, what you're looking at is essentially a detailed compensation record. Base salary is the starting point. Then there are adjustments for step placement within the pay grade, which is tied to years of credited service. Maryland uses a step system for most classified positions, and moving from step one to step ten can add a meaningful chunk over a career. Beyond that you have the differentials. There are hazard pay differentials for certain law enforcement and corrections roles. Education differentials exist for positions requiring specific certifications. Administrative allowances get added for supervisory roles. None of this shows up in a single column. You have to know where to look and what each code means. The legend file that accompanies the data export is barely helpful. It lists codes but doesn't explain the calculation logic behind them. One thing that catches people off guard is that the data isn't real-time. There's a lag, usually somewhere between a pay period and a full month, depending on when the Comptroller's office runs the extraction. If someone just got a raise or changed positions, their current salary in Toppaid might not reflect it yet. I learned this the hard way when I was doing a budget forecast and used stale data that was about two weeks behind actual payout figures. The variance wasn't huge but it was enough to throw off projections.

Get the Full Details

Top Moore staff earned highest 2025 Maryland state employee salaries ...
Top Moore staff earned highest 2025 Maryland state employee salaries ...

Common Mistakes People Make

The biggest error I see is assuming that a salary figure is final. It isn't. The numbers you pull are snapshots that exclude bonuses, stipends, and any supplemental payments that come through separate processes. If you're using this data to benchmark or compare compensation across agencies, you're only seeing part of the picture. Another issue is the way job titles are standardized. Two people doing essentially the same work might have different title strings depending on when they were hired or which division they sit under. The title field isn't a clean categorical variable. It's messy. You can't reliably aggregate by title alone without cleaning the data first. I've seen people waste hours trying to group by similar-sounding titles and then wonder why the numbers didn't add up. There's also the geographic factor. Some positions carry location-based adjustments, particularly for Baltimore City or certain rural counties where the state tries to remain competitive with local market rates. These adjustments aren't always visible in the default export. You need to run a more detailed query or export the supplementary fields to see them.

A Practical Workaround for Getting Clean Data

What I ended up doing after months of frustration was building a simple lookup script that pulls the data through the available export function, then runs it through a normalization pass. It maps the department codes against the official agency list, cleans up the job titles by standardizing common variations, and flags entries where the compensation exceeds what the base salary table predicts because that usually indicates an unlisted differential or allowance. The script itself is straightforward. It reads the CSV export, does a join against a static mapping file for agency codes, applies a title normalization routine that handles common abbreviations and punctuation differences, and outputs a cleaned dataset. The whole process takes about ten minutes for a full fiscal year export, compared to the hour or more it would take to manually sort through the raw data. One edge case the script had to handle is employees who hold dual appointments. They show up once per position, and the salaries aren't additive in the raw data the way you'd expect. I had to write a deduplication step that identifies these cases and presents the combined compensation rather than treating each entry independently. Without that step, your averages would be skewed upward for anyone with multiple roles.

Limitations You Should Know About

The Toppaid data has real constraints. It only covers classified state employees. Excluded are elected officials, judicial branch personnel in many cases, employees of institutions of higher education who fall under separate compensation systems, and federal employees who work on state facilities. If your analysis needs to include any of those groups, you'll need to pull data from entirely separate sources. The data quality itself is reasonable but not perfect. There are entries with missing values, especially in older records before the current tracking system was implemented. Duplicate entries occasionally slip through during system migrations. I found a handful of cases where an employee's record appeared with two different employee IDs after a reorganization, and reconciling them required going back to the original hiring documents. Another limitation is access itself. Not everyone can pull this data. You need appropriate credentials through the state's system. The public version through the Comptroller's open data portal gives you aggregated information by job category and agency but not individual salary records. If you need granular individual-level data for research or audit purposes, you have to go through the proper channels and justify the request. The approval process isn't fast.

2024 Maryland State Salaries – USM COLA & Salary Increase History – HXDM
2024 Maryland State Salaries – USM COLA & Salary Increase History – HXDM

For most people who just want a general sense of what state workers earn, the public aggregates from the Comptroller's office are probably sufficient. They cover base salary ranges by classification and agency. The detailed individual data is useful when you need specificity, but it comes with enough friction and caveats that you should weigh whether it's actually necessary for whatever you're trying to do.