← Home

Developer Documentation

Integrate US payroll tax rates into your application in minutes.

Quickstart

1

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.

2

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.

3

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

GET/v1/rates/lookup

Primary endpoint. Returns all applicable tax rates for an employee on a given pay date.

ParameterTypeRequiredDescription
workStatestringrequired2-letter state code (e.g. CA, NY, TX)
payDatedaterequiredISO 8601 date: YYYY-MM-DD
residenceStatestringoptional2-letter state code if different from work state (reciprocity)
grossWagesnumberoptionalGross wages for the pay period
ytdWagesnumberoptionalYear-to-date gross wages (for wage base tracking)
payPeriodstringoptionalweekly, biweekly, semimonthly, monthly, annual
filingStatusstringoptionalsingle, married, head_of_household (default: single)
allowancesintegeroptionalW-4 withholding allowances (default: 0)

List Jurisdictions

GET/v1/jurisdictions

List all supported jurisdictions. Useful for building state pickers or validating inputs.

ParameterTypeDescription
statestringFilter by 2-letter state code
typestringFilter by type: federal, state

Rate Changes

GET/v1/rates/changes

List upcoming and recent rate changes. Use this to get notified before rates change so you can pre-load updates.

ParameterTypeDescription
statestringFilter by state code
fromdateStart of date range
todateEnd of date range

Health Check

GET/health

No authentication required. Returns 200 OK with service status. Use for uptime monitoring.

{ "status": "ok", "version": "1.0.0" }

Error Codes

HTTP StatusErrorCause
400Bad RequestMissing or invalid query parameters
401UnauthorizedMissing, invalid, or revoked API key
403ForbiddenAccount is inactive or suspended
404Not FoundUnknown jurisdiction or endpoint
429Too Many RequestsPer-minute or monthly rate limit exceeded
500Internal Server ErrorServer error — contact support

All errors follow this shape:

{
  "error": "Unauthorized",
  "message": "API key required. Pass via Authorization: Bearer <key>.",
  "details": []   // optional, present on 400 errors
}

Rate Limits

Rate limit headers are returned on every response:

RateLimit-Limit: 20
RateLimit-Remaining: 17
RateLimit-Reset: 60
PlanMonthly requestsPer-minute limitPrice
Free1,00020$0
Starter100,00060$49/mo
Growth2,000,000200$299/mo
EnterpriseUnlimitedCustomCustom

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.