Tektolo

experimentalv0.1.0 · strict determinism

Deposit settlement

Settle a US rental security deposit under the state's rule (and a covered city's): the return deadline, each deduction assessed (allowed category, depreciation, documentation), interest owed, the refund, penalty exposure and a draft itemized statement, every number cited.

Operations

REST
https://tektolo.com/v1/
MCP
https://tektolo.com/mcp (streamable HTTP, no auth)
settlekind: deterministic, limits: 30/min · 20/day, price per call: Free tier, then $0.02

Settle a security deposit after move-out. Security deposit settlement for a US rental under the state's statute (and a covered city's ordinance): the date to return the deposit and itemized statement, each intended deduction assessed (allowed or not, prorated by useful life, documentation needed), interest owed, refund due, penalty exposure, a draft itemized statement and a citation for every rule. Covers all 50 states and DC, with city overlays for Chicago, San Francisco, Berkeley, Los Angeles, Seattle, Portland, Minneapolis and Saint Paul.

Use it when: A landlord or property manager is closing a move-out and asks when the deposit must be returned, what they may deduct (carpet, paint, cleaning, unpaid rent), how much interest is owed, what to put in the itemized statement, or what happens if they are late.

Not for: Not legal advice and not a tenant demand letter. It does not price repairs (use property_turnover_quick_estimate for that), hold or account for deposits, or cover pet deposits, last-month's rent handling or non-US rentals. Where the statute sets no deadline (Kentucky, Tennessee) it says so; never present a guessed date as the rule.

  • Send as_of (today's date) for a repeatable answer; it defaults to today in UTC.
  • Give item_installed_on or item_age_years for carpet, paint, blinds and appliances; without them the tenancy length is assumed.
  • Mark normal wear with caused_by_tenant false; it is never deductible.
  • Relay deadline.return_by and its status, totals.refund_due_usd, penalty_exposure and the citations; say it is not legal advice.
  • Offer statement.text as the draft itemized statement; it has no names or addresses.
  • Relay warnings, assumptions and unknowns (for example the Texas forwarding address).
  • Send the start-event dates a state needs when known (forwarding_address_received_on, demand_received_on, new_tenant_moved_in_on, claim_notice_sent_on in Florida); without them the clock is not_started.
  • deadline.status none_in_statute means no statutory deadline; deadline.extended_to is the statute's weekend roll-forward, but advise acting by return_by.
REST
POST /v1/deposit-settlement/settle
MCP tool
deposit_settlement_settle
Schemas
input · output
Limits
30/min · 20/day
Price per call
Free tier, then $0.02
Example request (curl)
curl -sS 'https://tektolo.com/v1/deposit-settlement/settle' \
  -H 'content-type: application/json' \
  -d '{
  "state": "CA",
  "city": "Fresno",
  "deposit_usd": "2000",
  "monthly_rent_usd": "2000",
  "move_in_on": "2023-06-01",
  "vacated_on": "2026-09-30",
  "deductions": [
    {
      "category": "cleaning",
      "amount_usd": "150",
      "has_receipt": true
    },
    {
      "category": "carpet",
      "amount_usd": "1200",
      "item_age_years": 5,
      "has_receipt": true
    },
    {
      "category": "paint",
      "amount_usd": "600",
      "item_installed_on": "2025-03-01",
      "has_receipt": true
    },
    {
      "category": "blinds_window_coverings",
      "amount_usd": "80",
      "caused_by_tenant": false
    }
  ],
  "documentation": {
    "itemized_statement": true,
    "receipts": true,
    "photos_move_out": true,
    "photos_after_repair": false
  },
  "as_of": "2026-10-09"
}'
Example response

Long lists are cut to their first items here.

{
  "run": {
    "id": "run_7dfdeea985e0400fba126a07c66d3469",
    "capability": "deposit-settlement",
    "operation": "settle",
    "contract_version": "0.1.0",
    "engine_version": "0.1.0",
    "ruleset_version": "sd-2026.10.1",
    "ruleset_hash": "sha256:3777ac89e2a1b9400e9abf225feca8733c14c19cdecf5740e24a00faf4631cd8",
    "received_at": "2026-10-09T19:11:25.535322Z",
    "duration_ms": 0
  },
  "client_refs": {},
  "input_hash": "sha256:884ca33f95961e3176f29b28fca4ec55fccf47a2250b71681179961e4f2df4da",
  "result_hash": "sha256:168e088207e56812eee43838b57096186e7169920f107e0d4efef994473cc298",
  "result": {
    "summary": "California: return the deposit and itemized statement by 2026-10-21 (21 calendar days after the day the tenant vacated, 2026-09-30; 12 days left). Allowed deductions $949.98 of $2,030.00 claimed; interest $0.00; refund due $1,050.02. If the...",
    "disclaimer": "Computes the published rule and cites it; it is not legal advice. You sign the statement: check the statute, your lease and any local ordinance before you rely on it.",
    "jurisdiction": {
      "state": "CA",
      "state_name": "California",
      "city": "Fresno",
      "city_overlay": null,
      "covered": true,
      "verified": true
    },
    "as_of": "2026-10-09",
    "deadline": {
      "return_by": "2026-10-21",
      "itemization_by": "2026-10-21",
      "extended_to": null,
      "start_event": "the day the tenant vacated",
      "start_date": "2026-09-30",
      "days": 21,
      "months": null,
      "counting": "calendar",
      "status": "upcoming",
      "days_remaining": 12,
      "note": "21 calendar days after the tenant vacates (not the lease end). From 2026-01-01 (AB 414) the remainder must be returned electronically if the landlord received the security or rent electronically, unless otherwise agreed in writing; with sev..."
    },
    "deductions": [
      {
        "category": "cleaning",
        "amount_claimed_usd": "150.00",
        "allowed": "yes",
        "basis": "allowed_category",
        "depreciation": null,
        "amount_allowed_usd": "150.00",
        "documentation_needed": [
          "receipt, invoice or estimate",
          "dated photos (move-out, after-repair)"
        ],
        "notes": [
          "Only cleaning needed to return the unit to its move-in condition, not routine cleaning after normal use."
        ]
      },
      {
        "category": "carpet",
        "amount_claimed_usd": "1200.00",
        "allowed": "yes",
        "basis": "allowed_category",
        "depreciation": {
          "applied": true,
          "method": "straight_line",
          "useful_life_years": "10",
          "age_years": "5.00",
          "remaining_fraction": "0.5000",
          "source": "carpet:CA",
          "schedule_source": null
        },
        "amount_allowed_usd": "600.00",
        "documentation_needed": [
          "receipt, invoice or estimate",
          "dated photos (move-out, after-repair)"
        ],
        "notes": [
          "Prorated: 5.00 of 10 years of useful life used, 50.00% remaining of $1,200.00."
        ]
      },
      "... 2 more"
    ],
    "totals": {
      "deposit_usd": "2000.00",
      "claimed_usd": "2030.00",
      "allowed_usd": "949.98",
      "interest_usd": "0.00",
      "refund_due_usd": "1050.02",
      "tenant_owes_usd": "0.00"
    },
    "interest": {
      "required": false,
      "condition": null,
      "rate_percent": null,
      "basis": null,
      "base_usd": null,
      "method": null,
      "period_days": null,
      "parts": [],
      "amount_usd": null,
      "citation": null,
      "formula": null,
      "note": "No statewide interest; some cities require it (city overlay)."
    },
    "documentation": [
      {
        "duty": "itemized_statement",
        "required": true,
        "met": "yes",
        "citation": "Cal. Civ. Code 1950.5",
        "threshold": null,
        "note": null
      },
      {
        "duty": "receipts",
        "required": true,
        "met": "yes",
        "citation": "Cal. Civ. Code 1950.5",
        "threshold": "repairs and cleaning over $125.00",
        "note": "Copies of bills, invoices or receipts (or time and hourly rate for own work) must accompany the statement when repair and cleaning deductions exceed $125 in total, or whenever the tenant asks within 14 days of the statement; a good-faith es..."
      },
      "... 1 more"
    ],
    "penalty_exposure": {
      "applies_if": "the deposit is kept in bad faith",
      "kind": "multiple",
      "multiple": "2",
      "fixed_usd": null,
      "minimum_usd": null,
      "per_violation": false,
      "in_addition_to_refund": false,
      "basis": "deposit",
      "discretionary": true,
      "plus_attorney_fees": false,
      "estimated_max_usd": "4000.00",
      "forfeits_right_to_withhold": false,
      "citation": "Cal. Civ. Code 1950.5",
      "note": "Bad-faith claim or retention may bring statutory damages of up to twice the security, in addition to actual damages (1950.5(m)). Separately, bad-faith failure to comply with (h) means the landlord may claim no amount of the security (1950.5...",
      "additional": []
    },
    "deposit_cap": {
      "months_rent": "1",
      "cap_usd": "2000.00",
      "exceeded": false,
      "citation": "Cal. Civ. Code 1950.5",
      "variants": null,
      "note": "One month's rent for security collected from 2024-07-01 (AB 12); two months for a natural-person or all-natural-person LLC landlord owning at most two properties with at most four units, unless the tenant is a service member."
    },
    "statement": {
      "lines": [
        {
          "label": "Security deposit held",
          "amount_usd": "2000.00",
          "note": null
        },
        {
          "label": "Deduction: Cleaning",
          "amount_usd": "150.00",
          "note": null
        },
        "... 5 more"
      ],
      "refund_due_usd": "1050.02",
      "due_by": "2026-10-21",
      "text": "DRAFT ITEMIZED STATEMENT OF SECURITY DEPOSIT\nRule: Cal. Civ. Code 1950.5 (California)\nMove-out date: September 30, 2026\n\nSecurity deposit held                            $2,000.00\nDeduction: Cleaning                               -$150.00\nD..."
    },
    "citations": [
      {
        "rule": "deadline",
        "section": "Cal. Civ. Code 1950.5(h)(1)",
        "quote": "No later than 21 calendar days after the tenant has vacated the premises, ... the landlord shall furnish the tenant, a copy of an itemized statement indicating the basis for, and the amount of, any security received and the disposition of t...",
        "verbatim": true,
        "url": "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=CIV&sectionNum=1950.5",
        "source_title": "California Civil Code 1950.5",
        "accessed": "2026-10-09"
      },
      {
        "rule": "penalty",
        "section": "Cal. Civ. Code 1950.5",
        "quote": "Bad-faith claim or retention may bring statutory damages of up to twice the security, in addition to actual damages (1950.5(m)). Separately, bad-faith failure to comply with (h) means the landlord may claim no amount of the security (1950.5...",
        "verbatim": false,
        "url": "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=CIV&sectionNum=1950.5",
        "source_title": "California Civil Code 1950.5",
        "accessed": "2026-10-09"
      },
      "... 7 more"
    ],
    "warnings": [
      {
        "code": "city_not_covered",
        "text": "No city overlay for Fresno; the California rule is used. Local ordinances can add interest or shorter deadlines; check them."
      },
      {
        "code": "missing_photos",
        "text": "Required documentation missing: photos (Cal. Civ. Code 1950.5). Without it the deductions may be lost."
      },
      "... 3 more"
    ],
    "assumptions": [
      {
        "code": "depreciation_guidance",
        "text": "Depreciation applied as guidance, not a statutory formula: The Civil Code states no formula. The official DRE guide (2026 edition) describes prorating replacement cost by remaining useful life (8-year-old carpet, 10-year life, $1,000 replac..."
      }
    ],
    "unknowns": [],
    "provenance": {
      "ruleset_id": "deposit-settlement",
      "ruleset_version": "sd-2026.10.1",
      "ruleset_hash": "sha256:3777ac89e2a1b9400e9abf225feca8733c14c19cdecf5740e24a00faf4631cd8",
      "rule_ids": [
        "CA",
        "useful_life:carpet",
        "... 1 more"
      ],
      "sources": [
        "ca.civ-1950.5",
        "ca.ab12-2023",
        "... 11 more"
      ]
    }
  }
}
Schemas

Input

{
  "$defs": {
    "Deduction": {
      "additionalProperties": false,
      "properties": {
        "category": {
          "description": "One of: unpaid_rent, unpaid_utilities, cleaning, carpet, flooring, paint, blinds_window_coverings, appliance, fixture_or_hardware, wall_or_door_repair, key_or_lock, late_fees, lease_break_fee, other_damage, other.",
          "enum": [
            "unpaid_rent",
            "unpaid_utilities",
            "cleaning",
            "carpet",
            "flooring",
            "paint",
            "blinds_window_coverings",
            "appliance",
            "fixture_or_hardware",
            "wall_or_door_repair",
            "key_or_lock",
            "late_fees",
            "lease_break_fee",
            "other_damage",
            "other"
          ],
          "title": "Category",
          "type": "string"
        },
        "description": {
          "anyOf": [
            {
              "maxLength": 200,
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Your own short note (e.g. 'bedroom carpet, pet stains'). Never stored, hashed or returned; the statement uses the category.",
          "title": "Description"
        },
        "amount_usd": {
          "anyOf": [
            {
              "maximum": 10000000.0,
              "minimum": 0.0,
              "type": "number"
            },
            {
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
              "type": "string"
            }
          ],
          "description": "Amount you intend to deduct, in dollars (rounded to cents).",
          "title": "Amount Usd"
        },
        "item_installed_on": {
          "anyOf": [
            {
              "format": "date",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "When the item (carpet, paint, appliance...) was installed or last replaced (YYYY-MM-DD). Give this or item_age_years, not both.",
          "title": "Item Installed On"
        },
        "item_age_years": {
          "anyOf": [
            {
              "maximum": 100.0,
              "minimum": 0.0,
              "type": "number"
            },
            {
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Age of the item in years at move-out (e.g. 4.5).",
          "title": "Item Age Years"
        },
        "useful_life_years": {
          "anyOf": [
            {
              "exclusiveMinimum": 0.0,
              "maximum": 100.0,
              "type": "number"
            },
            {
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Override the useful life used for depreciation (years).",
          "title": "Useful Life Years"
        },
        "caused_by_tenant": {
          "default": true,
          "description": "False when the condition is normal wear and tear (never deductible).",
          "title": "Caused By Tenant",
          "type": "boolean"
        },
        "has_receipt": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "You have a receipt, invoice or estimate for this line.",
          "title": "Has Receipt"
        },
        "has_photos": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "You have photos of this damage.",
          "title": "Has Photos"
        }
      },
      "required": [
        "category",
        "amount_usd"
      ],
      "title": "Deduction",
      "type": "object"
    },
    "Documentation": {
      "additionalProperties": false,
      "properties": {
        "itemized_statement": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "You will send (or sent) an itemized statement.",
          "title": "Itemized Statement"
        },
        "receipts": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "You have receipts or invoices for the repairs and cleaning.",
          "title": "Receipts"
        },
        "photos_move_in": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Dated move-in photos.",
          "title": "Photos Move In"
        },
        "photos_move_out": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Dated move-out photos.",
          "title": "Photos Move Out"
        },
        "photos_after_repair": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Photos after repairs.",
          "title": "Photos After Repair"
        }
      },
      "title": "Documentation",
      "type": "object"
    }
  },
  "additionalProperties": false,
  "properties": {
    "client_refs": {
      "anyOf": [
        {
          "additionalProperties": {
            "type": "string"
          },
          "type": "object"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Your own reference ids (e.g. unit_id, job_id). Echoed back, never used.",
      "title": "Client Refs"
    },
    "state": {
      "description": "US state, 2-letter code (e.g. 'CA'); a state name also works.",
      "examples": [
        "CA"
      ],
      "maxLength": 20,
      "minLength": 2,
      "title": "State",
      "type": "string"
    },
    "city": {
      "anyOf": [
        {
          "maxLength": 80,
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "City, for a city overlay where covered (e.g. 'Chicago'). Optional.",
      "title": "City"
    },
    "deposit_usd": {
      "anyOf": [
        {
          "maximum": 10000000.0,
          "minimum": 0.0,
          "type": "number"
        },
        {
          "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
          "type": "string"
        }
      ],
      "description": "Security deposit held, dollars.",
      "title": "Deposit Usd"
    },
    "monthly_rent_usd": {
      "anyOf": [
        {
          "maximum": 10000000.0,
          "minimum": 0.0,
          "type": "number"
        },
        {
          "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Monthly rent, for the deposit cap check.",
      "title": "Monthly Rent Usd"
    },
    "building_units": {
      "anyOf": [
        {
          "maximum": 100000,
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Units in the building. Some interest rules depend on it (NY 6+, IL 25+).",
      "title": "Building Units"
    },
    "move_in_on": {
      "anyOf": [
        {
          "format": "date",
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Tenancy start (YYYY-MM-DD). Used for interest and, when an item's age is unknown, for depreciation.",
      "title": "Move In On"
    },
    "tenancy_ended_on": {
      "anyOf": [
        {
          "format": "date",
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Lease end or termination date (YYYY-MM-DD), if different.",
      "title": "Tenancy Ended On"
    },
    "vacated_on": {
      "description": "Day the tenant moved out and returned possession (YYYY-MM-DD).",
      "format": "date",
      "title": "Vacated On",
      "type": "string"
    },
    "forwarding_address_received_on": {
      "anyOf": [
        {
          "format": "date",
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Day you received the tenant's written forwarding address (YYYY-MM-DD). Several states start or hold the clock on it (Texas, Connecticut, Iowa, Minnesota).",
      "title": "Forwarding Address Received On"
    },
    "demand_received_on": {
      "anyOf": [
        {
          "format": "date",
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Day you received the tenant's written demand for the deposit (YYYY-MM-DD). Arizona, Kansas, Oklahoma, South Carolina and Mississippi start the clock on it.",
      "title": "Demand Received On"
    },
    "new_tenant_moved_in_on": {
      "anyOf": [
        {
          "format": "date",
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Day a new tenant moved in, if the unit was re-rented (YYYY-MM-DD). West Virginia and Wisconsin can end the period earlier.",
      "title": "New Tenant Moved In On"
    },
    "claim_notice_sent_on": {
      "anyOf": [
        {
          "format": "date",
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Day you sent the written notice of intent to impose a claim on the deposit (YYYY-MM-DD). Florida: the balance is due 30 days after it.",
      "title": "Claim Notice Sent On"
    },
    "lease_return_days": {
      "anyOf": [
        {
          "maximum": 365,
          "minimum": 0,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Return period the lease sets, in days, where the statute lets a lease set one (Colorado up to 60, Idaho up to 30, Maine shorter).",
      "title": "Lease Return Days"
    },
    "tenant_gave_proper_notice": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "A termination notice that meets the statute was given (Alaska: 14 days instead of 30 when nothing is deducted for damage).",
      "title": "Tenant Gave Proper Notice"
    },
    "contractor_needed": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Damage exceeds the deposit and needs a third-party contractor, and you said so in writing in time (Virginia, West Virginia: 15 more days).",
      "title": "Contractor Needed"
    },
    "deductions": {
      "description": "What you intend to deduct; may be empty.",
      "items": {
        "$ref": "#/$defs/Deduction"
      },
      "maxItems": 50,
      "title": "Deductions",
      "type": "array"
    },
    "documentation": {
      "$ref": "#/$defs/Documentation",
      "description": "What documentation you have; leave a field out when unknown."
    },
    "as_of": {
      "description": "Today's date (YYYY-MM-DD) for the deadline status. Defaults to today (UTC); send it for repeatable results.",
      "format": "date",
      "title": "As Of",
      "type": "string"
    }
  },
  "required": [
    "state",
    "deposit_usd",
    "vacated_on"
  ],
  "title": "SettleRequest",
  "type": "object"
}

Output

{
  "$defs": {
    "Citation": {
      "properties": {
        "rule": {
          "description": "What the citation supports: deadline, interest, penalty, ...",
          "title": "Rule",
          "type": "string"
        },
        "section": {
          "title": "Section",
          "type": "string"
        },
        "quote": {
          "description": "Short quote of the rule (or our summary when verbatim is false).",
          "title": "Quote",
          "type": "string"
        },
        "verbatim": {
          "default": true,
          "title": "Verbatim",
          "type": "boolean"
        },
        "url": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Url"
        },
        "source_title": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Source Title"
        },
        "accessed": {
          "anyOf": [
            {
              "format": "date",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Accessed"
        }
      },
      "required": [
        "rule",
        "section",
        "quote"
      ],
      "title": "Citation",
      "type": "object"
    },
    "Deadline": {
      "properties": {
        "return_by": {
          "anyOf": [
            {
              "format": "date",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Last day to return the deposit.",
          "title": "Return By"
        },
        "itemization_by": {
          "anyOf": [
            {
              "format": "date",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Last day for the itemized statement (often the same day; earlier in Chicago, later in Louisiana).",
          "title": "Itemization By"
        },
        "extended_to": {
          "anyOf": [
            {
              "format": "date",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Where the state's code rolls a last day on a weekend or holiday to the next business day: that later date. Act by return_by; this is the legal outer limit.",
          "title": "Extended To"
        },
        "start_event": {
          "description": "What starts the clock, in words.",
          "title": "Start Event",
          "type": "string"
        },
        "start_date": {
          "anyOf": [
            {
              "format": "date",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Start Date"
        },
        "days": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Period in days (None: months or none).",
          "title": "Days"
        },
        "months": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Period in calendar months, if any.",
          "title": "Months"
        },
        "counting": {
          "enum": [
            "calendar",
            "business"
          ],
          "title": "Counting",
          "type": "string"
        },
        "status": {
          "description": "upcoming, due_today, overdue; not_started when the start event is not given yet; none_in_statute when the statute sets no deadline (Kentucky, Tennessee).",
          "enum": [
            "upcoming",
            "due_today",
            "overdue",
            "not_started",
            "none_in_statute"
          ],
          "title": "Status",
          "type": "string"
        },
        "days_remaining": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Days from as_of to return_by (negative when overdue).",
          "title": "Days Remaining"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Note"
        }
      },
      "required": [
        "start_event",
        "counting",
        "status"
      ],
      "title": "Deadline",
      "type": "object"
    },
    "DeductionResult": {
      "properties": {
        "category": {
          "enum": [
            "unpaid_rent",
            "unpaid_utilities",
            "cleaning",
            "carpet",
            "flooring",
            "paint",
            "blinds_window_coverings",
            "appliance",
            "fixture_or_hardware",
            "wall_or_door_repair",
            "key_or_lock",
            "late_fees",
            "lease_break_fee",
            "other_damage",
            "other"
          ],
          "title": "Category",
          "type": "string"
        },
        "amount_claimed_usd": {
          "title": "Amount Claimed Usd",
          "type": "string"
        },
        "allowed": {
          "enum": [
            "yes",
            "no",
            "depends"
          ],
          "title": "Allowed",
          "type": "string"
        },
        "basis": {
          "enum": [
            "allowed_category",
            "normal_wear",
            "not_allowed",
            "unclassified"
          ],
          "title": "Basis",
          "type": "string"
        },
        "depreciation": {
          "anyOf": [
            {
              "$ref": "#/$defs/Depreciation"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "amount_allowed_usd": {
          "description": "What the rule lets you keep for this line ('depends' lines: not counted in totals until you confirm).",
          "title": "Amount Allowed Usd",
          "type": "string"
        },
        "documentation_needed": {
          "items": {
            "type": "string"
          },
          "title": "Documentation Needed",
          "type": "array"
        },
        "notes": {
          "items": {
            "type": "string"
          },
          "title": "Notes",
          "type": "array"
        }
      },
      "required": [
        "category",
        "amount_claimed_usd",
        "allowed",
        "basis",
        "amount_allowed_usd"
      ],
      "title": "DeductionResult",
      "type": "object"
    },
    "DepositCapCheck": {
      "properties": {
        "months_rent": {
          "anyOf": [
            {
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "None: no statutory cap.",
          "title": "Months Rent"
        },
        "cap_usd": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Cap Usd"
        },
        "exceeded": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Exceeded"
        },
        "citation": {
          "title": "Citation",
          "type": "string"
        },
        "variants": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Other caps by tenancy type or term; checked against the main.",
          "title": "Variants"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Note"
        }
      },
      "required": [
        "citation"
      ],
      "title": "DepositCapCheck",
      "type": "object"
    },
    "Depreciation": {
      "properties": {
        "applied": {
          "title": "Applied",
          "type": "boolean"
        },
        "method": {
          "anyOf": [
            {
              "enum": [
                "straight_line",
                "step_table"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "straight_line: max(0, 1 - age / useful life); step_table: the band of a published schedule for the item's age (California paint).",
          "title": "Method"
        },
        "useful_life_years": {
          "anyOf": [
            {
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Useful Life Years"
        },
        "age_years": {
          "anyOf": [
            {
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Age at move-out: full calendar years plus remaining days / 365, 2 decimals.",
          "title": "Age Years"
        },
        "remaining_fraction": {
          "anyOf": [
            {
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Share of the cost the tenant can be charged, 4 decimals.",
          "title": "Remaining Fraction"
        },
        "source": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "useful_life row id (row:jurisdiction for a variant) or 'request'.",
          "title": "Source"
        },
        "schedule_source": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Source id of the step table, when one was used.",
          "title": "Schedule Source"
        }
      },
      "required": [
        "applied"
      ],
      "title": "Depreciation",
      "type": "object"
    },
    "DocumentationDuty": {
      "properties": {
        "duty": {
          "enum": [
            "itemized_statement",
            "receipts",
            "photos"
          ],
          "title": "Duty",
          "type": "string"
        },
        "required": {
          "title": "Required",
          "type": "boolean"
        },
        "met": {
          "enum": [
            "yes",
            "no",
            "unknown"
          ],
          "title": "Met",
          "type": "string"
        },
        "citation": {
          "title": "Citation",
          "type": "string"
        },
        "threshold": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Threshold"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Note"
        }
      },
      "required": [
        "duty",
        "required",
        "met",
        "citation"
      ],
      "title": "DocumentationDuty",
      "type": "object"
    },
    "Interest": {
      "properties": {
        "required": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "description": "None: depends on facts you did not give.",
          "title": "Required"
        },
        "condition": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Condition"
        },
        "rate_percent": {
          "anyOf": [
            {
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Percent per year (the move-out rate when rates change).",
          "title": "Rate Percent"
        },
        "basis": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What the rate applies to: deposit, or the excess (Ohio).",
          "title": "Basis"
        },
        "base_usd": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The amount the rate applies to.",
          "title": "Base Usd"
        },
        "method": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "simple, per_window, anniversary_years or monthly.",
          "title": "Method"
        },
        "period_days": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Period Days"
        },
        "parts": {
          "description": "Per-period amounts when the rate changed.",
          "items": {
            "$ref": "#/$defs/InterestPart"
          },
          "title": "Parts",
          "type": "array"
        },
        "amount_usd": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Amount Usd"
        },
        "citation": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Citation"
        },
        "formula": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The source's formula, in words.",
          "title": "Formula"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Note"
        }
      },
      "required": [
        "required"
      ],
      "title": "Interest",
      "type": "object"
    },
    "InterestPart": {
      "description": "One period of an interest computation at one rate (a year, a rate window).",
      "properties": {
        "period_from": {
          "format": "date",
          "title": "Period From",
          "type": "string"
        },
        "period_to": {
          "format": "date",
          "title": "Period To",
          "type": "string"
        },
        "rate_percent": {
          "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
          "title": "Rate Percent",
          "type": "string"
        },
        "amount_usd": {
          "title": "Amount Usd",
          "type": "string"
        }
      },
      "required": [
        "period_from",
        "period_to",
        "rate_percent",
        "amount_usd"
      ],
      "title": "InterestPart",
      "type": "object"
    },
    "JurisdictionRef": {
      "properties": {
        "state": {
          "title": "State",
          "type": "string"
        },
        "state_name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "State Name"
        },
        "city": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The city you sent, as given.",
          "title": "City"
        },
        "city_overlay": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The covered city whose rules were layered on, if any.",
          "title": "City Overlay"
        },
        "covered": {
          "title": "Covered",
          "type": "boolean"
        },
        "verified": {
          "description": "True when the main rule text was read verbatim at the official source.",
          "title": "Verified",
          "type": "boolean"
        }
      },
      "required": [
        "state",
        "covered",
        "verified"
      ],
      "title": "JurisdictionRef",
      "type": "object"
    },
    "Note": {
      "properties": {
        "code": {
          "title": "Code",
          "type": "string"
        },
        "text": {
          "title": "Text",
          "type": "string"
        }
      },
      "required": [
        "code",
        "text"
      ],
      "title": "Note",
      "type": "object"
    },
    "PenaltyExposure": {
      "properties": {
        "applies_if": {
          "title": "Applies If",
          "type": "string"
        },
        "kind": {
          "title": "Kind",
          "type": "string"
        },
        "multiple": {
          "anyOf": [
            {
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Multiple"
        },
        "fixed_usd": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Fixed Usd"
        },
        "minimum_usd": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Floor of the multiple.",
          "title": "Minimum Usd"
        },
        "per_violation": {
          "default": false,
          "description": "fixed_usd is per violation.",
          "title": "Per Violation",
          "type": "boolean"
        },
        "in_addition_to_refund": {
          "default": false,
          "description": "The damages come on top of returning the amount withheld (Ohio, West Virginia), not instead of it.",
          "title": "In Addition To Refund",
          "type": "boolean"
        },
        "basis": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Basis"
        },
        "discretionary": {
          "title": "Discretionary",
          "type": "boolean"
        },
        "plus_attorney_fees": {
          "title": "Plus Attorney Fees",
          "type": "boolean"
        },
        "estimated_max_usd": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "fixed + multiple x basis amount (with any floor or cap); exposure, not a verdict. None when the basis is unknown (monthly rent not given).",
          "title": "Estimated Max Usd"
        },
        "forfeits_right_to_withhold": {
          "title": "Forfeits Right To Withhold",
          "type": "boolean"
        },
        "citation": {
          "title": "Citation",
          "type": "string"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Note"
        },
        "additional": {
          "description": "City penalties in addition to the state's (not included in its estimate).",
          "items": {
            "$ref": "#/$defs/PenaltyExposure"
          },
          "title": "Additional",
          "type": "array"
        }
      },
      "required": [
        "applies_if",
        "kind",
        "discretionary",
        "plus_attorney_fees",
        "forfeits_right_to_withhold",
        "citation"
      ],
      "title": "PenaltyExposure",
      "type": "object"
    },
    "Provenance": {
      "properties": {
        "ruleset_id": {
          "title": "Ruleset Id",
          "type": "string"
        },
        "ruleset_version": {
          "title": "Ruleset Version",
          "type": "string"
        },
        "ruleset_hash": {
          "title": "Ruleset Hash",
          "type": "string"
        },
        "rule_ids": {
          "items": {
            "type": "string"
          },
          "title": "Rule Ids",
          "type": "array"
        },
        "sources": {
          "items": {
            "type": "string"
          },
          "title": "Sources",
          "type": "array"
        }
      },
      "required": [
        "ruleset_id",
        "ruleset_version",
        "ruleset_hash"
      ],
      "title": "Provenance",
      "type": "object"
    },
    "Statement": {
      "properties": {
        "lines": {
          "items": {
            "$ref": "#/$defs/StatementLine"
          },
          "title": "Lines",
          "type": "array"
        },
        "refund_due_usd": {
          "title": "Refund Due Usd",
          "type": "string"
        },
        "due_by": {
          "anyOf": [
            {
              "format": "date",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Due By"
        },
        "text": {
          "description": "Draft itemized statement, plain text, no names or addresses.",
          "title": "Text",
          "type": "string"
        }
      },
      "required": [
        "lines",
        "refund_due_usd",
        "text"
      ],
      "title": "Statement",
      "type": "object"
    },
    "StatementLine": {
      "properties": {
        "label": {
          "title": "Label",
          "type": "string"
        },
        "amount_usd": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Amount Usd"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Note"
        }
      },
      "required": [
        "label"
      ],
      "title": "StatementLine",
      "type": "object"
    },
    "Totals": {
      "properties": {
        "deposit_usd": {
          "title": "Deposit Usd",
          "type": "string"
        },
        "claimed_usd": {
          "title": "Claimed Usd",
          "type": "string"
        },
        "allowed_usd": {
          "description": "Sum of lines with allowed = yes.",
          "title": "Allowed Usd",
          "type": "string"
        },
        "interest_usd": {
          "description": "Interest credited (0 when none or unknown).",
          "title": "Interest Usd",
          "type": "string"
        },
        "refund_due_usd": {
          "description": "deposit + interest - allowed, never below 0.",
          "title": "Refund Due Usd",
          "type": "string"
        },
        "tenant_owes_usd": {
          "description": "Allowed deductions above deposit + interest (collect separately).",
          "title": "Tenant Owes Usd",
          "type": "string"
        }
      },
      "required": [
        "deposit_usd",
        "claimed_usd",
        "allowed_usd",
        "interest_usd",
        "refund_due_usd",
        "tenant_owes_usd"
      ],
      "title": "Totals",
      "type": "object"
    }
  },
  "properties": {
    "summary": {
      "title": "Summary",
      "type": "string"
    },
    "disclaimer": {
      "title": "Disclaimer",
      "type": "string"
    },
    "jurisdiction": {
      "$ref": "#/$defs/JurisdictionRef"
    },
    "as_of": {
      "format": "date",
      "title": "As Of",
      "type": "string"
    },
    "deadline": {
      "anyOf": [
        {
          "$ref": "#/$defs/Deadline"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    },
    "deductions": {
      "items": {
        "$ref": "#/$defs/DeductionResult"
      },
      "title": "Deductions",
      "type": "array"
    },
    "totals": {
      "$ref": "#/$defs/Totals"
    },
    "interest": {
      "$ref": "#/$defs/Interest"
    },
    "documentation": {
      "items": {
        "$ref": "#/$defs/DocumentationDuty"
      },
      "title": "Documentation",
      "type": "array"
    },
    "penalty_exposure": {
      "anyOf": [
        {
          "$ref": "#/$defs/PenaltyExposure"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    },
    "deposit_cap": {
      "anyOf": [
        {
          "$ref": "#/$defs/DepositCapCheck"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    },
    "statement": {
      "anyOf": [
        {
          "$ref": "#/$defs/Statement"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    },
    "citations": {
      "items": {
        "$ref": "#/$defs/Citation"
      },
      "title": "Citations",
      "type": "array"
    },
    "warnings": {
      "items": {
        "$ref": "#/$defs/Note"
      },
      "title": "Warnings",
      "type": "array"
    },
    "assumptions": {
      "items": {
        "$ref": "#/$defs/Note"
      },
      "title": "Assumptions",
      "type": "array"
    },
    "unknowns": {
      "items": {
        "$ref": "#/$defs/Note"
      },
      "title": "Unknowns",
      "type": "array"
    },
    "provenance": {
      "$ref": "#/$defs/Provenance"
    }
  },
  "required": [
    "summary",
    "disclaimer",
    "jurisdiction",
    "as_of",
    "totals",
    "interest",
    "provenance"
  ],
  "title": "SettleResult",
  "type": "object"
}
ruleskind: deterministic, limits: 30/min · not counted, price per call: Free

Security deposit rules for a state (and city). The security deposit rules for one US state, with a covered city's overlay: return deadline and what starts it, itemization and documentation duties, allowed deductions and depreciation, interest, penalty, deposit cap and recent changes, with citations.

Use it when: Someone asks what a state's (or a covered city's) security deposit rules are without a specific move-out to settle, or which states are covered.

Not for: To settle a specific deposit (use deposit_settlement_settle, which applies the rules to the dates and deductions). Other landlord-tenant topics (evictions, rent control, notice periods) are not covered.

REST
POST /v1/deposit-settlement/rules
MCP tool
deposit_settlement_rules
Schemas
input · output
Limits
30/min · not counted
Price per call
Free
Example request (curl)
curl -sS 'https://tektolo.com/v1/deposit-settlement/rules' \
  -H 'content-type: application/json' \
  -d '{
  "state": "IL",
  "city": "Chicago"
}'
Example response

Long lists are cut to their first items here.

{
  "run": {
    "id": "run_f3ec827d805e474c90955b67e1465d66",
    "capability": "deposit-settlement",
    "operation": "rules",
    "contract_version": "0.1.0",
    "engine_version": "0.1.0",
    "ruleset_version": "sd-2026.10.1",
    "ruleset_hash": "sha256:3777ac89e2a1b9400e9abf225feca8733c14c19cdecf5740e24a00faf4631cd8",
    "received_at": "2026-10-09T19:11:25.551825Z",
    "duration_ms": 0
  },
  "client_refs": {},
  "input_hash": "sha256:85ba44086ff9d1189f896f55bd0db85b63cca62a4cd4662347a8feed53ec2e23",
  "result_hash": "sha256:da2a72dc56ed40655e487a451ed53eb765e8b44d7d1ed49ef7ab87e36b90a098",
  "result": {
    "summary": "Illinois (Chicago): return the deposit within 45 calendar days of the day the tenant vacated. Interest: conditional. Penalty if the rule is not followed (no bad faith needed): 2x the deposit. (765 ILCS 710 (Security Deposit Return Act); 765...",
    "disclaimer": "Computes the published rule and cites it; it is not legal advice. You sign the statement: check the statute, your lease and any local ordinance before you rely on it.",
    "jurisdiction": {
      "state": "IL",
      "state_name": "Illinois",
      "city": "Chicago",
      "city_overlay": "Chicago",
      "covered": true,
      "verified": true
    },
    "rules": {
      "statute": "765 ILCS 710 (Security Deposit Return Act); 765 ILCS 715 (Security Deposit Interest Act)",
      "return_rule": {
        "days": 30,
        "months": null,
        "counting": "calendar",
        "holidays": "federal",
        "start": "later_of_vacate_and_termination",
        "start_note": "Itemized statement with paid receipts within 30 days of vacating or the end of the right of possession, whichever is later; delivered personally, by postmarked mail, or to a verified email. If no statement and receipts, the full deposit is ...",
        "alternatives": [
          {
            "condition": "no_deductions",
            "requires": [],
            "days": 45,
            "months": null,
            "start": "vacate",
            "counting": null,
            "combine": "replace",
            "effective_before": null,
            "effective_on_or_after": null,
            "note": "No itemized statement furnished: return the deposit in full within 45 days of the date the lessee vacated."
          }
        ],
        "gate": null,
        "gate_restarts": true,
        "rollover": false,
        "rollover_source": null
      },
      "itemization": {
        "required": true,
        "with_refund": true,
        "days": null,
        "months": null,
        "start": null,
        "effective_on": null,
        "receipts": {
          "required": true,
          "threshold_usd": null,
          "note": "Paid receipts or copies attached for each repair or replacement; if estimates are given, receipts within 30 days after the statement; own labor at reasonable cost; verified statement if receipts unobtainable through no fault of the lessor."
        },
        "photos": {
          "required": false,
          "note": null,
          "effective_on": null,
          "kinds": [
            "move_out",
            "after_repair"
          ]
        },
        "note": null
      },
      "deductions": {
        "normal_wear_excluded": true,
        "allowed": [
          "unpaid_rent",
          "damage_beyond_wear",
          "... 1 more"
        ],
        "allowed_detail": [
          "unpaid_rent",
          "damage_beyond_wear",
          "... 1 more"
        ],
        "depreciation": "none",
        "depreciation_only": [],
        "depreciation_note": "No proration formula. A written lease may specify reasonable costs for cleaning, repair or replacement of components (beyond normal wear); the statement must cite the amount and attach that lease portion.",
        "note": null
      },
      "interest": {
        "required": "conditional",
        "condition": "25 or more units in one building or contiguous complex, deposit held six months or more; not public housing.",
        "min_units": 25,
        "min_tenancy_days": null,
        "min_tenancy_months": 6,
        "min_tenancy_strict": false,
        "min_deposit_usd": null,
        "rate": "bank_rate",
        "rate_value": null,
        "rate_year": null,
        "rate_schedule": [],
        "method": "simple",
        "formula": null,
        "base": "deposit",
        "payable": "annually",
        "note": "Rate is what the largest Illinois commercial bank paid on minimum-deposit passbook savings on December 31 before the lease began. Paid within 30 days after each 12-month period if $5 or more (cash or rent credit), all unpaid interest at ter..."
      },
      "penalty": {
        "kind": "multiple",
        "multiple": "2",
        "fixed_usd": null,
        "minimum_usd": null,
        "max_months_rent": null,
        "per_violation": false,
        "multiple_is_additional": false,
        "basis": "deposit",
        "condition": "bad_faith",
        "discretionary": false,
        "plus_attorney_fees": true,
        "forfeits_right_to_withhold_if_late": false,
        "note": "On a court finding that the lessor refused to supply the statement or supplied it in bad faith and failed to return the amount due in time: twice the security deposit due plus court costs and reasonable attorney's fees (710/1(c))."
      },
      "deposit_cap_months_rent": null,
      "deposit_cap": {
        "months_rent": null,
        "minimum_usd": null,
        "variants": null,
        "note": "No statewide cap.",
        "source": "il.ilcs-765-710"
      },
      "recent_changes": [
        {
          "effective_on": "2024-01-01",
          "text": "P.A. 103-224: Return Act now covers all residential lessors (5-or-more-unit limit removed); email delivery to a verified address.",
          "source": "il.pa-103-0224"
        }
      ],
      "applicability": "Before 2024-01-01 the Security Deposit Return Act covered only lessors of buildings with 5 or more units; P.A. 103-224 removed the limit.",
      "notes": [
        "Interest Act still applies only to 25+ unit properties; the Return Act no longer has a unit threshold since 2024-01-01.",
        "Chicago's RLTO overlays different rules (city overlay)."
      ]
    },
    "city_overlay": {
      "id": "chicago",
      "name": "Chicago",
      "state": "IL",
      "return_rule": {
        "days": 45,
        "months": null,
        "counting": "calendar",
        "holidays": "federal",
        "start": "vacate",
        "start_note": "Refund (deposit + interest - unpaid rent - damages) within 45 days of vacating. In the event of fire, within 7 days of the tenant's notice of termination (5-12-110(g)).",
        "alternatives": [],
        "gate": null,
        "gate_restarts": true,
        "rollover": false,
        "rollover_source": null
      },
      "interest": {
        "required": "conditional",
        "condition": "Deposit (or prepaid rent) held more than six months, in a unit covered by the RLTO (not owner-occupied buildings of six or fewer units, among other exclusions).",
        "min_units": null,
        "min_tenancy_days": null,
        "min_tenancy_months": 6,
        "min_tenancy_strict": true,
        "min_deposit_usd": null,
        "rate": "fixed_percent",
        "rate_value": "0.01",
        "rate_year": null,
        "rate_schedule": [
          {
            "from_": "2026-01-01",
            "to": "2026-12-31",
            "rate_value": "0.01",
            "source": "chicago.deposit-interest-2026",
            "note": null
          }
        ],
        "method": "simple",
        "formula": null,
        "base": "deposit",
        "payable": "annually",
        "note": "Rate set each year by the City Comptroller (announced the first business day of the year); 0.01% for 1 Jan - 31 Dec 2026. Paid each year by cash or rent credit."
      },
      "penalty": {
        "kind": "multiple",
        "multiple": "2",
        "fixed_usd": null,
        "minimum_usd": null,
        "max_months_rent": null,
        "per_violation": false,
        "multiple_is_additional": false,
        "basis": "deposit",
        "condition": "any_violation",
        "discretionary": false,
        "plus_attorney_fees": true,
        "forfeits_right_to_withhold_if_late": false,
        "note": "If the landlord fails to comply with the specified deposit requirements the tenant is awarded two times the security deposit plus interest (subject to curing a deficient interest payment). Prevailing plaintiff recovers court costs and reaso..."
      },
      "itemization": {
        "required": true,
        "with_refund": false,
        "days": 30,
        "months": null,
        "start": "vacate",
        "effective_on": null,
        "receipts": {
          "required": true,
          "threshold_usd": null,
          "note": "Itemized statement of damages within 30 days of vacating, with estimated or actual cost, attaching copies of the paid receipts for the repair or replacement."
        },
        "photos": null,
        "note": null
      },
      "deductions": null,
      "deposit_cap": null,
      "additional_penalty": null,
      "depreciation_schedule": null,
      "applicability": "RLTO does not cover units in owner-occupied buildings with six or fewer units, most hotel/rooming units, dorms, owner-occupied co-ops and condos, employee housing (5-12-010, 5-12-020 per the City summary).",
      "notes": [
        "The 2026 rider states the rate is the average of Chase savings, money market and 6-month CD rates (all 0.01%)."
      ]
    },
    "citations": [
      {
        "rule": "deadline",
        "section": "765 ILCS 710/1(a)",
        "quote": "... may not withhold any part of that deposit as reimbursement for property damage unless the lessor has, within 30 days of the date that the lessee vacated the leased premises or within 30 days of the date the lessee's right of possession ...",
        "verbatim": true,
        "url": "https://www.ilga.gov/legislation/ilcs/ilcs3.asp?ActID=2202&ChapterID=62",
        "source_title": "Security Deposit Return Act, 765 ILCS 710",
        "accessed": "2026-10-09"
      },
      {
        "rule": "penalty",
        "section": "Chicago Mun. Code 5-12-080 (City of Chicago RLTO Summary)",
        "quote": "If the landlord fails to comply with the specified deposit requirements the tenant is awarded two times the security deposit plus interest (subject to curing a deficient interest payment). Prevailing plaintiff recovers court costs and reaso...",
        "verbatim": false,
        "url": "https://www.chicago.gov/content/dam/city/depts/doh/RLTO/RLTO%20Summary_2023_EN_FINAL.pdf",
        "source_title": "City of Chicago, Residential Landlord and Tenant Ordinance Summary (2023, English)",
        "accessed": "2026-10-09"
      },
      "... 4 more"
    ],
    "covered_states": [
      "AK",
      "AL",
      "... 49 more"
    ],
    "covered_cities": [
      "Chicago, IL"
    ],
    "warnings": [],
    "research_notes": [
      "Chicago: The ordinance text itself (amlegal.com) blocked fetching (403); quotes come from the City's official RLTO Summary and the 2026 interest-rate lease rider."
    ],
    "provenance": {
      "ruleset_id": "deposit-settlement",
      "ruleset_version": "sd-2026.10.1",
      "ruleset_hash": "sha256:3777ac89e2a1b9400e9abf225feca8733c14c19cdecf5740e24a00faf4631cd8",
      "rule_ids": [
        "IL",
        "chicago"
      ],
      "sources": [
        "il.ilcs-765-710",
        "il.ilcs-765-715",
        "... 3 more"
      ]
    }
  }
}
Schemas

Input

{
  "additionalProperties": false,
  "properties": {
    "state": {
      "description": "US state, 2-letter code or name (e.g. 'TX').",
      "maxLength": 20,
      "minLength": 2,
      "title": "State",
      "type": "string"
    },
    "city": {
      "anyOf": [
        {
          "maxLength": 80,
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional city for its overlay (e.g. 'Chicago').",
      "title": "City"
    }
  },
  "required": [
    "state"
  ],
  "title": "RulesRequest",
  "type": "object"
}

Output

{
  "$defs": {
    "Alternative": {
      "additionalProperties": false,
      "description": "A different deadline when a condition holds (e.g. 14 days when nothing is deducted).\n\n``condition`` is the statute's case in words. The engine evaluates it when ``requires``\nlists mapped conditions, when the condition itself is one (``no_deductions``), or when an\neffective-date window is the whole condition; any other alternative keeps the base rule and\nadds an assumption naming it. ``combine`` says how a matching alternative applies:\n``replace`` the base period (the first match wins), or take the ``later_date`` /\n``earlier_date`` of the base deadline and this one (Connecticut: 21 days after the end of\nthe tenancy or 15 days after the forwarding address, whichever is later).",
      "properties": {
        "condition": {
          "title": "Condition",
          "type": "string"
        },
        "requires": {
          "default": [],
          "items": {
            "enum": [
              "no_deductions",
              "with_deductions",
              "damage_deductions",
              "no_damage_deductions",
              "lease_specifies_longer",
              "lease_specifies_shorter",
              "tenant_gave_notice",
              "contractor_needed"
            ],
            "type": "string"
          },
          "title": "Requires",
          "type": "array"
        },
        "days": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Days"
        },
        "months": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Months"
        },
        "start": {
          "anyOf": [
            {
              "enum": [
                "vacate",
                "termination",
                "later_of_vacate_and_termination",
                "forwarding_address",
                "demand",
                "later_of_termination_and_address",
                "latest_of_termination_possession_and_address",
                "earlier_of_termination_and_surrender",
                "surrender_or_termination_first",
                "new_tenant_occupancy",
                "termination_possession_and_demand",
                "claim_notice"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Start"
        },
        "counting": {
          "anyOf": [
            {
              "enum": [
                "calendar",
                "business"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Counting"
        },
        "combine": {
          "default": "replace",
          "enum": [
            "replace",
            "later_date",
            "earlier_date"
          ],
          "title": "Combine",
          "type": "string"
        },
        "effective_before": {
          "anyOf": [
            {
              "format": "date",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Effective Before"
        },
        "effective_on_or_after": {
          "anyOf": [
            {
              "format": "date",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Effective On Or After"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Note"
        }
      },
      "required": [
        "condition"
      ],
      "title": "Alternative",
      "type": "object"
    },
    "Change": {
      "additionalProperties": false,
      "properties": {
        "effective_on": {
          "anyOf": [
            {
              "format": "date",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Effective On"
        },
        "text": {
          "title": "Text",
          "type": "string"
        },
        "source": {
          "title": "Source",
          "type": "string"
        }
      },
      "required": [
        "text",
        "source"
      ],
      "title": "Change",
      "type": "object"
    },
    "Citation": {
      "properties": {
        "rule": {
          "description": "What the citation supports: deadline, interest, penalty, ...",
          "title": "Rule",
          "type": "string"
        },
        "section": {
          "title": "Section",
          "type": "string"
        },
        "quote": {
          "description": "Short quote of the rule (or our summary when verbatim is false).",
          "title": "Quote",
          "type": "string"
        },
        "verbatim": {
          "default": true,
          "title": "Verbatim",
          "type": "boolean"
        },
        "url": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Url"
        },
        "source_title": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Source Title"
        },
        "accessed": {
          "anyOf": [
            {
              "format": "date",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Accessed"
        }
      },
      "required": [
        "rule",
        "section",
        "quote"
      ],
      "title": "Citation",
      "type": "object"
    },
    "CityRules": {
      "properties": {
        "id": {
          "title": "Id",
          "type": "string"
        },
        "name": {
          "title": "Name",
          "type": "string"
        },
        "state": {
          "title": "State",
          "type": "string"
        },
        "return_rule": {
          "anyOf": [
            {
              "$ref": "#/$defs/ReturnRule"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "interest": {
          "anyOf": [
            {
              "$ref": "#/$defs/InterestRule"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "penalty": {
          "anyOf": [
            {
              "$ref": "#/$defs/PenaltyRule"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "itemization": {
          "anyOf": [
            {
              "$ref": "#/$defs/Itemization"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "deductions": {
          "anyOf": [
            {
              "$ref": "#/$defs/DeductionRules"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "deposit_cap": {
          "anyOf": [
            {
              "$ref": "#/$defs/DepositCap"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "additional_penalty": {
          "anyOf": [
            {
              "$ref": "#/$defs/PenaltyRule"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "depreciation_schedule": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Depreciation Schedule"
        },
        "applicability": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Applicability"
        },
        "notes": {
          "items": {
            "type": "string"
          },
          "title": "Notes",
          "type": "array"
        }
      },
      "required": [
        "id",
        "name",
        "state"
      ],
      "title": "CityRules",
      "type": "object"
    },
    "DeductionRules": {
      "additionalProperties": false,
      "properties": {
        "normal_wear_excluded": {
          "default": true,
          "title": "Normal Wear Excluded",
          "type": "boolean"
        },
        "allowed": {
          "default": [],
          "items": {
            "enum": [
              "unpaid_rent",
              "unpaid_utilities",
              "late_fees",
              "lease_break_fee",
              "cleaning_to_move_in_condition",
              "damage_beyond_wear",
              "future_defaults_under_lease",
              "other_lease_obligations",
              "moving_and_storage",
              "real_estate_tax_increase"
            ],
            "type": "string"
          },
          "title": "Allowed",
          "type": "array"
        },
        "allowed_detail": {
          "default": [],
          "items": {
            "type": "string"
          },
          "title": "Allowed Detail",
          "type": "array"
        },
        "depreciation": {
          "default": "none",
          "enum": [
            "required",
            "guidance",
            "none"
          ],
          "title": "Depreciation",
          "type": "string"
        },
        "depreciation_only": {
          "default": [],
          "items": {
            "enum": [
              "unpaid_rent",
              "unpaid_utilities",
              "cleaning",
              "carpet",
              "flooring",
              "paint",
              "blinds_window_coverings",
              "appliance",
              "fixture_or_hardware",
              "wall_or_door_repair",
              "key_or_lock",
              "late_fees",
              "lease_break_fee",
              "other_damage",
              "other"
            ],
            "type": "string"
          },
          "title": "Depreciation Only",
          "type": "array"
        },
        "depreciation_note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Depreciation Note"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Note"
        }
      },
      "title": "DeductionRules",
      "type": "object"
    },
    "DepositCap": {
      "additionalProperties": false,
      "properties": {
        "months_rent": {
          "anyOf": [
            {
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Months Rent"
        },
        "minimum_usd": {
          "anyOf": [
            {
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Minimum Usd"
        },
        "variants": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Variants"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Note"
        },
        "source": {
          "title": "Source",
          "type": "string"
        }
      },
      "required": [
        "source"
      ],
      "title": "DepositCap",
      "type": "object"
    },
    "InterestRule": {
      "additionalProperties": false,
      "properties": {
        "required": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "const": "conditional",
              "type": "string"
            }
          ],
          "title": "Required"
        },
        "condition": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Condition"
        },
        "min_units": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Min Units"
        },
        "min_tenancy_days": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Min Tenancy Days"
        },
        "min_tenancy_months": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Min Tenancy Months"
        },
        "min_tenancy_strict": {
          "default": false,
          "title": "Min Tenancy Strict",
          "type": "boolean"
        },
        "min_deposit_usd": {
          "anyOf": [
            {
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Min Deposit Usd"
        },
        "rate": {
          "anyOf": [
            {
              "enum": [
                "fixed_percent",
                "statutory_index",
                "bank_rate"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Rate"
        },
        "rate_value": {
          "anyOf": [
            {
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Rate Value"
        },
        "rate_year": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Rate Year"
        },
        "rate_schedule": {
          "default": [],
          "items": {
            "$ref": "#/$defs/RateWindow"
          },
          "title": "Rate Schedule",
          "type": "array"
        },
        "method": {
          "default": "simple",
          "enum": [
            "simple",
            "per_window",
            "anniversary_years",
            "monthly"
          ],
          "title": "Method",
          "type": "string"
        },
        "formula": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Formula"
        },
        "base": {
          "default": "deposit",
          "enum": [
            "deposit",
            "excess_over_max_50_or_month"
          ],
          "title": "Base",
          "type": "string"
        },
        "payable": {
          "anyOf": [
            {
              "enum": [
                "annually",
                "at_end"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Payable"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Note"
        }
      },
      "required": [
        "required"
      ],
      "title": "InterestRule",
      "type": "object"
    },
    "Itemization": {
      "additionalProperties": false,
      "properties": {
        "required": {
          "default": true,
          "title": "Required",
          "type": "boolean"
        },
        "with_refund": {
          "default": true,
          "title": "With Refund",
          "type": "boolean"
        },
        "days": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Days"
        },
        "months": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Months"
        },
        "start": {
          "anyOf": [
            {
              "enum": [
                "vacate",
                "termination",
                "later_of_vacate_and_termination",
                "forwarding_address",
                "demand",
                "later_of_termination_and_address",
                "latest_of_termination_possession_and_address",
                "earlier_of_termination_and_surrender",
                "surrender_or_termination_first",
                "new_tenant_occupancy",
                "termination_possession_and_demand",
                "claim_notice"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Start"
        },
        "effective_on": {
          "anyOf": [
            {
              "format": "date",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Effective On"
        },
        "receipts": {
          "anyOf": [
            {
              "$ref": "#/$defs/Receipts"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "photos": {
          "anyOf": [
            {
              "$ref": "#/$defs/Photos"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Note"
        }
      },
      "title": "Itemization",
      "type": "object"
    },
    "JurisdictionRef": {
      "properties": {
        "state": {
          "title": "State",
          "type": "string"
        },
        "state_name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "State Name"
        },
        "city": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The city you sent, as given.",
          "title": "City"
        },
        "city_overlay": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The covered city whose rules were layered on, if any.",
          "title": "City Overlay"
        },
        "covered": {
          "title": "Covered",
          "type": "boolean"
        },
        "verified": {
          "description": "True when the main rule text was read verbatim at the official source.",
          "title": "Verified",
          "type": "boolean"
        }
      },
      "required": [
        "state",
        "covered",
        "verified"
      ],
      "title": "JurisdictionRef",
      "type": "object"
    },
    "Note": {
      "properties": {
        "code": {
          "title": "Code",
          "type": "string"
        },
        "text": {
          "title": "Text",
          "type": "string"
        }
      },
      "required": [
        "code",
        "text"
      ],
      "title": "Note",
      "type": "object"
    },
    "PenaltyRule": {
      "additionalProperties": false,
      "properties": {
        "kind": {
          "enum": [
            "multiple",
            "fixed",
            "actual_only",
            "forfeiture_only"
          ],
          "title": "Kind",
          "type": "string"
        },
        "multiple": {
          "anyOf": [
            {
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Multiple"
        },
        "fixed_usd": {
          "anyOf": [
            {
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Fixed Usd"
        },
        "minimum_usd": {
          "anyOf": [
            {
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Minimum Usd"
        },
        "max_months_rent": {
          "anyOf": [
            {
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Max Months Rent"
        },
        "per_violation": {
          "default": false,
          "title": "Per Violation",
          "type": "boolean"
        },
        "multiple_is_additional": {
          "default": false,
          "title": "Multiple Is Additional",
          "type": "boolean"
        },
        "basis": {
          "anyOf": [
            {
              "enum": [
                "deposit",
                "amount_withheld",
                "monthly_rent"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Basis"
        },
        "condition": {
          "enum": [
            "bad_faith",
            "willful",
            "any_late",
            "late",
            "any_violation",
            "without_reasonable_basis",
            "court_discretion"
          ],
          "title": "Condition",
          "type": "string"
        },
        "discretionary": {
          "default": false,
          "title": "Discretionary",
          "type": "boolean"
        },
        "plus_attorney_fees": {
          "default": false,
          "title": "Plus Attorney Fees",
          "type": "boolean"
        },
        "forfeits_right_to_withhold_if_late": {
          "default": false,
          "title": "Forfeits Right To Withhold If Late",
          "type": "boolean"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Note"
        }
      },
      "required": [
        "kind",
        "condition"
      ],
      "title": "PenaltyRule",
      "type": "object"
    },
    "Photos": {
      "additionalProperties": false,
      "properties": {
        "required": {
          "title": "Required",
          "type": "boolean"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Note"
        },
        "effective_on": {
          "anyOf": [
            {
              "format": "date",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Effective On"
        },
        "kinds": {
          "default": [
            "move_out",
            "after_repair"
          ],
          "items": {
            "enum": [
              "move_in",
              "move_out",
              "after_repair"
            ],
            "type": "string"
          },
          "title": "Kinds",
          "type": "array"
        }
      },
      "required": [
        "required"
      ],
      "title": "Photos",
      "type": "object"
    },
    "Provenance": {
      "properties": {
        "ruleset_id": {
          "title": "Ruleset Id",
          "type": "string"
        },
        "ruleset_version": {
          "title": "Ruleset Version",
          "type": "string"
        },
        "ruleset_hash": {
          "title": "Ruleset Hash",
          "type": "string"
        },
        "rule_ids": {
          "items": {
            "type": "string"
          },
          "title": "Rule Ids",
          "type": "array"
        },
        "sources": {
          "items": {
            "type": "string"
          },
          "title": "Sources",
          "type": "array"
        }
      },
      "required": [
        "ruleset_id",
        "ruleset_version",
        "ruleset_hash"
      ],
      "title": "Provenance",
      "type": "object"
    },
    "RateWindow": {
      "additionalProperties": false,
      "description": "A published rate for a period (San Francisco's March-February year, a Berkeley move-out\nmonth, a Connecticut calendar year).",
      "properties": {
        "from": {
          "format": "date",
          "title": "From",
          "type": "string"
        },
        "to": {
          "format": "date",
          "title": "To",
          "type": "string"
        },
        "rate_value": {
          "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
          "title": "Rate Value",
          "type": "string"
        },
        "source": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Source"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Note"
        }
      },
      "required": [
        "from",
        "to",
        "rate_value"
      ],
      "title": "RateWindow",
      "type": "object"
    },
    "Receipts": {
      "additionalProperties": false,
      "properties": {
        "required": {
          "title": "Required",
          "type": "boolean"
        },
        "threshold_usd": {
          "anyOf": [
            {
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Threshold Usd"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Note"
        }
      },
      "required": [
        "required"
      ],
      "title": "Receipts",
      "type": "object"
    },
    "ReturnRule": {
      "additionalProperties": false,
      "properties": {
        "days": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Days"
        },
        "months": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Months"
        },
        "counting": {
          "default": "calendar",
          "enum": [
            "calendar",
            "business"
          ],
          "title": "Counting",
          "type": "string"
        },
        "holidays": {
          "default": "federal",
          "enum": [
            "federal",
            "AZ",
            "CA",
            "NY",
            "TX"
          ],
          "title": "Holidays",
          "type": "string"
        },
        "start": {
          "default": "vacate",
          "enum": [
            "vacate",
            "termination",
            "later_of_vacate_and_termination",
            "forwarding_address",
            "demand",
            "later_of_termination_and_address",
            "latest_of_termination_possession_and_address",
            "earlier_of_termination_and_surrender",
            "surrender_or_termination_first",
            "new_tenant_occupancy",
            "termination_possession_and_demand",
            "claim_notice"
          ],
          "title": "Start",
          "type": "string"
        },
        "start_note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Start Note"
        },
        "alternatives": {
          "default": [],
          "items": {
            "$ref": "#/$defs/Alternative"
          },
          "title": "Alternatives",
          "type": "array"
        },
        "gate": {
          "anyOf": [
            {
              "const": "forwarding_address",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Gate"
        },
        "gate_restarts": {
          "default": true,
          "title": "Gate Restarts",
          "type": "boolean"
        },
        "rollover": {
          "default": false,
          "title": "Rollover",
          "type": "boolean"
        },
        "rollover_source": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Rollover Source"
        }
      },
      "title": "ReturnRule",
      "type": "object"
    },
    "StateRules": {
      "properties": {
        "statute": {
          "title": "Statute",
          "type": "string"
        },
        "return_rule": {
          "$ref": "#/$defs/ReturnRule"
        },
        "itemization": {
          "$ref": "#/$defs/Itemization"
        },
        "deductions": {
          "$ref": "#/$defs/DeductionRules"
        },
        "interest": {
          "$ref": "#/$defs/InterestRule"
        },
        "penalty": {
          "$ref": "#/$defs/PenaltyRule"
        },
        "deposit_cap_months_rent": {
          "anyOf": [
            {
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Deposit Cap Months Rent"
        },
        "deposit_cap": {
          "anyOf": [
            {
              "$ref": "#/$defs/DepositCap"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "recent_changes": {
          "items": {
            "$ref": "#/$defs/Change"
          },
          "title": "Recent Changes",
          "type": "array"
        },
        "applicability": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Applicability"
        },
        "notes": {
          "items": {
            "type": "string"
          },
          "title": "Notes",
          "type": "array"
        }
      },
      "required": [
        "statute",
        "return_rule",
        "itemization",
        "deductions",
        "interest",
        "penalty"
      ],
      "title": "StateRules",
      "type": "object"
    }
  },
  "properties": {
    "summary": {
      "title": "Summary",
      "type": "string"
    },
    "disclaimer": {
      "title": "Disclaimer",
      "type": "string"
    },
    "jurisdiction": {
      "$ref": "#/$defs/JurisdictionRef"
    },
    "rules": {
      "anyOf": [
        {
          "$ref": "#/$defs/StateRules"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    },
    "city_overlay": {
      "anyOf": [
        {
          "$ref": "#/$defs/CityRules"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    },
    "citations": {
      "items": {
        "$ref": "#/$defs/Citation"
      },
      "title": "Citations",
      "type": "array"
    },
    "covered_states": {
      "items": {
        "type": "string"
      },
      "title": "Covered States",
      "type": "array"
    },
    "covered_cities": {
      "description": "City overlays in this state ('Name, ST').",
      "items": {
        "type": "string"
      },
      "title": "Covered Cities",
      "type": "array"
    },
    "warnings": {
      "items": {
        "$ref": "#/$defs/Note"
      },
      "title": "Warnings",
      "type": "array"
    },
    "research_notes": {
      "description": "Research notes on the rows used: where the text was read, fetch failures, renumbering, history not checked. For checking the sourcing; not warnings.",
      "items": {
        "type": "string"
      },
      "title": "Research Notes",
      "type": "array"
    },
    "provenance": {
      "$ref": "#/$defs/Provenance"
    }
  },
  "required": [
    "summary",
    "disclaimer",
    "jurisdiction",
    "provenance"
  ],
  "title": "RulesResult",
  "type": "object"
}

Pricing and limits

  • Web tools: free to try.
  • AI assistants and API: 20 calls a day free per client, counted together, then $0.02 a call (the paid lane is in testing; the free tier applies meanwhile).
  • Volume and integrations: contact us.

Pricing

Limits are per client. MCP allows 240 calls a minute (hosted assistants share addresses). The daily free tier counts REST and MCP calls together and resets at midnight UTC; over it, REST answers 429 free_tier_exhausted and MCP a tool error, both naming the reset time and the paid route. Responses under it carry X-TK-Free-Remaining.

Accuracy and rules

  • Coverage: US (effective 2026-10-09 to now)
  • Determinism: strict
  • Contract version: 0.1.0 (experimental)
  • How it works: pipeline, counts, confidence mix and every source.
  • Ruleset: sd-2026.10.1, hash sha256:3777ac89e2a1b9400e9abf225feca8733c14c19cdecf5740e24a00faf4631cd8. Every result is stamped with these, so a result can be reproduced exactly.
Sources cited by the ruleset (185)

Limitations

  • Computes and cites the published rule; it is not legal advice. Check the statute, your lease and local ordinances before you sign the statement.
  • Covers the 50 states and DC and eight city overlays; other local ordinances are not applied (the result warns).
  • Several state rows were read on a mirror (FindLaw, public.law) rather than the official code site, and some quotes are summaries; each citation says which.
  • Useful lives come from HUD's chart and industry tables (carpet 8 years, 10 in California and Colorado; paint 3, 2 in California with the DRE guide's step table; blinds 3; appliances 10). Send your own with useful_life_years.
  • Penalty amounts are statutory exposure, not a prediction of what a court would award.
  • Some rule text is summarised rather than quoted; each citation says which.

Results are estimate ranges for planning, not quotes or professional advice. Read the full disclaimer.

Privacy

  • Estimates: We keep an anonymized record of estimates (ZIP3, unit size, findings and totals; never your notes, address, IP or contact details) to improve accuracy.
  • Retention: 0 days.
  • Used to train models: no
  • Personal data: Inputs are a state, a city, amounts, dates and deduction categories; no tenant name, address or unit number is asked for. Deduction descriptions are never stored, logged, hashed or returned. Requests are not stored and no per-settlement record is kept. Each call leaves only the standard usage log line (capability, status, duration, hashes, a daily-rotating anonymous fingerprint).

Have a task you wish a reliable tool handled? Tell us on the Contact page.