Takehome

API docs

Get a key, make one authenticated call, see 800.79. Test keys run the same engine as live keys and are not metered.

First call

Get a key — email, verify, copy the np_test_ key. No sales call. Then run this. Ontario weekly $1000.00 on 2026-01-15, claim code 1. employee.net_pay is 800.79.

curl -sS -X POST https://takehome.gautamkhosla.com/v1/deductions \
  -H 'content-type: application/json' \
  -H 'authorization: Bearer np_test_YOUR_KEY' \
  -d '{"as_of":"2026-01-15","province":"ON","pay_period":52,"gross_pay":"1000.00","federal_claim_code":1,"provincial_claim_code":1}'

Request

POST /v1/deductions with content-type: application/json and authorization: Bearer. Replace np_test_YOUR_KEY with the test key from verify.

Response

Trimmed body for the first call. Cents are strings, never binary floats.

{
  "rule_set_version": "2026-01-01",
  "employee": {
    "federal_tax": "81.61",
    "provincial_tax": "45.80",
    "cpp": "55.50",
    "cpp2": "0.00",
    "ei": "16.30",
    "total_deductions": "199.21",
    "net_pay": "800.79"
  }
}

Authentication

Live keys count calculations, not HTTP requests, and stop at the plan limit. Prices are on pricing.

Public endpoints

Public listings (/v1/rules, /v1/jurisdictions, /openapi.json) do not need a key.

Embed

Job boards can skip the API: one embed.js tag runs the same WASM engine in the listing page. No cookie, no salary posted back.