{"openapi": "3.1.0", "info": {"title": "NavigateAI API", "version": "1.0.0", "description": "The NavigateAI external API allows you to programmatically manage locations, scoping, work orders, and more."}, "paths": {"/v1/asset/image/{video_frame_id}": {"get": {"operationId": "api_external_api_asset_get_image", "summary": "Get an image", "parameters": [{"in": "path", "name": "video_frame_id", "schema": {"title": "Video Frame Id", "type": "string"}, "required": true}], "responses": {"307": {"description": "Temporary Redirect"}}, "tags": ["Assets"], "security": [{"ApiKeyAuth": []}]}}, "/v1/asset/video/{video_upload_id}": {"get": {"operationId": "api_external_api_asset_get_video", "summary": "Get a video", "parameters": [{"in": "path", "name": "video_upload_id", "schema": {"title": "Video Upload Id", "type": "string"}, "required": true}], "responses": {"307": {"description": "Temporary Redirect"}}, "tags": ["Assets"], "security": [{"ApiKeyAuth": []}]}}, "/v1/lennar/messages/predict": {"post": {"operationId": "api_external_api_lennar_messages_predict_messages", "summary": "Predict Messages", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PredictionResponse"}}}}}, "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/PredictionRequest"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/v1/line_items": {"post": {"operationId": "api_external_api_line_item_create_line_item_endpoint", "summary": "Create a line item", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LineItemRowApiResponse"}}}}}, "tags": ["Line items"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateLineItemRequest"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/v1/line_items/{line_item_id}": {"post": {"operationId": "api_external_api_line_item_update_line_item_row_endpoint", "summary": "Update a line item", "parameters": [{"in": "path", "name": "line_item_id", "schema": {"title": "Line Item Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LineItemRowApiResponse"}}}}}, "tags": ["Line items"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UpdateLineItemRowRequest"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/v1/location": {"get": {"operationId": "api_external_api_location_list_locations", "summary": "List locations", "parameters": [{"in": "query", "name": "limit", "schema": {"default": 50, "maximum": 1000, "minimum": 1, "title": "Limit", "type": "integer"}, "required": false}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Cursor"}, "required": false}, {"in": "query", "name": "reference_key", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Reference Key"}, "required": false}, {"in": "query", "name": "market_id", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Market Id"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListLocationsResponse"}}}}}, "tags": ["Locations"], "security": [{"ApiKeyAuth": []}]}, "post": {"operationId": "api_external_api_location_create_location", "summary": "Create a location", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LocationResponse"}}}}}, "tags": ["Locations"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateLocationRequest"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/v1/location/{location_id}": {"post": {"operationId": "api_external_api_location_update_location", "summary": "Update a location", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LocationResponse"}}}}}, "tags": ["Locations"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UpdateLocationRequest"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}, "get": {"operationId": "api_external_api_location_get_location", "summary": "Get a location", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LocationResponse"}}}}}, "tags": ["Locations"], "security": [{"ApiKeyAuth": []}]}}, "/v1/location/{location_id}/visits": {"get": {"operationId": "api_external_api_location_get_all_visits_for_location", "summary": "List all visits for a location", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AllVisitsForLocationResponse"}}}}}, "tags": ["Visits"], "security": [{"ApiKeyAuth": []}]}}, "/v1/location/{location_id}/pricing_items": {"post": {"operationId": "api_external_api_location_set_location_pricing_items", "summary": "Set a location's eligible pricing items", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SetLocationPricingItemsResponse"}}}}}, "description": "Set the pricing items eligible at this location.\n\nNot a partial update: the provided reference keys become the location's\nentire eligible list. Unknown keys always fail the request without applying\nanything. Disabled keys do the same unless the organization is configured\nto accept them, in which case they are dropped and reported back.", "tags": ["Locations"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SetLocationPricingItemsRequest"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}, "get": {"operationId": "api_external_api_location_get_location_pricing_items", "summary": "Get a location's eligible pricing items", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LocationPricingItemsResponse"}}}}}, "tags": ["Locations"], "security": [{"ApiKeyAuth": []}]}}, "/v1/location/{location_id}/line_item": {"post": {"operationId": "api_external_api_location_create_location_line_item", "summary": "Add a line item", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LineItemRowApiResponse"}}}}}, "tags": ["Scoping"], "deprecated": true, "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateLocationLineItemRequest"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/v1/location/{location_id}/create_access_code": {"post": {"operationId": "api_external_api_location_create_access_code", "summary": "Create an access code", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateAccessCodeResponse"}}}}}, "tags": ["Access codes"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateAccessCodeRequest"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/v1/location/{location_id}/work_order": {"post": {"operationId": "api_external_api_location_create_work_order", "summary": "Create a work order", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}], "responses": {"201": {"description": "Created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/WorkOrderResponse"}}}}}, "tags": ["Work orders"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateWorkOrderRequest"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/v1/location/{location_id}/work_orders": {"get": {"operationId": "api_external_api_location_list_work_orders", "summary": "List work orders", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListWorkOrdersResponse"}}}}}, "tags": ["Work orders"], "security": [{"ApiKeyAuth": []}]}}, "/v1/location/{location_id}/work_order/{work_order_id}": {"get": {"operationId": "api_external_api_location_get_work_order", "summary": "Get a work order", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}, {"in": "path", "name": "work_order_id", "schema": {"title": "Work Order Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/WorkOrderResponse"}}}}}, "tags": ["Work orders"], "security": [{"ApiKeyAuth": []}]}}, "/v1/location/{location_id}/work_order/{work_order_id}/process_photos": {"post": {"operationId": "api_external_api_location_start_photo_processing", "summary": "Start photo processing", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}, {"in": "path", "name": "work_order_id", "schema": {"title": "Work Order Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/WorkOrderProcessPhotosResponse"}}}}}, "tags": ["Work orders"], "security": [{"ApiKeyAuth": []}]}}, "/v1/location/{location_id}/work_order/{work_order_id}/start_review": {"post": {"operationId": "api_external_api_location_start_work_order_review", "summary": "Start work order review", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}, {"in": "path", "name": "work_order_id", "schema": {"title": "Work Order Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/WorkOrderStartProcessingResponse"}}}}}, "tags": ["Work orders"], "security": [{"ApiKeyAuth": []}]}}, "/v1/location/{location_id}/work_order/{work_order_id}/complete": {"post": {"operationId": "api_external_api_location_complete_work_order", "summary": "Complete a work order", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}, {"in": "path", "name": "work_order_id", "schema": {"title": "Work Order Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/WorkOrderResponse"}}}}}, "tags": ["Work orders"], "security": [{"ApiKeyAuth": []}]}}, "/v1/location/{location_id}/line_item/{line_item_id}/work_order": {"post": {"operationId": "api_external_api_location_set_line_item_work_order", "summary": "Assign a line item to a work order", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}, {"in": "path", "name": "line_item_id", "schema": {"title": "Line Item Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SetLineItemWorkOrderResponse"}}}}}, "tags": ["Work orders"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SetLineItemWorkOrderRequest"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/v1/location/{location_id}/work_order/{work_order_id}/line_item/{line_item_id}/photos": {"post": {"operationId": "api_external_api_location_upload_photos_to_work_order_line_item", "summary": "Upload photos for a work order line item", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}, {"in": "path", "name": "work_order_id", "schema": {"title": "Work Order Id", "type": "string"}, "required": true}, {"in": "path", "name": "line_item_id", "schema": {"title": "Line Item Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UploadPhotosResponse"}}}}}, "tags": ["Work orders"], "requestBody": {"content": {"multipart/form-data": {"schema": {"properties": {"photos": {"items": {"format": "binary", "type": "string"}, "title": "Photos", "type": "array"}, "reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Optional external identifier for the photo. Can only be provided when uploading a single photo.", "title": "Reference Key"}}, "required": ["photos"], "title": "MultiPartBodyParams", "type": "object"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/v1/location/{location_id}/work_order/{work_order_id}/line_item_proposal/{line_item_row_proposal_id}/vendor_override": {"post": {"operationId": "api_external_api_location_vendor_override_line_item_row_status", "summary": "Override a line item status as vendor", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}, {"in": "path", "name": "work_order_id", "schema": {"title": "Work Order Id", "type": "string"}, "required": true}, {"in": "path", "name": "line_item_row_proposal_id", "schema": {"title": "Line Item Row Proposal Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/OperationSuccessSchema"}}}}}, "tags": ["Work orders"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/VendorOverrideLineItemRowStatusRequest"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/v1/location/{location_id}/rooms": {"get": {"operationId": "api_external_api_room_list_rooms", "summary": "List rooms for a location", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListRoomsResponse"}}}}}, "description": "Returns the rooms currently available for the specified location, including measurements and overview images. Depending on your integration and property setup, this endpoint may return no results. If you expect room data for your locations and are not seeing it, contact NavigateAI.", "tags": ["Rooms"], "security": [{"ApiKeyAuth": []}]}}, "/v1/location/{location_id}/rooms/{room_id}": {"get": {"operationId": "api_external_api_room_get_room", "summary": "Get a room", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}, {"in": "path", "name": "room_id", "schema": {"title": "Room Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RoomResponse"}}}}}, "description": "Returns a single room for the specified location, including measurements and overview images. Depending on your integration and property setup, room data may not yet be available for all locations. If you expect room data for your locations and are not seeing it, contact NavigateAI.", "tags": ["Rooms"], "security": [{"ApiKeyAuth": []}]}}, "/v1/visits/{visit_id}": {"get": {"operationId": "api_external_api_visit_get_visit", "summary": "Get a visit", "parameters": [{"in": "path", "name": "visit_id", "schema": {"title": "Visit Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/VisitResponse"}}}}}, "tags": ["Visits"], "security": [{"ApiKeyAuth": []}]}}, "/v1/visits/{visit_id}/access_grants": {"post": {"operationId": "api_external_api_visit_create_visit_access_grant_endpoint", "summary": "Create a visit access grant", "parameters": [{"in": "path", "name": "visit_id", "schema": {"title": "Visit Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/VisitAccessGrantResponse"}}}}}, "tags": ["Visits"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateVisitAccessGrantRequest"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/v1/visits": {"post": {"operationId": "api_external_api_visit_create_visit", "summary": "Create a new visit to accept video upload requests", "parameters": [], "responses": {"201": {"description": "Created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/VisitResponse"}}}}}, "tags": ["Visits"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateVisitRequest"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/v1/visits/{visit_id}/process": {"post": {"operationId": "api_external_api_visit_process_visit", "summary": "Start processing a visit", "parameters": [{"in": "path", "name": "visit_id", "schema": {"title": "Visit Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProcessVisitResponse"}}}}}, "tags": ["Visits"], "security": [{"ApiKeyAuth": []}]}}, "/v1/visits/{visit_id}/cancel": {"post": {"operationId": "api_external_api_visit_cancel_visit", "summary": "Cancel a visit", "parameters": [{"in": "path", "name": "visit_id", "schema": {"title": "Visit Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CancelVisitResponse"}}}}}, "tags": ["Visits"], "security": [{"ApiKeyAuth": []}]}}, "/v1/visits/{visit_id}/video_upload_requests": {"get": {"operationId": "api_external_api_visit_list_video_upload_requests", "summary": "List video upload requests for a visit", "parameters": [{"in": "path", "name": "visit_id", "schema": {"title": "Visit Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListVideoUploadRequestsResponse"}}}}}, "tags": ["Video Upload Requests"], "security": [{"ApiKeyAuth": []}]}}, "/v1/visits/{visit_id}/findings": {"get": {"operationId": "api_external_api_visit_list_findings", "summary": "List findings for a visit (Beta)", "parameters": [{"in": "path", "name": "visit_id", "schema": {"title": "Visit Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListFindingsResponse"}}}}}, "tags": ["Visits"], "security": [{"ApiKeyAuth": []}]}}, "/v1/video_upload_requests": {"post": {"operationId": "api_external_api_video_upload_request_create_video_upload_request", "summary": "Start a new video upload", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateVideoUploadRequestResponse"}}}}}, "tags": ["Video Upload Requests"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateVideoUploadRequestInput"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/v1/video_upload_requests/{upload_id}/confirm": {"post": {"operationId": "api_external_api_video_upload_request_confirm_video_upload_request", "summary": "Mark a video upload request as complete", "parameters": [{"in": "path", "name": "upload_id", "schema": {"title": "Upload Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ConfirmVideoUploadRequestResponse"}}}}}, "tags": ["Video Upload Requests"], "security": [{"ApiKeyAuth": []}]}}, "/v1/video_upload_requests/{upload_id}": {"get": {"operationId": "api_external_api_video_upload_request_get_video_upload_request", "summary": "Get a video upload request", "parameters": [{"in": "path", "name": "upload_id", "schema": {"title": "Upload Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetVideoUploadRequestResponse"}}}}}, "tags": ["Video Upload Requests"], "security": [{"ApiKeyAuth": []}]}}, "/v1/video_upload_requests/{upload_id}/cancel": {"post": {"operationId": "api_external_api_video_upload_request_cancel_video_upload_request", "summary": "Cancel a video upload request", "parameters": [{"in": "path", "name": "upload_id", "schema": {"title": "Upload Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CancelVideoUploadRequestResponse"}}}}}, "tags": ["Video Upload Requests"], "security": [{"ApiKeyAuth": []}]}}, "/v1/markets": {"get": {"operationId": "api_external_api_market_list_markets", "summary": "List markets", "parameters": [{"in": "query", "name": "reference_key", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Reference Key"}, "required": false}, {"in": "query", "name": "slug", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Slug"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListMarketsResponse"}}}}}, "tags": ["Markets"], "security": [{"ApiKeyAuth": []}]}, "post": {"operationId": "api_external_api_market_create_market", "summary": "Create a market", "parameters": [], "responses": {"201": {"description": "Created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/MarketResponse"}}}}}, "tags": ["Markets"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateMarketRequest"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/v1/markets/{market_id}": {"get": {"operationId": "api_external_api_market_get_market", "summary": "Get a market", "parameters": [{"in": "path", "name": "market_id", "schema": {"title": "Market Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/MarketResponse"}}}}}, "tags": ["Markets"], "security": [{"ApiKeyAuth": []}]}, "post": {"operationId": "api_external_api_market_update_market", "summary": "Update a market", "parameters": [{"in": "path", "name": "market_id", "schema": {"title": "Market Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/MarketResponse"}}}}}, "tags": ["Markets"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UpdateMarketRequest"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/v1/rejection_reason_options": {"get": {"operationId": "api_external_api_rejection_reason_option_list_rejection_reason_options", "summary": "List rejection reason options", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListRejectionReasonOptionsResponse"}}}}}, "description": "List the live line item rejection reason options configured for the requesting organization.", "tags": ["Rejection reason options"], "security": [{"ApiKeyAuth": []}]}}, "/v1/rejection_reason_options/{rejection_reason_option_id}": {"get": {"operationId": "api_external_api_rejection_reason_option_get_rejection_reason_option", "summary": "Get a rejection reason option", "parameters": [{"in": "path", "name": "rejection_reason_option_id", "schema": {"title": "Rejection Reason Option Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RejectionReasonOptionResponse"}}}}}, "description": "Fetch a single line item rejection reason option by id for the requesting organization.\n\nUnlike the list endpoint, this point lookup returns soft-deleted options as well, so that\nintegrations can resolve historical `rejection_reason_option_id` values already stored on\nline items even after the option has been deleted.", "tags": ["Rejection reason options"], "security": [{"ApiKeyAuth": []}]}}, "/v1/room_types": {"get": {"operationId": "api_external_api_room_type_list_room_types", "summary": "List room types", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListRoomTypesResponse"}}}}}, "tags": ["Room types"], "security": [{"ApiKeyAuth": []}]}}, "/v1/scope/{location_id}": {"get": {"operationId": "api_external_api_scope_get_scope", "summary": "Get a scope", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LegacyScopeResponse"}}}}}, "tags": ["Scoping"], "deprecated": true, "security": [{"ApiKeyAuth": []}]}}, "/v1/scope/{location_id}/line_item_row": {"post": {"operationId": "api_external_api_scope_create_line_item_row", "summary": "Create a line item", "parameters": [{"in": "path", "name": "location_id", "schema": {"title": "Location Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LineItemRowApiResponse"}}}}}, "tags": ["Scoping"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateLineItemRowRequest"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/v1/scopes": {"post": {"operationId": "api_external_api_scopes_create_scope_endpoint", "summary": "Create a scope", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ScopeResponse"}}}}}, "tags": ["Scopes"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateScopeRequest"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}, "get": {"operationId": "api_external_api_scopes_list_scopes_endpoint", "summary": "List scopes", "parameters": [{"in": "query", "name": "limit", "schema": {"default": 50, "maximum": 1000, "minimum": 1, "title": "Limit", "type": "integer"}, "required": false}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Cursor"}, "required": false}, {"in": "query", "name": "location_id", "schema": {"anyOf": [{"items": {"type": "string"}, "maxItems": 100, "minItems": 1, "type": "array"}, {"type": "null"}], "title": "Location Id"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListScopesResponse"}}}}}, "tags": ["Scopes"], "security": [{"ApiKeyAuth": []}]}}, "/v1/scopes/{scope_id}": {"get": {"operationId": "api_external_api_scopes_get_scope", "summary": "Get a scope", "parameters": [{"in": "path", "name": "scope_id", "schema": {"title": "Scope Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ScopeResponse"}}}}}, "tags": ["Scopes"], "security": [{"ApiKeyAuth": []}]}}, "/v1/vendors": {"post": {"operationId": "api_external_api_vendor_create_vendor_organization", "summary": "Create a vendor", "parameters": [], "responses": {"201": {"description": "Created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/VendorOrganizationResponse"}}}}}, "tags": ["Vendors"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateVendorOrganizationRequest"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}, "get": {"operationId": "api_external_api_vendor_list_vendor_organizations", "summary": "List vendors", "parameters": [{"in": "query", "name": "limit", "schema": {"default": 50, "maximum": 1000, "minimum": 1, "title": "Limit", "type": "integer"}, "required": false}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Cursor"}, "required": false}, {"in": "query", "name": "reference_key", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Reference Key"}, "required": false}, {"in": "query", "name": "is_enabled", "schema": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Filter to only vendors which are or are not enabled. Omit to list all vendors.", "title": "Is Enabled"}, "required": false, "description": "Filter to only vendors which are or are not enabled. Omit to list all vendors."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListVendorOrganizationsResponse"}}}}}, "tags": ["Vendors"], "security": [{"ApiKeyAuth": []}]}}, "/v1/vendors/{vendor_id}": {"get": {"operationId": "api_external_api_vendor_get_vendor_organization", "summary": "Get a vendor", "parameters": [{"in": "path", "name": "vendor_id", "schema": {"title": "Vendor Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/VendorOrganizationResponse"}}}}}, "description": "Also available at the deprecated `GET /v1/vendor/{vendor_id}` path for existing integrations.", "tags": ["Vendors"], "security": [{"ApiKeyAuth": []}]}, "patch": {"operationId": "api_external_api_vendor_update_vendor_organization_endpoint", "summary": "Update a vendor", "parameters": [{"in": "path", "name": "vendor_id", "schema": {"title": "Vendor Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/VendorOrganizationResponse"}}}}}, "tags": ["Vendors"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UpdateVendorOrganizationRequest"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/v1/visit_types": {"get": {"operationId": "api_external_api_visit_type_list_visit_types", "summary": "List visit types", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListVisitTypesResponse"}}}}}, "tags": ["Visit types"], "security": [{"ApiKeyAuth": []}]}}}, "components": {"schemas": {"Prediction": {"properties": {"generated_messages": {"items": {"$ref": "#/components/schemas/PredictionGeneratedMessage"}, "title": "Generated Messages", "type": "array"}, "annotated_images": {"items": {"$ref": "#/components/schemas/PredictionAnnotatedImage"}, "title": "Annotated Images", "type": "array"}}, "required": ["generated_messages", "annotated_images"], "title": "Prediction", "type": "object"}, "PredictionAnnotatedImage": {"properties": {"image_url": {"title": "Image Url", "type": "string"}, "annotations": {"items": {"$ref": "#/components/schemas/PredictionAnnotation"}, "title": "Annotations", "type": "array"}}, "required": ["image_url"], "title": "PredictionAnnotatedImage", "type": "object"}, "PredictionAnnotation": {"properties": {"title": {"title": "Title", "type": "string"}, "description": {"title": "Description", "type": "string"}, "confidence": {"enum": ["high", "medium", "low"], "title": "Confidence", "type": "string"}, "bounding_box": {"$ref": "#/components/schemas/PredictionBoundingBox"}}, "required": ["title", "description", "confidence", "bounding_box"], "title": "PredictionAnnotation", "type": "object"}, "PredictionBoundingBox": {"properties": {"x1": {"title": "X1", "type": "number"}, "y1": {"title": "Y1", "type": "number"}, "x2": {"title": "X2", "type": "number"}, "y2": {"title": "Y2", "type": "number"}}, "required": ["x1", "y1", "x2", "y2"], "title": "PredictionBoundingBox", "type": "object"}, "PredictionGeneratedMessage": {"properties": {"reasoning": {"title": "Reasoning", "type": "string"}, "short_reasoning": {"title": "Short Reasoning", "type": "string"}, "text": {"title": "Text", "type": "string"}, "confidence": {"enum": ["high", "medium", "low"], "title": "Confidence", "type": "string"}}, "required": ["reasoning", "short_reasoning", "text", "confidence"], "title": "PredictionGeneratedMessage", "type": "object"}, "PredictionResponse": {"properties": {"prediction": {"$ref": "#/components/schemas/Prediction"}}, "required": ["prediction"], "title": "PredictionResponse", "type": "object"}, "AdditionalContext": {"additionalProperties": true, "properties": {"images": {"items": {"$ref": "#/components/schemas/AdditionalContextImage"}, "title": "Images", "type": "array"}}, "title": "AdditionalContext", "type": "object"}, "AdditionalContextImage": {"properties": {"image_url": {"title": "Image Url", "type": "string"}, "description": {"default": "", "title": "Description", "type": "string"}}, "required": ["image_url"], "title": "AdditionalContextImage", "type": "object"}, "Message": {"properties": {"id": {"title": "Id", "type": "string"}, "conversation_id": {"title": "Conversation Id", "type": "string"}, "sender_id": {"title": "Sender Id", "type": "string"}, "sender_role": {"enum": ["ConstructionManager", "TradePartner"], "title": "Sender Role", "type": "string"}, "recipient_ids": {"items": {"type": "string"}, "title": "Recipient Ids", "type": "array"}, "trade_names": {"items": {"type": "string"}, "title": "Trade Names", "type": "array"}, "date": {"format": "date-time", "title": "Date", "type": "string"}, "body": {"title": "Body", "type": "string"}, "images": {"items": {"type": "string"}, "title": "Images", "type": "array"}}, "required": ["id", "conversation_id", "sender_id", "sender_role", "recipient_ids", "date", "body"], "title": "Message", "type": "object"}, "PredictionRequest": {"properties": {"messages": {"items": {"$ref": "#/components/schemas/Message"}, "minItems": 1, "title": "Messages", "type": "array"}, "additional_context": {"allOf": [{"$ref": "#/components/schemas/AdditionalContext"}]}}, "required": ["messages"], "title": "PredictionRequest", "type": "object"}, "AudioEvidenceExternalSchema": {"properties": {"type": {"const": "audio", "default": "audio", "title": "Type", "type": "string"}, "start_ms": {"description": "Start timestamp in the source video, in milliseconds.", "title": "Start Ms", "type": "integer"}, "end_ms": {"description": "End timestamp in the source video, in milliseconds.", "title": "End Ms", "type": "integer"}, "text": {"description": "Transcribed text from this audio segment.", "title": "Text", "type": "string"}}, "required": ["start_ms", "end_ms", "text"], "title": "AudioEvidence", "type": "object"}, "CostComponentExternalSchema": {"description": "A cost component representing a portion of a line item's pricing (e.g. labor, material).", "properties": {"kind": {"description": "The type of cost component: \"total\", \"labor\", or \"material\".", "enum": ["total", "labor", "material"], "title": "Kind", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Optional display label for this component.", "title": "Label"}, "unit_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Unit of measurement (e.g. \"each\", \"sqft\"). Defaults to \"each\" if omitted.", "title": "Unit Type"}, "unit_cost_in_cents": {"anyOf": [{"minimum": 0, "type": "integer"}, {"type": "null"}], "description": "Cost per unit in cents.", "title": "Unit Cost In Cents"}, "quantity": {"description": "Number of units as a decimal string (e.g. \"1\", \"2.5\").", "title": "Quantity", "type": "string"}}, "required": ["kind", "quantity"], "title": "CostComponent", "type": "object"}, "ImageEvidenceExternalSchema": {"properties": {"type": {"const": "image", "default": "image", "title": "Type", "type": "string"}, "image_id": {"description": "Use with the Get Image endpoint to retrieve the image file.", "title": "Image Id", "type": "string"}, "reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Reference Key"}, "visit_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The visit this image was captured during.", "title": "Visit Id"}, "is_selected": {"default": false, "description": "Whether this image was explicitly selected as evidence.", "title": "Is Selected", "type": "boolean"}, "is_starred": {"default": false, "description": "Whether this image was starred as the primary evidence photo.", "title": "Is Starred", "type": "boolean"}}, "required": ["image_id"], "title": "ImageEvidence", "type": "object"}, "LineItemRoomExternalSchema": {"description": "The room or area a line item applies to.", "properties": {"name": {"description": "Display name of the room or area (e.g. 'Bedroom 2', 'Kitchen'). Not guaranteed to be stable over time.", "title": "Name", "type": "string"}, "room_type_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The [room type](/api-reference/room-types/room-type-object) ID.", "title": "Room Type Id"}}, "required": ["name"], "title": "LineItemRoom", "type": "object"}, "LineItemRowApiResponse": {"properties": {"line_item_row": {"$ref": "#/components/schemas/LineItemRowExternalSchema"}}, "required": ["line_item_row"], "title": "LineItemRowApiResponse", "type": "object"}, "LineItemRowExternalSchema": {"properties": {"id": {"title": "Id", "type": "string"}, "line_item_row_id": {"description": "The stable location-level line item ID.", "title": "Line Item Row Id", "type": "string", "x-excluded": true}, "title": {"title": "Title", "type": "string"}, "description": {"title": "Description", "type": "string"}, "status": {"enum": ["suggested", "not_complete", "complete", "rejected"], "title": "Status", "type": "string"}, "quantity": {"deprecated": true, "description": "Deprecated: Use cost_components instead. Total quantity (integer).", "title": "Quantity", "type": "integer"}, "unit_type": {"deprecated": true, "description": "Deprecated: Use cost_components instead. Unit of measurement (e.g. \"each\", \"sqft\").", "title": "Unit Type", "type": "string"}, "unit_cost_cents": {"anyOf": [{"type": "integer"}, {"type": "null"}], "deprecated": true, "description": "Deprecated: Use cost_components instead. Cost per unit in cents.", "title": "Unit Cost Cents"}, "cost_components": {"description": "Granular cost breakdown. Replaces the legacy quantity/unit_type/unit_cost_cents fields.", "items": {"$ref": "#/components/schemas/CostComponentExternalSchema"}, "title": "Cost Components", "type": "array"}, "price_override_reason": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The reason recorded when a cost component's price was overridden (e.g. a labor cost change), if a reason was provided. Reflects the most recent price override. Null when no reason was recorded.", "title": "Price Override Reason"}, "price_reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Your external identifier for the pricing item used.", "title": "Price Reference Key"}, "notes": {"title": "Notes", "type": "string"}, "custom_fields": {"title": "Custom Fields", "type": "object"}, "evidence": {"description": "Supporting evidence \u2014 images, audio segments, or text notes.", "items": {"anyOf": [{"$ref": "#/components/schemas/ImageEvidenceExternalSchema"}, {"$ref": "#/components/schemas/AudioEvidenceExternalSchema"}, {"$ref": "#/components/schemas/TextEvidenceExternalSchema"}]}, "title": "Evidence", "type": "array"}, "area_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "deprecated": true, "description": "Deprecated: Use room.name instead. The room or area this line item applies to.", "title": "Area Name"}, "room": {"anyOf": [{"$ref": "#/components/schemas/LineItemRoomExternalSchema"}, {"type": "null"}], "description": "The room or area this line item applies to."}, "rejection_reason_option_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "ID of the selected [rejection reason option](/api-reference/rejection-reason-options/rejection-reason-option-object), if applicable.", "title": "Rejection Reason Option Id"}, "rejection_reason_text": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Reason the line item was rejected, if applicable.", "title": "Rejection Reason Text"}, "vendor": {"anyOf": [{"$ref": "#/components/schemas/VendorOrganizationExternalSchema"}, {"type": "null"}], "description": "The vendor assigned to this line item."}}, "required": ["id", "line_item_row_id", "title", "description", "status", "quantity", "unit_type", "unit_cost_cents", "cost_components", "price_reference_key", "notes", "custom_fields", "evidence", "area_name", "room"], "title": "LineItemRow", "type": "object"}, "TextEvidenceExternalSchema": {"properties": {"type": {"const": "text", "default": "text", "title": "Type", "type": "string"}, "text": {"title": "Text", "type": "string"}}, "required": ["text"], "title": "TextEvidence", "type": "object"}, "VendorOrganizationExternalSchema": {"properties": {"id": {"title": "Id", "type": "string"}, "name": {"title": "Name", "type": "string"}, "email": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Email"}, "reference_key": {"description": "Optional unique identifier for this vendor in your system.", "title": "Reference Key", "type": "string"}, "is_enabled": {"description": "Whether this vendor is enabled.", "title": "Is Enabled", "type": "boolean"}, "market_ids": {"description": "IDs of the markets this vendor serves. A vendor with no market associations serves all markets.", "items": {"type": "string"}, "title": "Market Ids", "type": "array"}}, "required": ["id", "name", "email", "reference_key", "is_enabled", "market_ids"], "title": "Vendor", "type": "object"}, "CreateLineItemRequest": {"properties": {"scope_id": {"title": "Scope Id", "type": "string"}, "title": {"title": "Title", "type": "string"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Description"}, "price_reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Price Reference Key"}, "notes": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Notes"}, "custom_fields": {"anyOf": [{"type": "object"}, {"type": "null"}], "title": "Custom Fields"}}, "required": ["scope_id", "title"], "title": "CreateLineItemRequest", "type": "object"}, "UpdateLineItemRowRequest": {"description": "Request schema for updating a line item row.\n\nAll fields are optional. Omitting a field leaves it unchanged.\nSome fields may be explicitly set to null to clear the value.", "properties": {"title": {"description": "Updated line item title. Omit to leave unchanged.", "title": "Title", "type": "string"}, "description": {"description": "Updated line item description. Omit to leave unchanged.", "title": "Description", "type": "string"}, "price_reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Pricing item reference key. Set to null to clear. Omit to leave unchanged.", "title": "Price Reference Key"}, "notes": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Line item notes. Set to null to clear. Omit to leave unchanged.", "title": "Notes"}, "status": {"description": "Updated line item status. Omit to leave unchanged.", "enum": ["not_complete", "complete", "rejected"], "title": "Status", "type": "string"}, "rejection_reason_option_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "ID of the selected [rejection reason option](/api-reference/rejection-reason-options/rejection-reason-option-object). May only be set when the resulting line item status is `rejected`. Will be cleared otherwise. Omit to leave unchanged.", "title": "Rejection Reason Option Id"}, "rejection_reason_text": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free text rejection reason for additional context. May only be set when the resulting line item status is `rejected`. Will be cleared otherwise. Omit to leave unchanged.", "title": "Rejection Reason Text"}}, "required": [], "title": "UpdateLineItemRowRequest", "type": "object"}, "LocationListRequest": {"properties": {"limit": {"default": 50, "maximum": 1000, "minimum": 1, "title": "Limit", "type": "integer"}, "cursor": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Cursor"}, "reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Reference Key"}, "market_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Market Id"}}, "title": "LocationListRequest", "type": "object"}, "ListLocationsResponse": {"properties": {"locations": {"items": {"$ref": "#/components/schemas/LocationExternalSchema"}, "title": "Locations", "type": "array"}, "next_cursor": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Next Cursor"}}, "required": ["locations", "next_cursor"], "title": "ListLocationsResponse", "type": "object"}, "LocationExternalSchema": {"properties": {"id": {"title": "Id", "type": "string"}, "address_1": {"title": "Address 1", "type": "string"}, "address_2": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Address 2"}, "city": {"title": "City", "type": "string"}, "state": {"title": "State", "type": "string"}, "zip_code": {"title": "Zip Code", "type": "string"}, "lat": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Lat"}, "lon": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Lon"}, "reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Optional unique identifier for this location in your system.", "title": "Reference Key"}, "market_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "ID of the market this location belongs to.", "title": "Market Id"}, "market_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "deprecated": true, "description": "Deprecated: prefer market_id. Name of the geographic market this location belongs to.", "title": "Market Name"}, "custom_fields": {"anyOf": [{"type": "object"}, {"type": "null"}], "description": "Arbitrary key-value metadata. Supports partial updates.", "title": "Custom Fields"}}, "required": ["id", "address_1", "address_2", "city", "state", "zip_code", "lat", "lon", "reference_key", "market_id", "market_name", "custom_fields"], "title": "Location", "type": "object"}, "LocationResponse": {"properties": {"location": {"$ref": "#/components/schemas/LocationExternalSchema"}}, "required": ["location"], "title": "LocationResponse", "type": "object"}, "CreateLocationRequest": {"properties": {"address_1": {"title": "Address 1", "type": "string"}, "address_2": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Address 2"}, "city": {"title": "City", "type": "string"}, "state": {"title": "State", "type": "string"}, "zip_code": {"title": "Zip Code", "type": "string"}, "lat": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Lat"}, "lon": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Lon"}, "reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Reference Key"}, "market_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "ID of the market this location belongs to. Must reference an existing market in your organization. Cannot be combined with market_name.", "title": "Market Id"}, "market_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "deprecated": true, "description": "Deprecated: prefer market_id. Looks up an existing market by name within your organization. Cannot be combined with market_id.", "title": "Market Name"}, "custom_fields": {"anyOf": [{"type": "object"}, {"type": "null"}], "title": "Custom Fields"}}, "required": ["address_1", "city", "state", "zip_code"], "title": "CreateLocationRequest", "type": "object"}, "UpdateLocationRequest": {"properties": {"custom_fields": {"anyOf": [{"type": "object"}, {"type": "null"}], "description": "Partial update of custom fields. Only specified fields will be updated.", "title": "Custom Fields"}, "reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Reference Key"}, "market_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "ID of the market this location belongs to. Must reference an existing market in your organization.", "title": "Market Id"}}, "title": "UpdateLocationRequest", "type": "object"}, "AllVisitsForLocationResponse": {"properties": {"visits": {"items": {"$ref": "#/components/schemas/VisitExternalSchema"}, "title": "Visits", "type": "array"}}, "required": ["visits"], "title": "AllVisitsForLocationResponse", "type": "object"}, "ExternalVisitRequestStatus": {"description": "Customer facing visit statuses. Each VisitRequestStatus should map directly to a ExternalVisitRequestStatus.\nBut we don't need ExternalVisitRequestStatus to directly map back to VisitRequestStatus.", "enum": ["visit_started", "uploading", "processing", "in_review", "completed", "cancelled"], "title": "ExternalVisitRequestStatus", "type": "string"}, "UserExternalSchema": {"properties": {"id": {"title": "Id", "type": "string"}, "email": {"title": "Email", "type": "string"}, "first_name": {"title": "First Name", "type": "string"}, "last_name": {"title": "Last Name", "type": "string"}, "reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "External identifier for this user.", "title": "Reference Key"}}, "required": ["id", "email", "first_name", "last_name", "reference_key"], "title": "User", "type": "object"}, "VideoExternalSchema": {"properties": {"id": {"title": "Id", "type": "string"}, "duration_ms": {"title": "Duration Ms", "type": "integer"}, "height": {"title": "Height", "type": "integer"}, "width": {"title": "Width", "type": "integer"}}, "required": ["id", "duration_ms", "height", "width"], "title": "Video", "type": "object"}, "VisitExternalSchema": {"properties": {"id": {"title": "Id", "type": "string"}, "type": {"deprecated": true, "description": "Display name of the visit type. Deprecated: Prefer using visit_type instead.", "title": "Type", "type": "string"}, "visit_type": {"$ref": "#/components/schemas/VisitTypeExternalSchema", "description": "The visit type for this visit."}, "visit_request_status": {"$ref": "#/components/schemas/ExternalVisitRequestStatus"}, "visited_at": {"format": "date-time", "title": "Visited At", "type": "string"}, "visited_by": {"$ref": "#/components/schemas/UserExternalSchema"}, "reviewed_by": {"anyOf": [{"$ref": "#/components/schemas/UserExternalSchema"}, {"type": "null"}], "description": "The user who reviewed and signed off on this visit, if any."}, "video": {"anyOf": [{"$ref": "#/components/schemas/VideoExternalSchema"}, {"type": "null"}], "description": "The video captured during this visit, if any."}, "product_url": {"description": "Link to the NavigateAI dashboard for reviewing this visit.", "title": "Product Url", "type": "string"}, "product_pdf_url": {"description": "Link to download a PDF report for this visit.", "title": "Product Pdf Url", "type": "string"}, "location_id": {"title": "Location Id", "type": "string"}, "work_order_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The work order this visit is associated with, if any.", "title": "Work Order Id"}, "access_code_metadata": {"anyOf": [{"type": "object"}, {"type": "null"}], "description": "Metadata from the access code that initiated this visit, if applicable.", "title": "Access Code Metadata"}, "notes": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Summary notes generated for this visit.", "title": "Notes"}, "metadata": {"description": "Additional structured data captured for this visit.", "title": "Metadata", "type": "object"}}, "required": ["id", "type", "visit_type", "visit_request_status", "visited_at", "visited_by", "video", "product_url", "product_pdf_url", "location_id", "work_order_id", "access_code_metadata", "notes", "metadata"], "title": "Visit", "type": "object"}, "VisitTypeExternalSchema": {"properties": {"id": {"title": "Id", "type": "string"}, "display_name": {"title": "Display Name", "type": "string"}, "slug": {"description": "URL-friendly identifier for this visit type.", "title": "Slug", "type": "string"}}, "required": ["id", "display_name", "slug"], "title": "VisitType", "type": "object"}, "LocationPricingItemsExternalSchema": {"properties": {"location_id": {"title": "Location Id", "type": "string"}, "price_reference_keys": {"description": "Reference keys of the pricing items currently eligible at this location. Reflects only enabled pricing items: items disabled after ingestion are omitted.", "items": {"type": "string"}, "title": "Price Reference Keys", "type": "array"}}, "required": ["location_id", "price_reference_keys"], "title": "LocationPricingItems", "type": "object"}, "SetLocationPricingItemsResponse": {"properties": {"location_pricing_items": {"$ref": "#/components/schemas/LocationPricingItemsExternalSchema"}, "disabled_reference_keys": {"description": "Reference keys that were dropped from this replacement because they point to disabled pricing items. Only populated for organizations configured to accept disabled keys; otherwise a disabled key rejects the whole request.", "items": {"type": "string"}, "title": "Disabled Reference Keys", "type": "array"}}, "required": ["location_pricing_items"], "title": "SetLocationPricingItemsResponse", "type": "object"}, "SetLocationPricingItemsRequest": {"properties": {"price_reference_keys": {"description": "The full replacement set of pricing item reference keys eligible at this location. Replaces any previously ingested set; an empty list clears the location's eligible list.", "items": {"type": "string"}, "maxItems": 5000, "title": "Price Reference Keys", "type": "array"}}, "required": ["price_reference_keys"], "title": "SetLocationPricingItemsRequest", "type": "object"}, "LocationPricingItemsResponse": {"properties": {"location_pricing_items": {"$ref": "#/components/schemas/LocationPricingItemsExternalSchema"}}, "required": ["location_pricing_items"], "title": "LocationPricingItemsResponse", "type": "object"}, "CreateLocationLineItemRequest": {"properties": {"title": {"title": "Title", "type": "string"}, "description": {"default": "", "title": "Description", "type": "string"}, "quantity": {"default": 1, "deprecated": true, "description": "Deprecated: Use cost_components instead.", "minimum": 0, "title": "Quantity", "type": "integer"}, "unit_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "deprecated": true, "description": "Deprecated: Use cost_components instead.", "title": "Unit Type"}, "unit_cost_cents": {"anyOf": [{"minimum": 0, "type": "integer"}, {"type": "null"}], "deprecated": true, "description": "Deprecated: Use cost_components instead.", "title": "Unit Cost Cents"}, "cost_components": {"anyOf": [{"items": {"$ref": "#/components/schemas/CostComponentExternalSchema"}, "minItems": 1, "type": "array"}, {"type": "null"}], "description": "Granular cost breakdown. When provided, overrides legacy quantity/unit_type/unit_cost_cents fields.", "title": "Cost Components"}, "price_reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Price Reference Key"}, "notes": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Notes"}, "custom_fields": {"anyOf": [{"type": "object"}, {"type": "null"}], "title": "Custom Fields"}}, "required": ["title"], "title": "CreateLocationLineItemRequest", "type": "object"}, "CreateAccessCodeResponse": {"properties": {"access_code": {"title": "Access Code", "type": "string"}, "deeplink_url": {"title": "Deeplink Url", "type": "string"}, "expires_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Expires At"}}, "required": ["access_code", "deeplink_url", "expires_at"], "title": "CreateAccessCodeResponse", "type": "object"}, "AccessCodeCustomerMetadataExternalSchema": {"additionalProperties": false, "properties": {"recipient": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Who the access code is intended for (e.g. a vendor name or email).", "title": "Recipient"}, "redirect_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Optional URL that the recipient can open from the NavigateAI mobile app after using the access code (via long-press on the upload entry). Useful for sending the recipient back to a task or page in your own app once they've finished capturing.", "title": "Redirect Url"}}, "title": "AccessCodeMetadata", "type": "object"}, "CreateAccessCodeRequest": {"properties": {"visit_type_slug": {"title": "Visit Type Slug", "type": "string"}, "work_order_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Associate this access code with a work order. The work order must be in `open` status.", "title": "Work Order Id"}, "metadata": {"anyOf": [{"$ref": "#/components/schemas/AccessCodeCustomerMetadataExternalSchema"}, {"type": "null"}]}, "visit_metadata": {"anyOf": [{"type": "object"}, {"type": "null"}], "title": "Visit Metadata"}, "expires_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "When the access code stops working, as an ISO 8601 UTC timestamp (e.g. `2026-12-31T23:59:59Z`). Must be in the future and timezone-aware. Omit for a code that never expires.", "title": "Expires At"}}, "required": ["visit_type_slug"], "title": "CreateAccessCodeRequest", "type": "object"}, "LineItemEditVendorStatusOverrideExternalSchema": {"properties": {"status": {"anyOf": [{"enum": ["suggested", "not_complete", "complete", "canceled", "deleted", "ignored", "not_started", "in_progress"], "type": "string"}, {"type": "null"}], "description": "The vendor's claimed status for this line item.", "title": "Status"}, "edit_justification": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The vendor's reason for the status override.", "title": "Edit Justification"}}, "required": ["status", "edit_justification"], "title": "LineItemEditVendorStatusOverride", "type": "object"}, "LineItemRowProposalExternalSchema": {"description": "Schema for WorkOrder latest_line_item_row_proposals.\nOnly includes image evidence from the photo proof of service visit.", "properties": {"id": {"title": "Id", "type": "string"}, "line_item_row_id": {"description": "The stable location-level line item ID.", "title": "Line Item Row Id", "type": "string"}, "title": {"title": "Title", "type": "string"}, "description": {"title": "Description", "type": "string"}, "status": {"enum": ["suggested", "not_complete", "complete", "rejected"], "title": "Status", "type": "string"}, "quantity": {"deprecated": true, "description": "Deprecated: Use cost_components instead. Total quantity (integer).", "title": "Quantity", "type": "integer"}, "unit_type": {"deprecated": true, "description": "Deprecated: Use cost_components instead. Unit of measurement (e.g. \"each\", \"sqft\").", "title": "Unit Type", "type": "string"}, "unit_cost_cents": {"anyOf": [{"type": "integer"}, {"type": "null"}], "deprecated": true, "description": "Deprecated: Use cost_components instead. Cost per unit in cents.", "title": "Unit Cost Cents"}, "cost_components": {"description": "Granular cost breakdown. Replaces the legacy quantity/unit_type/unit_cost_cents fields.", "items": {"$ref": "#/components/schemas/CostComponentExternalSchema"}, "title": "Cost Components", "type": "array"}, "price_override_reason": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The reason recorded when a cost component's price was overridden (e.g. a labor cost change), if a reason was provided. Reflects the most recent price override. Null when no reason was recorded.", "title": "Price Override Reason"}, "price_reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Your external identifier for the pricing item used.", "title": "Price Reference Key"}, "notes": {"title": "Notes", "type": "string"}, "custom_fields": {"title": "Custom Fields", "type": "object"}, "evidence": {"description": "Supporting evidence \u2014 images, audio segments, or text notes.", "items": {"anyOf": [{"$ref": "#/components/schemas/ImageEvidenceExternalSchema"}, {"$ref": "#/components/schemas/AudioEvidenceExternalSchema"}, {"$ref": "#/components/schemas/TextEvidenceExternalSchema"}]}, "title": "Evidence", "type": "array"}, "area_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "deprecated": true, "description": "Deprecated: Use room.name instead. The room or area this line item applies to.", "title": "Area Name"}, "room": {"anyOf": [{"$ref": "#/components/schemas/LineItemRoomExternalSchema"}, {"type": "null"}], "description": "The room or area this line item applies to."}, "rejection_reason_option_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "ID of the selected [rejection reason option](/api-reference/rejection-reason-options/rejection-reason-option-object), if applicable.", "title": "Rejection Reason Option Id"}, "rejection_reason_text": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Reason the line item was rejected, if applicable.", "title": "Rejection Reason Text"}, "vendor": {"anyOf": [{"$ref": "#/components/schemas/VendorOrganizationExternalSchema"}, {"type": "null"}], "description": "The vendor assigned to this line item."}, "visit_id": {"description": "The visit that produced this proposal.", "title": "Visit Id", "type": "string"}, "vendor_status_override": {"anyOf": [{"$ref": "#/components/schemas/LineItemEditVendorStatusOverrideExternalSchema"}, {"type": "null"}], "description": "Present when the vendor has overridden the assessed status for this line item."}}, "required": ["id", "line_item_row_id", "title", "description", "status", "quantity", "unit_type", "unit_cost_cents", "cost_components", "price_reference_key", "notes", "custom_fields", "evidence", "area_name", "room", "visit_id", "vendor_status_override"], "title": "LineItemRowProposal", "type": "object"}, "WorkOrderExternalSchema": {"properties": {"id": {"title": "Id", "type": "string"}, "status": {"enum": ["open", "processing", "in_review", "reviewed", "completed"], "title": "Status", "type": "string"}, "reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Optional unique identifier for this work order in your system.", "title": "Reference Key"}, "location_id": {"title": "Location Id", "type": "string"}, "review_url": {"description": "Link to the NavigateAI dashboard for reviewing this work order.", "title": "Review Url", "type": "string"}, "default_vendor": {"anyOf": [{"$ref": "#/components/schemas/VendorOrganizationExternalSchema"}, {"type": "null"}], "description": "The default vendor applied to each line item in the work order."}, "line_items": {"description": "Location-level line items attached to this work order.", "items": {"$ref": "#/components/schemas/LineItemRowExternalSchema"}, "title": "Line Items", "type": "array"}, "latest_line_item_row_proposals": {"description": "The most recent visit-level observations for each line item.", "items": {"$ref": "#/components/schemas/LineItemRowProposalExternalSchema"}, "title": "Latest Line Item Row Proposals", "type": "array"}}, "required": ["id", "status", "reference_key", "location_id", "review_url", "default_vendor", "line_items", "latest_line_item_row_proposals"], "title": "WorkOrder", "type": "object"}, "WorkOrderResponse": {"properties": {"work_order": {"$ref": "#/components/schemas/WorkOrderExternalSchema"}}, "required": ["work_order"], "title": "WorkOrderResponse", "type": "object"}, "CreateWorkOrderRequest": {"properties": {"reference_key": {"minLength": 1, "title": "Reference Key", "type": "string"}, "default_vendor_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "ID of the vendor to assign as the default for this work order.", "title": "Default Vendor Id"}, "line_item_ids": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Line item IDs to attach. Must belong to a completed scope and not already be assigned to a different work order.", "title": "Line Item Ids"}}, "required": ["reference_key"], "title": "CreateWorkOrderRequest", "type": "object"}, "ListWorkOrdersResponse": {"properties": {"work_orders": {"items": {"$ref": "#/components/schemas/WorkOrderThinExternalSchema"}, "title": "Work Orders", "type": "array"}}, "required": ["work_orders"], "title": "ListWorkOrdersResponse", "type": "object"}, "WorkOrderThinExternalSchema": {"description": "Lightweight work order schema without line items for list endpoints.", "properties": {"id": {"title": "Id", "type": "string"}, "status": {"enum": ["open", "processing", "in_review", "reviewed", "completed"], "title": "Status", "type": "string"}, "reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Reference Key"}, "location_id": {"title": "Location Id", "type": "string"}, "default_vendor": {"anyOf": [{"$ref": "#/components/schemas/VendorOrganizationExternalSchema"}, {"type": "null"}]}}, "required": ["id", "status", "reference_key", "location_id", "default_vendor"], "title": "WorkOrderSummary", "type": "object"}, "WorkOrderProcessPhotosResponse": {"properties": {"visit_id": {"title": "Visit Id", "type": "string"}}, "required": ["visit_id"], "title": "WorkOrderProcessPhotosResponse", "type": "object"}, "WorkOrderStartProcessingResponse": {"properties": {}, "title": "WorkOrderStartProcessingResponse", "type": "object"}, "SetLineItemWorkOrderResponse": {"properties": {}, "title": "SetLineItemWorkOrderResponse", "type": "object"}, "SetLineItemWorkOrderRequest": {"properties": {"work_order_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Work Order Id"}}, "title": "SetLineItemWorkOrderRequest", "type": "object"}, "UploadPhotosResponse": {"properties": {"images": {"items": {"$ref": "#/components/schemas/ImageEvidenceExternalSchema"}, "title": "Images", "type": "array"}}, "required": ["images"], "title": "UploadPhotosResponse", "type": "object"}, "UploadPhotosForm": {"properties": {"reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Optional external identifier for the photo. Can only be provided when uploading a single photo.", "title": "Reference Key"}}, "title": "UploadPhotosForm", "type": "object"}, "OperationSuccessSchema": {"properties": {"success": {"const": true, "default": true, "title": "Success", "type": "boolean"}}, "title": "OperationSuccessSchema", "type": "object"}, "VendorOverrideLineItemRowStatusRequest": {"properties": {"status": {"enum": ["complete", "not_complete"], "title": "Status", "type": "string"}, "edit_justification": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Edit Justification"}}, "required": ["status"], "title": "VendorOverrideLineItemRowStatusRequest", "type": "object"}, "ListRoomsResponse": {"properties": {"rooms": {"items": {"$ref": "#/components/schemas/RoomExternalSchema"}, "title": "Rooms", "type": "array"}}, "required": ["rooms"], "title": "ListRoomsResponse", "type": "object"}, "RoomExternalSchema": {"description": "A room at a location.", "properties": {"id": {"title": "Id", "type": "string"}, "name": {"description": "Display name (e.g. 'Bedroom 2', 'Kitchen'). Not guaranteed to be stable over time.", "title": "Name", "type": "string"}, "room_type_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The type of room.", "title": "Room Type Id"}, "room_type_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Display name of the room type.", "title": "Room Type Name"}, "reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Your external identifier for this room.", "title": "Reference Key"}, "measurements": {"allOf": [{"$ref": "#/components/schemas/RoomMeasurementsExternalSchema"}], "description": "Physical measurements of the room."}, "images": {"description": "Representative overview images of the room.", "items": {"$ref": "#/components/schemas/RoomImageExternalSchema"}, "title": "Images", "type": "array"}}, "required": ["id", "name"], "title": "Room", "type": "object"}, "RoomImageExternalSchema": {"description": "An image of a room, captured during a visit.", "properties": {"image_id": {"description": "The [ID](/api-reference/assets/get-image) of the image.", "title": "Image Id", "type": "string"}, "visit_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The visit this image was captured during.", "title": "Visit Id"}}, "required": ["image_id"], "title": "RoomImage", "type": "object"}, "RoomMeasurementsExternalSchema": {"description": "Physical measurements of the room. Always present; individual fields are null when unknown.", "properties": {"area_sq_in": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Room area in square inches.", "title": "Area Sq In"}, "length_in": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "A horizontal dimension in inches.", "title": "Length In"}, "width_in": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "A horizontal dimension in inches.", "title": "Width In"}}, "title": "RoomMeasurements", "type": "object"}, "RoomResponse": {"properties": {"room": {"$ref": "#/components/schemas/RoomExternalSchema"}}, "required": ["room"], "title": "RoomResponse", "type": "object"}, "VisitResponse": {"properties": {"visit": {"$ref": "#/components/schemas/VisitExternalSchema"}}, "required": ["visit"], "title": "VisitResponse", "type": "object"}, "VisitAccessGrantResponse": {"properties": {"visit_access_grant_id": {"title": "Visit Access Grant Id", "type": "string"}, "visit_id": {"title": "Visit Id", "type": "string"}, "token": {"title": "Token", "type": "string"}, "deeplink_url": {"title": "Deeplink Url", "type": "string"}, "expires_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Expires At"}, "metadata": {"anyOf": [{"type": "object"}, {"type": "null"}], "description": "The arbitrary structured data attached at creation, echoed back verbatim.", "title": "Metadata"}}, "required": ["visit_access_grant_id", "visit_id", "token", "deeplink_url", "expires_at", "metadata"], "title": "VisitAccessGrantResponse", "type": "object"}, "CreateVisitAccessGrantRequest": {"properties": {"recipient_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Display name shown as the guest's identity on the visit (e.g. the reviewer's name).", "title": "Recipient Name"}, "recipient_email": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Contact email recorded for the guest. Not used for authentication.", "title": "Recipient Email"}, "metadata": {"anyOf": [{"type": "object"}, {"type": "null"}], "description": "Arbitrary structured data to attach to this grant (e.g. your own user or task ids). Echoed back verbatim in the create response. Never interpreted by NavigateAI.", "title": "Metadata"}, "expires_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "When the access link stops working, as an ISO 8601 UTC timestamp (e.g. `2026-12-31T23:59:59Z`). Must be in the future and timezone-aware. Omit for a link that never expires.", "title": "Expires At"}}, "title": "CreateVisitAccessGrantRequest", "type": "object"}, "CreateVisitRequest": {"properties": {"location_id": {"title": "Location Id", "type": "string"}, "visit_type_slug": {"title": "Visit Type Slug", "type": "string"}, "work_order_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Work Order Id"}}, "required": ["location_id", "visit_type_slug"], "title": "CreateVisitRequest", "type": "object"}, "ProcessVisitResponse": {"properties": {"visit": {"$ref": "#/components/schemas/VisitExternalSchema"}}, "required": ["visit"], "title": "ProcessVisitResponse", "type": "object"}, "CancelVisitResponse": {"properties": {"visit": {"$ref": "#/components/schemas/VisitExternalSchema"}}, "required": ["visit"], "title": "CancelVisitResponse", "type": "object"}, "ExternalUploadRequestStatus": {"description": "Customer-facing upload request statuses, lowercase for external API consistency.", "enum": ["pending", "started", "done", "failed", "ignored", "cancelled"], "title": "ExternalUploadRequestStatus", "type": "string"}, "ListVideoUploadRequestsResponse": {"properties": {"video_upload_requests": {"items": {"$ref": "#/components/schemas/VideoUploadRequestExternalSchema"}, "title": "Video Upload Requests", "type": "array"}}, "required": ["video_upload_requests"], "title": "ListVideoUploadRequestsResponse", "type": "object"}, "VideoUploadRequestExternalSchema": {"properties": {"id": {"title": "Id", "type": "string"}, "status": {"$ref": "#/components/schemas/ExternalUploadRequestStatus"}, "file_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Original file name of the upload.", "title": "File Name"}, "file_size_bytes": {"description": "Declared file size in bytes.", "title": "File Size Bytes", "type": "integer"}, "created_at": {"format": "date-time", "title": "Created At", "type": "string"}, "completed_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "When the upload was marked as completed, if applicable.", "title": "Completed At"}}, "required": ["id", "status", "file_name", "file_size_bytes", "created_at", "completed_at"], "title": "VideoUploadRequest", "type": "object"}, "FindingExternalSchema": {"properties": {"question_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The name of the question this finding answers.", "title": "Question Name"}, "question_text": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The full text of the question this finding answers. Null for ad-hoc findings.", "title": "Question Text"}, "description": {"description": "The reason or justification for this finding.", "title": "Description", "type": "string"}, "result": {"description": "The result of the finding (e.g. \"Poor\", \"Fair\").", "title": "Result", "type": "string"}, "severity": {"anyOf": [{"enum": ["major", "minor"], "type": "string"}, {"type": "null"}], "description": "Severity of the finding, if applicable: \"major\", \"minor\", or null.", "title": "Severity"}, "area_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The room or area this finding applies to.", "title": "Area Name"}, "evidence": {"description": "Supporting evidence \u2014 images, audio segments, or text notes.", "items": {"anyOf": [{"$ref": "#/components/schemas/ImageEvidenceExternalSchema"}, {"$ref": "#/components/schemas/AudioEvidenceExternalSchema"}, {"$ref": "#/components/schemas/TextEvidenceExternalSchema"}]}, "title": "Evidence", "type": "array"}}, "required": ["question_name", "question_text", "description", "result", "severity", "area_name", "evidence"], "title": "Finding", "type": "object"}, "ListFindingsResponse": {"properties": {"findings": {"items": {"$ref": "#/components/schemas/FindingExternalSchema"}, "title": "Findings", "type": "array"}}, "required": ["findings"], "title": "ListFindingsResponse", "type": "object"}, "CreateVideoUploadRequestResponse": {"properties": {"video_upload_request": {"$ref": "#/components/schemas/VideoUploadRequestWithUploadUrlExternalSchema"}}, "required": ["video_upload_request"], "title": "CreateVideoUploadRequestResponse", "type": "object"}, "VideoUploadRequestWithUploadUrlExternalSchema": {"description": "Extended schema that includes a presigned upload URL.\n\nUsed for create and single-resource GET responses where the caller needs\nthe URL to upload to S3. The presigned URL must be passed explicitly \u2014\nit is never generated inside the schema.", "properties": {"id": {"title": "Id", "type": "string"}, "status": {"$ref": "#/components/schemas/ExternalUploadRequestStatus"}, "file_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Original file name of the upload.", "title": "File Name"}, "file_size_bytes": {"description": "Declared file size in bytes.", "title": "File Size Bytes", "type": "integer"}, "created_at": {"format": "date-time", "title": "Created At", "type": "string"}, "completed_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "When the upload was marked as completed, if applicable.", "title": "Completed At"}, "upload_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Presigned S3 PUT URL for uploading the file. Expires after 24 hours. Null for completed or cancelled upload requests.", "title": "Upload Url"}}, "required": ["id", "status", "file_name", "file_size_bytes", "created_at", "completed_at", "upload_url"], "title": "VideoUploadRequestWithUploadUrl", "type": "object"}, "CreateVideoUploadRequestInput": {"properties": {"visit_id": {"title": "Visit Id", "type": "string"}, "file_name": {"title": "File Name", "type": "string"}, "file_size_bytes": {"title": "File Size Bytes", "type": "integer"}}, "required": ["visit_id", "file_name", "file_size_bytes"], "title": "CreateVideoUploadRequestInput", "type": "object"}, "ConfirmVideoUploadRequestResponse": {"properties": {"video_upload_request": {"$ref": "#/components/schemas/VideoUploadRequestExternalSchema"}}, "required": ["video_upload_request"], "title": "ConfirmVideoUploadRequestResponse", "type": "object"}, "GetVideoUploadRequestResponse": {"properties": {"video_upload_request": {"$ref": "#/components/schemas/VideoUploadRequestWithUploadUrlExternalSchema"}}, "required": ["video_upload_request"], "title": "GetVideoUploadRequestResponse", "type": "object"}, "CancelVideoUploadRequestResponse": {"properties": {"video_upload_request": {"$ref": "#/components/schemas/VideoUploadRequestExternalSchema"}}, "required": ["video_upload_request"], "title": "CancelVideoUploadRequestResponse", "type": "object"}, "ListMarketsRequest": {"properties": {"reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Reference Key"}, "slug": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Slug"}}, "title": "ListMarketsRequest", "type": "object"}, "ListMarketsResponse": {"properties": {"markets": {"items": {"$ref": "#/components/schemas/MarketExternalSchema"}, "title": "Markets", "type": "array"}}, "required": ["markets"], "title": "ListMarketsResponse", "type": "object"}, "MarketExternalSchema": {"properties": {"id": {"title": "Id", "type": "string"}, "name": {"description": "Display name for this market. Must be unique within your organization.", "title": "Name", "type": "string"}, "slug": {"description": "URL-friendly identifier for this market. Must be unique within your organization. Only lowercase letters and underscores are allowed.", "title": "Slug", "type": "string"}, "reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Optional unique identifier for this market in your system. Must be unique within your organization.", "title": "Reference Key"}}, "required": ["id", "name", "slug", "reference_key"], "title": "Market", "type": "object"}, "MarketResponse": {"properties": {"market": {"$ref": "#/components/schemas/MarketExternalSchema"}}, "required": ["market"], "title": "MarketResponse", "type": "object"}, "CreateMarketRequest": {"additionalProperties": false, "properties": {"name": {"description": "Display name for the market.", "minLength": 1, "title": "Name", "type": "string"}, "slug": {"description": "URL-friendly identifier for the market. Must be unique within your organization. Only lowercase letters and underscores are allowed.", "pattern": "^[a-z_]+$", "title": "Slug", "type": "string"}}, "required": ["name", "slug"], "title": "CreateMarketRequest", "type": "object"}, "UpdateMarketRequest": {"additionalProperties": false, "description": "Request schema for updating a market.\n\nAll fields are optional. Omitting a field leaves it unchanged.", "properties": {"name": {"description": "Display name for the market. Must be unique within your organization. Omit to leave unchanged.", "minLength": 1, "title": "Name", "type": "string"}, "slug": {"description": "URL-friendly identifier for the market. Must be unique within your organization. Only lowercase letters and underscores are allowed. Omit to leave unchanged.", "pattern": "^[a-z_]+$", "title": "Slug", "type": "string"}}, "required": [], "title": "UpdateMarketRequest", "type": "object"}, "ListRejectionReasonOptionsResponse": {"properties": {"rejection_reason_options": {"items": {"$ref": "#/components/schemas/RejectionReasonOptionExternalSchema"}, "title": "Rejection Reason Options", "type": "array"}}, "required": ["rejection_reason_options"], "title": "ListRejectionReasonOptionsResponse", "type": "object"}, "RejectionReasonOptionExternalSchema": {"properties": {"id": {"description": "Opaque identifier for this rejection reason option.", "title": "Id", "type": "string"}, "label": {"description": "Display text for this reason.", "title": "Label", "type": "string"}}, "required": ["id", "label"], "title": "RejectionReasonOption", "type": "object"}, "RejectionReasonOptionResponse": {"properties": {"rejection_reason_option": {"$ref": "#/components/schemas/RejectionReasonOptionExternalSchema"}}, "required": ["rejection_reason_option"], "title": "RejectionReasonOptionResponse", "type": "object"}, "ListRoomTypesResponse": {"properties": {"room_types": {"items": {"$ref": "#/components/schemas/RoomTypeExternalSchema"}, "title": "Room Types", "type": "array"}}, "required": ["room_types"], "title": "ListRoomTypesResponse", "type": "object"}, "RoomTypeExternalSchema": {"properties": {"id": {"title": "Id", "type": "string"}, "name": {"title": "Name", "type": "string"}, "reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Optional unique identifier for this room type in your system.", "title": "Reference Key"}}, "required": ["id", "name", "reference_key"], "title": "RoomType", "type": "object"}, "AnswerExternalSchema": {"properties": {"id": {"title": "Id", "type": "string"}, "title": {"description": "The checklist question text.", "title": "Title", "type": "string"}, "value": {"description": "The answer (e.g. \"Good\", \"Poor\", \"Yes\", \"No\").", "title": "Value", "type": "string"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Additional notes or justification for this answer.", "title": "Description"}, "evidence": {"description": "Images and audio segments supporting this answer.", "items": {"anyOf": [{"$ref": "#/components/schemas/ImageEvidenceExternalSchema"}, {"$ref": "#/components/schemas/AudioEvidenceExternalSchema"}]}, "title": "Evidence", "type": "array"}, "area_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The room or area this answer applies to.", "title": "Area Name"}}, "required": ["id", "title", "value", "description", "evidence", "area_name"], "title": "Answer", "type": "object"}, "LegacyScopeExternalSchema": {"properties": {"status": {"enum": ["not_complete", "complete"], "title": "Status", "type": "string"}, "created_at": {"format": "date-time", "title": "Created At", "type": "string"}, "completed_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "When the scope was finalized.", "title": "Completed At"}, "completed_by": {"anyOf": [{"$ref": "#/components/schemas/UserExternalSchema"}, {"type": "null"}], "description": "The user who finalized the scope."}, "location": {"$ref": "#/components/schemas/LocationExternalSchema"}, "latest_visit": {"$ref": "#/components/schemas/VisitExternalSchema", "description": "The visit that produced this scope."}, "checklist_answers": {"description": "Inspection findings from the visit.", "items": {"$ref": "#/components/schemas/AnswerExternalSchema"}, "title": "Checklist Answers", "type": "array"}, "line_item_rows": {"description": "Line items identified during the scope.", "items": {"$ref": "#/components/schemas/LineItemRowExternalSchema"}, "title": "Line Item Rows", "type": "array"}}, "required": ["status", "created_at", "completed_at", "completed_by", "location", "latest_visit", "checklist_answers", "line_item_rows"], "title": "LegacyScope", "type": "object"}, "LegacyScopeResponse": {"properties": {"scope": {"$ref": "#/components/schemas/LegacyScopeExternalSchema"}}, "required": ["scope"], "title": "LegacyScopeResponse", "type": "object"}, "CreateLineItemRowRequest": {"properties": {"title": {"title": "Title", "type": "string"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Description"}, "quantity": {"anyOf": [{"type": "integer"}, {"type": "null"}], "deprecated": true, "description": "Deprecated: Use cost_components instead.", "title": "Quantity"}, "unit_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "deprecated": true, "description": "Deprecated: Use cost_components instead.", "title": "Unit Type"}, "unit_cost_cents": {"anyOf": [{"type": "integer"}, {"type": "null"}], "deprecated": true, "description": "Deprecated: Use cost_components instead.", "title": "Unit Cost Cents"}, "cost_components": {"anyOf": [{"items": {"$ref": "#/components/schemas/CostComponentExternalSchema"}, "minItems": 1, "type": "array"}, {"type": "null"}], "description": "Granular cost breakdown. When provided, overrides legacy quantity/unit_type/unit_cost_cents fields.", "title": "Cost Components"}, "price_reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Price Reference Key"}, "notes": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Notes"}, "custom_fields": {"anyOf": [{"type": "object"}, {"type": "null"}], "title": "Custom Fields"}, "area_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Area Name"}}, "required": ["title"], "title": "CreateLineItemRowRequest", "type": "object"}, "ScopeDetailExternalSchema": {"description": "The full scope resource including line items, keyed by Scope.Id.\n\nThis intentionally omits workflow-ish fields like status and completed_by.\nThose semantics are still evolving, while this resource is meant to expose\nthe stable customer-facing scope object.", "properties": {"id": {"title": "Id", "type": "string"}, "created_at": {"format": "date-time", "title": "Created At", "type": "string"}, "location": {"$ref": "#/components/schemas/LocationExternalSchema"}, "initial_visit": {"anyOf": [{"$ref": "#/components/schemas/VisitExternalSchema"}, {"type": "null"}], "description": "The visit that produced this scope."}, "line_item_rows": {"description": "Line items identified during the scope.", "items": {"$ref": "#/components/schemas/LineItemRowExternalSchema"}, "title": "Line Item Rows", "type": "array"}}, "required": ["id", "created_at", "location", "initial_visit", "line_item_rows"], "title": "Scope", "type": "object"}, "ScopeResponse": {"properties": {"scope": {"$ref": "#/components/schemas/ScopeDetailExternalSchema"}}, "required": ["scope"], "title": "ScopeResponse", "type": "object"}, "CreateScopeRequest": {"properties": {"location_id": {"title": "Location Id", "type": "string"}}, "required": ["location_id"], "title": "CreateScopeRequest", "type": "object"}, "ScopeListRequest": {"properties": {"limit": {"default": 50, "maximum": 1000, "minimum": 1, "title": "Limit", "type": "integer"}, "cursor": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Cursor"}, "location_id": {"anyOf": [{"items": {"type": "string"}, "maxItems": 100, "minItems": 1, "type": "array"}, {"type": "null"}], "title": "Location Id"}}, "title": "ScopeListRequest", "type": "object"}, "ListScopesResponse": {"properties": {"scopes": {"items": {"$ref": "#/components/schemas/ScopeThinExternalSchema"}, "title": "Scopes", "type": "array"}, "next_cursor": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Next Cursor"}}, "required": ["scopes", "next_cursor"], "title": "ListScopesResponse", "type": "object"}, "ScopeThinExternalSchema": {"description": "Lightweight scope schema for list endpoints.\n\nRelated resources are referenced by id only; fetch the full object via its\nown endpoint when needed. This keeps list payloads small and avoids coupling\nlist responses to the shapes of Location and Visit.\n\nAlso intentionally omits workflow-ish fields like status and completed_by.\nThose semantics are still evolving, while this resource is meant to expose\nthe stable customer-facing scope object.", "properties": {"id": {"title": "Id", "type": "string"}, "created_at": {"format": "date-time", "title": "Created At", "type": "string"}, "location_id": {"title": "Location Id", "type": "string"}, "initial_visit_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The visit that produced this scope, if any.", "title": "Initial Visit Id"}}, "required": ["id", "created_at", "location_id", "initial_visit_id"], "title": "ScopeSummary", "type": "object"}, "VendorOrganizationResponse": {"properties": {"vendor": {"$ref": "#/components/schemas/VendorOrganizationExternalSchema"}}, "required": ["vendor"], "title": "VendorOrganizationResponse", "type": "object"}, "CreateVendorOrganizationRequest": {"additionalProperties": false, "properties": {"name": {"maxLength": 255, "title": "Name", "type": "string"}, "email": {"anyOf": [{"maxLength": 255, "type": "string"}, {"type": "null"}], "title": "Email"}, "reference_key": {"maxLength": 255, "title": "Reference Key", "type": "string"}, "market_ids": {"description": "IDs of the markets this vendor serves. A vendor with no market associations (empty list) serves all markets. May be omitted (defaults to empty list).", "items": {"type": "string"}, "maxItems": 100, "title": "Market Ids", "type": "array"}}, "required": ["name", "reference_key"], "title": "CreateVendorOrganizationRequest", "type": "object"}, "VendorOrganizationListRequest": {"properties": {"limit": {"default": 50, "maximum": 1000, "minimum": 1, "title": "Limit", "type": "integer"}, "cursor": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Cursor"}, "reference_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Reference Key"}, "is_enabled": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Filter to only vendors which are or are not enabled. Omit to list all vendors.", "title": "Is Enabled"}}, "title": "VendorOrganizationListRequest", "type": "object"}, "ListVendorOrganizationsResponse": {"properties": {"vendors": {"items": {"$ref": "#/components/schemas/VendorOrganizationExternalSchema"}, "title": "Vendors", "type": "array"}, "next_cursor": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Next Cursor"}}, "required": ["vendors", "next_cursor"], "title": "ListVendorOrganizationsResponse", "type": "object"}, "UpdateVendorOrganizationRequest": {"additionalProperties": false, "description": "Every field is omit-to-preserve: only fields present in the request body are applied.\n\nAll fields except email are non-nullable: their `default=None, validate_default=False` keeps them\noptional without advertising `null` as an accepted value, matching UpdateMarketRequest.", "properties": {"name": {"description": "Vendor name. Omit to leave unchanged.", "maxLength": 255, "title": "Name", "type": "string"}, "email": {"anyOf": [{"maxLength": 255, "type": "string"}, {"type": "null"}], "description": "Vendor email. Omit to leave unchanged; pass null to clear it.", "title": "Email"}, "reference_key": {"description": "Vendor reference key. Omit to leave unchanged.", "maxLength": 255, "title": "Reference Key", "type": "string"}, "is_enabled": {"description": "Whether this vendor is assignable to new work. Omit to leave unchanged.", "title": "Is Enabled", "type": "boolean"}, "market_ids": {"description": "IDs of the markets this vendor serves. Omit to leave unchanged. A vendor with no market associations (empty list) serves all markets.", "items": {"type": "string"}, "maxItems": 100, "title": "Market Ids", "type": "array"}}, "required": [], "title": "UpdateVendorOrganizationRequest", "type": "object"}, "ListVisitTypesResponse": {"properties": {"visit_types": {"items": {"$ref": "#/components/schemas/VisitTypeExternalSchema"}, "title": "Visit Types", "type": "array"}}, "required": ["visit_types"], "title": "ListVisitTypesResponse", "type": "object"}}, "securitySchemes": {"ApiKeyAuth": {"type": "http", "scheme": "bearer"}}}, "servers": [{"url": "https://api.navigateai.co"}]}