SalesTaxIQ API Documentation
Production-ready reference for teams building accurate U.S. sales tax calculation into checkout, order, and finance workflows.
Getting Started
SalesTaxIQ provides enterprise-ready tax determination endpoints for U.S. address-level sales tax calculation with clear, auditable rate detail.
This reference is optimized for implementation teams that need fast onboarding, predictable responses, and operational confidence in production.
To launch in production:
- Sign up for an account
- Choose a pricing plan
- Get your API key
- Run test lookups against representative shipping addresses
- Move API key handling to your server-side infrastructure
Authentication
All API requests require authentication using your API key. Include your key in the request headers:
Authorization: Bearer sk_YOUR_API_KEY
Use separate API keys for sandbox and production environments, and rotate keys on a regular security schedule.
Rate Lookup API
Endpoint
Request Format
{
"city": "Menlo Park",
"state": "CA",
"street": "1 Hacker Way",
"zip": "94025"
}
Response Format
{
"tax_rate": 9.375,
"rate_details": [
{
"tax_agency": "California, San Mateo County District",
"tax_rate": 2.125
},
{
"tax_agency": "San Mateo County",
"tax_rate": 1
},
{
"tax_agency": "California State",
"tax_rate": 6.25
}
]
}
Authentication
Include your API key in the Authorization header:
Authorization: Bearer sk_your_api_key
Error Responses
| Status Code | Description |
|---|---|
| 400 | Missing or invalid required fields |
| 401 | Invalid or missing API key |
| 405 | Method not allowed (only POST is supported) |
Example Request (cURL)
curl -X POST \
/api/v1/rates \
-H 'Authorization: Bearer sk_your_api_key' \
-H 'Content-Type: application/json' \
-d '{
"city": "Menlo Park",
"state": "CA",
"street": "1 Hacker Way",
"zip": "94025"
}'
Code Examples
import requests
api_key = 'sk_your_api_key'
url = '/api/v1/rates'
headers = {
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
}
data = {
'city': 'Menlo Park',
'state': 'CA',
'street': '1 Hacker Way',
'zip': '94025'
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const axios = require('axios');
const apiKey = 'sk_your_api_key';
const url = '/api/v1/rates';
const data = {
city: 'Menlo Park',
state: 'CA',
street: '1 Hacker Way',
zip: '94025'
};
axios.post(url, data, {
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
}
})
.then(response => console.log(response.data))
.catch(error => console.error(error));
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
apiKey := "sk_your_api_key"
url := "/api/v1/rates"
data := map[string]string{
"city": "Menlo Park",
"state": "CA",
"street": "1 Hacker Way",
"zip": "94025",
}
jsonData, _ := json.Marshal(data)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
req.Header.Set("Authorization", "Bearer "+apiKey)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
Try It Out
Response:
Production Readiness
Before launch, make sure your integration includes operational and compliance guardrails.
| Area | Recommendation |
|---|---|
| Retries | Retry 429 and 5xx responses with exponential backoff. |
| Timeouts | Set request timeouts and fallbacks to avoid checkout blocking. |
| Monitoring | Track request latency, error rates, and tax rate anomalies. |
| Auditability | Persist `rate_details` with order events for reconciliation workflows. |
Error Handling
The API uses conventional HTTP response codes to indicate success or failure of requests:
| Code | Description |
|---|---|
| 200 | Success |
| 400 | Bad Request - Invalid parameters |
| 401 | Unauthorized - Invalid API key |
| 429 | Too Many Requests - Rate limit exceeded |
| 500 | Server Error - Please contact support |