Generate AI-powered tax calculation explanations
curl --request POST \
--url https://api.symmetry.com/stl/v1/explain \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"context": {
"payCalc": {
"employeeID": "employee 1",
"payrollRunParameters": {
"payDate": "2020-01-01",
"payPeriodNumber": 0,
"payPeriodsPerYear": 52
},
"taxJurisdictionParms": [],
"wages": []
}
},
"taxIds": "00-000-0000-FICA-000"
}
'import requests
url = "https://api.symmetry.com/stl/v1/explain"
payload = {
"context": { "payCalc": {
"employeeID": "employee 1",
"payrollRunParameters": {
"payDate": "2020-01-01",
"payPeriodNumber": 0,
"payPeriodsPerYear": 52
},
"taxJurisdictionParms": [],
"wages": []
} },
"taxIds": "00-000-0000-FICA-000"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
context: {
payCalc: {
employeeID: 'employee 1',
payrollRunParameters: {payDate: '2020-01-01', payPeriodNumber: 0, payPeriodsPerYear: 52},
taxJurisdictionParms: [],
wages: []
}
},
taxIds: '00-000-0000-FICA-000'
})
};
fetch('https://api.symmetry.com/stl/v1/explain', 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://api.symmetry.com/stl/v1/explain",
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([
'context' => [
'payCalc' => [
'employeeID' => 'employee 1',
'payrollRunParameters' => [
'payDate' => '2020-01-01',
'payPeriodNumber' => 0,
'payPeriodsPerYear' => 52
],
'taxJurisdictionParms' => [
],
'wages' => [
]
]
],
'taxIds' => '00-000-0000-FICA-000'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://api.symmetry.com/stl/v1/explain"
payload := strings.NewReader("{\n \"context\": {\n \"payCalc\": {\n \"employeeID\": \"employee 1\",\n \"payrollRunParameters\": {\n \"payDate\": \"2020-01-01\",\n \"payPeriodNumber\": 0,\n \"payPeriodsPerYear\": 52\n },\n \"taxJurisdictionParms\": [],\n \"wages\": []\n }\n },\n \"taxIds\": \"00-000-0000-FICA-000\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://api.symmetry.com/stl/v1/explain")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"context\": {\n \"payCalc\": {\n \"employeeID\": \"employee 1\",\n \"payrollRunParameters\": {\n \"payDate\": \"2020-01-01\",\n \"payPeriodNumber\": 0,\n \"payPeriodsPerYear\": 52\n },\n \"taxJurisdictionParms\": [],\n \"wages\": []\n }\n },\n \"taxIds\": \"00-000-0000-FICA-000\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.symmetry.com/stl/v1/explain")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"context\": {\n \"payCalc\": {\n \"employeeID\": \"employee 1\",\n \"payrollRunParameters\": {\n \"payDate\": \"2020-01-01\",\n \"payPeriodNumber\": 0,\n \"payPeriodsPerYear\": 52\n },\n \"taxJurisdictionParms\": [],\n \"wages\": []\n }\n },\n \"taxIds\": \"00-000-0000-FICA-000\"\n}"
response = http.request(request)
puts response.read_body{
"ai_disclosure": "This explanation is generated using AI and is provided for informational purposes only. It does not constitute tax, legal, or financial advice. AI can make mistakes.",
"id": "01KGJGT4J1798EX9TCJVDFHDZ9",
"results": [
{
"response": "Your Social Security Tax is **$477.96**...",
"taxId": "00-000-0000-FICA-000",
"usage": {
"input_tokens": 56549,
"output_tokens": 136
}
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Generate AI-powered tax calculation explanations
Accepts 1-10 tax IDs with a PayCalc context or STE session and returns employee-friendly explanations
POST
/
v1
/
explain
Generate AI-powered tax calculation explanations
curl --request POST \
--url https://api.symmetry.com/stl/v1/explain \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"context": {
"payCalc": {
"employeeID": "employee 1",
"payrollRunParameters": {
"payDate": "2020-01-01",
"payPeriodNumber": 0,
"payPeriodsPerYear": 52
},
"taxJurisdictionParms": [],
"wages": []
}
},
"taxIds": "00-000-0000-FICA-000"
}
'import requests
url = "https://api.symmetry.com/stl/v1/explain"
payload = {
"context": { "payCalc": {
"employeeID": "employee 1",
"payrollRunParameters": {
"payDate": "2020-01-01",
"payPeriodNumber": 0,
"payPeriodsPerYear": 52
},
"taxJurisdictionParms": [],
"wages": []
} },
"taxIds": "00-000-0000-FICA-000"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
context: {
payCalc: {
employeeID: 'employee 1',
payrollRunParameters: {payDate: '2020-01-01', payPeriodNumber: 0, payPeriodsPerYear: 52},
taxJurisdictionParms: [],
wages: []
}
},
taxIds: '00-000-0000-FICA-000'
})
};
fetch('https://api.symmetry.com/stl/v1/explain', 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://api.symmetry.com/stl/v1/explain",
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([
'context' => [
'payCalc' => [
'employeeID' => 'employee 1',
'payrollRunParameters' => [
'payDate' => '2020-01-01',
'payPeriodNumber' => 0,
'payPeriodsPerYear' => 52
],
'taxJurisdictionParms' => [
],
'wages' => [
]
]
],
'taxIds' => '00-000-0000-FICA-000'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://api.symmetry.com/stl/v1/explain"
payload := strings.NewReader("{\n \"context\": {\n \"payCalc\": {\n \"employeeID\": \"employee 1\",\n \"payrollRunParameters\": {\n \"payDate\": \"2020-01-01\",\n \"payPeriodNumber\": 0,\n \"payPeriodsPerYear\": 52\n },\n \"taxJurisdictionParms\": [],\n \"wages\": []\n }\n },\n \"taxIds\": \"00-000-0000-FICA-000\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://api.symmetry.com/stl/v1/explain")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"context\": {\n \"payCalc\": {\n \"employeeID\": \"employee 1\",\n \"payrollRunParameters\": {\n \"payDate\": \"2020-01-01\",\n \"payPeriodNumber\": 0,\n \"payPeriodsPerYear\": 52\n },\n \"taxJurisdictionParms\": [],\n \"wages\": []\n }\n },\n \"taxIds\": \"00-000-0000-FICA-000\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.symmetry.com/stl/v1/explain")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"context\": {\n \"payCalc\": {\n \"employeeID\": \"employee 1\",\n \"payrollRunParameters\": {\n \"payDate\": \"2020-01-01\",\n \"payPeriodNumber\": 0,\n \"payPeriodsPerYear\": 52\n },\n \"taxJurisdictionParms\": [],\n \"wages\": []\n }\n },\n \"taxIds\": \"00-000-0000-FICA-000\"\n}"
response = http.request(request)
puts response.read_body{
"ai_disclosure": "This explanation is generated using AI and is provided for informational purposes only. It does not constitute tax, legal, or financial advice. AI can make mistakes.",
"id": "01KGJGT4J1798EX9TCJVDFHDZ9",
"results": [
{
"response": "Your Social Security Tax is **$477.96**...",
"taxId": "00-000-0000-FICA-000",
"usage": {
"input_tokens": 56549,
"output_tokens": 136
}
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Obtain a token by calling GET /authentication/login with your Symmetry API key in the api-key header. Paste the accessToken value here.
Body
application/json
Response
Successful Response
Response for tax explanation requests.
Always returns a results array (even for a single tax). Summary is populated when 2+ taxes are requested.
Conversation ID for the entire request
Individual results for each tax ID (always an array, even for single tax)
Show child attributes
Show child attributes
Overall narrative summary of all taxes (only present for multiple taxes)
ai_disclosure
string
default:This explanation is generated using AI and is provided for informational purposes only. It does not constitute tax, legal, or financial advice. AI can make mistakes.
Static AI-generated content disclaimer for client display (FR-7)
Was this page helpful?

