addedInput schema / $defs / Evidence
Added value: +{
+ "additionalProperties": false,
+ "description": "A negative or working result clears: inspector any hazard; lab mold, lead, asbestos, drugs, sewage; meter moisture; self_test or checklist a device.",
+ "properties": {
+ "kind": {
+ "$ref": "#/$defs/EvidenceKind",
+ "type": "string"
+ },
+ "material": {
+ "description": "What was tested, e.g. 'kitchen floor tile'.",
+ "maxLength": 80,
+ "type": "string"
+ },
+ "result": {
+ "$ref": "#/$defs/EvidenceResult",
+ "type": "string"
+ }
+ },
+ "required": [
+ "kind",
+ "result"
+ ],
+ "type": "object"
+}
addedInput schema / $defs / EvidenceKind
Added value: +{
+ "enum": [
+ "self_test",
+ "lab",
+ "meter",
+ "checklist",
+ "inspector"
+ ],
+ "type": "string"
+}
addedInput schema / $defs / EvidenceResult
Added value: +{
+ "enum": [
+ "negative",
+ "positive",
+ "working",
+ "failed"
+ ],
+ "type": "string"
+}
changedInput schema / $defs / Extraction / description
Previous value: -"How a finding was produced, when software read it from free text (contract 0.4.0) or\nfrom an uploaded document (``ai_document`` and ``page``, additive).\n\nSet by the web tool when its AI reader (Azure OpenAI) turned a person's own words, or a page\nof their inspection report, into this finding. The engine reports such a finding as\n``resolution: \"ai\"`` with ``needs_review`` and flags its lines; it never changes how the\nfinding is priced."New value: +"How our AI reader read a finding; never changes the price."
addedInput schema / $defs / Extraction / properties / cell
Added value: +{
+ "description": "ai_document: the cell read; move_in bills nothing, a hazard there is Possible.",
+ "enum": [
+ "move_out",
+ "move_in",
+ "comment"
+ ],
+ "type": "string"
+}
changedInput schema / $defs / Extraction / properties / confidence / description
Previous value: -"The reader's confidence, 0 to 1."New value: +"0 to 1."
changedInput schema / $defs / Extraction / properties / method / description
Previous value: -"'ai': read by a language model from free text. 'ai_document': read by a language model from a page of an uploaded document."New value: +"ai: free text; ai_document: an upload's page."
changedInput schema / $defs / Extraction / properties / model / description
Previous value: -"The model that read it, e.g. 'gpt-5-nano 2025-08-07'."New value: +"The model that read it."
changedInput schema / $defs / Extraction / properties / page / description
Previous value: -"'ai_document' only: the page of the upload it was read from (1-based)."New value: +"ai_document: the page read."
addedInput schema / $defs / Extraction / properties / prompt_version
Added value: +{
+ "description": "The reader's prompt version.",
+ "maxLength": 40,
+ "pattern": "^[A-Za-z0-9._:-]+$",
+ "type": "string"
+}
changedInput schema / $defs / Extraction / properties / quote / description
Previous value: -"'ai_document' only: the row's words as printed on that page, contact details masked. Evidence for checking the finding; it never changes the price."New value: +"ai_document: the row's words, contacts masked."
changedInput schema / $defs / Extraction / properties / review / description
Previous value: -"'ai_document' only: the person's review before estimating (confirmed, accepted or edited). Leave out when the finding was not checked; it then needs review."New value: +"ai_document: the person's review."
changedInput schema / $defs / ExtractionReview / description
Previous value: -"What the person did with a finding the web tool read from an uploaded document, before\nestimating (contract 0.11.0, additive). ``confirmed``: they pressed \"Looks right\";\n``accepted``: left as read, on a row the page did not flag; ``edited``: they changed it\n(``changed`` names what). A reviewed finding keeps its ``extraction`` (where it came from)\nbut is no longer reported as needing review: the person has checked it."New value: +"A person's review of a finding read from a document."
changedInput schema / $defs / ExtractionReview / properties / changed / description
Previous value: -"'edited': the fields the person changed."New value: +"edited: the fields changed."
changedInput schema / $defs / ExtractionReview / properties / flags / description
Previous value: -"Why the page flagged it, if it did."New value: +"Why the page flagged it."
changedInput schema / $defs / ExtractionReview / properties / flags / items / enum
Previous value: -[
- "low_confidence",
- "medium_confidence",
- "quote_not_on_page",
- "count_unread",
- "column_unclear",
- "ok_unclear",
- "unmatched",
- "loose_match",
- "ai_match"
-]New value: +[
+ "low_confidence",
+ "medium_confidence",
+ "quote_not_on_page",
+ "count_unread",
+ "column_unclear",
+ "ok_unclear",
+ "unmatched",
+ "ai_match"
+]
changedInput schema / $defs / ExtractionReview / properties / flags / maxItems
Previous value: -9New value: +8
changedInput schema / $defs / Finding / description
Previous value: -"One observed condition. Give a taxonomy `code` if you know it, else a `description`."New value: +"One observed condition, coded from the issue-code catalog."
addedInput schema / $defs / Finding / properties / area_sq_ft
Added value: +{
+ "anyOf": [
+ {
+ "exclusiveMinimum": 0,
+ "maximum": 100000,
+ "type": "number"
+ },
+ {
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
+ "type": "string"
+ }
+ ],
+ "description": "Measured area in sq ft; wins over a derived size."
+}
changedInput schema / $defs / Finding / properties / code / description
Previous value: -"Optional. Only a code returned by property_turnover_issue_codes (e.g. 'walls.nail_holes'); otherwise leave it out and use description."New value: +"From property_turnover_issue_codes; general.manual_quote if none fits. Send it on every finding."
addedInput schema / $defs / Finding / properties / code / enum
Added value: +[
+ "adhesive.residue",
+ "asbestos.suspect",
+ "bath.accessory_missing",
+ "bath.grab_bar_loose",
+ "bath.mildew_surface",
+ "blinds.bent_missing",
+ "blinds.dirty",
+ "cabinet.base_water_damage",
+ "cabinet.damage_widespread",
+ "cabinet.door_damaged",
+ "cabinet.hinge_loose",
+ "cabinet.surface_worn",
+ "carpet.burn",
+ "carpet.odor",
+ "carpet.pet_urine",
+ "carpet.replace_room",
+ "carpet.soiled",
+ "carpet.stained",
+ "carpet.torn_frayed",
+ "carpet.water_damaged",
+ "carpet.worn_matted",
+ "carpet.wrinkled",
+ "caulk.sink_counter",
+ "ceiling.hole",
+ "ceiling.nail_pops",
+ "ceiling.popcorn_damaged",
+ "ceiling.repaint",
+ "ceiling.sagging",
+ "ceiling.stain",
+ "ceiling_fan.broken",
+ "clean.general",
+ "clean.heavy_soil",
+ "clean.windows",
+ "closet.shelf_rod_missing",
+ "countertop.chip_burn",
+ "countertop.replace",
+ "countertop.substrate_exposed",
+ "dishwasher.inoperable",
+ "dishwasher.missing",
+ "disposal.inoperable",
+ "door.closet_off_track",
+ "door.entry_damaged",
+ "door.entry_sticks",
+ "door.fire_rated_defect",
+ "door.interior_hole",
+ "door.interior_replace",
+ "door.interior_sticks",
+ "door.slider_damaged",
+ "door.stop_missing",
+ "door.weatherstrip_missing",
+ "drain.blocked_slow",
+ "electrical.exposed_wiring",
+ "electrical.panel_issue",
+ "exhaust_fan.inoperable",
+ "exterior.paint_peeling",
+ "exterior.walkway_hazard",
+ "faucet.leak",
+ "fence.pool_gate_latch",
+ "fireplace.firebox_damaged",
+ "floor.soft_spot",
+ "floor.substrate_exposed",
+ "floor.trip_hazard",
+ "garage.cleanout",
+ "garage.door_inoperable",
+ "garage.safety_reverse",
+ "general.manual_quote",
+ "gfci.missing",
+ "gfci.test_fail",
+ "hardwood.water_stain",
+ "hardwood.worn",
+ "hvac.dryer_duct_unsafe",
+ "hvac.dryer_vent_lint",
+ "hvac.filter_dirty",
+ "hvac.minisplit_dirty",
+ "hvac.not_heating_cooling",
+ "hvac.vent_cover_missing",
+ "key.missing",
+ "laundry.hookup_leak",
+ "lead.paint_concern",
+ "leak.active_water",
+ "leak.moisture_elevated",
+ "leak.sewage",
+ "light.bulb_out",
+ "light.fixture_damaged",
+ "lock.deadbolt_broken",
+ "lock.knob_broken",
+ "lock.rekey",
+ "lock.smart_reset",
+ "lvp.plank_damaged",
+ "lvp.water_swollen",
+ "mailbox.lock_change",
+ "microwave.inoperable",
+ "microwave.otr_inoperable",
+ "mirror.damaged",
+ "mold.visible_large",
+ "mold.visible_medium",
+ "mold.visible_small",
+ "odor.general",
+ "outlet.burn_marks",
+ "outlet.dead",
+ "patio.dirty",
+ "pest.bedbugs",
+ "pest.inspection_turn",
+ "pest.other",
+ "pest.roaches",
+ "pest.rodents",
+ "range.anti_tip_missing",
+ "range.burner_inoperable",
+ "range.cooktop_glass_cracked",
+ "range.dirty",
+ "range.missing",
+ "range.oven_not_heating",
+ "range.parts_missing",
+ "range.replace",
+ "range_hood.filter",
+ "refrigerator.dirty",
+ "refrigerator.gasket",
+ "refrigerator.ice_maker",
+ "refrigerator.missing",
+ "refrigerator.not_cooling",
+ "refrigerator.parts_missing",
+ "remote.garage_missing",
+ "safety.biohazard",
+ "safety.co_alarm_inoperable",
+ "safety.co_alarm_missing",
+ "safety.combustible_clearance",
+ "safety.drug_contamination",
+ "safety.egress_blocked",
+ "safety.extinguisher_expired",
+ "safety.fire_damage",
+ "safety.gas_leak",
+ "safety.guardrail_stairs",
+ "safety.hazardous_material",
+ "safety.hvac_combustion",
+ "safety.pest_extensive",
+ "safety.roof_envelope",
+ "safety.sharp_edge",
+ "safety.smoke_alarm_expired",
+ "safety.smoke_alarm_missing",
+ "safety.structural_concern",
+ "shower.door_damaged",
+ "shower.head_leaks",
+ "shower.rod_missing",
+ "sink.chipped",
+ "sink.not_draining",
+ "switch.broken",
+ "switch_plate.missing",
+ "tenant_alteration.restore",
+ "thermostat.broken",
+ "tile.cracked",
+ "tile.grout_dirty",
+ "tile.grout_missing",
+ "toilet.clog",
+ "toilet.cracked",
+ "toilet.loose_base",
+ "toilet.running",
+ "toilet.seat_broken",
+ "trash.heavy",
+ "trash.light",
+ "trim.baseboard_damaged",
+ "trim.casing_damaged",
+ "trim.paint_worn",
+ "tub.caulk_failed",
+ "tub.chip_stain",
+ "tub.surround_damaged",
+ "unit.final_inspection",
+ "vanity.damaged",
+ "vct.dull_dirty",
+ "vinyl.lifting",
+ "vinyl.torn_gouged",
+ "walls.crack_hairline",
+ "walls.crack_structural",
+ "walls.hole_medium",
+ "walls.holes_many",
+ "walls.holes_multiple",
+ "walls.large_hole",
+ "walls.nail_holes",
+ "walls.paint_aged",
+ "walls.paint_peeling",
+ "walls.paint_unauthorized_color",
+ "walls.scuffs",
+ "walls.smoke_nicotine",
+ "walls.stain_other",
+ "walls.stain_water",
+ "walls.surface_detached",
+ "walls.texture_damage",
+ "walls.touchup",
+ "walls.wallpaper",
+ "washer_dryer.inoperable",
+ "water_heater.no_hot_water",
+ "window.glass_cracked",
+ "window.lock_broken",
+ "window.screen_missing",
+ "window.screen_torn",
+ "window.seal_failed",
+ "window.sill_damaged",
+ "window.stuck",
+ "yard.debris",
+ "yard.overgrown"
+]
changedInput schema / $defs / Finding / properties / confirmed / description
Previous value: -"true: the person checked this AI-read finding (one with extraction) and it says what they meant. It keeps resolution 'ai' but no longer needs review, and the answer is verified once every AI-read finding is confirmed."New value: +"true: the person checked this AI-read finding."
changedInput schema / $defs / Finding / properties / description / description
Previous value: -"Plain description if no code, e.g. 'dog urine stains in bedroom carpet'."New value: +"Deprecated; send code, with the words in source_text."
addedInput schema / $defs / Finding / properties / evidence
Added value: +{
+ "$ref": "#/$defs/Evidence",
+ "description": "The test behind the finding; the only thing that clears a hazard.",
+ "type": "object"
+}
changedInput schema / $defs / Finding / properties / extent / description
Previous value: -"spot | partial | full; defaults per issue."New value: +"Only when the words say how far; else the code's default."
changedInput schema / $defs / Finding / properties / extraction / description
Previous value: -"Set by Tektolo's AI reader on findings it read from free text or a document (reading.findings of an earlier answer); keep it when you send such a finding back. They come back as resolution 'ai' with needs_review unless confirmed."New value: +"Set by our AI reader; send it back unchanged."
changedInput schema / $defs / Finding / properties / id / description
Previous value: -"Your id for this finding; defaults to f1, f2, ... in order."New value: +"Your id; defaults to f1, f2, ... in order."
changedInput schema / $defs / Finding / properties / location / description
Previous value: -"Object {\"area\": \"bedroom\", \"label\": \"Bedroom 2\"}, or a plain string such as \"Bedroom 2\" or \"kitchen\" (mapped to an area; other text becomes the label)."New value: +"{\"area\": \"bedroom\", \"label\": \"Bedroom 2\"} or \"Bedroom 2\"; older form of rooms."
addedInput schema / $defs / Finding / properties / material
Added value: +{
+ "description": "The material as written, e.g. '9x9 vinyl tile'.",
+ "maxLength": 80,
+ "type": "string"
+}
addedInput schema / $defs / Finding / properties / notes / description
Added value: +"More words; never billed or coded from."
changedInput schema / $defs / Finding / properties / quantity / description
Previous value: -"Measured amount, e.g. 120 sq_ft. Derived when omitted."New value: +"Measured amount (120 sq_ft), only as the words give it."
addedInput schema / $defs / Finding / properties / repeat_of
Added value: +{
+ "description": "Id of an earlier finding this repeats in its own rooms (\"same as above\"); it bills.",
+ "maxLength": 40,
+ "pattern": "^[A-Za-z0-9_.:-]+$",
+ "type": "string"
+}
addedInput schema / $defs / Finding / properties / rooms
Added value: +{
+ "$ref": "#/$defs/Rooms",
+ "description": "Which rooms: {\"area\": \"bedroom\", \"count\": 3} is all 3 bedrooms; labels name them.",
+ "type": "object"
+}
changedInput schema / $defs / Finding / properties / signature_like / description
Previous value: -"Set by Tektolo's notes reader (reading.findings, the web tool's rows): the words came right after a sign-off and read like a name or signature ('Thanks!' / 'Rotten Egg Smell'), kept only because they name a safety item. A safety item in them is raised unconfirmed (check first). Keep it when you send such a finding back, so every way of sending the same words gives the same answer."New value: +"Set by our reader; send it back unchanged."
addedInput schema / $defs / Finding / properties / source_text
Added value: +{
+ "description": "The original words. Scanned for hazards; never billed or coded from.",
+ "maxLength": 1000,
+ "type": "string"
+}
addedInput schema / $defs / Finding / properties / status
Added value: +{
+ "$ref": "#/$defs/FindingStatus",
+ "default": "needed",
+ "description": "Only needed (the default) bills; on a hazard, done/ok/none without evidence stays Possible.",
+ "type": "string"
+}
addedInput schema / $defs / Finding / properties / year_statement
Added value: +{
+ "$ref": "#/$defs/YearStatement",
+ "description": "A year said in passing (\"built 1972\"); never sets property.year_built.",
+ "type": "object"
+}
addedInput schema / $defs / FindingStatus
Added value: +{
+ "enum": [
+ "needed",
+ "done",
+ "ok",
+ "none"
+ ],
+ "type": "string"
+}
changedInput schema / $defs / FloorCoverings / properties / carpet_present / description
Previous value: -"Is there wall-to-wall carpet? Omit if unknown: carpet findings then imply carpet; with no carpet findings, whole-unit carpet cleaning is left out and listed as unknown."New value: +"Is there wall-to-wall carpet? Omit if unknown."
changedInput schema / $defs / FloorCoverings / properties / carpet_sq_ft / description
Previous value: -"Carpeted floor area. Omit to assume 60% of the unit floor area."New value: +"Carpeted area; omit to assume 60% of the floor area."
changedInput schema / $defs / Location / description
Previous value: -"Where the finding is. Also accepted as a plain string (\"Bedroom 2\", \"kitchen\")."New value: +"Where; a plain string works too."
addedInput schema / $defs / Occupants
Added value: +{
+ "additionalProperties": false,
+ "description": "property.occupants: lead-rule facts about the unit; leave out what is unknown.",
+ "properties": {
+ "child_under_6": {
+ "description": "A child under 6 lives there or is expected to.",
+ "type": "boolean"
+ },
+ "elderly": {
+ "description": "Housing for the elderly (62+) or disabled; not just an older tenant.",
+ "type": "boolean"
+ },
+ "hud_assisted": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+}
addedInput schema / $defs / PropertyProfile / properties / occupants
Added value: +{
+ "$ref": "#/$defs/Occupants",
+ "type": "object"
+}
addedInput schema / $defs / PropertyProfile / properties / walk_date
Added value: +{
+ "description": "The walk-through date; dated or aged items are judged against it. Omit if unknown.",
+ "format": "date",
+ "type": "string"
+}
changedInput schema / $defs / RateCardEntry / description
Previous value: -"Your own price. Examples: {\"trade\": \"handyman\", \"unit_price\": 65, \"uom\": \"hour\"} (an\nhourly labor rate for that trade); {\"trade\": \"painter\", \"min_charge\": 150} (visit minimum);\n{\"task_id\": \"carpet.clean\", \"unit_price\": 0.2, \"uom\": \"sq_ft\"} (task_id from a result line).\nA task_id entry beats a trade entry; both beat the library. The result lists what was\napplied and what was ignored (rate_card_applied / rate_card_ignored)."New value: +"Your price for a task_id (from a result line) or a trade, e.g. {\"trade\": \"handyman\", \"unit_price\": 65, \"uom\": \"hour\"}."
changedInput schema / $defs / RateCardEntry / properties / unit_price / description
Previous value: -"USD per uom. On a trade entry, uom 'hour' is an hourly labor rate (replaces the labor part of that trade's prices); another uom prices that trade's tasks in it."New value: +"USD per uom; on a trade entry, uom 'hour' is its labor rate."
changedInput schema / $defs / RateCardEntry / properties / uom / description
Previous value: -"Unit your price is quoted in. Required with a trade unit_price. If it differs from a task's uom, the entry is not applied to that task (see rate_card_ignored)."New value: +"Required with a trade unit_price; a task in another uom ignores it."
addedInput schema / $defs / Rooms
Added value: +{
+ "additionalProperties": false,
+ "description": "Which rooms a finding covers.",
+ "properties": {
+ "area": {
+ "$ref": "#/$defs/Area",
+ "default": "whole_unit",
+ "description": "Left out, from the labels, else the whole unit.",
+ "type": "string"
+ },
+ "count": {
+ "default": 1,
+ "description": "At least the number of labels; capped at the unit's count.",
+ "maximum": 50,
+ "minimum": 1,
+ "type": "integer"
+ },
+ "labels": {
+ "description": "The rooms' names as written, e.g. ['Bedroom 2'].",
+ "items": {
+ "type": "string"
+ },
+ "maxItems": 12,
+ "type": "array"
+ }
+ },
+ "type": "object"
+}
addedInput schema / $defs / YearStatement
Added value: +{
+ "additionalProperties": false,
+ "description": "When the words say it was built.",
+ "properties": {
+ "text": {
+ "description": "The words, e.g. 'built in 1972'.",
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "year": {
+ "description": "Left out when the words name none ('Victorian').",
+ "maximum": 2100,
+ "minimum": 1700,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "text"
+ ],
+ "type": "object"
+}
changedInput schema / examples
Previous value: -[
- {
- "findings": [
- {
- "description": "pet urine in carpet",
- "location": "Bedroom 2"
- },
- {
- "description": "3 blinds broken",
- "quantity": {
- "uom": "each",
- "value": 3
- }
- }
- ],
- "property": {
- "bathrooms": 1,
- "bedrooms": 2,
- "zip": "43215"
- }
- }
-]New value: +[
+ {
+ "findings": [
+ {
+ "code": "carpet.pet_urine",
+ "rooms": "Bedroom 2",
+ "source_text": "pet urine in BR2 carpet"
+ },
+ {
+ "code": "blinds.bent_missing",
+ "quantity": {
+ "uom": "each",
+ "value": 3
+ }
+ }
+ ],
+ "property": {
+ "bathrooms": 1,
+ "bedrooms": 2,
+ "zip": "43215"
+ }
+ }
+]
changedInput schema / properties / detail / description
Previous value: -"summary: totals, trade scopes, every line tied to a finding (capped at 40) plus the largest must-fix/refer-out lines, a one-line note on the routine lines left out, notes, and only findings needing attention (small). full: every line, finding and source."New value: +"summary (small): totals, trade scopes, lines tied to findings. full: all."
changedInput schema / properties / findings / description
Previous value: -"Move-out inspection findings, one per condition, with location and extent."New value: +"Move-out inspection findings, one per observed condition, coded."
changedInput schema / properties / read / description
Previous value: -"parser (default): descriptions are read by the deterministic parser and matcher only; what they cannot place comes back as a manual-quote line with suggested codes. ai: what the parser cannot place is then read by an AI model; the answer is a draft (review.status) and echoes the reading, whose findings you confirm and send back for a verified answer (contract 0.12.0)."New value: +"Deprecated and ignored: scope reads no free text."
changedInput schema / properties / retain / description
Previous value: -"Optional (contract 0.5.0). false: keep none of this request's text. By default the finding descriptions are kept with contact details and access codes removed, to improve matching; the estimate is the same either way."New value: +"false: keep none of this request's text."
addedOutput schema / $defs / Deprecation
Added value: +{
+ "properties": {
+ "field": {
+ "type": "string"
+ },
+ "until": {
+ "format": "date",
+ "type": "string"
+ },
+ "use": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "field",
+ "until",
+ "use"
+ ],
+ "type": "object"
+}
addedOutput schema / $defs / Provenance / properties / rules_as_of
Added value: +{
+ "anyOf": [
+ {
+ "format": "date",
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null
+}
addedOutput schema / $defs / SourceRef / properties / accessed
Added value: +{
+ "anyOf": [
+ {
+ "format": "date",
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null
+}
addedOutput schema / properties / deprecation
Added value: +{
+ "anyOf": [
+ {
+ "items": {
+ "$ref": "#/$defs/Deprecation"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null
+}