Pay Workers with Salsa Advanced

Run payroll through Salsa with our REST APIs.

Build your own robust payroll experiences with our APIs for Salsa Advanced. In this tutorial, you'll create an end-to-end workflow to pay workers, and learn how to:

  • Set up an Employer
  • Set up Workers
  • Send compensation data to Salsa
  • Process payroll information and deliver payment records to workers

πŸ“˜

Using cURL

The following steps are provided as cURL requests but are also available as a Postman collection.


Step 1: Get an API Token

After signing up, you receive two API keys. If you don't have one, get in touch with us. One for production and one for your sandbox environment. In this tutorial, you need your Sandbox API Token. To learn more, see Authorization.


Step 2: Set up an Employer

An Employer represents the legal entity employing and paying Workers. To run payroll, an Employer must:

  • Belong to your organization and have a business name.
  • Have at least one address that serves as a work location and mailing address.
  • Have at least one pay group. This is how we schedule and group Workers that will be part of a payroll run.
  • Have provided tax information related to the location of their business and Workers.

Create an Employer

Create an Employer using the paystream API, providing information such as business name, address, and banking details. This entity represents a business that is employing and paying Workers.

curl --request POST \
--url https://api.sandbox.salsa.dev/api/rest/v1/paystream/employers \
--header 'Accept: application/json' \
--header 'authorization: Bearer ${ADD_TOKEN}' \
--header 'content-type: application/json' \
--data '
{
        "data": [
                {
                        "type": "PaystreamEmployerUpsertInput",
                        "businessInfo": {
                                "country": "USA",
                                "businessName": "Shack 22",
                                "employerType": "BUSINESS"
                        },
                         "addresses": [
                                {
                                        "name": "Main Address",
                                        "addressLine1": "701 3rd St",
                                        "addressLine2": "Unit 100",
                                        "city": "San Francisco",
                                        "state": "CA",
                                        "postalCode": "94107",
                                        "countryISO": "USA",
                                        "isWorkLocation": true,
                                        "isDefaultWorkLocation": true
                                }
                        ],
                        "bankAccounts": [
                                {
                                        "displayName": "Default",
                                        "routingNumber": "121000358",
                                        "accountNumber": "123456789",
                                        "setAsEmployerDefaultBankAccount": true,
                                        "accountType": "CHECKING",
                                        "paymentAuthorization": {
                                                "acceptedAt": "2024-01-01T01:00:00Z"
                                        },
                                        "verification": {
                                                "organizationVerifiedAt": "2024-01-01T01:00:00Z"
                                        }
                                }
                        ]
                }
        ]
}'

Example response

{
    "data": [
        {
            "id": "er_353b22d0-5d4b-4416-832e-f408de9e6d33",
            "externalId": null,
            "addresses": [
                {
                    "id": "eradr_c64cc3a8-1ab0-4d60-9b54-b095cb41bac2",
                    "externalId": null
                }
            ],
            "bankAccounts": [
                {
                    "id": "erbankacc_911a381f-aaf8-42fb-ae84-2b8839a88b99",
                    "externalId": null
                }
            ],
            "termsOfService": null,
            "minimumProjectedStartDate": null
        }
    ]
}

πŸ“˜

The External Id field

externalId is used to link various entities in the Salsa ecosystem with unique identifiers in your system. In this tutorial, the field is null. However, it is commonly used in production application, for example when sending Webhook events.

If you are interested in more details, please see the API Reference.

Save the Employer's ID (id) to complete the next steps.

Onboard the Employer

After creating an employer, additional information is required to finish onboarding. To expedite the process in this tutorial, you can use the mock-onboard endpoint to generate sample details, and simulate the onboarding of an Employer. Use the id from the previous step as the employerId.

curl --location --request POST 'https://api.sandbox.salsa.dev/api/rest/v1/employers/${employerId}/mock-onboard' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ${YOUR_API_TOKEN}'

Example response

{
    "data": {
        "employer": "er_b9743f80-0b6c-44f4-b22f-8e3348b1408f",
        "readiness": {
            "workerPayment": {
                "status": "READY"
            }
        }
    }
}

See Employer Information for more details about onboarding employers.


Step 3: Set up Workers

Now you will set up two workers: an employee and an independent contractor. While the workflow to create an employee and contractor is the same, data collection and payment processing differ for each role.

To run payroll, a Worker must have:

  • A first and last name
  • The correct classification: EMPLOYEE or CONTRACTOR
  • A home address
  • Provided tax related information

πŸ“˜

Worker classification

Correctly classifying a Worker as an employee or independent contractor is an important task. For more information, see Worker Classification.

Create an employee and contractor

Use the employerId from the previous step to create two Worker entities. These entities represent one employee and one contractor of the business.

curl --request POST \
--url https://api.sandbox.salsa.dev/api/rest/v1/paystream/workers \
--header 'Accept: application/json' \
--header 'authorization: Bearer ${ADD_TOKEN}' \
--header 'content-type: application/json' \
--data '
{
	"data": [
		{
			"type": "PaystreamWorkerUpsertInput",
			"contract": {
				"classification": "EMPLOYEE",
				"hireDate": "2001-01-10"
			},
			"displayName": "Ruby Brown",
			"employerId": "${EMPLOYER_ID}",
			"firstName": "Ruby",
			"lastName": "Brown",
			"personalInfo": {
				"email": " [email protected]",
				"birthDate": "1989-01-07"
			}
		},
		{
			"type": "PaystreamWorkerUpsertInput",
			"contract": {
				"classification": "CONTRACTOR",
				"hireDate": "2021-01-10"
			},
			"displayName": "Alex Johnson",
			"employerId": "${EMPLOYER_ID}",
			"firstName": "Alex",
			"lastName": "Johnson",
			"personalInfo": {
				"email": " [email protected]",
				"birthDate": "2000-06-10"
			}
		}
	]
}
'

Example response

{
    "data": [
        {
            "workerId": "wr_d4779475-da76-45c9-86e1-6f1f75d9ac1e",
            "externalId": null,
            "workerContract": {
                "id": "wrctr_f27d9159-edb7-431a-8264-159c41c71385"
            },
            "bankAccount": null,
            "bankAccounts": null
        },
        {
            "workerId": "wr_34247991-a926-40a6-95ca-170c98ccfb51",
            "externalId": null,
            "workerContract": {
                "id": "wrctr_c00cc79f-ae51-4835-a39d-ebe4e2a8ff98"
            },
            "bankAccount": null,
            "bankAccounts": null
        }
    ]
}

Onboard both Workers

Additional information is required to finishing onboarding, such as where your workers live, their withholding information, and how they will be paid. Similar to Employer onboarding, use the mock-onboard endpoint to generate sample details, and simulate Worker onboarding. Notice that you can provide multiple workerIds in a single request.

curl --location --request POST 'https://api.sandbox.salsa.dev/api/rest/v1/employers/${employerId}/workers/mock-onboard' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ${YOUR_API_TOKEN}' \
--data-raw '{
  "workerIds": [
    "wr_d4779475-da76-45c9-86e1-6f1f75d9ac1e",
    "wr_34247991-a926-40a6-95ca-170c98ccfb51"
  ]
}'

Example response

{
    "data": [
        {
            "worker": "wr_d4779475-da76-45c9-86e1-6f1f75d9ac1e",
            "readiness": {
                "workerPayment": {
                    "status": "READY"
                }
            }
        },
        {
            "worker": "wr_34247991-a926-40a6-95ca-170c98ccfb51",
            "readiness": {
                "workerPayment": {
                    "status": "READY"
                }
            }
        }
    ]
}

Step 4: Pay Workers

Paying Workers is one of the most important tasks when overseeing payroll for a business. In this section, you will learn how to send compensation data from your platform to Salsa, allowing you to pay workers.

Get compensation policies

Compensation policies are pre-configured in your Salsa account. You use these policies to give workers their compensation, making sure their pay data matches the right pay items. Make this request to retrieve your organization's compensation policies.

curl --location --request GET 'https://api.sandbox.salsa.dev/api/rest/v1/organization-compensation-policies' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ${YOUR_API_TOKEN}'

Example response

{
    "data": [
        {
            "id": "prtnrcomppol_569103c1-b418-4d3f-902a-5ff3327540bc",
            "referenceId": "ref:comp:parisfintech:salarycomp",
            "description": "Salary Comp",
            "calculationMethod": "FIXED_AMOUNT"
        },
        {
            "id": "prtnrcomppol_900157da-cfcd-4083-934b-cb3caa430ee2",
            "referenceId": "ref:comp:parisfintech:hourlycomp",
            "description": "Hourly Comp",
            "calculationMethod": "HOURLY_BASED_AMOUNT"
        }
    ]
}

Save the referenceId to complete the next step.

Create pay entries for Workers

Now that you are all set up with which pay types you support, you can create worker pay entries (these represent entries of the earnings workers are to be paid). Once received, these are picked up and processed by the payroll engine to create the total Worker payment.

It's import to note that pay entries will only be picked up by the Payroll Run whose pay period overlaps with the pay entries effective interval (startDate / endDate).

Use the referenceId returned in the previous step to define the Worker Pay Entry linked to a specific Partner Pay Type.

πŸ“˜

Tip!

When sending payReferenceId you can use the PayTypes id or referenceId. We recommend that you code using the referenceId as this will be the same across environments (Sandbox / Production) and allows you to build your integrated based on concepts and not instances.

curl --location --request POST 'https://api.sandbox.salsa.dev/api/rest/v1/paystream' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ${YOUR_API_TOKEN}' \
--data-raw '{
    "data": [
    {
        "type": "PaystreamPayrollElementPeriodReplacementInput",
        "periodStartDate": "2024-01-01",
        "periodEndDate": "2024-01-07",
        "workers": [
            {
              "pay": [
                  {
                      "payReferenceId": "${YOUR_FIXED_AMOUNT_PAY_REFERENCE_ID}",
                      "startDate": "2024-01-01",
                      "endDate": "2024-01-07",
                      "amount": "1500"
                  },
                  {
                      "payReferenceId": "${YOUR_HOURLY_COMPENSATION_REFERENCE_ID}",
                      "startDate": "2024-01-01",
                      "endDate": "2024-01-01",
                      "rate": "17.50",
            					"hours": "8"
                  },
                  {
                      "payReferenceId": "${YOUR_HOURLY_COMPENSATION_REFERENCE_ID}",
                      "startDate": "2024-01-02",
                      "endDate": "2024-01-02",
                      "rate": "17.50",
            					"hours": "6"
                  }
              ],
              "workerId": "${YOUR_WORKER_ID}"
            }
          ]
        }
    ]
}'

Example response

{
  "data": [
    {
      "paystreamItemId": "paystream_e9d40465-096c-467c-8a36-69200afeda32",
      "partnerId": "<YOUR_PARTNER_ID>",
      "createdAt": "2024-11-07T11:07:49.073575789Z",
      "updatedAt": "2024-11-07T11:07:49.073592909Z",
      "status": "QUEUED",
      "itemInput": {
        "type": "PaystreamPayrollElementPeriodReplacementInput",
        "periodStartDate": "2024-01-01",
        "periodEndDate": "2024-01-07",
        "filters": null,
        "workers": [
          {
            "workerId": "<YOUR_WORKED_ID>",
            "pay": [
              {
                "payReferenceId": "ref:pay:parisfintech:us:salary",
                "startDate": "2024-01-01",
                "endDate": "2024-01-07",
                "amount": "1500",
                "rate": null,
                "hours": null,
                "frequency": null
              },
              {
                "payReferenceId": "ref:pay:parisfintech:us:hourly",
                "startDate": "2024-01-01",
                "endDate": "2024-01-01",
                "amount": null,
                "rate": "17.50",
                "hours": 8,
                "frequency": null
              },
              {
                "payReferenceId": "ref:pay:parisfintech:us:hourly",
                "startDate": "2024-01-02",
                "endDate": "2024-01-02",
                "amount": null,
                "rate": "17.50",
                "hours": 6,
                "frequency": null
              }
            ],
            "timeWorked": [],
            "timeOff": null
          }
        ]
      }
    }
  ]
}

You can read more about in our docs about the concept of Pay Types and Policies

Process payroll

The next step is to process the pay entries sent, which is called payroll run. Payroll run requires a start date, end date, pay date, and the worker IDs for employees and contractors being paid during this period.

curl --location --request POST 'https://api.sandbox.salsa.dev/api/rest/v1/employers/${employerId}/payroll-runs' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ${YOUR_API_TOKEN}' \
--data-raw '{
    "payPeriod": {
      "startDate": "2023-01-01",
      "endDate": "2023-01-07",
      "payDate": "2023-01-07"
    },
    "workerIds": ["wr_d4779475-da76-45c9-86e1-6f1f75d9ac1e"],
		"type": "PayrollRunCalculateFromWorkerListInput"
}'

Example response

{
    "data": {
        "id": "payrun_9e8b6675-27a0-4703-9460-4a76740b17d5",
        "workerPayGroup": "payrl_bc63608a-4bb4-44d2-8379-476fec62ea0e",
        "status": "PENDING",
        "payPeriod": {
            "startDate": "2023-01-01",
            "endDate": "2023-01-07",
            "payDate": "2023-01-07"
        },
        "employer": "er_b9743f80-0b6c-44f4-b22f-8e3348b1408f",
        "confirmedDate": null,
        "confirmBy": "2023-01-05T19:00:00",
        "debitDate": "2023-01-06",
        "totals": {
            "payrollCost": 2075.00,
            "toBeDebited": 2075.00,
            "reimbursement": 0.0
        },
        "compensationPolicies": [
            {
                "id": "prtnrcomppol_0cbe7ddb-889c-4ed1-bc98-4f0ceca763b7",
                "name": "Hourly",
                "amountType": "rateBasedAmount"
            },
            {
                "id": "prtnrcomppol_ccd2a3b6-fd68-4e4d-8afa-4ded50b22105",
                "name": "Tips",
                "amountType": "fixedAmount"
            }
        ],
        "deductionPolicies": [],
        "workerPayments": [
            {
                "id": "wrrun_9a0eef4f-7032-4278-a7b7-cb322aea081a",
                "worker": "wr_f9266b47-4364-49dd-9cfd-29c716ad417f",
                "payMethod": "DIRECT_DEPOSIT",
                "status": "PENDING",
                "grossPay": 1937.50,
                "netPay": 1660.36,
                "totals": {
                    "payrollCost": 2075.00,
                    "grossPay": 1937.50,
                    "netPay": 1660.36,
                    "reimbursement": 0.0,
                    "deduction": 277.14,
                    "contribution": 137.50
                },
                "paymentRecord": "ernrec_881c78f1-7f9b-4936-aac1-149a55a6f092",
                "compensations": [
                    {
                        "id": "payruncomp_f48ee67a-0289-4df5-bf7a-efaf4c2df939",
                        "name": "Hourly",
                        "policy": "prtnrcomppol_0cbe7ddb-889c-4ed1-bc98-4f0ceca763b7",
                        "amountType": "rateBasedAmount",
                        "fixedAmount": null,
                        "rateBasedAmount": {
                            "amount": 437.50,
                            "rate": 17.50,
                            "unit": "HOURS",
                            "unitAmount": 25,
                            "multiplier": 1
                        }
                    },
                    {
                        "id": "payruncomp_e5b38dfb-3f4d-423a-bf23-1c08c5d4c483",
                        "name": "Tips",
                        "policy": "prtnrcomppol_ccd2a3b6-fd68-4e4d-8afa-4ded50b22105",
                        "amountType": "fixedAmount",
                        "fixedAmount": {
                            "amount": 1500.00
                        },
                        "rateBasedAmount": null
                    }
                ],
                "deductions": [],
                "taxDeductions": [
                    {
                        "id": "payrunded_b199f48c-8be3-44ff-91df-bb740e7203d6",
                        "name": "Social Security",
                        "policy": "key:tax:us:fica",
                        "amount": 62.0
                    },
                    {
                        "id": "payrunded_b8e834c8-128e-4b10-8166-2c693373d9c8",
                        "name": "Medicare",
                        "policy": "key:tax:us:medi",
                        "amount": 14.5
                    },
                    {
                        "id": "payrunded_34760d68-8eae-48a3-8532-f66205afe021",
                        "name": "Federal Income Tax",
                        "policy": "key:tax:us:fit",
                        "amount": 149.62
                    },
                    {
                        "id": "payrunded_48f56f45-c537-4ab6-af42-27d69dbfa650",
                        "name": "Additional Medicare",
                        "policy": "key:tax:us:medi2",
                        "amount": 0.0
                    },
                    {
                        "id": "payrunded_0b9d6268-c15f-4192-a56d-20c67ea28d63",
                        "name": "CA State Disability Insurance",
                        "policy": "key:tax:us-ca:sdi",
                        "amount": 11.0
                    },
                    {
                        "id": "payrunded_9f9335ee-c228-4d6f-910e-97a631380264",
                        "name": "CA Personal Income Tax",
                        "policy": "key:tax:us-ca:sit",
                        "amount": 40.02
                    }
                ],
                "taxContributions": [
                    {
                        "id": "payruncontr_38834410-7973-4c8d-8e73-6047ff908b10",
                        "name": "Social Security",
                        "policy": "key:tax:us:fica",
                        "amount": 62.0
                    },
                    {
                        "id": "payruncontr_09762b38-4092-45de-8471-a9a4593c18e5",
                        "name": "Federal Unemployment (FUTA)",
                        "policy": "key:tax:us:futa",
                        "amount": 6.0
                    },
                    {
                        "id": "payruncontr_59c09f63-32a9-442a-a1d7-fa913f504619",
                        "name": "Medicare",
                        "policy": "key:tax:us:medi",
                        "amount": 14.5
                    },
                    {
                        "id": "payruncontr_128d64bc-3ef0-4bb3-b6fc-d99ea9fcfa4c",
                        "name": "CA Unemployment Insurance",
                        "policy": "key:tax:us-ca:suta",
                        "amount": 54.0
                    },
                    {
                        "id": "payruncontr_78c454a5-07e2-4458-906a-69bec31c58b8",
                        "name": "CA Employment Training Tax",
                        "policy": "key:tax:us-ca:sutasc",
                        "amount": 1.0
                    }
                ]
            }
        ]
    }
}

Save the payroll run ID (id) to complete the next step.

Confirm payroll run

Use the id returned in the previous step to specify the payroll run and confirm it was successful.

curl --location --request POST 'https://api.sandbox.salsa.dev/api/rest/v1/employers/${employerId}/payroll-runs/${payrollRunId}/confirm' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ${YOUR_API_TOKEN}'

Example response

{
    "data": {
        "id": "payrun_9e8b6675-27a0-4703-9460-4a76740b17d5",
        "workerPayGroup": "payrl_bc63608a-4bb4-44d2-8379-476fec62ea0e",
        "status": "CONFIRMED",
        "payPeriod": {
            "startDate": "2023-01-01",
            "endDate": "2023-01-07",
            "payDate": "2023-01-07"
        },
        "employer": "er_b9743f80-0b6c-44f4-b22f-8e3348b1408f",
        "confirmedDate": "2023-02-04T09:10:53.576168",
        "confirmBy": "2023-01-05T19:00:00",
        "debitDate": "2023-01-06",
        "totals": {
            "payrollCost": 2075.00,
            "toBeDebited": 2075.00,
            "reimbursement": 0.0
        },
        "compensationPolicies": [
            {
                "id": "prtnrcomppol_0cbe7ddb-889c-4ed1-bc98-4f0ceca763b7",
                "name": "Hourly",
                "amountType": "rateBasedAmount"
            },
            {
                "id": "prtnrcomppol_ccd2a3b6-fd68-4e4d-8afa-4ded50b22105",
                "name": "Tips",
                "amountType": "fixedAmount"
            }
        ],
        "deductionPolicies": [],
        "workerPayments": [
            {
                "id": "wrrun_9a0eef4f-7032-4278-a7b7-cb322aea081a",
                "worker": "wr_f9266b47-4364-49dd-9cfd-29c716ad417f",
                "payMethod": "DIRECT_DEPOSIT",
                "status": "PENDING",
                "grossPay": 1937.50,
                "netPay": 1660.36,
                "totals": {
                    "payrollCost": 2075.00,
                    "grossPay": 1937.50,
                    "netPay": 1660.36,
                    "reimbursement": 0.0,
                    "deduction": 277.14,
                    "contribution": 137.50
                },
                "paymentRecord": "ernrec_881c78f1-7f9b-4936-aac1-149a55a6f092",
                "compensations": [
                    {
                        "id": "payruncomp_f48ee67a-0289-4df5-bf7a-efaf4c2df939",
                        "name": "Hourly",
                        "policy": "prtnrcomppol_0cbe7ddb-889c-4ed1-bc98-4f0ceca763b7",
                        "amountType": "rateBasedAmount",
                        "fixedAmount": null,
                        "rateBasedAmount": {
                            "amount": 437.50,
                            "rate": 17.50,
                            "unit": "HOURS",
                            "unitAmount": 25,
                            "multiplier": 1
                        }
                    },
                    {
                        "id": "payruncomp_e5b38dfb-3f4d-423a-bf23-1c08c5d4c483",
                        "name": "Tips",
                        "policy": "prtnrcomppol_ccd2a3b6-fd68-4e4d-8afa-4ded50b22105",
                        "amountType": "fixedAmount",
                        "fixedAmount": {
                            "amount": 1500.00
                        },
                        "rateBasedAmount": null
                    }
                ],
                "deductions": [],
                "taxDeductions": [
                    {
                        "id": "payrunded_b199f48c-8be3-44ff-91df-bb740e7203d6",
                        "name": "Social Security",
                        "policy": "key:tax:us:fica",
                        "amount": 62.0
                    },
                    {
                        "id": "payrunded_b8e834c8-128e-4b10-8166-2c693373d9c8",
                        "name": "Medicare",
                        "policy": "key:tax:us:medi",
                        "amount": 14.5
                    },
                    {
                        "id": "payrunded_34760d68-8eae-48a3-8532-f66205afe021",
                        "name": "Federal Income Tax",
                        "policy": "key:tax:us:fit",
                        "amount": 149.62
                    },
                    {
                        "id": "payrunded_48f56f45-c537-4ab6-af42-27d69dbfa650",
                        "name": "Additional Medicare",
                        "policy": "key:tax:us:medi2",
                        "amount": 0.0
                    },
                    {
                        "id": "payrunded_0b9d6268-c15f-4192-a56d-20c67ea28d63",
                        "name": "CA State Disability Insurance",
                        "policy": "key:tax:us-ca:sdi",
                        "amount": 11.0
                    },
                    {
                        "id": "payrunded_9f9335ee-c228-4d6f-910e-97a631380264",
                        "name": "CA Personal Income Tax",
                        "policy": "key:tax:us-ca:sit",
                        "amount": 40.02
                    }
                ],
                "taxContributions": [
                    {
                        "id": "payruncontr_38834410-7973-4c8d-8e73-6047ff908b10",
                        "name": "Social Security",
                        "policy": "key:tax:us:fica",
                        "amount": 62.0
                    },
                    {
                        "id": "payruncontr_09762b38-4092-45de-8471-a9a4593c18e5",
                        "name": "Federal Unemployment (FUTA)",
                        "policy": "key:tax:us:futa",
                        "amount": 6.0
                    },
                    {
                        "id": "payruncontr_59c09f63-32a9-442a-a1d7-fa913f504619",
                        "name": "Medicare",
                        "policy": "key:tax:us:medi",
                        "amount": 14.5
                    },
                    {
                        "id": "payruncontr_128d64bc-3ef0-4bb3-b6fc-d99ea9fcfa4c",
                        "name": "CA Unemployment Insurance",
                        "policy": "key:tax:us-ca:suta",
                        "amount": 54.0
                    },
                    {
                        "id": "payruncontr_78c454a5-07e2-4458-906a-69bec31c58b8",
                        "name": "CA Employment Training Tax",
                        "policy": "key:tax:us-ca:sutasc",
                        "amount": 1.0
                    }
                ]
            }
        ]
    }
}

See Money movement for more information on Employer debits and worker payments.


Step 5: Deliver payment records to Workers

Get worker payment records

Worker payment records (earning statements/paystubs) are the output of a payroll run. Payment records are generally provided to workers after every payroll run, and include an overview of amounts earned, tax withholdings, deductions, and so on.

curl --location --request GET 'https://api.sandbox.salsa.dev/api/rest/v1/employers/${employerId}/payroll-runs/${payrollRunId}/worker-payment-records' \
--header 'Authorization: Bearer ${YOUR_API_TOKEN}' 

Example response

{
    "data": [
        {
            "id": "ernrec_881c78f1-7f9b-4936-aac1-149a55a6f092",
            "status": "CONFIRMED",
            "category": "EMPLOYEE",
            "document": "doc_a109b46f-8cac-4824-84ca-3ff5cd93ab5f",
            "employerDetails": {
                "employer": "er_b9743f80-0b6c-44f4-b22f-8e3348b1408f",
                "businessName": "Shack 22",
                "address": {
                    "addressLine1": "1 Ferry Building",
                    "addressLine2": "1 Ferry Building Suite 201",
                    "locality": "ca",
                    "administrativeArea": "San Francisco",
                    "postalCode": "94111",
                    "country": "USA"
                }
            },
            "employeeDetails": {
                "worker": "wr_f9266b47-4364-49dd-9cfd-29c716ad417f",
                "displayName": "Olivia Johnson",
                "firstName": "Olivia",
                "lastName": "Johnson",
                "address": {
                    "addressLine1": "1 Ferry Building",
                    "addressLine2": "1 Ferry Building Suite 201",
                    "locality": "ca",
                    "administrativeArea": "San Francisco",
                    "postalCode": "94111",
                    "country": "USA"
                }
            },
            "payPeriod": {
                "start": "2023-01-01",
                "end": "2023-01-07"
            },
            "payDate": "2023-01-07",
            "payrollCost": 2075.00,
            "grossPay": 1937.50,
            "netPay": 1660.36,
            "payMethod": "DIRECT_DEPOSIT",
            "workTime": {
                "hours": 25
            },
            "totals": {
                "totalCompensations": {
                    "amount": 1937.50,
                    "ytdAmount": 1937.50
                },
                "totalDeductions": {
                    "amount": 0,
                    "ytdAmount": 0
                },
                "totalTaxDeductions": {
                    "amount": 277.14,
                    "ytdAmount": 277.14
                },
                "totalTaxContributions": {
                    "amount": 137.5,
                    "ytdAmount": 137.50
                }
            },
            "compensations": [
                {
                    "description": "Hourly",
                    "amount": 437.50,
                    "ytdAmount": 437.50
                },
                {
                    "description": "Tips",
                    "amount": 1500.00,
                    "ytdAmount": 1500.00
                }
            ],
            "deductions": [],
            "taxDeductions": [
                {
                    "description": "Federal Income Tax",
                    "amount": 149.62,
                    "ytdAmount": 149.62
                },
                {
                    "description": "Social Security",
                    "amount": 62.0,
                    "ytdAmount": 62.00
                },
                {
                    "description": "Medicare",
                    "amount": 14.5,
                    "ytdAmount": 14.50
                },
                {
                    "description": "CA Personal Income Tax",
                    "amount": 40.02,
                    "ytdAmount": 40.02
                },
                {
                    "description": "CA State Disability Insurance",
                    "amount": 11.0,
                    "ytdAmount": 11.00
                }
            ],
            "taxContributions": [
                {
                    "description": "Social Security",
                    "amount": 62.0,
                    "ytdAmount": 62.00
                },
                {
                    "description": "Medicare",
                    "amount": 14.5,
                    "ytdAmount": 14.50
                },
                {
                    "description": "Federal Unemployment (FUTA)",
                    "amount": 6.0,
                    "ytdAmount": 6.00
                },
                {
                    "description": "CA Unemployment Insurance",
                    "amount": 54.0,
                    "ytdAmount": 54.00
                },
                {
                    "description": "CA Employment Training Tax",
                    "amount": 1.0,
                    "ytdAmount": 1.00
                }
            ]
        }
    ]
}

See Worker payment records for a detailed overview of worker payment records and what they include.

View payment records as PDFs

Payment records are available as PDFs that can be delivered directly to Workers. To generate a Document Link, use the document ID returned in the previous step:

curl --location --request POST 'https://api.sandbox.salsa.dev/api/rest/v1/documents/${documentId}/link' \
--header 'Authorization: Bearer ' \
--header 'Authorization: Bearer ${YOUR_API_TOKEN}'

Example response

{
    "data": {
        "documentId": "doc_a109b46f-8cac-4824-84ca-3ff5cd93ab5f",
        "url": "https://documentsservice-playgrou-documentsbucket7df8e0e0-vm9mdbs3f8sm.s3.us-west-2.amazonaws.com/documents/a/doc_a109b46f-8cac-4824-84ca-3ff5cd93ab5f?AWSAccessKeyId=ASIATYJUJRNP5URCRMHL&Expires=1675505924&Signature=RtWS0GT3P4ddg68j0er6Yx8injc%3D&X-Amzn-Trace-Id=Root%3D1-63de2fd8-44df8be8143f98a62074153b%3BParent%3D2caf8668291cd968%3BSampled%3D0&response-content-disposition=inline%3B&x-amz-security-token=IQoJb3JpZ2luX2VjEIr%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLXdlc3QtMiJHMEUCIAUqZBOVXflbmfF7%2Bo8qAPZnix58QOOv%2B%2F0DNozn3EwUAiEAuLTb7B7q%2BBZ2olPxyt3MjCDGEO2u3SyWv%2F7KHcnSwW4q0wMIExABGgwyNTgzNDQ1ODYwNzkiDI9VqE4ASTJcv3yqMiqwA5ox3kDCaeeyvgOe2wnT4mwDDlTzXY1%2FdRL%2FGaD6tSDOQRyFv08fI%2BDX%2FfnqfJzjCvMzsSBNSoSRlfkNCxUsJM6Ycn8zRzwx3RFYfT%2BwRIxYsomK9hE8SMT9Trp67Fs3J56kze%2Bgpr4rERWnHJaIn6P3qyQfsrB%2FYdhKt9JmJg1n9tDDUrgX8u8AcfD%2FmyVmgNNmvwWtmW0QWzbRrhf0ffM9LJWK8UBy%2FmL7AByAuhb%2BBsvZcAJ9v4BT%2FFzapNxBHT5QOonXd2ganDYy15J%2BjZ3nLBUvk3FT2w1LOJlxWUnZO3esf8nHlkuPxfy5q0CTeJatqUy2riWT1%2Fg%2Fz84TgRebtqiAlGDKw%2BD13odrUD0BSKsBOQ9zJCT8l4vICh2m9kHYKvhvPfSkQ3Z0MiT2lzjf7M5Kqs24XntSRfD6mZ0WapI7VYf0ZuUeiS8Cjy6%2Fa5wiTvI5rKhVai3SQA4JNHzkT24aFV0v9dOmig4Zkk4eMxXsUolX6DJlis48DRxTf20shc30vq%2Bg1C6rJPxFQuY9j8ejKG2lysH%2FDAJndSS2JFvl1gKGdECc15Jl0Vi3xTDG3vieBjqeAWjitll5YXbYLErqWnWWx3iKMYhrtbWfR84hDbkLr5nTmx4C4eJgg5AdZLRIvum9aVJUn4rIUQFfLmeG2gD5tP%2Fs1N1klflIbATBwpHwmcg%2BNfvMTZDLzkga%2BflFZjy%2BRkMgp20%2BWXlp3uD7ZMPuG0WP7ozAAdR%2FMcFPpvNB4WpTkBEPS1Wf%2BfAkJWQehAqTqnChrbEJ6uwop3lmM%2F6j",
        "expiresAt": "2023-02-04T10:18:44.379"
    }    
}

🚧

Be careful when sharing URLs

The URL generated to view a pay record is accessible without any additional authorization. As such, ensure that you are sharing the URL with the intended recipient only.