---
title: "Security deposit rules for a state (and city)"
method: POST
path: "/v1/deposit-settlement/rules"
tags: ["deposit-settlement"]
---

# Security deposit rules for a state (and city)

`POST /v1/deposit-settlement/rules`

## Request

- Base URL: `https://tektolo.com` (the document declares no server; this is the origin it was published from)
- URL: `https://tektolo.com/v1/deposit-settlement/rules`
- Auth: none declared

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.
When to use: 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.
Deterministic: the same input returns the same result_hash. Capability deposit-settlement v0.1.0 (experimental).

## Headers

- `Tektolo-Ruleset` string, nullable: Optional. The ruleset version you built against, as results carry it in provenance.ruleset_version (e.g. 'sd-2026.11.14'), or its sha256: hash. If the rules have changed since, the call fails (nothing computed, nothing charged) and says what is in force now, so you upgrade on your own schedule. Leave it out to answer under the current rules.
- `Tektolo-Ruleset-Mode` string, nullable: Optional, with Tektolo-Ruleset. 'serve' asks us to answer under the ruleset version you named even when the rules have changed since, from that version's signed bundle. The answer says so (run.served_from_bundle and the Tektolo-Ruleset-Served header). We refuse (412, with a reason) a version older than 12 months, one a later correction or law change replaced for your state, or one we have no bundle for. Leave it out to be refused whenever the rules have changed.

## Request body

- RulesRequest
  - `state` string, required: US state, 2-letter code or name (e.g. 'TX').
  - `city` string, nullable: Optional city for its overlay (e.g. 'Chicago').
  - `as_of` string, date, nullable: Optional date (YYYY-MM-DD): show the law in force on that day, for a past move-out the day the tenancy ended. Omitted: the current law.

## Response `200`

Successful Response

- DepositSettlementRulesResponse
  - `run` RunInfo, required
    - `id` string, required
    - `capability` string, required
    - `operation` string, required
    - `contract_version` string, required
    - `engine_version` string, required
    - `ruleset_version` string, nullable, required
    - `ruleset_hash` string, nullable, required
    - `received_at` string, date-time, required
    - `duration_ms` integer, required
  - `client_refs` object
  - `input_hash` string, required: Hash of the question the rules answered: the request, or when free text was read by AI, the request with the read findings (reading.findings) in its place.
  - `request_hash` string, nullable: Hash of the request as sent; equal to input_hash when nothing was read by AI.
  - `result_hash` string, required
  - `review` Review: How far the answer can be relied on.
    - `status` 'draft' | 'verified': draft: some findings were read by AI and nobody has confirmed them; show the person reading.findings before quoting a number. verified: no finding rests on an unconfirmed AI reading.
    - `ai_read` integer: Findings in this answer read by AI and not yet confirmed.
    - `reading_id` string, nullable: The reading's id, when one was made.
    - `note` string, nullable: Set when an AI reading was asked for but not made (capped or unavailable).
  - `reading` Reading: The findings software read from free text or a document for this answer. Send ``findings`` (edited if need be, each one checked marked ``confirmed: true``) to the rules operation to get a verified answer.
    - `id` string, required: rd_ and 24 hex characters; the same reading has the same id.
    - `kind` 'notes' | 'document', required
    - `model` string, nullable: The model that read it.
    - `prompt_version` string, nullable
    - `counts` ReadingCounts, required
      - `total` integer, required: Findings in the reading.
      - `ai` integer, required: Findings the AI model read (they carry extraction).
      - `parser` integer, required: Findings the deterministic parser and matcher placed, or sent coded.
      - `unmatched` integer, required: Findings nothing could match (manual-quote lines).
    - `findings` object[], required: Every finding the rules answered, in the shape the rules operation accepts.
    - `notes` ReadingNote[]: What the reading noticed while reading the text.
      - `kind` 'warning' | 'assumption', required
      - `code` string, required
      - `message` string, required
      - `finding_ids` string[]
  - `signature` ResultSignature: Tektolo's signature over where this result came from (docs/verify.md).
    - `jws` string, required: Compact JWS (RFC 7515), alg EdDSA (Ed25519, RFC 8037), typ tektolo-provenance+jws. Check it against the keys at /.well-known/tektolo-signing-keys.json on the site you called, never against a key a document points to.
    - `payload` ResultSignaturePayload, required: The signed statement (the JWS payload, decoded). Canonical JSON: sorted keys, compact.
      - `v` integer, required: Payload format version (1).
      - `kid` string, required: Id of the key that signed it (see the signing keys file).
      - `capability` string, required
      - `operation` string, required
      - `ruleset_version` string, nullable, required
      - `ruleset_hash` string, nullable, required
      - `engine_version` string, required
      - `result_hash` string, required: The envelope's result_hash.
      - `issued_at` string, required: When the result was computed (UTC, RFC 3339).
    - `verify_code` string, required: A short code that proves the result came from Tektolo without carrying its figures. Safe to print on a document; the payload above is not meant to be shared.
    - `verify_url` string, required: Where anyone can check the code.
  - `result` RulesResult, required
    - `summary` string, required
    - `disclaimer` string, required
    - `jurisdiction` JurisdictionRef, required
      - `state` string, required
      - `state_name` string, nullable
      - `city` string, nullable: The city you sent, as given.
      - `city_overlay` string, nullable: The covered city whose rules were layered on, if any.
      - `covered` boolean, required
      - `verified` boolean, required: True when the main rule text was read verbatim at the official source and, when a city was given, the city's own rules are covered.
      - `city_rules_checked` boolean, nullable: True: the city's overlay was applied; false: the city you gave is not covered, so only the state rule is shown (a local ordinance may be stricter); null: no city given.
    - `rules` StateRules
      - `statute` string, required
      - `return_rule` ReturnRule, required
        - `days` integer, nullable
        - `months` integer, nullable
        - `counting` 'calendar' | 'business'
        - `holidays` 'federal' | 'AZ' | 'CA' | 'NY' | 'TX'
        - `start` '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'
        - `start_note` string, nullable
        - `demand_in_writing` boolean
        - `alternatives` Alternative[]
          - `condition` string, required
          - `requires` string[]
          - `days` integer, nullable
          - `months` integer, nullable
          - `start` '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', nullable
          - `counting` 'calendar' | 'business', nullable
          - `combine` 'replace' | 'later_date' | 'earlier_date' | 'extend'
          - `extends` 'deadline' | 'itemization'
          - `notice_within_days` integer, nullable
          - `pending` 'not_started' | 'notice_date'
          - `effective_before` string, date, nullable
          - `effective_on_or_after` string, date, nullable
          - `effective_by` 'termination' | 'conduct'
          - `note` string, nullable
          - `listed_if` string, nullable
        - `fallback` Fallback: A second date for the full refund when the statement is not given in time or none is needed (Illinois 710/1(a): no statement for property damage within 30 days: the deposit in full within 45 days of vacating; a rent-only withholding needs no statement). The statement's own date stays ``itemization_by``.
          - `days` integer, required
          - `start` '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'
          - `section` string, required
          - `note` string, nullable
        - `not_if_abandoned` NotIfAbandoned: The return rule does not apply when the tenant abandons (Louisiana 9:3251(C)): decided by ``tenant_abandoned`` (else no proper notice or a move-out before the end of the tenancy).
          - `section` string, required
          - `quote` string, required
          - `source` string, required
        - `payment_method` PaymentMethod: How the balance is paid changes the duty (``returned.method``, round 5 G-MI-01). ``electronic_after_notice``: an electronic balance may follow a timely notice of damages by ``days`` (Michigan 554.609(3), 2026 PA 102: a check goes with the notice); with the method unknown the later date is an alternative. ``electronic_if_paid_electronically``: the balance goes back electronically when the deposit or rent was paid that way, unless agreed otherwise in writing (California 1950.5 as amended by AB 414): a check is warned about.
          - `kind` 'electronic_after_notice' | 'electronic_if_paid_electronically', required
          - `effective_on` string, date, required
          - `days` integer, nullable
          - `section` string, required
          - `note` string, nullable
        - `gate` 'forwarding_address', nullable
        - `gate_restarts` boolean
        - `rollover` boolean
        - `rollover_days` string[]
        - `rollover_source` string, nullable
        - `rollover_unsettled` boolean
        - `determination_days` integer, nullable
        - `determination_section` string, nullable
      - `itemization` Itemization, required
        - `required` boolean
        - `with_refund` boolean
        - `days` integer, nullable
        - `months` integer, nullable
        - `start` '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', nullable
        - `effective_on` string, date, nullable
        - `receipts` Receipts
          - `required` boolean, required
          - `threshold_usd` string, nullable
          - `note` string, nullable
          - `missing` 'warn' | 'depends' | 'bars'
          - `scope` 'lines' | 'all'
          - `gate_note` string, nullable
          - `estimate_section` string, nullable
          - `estimate_note` string, nullable
        - `photos` Photos
          - `required` boolean, required
          - `threshold_usd` string, nullable
          - `note` string, nullable
          - `effective_on` string, date, nullable
          - `kinds` string[]
          - `missing` 'warn' | 'depends' | 'bars'
          - `scope` 'lines' | 'all'
          - `gate_note` string, nullable
        - `move_in_photos` MoveInPhotos: Photos at the start of the tenancy, for tenancies beginning on or after ``tenancy_from`` (California 1950.5(g)(1): 2025-07-01). Checked against ``documentation.photos_move_in``.
          - `tenancy_from` string, date, required
          - `section` string, required
          - `quote` string, required
          - `source` string, required
          - `missing` 'warn' | 'depends' | 'bars'
        - `move_in_statement` MoveInStatement: A written move-in condition statement or checklist the statute ties damage deductions to, checked against ``documentation.move_in_condition_statement`` (Montana 70-25-206(3): without it, damage and cleaning only on clear and convincing evidence: 'depends'; Washington 59.18.260(5): liable for the whole deposit: ``bars``, ``scope: all``).
          - `section` string, required
          - `quote` string, required
          - `source` string, required
          - `missing` 'depends' | 'bars' | 'warn'
          - `scope` 'lines' | 'all'
          - `rent_exempt` boolean
          - `note` string, nullable
        - `move_out_list` MoveOutList: A move-out inspection and damage list due a number of business days after the tenancy ends and the tenant vacates (Georgia 44-7-33(b): three business days), checked against ``documentation.move_out_list``; dated, with a due-soon warning.
          - `business_days` integer, required
          - `section` string, required
          - `quote` string, required
          - `source` string, required
          - `note` string, nullable
          - `unnotified_section` string, nullable
        - `describe_each` DescribeEach: The statute asks the itemized statement to describe each deducted item, not only to name a category (TEKTOLO-409): Texas 92.104(c) "a written description and itemized list of all deductions", Wisconsin ATCP 134.06(3)(a) "describe each item", Georgia 44-7-34(a) "the exact reasons", Washington 59.18.280(1)(a) "a full and specific statement of the basis", New Hampshire 540-A:7, I "with particularity", Massachusetts 15B(4)(iii) "in precise detail". The letter prints each line's description (the caller's own words, never stored) and leaves a blank to fill in where none was given; a manager note names the duty.
          - `section` string, required
          - `quote` string, required
          - `source` string, required
          - `rent_only_exempt` boolean
        - `refund_with_list` boolean
        - `after_refund` boolean
        - `on_full_refund` boolean
        - `note` string, nullable
      - `deductions` DeductionRules, required
        - `normal_wear_excluded` boolean
        - `mitigation_section` string, nullable
        - `contract_damages` ContractDamages: The statute lets the deposit cover damages from the tenant's noncompliance with the rental agreement (URLTA wording: Ohio 5321.16(B), Nebraska 76-1416(2), ...), so lease charges it does not list are 'depends' (the lease, reasonableness, mitigation), never a flat 'no' (round 3 R9: D-OH-06, F-NE-03).
          - `section` string, required
          - `quote` string, required
          - `source` string, required
          - `categories` string[], required
          - `note` string, nullable
        - `not_allowed_warning` string, nullable
        - `allowed` string[]
        - `allowed_detail` string[]
        - `depreciation` 'required' | 'guidance' | 'silent'
        - `depreciation_only` string[]
        - `depreciation_note` string, nullable
        - `note` string, nullable
        - `late_fee` LateFeeRule: The most a late fee may be, per late payment (or per month), computed from the monthly rent: ``flat_usd`` and ``percent`` (of the rent, or of the rent above ``over_usd``) combined as the greater, the lesser or the sum; ``rent_tiers`` / ``unit_tiers`` pick the figure by rent or building size. ``presumption``: the figure is only a safe harbor (Texas), so a larger fee is 'depends'. ``conditional``: no figure can be checked (Massachusetts: nothing until 30 days late; Oregon's reasonable flat fee; Wisconsin's nonstandard provision): 'depends' with the text. The engine allows up to the cap for one late payment unless the line says how many (``late_payments``); more than one cap without a count is 'depends'.
          - `percent` string, nullable
          - `flat_usd` string, nullable
          - `combine` 'greater' | 'lesser' | 'plus'
          - `over_usd` string, nullable
          - `rent_tiers` RentTier[]
            - `max_rent_usd` string, nullable
            - `flat_usd` string, required
          - `unit_tiers` UnitTier[]
            - `max_units` integer, nullable
            - `percent` string, required
          - `per` 'late_payment' | 'month'
          - `presumption` boolean
          - `conditional` string, nullable
          - `deposit_use` boolean
          - `section` string, required
          - `quote` string, required
          - `verbatim` boolean
          - `source` string, required
          - `note` string, nullable
        - `utilities` UtilityLimit: Utility charges the statute lets the landlord deduct, by kind (Massachusetts: water only). A utility line is 'yes' for these kinds, 'no' for others, 'depends' when the kind is not given (``utility_kind`` on the line).
          - `kinds` string[], required
          - `section` string, required
          - `quote` string, required
          - `source` string, required
        - `excluded` Exclusion[]
          - `category` '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' | 'moving_and_storage' | 'reletting_costs' | 'trash_and_abandoned_items' | 'other_damage' | 'other', required
          - `section` string, required
          - `quote` string, required
          - `source` string, required
          - `note` string, nullable
        - `lease_break` LeaseBreakRule: What the statute lets a landlord keep for a tenancy ended early. ``actual_rent``: only the rent actually lost (after mitigation), not a flat fee (Michigan, Indiana, North Carolina); ``cap_months_rent``: a fee up to ``months_rent`` x rent when the agreement provides it (Oregon 1.5, Florida 2 with a signed addendum); ``nonstandard_provision``: only under a signed nonstandard provision (Wisconsin). Every case is 'depends' (facts the request cannot state); the cap limits the amount.
          - `rule` 'actual_rent' | 'cap_months_rent' | 'nonstandard_provision', required
          - `months_rent` string, nullable
          - `excludes_later_rent` boolean
          - `keeps_retake_month_rent` boolean
          - `exclusion_section` string, nullable
          - `exclusion_quote` string, nullable
          - `section` string, required
          - `quote` string, required
          - `verbatim` boolean
          - `source` string, required
          - `note` string, nullable
        - `nonstandard_only` string[]
        - `nonstandard_section` string, nullable
        - `cleaning` CleaningVersion[]
          - `basis` 'named' | 'damage', required
          - `routine` 'barred' | 'lease' | 'reasonable'
          - `routine_signed_provision` boolean
          - `condition` string, nullable
          - `unless_no_notice` boolean
          - `note` string, nullable
          - `section` string, required
          - `quote` string, required
          - `verbatim` boolean
          - `source` string, required
          - `effective_on` string, date, nullable
      - `interest` InterestRule, required
        - `required` union, required
          - boolean
          - 'conditional'
        - `condition` string, nullable
        - `min_units` integer, nullable
        - `min_tenancy_days` integer, nullable
        - `min_tenancy_months` integer, nullable
        - `min_tenancy_strict` boolean
        - `min_deposit_usd` string, nullable
        - `rate` 'fixed_percent' | 'statutory_index' | 'bank_rate', nullable
        - `rate_value` string, nullable
        - `rate_year` integer, nullable
        - `rate_schedule` RateWindow[]
          - `from` string, date, required
          - `to` string, date, required
          - `rate_value` string, required
          - `source` string, nullable
          - `note` string, nullable
        - `method` 'simple' | 'monthly_by_year' | 'months_to_compliance' | 'lease_years' | 'per_window' | 'anniversary_years' | 'monthly'
        - `formula` string, nullable
        - `base` 'deposit' | 'excess_over_max_50_or_month'
        - `payable` 'annually' | 'at_end', nullable
        - `held_until` 'vacate' | 'return'
        - `accrual_floor` string, date, nullable
        - `accrual_floor_section` string, nullable
        - `count_last_day` boolean
        - `ordinance_coverage` boolean
        - `legacy_before` string, date, nullable
        - `legacy_rate` string, nullable
        - `legacy_interval_months` integer, nullable
        - `minimum_usd` string, nullable
        - `year_starts` string, nullable
        - `accrues_after_months` integer, nullable
        - `fee_percent` string, nullable
        - `compound` 'none' | 'annual'
        - `min_lease_term_months` integer, nullable
        - `min_deposit_months_rent` string, nullable
        - `rate_published_by` string, nullable
        - `includes_prepaid_rent` boolean
        - `bank_rate_lesser` boolean
        - `due_days` integer, nullable
        - `due_start` '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'
        - `due_section` string, nullable
        - `note` string, nullable
      - `penalty` PenaltyRule, required
        - `kind` 'multiple' | 'fixed' | 'actual_only' | 'forfeiture_only', required
        - `multiple` string, nullable
        - `fixed_usd` string, nullable
        - `minimum_usd` string, nullable
        - `max_months_rent` string, nullable
        - `per_violation` boolean
        - `multiple_is_additional` boolean
        - `basis` 'deposit' | 'amount_withheld' | 'monthly_rent', nullable
        - `base` 'withheld' | 'wrongfully_withheld' | 'entitled_balance' | 'exceeds_damages'
        - `base_high` 'deposit' | 'withheld', nullable
        - `late_refund_in_base` boolean
        - `not_if_abandoned` boolean
        - `multiple_if_statement_late` boolean
        - `base_if_no_statement` 'deposit_less_claims', nullable
        - `no_statement_note` string, nullable
        - `interest_in_base` boolean
        - `credited_against_rent` 'rent_due' | 'rent_beyond_deposit', nullable
        - `condition` 'bad_faith' | 'willful' | 'any_late' | 'late' | 'any_violation' | 'without_reasonable_basis' | 'court_discretion' | 'unpaid_annual_interest', required
        - `discretionary` boolean
        - `plus_attorney_fees` boolean
        - `forfeits_right_to_withhold_if_late` boolean
        - `safe_harbor` SafeHarbor: What takes the penalty away (Illinois 710/1(a), Pennsylvania 512(e), Ohio 5321.16(B), ...): the tenant gave no forwarding address. Checked against ``tenant_gave_forwarding_address`` (false: no penalty; unknown with no address received: an unknown says so).
          - `when` 'no_forwarding_address'
          - `section` string, required
          - `quote` string, required
          - `source` string, required
          - `note` string, nullable
        - `note` string, nullable
      - `forfeiture` Forfeiture[]
        - `trigger` 'late_statement' | 'late_return' | 'late_statement_or_return' | 'late_claim_notice' | 'not_in_input', required
        - `bars` 'all' | 'damage'
        - `contested` string[]
        - `exempt` string[]
        - `gate` 'none' | 'bad_faith' | 'unreasonable' | 'willful' | 'presumption' | 'tenant_notice' | 'court'
        - `keeps_claim` boolean
        - `address_relief_days` integer, nullable
        - `tenant_notice_relief` boolean
        - `not_if_abandoned` boolean
        - `short_interest_contested` boolean
        - `effective_on` string, date, nullable
        - `condition` string, nullable
        - `section` string, required
        - `quote` string, required
        - `verbatim` boolean
        - `source` string, required
        - `note` string, nullable
      - `deposit_cap_months_rent` string, nullable
      - `deposit_cap` DepositCap: The statutory deposit limit, computed (round 2 class 9). ``effective_on`` / ``effective_by``: the cap applies to deposits collected (``collected``, California AB 12, Colorado) or leases entered into or renewed (``lease_signed``, Georgia, Maryland) on or after the date; earlier ones keep ``before_months_rent`` (None: no cap) and ``before_furnished_months``. ``furnished_months``: the cap for a furnished unit (Kansas); ``furnished_exempt``: none for one (Delaware). ``max_rent_usd``: no cap above this rent (Alaska $2,000). ``min_term_months``: only for leases of at least this term (Delaware: one year); ``max_term_months``: only for shorter ones (New Mexico: under a year). ``later_months_rent`` from ``later_after_months`` into the tenancy (Pennsylvania: one month from the second year). ``variant_months``: another limit under facts the request cannot state (California small landlords 2, Connecticut 62+ 1, North Carolina month-to-month 1.5, Portland last month's rent 1.5, ...): a deposit between the two is 'depends'.
        - `excess_remedy` ExcessRemedy: A remedy for taking a deposit above the cap (Maryland 8-203(b)(3): up to three times the extra amount charged, plus fees).
          - `multiple` string, required
          - `section` string, required
          - `quote` string, required
          - `source` string, required
        - `months_rent` string, nullable
        - `minimum_usd` string, nullable
        - `variants` string, nullable
        - `effective_on` string, date, nullable
        - `effective_by` 'collected' | 'lease_signed'
        - `before_months_rent` string, nullable
        - `before_furnished_months` string, nullable
        - `furnished_months` string, nullable
        - `furnished_exempt` boolean
        - `max_rent_usd` string, nullable
        - `min_term_months` integer, nullable
        - `max_term_months` integer, nullable
        - `later_months_rent` string, nullable
        - `later_after_months` integer, nullable
        - `variant_months` string, nullable
        - `variant_note` string, nullable
        - `variant_when` 'small_landlord' | 'tenant_age_62_plus' | 'month_to_month', nullable
        - `excludes_pet_deposit` boolean
        - `counts_prepaid_rent` boolean
        - `pet_allowance_months` string, nullable
        - `prepaid_cap_months` string, nullable
        - `note` string, nullable
        - `source` string, required
      - `recent_changes` Change[]
        - `effective_on` string, date, nullable
        - `text` string, required
        - `source` string, required
      - `applicability` string, nullable
      - `notes` string[]
    - `city_overlay` CityRules
      - `id` string, required
      - `name` string, required
      - `state` string, required
      - `return_rule` ReturnRule
        - `days` integer, nullable
        - `months` integer, nullable
        - `counting` 'calendar' | 'business'
        - `holidays` 'federal' | 'AZ' | 'CA' | 'NY' | 'TX'
        - `start` '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'
        - `start_note` string, nullable
        - `demand_in_writing` boolean
        - `alternatives` Alternative[]
          - `condition` string, required
          - `requires` string[]
          - `days` integer, nullable
          - `months` integer, nullable
          - `start` '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', nullable
          - `counting` 'calendar' | 'business', nullable
          - `combine` 'replace' | 'later_date' | 'earlier_date' | 'extend'
          - `extends` 'deadline' | 'itemization'
          - `notice_within_days` integer, nullable
          - `pending` 'not_started' | 'notice_date'
          - `effective_before` string, date, nullable
          - `effective_on_or_after` string, date, nullable
          - `effective_by` 'termination' | 'conduct'
          - `note` string, nullable
          - `listed_if` string, nullable
        - `fallback` Fallback: A second date for the full refund when the statement is not given in time or none is needed (Illinois 710/1(a): no statement for property damage within 30 days: the deposit in full within 45 days of vacating; a rent-only withholding needs no statement). The statement's own date stays ``itemization_by``.
          - `days` integer, required
          - `start` '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'
          - `section` string, required
          - `note` string, nullable
        - `not_if_abandoned` NotIfAbandoned: The return rule does not apply when the tenant abandons (Louisiana 9:3251(C)): decided by ``tenant_abandoned`` (else no proper notice or a move-out before the end of the tenancy).
          - `section` string, required
          - `quote` string, required
          - `source` string, required
        - `payment_method` PaymentMethod: How the balance is paid changes the duty (``returned.method``, round 5 G-MI-01). ``electronic_after_notice``: an electronic balance may follow a timely notice of damages by ``days`` (Michigan 554.609(3), 2026 PA 102: a check goes with the notice); with the method unknown the later date is an alternative. ``electronic_if_paid_electronically``: the balance goes back electronically when the deposit or rent was paid that way, unless agreed otherwise in writing (California 1950.5 as amended by AB 414): a check is warned about.
          - `kind` 'electronic_after_notice' | 'electronic_if_paid_electronically', required
          - `effective_on` string, date, required
          - `days` integer, nullable
          - `section` string, required
          - `note` string, nullable
        - `gate` 'forwarding_address', nullable
        - `gate_restarts` boolean
        - `rollover` boolean
        - `rollover_days` string[]
        - `rollover_source` string, nullable
        - `rollover_unsettled` boolean
        - `determination_days` integer, nullable
        - `determination_section` string, nullable
      - `interest` InterestRule
        - `required` union, required
          - boolean
          - 'conditional'
        - `condition` string, nullable
        - `min_units` integer, nullable
        - `min_tenancy_days` integer, nullable
        - `min_tenancy_months` integer, nullable
        - `min_tenancy_strict` boolean
        - `min_deposit_usd` string, nullable
        - `rate` 'fixed_percent' | 'statutory_index' | 'bank_rate', nullable
        - `rate_value` string, nullable
        - `rate_year` integer, nullable
        - `rate_schedule` RateWindow[]
          - `from` string, date, required
          - `to` string, date, required
          - `rate_value` string, required
          - `source` string, nullable
          - `note` string, nullable
        - `method` 'simple' | 'monthly_by_year' | 'months_to_compliance' | 'lease_years' | 'per_window' | 'anniversary_years' | 'monthly'
        - `formula` string, nullable
        - `base` 'deposit' | 'excess_over_max_50_or_month'
        - `payable` 'annually' | 'at_end', nullable
        - `held_until` 'vacate' | 'return'
        - `accrual_floor` string, date, nullable
        - `accrual_floor_section` string, nullable
        - `count_last_day` boolean
        - `ordinance_coverage` boolean
        - `legacy_before` string, date, nullable
        - `legacy_rate` string, nullable
        - `legacy_interval_months` integer, nullable
        - `minimum_usd` string, nullable
        - `year_starts` string, nullable
        - `accrues_after_months` integer, nullable
        - `fee_percent` string, nullable
        - `compound` 'none' | 'annual'
        - `min_lease_term_months` integer, nullable
        - `min_deposit_months_rent` string, nullable
        - `rate_published_by` string, nullable
        - `includes_prepaid_rent` boolean
        - `bank_rate_lesser` boolean
        - `due_days` integer, nullable
        - `due_start` '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'
        - `due_section` string, nullable
        - `note` string, nullable
      - `penalty` PenaltyRule
        - `kind` 'multiple' | 'fixed' | 'actual_only' | 'forfeiture_only', required
        - `multiple` string, nullable
        - `fixed_usd` string, nullable
        - `minimum_usd` string, nullable
        - `max_months_rent` string, nullable
        - `per_violation` boolean
        - `multiple_is_additional` boolean
        - `basis` 'deposit' | 'amount_withheld' | 'monthly_rent', nullable
        - `base` 'withheld' | 'wrongfully_withheld' | 'entitled_balance' | 'exceeds_damages'
        - `base_high` 'deposit' | 'withheld', nullable
        - `late_refund_in_base` boolean
        - `not_if_abandoned` boolean
        - `multiple_if_statement_late` boolean
        - `base_if_no_statement` 'deposit_less_claims', nullable
        - `no_statement_note` string, nullable
        - `interest_in_base` boolean
        - `credited_against_rent` 'rent_due' | 'rent_beyond_deposit', nullable
        - `condition` 'bad_faith' | 'willful' | 'any_late' | 'late' | 'any_violation' | 'without_reasonable_basis' | 'court_discretion' | 'unpaid_annual_interest', required
        - `discretionary` boolean
        - `plus_attorney_fees` boolean
        - `forfeits_right_to_withhold_if_late` boolean
        - `safe_harbor` SafeHarbor: What takes the penalty away (Illinois 710/1(a), Pennsylvania 512(e), Ohio 5321.16(B), ...): the tenant gave no forwarding address. Checked against ``tenant_gave_forwarding_address`` (false: no penalty; unknown with no address received: an unknown says so).
          - `when` 'no_forwarding_address'
          - `section` string, required
          - `quote` string, required
          - `source` string, required
          - `note` string, nullable
        - `note` string, nullable
      - `itemization` Itemization
        - `required` boolean
        - `with_refund` boolean
        - `days` integer, nullable
        - `months` integer, nullable
        - `start` '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', nullable
        - `effective_on` string, date, nullable
        - `receipts` Receipts
          - `required` boolean, required
          - `threshold_usd` string, nullable
          - `note` string, nullable
          - `missing` 'warn' | 'depends' | 'bars'
          - `scope` 'lines' | 'all'
          - `gate_note` string, nullable
          - `estimate_section` string, nullable
          - `estimate_note` string, nullable
        - `photos` Photos
          - `required` boolean, required
          - `threshold_usd` string, nullable
          - `note` string, nullable
          - `effective_on` string, date, nullable
          - `kinds` string[]
          - `missing` 'warn' | 'depends' | 'bars'
          - `scope` 'lines' | 'all'
          - `gate_note` string, nullable
        - `move_in_photos` MoveInPhotos: Photos at the start of the tenancy, for tenancies beginning on or after ``tenancy_from`` (California 1950.5(g)(1): 2025-07-01). Checked against ``documentation.photos_move_in``.
          - `tenancy_from` string, date, required
          - `section` string, required
          - `quote` string, required
          - `source` string, required
          - `missing` 'warn' | 'depends' | 'bars'
        - `move_in_statement` MoveInStatement: A written move-in condition statement or checklist the statute ties damage deductions to, checked against ``documentation.move_in_condition_statement`` (Montana 70-25-206(3): without it, damage and cleaning only on clear and convincing evidence: 'depends'; Washington 59.18.260(5): liable for the whole deposit: ``bars``, ``scope: all``).
          - `section` string, required
          - `quote` string, required
          - `source` string, required
          - `missing` 'depends' | 'bars' | 'warn'
          - `scope` 'lines' | 'all'
          - `rent_exempt` boolean
          - `note` string, nullable
        - `move_out_list` MoveOutList: A move-out inspection and damage list due a number of business days after the tenancy ends and the tenant vacates (Georgia 44-7-33(b): three business days), checked against ``documentation.move_out_list``; dated, with a due-soon warning.
          - `business_days` integer, required
          - `section` string, required
          - `quote` string, required
          - `source` string, required
          - `note` string, nullable
          - `unnotified_section` string, nullable
        - `describe_each` DescribeEach: The statute asks the itemized statement to describe each deducted item, not only to name a category (TEKTOLO-409): Texas 92.104(c) "a written description and itemized list of all deductions", Wisconsin ATCP 134.06(3)(a) "describe each item", Georgia 44-7-34(a) "the exact reasons", Washington 59.18.280(1)(a) "a full and specific statement of the basis", New Hampshire 540-A:7, I "with particularity", Massachusetts 15B(4)(iii) "in precise detail". The letter prints each line's description (the caller's own words, never stored) and leaves a blank to fill in where none was given; a manager note names the duty.
          - `section` string, required
          - `quote` string, required
          - `source` string, required
          - `rent_only_exempt` boolean
        - `refund_with_list` boolean
        - `after_refund` boolean
        - `on_full_refund` boolean
        - `note` string, nullable
      - `deductions` DeductionRules
        - `normal_wear_excluded` boolean
        - `mitigation_section` string, nullable
        - `contract_damages` ContractDamages: The statute lets the deposit cover damages from the tenant's noncompliance with the rental agreement (URLTA wording: Ohio 5321.16(B), Nebraska 76-1416(2), ...), so lease charges it does not list are 'depends' (the lease, reasonableness, mitigation), never a flat 'no' (round 3 R9: D-OH-06, F-NE-03).
          - `section` string, required
          - `quote` string, required
          - `source` string, required
          - `categories` string[], required
          - `note` string, nullable
        - `not_allowed_warning` string, nullable
        - `allowed` string[]
        - `allowed_detail` string[]
        - `depreciation` 'required' | 'guidance' | 'silent'
        - `depreciation_only` string[]
        - `depreciation_note` string, nullable
        - `note` string, nullable
        - `late_fee` LateFeeRule: The most a late fee may be, per late payment (or per month), computed from the monthly rent: ``flat_usd`` and ``percent`` (of the rent, or of the rent above ``over_usd``) combined as the greater, the lesser or the sum; ``rent_tiers`` / ``unit_tiers`` pick the figure by rent or building size. ``presumption``: the figure is only a safe harbor (Texas), so a larger fee is 'depends'. ``conditional``: no figure can be checked (Massachusetts: nothing until 30 days late; Oregon's reasonable flat fee; Wisconsin's nonstandard provision): 'depends' with the text. The engine allows up to the cap for one late payment unless the line says how many (``late_payments``); more than one cap without a count is 'depends'.
          - `percent` string, nullable
          - `flat_usd` string, nullable
          - `combine` 'greater' | 'lesser' | 'plus'
          - `over_usd` string, nullable
          - `rent_tiers` RentTier[]
            - `max_rent_usd` string, nullable
            - `flat_usd` string, required
          - `unit_tiers` UnitTier[]
            - `max_units` integer, nullable
            - `percent` string, required
          - `per` 'late_payment' | 'month'
          - `presumption` boolean
          - `conditional` string, nullable
          - `deposit_use` boolean
          - `section` string, required
          - `quote` string, required
          - `verbatim` boolean
          - `source` string, required
          - `note` string, nullable
        - `utilities` UtilityLimit: Utility charges the statute lets the landlord deduct, by kind (Massachusetts: water only). A utility line is 'yes' for these kinds, 'no' for others, 'depends' when the kind is not given (``utility_kind`` on the line).
          - `kinds` string[], required
          - `section` string, required
          - `quote` string, required
          - `source` string, required
        - `excluded` Exclusion[]
          - `category` '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' | 'moving_and_storage' | 'reletting_costs' | 'trash_and_abandoned_items' | 'other_damage' | 'other', required
          - `section` string, required
          - `quote` string, required
          - `source` string, required
          - `note` string, nullable
        - `lease_break` LeaseBreakRule: What the statute lets a landlord keep for a tenancy ended early. ``actual_rent``: only the rent actually lost (after mitigation), not a flat fee (Michigan, Indiana, North Carolina); ``cap_months_rent``: a fee up to ``months_rent`` x rent when the agreement provides it (Oregon 1.5, Florida 2 with a signed addendum); ``nonstandard_provision``: only under a signed nonstandard provision (Wisconsin). Every case is 'depends' (facts the request cannot state); the cap limits the amount.
          - `rule` 'actual_rent' | 'cap_months_rent' | 'nonstandard_provision', required
          - `months_rent` string, nullable
          - `excludes_later_rent` boolean
          - `keeps_retake_month_rent` boolean
          - `exclusion_section` string, nullable
          - `exclusion_quote` string, nullable
          - `section` string, required
          - `quote` string, required
          - `verbatim` boolean
          - `source` string, required
          - `note` string, nullable
        - `nonstandard_only` string[]
        - `nonstandard_section` string, nullable
        - `cleaning` CleaningVersion[]
          - `basis` 'named' | 'damage', required
          - `routine` 'barred' | 'lease' | 'reasonable'
          - `routine_signed_provision` boolean
          - `condition` string, nullable
          - `unless_no_notice` boolean
          - `note` string, nullable
          - `section` string, required
          - `quote` string, required
          - `verbatim` boolean
          - `source` string, required
          - `effective_on` string, date, nullable
      - `deposit_cap` DepositCap: The statutory deposit limit, computed (round 2 class 9). ``effective_on`` / ``effective_by``: the cap applies to deposits collected (``collected``, California AB 12, Colorado) or leases entered into or renewed (``lease_signed``, Georgia, Maryland) on or after the date; earlier ones keep ``before_months_rent`` (None: no cap) and ``before_furnished_months``. ``furnished_months``: the cap for a furnished unit (Kansas); ``furnished_exempt``: none for one (Delaware). ``max_rent_usd``: no cap above this rent (Alaska $2,000). ``min_term_months``: only for leases of at least this term (Delaware: one year); ``max_term_months``: only for shorter ones (New Mexico: under a year). ``later_months_rent`` from ``later_after_months`` into the tenancy (Pennsylvania: one month from the second year). ``variant_months``: another limit under facts the request cannot state (California small landlords 2, Connecticut 62+ 1, North Carolina month-to-month 1.5, Portland last month's rent 1.5, ...): a deposit between the two is 'depends'.
        - `excess_remedy` ExcessRemedy: A remedy for taking a deposit above the cap (Maryland 8-203(b)(3): up to three times the extra amount charged, plus fees).
          - `multiple` string, required
          - `section` string, required
          - `quote` string, required
          - `source` string, required
        - `months_rent` string, nullable
        - `minimum_usd` string, nullable
        - `variants` string, nullable
        - `effective_on` string, date, nullable
        - `effective_by` 'collected' | 'lease_signed'
        - `before_months_rent` string, nullable
        - `before_furnished_months` string, nullable
        - `furnished_months` string, nullable
        - `furnished_exempt` boolean
        - `max_rent_usd` string, nullable
        - `min_term_months` integer, nullable
        - `max_term_months` integer, nullable
        - `later_months_rent` string, nullable
        - `later_after_months` integer, nullable
        - `variant_months` string, nullable
        - `variant_note` string, nullable
        - `variant_when` 'small_landlord' | 'tenant_age_62_plus' | 'month_to_month', nullable
        - `excludes_pet_deposit` boolean
        - `counts_prepaid_rent` boolean
        - `pet_allowance_months` string, nullable
        - `prepaid_cap_months` string, nullable
        - `note` string, nullable
        - `source` string, required
      - `additional_penalty` PenaltyRule
        - `kind` 'multiple' | 'fixed' | 'actual_only' | 'forfeiture_only', required
        - `multiple` string, nullable
        - `fixed_usd` string, nullable
        - `minimum_usd` string, nullable
        - `max_months_rent` string, nullable
        - `per_violation` boolean
        - `multiple_is_additional` boolean
        - `basis` 'deposit' | 'amount_withheld' | 'monthly_rent', nullable
        - `base` 'withheld' | 'wrongfully_withheld' | 'entitled_balance' | 'exceeds_damages'
        - `base_high` 'deposit' | 'withheld', nullable
        - `late_refund_in_base` boolean
        - `not_if_abandoned` boolean
        - `multiple_if_statement_late` boolean
        - `base_if_no_statement` 'deposit_less_claims', nullable
        - `no_statement_note` string, nullable
        - `interest_in_base` boolean
        - `credited_against_rent` 'rent_due' | 'rent_beyond_deposit', nullable
        - `condition` 'bad_faith' | 'willful' | 'any_late' | 'late' | 'any_violation' | 'without_reasonable_basis' | 'court_discretion' | 'unpaid_annual_interest', required
        - `discretionary` boolean
        - `plus_attorney_fees` boolean
        - `forfeits_right_to_withhold_if_late` boolean
        - `safe_harbor` SafeHarbor: What takes the penalty away (Illinois 710/1(a), Pennsylvania 512(e), Ohio 5321.16(B), ...): the tenant gave no forwarding address. Checked against ``tenant_gave_forwarding_address`` (false: no penalty; unknown with no address received: an unknown says so).
          - `when` 'no_forwarding_address'
          - `section` string, required
          - `quote` string, required
          - `source` string, required
          - `note` string, nullable
        - `note` string, nullable
      - `forfeiture` Forfeiture[], nullable
        - `trigger` 'late_statement' | 'late_return' | 'late_statement_or_return' | 'late_claim_notice' | 'not_in_input', required
        - `bars` 'all' | 'damage'
        - `contested` string[]
        - `exempt` string[]
        - `gate` 'none' | 'bad_faith' | 'unreasonable' | 'willful' | 'presumption' | 'tenant_notice' | 'court'
        - `keeps_claim` boolean
        - `address_relief_days` integer, nullable
        - `tenant_notice_relief` boolean
        - `not_if_abandoned` boolean
        - `short_interest_contested` boolean
        - `effective_on` string, date, nullable
        - `condition` string, nullable
        - `section` string, required
        - `quote` string, required
        - `verbatim` boolean
        - `source` string, required
        - `note` string, nullable
      - `depreciation_schedule` string, nullable
      - `applicability` string, nullable
      - `notes` string[]
    - `citations` Citation[]
      - `rule` string, required: What the citation supports: deadline, interest, penalty, ...
      - `section` string, required
      - `quote` string, required: Short quote of the rule (or our summary when verbatim is false).
      - `verbatim` boolean
      - `url` string, nullable
      - `source_title` string, nullable
      - `accessed` string, date, nullable
    - `covered_states` string[]
    - `covered_cities` string[]: City overlays in this state ('Name, ST').
    - `guides` Guide[]: Official plain-language guides for this state or city, where we have one.
      - `title` string, required
      - `url` string, nullable
      - `publisher` string, nullable
      - `accessed` string, date, nullable
    - `small_claims` Guide: An official plain-language resource for the state or city (an agency guide).
      - `title` string, required
      - `url` string, nullable
      - `publisher` string, nullable
      - `accessed` string, date, nullable
    - `warnings` TektoloDepositSettlementModelsNote[]
      - `code` string, required
      - `text` string, required
    - `research_notes` string[]: Research notes on the rows used: where the text was read, fetch failures, renumbering, history not checked. For checking the sourcing; not warnings.
    - `provenance` TektoloDepositSettlementModelsProvenance, required
      - `ruleset_id` string, required
      - `ruleset_version` string, required
      - `ruleset_hash` string, required
      - `rule_ids` string[]
      - `sources` string[]
      - `rules_as_of` string, date, nullable: The rules are as of this day: the earliest date on which a source behind this answer was read (the accessed date of each source in sources; each citation gives its own). A change in the law after it is not reflected unless a later ruleset version says so: every version and what it changed is listed at /changelog, with an Atom feed per state. Null when no state's rules apply (a state not covered).

## Other responses

- `412`: The ruleset named in the Tektolo-Ruleset header is not the one in force, and the call did not ask to be answered under it (Tektolo-Ruleset-Mode: serve) or that version can't be served (the body's reason says why). Nothing was computed or charged; the body names both versions.
- `422`: Validation Error

---

[API](https://skmtc.dev/tektolo/apis/tektolo-capabilities-api.md) · [All operations](https://skmtc.dev/tektolo/apis/tektolo-capabilities-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tektolo/apis/tektolo-capabilities-api/revisions/6e667aa7b6f7?raw)
