Set up Wage Parity Integration
This guide describes how to send wage parity-eligible shifts and manage work locations through the Paystream API.
For an overview of what wage parity is, how Salsa calculates it, and the fulfillment strategies available, see the Premium Pay page.
Overview
To have Salsa evaluate a shift for wage parity, you need to send two things on each eligible pay or timeWorked entry:
- The
wageParitypremium eligibility flag set totrue. - A
workLocationIdidentifying where the shift was performed.
The work location must reference an EmployerExternalWorkSite (or EmployerAddress) that resolves to a supported New York region.
Premium Eligibility Flag
The existing premiumEligibility object on pay and timeWorked entries supports a new wageParity flag:
"premiumEligibility": {
"wageParity": true
}| Field | Type | Default | Description |
|---|---|---|---|
wageParity | boolean | false | Indicates this shift should be evaluated for wage parity premium. |
When the flag is omitted or false, the shift is not evaluated for wage parity. Existing flags (splitShift, spreadOfHours) continue to work as before and can be combined with wageParity on the same entry.
When sending the wage parity flag on a pay entry, the referenced pay type must be configured to count toward time worked. If it isn't, no wage parity premium will be calculated for that entry.
Work Location
When wageParity is true, the entry must include a workLocationId identifying where the shift was performed. Salsa uses this to determine the applicable wage parity region.
"workLocationId": "worksite-456"workLocationId accepts either a Salsa ID or your own externalId for an EmployerExternalWorkSite (or EmployerAddress).
Tip: You don't need to create one work site per patient address. Wage parity rates are determined by region, so a single work site per city is sufficient — reuse it for every shift performed in that city.
Employer External Work Sites
An Employer External Work Site represents a location where workers perform work that is not owned by the employer. For example, a patient's home in home care, or a job site in construction.
Because wage parity rates depend on where the work was performed, Salsa needs to know the work location for each eligible shift. External work sites accept a partial address — street-level fields are optional — which is enough for Salsa to determine the wage parity region.
External work sites are created and updated through the Paystream employer upsert flow, alongside existing entities like addresses and bankAccounts.
Endpoint: POST /api/rest/v1/paystream/employers
{
"data": [
{
"type": "PaystreamEmployerUpsertInput",
"externalId": "employer-123",
"externalWorkSites": [
{
"externalId": "worksite-456",
"city": "New York",
"state": "ny",
"postalCode": "10001",
"countryISO": "USA"
}
]
}
]
}| Field | Type | Required | Description |
|---|---|---|---|
id | String | No | Salsa ID of an existing external work site. Provide to update. |
externalId | String | No | Your own identifier, used for matching on upsert and for referencing in workLocationId. |
name | String | No | Display name (e.g., "New York City"). |
city | String | Yes | City or town of the work site. |
state | String | Yes | State code, normalized to lowercase (only ny is currently supported). |
postalCode | String | Yes | Postal or ZIP code. |
countryISO | String | Yes | ISO 3166-1 alpha-3 country code (e.g., USA). |
addressLine1 | String | No | Street address line 1. Optional for wage parity work sites. |
addressLine2 | String | No | Street address line 2. Optional. |
If you upsert with an externalId or id that already exists, Salsa updates the matching record. Otherwise, a new external work site is created.
Sending Wage Parity Shifts
You can create work sites and send shifts in a single request, or as two separate requests. The combined endpoint is convenient when shifts reference work sites you haven't created yet.
Single Request
The combined Paystream endpoint accepts a data array with multiple item types, processed in order. Items are processed sequentially, so the work sites from the first item are guaranteed to exist by the time the shifts in the second item reference them.
Endpoint: POST /api/rest/v1/paystream?synchronous=true
{
"data": [
{
"type": "PaystreamEmployerUpsertInput",
"externalId": "employer-123",
"externalWorkSites": [
{
"externalId": "worksite-456",
"city": "New York",
"state": "ny",
"postalCode": "10001",
"countryISO": "USA"
},
{
"externalId": "worksite-789",
"city": "Yonkers",
"state": "ny",
"postalCode": "10099",
"countryISO": "USA"
}
]
},
{
"type": "PaystreamPayrollElementPeriodReplacementInput",
"periodStartDate": "2026-03-01",
"periodEndDate": "2026-03-15",
"employerId": "employer-123",
"workers": [
{
"workerId": "wkr_def456",
"pay": [
{
"payReferenceId": "ref:pay:partner:us:hourly",
"startDateTime": "2026-03-01T09:00:00-05:00",
"endDateTime": "2026-03-01T17:00:00-05:00",
"rate": "25.00",
"externalId": "shift-001",
"workLocationId": "worksite-456",
"premiumEligibility": {
"wageParity": true
}
}
],
"timeWorked": [
{
"startDateTime": "2026-03-03T09:00:00-05:00",
"endDateTime": "2026-03-03T17:00:00-05:00",
"externalId": "shift-003",
"workLocationId": "worksite-789",
"premiumEligibility": {
"wageParity": true
}
}
]
}
]
}
]
}Two Separate Requests
If you prefer, send the work sites and the shifts independently. Once a work site exists, it can be referenced in any number of subsequent shift submissions by its externalId or Salsa ID.
1. Upsert the work sites
Endpoint: POST /api/rest/v1/paystream/employers
{
"data": [
{
"type": "PaystreamEmployerUpsertInput",
"externalId": "employer-123",
"externalWorkSites": [
{
"externalId": "worksite-456",
"city": "New York",
"state": "ny",
"postalCode": "10001",
"countryISO": "USA"
},
{
"externalId": "worksite-789",
"city": "Yonkers",
"state": "ny",
"postalCode": "10099",
"countryISO": "USA"
}
]
}
]
}If you upsert with an externalId that already exists, Salsa updates the matching record. Otherwise, a new external work site is created.
2. Send the shifts
Endpoint: POST /api/rest/v1/paystream/payroll-elements
{
"data": {
"type": "PaystreamPayrollElementPeriodReplacementInput",
"periodStartDate": "2026-03-01",
"periodEndDate": "2026-03-15",
"employerId": "employer-123",
"workers": [
{
"workerId": "wkr_def456",
"pay": [
{
"payReferenceId": "ref:pay:partner:us:hourly",
"startDateTime": "2026-03-01T09:00:00-05:00",
"endDateTime": "2026-03-01T17:00:00-05:00",
"rate": "25.00",
"externalId": "shift-001",
"workLocationId": "worksite-456",
"premiumEligibility": {
"wageParity": true
}
}
],
"timeWorked": [
{
"startDateTime": "2026-03-03T09:00:00-05:00",
"endDateTime": "2026-03-03T17:00:00-05:00",
"externalId": "shift-003",
"workLocationId": "worksite-789",
"premiumEligibility": {
"wageParity": true
}
}
]
}
]
}
}The workLocationId values reference the work sites by their externalId (you could also use the Salsa IDs returned by step 1).
Validation Rules
The API enforces the following rules for wage parity entries. Violations are returned as HTTP 400 with a specific error message and the offending entry is not ingested.
| Rule | Behavior |
|---|---|
workLocationId is required when wageParity is true | Entries with wageParity: true that are missing workLocationId are rejected. |
workLocationId is only allowed when eligible | Entries that include workLocationId but do not have wageParity: true are rejected. |
workLocationId must resolve to an existing entity | If the value matches no EmployerExternalWorkSite or EmployerAddress (by Salsa ID or externalId), the entry is rejected. |
workLocationId must resolve to a single entity | If the value matches more than one entity (e.g., the same externalId reused across tables), the entry is rejected. Use Salsa IDs or namespace your external IDs. |
| Work location must be in New York | If the resolved location is in a state other than NY, the entry is rejected. |
| Entry must be shift-based | The entry must include both startDateTime and endDateTime. Whole-day entries cannot use the wageParity flag. |
| Pay entries must be rate-based | Fixed-amount and frequency-based pay entries cannot use the wageParity flag. |
