---
title: "Settle a security deposit after move-out"
method: POST
path: "/v1/deposit-settlement/settle"
tags: ["deposit-settlement"]
---

# Settle a security deposit after move-out

`POST /v1/deposit-settlement/settle`

## 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/settle`
- Auth: none declared

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.
When to use: 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.
Tip: Send as_of (today's date) for a repeatable answer; it defaults to today in UTC.
Tip: Give item_installed_on or item_age_years for carpet, paint, blinds and appliances; without them the tenancy length is assumed.
Tip: Mark normal wear with caused_by_tenant false; it is never deductible.
Tip: Relay deadline.return_by and its status, totals.refund_due_usd, penalty_exposure and the citations; say it is not legal advice.
Tip: Offer statement.text as the draft itemized statement (no names or addresses); in the copy for the tenant keep only the statement.notes whose audience is tenant.
Tip: For a printable statement to sign and send (HTML or PDF) or the deductions ledger (CSV), POST the same arguments as JSON to links.downloads; do not build the file yourself.
Tip: For a tenant (arguments with returned), links.downloads tenant_pdf or tenant_html is a neutral summary of the facts and the rule to send to the landlord; give the user that, not the landlord's statement.
Tip: Relay warnings, assumptions and unknowns (for example the Texas forwarding address).
Tip: 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.
Tip: 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.
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

- SettleRequest
  - `client_refs` object, nullable: Your own reference ids (e.g. unit_id, job_id). Echoed back, never used.
  - `state` string, required: US state, 2-letter code (e.g. 'CA'); a state name also works.
  - `city` string, nullable: City, for a city overlay where covered (e.g. 'Chicago'). Optional.
  - `deposit_usd` union, required: Security deposit held, dollars.
    - number
    - string
  - `monthly_rent_usd` union: Monthly rent, for the deposit cap check.
    - number
    - string
  - `building_units` integer, nullable: Units in the building. Some interest rules depend on it (NY 6+, IL 25+).
  - `move_in_on` string, date, nullable: Tenancy start (YYYY-MM-DD). Used for interest and, when an item's age is unknown, for depreciation.
  - `tenancy_ended_on` string, date, nullable: When the tenancy actually ended (YYYY-MM-DD): the lease's end, or an earlier termination or accepted surrender. Deadlines that run from the end of the tenancy use it. For a tenant who left before the lease was due to end, send the scheduled end as lease_end_on (older callers sent it here, which still works: the deadline is then counted from it, with the move-out date as an earlier alternative where the facts point to one).
  - `lease_end_on` string, date, nullable: Day the lease was scheduled to end (YYYY-MM-DD), when it differs from when the tenancy actually ended (a broken lease). Lost rent and lease-break charges run to it; deadlines do not (they follow tenancy_ended_on, else the move-out, with the scheduled end as a later alternative).
  - `vacated_on` string, date, required: Day the tenant moved out and returned possession (YYYY-MM-DD).
  - `forwarding_address_received_on` string, date, nullable: 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).
  - `tenant_gave_forwarding_address` boolean, nullable: False when the tenant never gave a forwarding address in writing (not just 'not yet known'). Illinois, Pennsylvania, Ohio, Delaware, South Carolina and New Hampshire then relieve the landlord of the penalty. Implied true by forwarding_address_received_on.
  - `demand_received_on` string, date, nullable: Day you received the tenant's demand for the deposit (YYYY-MM-DD; written in Oklahoma, by first-class mail in Maryland 8-203(h)). Arizona, Kansas, Oklahoma, South Carolina and Mississippi start the clock on it.
  - `new_tenant_moved_in_on` string, date, nullable: Day a new tenant moved in, if the unit was re-rented (YYYY-MM-DD). West Virginia and Wisconsin can end the period earlier; rent claimed for days from it on is not recoverable (re-rent mitigation).
  - `new_tenant_rent_usd` union: Monthly rent the new tenant pays (with new_tenant_moved_in_on): the rent received for overlapping days is credited against rent claimed for them.
    - number
    - string
  - `statement_sent_on` string, date, nullable: Day you sent (or delivered) the itemized statement (YYYY-MM-DD). With it the statement is judged on time or late; documentation.itemized_statement alone cannot tell.
  - `claim_notice_sent_on` string, date, nullable: Day you sent the written notice of intent to impose a claim on the deposit (YYYY-MM-DD). Florida (due within 30 days of termination) and the District of Columbia (within 45 days): the balance is due 30 days after it; a late notice does not count.
  - `lease_return_days` integer, nullable: 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).
  - `tenant_gave_proper_notice` boolean, nullable: A termination notice that meets the statute was given (Alaska: 14 days instead of 30 when nothing is deducted for damage).
  - `interest_paid_through` string, date, nullable: Interest already paid or credited to the tenant up to this day (annual-payment rules: San Francisco, Los Angeles, Berkeley, Connecticut, Massachusetts, ...): interest is counted from it.
  - `nonstandard_provision_signed` boolean, nullable: Wisconsin: the tenant signed a separate NONSTANDARD RENTAL PROVISIONS document covering the charge (ATCP 134.06(3)(b)); false makes such charges 'no'.
  - `pet_deposit_usd` union: The part of deposit_usd that is a pet deposit (outside the cap in Missouri, Alabama, North Dakota and Saint Paul; allowed on top of it up to one month in Hawaii and Alaska, half a month in Kansas, a quarter in Nebraska).
    - number
    - string
  - `tenant_age_62_plus` boolean, nullable: The tenant is 62 or older (Connecticut: a one-month cap).
  - `tenant_age_60_plus` boolean, nullable: A person 60 or older occupies the unit (New Hampshire 540-A:5, I: the owner-occupied exemption does not reach the unit). tenant_age_62_plus true implies it.
  - `small_landlord` boolean, nullable: California AB 12 small landlord (a natural person or an LLC of natural persons owning at most two properties with at most four units; not for a service member): a two-month cap.
  - `owner_occupied` boolean, nullable: The landlord lives in the building (ME, NH, NJ and Chicago exempt small owner-occupied buildings; with building_units).
  - `landlord_units_owned` integer, nullable: Rental units the landlord owns in all (Arkansas 5 or fewer, Georgia 10 or fewer, with third_party_managed, may be exempt).
  - `third_party_managed` boolean, nullable: A third party manages the unit or collects rent for a fee.
  - `prepaid_rent_usd` union: Rent paid in advance beyond the first month, held besides deposit_usd. Counts toward the cap in AK, AZ, CA, CT, MD, MI and NY; earns interest in CT, MA (last month's rent), MD and Chicago; in Minneapolis it lowers the deposit cap to half a month.
    - number
    - string
  - `tenancy_type` 'written_lease' | 'at_will', nullable: written_lease or at_will (Maine 6033(2): a written agreement's period, at most 30 days, or 21 days for a tenancy at will; Massachusetts 15B(4): at will, 30 days after the move-out, a written lease, 30 days after its end). Left out with a move-out before tenancy_ended_on: the earlier (at-will) date leads and the other is listed.
  - `tenant_abandoned` boolean, nullable: The tenant abandoned the unit or was evicted (Maryland 8-203(h): the clock runs from the tenant's written demand; Washington 59.18.280: from when the landlord learns of it; Louisiana 9:3251(C): the one-month rule does not apply). Left out: inferred from tenant_gave_proper_notice: false; with a move-out before tenancy_ended_on the earlier abandonment clock leads and the other date is listed.
  - `contractor_needed` boolean, nullable: Damage exceeds the deposit and needs a third-party contractor, and you said so in writing in time (Virginia, West Virginia: 15 more days).
  - `deposit_collected_on` string, date, nullable: Day the deposit was collected (YYYY-MM-DD); defaults to move_in_on. California (AB 12, from 2024-07-01) and Colorado caps depend on it.
  - `lease_signed_or_renewed_on` string, date, nullable: Day the current lease was signed or last renewed (YYYY-MM-DD). Georgia (2024-07-01) and Maryland (2024-10-01) caps apply to leases from then; defaults to move_in_on, with a warning that a later renewal may bring the new cap.
  - `lease_term_months` integer, nullable: Term of the lease in months (0 for month-to-month). Delaware's cap applies to leases of a year or more, New Mexico's to shorter ones.
  - `furnished` boolean, nullable: The unit is rented furnished (California before AB 12: 3 months; Kansas: 1.5 months; Delaware: no cap).
  - `rent_ordinance_covered` boolean, nullable: The unit is covered by the city's rent ordinance (Los Angeles RSO, Berkeley Rent Ordinance). Their deposit interest is owed only then; unknown: the amount is shown beside the refund, not in it.
  - `interest_rate_percent` union: Annual rate the deposit account paid, where the law sets interest at the bank's rate (New Jersey, North Dakota, New Hampshire, New York, Pennsylvania, Portland), or caps it (Massachusetts: 5% or the bank's lesser rate). Without it bank-rate interest is unknown. Illinois 765 ILCS 715 uses IDFPR's published rate instead.
    - number
    - string
  - `deductions` Deduction[]: What you intend to deduct (or, for a tenant, what the landlord listed). An explicit empty list means nothing is deducted (it decides the shorter no-deduction periods, e.g. Montana 10 days, Alaska 14); leave it out when that is not known yet.
    - `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: 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, moving_and_storage, reletting_costs (advertising or a broker to re-rent after an early move-out), trash_and_abandoned_items (removing trash or belongings left behind), other_damage, other. Carpet cleaning is cleaning (with cleaning_kind), not carpet.
    - `description` string, nullable: What was damaged or owed and the repair or charge (e.g. 'bedroom carpet: pet stains, two areas patched'). Printed under the line on the itemized statement you download (HTML or PDF); never stored, logged or hashed, and not in the result.
    - `amount_usd` union, required: Amount you intend to deduct, in dollars (rounded to cents).
      - number
      - string
    - `item_installed_on` string, date, nullable: When the item (carpet, paint, appliance...) was installed or last replaced (YYYY-MM-DD). Give this or item_age_years, not both.
    - `item_age_years` union: Age of the item in years at move-out (e.g. 4.5).
      - number
      - string
    - `useful_life_years` union: Override the useful life used for depreciation (years).
      - number
      - string
    - `caused_by_tenant` boolean, nullable: False when the condition is normal wear and tear (never deductible); null when it is disputed or unknown (a tenant checking a landlord's list): the line is then 'depends', with the amount the rule would allow if it is damage.
    - `has_receipt` boolean, nullable: You have a receipt, invoice or estimate for this line.
    - `has_photos` boolean, nullable: You have photos of this damage.
    - `good_faith_estimate` boolean, nullable: The amount is a good-faith estimate: the repair cannot reasonably be finished within the return period, or the vendor's bills have not arrived (California 1950.5(h)(3)). The receipts then follow within 14 days of the repair or the documents.
    - `utility_kind` 'water' | 'sewer' | 'electric' | 'gas' | 'heat' | 'trash' | 'internet' | 'other', nullable: unpaid_utilities only: which utility. Some states allow only some (Massachusetts: water); without it such a line is 'depends'.
    - `late_payments` integer, nullable: late_fees only: how many late payments (or months, where the cap is per month) the fee covers. A statutory cap is per late payment; without this, more than one cap is 'depends'.
    - `work_kind` 'repair' | 'replace' | 'cleaning', nullable: repair (restores the item: never depreciated), replace (a new item: prorated by the old one's remaining life where the rule does), or cleaning (e.g. carpet cleaning: judged as a cleaning line).
    - `rent_through` string, date, nullable: unpaid_rent only: the last day the rent charged covers. With new_tenant_moved_in_on it decides how much of the rent overlaps the new tenancy (not recoverable: the landlord cannot collect rent twice for the same days).
    - `cleaning_kind` 'beyond_wear' | 'routine' | 'unknown', nullable: cleaning only: beyond_wear (the unit was left dirtier than normal use; cleaning to restore its move-in condition), routine (ordinary cleaning after normal use, which most states treat as normal wear) or unknown. Where the statute does not name cleaning, an unknown kind is 'depends'.
  - `returned` Returned: What the landlord has returned so far: lets the result say whether the refund and the itemized statement came on time (``timeliness``).
    - `what` 'nothing' | 'full_refund' | 'partial_refund' | 'itemized_statement', required: nothing: nothing returned yet; full_refund: the whole deposit; partial_refund: part of it, with no itemized statement; itemized_statement: an itemized statement of deductions (with any refund the same day).
    - `on` string, date, nullable: Day it was sent or delivered (YYYY-MM-DD); required unless what is nothing. Statutes count the day the landlord mails or delivers it; a postmark is the best evidence.
    - `amount_usd` union: Amount refunded, dollars (partial_refund or itemized_statement).
      - number
      - string
    - `method` 'check' | 'electronic' | 'other', nullable: How the money went back: check, electronic (direct deposit or electronic transfer) or other. Some statutes key on it (Michigan 554.609(3): an electronic balance may follow the notice by 10 days; California 1950.5 as amended by AB 414: electronic return when the deposit or rent was paid electronically).
  - `documentation` Documentation
    - `itemized_statement` boolean, nullable: You will send (or sent) an itemized statement.
    - `receipts` boolean, nullable: You have receipts or invoices for the repairs and cleaning.
    - `photos_move_in` boolean, nullable: Dated move-in photos.
    - `photos_move_out` boolean, nullable: Dated move-out photos.
    - `photos_after_repair` boolean, nullable: Photos after repairs.
    - `cleaning_notice` boolean, nullable: You gave the tenant written notice of the cleaning needed and time to do it before charging for cleaning (Montana 70-25-201(3): 24 hours).
    - `move_in_condition_statement` boolean, nullable: You gave the tenant a written move-in condition statement or checklist (Montana 70-25-206, Washington 59.18.260; listed as a duty in Georgia 44-7-33(a), Kentucky 383.580(2), Michigan 554.608 and Virginia 55.1-1214).
    - `move_out_list` boolean, nullable: You inspected the unit and made the move-out damage list in time (Georgia 44-7-33(b): within 3 business days).
  - `as_of` string, date: Today's date (YYYY-MM-DD) for the deadline status. Defaults to today (UTC); send it for repeatable results.

## Response `200`

Successful Response

- DepositSettlementSettleResponse
  - `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` SettleResult, 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.
    - `as_of` string, date, required
    - `deadline` Deadline
      - `return_by` string, date, nullable: Last day to return the deposit.
      - `itemization_by` string, date, nullable: Last day for the itemized statement (often the same day; earlier in Chicago, later in Louisiana).
      - `extended_to` string, date, nullable: 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.
      - `interest_due_by` string, date, nullable: Last day to pay the interest owed, when the rule gives it its own date earlier than the deposit's (San Francisco Admin. Code 49.2(c): two weeks after the tenant vacated; Connecticut 47a-21(i): 21 days after the termination).
      - `reverted_after` string, date, nullable: status reverted: the last day the tenant could act (a written demand, Oklahoma 41 O.S. 115(B); a mailing address, Iowa 562A.12(4)); the deposit reverted to the landlord after it. Omitted otherwise.
      - `start_event` string, required: What starts the clock, in words.
      - `start_date` string, date, nullable
      - `days` integer, nullable: Period in days (None: months or none).
      - `months` integer, nullable: Period in calendar months, if any.
      - `counting` 'calendar' | 'business', required
      - `status` 'upcoming' | 'due_today' | 'overdue' | 'not_started' | 'none_in_statute' | 'reverted' | 'no_deposit' | 'met' | 'late', required: upcoming, due_today, overdue; met (the refund and statement went out on time and cover what is owed, per returned) or late (they went out after the last day); not_started when the start event is not given yet; none_in_statute when the statute sets no deadline (Kentucky, Tennessee).
      - `days_remaining` integer, nullable: Days from as_of to the last day: extended_to when the statute extends a weekend or holiday last day, else return_by (negative when overdue); when the open step is another one (an extended itemized statement), to outcome.next_due. None once met.
      - `alternatives` DeadlineAlternative[]: Other dates that apply on facts not given (send the named input): an earlier one the facts cannot rule in, or the later one when the earlier date leads.
        - `on` string, date, nullable: The date on that reading; null: no statutory deadline then (an exemption or a rule that does not apply).
        - `applies_if` string, required: The condition, in words.
        - `send` string, required: The input that decides it; empty when no input states the fact.
      - `note` string, nullable
    - `deductions` DeductionResult[]
      - `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
      - `amount_claimed_usd` string, required
      - `allowed` 'yes' | 'no' | 'depends', required
      - `basis` 'allowed_category' | 'normal_wear' | 'not_allowed' | 'unclassified' | 'forfeited' | 'statutory_bar' | 'mitigation' | 'excluded_by_fee' | 'documentation_missing', required
      - `depreciation` Depreciation
        - `applied` boolean, required
        - `method` 'straight_line' | 'step_table', nullable: straight_line: max(0, 1 - age / useful life); step_table: the band of a published schedule for the item's age (California paint).
        - `useful_life_years` string, nullable
        - `age_years` string, nullable: Age at move-out: full calendar years plus remaining days / 365, 2 decimals.
        - `remaining_fraction` string, nullable: Share of the cost the tenant can be charged, 4 decimals.
        - `source` string, nullable: useful_life row id (row:jurisdiction for a variant) or 'request'.
        - `schedule_source` string, nullable: Source id of the step table, when one was used.
        - `range_low_usd` string, nullable: Where the statute states no formula: the charge under the shortest useful life the sources give (the line is 'depends' at the default-life estimate).
        - `range_high_usd` string, nullable: The same under the longest useful life the sources give.
      - `amount_allowed_usd` string, required: What the rule lets you keep for this line ('depends' lines: not counted in totals until you confirm).
      - `range_low_usd` string, nullable: A 'depends' line's least amount on the facts given (e.g. rent after a new tenant's rent is credited at the same rate).
      - `range_high_usd` string, nullable: A 'depends' line's most (counted in refund_min_usd).
      - `exclusive_option` 'fee' | 'actual', nullable: Part of an either/or the statute sets (an early-termination fee, or the rent and re-renting costs it replaces): the totals count only the larger option.
      - `documentation_needed` string[]
      - `notes` string[]
    - `totals` TektoloDepositSettlementModelsTotals, required
      - `deposit_usd` string, required
      - `claimed_usd` string, required
      - `allowed_usd` string, required: Sum of lines with allowed = yes.
      - `depends_usd` string: Sum of 'depends' lines at the amount the rule would allow if they stand (not in allowed_usd or the refund).
      - `interest_usd` string, nullable: Interest credited (0 when none is owed; null when interest is or may be owed but its amount is not computed, so it is not in the refund).
      - `counted_floor_usd` string: The certain minimum of the 'depends' lines (their least amount on every reading), counted in the refund and itemized on the statement as its own deduction. The statement's total deductions are allowed_usd + counted_floor_usd.
      - `refund_due_usd` string, required: deposit + interest - allowed - counted_floor, never below 0.
      - `tenant_owes_usd` string, required: Allowed deductions above deposit + interest (collect separately).
      - `refund_min_usd` string: The refund if every 'depends' line stands: deposit + interest - allowed - depends, never below 0. Equals refund_due_usd when nothing depends.
    - `interest` Interest, required
      - `required` boolean, nullable, required: None: depends on facts you did not give.
      - `condition` string, nullable
      - `rate_percent` string, nullable: Percent per year (the move-out rate when rates change).
      - `basis` string, nullable: What the rate applies to: deposit, or the excess (Ohio).
      - `base_usd` string, nullable: The amount the rate applies to.
      - `method` string, nullable: simple, per_window, anniversary_years or monthly.
      - `period_days` integer, nullable
      - `parts` InterestPart[]: Per-period amounts when the rate changed.
        - `period_from` string, date, required
        - `period_to` string, date, required
        - `rate_percent` string, required
        - `amount_usd` string, required
      - `amount_usd` string, nullable
      - `if_required_usd` string, nullable: The amount owed if the condition holds (a rent ordinance's interest when coverage is not known); not in the refund.
      - `citation` string, nullable
      - `formula` string, nullable: The source's formula, in words.
      - `note` string, nullable
    - `documentation` DocumentationDuty[]
      - `duty` 'itemized_statement' | 'receipts' | 'photos' | 'photos_move_in' | 'move_in_statement' | 'move_out_list', required
      - `required` boolean, required
      - `met` 'yes' | 'no' | 'unknown', required
      - `citation` string, required
      - `threshold` string, nullable
      - `due_by` string, date, nullable: The duty's own last day, if dated.
      - `note` string, nullable
    - `penalty_exposure` PenaltyExposure
      - `applies_if` string, required
      - `kind` string, required
      - `multiple` string, nullable
      - `fixed_usd` string, nullable
      - `minimum_usd` string, nullable: Floor of the multiple.
      - `per_violation` boolean: fixed_usd is per violation.
      - `in_addition_to_refund` boolean: The damages come on top of returning the amount withheld (Ohio, West Virginia), not instead of it.
      - `basis` string, nullable
      - `discretionary` boolean, required
      - `plus_attorney_fees` boolean, required
      - `estimated_min_usd` string, nullable: The least of the readings when the statute's base is unsettled (a refund paid late, 'depends' lines, IL's 'deposit due'); None when it is the same as the max.
      - `base` string, nullable: What a multiple of the amount withheld is taken of: withheld, wrongfully_withheld, entitled_balance or exceeds_damages.
      - `estimated_max_usd` string, nullable: fixed + multiple x basis amount (with any floor or cap); exposure, not a verdict. None when the basis is unknown (monthly rent not given).
      - `forfeits_right_to_withhold` boolean, nullable, required: True: a late statement or refund takes away the right to withhold with no court finding; None: it does only on a finding (bad faith, willful, unreasonable); False: the statute states no such forfeiture.
      - `citation` string, required
      - `note` string, nullable
      - `additional` PenaltyExposure[]: City penalties in addition to the state's (not included in its estimate).
    - `deposit_cap` DepositCapCheck
      - `months_rent` string, nullable: None: no statutory cap.
      - `cap_usd` string, nullable
      - `exceeded` boolean, nullable: None when it depends on facts not given (see status).
      - `status` 'within' | 'exceeded' | 'depends' | 'unknown' | 'no_cap' | 'not_applicable': within / exceeded the cap; depends: between the cap and another limit that facts not given decide (alternative_cap_usd); unknown: monthly rent missing; no_cap; not_applicable: an exception the inputs show (Alaska rent over $2,000).
      - `alternative_cap_usd` string, nullable: The other limit when the cap depends on facts not given.
      - `counted_usd` string, nullable: The amount checked against the cap: the deposit, plus rent paid in advance where the statute counts it, less a pet deposit allowed on top.
      - `citation` string, required
      - `variants` string, nullable: Other caps by tenancy type or term; checked against the main.
      - `note` string, nullable
    - `forfeiture` ForfeitureCheck[]: The statute's forfeitures of the right to withhold, checked; a met one has already taken its lines out of the totals.
      - `trigger` string, required: late_statement, late_return, late_statement_or_return, late_claim_notice or not_in_input (facts the request cannot state).
      - `status` 'met' | 'not_yet' | 'complied' | 'not_started' | 'relieved' | 'unknown', required: met: the date passed without the statement or refund (or sending it now would be late), so the barred lines are not counted; not_yet: still time; complied: sent on time; not_started: the clock has not started; relieved: the statute excuses the duty here; unknown: turns on facts you did not give.
      - `due_by` string, date, nullable: The date the duty had to be met by.
      - `scope` 'all' | 'damage', required: all: every deduction; damage: damage and cleaning only.
      - `gate` string, required: none, or the finding needed first (bad_faith, ...).
      - `lines` integer[]: 0-based deduction lines it bars (when met).
      - `amount_released_usd` string: What those lines would otherwise have kept from the deposit.
      - `keeps_claim` boolean, required: The charges can still be sued for separately.
      - `citation` string, required
      - `note` string, nullable
    - `statement` Statement
      - `lines` StatementLine[], required
        - `label` string, required
        - `amount_usd` string, nullable
        - `note` string, nullable
      - `refund_due_usd` string, required
      - `due_by` string, date, nullable
      - `text` string, required: Draft itemized statement, plain text, no names or addresses, with every note for both audiences (the manager's full draft; see notes for which is which).
      - `notes` StatementNote[]: The statement's notes with their audience: put only the tenant notes on the statement you send; the manager notes are for you. Where a manager note would leave the tenant's copy silent, a neutral tenant note follows it (not repeated in text).
        - `text` string, required
        - `audience` 'tenant' | 'manager', required: tenant: belongs on the statement the tenant receives; manager: for the landlord or manager only (what to attach, what is not counted yet, what to do).
        - `kind` 'note' | 'required_notice' | 'attestation': required_notice: wording the statute requires on the statement, printed as given (with format); attestation: the statute's oath, printed above the signature line. Omitted for an ordinary note.
        - `citation` string, nullable: The section that requires the wording (required wording only).
        - `format` NoteFormat
          - `bold` boolean
          - `min_pt` integer, nullable: Smallest type size, in points.
          - `larger_than_body_pt` integer, nullable: At least this many points larger than the body text.
        - `blanks` string[]: Blanks in the text (a line of underscores) the manager fills in by hand, in order: the capability never takes names or addresses.
    - `outcome` Outcome: The one answer every other section is worded from: what is owed to the tenant now, by when, and what is still uncertain.
      - `status` 'upcoming' | 'due_today' | 'overdue' | 'not_started' | 'none_in_statute' | 'reverted' | 'no_deposit' | 'met' | 'late', required: The same value as deadline.status.
      - `refund_due_usd` string, required: totals.refund_due_usd: the rule's refund.
      - `refund_min_usd` string, required: The refund if every 'depends' line is kept.
      - `interest_usd` string, nullable: Interest owed and computed; None when interest is owed but not computed (see interest_unknown) or not owed.
      - `interest_unknown` boolean: Interest is (or may be) owed but its amount is not computed.
      - `returned_usd` string, nullable: Already returned to the tenant (returned.amount_usd; the deposit for a full refund with no amount; 0 for nothing); None when not said or not given.
      - `owed_now_usd` string, nullable: Still owed to the tenant: refund_due_usd minus returned_usd, never below 0 (None when the amount returned is not known, or when required interest is still owed but not computed: see the interest_still_owed warning).
      - `owed_now_min_usd` string, nullable: The same against refund_min_usd.
      - `tenant_owes_usd` string, required
      - `next_due` string, date, nullable: The earliest open step's last day (what to act on first).
      - `stages` Stage[]
        - `duty` 'itemized_statement' | 'refund' | 'interest', required: itemized_statement (or notice of claim, where it has its own date), refund (the deposit or the balance), or interest still unpaid after the refund.
        - `label` string, required: The step in words.
        - `due_by` string, date, nullable: The last day, with the statute's roll-forward applied.
        - `status` 'met' | 'late' | 'short' | 'overdue' | 'due_today' | 'upcoming' | 'not_started' | 'none_in_statute', required
        - `done_on` string, date, nullable
        - `days` integer, nullable: Days left (upcoming), or days late (late, overdue, short).
      - `uncertain` string[]: What the answer still turns on, in words.
    - `timeliness` Timeliness: Whether what the landlord returned (``returned``) came on time.
      - `what` 'nothing' | 'full_refund' | 'partial_refund' | 'itemized_statement', required
      - `on` string, date, nullable
      - `late` boolean, nullable, required: True: a duty is late or overdue (with nothing returned: every way the rule can be met has passed). False: on time or not yet due. None: no deadline, or the clock has not started.
      - `days_late` integer, nullable: Days late (the most of any duty; with nothing returned, the days since the last way of meeting the rule passed).
      - `late_since` string, date, nullable: With nothing returned: the day from which it is late.
      - `checks` TimelyCheck[]
        - `duty` 'refund' | 'itemized_statement' | 'interest', required
        - `due_by` string, date, nullable: Last day under the rule, with the statute's weekend or holiday roll-forward applied (the legal limit).
        - `done_on` string, date, nullable: When it was sent; None: not yet.
        - `status` 'on_time' | 'late' | 'not_yet_due' | 'overdue' | 'not_started' | 'none_in_statute' | 'reverted', required: on_time / late (done, by or after due_by); not_yet_due / overdue (not done as of as_of); not_started (the start event is missing); none_in_statute; reverted (the deposit reverted to the landlord: no deadline runs; note says why).
        - `days_late` integer, nullable: Days after due_by (late, or overdue as of as_of).
        - `days_left` integer, nullable: Days until due_by (not_yet_due).
        - `note` string, nullable
      - `amount_returned_usd` string, nullable
      - `amount_kept_usd` string, nullable: Deposit minus the amount returned (what is withheld).
      - `difference_usd` string, nullable: totals.refund_due_usd minus the amount returned (positive: less came back than the rule's refund on the deductions given).
      - `difference_min_usd` string, nullable: The same against totals.refund_min_usd.
      - `note` string
    - `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
    - `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
    - `warnings` TektoloDepositSettlementModelsNote[]
      - `code` string, required
      - `text` string, required
    - `assumptions` TektoloDepositSettlementModelsNote[]
      - `code` string, required
      - `text` string, required
    - `unknowns` TektoloDepositSettlementModelsNote[]
      - `code` string, required
      - `text` string, required
    - `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)
