Developer Documentation
Integrate US payroll tax rates into your application in minutes.
Quickstart
Get an API key
Sign up for a free account at /signup. You'll receive a key like ptx_free_... instantly — no credit card required.
Make your first request
Look up tax rates for a California employee on a biweekly pay schedule:
curl "https://payrolltaxapi.com/v1/rates/lookup?workState=CA&payDate=2026-01-01&filingStatus=single&grossWages=5000&payPeriod=biweekly" \ -H "Authorization: Bearer ptx_free_your_key_here"
You'll get back federal brackets, FICA rates, California income tax brackets, CA SDI, CA SUTA — everything in one response.
Example response
{
"pay_date": "2026-01-01",
"work_state": "CA",
"residence_state": "CA",
"filing_status": "single",
"taxes": [
{
"tax_type_code": "FED_INCOME_EE",
"name": "Federal Income Tax",
"category": "income",
"taxpayer_side": "employee",
"jurisdiction": "Federal",
"rate_structure": "graduated",
"supplemental_rate": 0.22,
"wage_base": null,
"effective_date": "2026-01-01",
"brackets": [
{ "from": 0, "to": 11925, "rate": 0.10 },
{ "from": 11925, "to": 48475, "rate": 0.12 },
{ "from": 48475, "to": 103350,"rate": 0.22 }
]
},
{
"tax_type_code": "FED_FICA_SS_EE",
"name": "Social Security (Employee)",
"category": "fica_social_security",
"taxpayer_side": "employee",
"rate_structure": "wage_base_capped",
"rate": 0.062,
"wage_base": 176100,
"effective_date": "2026-01-01"
},
{
"tax_type_code": "FED_FICA_MED_EE",
"name": "Medicare (Employee)",
"category": "fica_medicare",
"rate_structure": "flat_percent",
"rate": 0.0145,
"wage_base": null
},
{
"tax_type_code": "CA_INCOME_EE",
"name": "California State Income Tax",
"category": "income",
"jurisdiction": "California",
"rate_structure": "graduated",
"supplemental_rate": 0.066,
"brackets": [...]
},
{
"tax_type_code": "CA_SDI_EE",
"name": "California SDI (Employee)",
"category": "sdi",
"rate_structure": "flat_percent",
"rate": 0.009,
"wage_base": null
}
],
"meta": {
"tax_count": 8,
"processing_ms": 12
}
}
Authentication
All /v1/* endpoints require an API key. Pass it in the Authorization header:
Authorization: Bearer ptx_free_your_key_here
Alternatively, pass it via the X-API-Key header:
X-API-Key: ptx_free_your_key_here
Keys are prefixed with ptx_free_ for free tier. Never commit your key to source control.
Rate Lookup
Primary endpoint. Returns all applicable tax rates for an employee on a given pay date.
| Parameter | Type | Required | Description |
|---|---|---|---|
workState | string | required | 2-letter state code (e.g. CA, NY, TX) |
payDate | date | required | ISO 8601 date: YYYY-MM-DD |
residenceState | string | optional | 2-letter state code if different from work state (reciprocity) |
grossWages | number | optional | Gross wages for the pay period |
ytdWages | number | optional | Year-to-date gross wages (for wage base tracking) |
payPeriod | string | optional | weekly, biweekly, semimonthly, monthly, annual |
filingStatus | string | optional | single, married, head_of_household (default: single) |
allowances | integer | optional | W-4 withholding allowances (default: 0) |
List Jurisdictions
List all supported jurisdictions. Useful for building state pickers or validating inputs.
| Parameter | Type | Description |
|---|---|---|
state | string | Filter by 2-letter state code |
type | string | Filter by type: federal, state |
Rate Changes
List upcoming and recent rate changes. Use this to get notified before rates change.
| Parameter | Type | Description |
|---|---|---|
state | string | Filter by state code |
from | date | Start of date range |
to | date | End of date range |
Health Check
No authentication required. Returns 200 OK with service status.
{ "status": "ok", "version": "1.0.0" }
Error Codes
| HTTP Status | Error | Cause |
|---|---|---|
| 400 | Bad Request | Missing or invalid query parameters |
| 401 | Unauthorized | Missing, invalid, or revoked API key |
| 403 | Forbidden | Account is inactive or suspended |
| 404 | Not Found | Unknown jurisdiction or endpoint |
| 429 | Too Many Requests | Per-minute or monthly rate limit exceeded |
| 500 | Internal Server Error | Server error — contact support |
All errors follow this shape:
{
"error": "Unauthorized",
"message": "API key required. Pass via Authorization: Bearer <key>.",
"details": []
}
Rate Limits
Rate limit headers are returned on every response:
RateLimit-Limit: 20 RateLimit-Remaining: 17 RateLimit-Reset: 60
| Plan | Monthly requests | Per-minute limit | Price |
|---|---|---|---|
| Free | 1,000 | 20 | $0 |
| Starter | 100,000 | 60 | $49/mo |
| Growth | 2,000,000 | 200 | $299/mo |
| Enterprise | Unlimited | Custom | Custom |
When you exceed the monthly limit, the API returns 429 until the next billing cycle. Overages are available on Starter and Growth at $0.005 per lookup.
Need a higher limit? Contact us or upgrade your plan.