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 isnull
. 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
orCONTRACTOR
- 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 PayTypesid
orreferenceId
. We recommend that you code using thereferenceId
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.
Updated about 1 month ago