Documentation
Welcome to the SalesTaxAPI documentation. Get accurate, up-to-date sales tax rates for all 50 US states.
📚 What you'll find here:
- • Complete API reference and parameters
- • Authentication and security best practices
- • Code examples in multiple languages
- • Error handling and troubleshooting
Authentication
All API requests require authentication using an API key. Include your API key in the Authorization header using the Bearer scheme.
Authorization: Bearer YOUR_API_KEY🔒 Keep your API key secure
Never expose your API key in client-side code or public repositories. Always make API calls from your backend server.
Quick Start
Get started in 3 simple steps:
Step 1: Get your API key
Sign up and generate your API key from the dashboard.
Step 2: Make your first request
Use the example below to fetch tax rates for any ZIP code.
Step 3: Integrate into your app
Use our code examples to integrate into your application.
curl -X GET "https://salestaxapi.io/api/rates?state=UT&zip=84043" \
-H "Authorization: Bearer YOUR_API_KEY"API Endpoints
/api/ratesRetrieve sales tax rate information for a specific location by state code and ZIP code.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
state | string | Yes | Two-letter state code (e.g., "UT", "CA") |
zip | string | Yes | 5-digit ZIP code |
Response Format
All responses are returned in JSON format. Successful responses include a success field set to true.
Success Response (200 OK)
{
"success": true,
"data": {
"zip": "84043",
"state": "UT",
"county": "Utah County",
"city": "Lehi",
"district": null,
"total_rate": 0.0685,
"breakdown": {
"state_rate": 0.0485,
"county_rate": 0.001,
"city_rate": 0.01,
"district_rate": 0.009
},
"multiple_jurisdictions": false,
"confidence": "high",
"last_updated": "2025-12-01T10:30:00Z",
"source_url": "https://tax.utah.gov/...",
"source_last_fetched": "2025-12-01T02:00:00Z"
}
}Response Fields
| Field | Type | Description |
|---|---|---|
total_rate | decimal | Combined tax rate (0.0685 = 6.85%) |
state_rate | decimal | State-level tax rate |
county_rate | decimal | County-level tax rate |
city_rate | decimal | City-level tax rate |
district_rate | decimal | Special district tax rate |
confidence | string | "high", "medium", or "low" confidence level |
last_updated | datetime | ISO 8601 timestamp of last data update |
Error Codes
Error responses include a success: false field and an error object with details.
INVALID_PARAMETERS
The state code or ZIP code format is invalid.
INVALID_API_KEY
The API key is missing, invalid, or inactive.
NOT_FOUND
No tax rate data found for the specified location.
RATE_LIMIT_EXCEEDED
You've exceeded the rate limit. Please retry after the specified time.
QUOTA_EXCEEDED
You've exceeded your monthly quota. Upgrade your plan or wait until next month.
INTERNAL_ERROR
An unexpected error occurred on our end. Please contact support if this persists.
Code Examples
JavaScript (Node.js)
const fetch = require('node-fetch');
async function getTaxRate(state, zip) {
const response = await fetch(
`https://salestaxapi.io/api/rates?state=${state}&zip=${zip}`,
{
headers: {
'Authorization': 'Bearer YOUR_API_KEY'
}
}
);
const data = await response.json();
if (data.success) {
console.log(`Tax rate for ${zip}: ${data.data.total_rate * 100}%`);
return data.data;
} else {
console.error('Error:', data.error.message);
throw new Error(data.error.code);
}
}
// Usage
getTaxRate('UT', '84043')
.then(rate => console.log(rate))
.catch(err => console.error(err));Python
import requests
def get_tax_rate(state, zip_code):
url = f"https://salestaxapi.io/api/rates?state={state}&zip={zip_code}"
headers = {
"Authorization": "Bearer YOUR_API_KEY"
}
response = requests.get(url, headers=headers)
data = response.json()
if data.get("success"):
rate = data["data"]["total_rate"]
print(f"Tax rate for {zip_code}: {rate * 100}%")
return data["data"]
else:
error = data.get("error", {})
print(f"Error: {error.get('message')}")
raise Exception(error.get("code"))
# Usage
try:
rate_data = get_tax_rate("UT", "84043")
print(rate_data)
except Exception as e:
print(f"Failed to fetch rate: {e}")PHP
<?php
function getTaxRate($state, $zip) {
$url = "https://salestaxapi.io/api/rates?state=" . $state . "&zip=" . $zip;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer YOUR_API_KEY'
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);
if ($data['success']) {
$rate = $data['data']['total_rate'] * 100;
echo "Tax rate for $zip: {$rate}%\n";
return $data['data'];
} else {
echo "Error: " . $data['error']['message'] . "\n";
throw new Exception($data['error']['code']);
}
}
// Usage
try {
$rateData = getTaxRate('UT', '84043');
print_r($rateData);
} catch (Exception $e) {
echo "Failed to fetch rate: " . $e->getMessage();
}
?>cURL
# Basic request
curl -X GET "https://salestaxapi.io/api/rates?state=UT&zip=84043" \
-H "Authorization: Bearer YOUR_API_KEY"
# With pretty-printed JSON output
curl -X GET "https://salestaxapi.io/api/rates?state=UT&zip=84043" \
-H "Authorization: Bearer YOUR_API_KEY" \
| json_pp
# Save response to file
curl -X GET "https://salestaxapi.io/api/rates?state=UT&zip=84043" \
-H "Authorization: Bearer YOUR_API_KEY" \
-o response.jsonRate Limits
To ensure fair usage and system stability, we enforce the following rate limits:
Per API Key
10
requests per second
Per IP Address
100
requests per hour
💡 Rate Limit Headers
Every response includes rate limit information in the headers:
- •
X-RateLimit-Limit- Your rate limit - •
X-RateLimit-Remaining- Remaining requests - •
X-RateLimit-Reset- Unix timestamp when limit resets
State Coverage
We provide complete coverage for all 50 US states with daily data updates from official government sources.
📊 Data Freshness
Tax rate data is automatically updated daily at 2:00 AM UTC. Each response includeslast_updated andsource_last_fetched timestamps.
Support
Need help? We're here for you.
📧 Email Support
Contact us at support@salestaxapi.io
Response time: 24-48 hours (Priority support available)
💬 Community
Join our developer community for discussions and updates
Discord, Slack, or GitHub Discussions (coming soon)
🐛 Report Issues
Found a bug or have a feature request?
GitHub Issues or direct email
✨ Best Practices
- •Cache responses - Tax rates don't change frequently. Cache for at least 24 hours.
- •Handle errors gracefully - Always check the
successfield in responses. - •Monitor your usage - Keep track of your API usage in the dashboard to avoid surprises.
- •Use HTTPS only - Always make requests over HTTPS to protect your API key.
- •Implement retry logic - Use exponential backoff for failed requests.