Raw schema
{
"type": "object",
"properties": {
"client_refs": {
"anyOf": [
{
"additionalProperties": {
"type": "string"
},
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "Your own reference ids (e.g. unit_id, job_id). Echoed back, never used.",
"title": "Client Refs"
},
"property": {
"$ref": "#/$defs/PropertyProfile"
},
"findings": {
"items": {
"$ref": "#/$defs/Finding"
},
"maxItems": 200,
"title": "Findings",
"type": "array"
},
"standards": {
"$ref": "#/$defs/Standards"
},
"rate_card": {
"items": {
"$ref": "#/$defs/RateCardEntry"
},
"maxItems": 300,
"title": "Rate Card",
"type": "array"
},
"trade_vendors": {
"additionalProperties": {
"$ref": "#/$defs/Vendor"
},
"propertyNames": {
"$ref": "#/$defs/Trade"
},
"title": "Trade Vendors",
"type": "object"
},
"constraints": {
"$ref": "#/$defs/Constraints"
},
"tax_rate": {
"anyOf": [
{
"maximum": 0.2,
"minimum": 0,
"type": "number"
},
{
"pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Applied to all lines, e.g. 0.07.",
"title": "Tax Rate"
},
"decisions": {
"items": {
"$ref": "#/$defs/Decision"
},
"maxItems": 500,
"title": "Decisions",
"type": "array"
},
"detail": {
"default": "summary",
"description": "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.",
"enum": [
"summary",
"full"
],
"title": "Detail",
"type": "string"
},
"audit": {
"default": false,
"description": "Also return the run record and input/result hashes (an audit trail). Default false.",
"title": "Audit",
"type": "boolean"
}
},
"required": [
"property"
],
"$defs": {
"Area": {
"enum": [
"whole_unit",
"kitchen",
"living_room",
"dining_room",
"bedroom",
"bathroom",
"hallway",
"entry",
"laundry",
"closet",
"garage",
"patio_balcony",
"exterior",
"yard",
"other"
],
"title": "Area",
"type": "string"
},
"Constraints": {
"additionalProperties": false,
"properties": {
"target_ready_date": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Target Ready Date"
},
"occupied": {
"default": false,
"description": "Work happens while occupied.",
"title": "Occupied",
"type": "boolean"
},
"access_notes": {
"anyOf": [
{
"maxLength": 500,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Access Notes"
}
},
"title": "Constraints",
"type": "object"
},
"Decision": {
"additionalProperties": false,
"description": "Owner decision. Re-run the same request with decisions to get the approved scope.",
"properties": {
"line_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Line Id"
},
"finding_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Finding Id"
},
"action": {
"enum": [
"approve",
"decline",
"defer"
],
"title": "Action",
"type": "string"
},
"note": {
"anyOf": [
{
"maxLength": 300,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Note"
}
},
"required": [
"action"
],
"title": "Decision",
"type": "object"
},
"Extent": {
"enum": [
"spot",
"partial",
"full"
],
"title": "Extent",
"type": "string"
},
"Finding": {
"additionalProperties": false,
"description": "One observed condition. Give a taxonomy `code` if you know it, else a `description`.",
"properties": {
"id": {
"anyOf": [
{
"maxLength": 40,
"pattern": "^[A-Za-z0-9_.:-]+$",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Your id for this finding; defaults to f1, f2, ... in order.",
"title": "Id"
},
"location": {
"$ref": "#/$defs/Location",
"description": "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)."
},
"code": {
"anyOf": [
{
"maxLength": 80,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional. Only a code returned by property_turnover_issue_codes (e.g. 'walls.nail_holes'); otherwise leave it out and use description.",
"title": "Code"
},
"description": {
"anyOf": [
{
"maxLength": 300,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Plain description if no code, e.g. 'dog urine stains in bedroom carpet'.",
"title": "Description"
},
"extent": {
"anyOf": [
{
"$ref": "#/$defs/Extent"
},
{
"type": "null"
}
],
"default": null,
"description": "spot | partial | full; defaults per issue."
},
"quantity": {
"anyOf": [
{
"$ref": "#/$defs/Quantity"
},
{
"type": "null"
}
],
"default": null,
"description": "Measured amount, e.g. 120 sq_ft. Derived when omitted."
},
"notes": {
"anyOf": [
{
"maxLength": 1000,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Notes"
}
},
"title": "Finding",
"type": "object"
},
"FloorCoverings": {
"additionalProperties": false,
"description": "What is on the floors. Drives the carpet-cleaning baseline and whole-unit carpet sizes.",
"properties": {
"carpet_present": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "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.",
"title": "Carpet Present"
},
"carpet_sq_ft": {
"anyOf": [
{
"maximum": 20000,
"minimum": 0,
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Carpeted floor area. Omit to assume 60% of the unit floor area.",
"title": "Carpet Sq Ft"
}
},
"title": "FloorCoverings",
"type": "object"
},
"Location": {
"additionalProperties": false,
"description": "Where the finding is. Also accepted as a plain string (\"Bedroom 2\", \"kitchen\").",
"properties": {
"area": {
"$ref": "#/$defs/Area",
"default": "whole_unit"
},
"label": {
"anyOf": [
{
"maxLength": 60,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "e.g. 'Bedroom 2'.",
"title": "Label"
}
},
"title": "Location",
"type": "object"
},
"PriceTier": {
"description": "Purchasing channel. Library prices are pm_vendor (a PM buying turns from a local vendor).",
"enum": [
"bulk_contract",
"pm_vendor",
"retail_one_off"
],
"title": "PriceTier",
"type": "string"
},
"Profile": {
"enum": [
"minimum",
"standard",
"premium"
],
"title": "Profile",
"type": "string"
},
"PropertyProfile": {
"additionalProperties": false,
"properties": {
"zip": {
"description": "5-digit US ZIP code (no street address).",
"pattern": "^\\d{5}$",
"title": "Zip",
"type": "string"
},
"unit_type": {
"$ref": "#/$defs/UnitType",
"default": "apartment",
"description": "Single-family homes and townhomes get house-sized defaults (floor area, locks)."
},
"bedrooms": {
"description": "0 for a studio.",
"maximum": 12,
"minimum": 0,
"title": "Bedrooms",
"type": "integer"
},
"bathrooms": {
"anyOf": [
{
"maximum": 12,
"minimum": 0,
"multipleOf": 0.5,
"type": "number"
},
{
"pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
"type": "string"
}
],
"description": "Half baths count as 0.5.",
"title": "Bathrooms"
},
"sq_ft": {
"anyOf": [
{
"maximum": 20000,
"minimum": 150,
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Interior sq ft.",
"title": "Sq Ft"
},
"year_built": {
"anyOf": [
{
"maximum": 2100,
"minimum": 1700,
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Drives lead-paint (pre-1978) handling.",
"title": "Year Built"
},
"floor_coverings": {
"$ref": "#/$defs/FloorCoverings"
}
},
"required": [
"zip",
"bedrooms",
"bathrooms"
],
"title": "PropertyProfile",
"type": "object"
},
"Quantity": {
"additionalProperties": false,
"properties": {
"value": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 100000,
"type": "number"
},
{
"pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
"type": "string"
}
],
"title": "Value"
},
"uom": {
"$ref": "#/$defs/Uom"
}
},
"required": [
"value",
"uom"
],
"title": "Quantity",
"type": "object"
},
"RateCardEntry": {
"additionalProperties": false,
"description": "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).",
"properties": {
"task_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "A task_id from a result line, e.g. 'carpet.clean'.",
"title": "Task Id"
},
"trade": {
"anyOf": [
{
"$ref": "#/$defs/Trade"
},
{
"type": "null"
}
],
"default": null
},
"unit_price": {
"anyOf": [
{
"minimum": 0,
"type": "number"
},
{
"pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "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.",
"title": "Unit Price"
},
"uom": {
"anyOf": [
{
"$ref": "#/$defs/Uom"
},
{
"type": "null"
}
],
"default": null,
"description": "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)."
},
"min_charge": {
"anyOf": [
{
"minimum": 0,
"type": "number"
},
{
"pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "USD per trade visit.",
"title": "Min Charge"
},
"trip_charge": {
"anyOf": [
{
"minimum": 0,
"type": "number"
},
{
"pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "USD per trade visit.",
"title": "Trip Charge"
}
},
"title": "RateCardEntry",
"type": "object"
},
"Standards": {
"additionalProperties": false,
"properties": {
"profile": {
"$ref": "#/$defs/Profile",
"default": "standard",
"description": "minimum (rent-ready basics) | standard | premium (higher finish)."
},
"overrides": {
"$ref": "#/$defs/StandardsOverrides"
},
"price_tier": {
"$ref": "#/$defs/PriceTier",
"default": "pm_vendor",
"description": "bulk_contract (portfolio contract prices) | pm_vendor (default: a property manager buying turns from local vendors) | retail_one_off (an owner hiring one contractor)."
}
},
"title": "Standards",
"type": "object"
},
"StandardsOverrides": {
"additionalProperties": false,
"properties": {
"paint_policy": {
"anyOf": [
{
"enum": [
"touch_up",
"full_if_needed",
"always_full"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Paint Policy"
},
"carpet_policy": {
"anyOf": [
{
"enum": [
"clean",
"replace_if_damaged",
"always_replace"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Carpet Policy"
},
"cleaning_policy": {
"anyOf": [
{
"enum": [
"standard",
"deep"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Cleaning Policy"
},
"always_rekey": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"title": "Always Rekey"
},
"markup_pct": {
"anyOf": [
{
"maximum": 100,
"minimum": 0,
"type": "number"
},
{
"pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Management markup applied to every line, %.",
"title": "Markup Pct"
}
},
"title": "StandardsOverrides",
"type": "object"
},
"Trade": {
"enum": [
"hauling",
"handyman",
"drywall",
"painter",
"flooring",
"carpet_cleaning",
"cleaning",
"appliance",
"plumber",
"electrician",
"hvac",
"locksmith",
"pest_control",
"landscaping",
"window_glass",
"environmental",
"structural"
],
"title": "Trade",
"type": "string"
},
"UnitType": {
"enum": [
"apartment",
"single_family",
"townhome",
"condo",
"duplex",
"manufactured"
],
"title": "UnitType",
"type": "string"
},
"Uom": {
"enum": [
"each",
"sq_ft",
"sq_ft_floor",
"sq_yd",
"linear_ft",
"room",
"unit",
"bedroom",
"bathroom",
"hour",
"cu_yd",
"visit"
],
"title": "Uom",
"type": "string"
},
"Vendor": {
"additionalProperties": false,
"properties": {
"name": {
"maxLength": 120,
"title": "Name",
"type": "string"
},
"contact": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Contact"
}
},
"required": [
"name"
],
"title": "Vendor",
"type": "object"
}
},
"title": "property_turnover_scopeArguments",
"examples": [
{
"property": {
"zip": "43215",
"bedrooms": 2,
"bathrooms": 1
},
"findings": [
{
"location": "Bedroom 2",
"description": "pet urine in carpet"
},
{
"description": "3 blinds broken",
"quantity": {
"value": 3,
"uom": "each"
}
}
]
}
]
}