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:

  1. The wageParity premium eligibility flag set to true.
  2. A workLocationId identifying 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
}
FieldTypeDefaultDescription
wageParitybooleanfalseIndicates 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"
        }
      ]
    }
  ]
}
FieldTypeRequiredDescription
idStringNoSalsa ID of an existing external work site. Provide to update.
externalIdStringNoYour own identifier, used for matching on upsert and for referencing in workLocationId.
nameStringNoDisplay name (e.g., "New York City").
cityStringYesCity or town of the work site.
stateStringYesState code, normalized to lowercase (only ny is currently supported).
postalCodeStringYesPostal or ZIP code.
countryISOStringYesISO 3166-1 alpha-3 country code (e.g., USA).
addressLine1StringNoStreet address line 1. Optional for wage parity work sites.
addressLine2StringNoStreet 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.

RuleBehavior
workLocationId is required when wageParity is trueEntries with wageParity: true that are missing workLocationId are rejected.
workLocationId is only allowed when eligibleEntries that include workLocationId but do not have wageParity: true are rejected.
workLocationId must resolve to an existing entityIf the value matches no EmployerExternalWorkSite or EmployerAddress (by Salsa ID or externalId), the entry is rejected.
workLocationId must resolve to a single entityIf 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 YorkIf the resolved location is in a state other than NY, the entry is rejected.
Entry must be shift-basedThe entry must include both startDateTime and endDateTime. Whole-day entries cannot use the wageParity flag.
Pay entries must be rate-basedFixed-amount and frequency-based pay entries cannot use the wageParity flag.