curl --request POST \
--url https://ste.symmetry.com/ste-hosted/v1/payCalc \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"PayCalcRequest": {
"payCalc": [
{
"options": {
"prorate": true
},
"employeeID": "01",
"payrollRunParameters": {
"payDate": "2026-03-24",
"payPeriodsPerYear": 52,
"payPeriodNumber": 1
},
"wages": [
{
"locationCode": "21-000-488655",
"wageType": "Regular",
"calcMethodRegularWages": "Annualized",
"calcMethodSupplementalWages": "None",
"hasNexus": false,
"hours": 40,
"grossWages": 1000,
"mtdWages": 0,
"qtdWages": 0,
"ytdWages": 0
}
],
"taxJurisdictionParms": [
{
"uniqueTaxID": "21-000-488655-OLF-000",
"locationCode": "21-000-488655",
"isExempt": false,
"isResident": true,
"periodWH": 0,
"mtdWH": 0,
"qtdWH": 0,
"ytdWH": 0,
"roundResult": "No",
"autoAdjust": false,
"overrideRate": 0,
"overrideWageBase": 0,
"miscParameters": []
}
]
}
]
}
}
'import requests
url = "https://ste.symmetry.com/ste-hosted/v1/payCalc"
payload = { "PayCalcRequest": { "payCalc": [
{
"options": { "prorate": True },
"employeeID": "01",
"payrollRunParameters": {
"payDate": "2026-03-24",
"payPeriodsPerYear": 52,
"payPeriodNumber": 1
},
"wages": [
{
"locationCode": "21-000-488655",
"wageType": "Regular",
"calcMethodRegularWages": "Annualized",
"calcMethodSupplementalWages": "None",
"hasNexus": False,
"hours": 40,
"grossWages": 1000,
"mtdWages": 0,
"qtdWages": 0,
"ytdWages": 0
}
],
"taxJurisdictionParms": [
{
"uniqueTaxID": "21-000-488655-OLF-000",
"locationCode": "21-000-488655",
"isExempt": False,
"isResident": True,
"periodWH": 0,
"mtdWH": 0,
"qtdWH": 0,
"ytdWH": 0,
"roundResult": "No",
"autoAdjust": False,
"overrideRate": 0,
"overrideWageBase": 0,
"miscParameters": []
}
]
}
] } }
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
PayCalcRequest: {
payCalc: [
{
options: {prorate: true},
employeeID: '01',
payrollRunParameters: {payDate: '2026-03-24', payPeriodsPerYear: 52, payPeriodNumber: 1},
wages: [
{
locationCode: '21-000-488655',
wageType: 'Regular',
calcMethodRegularWages: 'Annualized',
calcMethodSupplementalWages: 'None',
hasNexus: false,
hours: 40,
grossWages: 1000,
mtdWages: 0,
qtdWages: 0,
ytdWages: 0
}
],
taxJurisdictionParms: [
{
uniqueTaxID: '21-000-488655-OLF-000',
locationCode: '21-000-488655',
isExempt: false,
isResident: true,
periodWH: 0,
mtdWH: 0,
qtdWH: 0,
ytdWH: 0,
roundResult: 'No',
autoAdjust: false,
overrideRate: 0,
overrideWageBase: 0,
miscParameters: []
}
]
}
]
}
})
};
fetch('https://ste.symmetry.com/ste-hosted/v1/payCalc', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://ste.symmetry.com/ste-hosted/v1/payCalc",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'PayCalcRequest' => [
'payCalc' => [
[
'options' => [
'prorate' => true
],
'employeeID' => '01',
'payrollRunParameters' => [
'payDate' => '2026-03-24',
'payPeriodsPerYear' => 52,
'payPeriodNumber' => 1
],
'wages' => [
[
'locationCode' => '21-000-488655',
'wageType' => 'Regular',
'calcMethodRegularWages' => 'Annualized',
'calcMethodSupplementalWages' => 'None',
'hasNexus' => false,
'hours' => 40,
'grossWages' => 1000,
'mtdWages' => 0,
'qtdWages' => 0,
'ytdWages' => 0
]
],
'taxJurisdictionParms' => [
[
'uniqueTaxID' => '21-000-488655-OLF-000',
'locationCode' => '21-000-488655',
'isExempt' => false,
'isResident' => true,
'periodWH' => 0,
'mtdWH' => 0,
'qtdWH' => 0,
'ytdWH' => 0,
'roundResult' => 'No',
'autoAdjust' => false,
'overrideRate' => 0,
'overrideWageBase' => 0,
'miscParameters' => [
]
]
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://ste.symmetry.com/ste-hosted/v1/payCalc"
payload := strings.NewReader("{\n \"PayCalcRequest\": {\n \"payCalc\": [\n {\n \"options\": {\n \"prorate\": true\n },\n \"employeeID\": \"01\",\n \"payrollRunParameters\": {\n \"payDate\": \"2026-03-24\",\n \"payPeriodsPerYear\": 52,\n \"payPeriodNumber\": 1\n },\n \"wages\": [\n {\n \"locationCode\": \"21-000-488655\",\n \"wageType\": \"Regular\",\n \"calcMethodRegularWages\": \"Annualized\",\n \"calcMethodSupplementalWages\": \"None\",\n \"hasNexus\": false,\n \"hours\": 40,\n \"grossWages\": 1000,\n \"mtdWages\": 0,\n \"qtdWages\": 0,\n \"ytdWages\": 0\n }\n ],\n \"taxJurisdictionParms\": [\n {\n \"uniqueTaxID\": \"21-000-488655-OLF-000\",\n \"locationCode\": \"21-000-488655\",\n \"isExempt\": false,\n \"isResident\": true,\n \"periodWH\": 0,\n \"mtdWH\": 0,\n \"qtdWH\": 0,\n \"ytdWH\": 0,\n \"roundResult\": \"No\",\n \"autoAdjust\": false,\n \"overrideRate\": 0,\n \"overrideWageBase\": 0,\n \"miscParameters\": []\n }\n ]\n }\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://ste.symmetry.com/ste-hosted/v1/payCalc")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"PayCalcRequest\": {\n \"payCalc\": [\n {\n \"options\": {\n \"prorate\": true\n },\n \"employeeID\": \"01\",\n \"payrollRunParameters\": {\n \"payDate\": \"2026-03-24\",\n \"payPeriodsPerYear\": 52,\n \"payPeriodNumber\": 1\n },\n \"wages\": [\n {\n \"locationCode\": \"21-000-488655\",\n \"wageType\": \"Regular\",\n \"calcMethodRegularWages\": \"Annualized\",\n \"calcMethodSupplementalWages\": \"None\",\n \"hasNexus\": false,\n \"hours\": 40,\n \"grossWages\": 1000,\n \"mtdWages\": 0,\n \"qtdWages\": 0,\n \"ytdWages\": 0\n }\n ],\n \"taxJurisdictionParms\": [\n {\n \"uniqueTaxID\": \"21-000-488655-OLF-000\",\n \"locationCode\": \"21-000-488655\",\n \"isExempt\": false,\n \"isResident\": true,\n \"periodWH\": 0,\n \"mtdWH\": 0,\n \"qtdWH\": 0,\n \"ytdWH\": 0,\n \"roundResult\": \"No\",\n \"autoAdjust\": false,\n \"overrideRate\": 0,\n \"overrideWageBase\": 0,\n \"miscParameters\": []\n }\n ]\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://ste.symmetry.com/ste-hosted/v1/payCalc")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"PayCalcRequest\": {\n \"payCalc\": [\n {\n \"options\": {\n \"prorate\": true\n },\n \"employeeID\": \"01\",\n \"payrollRunParameters\": {\n \"payDate\": \"2026-03-24\",\n \"payPeriodsPerYear\": 52,\n \"payPeriodNumber\": 1\n },\n \"wages\": [\n {\n \"locationCode\": \"21-000-488655\",\n \"wageType\": \"Regular\",\n \"calcMethodRegularWages\": \"Annualized\",\n \"calcMethodSupplementalWages\": \"None\",\n \"hasNexus\": false,\n \"hours\": 40,\n \"grossWages\": 1000,\n \"mtdWages\": 0,\n \"qtdWages\": 0,\n \"ytdWages\": 0\n }\n ],\n \"taxJurisdictionParms\": [\n {\n \"uniqueTaxID\": \"21-000-488655-OLF-000\",\n \"locationCode\": \"21-000-488655\",\n \"isExempt\": false,\n \"isResident\": true,\n \"periodWH\": 0,\n \"mtdWH\": 0,\n \"qtdWH\": 0,\n \"ytdWH\": 0,\n \"roundResult\": \"No\",\n \"autoAdjust\": false,\n \"overrideRate\": 0,\n \"overrideWageBase\": 0,\n \"miscParameters\": []\n }\n ]\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"PayCalcResponse": {
"payCalc": [
{
"employeeID": "01",
"taxCalculation": [
{
"uniqueTaxID": "21-000-488655-OLF-000",
"locationCode": "21-000-488655",
"wageType": "Regular",
"taxAmount": 15.5,
"subjectWages": 1000,
"rate": 0.0155
}
]
}
],
"transactionStamp": {
"calcDateTime": "2026-03-24T13:32:44Z",
"steVersion": "2026-R1",
"schemaVersion": "v1",
"totalTransactions": 1,
"failedTransactions": 0,
"transactionType": "PayCalc"
},
"errorStatus": {
"errorCode": 0,
"errorMessage": "No error"
}
}
}Compute gross-to-net tax withholding
Compute payroll taxes based on an employee’s gross wages, benefit contributions, and imputed income.
curl --request POST \
--url https://ste.symmetry.com/ste-hosted/v1/payCalc \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"PayCalcRequest": {
"payCalc": [
{
"options": {
"prorate": true
},
"employeeID": "01",
"payrollRunParameters": {
"payDate": "2026-03-24",
"payPeriodsPerYear": 52,
"payPeriodNumber": 1
},
"wages": [
{
"locationCode": "21-000-488655",
"wageType": "Regular",
"calcMethodRegularWages": "Annualized",
"calcMethodSupplementalWages": "None",
"hasNexus": false,
"hours": 40,
"grossWages": 1000,
"mtdWages": 0,
"qtdWages": 0,
"ytdWages": 0
}
],
"taxJurisdictionParms": [
{
"uniqueTaxID": "21-000-488655-OLF-000",
"locationCode": "21-000-488655",
"isExempt": false,
"isResident": true,
"periodWH": 0,
"mtdWH": 0,
"qtdWH": 0,
"ytdWH": 0,
"roundResult": "No",
"autoAdjust": false,
"overrideRate": 0,
"overrideWageBase": 0,
"miscParameters": []
}
]
}
]
}
}
'import requests
url = "https://ste.symmetry.com/ste-hosted/v1/payCalc"
payload = { "PayCalcRequest": { "payCalc": [
{
"options": { "prorate": True },
"employeeID": "01",
"payrollRunParameters": {
"payDate": "2026-03-24",
"payPeriodsPerYear": 52,
"payPeriodNumber": 1
},
"wages": [
{
"locationCode": "21-000-488655",
"wageType": "Regular",
"calcMethodRegularWages": "Annualized",
"calcMethodSupplementalWages": "None",
"hasNexus": False,
"hours": 40,
"grossWages": 1000,
"mtdWages": 0,
"qtdWages": 0,
"ytdWages": 0
}
],
"taxJurisdictionParms": [
{
"uniqueTaxID": "21-000-488655-OLF-000",
"locationCode": "21-000-488655",
"isExempt": False,
"isResident": True,
"periodWH": 0,
"mtdWH": 0,
"qtdWH": 0,
"ytdWH": 0,
"roundResult": "No",
"autoAdjust": False,
"overrideRate": 0,
"overrideWageBase": 0,
"miscParameters": []
}
]
}
] } }
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
PayCalcRequest: {
payCalc: [
{
options: {prorate: true},
employeeID: '01',
payrollRunParameters: {payDate: '2026-03-24', payPeriodsPerYear: 52, payPeriodNumber: 1},
wages: [
{
locationCode: '21-000-488655',
wageType: 'Regular',
calcMethodRegularWages: 'Annualized',
calcMethodSupplementalWages: 'None',
hasNexus: false,
hours: 40,
grossWages: 1000,
mtdWages: 0,
qtdWages: 0,
ytdWages: 0
}
],
taxJurisdictionParms: [
{
uniqueTaxID: '21-000-488655-OLF-000',
locationCode: '21-000-488655',
isExempt: false,
isResident: true,
periodWH: 0,
mtdWH: 0,
qtdWH: 0,
ytdWH: 0,
roundResult: 'No',
autoAdjust: false,
overrideRate: 0,
overrideWageBase: 0,
miscParameters: []
}
]
}
]
}
})
};
fetch('https://ste.symmetry.com/ste-hosted/v1/payCalc', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://ste.symmetry.com/ste-hosted/v1/payCalc",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'PayCalcRequest' => [
'payCalc' => [
[
'options' => [
'prorate' => true
],
'employeeID' => '01',
'payrollRunParameters' => [
'payDate' => '2026-03-24',
'payPeriodsPerYear' => 52,
'payPeriodNumber' => 1
],
'wages' => [
[
'locationCode' => '21-000-488655',
'wageType' => 'Regular',
'calcMethodRegularWages' => 'Annualized',
'calcMethodSupplementalWages' => 'None',
'hasNexus' => false,
'hours' => 40,
'grossWages' => 1000,
'mtdWages' => 0,
'qtdWages' => 0,
'ytdWages' => 0
]
],
'taxJurisdictionParms' => [
[
'uniqueTaxID' => '21-000-488655-OLF-000',
'locationCode' => '21-000-488655',
'isExempt' => false,
'isResident' => true,
'periodWH' => 0,
'mtdWH' => 0,
'qtdWH' => 0,
'ytdWH' => 0,
'roundResult' => 'No',
'autoAdjust' => false,
'overrideRate' => 0,
'overrideWageBase' => 0,
'miscParameters' => [
]
]
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://ste.symmetry.com/ste-hosted/v1/payCalc"
payload := strings.NewReader("{\n \"PayCalcRequest\": {\n \"payCalc\": [\n {\n \"options\": {\n \"prorate\": true\n },\n \"employeeID\": \"01\",\n \"payrollRunParameters\": {\n \"payDate\": \"2026-03-24\",\n \"payPeriodsPerYear\": 52,\n \"payPeriodNumber\": 1\n },\n \"wages\": [\n {\n \"locationCode\": \"21-000-488655\",\n \"wageType\": \"Regular\",\n \"calcMethodRegularWages\": \"Annualized\",\n \"calcMethodSupplementalWages\": \"None\",\n \"hasNexus\": false,\n \"hours\": 40,\n \"grossWages\": 1000,\n \"mtdWages\": 0,\n \"qtdWages\": 0,\n \"ytdWages\": 0\n }\n ],\n \"taxJurisdictionParms\": [\n {\n \"uniqueTaxID\": \"21-000-488655-OLF-000\",\n \"locationCode\": \"21-000-488655\",\n \"isExempt\": false,\n \"isResident\": true,\n \"periodWH\": 0,\n \"mtdWH\": 0,\n \"qtdWH\": 0,\n \"ytdWH\": 0,\n \"roundResult\": \"No\",\n \"autoAdjust\": false,\n \"overrideRate\": 0,\n \"overrideWageBase\": 0,\n \"miscParameters\": []\n }\n ]\n }\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://ste.symmetry.com/ste-hosted/v1/payCalc")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"PayCalcRequest\": {\n \"payCalc\": [\n {\n \"options\": {\n \"prorate\": true\n },\n \"employeeID\": \"01\",\n \"payrollRunParameters\": {\n \"payDate\": \"2026-03-24\",\n \"payPeriodsPerYear\": 52,\n \"payPeriodNumber\": 1\n },\n \"wages\": [\n {\n \"locationCode\": \"21-000-488655\",\n \"wageType\": \"Regular\",\n \"calcMethodRegularWages\": \"Annualized\",\n \"calcMethodSupplementalWages\": \"None\",\n \"hasNexus\": false,\n \"hours\": 40,\n \"grossWages\": 1000,\n \"mtdWages\": 0,\n \"qtdWages\": 0,\n \"ytdWages\": 0\n }\n ],\n \"taxJurisdictionParms\": [\n {\n \"uniqueTaxID\": \"21-000-488655-OLF-000\",\n \"locationCode\": \"21-000-488655\",\n \"isExempt\": false,\n \"isResident\": true,\n \"periodWH\": 0,\n \"mtdWH\": 0,\n \"qtdWH\": 0,\n \"ytdWH\": 0,\n \"roundResult\": \"No\",\n \"autoAdjust\": false,\n \"overrideRate\": 0,\n \"overrideWageBase\": 0,\n \"miscParameters\": []\n }\n ]\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://ste.symmetry.com/ste-hosted/v1/payCalc")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"PayCalcRequest\": {\n \"payCalc\": [\n {\n \"options\": {\n \"prorate\": true\n },\n \"employeeID\": \"01\",\n \"payrollRunParameters\": {\n \"payDate\": \"2026-03-24\",\n \"payPeriodsPerYear\": 52,\n \"payPeriodNumber\": 1\n },\n \"wages\": [\n {\n \"locationCode\": \"21-000-488655\",\n \"wageType\": \"Regular\",\n \"calcMethodRegularWages\": \"Annualized\",\n \"calcMethodSupplementalWages\": \"None\",\n \"hasNexus\": false,\n \"hours\": 40,\n \"grossWages\": 1000,\n \"mtdWages\": 0,\n \"qtdWages\": 0,\n \"ytdWages\": 0\n }\n ],\n \"taxJurisdictionParms\": [\n {\n \"uniqueTaxID\": \"21-000-488655-OLF-000\",\n \"locationCode\": \"21-000-488655\",\n \"isExempt\": false,\n \"isResident\": true,\n \"periodWH\": 0,\n \"mtdWH\": 0,\n \"qtdWH\": 0,\n \"ytdWH\": 0,\n \"roundResult\": \"No\",\n \"autoAdjust\": false,\n \"overrideRate\": 0,\n \"overrideWageBase\": 0,\n \"miscParameters\": []\n }\n ]\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"PayCalcResponse": {
"payCalc": [
{
"employeeID": "01",
"taxCalculation": [
{
"uniqueTaxID": "21-000-488655-OLF-000",
"locationCode": "21-000-488655",
"wageType": "Regular",
"taxAmount": 15.5,
"subjectWages": 1000,
"rate": 0.0155
}
]
}
],
"transactionStamp": {
"calcDateTime": "2026-03-24T13:32:44Z",
"steVersion": "2026-R1",
"schemaVersion": "v1",
"totalTransactions": 1,
"failedTransactions": 0,
"transactionType": "PayCalc"
},
"errorStatus": {
"errorCode": 0,
"errorMessage": "No error"
}
}
}Authorizations
API key for authentication. Provide the raw key as the value of the Authorization header (no "Bearer" prefix).
Headers
Optional STE database version to calculate against. Equivalent to the version query parameter; the query parameter wins when both are set.
Query Parameters
Optional STE database version to calculate against (e.g. "2026.5.2"). Must be one of the versions returned by GET /availableVersions. When omitted, the highest installed database version is used; each release is built so that this is the release the deployment is pinned to, and released builds refuse to start if it is not. Takes precedence over the version header when both are supplied.
Body
Show child attributes
Show child attributes
Was this page helpful?

