If you need to calculate household employer taxes programmatically (for a finance app, a CPA tool, or just automating your own payroll), you can do it in about 10 lines of Python.
How do I calculate nanny taxes in Python?
Get a free API key at nannykeeper.com/developers/keys (30 seconds, email only), then:
import requests
API_KEY = "nk_live_YOUR_KEY"
response = requests.post(
"https://www.nannykeeper.com/api/v1/calculate",
headers={"Authorization": f"Bearer {API_KEY}"},
json={
"state": "CA",
"annual_wages": 35000,
"pay_frequency": "biweekly",
},
)
data = response.json()["data"]
print(f"State: {data['state_name']}")
print(f"Annual wages: ${data['annual_wages']:,.0f}")
print()
print("Employer taxes (annual):")
print(f" Social Security: ${data['employer_taxes']['social_security']:,.2f}")
print(f" Medicare: ${data['employer_taxes']['medicare']:,.2f}")
print(f" FUTA: ${data['employer_taxes']['futa']:,.2f}")
print(f" State unemployment: ${data['employer_taxes']['state_unemployment']:,.2f}")
for part in data["employer_taxes"]["state_unemployment_components"]:
print(f" {part['name']}: ${part['amount']:,.2f} ({part['rate'] * 100:.1f}%)")
print(f" Total: ${data['employer_taxes']['total']:,.2f}")
print(f" Effective rate: {data['employer_taxes']['effective_rate']:.2f}%")
print()
print(f"Per paycheck cost: ${data['per_paycheck']['total_cost']:,.2f}")
Output:
State: California
Annual wages: $35,000
Employer taxes (annual):
Social Security: $2,170.00
Medicare: $507.50
FUTA: $42.00
State unemployment: $245.00
Unemployment Insurance: $238.00 (3.4%)
Employment Training Tax: $7.00 (0.1%)
Total: $2,964.50
Effective rate: 8.47%
Per paycheck cost: $1,460.17
That extra loop matters in California. The EDD assigns one rate covering two
taxes, so state_unemployment there is Unemployment Insurance plus the
Employment Training Tax, and a family reading only the total will go looking for
an ETT line they never find. state_unemployment_components breaks it out for
every state; the amounts always add up to state_unemployment, and in states
that charge one tax you get a single entry.
Four states bundle differently, and it is worth knowing which. Washington,
Colorado, Arkansas and Wisconsin publish a single rate that is already more than
one tax, so there is no split for us to report. Our Washington default, 1.02%
(the lowest a new employer can be assigned), is 1.00% unemployment insurance
plus a 0.02% Employment Administration Fund charge on the same ESD invoice. Those come back as one component with an
includes array naming the parts and no separate amounts, because the split
lives on your rate notice rather than in our data.
How do I check if I even need to pay nanny taxes?
Not everyone who pays a babysitter owes FICA. The 2026 Social Security and Medicare threshold is $3,000 per nonexempt employee per year. Below that, FICA generally does not apply to that worker, but the separate household-wide $1,000-in-a-quarter FUTA test and state rules can still apply.
response = requests.get(
"https://www.nannykeeper.com/api/v1/threshold",
headers={"Authorization": f"Bearer {API_KEY}"},
params={"state": "CA", "annual_wages": 2500},
)
data = response.json()["data"]
print(f"Federal status: {data['federal']['status']}")
print(f"Explanation: {data['federal']['explanation']}")
if data['state_threshold']:
print(f"State threshold: ${data['state_threshold']['threshold_quarterly']}/quarter")
How do I compare nanny tax costs across states?
Loop through states. Useful if you're building a tool that shows regional cost differences:
states = ["CA", "NY", "TX", "FL", "WA", "IL", "NJ", "CO"]
print(f"{'State':<6} {'Employer Tax':<14} {'Eff. Rate':<10} {'Per Paycheck'}")
print("-" * 48)
for state in states:
resp = requests.post(
"https://www.nannykeeper.com/api/v1/calculate",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"state": state, "annual_wages": 40000, "pay_frequency": "biweekly"},
)
d = resp.json()["data"]
print(
f"{state:<6} "
f"${d['employer_taxes']['total']:>10,.2f} "
f"{d['employer_taxes']['effective_rate']:>5.2f}% "
f"${d['per_paycheck']['total_cost']:>9,.2f}"
)
The free tier is 50 requests/day. Eight states fits. All 50 in a tight loop eats your daily quota. Paid plans go up to 2,000/day.
What about error handling?
Standard HTTP status codes:
| Code | Meaning |
|---|---|
| 200 | Success |
| 400 | Bad input; check error.details for which field |
| 401 | Missing or invalid API key |
| 429 | Rate limit hit; check Retry-After header |
Track your usage with rate limit headers:
remaining = response.headers.get('X-RateLimit-Remaining')
print(f"Remaining today: {remaining}")
Ready to simplify nanny taxes?
NannyKeeper does the calculations, tracks the deadlines, and prepares the paperwork so you can focus on your family.
FAQ
Is the API free? Yes, 50 requests per day, forever. No credit card. Paid plans ($10-18/month) unlock payroll processing, document generation, and direct deposit.
What Python version do I need?
Python 3.7 or later. The requests library is the only dependency (pip install requests).
Can I use this in production? Yes. The API is the same engine that runs NannyKeeper's payroll product. For production apps, consider a paid plan for higher rate limits (500-2,000/day).