← 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.

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.

{ "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": []
}

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.