NY payroll XML
Turn a certified payroll CSV into the bulk upload file for the New York State DOL Certified Payroll System. Check it before you upload.
Your file stays on this computer. The page runs in your browser and uploads nothing.
Since January 1, 2026, New York has required contractors and subcontractors on public work to submit certified payroll through the state DOL's system. The bulk upload is one XML file per project and week, in the state's own format. It is not the Payroll XML that state DOTs take; for that, use the main page.
How to lay out the CSV
One row per worker, per classification, per day worked. The first row holds the column names below. Column order does not matter. One file holds one project and one week, the way the state takes it.
| Column | What goes in it |
|---|---|
prc_number | The project's 10 character PRC number. Same on every row. |
week_ending | The last day of the work week, as 2026-10-04 or 10/4/2026. Same on every row. |
last_name, first_name, middle_name | The worker's name. Middle name can be blank. |
ssn_last4, date_of_birth | Fill one of them, not both. A full SSN is cut to its last 4; the rest never goes in the file. |
apprentice | Y if the worker is a New York registered apprentice, N or blank if not. |
address1, address2, city, state, zip, country | The worker's address. NY becomes New York; the state wants the full name. A ZIP like 12207-0002 is split for you, and one Excel cut to 4 digits gets its 0 back. Country can be blank for United States. |
gross_earnings, net_wages | The week's gross and net pay for the worker. Same on each of that worker's rows. |
deductions | Pairs like Federal Tax:150.00;State Tax:50.00. Up to 10. Blank if none. |
work_category | The classification, as it reads on the wage schedule. |
st_rate, ot_rate | Straight time and overtime hourly rates, at most 2 decimals. |
health, vacation, training, pension, other | Optional. Hourly supplement rates for this classification. Add health_ot and so on when the overtime rate differs. other needs other_explanation. |
work_date, st_hours, ot_hours | The day worked and the hours that day. |
What the check looks for
Problems are things the state's upload rejects. Most of them pass the state's schema, so a schema check alone will not catch them.
- Each worker has the last 4 of the SSN or a date of birth, one, not both.
- No worker is in the file twice. Two classifications go under one worker.
- Every day worked falls in the seven days ending on the week ending date.
- The state is spelled out, not abbreviated.
- An Other Benefit supplement has an explanation, and no other kind has one.
- No hours, rates or pay below 0, and no straight time rate of 0.00.
- The PRC number is 10 characters.
It also explains four places where the state's guide page and its own schema disagree, so the upload's error makes sense:
- The pay field is
deductionsGrossEarnings, with an s. - The address needs a country, though the guide page marks it optional.
- Apprentice is true or false, though the schema's note says Y or N.
- The week ending date carries a time, like 2026-10-04T00:00:00.000Z.
Warnings are things a reviewer would ask about:
- Gross pay minus the deductions is not net pay.
- Gross pay below the hours times the rates.
- The same day twice, or more than 24 hours in one day.
- An overtime rate below the straight time rate.
- A supplement for a classification the worker is not listed under, or a worker with no hours.
What it does not check
The rates in the prevailing wage schedule, whether the PRC number and classifications match your project, or the hours against your time cards. The check compares the file's own numbers with each other.