Reference
API reference
Every endpoint, field and error below is generated from the same catalogue the API serves, so this page cannot describe something the code does not do. Machine-readable versions: /api/openapi and /llms.txt.
Base URL
https://lodgedeck.vercel.app/api/v1
Auth
Every endpoint is free at the anonymous rate and needs no key to try. Send `Authorization: Bearer ld_live_…` (or `x-api-key`) to lift the throttle to your plan's quota. A `ld_test_…` key runs the real dataset, is throttled, and never bills.
Format
JSON. Success is `{ data, request_id }`; errors are `{ error: { code, message }, request_id }`. POST accepts an `Idempotency-Key` header. Every response carries X-RateLimit-* and X-Quota-* headers.
Billing unit
Metered by billable call once you send a live key. Anonymous and test-key calls never bill; they are rate-limited instead.
Determinism
Every response is a projection of a cited dataset plus deterministic arithmetic. There is no model in the request path, so the same query always returns the same answer, and every regulatory or tax field carries the source URL it came from and a confidence flag. Unconfirmed fields are null with confidence "unverified" rather than hidden or invented.
Success envelope
Every success is { data, request_id }. This is the real response to curl "https://lodgedeck.vercel.app/api/v1/str-rules?city=austin-tx", a projection of the cited dataset, not a hand-typed sample.
200 response
{
"data": {
"slug": "austin-tx",
"city": "Austin",
"state": "Texas",
"state_code": "TX",
"summary": "Austin licenses short-term rentals annually through Development Services and requires the licence number in every listing. Hosts collect the Texas state hotel occupancy tax plus the city hotel occupancy tax, and platforms are required to collect and remit.",
"rules": {
"permit_required": {
"value": true,
"source": "https://www.austintexas.gov/department/license-my-short-term-rental",
"confidence": "reported",
"note": "A city STR licence is required for each unit; licences are valid for two years."
},
"primary_residence_required": {
"value": false,
"source": "https://www.austintexas.gov/development-services/short-term-rentals",
"confidence": "reported",
"note": "Austin uses licence types (owner-occupied Type 1 and non-owner-occupied Type 2); a primary residence is not required for all types."
},
"night_cap": {
"value": null,
"source": null,
"confidence": "unverified",
"note": "No annual night cap identified for Austin STRs."
},
"zoning_restricted": {
"value": true,
"source": "https://www.austintexas.gov/development-services/short-term-rentals",
"confidence": "reported",
"note": "Type 2 (non-owner-occupied) STRs are restricted in residential zones."
},
"listing_number_display_required": {
"value": true,
"source": "https://www.austintexas.gov/department/license-my-short-term-rental",
"confidence": "reported",
"note": "Operators must include a valid licence number in ads or listings."
},
"registration_url": {
"value": "https://www.austintexas.gov/department/license-my-short-term-rental",
"source": "https://www.austintexas.gov/department/license-my-short-term-rental",
"confidence": "reported"
},
"enforcement": {
"value": "New marketplace rules effective 1 July 2026 require platforms to ensure Austin listings carry a valid licence number and to remove non-compliant listings within 10 days of notice.",
"source": "https://www.austintexas.gov/news/austin-city-council-adopts-short-term-rental-code-amendments",
"confidence": "reported"
}
},
"last_verified": "2026-07-18"
},
"request_id": "req_2f9c41a7b0e84d15"
}The FACT shape
How to read a rule or tax field
Every regulatory and tax field is an object carrying its value, the source it came from and a confidence flag. Nothing is a bare number. A field that is not confirmed on an official source comes back with value null and confidence unverified, so a client never mistakes an unknown for a real value.
| key | type | meaning |
|---|---|---|
| value | string | number | boolean | null | The confirmed value, or null when the field is not established on an official source. |
| source | string | null | URL of the page the value was read from, or null when there is nothing to cite. |
| confidence | "verified" | "reported" | "unverified" | "verified" was confirmed on the official page; "reported" was corroborated but not confirmed; "unverified" means value is null. A client should render an unverified field as "Verify with jurisdiction", never as a real value. |
| note | string (optional) | A short caveat or scope note where one applies (for example which zones a rule covers). |
Errors
Structured, never silent
Every non-2xx response is JSON in the { error: { code, message }, request_id } envelope. The code is stable; build on it, not on the message text.
| code | status | meaning |
|---|---|---|
| invalid_request | 400 | A required parameter is missing or malformed (for example an unknown use_type). The offending field is named in `details`. |
| unauthorized | 401 | The Authorization header carries a key that is not valid or has been revoked. Only sent when you supply a key; keyless calls are allowed at the anonymous rate. |
| upgrade_required | 402 | A live production quota was requested on the Free plan. Use a ld_test_ key to keep developing, or upgrade for a ld_live_ key. |
| not_found | 404 | No jurisdiction matches the `city` value. Call GET /api/v1/jurisdictions for the covered list. |
| rate_limited | 429 | You exceeded the anonymous rate, the test-key throttle, or your plan's per-minute burst. See the rate-limit table. |
| not_configured | 503 | A required backend credential is not configured on our side. Safe to retry later. |
| internal | 500 | An unexpected server error. Safe to retry; contact support if it persists. |
404, unknown city
{
"error": {
"code": "not_found",
"message": "No jurisdiction matches \"portland-me\". Call GET /api/v1/jurisdictions for the list of covered places."
},
"request_id": "req_2f9c41a7b0e84d15"
}Rate limits & quota
By key type
Every endpoint works with no key at the anonymous rate. Send a key to lift the throttle to your plan's quota. A free ld_test_ key runs the real dataset and never bills; a ld_live_ key needs Pro or Scale.
| Tier | Burst | Volume |
|---|---|---|
| Anonymous (no key) | 4/min | 20/day per IP. Enough to run a call out of these docs, not enough to build on. |
| Test key (ld_test_, free on every plan) | 10/min | 200/day against the real dataset. Never bills. |
| Pro (ld_live_) | 60/min | 1,000 calls/mo included, then $0.05/call. |
| Scale (ld_live_) | 300/min | 10,000 calls/mo included, then $0.03/call. |
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining, X-Quota-Limit and X-Quota-Used headers, so an agent can back off before a 429. POST requests accept an Idempotency-Key header so a retry replays the original result. Full plans at /pricing or the machine-readable /api/v1/pricing.
Endpoints
Every route
/api/v1/jurisdictions
Key optionalList every jurisdiction covered, with its slug, city, state and a coverage count of how many rule and tax fields are confirmed. Free, keyless, throttled by IP. The index an agent reads first to learn what it can ask about.
| Param | In | Required | Description |
|---|---|---|---|
| q | query | no | Optional case-insensitive filter over city and state name. |
request
curl https://lodgedeck.vercel.app/api/v1/jurisdictions
response 200
{
"data": {
"count": 22,
"jurisdictions": [
{
"slug": "atlanta-ga",
"city": "Atlanta",
"state": "Georgia",
"state_code": "GA",
"coverage": "6/13"
},
{
"slug": "austin-tx",
"city": "Austin",
"state": "Texas",
"state_code": "TX",
"coverage": "11/13"
},
{
"slug": "charleston-sc",
"city": "Charleston",
"state": "South Carolina",
"state_code": "SC",
"coverage": "10/13"
}
]
},
"request_id": "req_2f9c41a7b0e84d15"
}/api/v1/str-rules
Key optionalShort-term rental rules for one jurisdiction: whether a licence is required, primary-residence rule, night cap, zoning, listing-number display, and enforcement notes. Every field carries a source URL and a confidence flag; an unconfirmed field is null with confidence "unverified", never guessed.
| Param | In | Required | Description |
|---|---|---|---|
| city | query | yes | Jurisdiction slug (e.g. austin-tx) or a "City, ST" string. |
request
curl "https://lodgedeck.vercel.app/api/v1/str-rules?city=austin-tx"
response 200
{
"data": {
"slug": "austin-tx",
"city": "Austin",
"state": "Texas",
"state_code": "TX",
"summary": "Austin licenses short-term rentals annually through Development Services and requires the licence number in every listing. Hosts collect the Texas state hotel occupancy tax plus the city hotel occupancy tax, and platforms are required to collect and remit.",
"rules": {
"permit_required": {
"value": true,
"source": "https://www.austintexas.gov/department/license-my-short-term-rental",
"confidence": "reported",
"note": "A city STR licence is required for each unit; licences are valid for two years."
},
"primary_residence_required": {
"value": false,
"source": "https://www.austintexas.gov/development-services/short-term-rentals",
"confidence": "reported",
"note": "Austin uses licence types (owner-occupied Type 1 and non-owner-occupied Type 2); a primary residence is not required for all types."
},
"night_cap": {
"value": null,
"source": null,
"confidence": "unverified",
"note": "No annual night cap identified for Austin STRs."
},
"zoning_restricted": {
"value": true,
"source": "https://www.austintexas.gov/development-services/short-term-rentals",
"confidence": "reported",
"note": "Type 2 (non-owner-occupied) STRs are restricted in residential zones."
},
"listing_number_display_required": {
"value": true,
"source": "https://www.austintexas.gov/department/license-my-short-term-rental",
"confidence": "reported",
"note": "Operators must include a valid licence number in ads or listings."
},
"registration_url": {
"value": "https://www.austintexas.gov/department/license-my-short-term-rental",
"source": "https://www.austintexas.gov/department/license-my-short-term-rental",
"confidence": "reported"
},
"enforcement": {
"value": "New marketplace rules effective 1 July 2026 require platforms to ensure Austin listings carry a valid licence number and to remove non-compliant listings within 10 days of notice.",
"source": "https://www.austintexas.gov/news/austin-city-council-adopts-short-term-rental-code-amendments",
"confidence": "reported"
}
},
"last_verified": "2026-07-18"
},
"request_id": "req_2f9c41a7b0e84d15"
}/api/v1/lodging-tax
Key optionalLodging / occupancy tax for one jurisdiction: state rate, local transient occupancy tax, the combined rate a guest pays, whether the cleaning fee is taxable, and whether the marketplace collects and remits. Each field is source-cited with a confidence flag.
| Param | In | Required | Description |
|---|---|---|---|
| city | query | yes | Jurisdiction slug (e.g. san-diego-ca) or a "City, ST" string. |
request
curl "https://lodgedeck.vercel.app/api/v1/lodging-tax?city=san-diego-ca"
response 200
{
"data": {
"slug": "san-diego-ca",
"city": "San Diego",
"state": "California",
"state_code": "CA",
"tax": {
"state_lodging_tax_rate_pct": {
"value": 0,
"source": "https://www.sandiego.gov/treasurer/taxesfees/tot",
"confidence": "reported",
"note": "California has no statewide lodging or occupancy tax; the tax is levied locally."
},
"local_tot_rate_pct": {
"value": 10.5,
"source": "https://www.sandiego.gov/treasurer/taxesfees/tot",
"confidence": "reported",
"note": "Base city TOT of 10.5 percent."
},
"combined_rate_pct": {
"value": 10.5,
"source": "https://www.sandiego.gov/treasurer/taxesfees/tot",
"confidence": "reported",
"note": "Rises to about 12.5 percent in Mission Beach, Pacific Beach and La Jolla where a 2 percent Tourism Marketing District assessment applies."
},
"cleaning_fee_taxable": {
"value": null,
"source": null,
"confidence": "unverified"
},
"marketplace_collects": {
"value": true,
"source": "https://www.sandiego.gov/treasurer/taxesfees/tot",
"confidence": "reported"
},
"filing_url": {
"value": "https://www.sandiego.gov/treasurer/taxesfees/tot",
"source": "https://www.sandiego.gov/treasurer/taxesfees/tot",
"confidence": "reported"
}
},
"last_verified": "2026-07-18"
},
"request_id": "req_2f9c41a7b0e84d15"
}/api/v1/check-eligibility
Key optionalDeterministic "can I run an STR here?" answer for a jurisdiction and use type. Returns a verdict, the requirements, the cautions, a confidence, and the citations behind them. No model: same input always gives the same answer. When the governing rules are unknown it says so rather than guessing.
| Param | In | Required | Description |
|---|---|---|---|
| city | body | yes | Jurisdiction slug or "City, ST". |
| use_type | body | yes | primary_residence | whole_home | adu | unhosted. |
request
curl -X POST https://lodgedeck.vercel.app/api/v1/check-eligibility \
-H "Content-Type: application/json" \
-d '{"city":"nashville-tn","use_type":"whole_home"}'response 200
{
"data": {
"slug": "nashville-tn",
"city": "Nashville",
"state": "Tennessee",
"useType": "whole_home",
"verdict": "allowed_with_permit",
"headline": "Short-term rentals are allowed in Nashville once you obtain the required licence and follow the rules below.",
"requirements": [
"A short-term rental licence or registration is required before you list.",
"Register or apply here: https://www.nashville.gov/departments/codes/short-term-rentals"
],
"cautions": [
"Short-term rentals are restricted to certain zones. Confirm your property's zoning allows it.",
"New not-owner-occupied permits are effectively banned in residential zones, limiting supply to designated commercial, mixed-use and downtown districts."
],
"confidence": "high",
"citations": [
{
"field": "permitRequired",
"source": "https://www.nashville.gov/departments/codes/short-term-rentals"
},
{
"field": "primaryResidenceRequired",
"source": "https://www.nashville.gov/departments/codes/short-term-rentals/permit-types"
},
{
"field": "zoningRestricted",
"source": "https://www.nashville.gov/departments/codes/short-term-rentals/permit-types"
},
{
"field": "enforcement",
"source": "https://www.nashville.gov/departments/codes/short-term-rentals/permit-types"
}
],
"disclaimerApplies": true
},
"request_id": "req_2f9c41a7b0e84d15"
}/api/v1/pricing
Key optionalMachine-readable pricing: plans, saved-property limits, included API calls, per-call overage, rate limits and features.
request
curl https://lodgedeck.vercel.app/api/v1/pricing
response 200
{
"data": {
"plans": [
{
"id": "free",
"name": "Free",
"price_usd": 0,
"cadence": "free forever",
"saved_properties": 1,
"api_calls_per_month": 0,
"api_per_minute": 0,
"monitored_watches": 0,
"overage_usd": 0,
"features": [
"Every STR-rules and lodging-tax page, cited",
"All host calculators (profit, tax, break-even, cleaning)",
"1 saved property with iCal calendar sync",
"Test API key for developers (throttled, never bills)",
"Public API and MCP at the anonymous rate"
]
},
{
"id": "pro",
"name": "Pro",
"price_usd": 29,
"cadence": "per month",
"saved_properties": null,
"api_calls_per_month": 1000,
"api_per_minute": 60,
"monitored_watches": 25,
"overage_usd": 0.05,
"features": [
"Unlimited saved properties",
"Watch a city's rules or tax: we snapshot the cited values so a change is detectable",
"Turnover automation and gap-night detection across calendars",
"CSV, iCal and JSON exports",
"STR-rules & lodging-tax API + MCP server (1,000 calls/mo)",
"Inspectable request log"
]
},
{
"id": "scale",
"name": "Scale",
"price_usd": 99,
"cadence": "per month",
"saved_properties": null,
"api_calls_per_month": 10000,
"api_per_minute": 300,
"monitored_watches": null,
"overage_usd": 0.03,
"features": [
"Everything in Pro",
"10,000 API calls/mo, then $0.03 each",
"300 requests/minute burst",
"Unlimited monitored city and rate watches",
"Priority support"
]
}
],
"anon_quota": {
"perMinute": 4,
"perDay": 20
},
"test_key_quota": {
"perMinute": 10,
"perDay": 200
}
},
"request_id": "req_2f9c41a7b0e84d15"
}LodgeDeck reports publicly available short-term rental rules and lodging tax rates and cites the source of each field. It is not legal or tax advice and it does not replace your own review. Ordinances and tax rates change often and automated collection can lag, so every field shows the source it came from and a confidence flag, and unconfirmed values are marked Unverified. Confirm with the jurisdiction before you rely on a rule or rate.