US Salary & Cost of Living API + MCP Server (Free Tier)

The Kultranz API turns the data engine behind this site into clean JSON. Nine REST endpoints, one remote MCP server, and numbers that trace back to named federal releases: BLS OEWS wages, BEA Regional Price Parities, Census ACS housing and income, IRS 2026 tax rules. No estimates, no scraping, no guesswork - the same engine that powers the calculators on this site, exposed for developers.

Base URL:

https://api.kultranz.com

Try it right now, no key, no signup:

curl "https://api.kultranz.com/paycheck?salary=120000&state=CA&filingStatus=single"

What a call returns

A live response from GET /cost-of-living - two metros, their BEA price parities, and the salary you would need in the second city to hold purchasing power constant:

{
  "data": {
    "from": { "city": "Austin, TX", "rpp": 98.1 },
    "to": { "city": "San Francisco, CA", "rpp": 115.6 },
    "equivalent_salary": 117838.94,
    "gap_pct": 17.84
  },
  "meta": {
    "source": "BLS OEWS + BEA RPP + U.S. Census ACS + IRS (via kultranz.com)",
    "vintage": "2026",
    "year": 2026
  }
}

Every response carries the same meta envelope naming the source agencies and the data vintage, so a downstream product can display provenance without hard-coding it. Errors return { "error": { "code": "...", "message": "..." } } with the appropriate HTTP status.

Pricing

TierPriceQuota
Free$025 requests/day, no card, no key
Lifetime pass$5 one-timeno daily cap - limited to the first 500 buyers
After the first 500$5/mosame access, monthly

Buy the $5 lifetime pass →

The lifetime pass is direct billing - one payment, yours for the life of the API, no subscription to cancel. When the first 500 are gone, the pass becomes $5/month for everyone after. Questions or bulk/commercial needs: [email protected].

Prefer a marketplace? The same API is also listed on RapidAPI, where keys, metering and billing are handled for you. Direct is cheaper; RapidAPI is there if you already live there.

The MCP server at /mcp is free with no quota. It only exposes what the site’s public calculators already give away.

REST endpoints

EndpointReturnsExample
GET /paycheckTake-home pay: federal + FICA + state?salary=120000&state=CA&filingStatus=single
GET /cost-of-livingEquivalent salary between two metros (BEA RPP)?fromCity=Austin, TX&toCity=San Francisco, CA&salary=100000
GET /tax-brackets2026 federal + one state’s brackets?state=NY&filingStatus=single
GET /col-index50-metro RPP table with rent/home/income?city=Albuquerque, NM
GET /salariesReal BLS wage percentiles by job x city?job=nurse&city=Chicago
GET /compound-interestFuture value + yearly series?principal=10000&monthly=500&rate=7&years=20
GET /net-worthAssets, liabilities, net worth?cash=10000&investments=150000
GET /debt-payoffAvalanche / snowball schedule?debts=[{"name":"Card","balance":5000,"rate":22,"min":150}]&extra=200
GET /budget50/30/20 split or full category budget?income=5000

Parameter details:

  • /paycheck - salary (required, > 0), state (required, two-letter code, 50 states + DC), filingStatus (single | mfj, default single), pretax401k (optional, >= 0).
  • /cost-of-living - fromCity, toCity (required, exact metro names as returned by /col-index), salary (default 100000), rich=1 adds a per-category monthly cost breakdown for both cities.
  • /tax-brackets - state (optional; omit for federal only), filingStatus. Returns the standard deduction and the full bracket ladder.
  • /col-index - city optional; omit for the full 50-metro table.
  • /salaries - job and/or city (partial match, e.g. nurse, Chicago), optional state. Up to 100 records, 16 fields each: percentiles (10th/25th/median/75th/90th), averages, employment, and the metro’s cost-of-living context.

Examples

Take-home pay (curl)

curl "https://api.kultranz.com/paycheck?salary=120000&state=CA&filingStatus=single&pretax401k=10000"
{
  "data": {
    "gross": 120000,
    "pretax": 10000,
    "taxable_income": 93900,
    "federal_tax": 15370,
    "social_security": 7440,
    "medicare": 1740,
    "state_tax": 6153.42,
    "total_tax": 30703.42,
    "net": 79296.58,
    "effective_rate": 25.59
  },
  "meta": { "source": "BLS OEWS + BEA RPP + U.S. Census ACS + IRS (via kultranz.com)", "vintage": "2026", "year": 2026 }
}

Cost of living (curl)

curl "https://api.kultranz.com/cost-of-living?fromCity=Austin,%20TX&toCity=San%20Francisco,%20CA&salary=100000"

Salary percentiles (curl)

curl "https://api.kultranz.com/salaries?job=nurse&city=Chicago"
{
  "data": {
    "count": 1,
    "records": [
      {
        "job_title": "Registered Nurse",
        "job_code": "29-1141",
        "city": "Chicago",
        "state": "IL",
        "avg_salary": 90810.0,
        "salary_10th": 67560.0,
        "salary_25th": 79590.0,
        "salary_median": 85160.0,
        "salary_75th": 102440.0,
        "salary_90th": 107980.0,
        "national_avg": 94480.0,
        "employment": 102330,
        "rpp_all_items": 103.595,
        "median_rent": 1380.0,
        "median_home_value": 315200.0,
        "city_median_income": 75134.0,
        "city_population": 2707648
      }
    ]
  },
  "meta": { "source": "BLS OEWS + BEA RPP + U.S. Census ACS + IRS (via kultranz.com)", "vintage": "2026", "year": 2026 }
}

Python

import requests

BASE = "https://api.kultranz.com"

r = requests.get(f"{BASE}/paycheck", params={
    "salary": 120000, "state": "CA", "filingStatus": "single"
})
pay = r.json()
print(pay["data"]["net"], "take-home on", pay["data"]["gross"])

r = requests.get(f"{BASE}/cost-of-living", params={
    "fromCity": "Austin, TX", "toCity": "San Francisco, CA", "salary": 100000
})
col = r.json()["data"]
print(f'${col["equivalent_salary"]:,.2f} in {col["to"]["city"]} '
      f'= $100,000 in {col["from"]["city"]} ({col["gap_pct"]:+.2f}%)')

MCP server

The same data engine is exposed as a remote MCP server - no install, no local process, no API key.

Endpointhttps://api.kultranz.com/mcp (POST)
TransportStreamable HTTP (stateless - the spec-permitted no-session mode; GET answers 405)
AuthNone required
Protocol versions2025-06-18 (latest), 2025-03-26, 2024-11-05
Content typeapplication/json (anything else gets 415)
CostFree, no quota

The five tools

ToolWhat it doesArguments
get_take_home_pay2026 net pay: federal + Social Security + Medicare + state, all 50 states + DCsalary, state (2-letter), filingStatus (single|mfj), pretax401k
compare_cost_of_livingEquivalent salary between two metros from BEA parities, with per-category monthly breakdownfromCity, toCity, salary (default 100000)
get_tax_brackets2026 IRS brackets + standard deduction, plus one state’s rules (none / flat / progressive)state, filingStatus
list_metrosThe 50 supported metros with RPP index, median rent, home value, incomecity (optional, one metro)
get_salary_percentilesBLS OEWS annual wages - 10th/25th/median/75th/90th - by job and metrojob, city, state (at least one)

* required. City names must match list_metros exactly (e.g. "Austin, TX"); call list_metros first to resolve them. Tool results carry both content (JSON text) and structuredContent with the same data + meta envelope as the REST API.

Why five tools and not nine: the four generic calculators (compound interest, net worth, debt payoff, budget) are arithmetic any model can already do. These five are the ones that need the 50-state tax engine, BEA parities or BLS wage tables - things a model genuinely cannot compute by itself.

curl

# 1. initialize
curl https://api.kultranz.com/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'

# 2. tools/call (after the initialized notification)
curl https://api.kultranz.com/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"get_take_home_pay","arguments":{"salary":120000,"state":"TX"}}}'

Python client

import requests

MCP = "https://api.kultranz.com/mcp"

def rpc(id, method, params=None):
    body = {"jsonrpc": "2.0", "id": id, "method": method}
    if params is not None:
        body["params"] = params
    return requests.post(MCP, json=body, timeout=30).json()

# handshake: initialize -> initialized notification -> call tools
rpc(1, "initialize", {
    "protocolVersion": "2025-06-18",
    "capabilities": {},
    "clientInfo": {"name": "example", "version": "0"},
})
requests.post(MCP, json={"jsonrpc": "2.0", "method": "notifications/initialized"})

result = rpc(2, "tools/call", {
    "name": "compare_cost_of_living",
    "arguments": {"fromCity": "Austin, TX", "toCity": "San Francisco, CA", "salary": 100000},
})
data = result["result"]["structuredContent"]["data"]
print(f'${data["equivalent_salary"]:,.2f} needed in {data["to"]["city"]}')

Client setup

Claude Code:

claude mcp add --transport http kultranz https://api.kultranz.com/mcp

Claude Desktop: Settings -> Extensions -> Connectors -> Add custom connector. Name kultranz, URL https://api.kultranz.com/mcp, no key.

Cursor (.cursor/mcp.json):

{
  "mcpServers": {
    "kultranz": { "url": "https://api.kultranz.com/mcp" }
  }
}

Windsurf (~/.codeium/windsurf/mcp_config.json):

{
  "mcpServers": {
    "kultranz": { "serverUrl": "https://api.kultranz.com/mcp" }
  }
}

Then just ask: “what does a nurse earn in Chicago, adjusted for cost of living?” or “compare $120k take-home in Texas vs California”.

Data & limits

The honest version, because you should know what you are building on:

  • Coverage: 50 US metro areas and 20 occupations (1,000 job x metro rows) in the salary dataset; 51 tax jurisdictions (50 states + DC). This is a curated dataset, not every BLS occupation. The full metro list is one call away: GET /col-index.
  • Vintage: the tax engine is 2026 - IRS Rev. Proc. 2025-32 brackets, $16,100/$32,200 standard deduction, $184,500 Social Security wage base, state brackets per Tax Foundation’s 2026 compilation. Cost-of-living uses BEA Regional Price Parities (US average = 100); wages are BLS OEWS as named on the methodology page. Each government release is annual; we ship refreshes within 30 days of publication.
  • Nulls are real: a few metros (e.g. Arlington, TX and Cleveland, OH) lack Census ACS housing fields; those come back null rather than an interpolated guess. Every response’s meta names the sources and vintage so you can label provenance in your own product.
  • Tax model scope: estimates, not tax advice. It covers federal income tax, FICA and state income tax for single and mfj. It excludes local/city income taxes (NYC, Philadelphia), credits and itemized deductions. Washington and New Hampshire levy no tax on wage income and are modeled as no-tax. A handful of states’ MFJ standard deduction is approximated at 2x single where the exact figure was unavailable - flagged in the methodology.
  • No fabrication: if a number is not in a source, it is null, not invented. The calculations (equivalent salary, take-home, affordability ratios) are documented formulas on the methodology page.

Commercial & bulk licensing

Building a product on this data? Beyond the metered API, the full dataset is licensed directly: bulk JSON/CSV exports, commercial-use and white-label rights, annual refresh as BLS/BEA/Census publish, and a data-refresh SLA. The per-record shape is public - 16 fields per job x metro row, each traceable to a named federal release (see the free CC BY dataset for the columns). Email [email protected] with your use case for a quote and an evaluation dataset.

Try it

The calculators on this site call these endpoints under the hood. Run the paycheck calculator, the cost-of-living tool, or browse salaries by job to see the data in action - then hit the API directly when you’re ready to build.

Frequently Asked Questions

Yes - 25 requests per day, no credit card, no key required to start. If you outgrow it, a $5 lifetime pass (first 500 buyers) removes the daily cap.

Yes. https://api.kultranz.com/mcp is a remote MCP server on the Streamable HTTP transport with five tools: take-home pay, cost-of-living comparison, tax brackets, metro list and BLS salary percentiles. No authentication, no quota, works in Claude, Cursor and Windsurf.

Wages come from the BLS Occupational Employment and Wage Statistics (OEWS). Cost-of-living uses BEA Regional Price Parities. Rent, home values and income come from the U.S. Census ACS. Tax rules are IRS 2026 (Rev. Proc. 2025-32), the SSA 2026 wage base, and Tax Foundation 2026 state brackets.

No. Direct calls to https://api.kultranz.com need no key. The MCP endpoint at /mcp is also open. If you prefer marketplace billing and metering, the same API is listed on RapidAPI.

Annually, as each government source refreshes - within 30 days of each BLS, BEA and Census release, and before each tax year opens for IRS figures. The current tax engine is the 2026 tax year.