Skip to content

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.

keytypemeaning
valuestring | number | boolean | nullThe confirmed value, or null when the field is not established on an official source.
sourcestring | nullURL 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.
notestring (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.

codestatusmeaning
invalid_request400A required parameter is missing or malformed (for example an unknown use_type). The offending field is named in `details`.
unauthorized401The 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_required402A 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_found404No jurisdiction matches the `city` value. Call GET /api/v1/jurisdictions for the covered list.
rate_limited429You exceeded the anonymous rate, the test-key throttle, or your plan's per-minute burst. See the rate-limit table.
not_configured503A required backend credential is not configured on our side. Safe to retry later.
internal500An 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.

TierBurstVolume
Anonymous (no key)4/min20/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/min200/day against the real dataset. Never bills.
Pro (ld_live_)60/min1,000 calls/mo included, then $0.05/call.
Scale (ld_live_)300/min10,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

GET

/api/v1/jurisdictions

Key optional

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

ParamInRequiredDescription
qquerynoOptional 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"
}
GET

/api/v1/str-rules

Key optional

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

ParamInRequiredDescription
cityqueryyesJurisdiction 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"
}
GET

/api/v1/lodging-tax

Key optional

Lodging / 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.

ParamInRequiredDescription
cityqueryyesJurisdiction 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"
}
POST

/api/v1/check-eligibility

Key optional

Deterministic "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.

ParamInRequiredDescription
citybodyyesJurisdiction slug or "City, ST".
use_typebodyyesprimary_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"
}
GET

/api/v1/pricing

Key optional

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

Developer overviewMCP server