{"openapi":"3.1.0","info":{"title":"Mason External API","version":"2-c8807bb9565ac15c","description":"Read APIs for your property management account. Business-data endpoints require an Authorization: Bearer token issued for your account; you cannot select a different account through request parameters. Public documentation requires no token. Dates are ISO 8601 timestamps unless stated otherwise. Null means no value is recorded; it is distinct from false, zero, an empty string, and an empty array. JSON snapshots are returned unchanged, and optional provider-specific keys may vary. v2 uses low/normal/urgent attention priorities; v1 retains its legacy numeric-or-null priority contract. This specification describes implemented endpoints only."},"servers":[{"url":"https://mason.enduring-labs.com/api/external/v2","description":"Production Mason External API v2."}],"security":[{"bearerAuth":[]}],"tags":[{"name":"work-orders","description":"Maintenance work orders belonging to your property management account. Priority describes office attention; urgencyLevel and isEmergency describe maintenance urgency. Returned values reflect current stored state, not a historical snapshot."},{"name":"calls","description":"Recorded phone calls scoped to your property management account. Call content and recording availability depend on the stored record."},{"name":"text-messages","description":"Stored inbound and outbound text messages for your property management account. Work-order filtering matches the primary linked work order."},{"name":"invoices","description":"Stored invoices, matching results, and review/billing state. Top-level monetary amounts are integer cents. Nested document data is returned as stored and may use different representations."},{"name":"contacts","description":"People and businesses in your property management account. Hydrate contact references with a detail request or the id/ids filters, even when the contact predates your incremental sync window."},{"name":"control-logs","description":"Maintenance visit/control-log records. Assigned technicians describe assignment, not completed labor. Nested JSON is returned as stored; changes to related records do not necessarily update this record timestamp."},{"name":"properties","description":"Properties associated with your account, including stored address, ownership, and provider details. No geocoding or owner lookup runs as part of this read."},{"name":"scheduling-blocks","description":"Stored availability and appointment blocks. blockType=confirmed identifies a confirmed work window. A confirmed block and tenantConfirmationStatus are distinct facts. Range endpoints can be null for unbounded windows."},{"name":"on-call-coverage","description":"Recorded effective on-call coverage for a bounded time range."},{"name":"documentation","description":"Public machine-readable API reference."}],"paths":{"/work-orders":{"get":{"tags":["work-orders"],"operationId":"listWorkOrder","summary":"List work-orders","description":"Maintenance work orders belonging to your property management account. Priority describes office attention; urgencyLevel and isEmergency describe maintenance urgency. Returned values reflect current stored state, not a historical snapshot.\n\nFilters are combined with AND, except the documented id/ids aliases. Unknown query parameters and empty filter values are ignored. Results are ordered newest first by record creation time, then by ID descending. Continue with nextCursor and the same filters. Incremental date bounds filter current rows; they do not provide complete historical changes or a snapshot across pages.","parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, normally 1–100. Defaults to 50 when omitted, zero, or not parseable as an integer; other parsed values are clamped to 1–100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque nextCursor from the preceding page. Omit for the first page; do not construct or modify cursor values.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Exact match on status. Stored work-order lifecycle status, for example created, reviewed, dispatched, work_in_progress, work_done, closed, cancelled, or duplicate. Other stored statuses may occur.","schema":{"type":"string","description":"Exact match on status. Stored work-order lifecycle status, for example created, reviewed, dispatched, work_in_progress, work_done, closed, cancelled, or duplicate. Other stored statuses may occur."}},{"name":"workOrderType","in":"query","required":false,"description":"Exact match on workOrderType. Stored work category: reactive, reactive:recall, turn, recurring, misc, inspection, or an inspection subtype such as inspection:annual, inspection:move_in, inspection:move_out, inspection:pre_move_out, inspection:onboarding, inspection:semi_annual, or inspection:drive_by. Legacy values are returned unchanged.","schema":{"type":"string","description":"Exact match on workOrderType. Stored work category: reactive, reactive:recall, turn, recurring, misc, inspection, or an inspection subtype such as inspection:annual, inspection:move_in, inspection:move_out, inspection:pre_move_out, inspection:onboarding, inspection:semi_annual, or inspection:drive_by. Legacy values are returned unchanged."}},{"name":"source","in":"query","required":false,"description":"Exact match on source. Stored intake channel, commonly pms:portal, pms:text, pms:email, pms:call, pms:system, mason:portal, mason:text, mason:email, mason:call, mason:system, or mason:recurring. It describes the origin/channel, not the requester identity. Legacy values are returned unchanged.","schema":{"type":"string","description":"Exact match on source. Stored intake channel, commonly pms:portal, pms:text, pms:email, pms:call, pms:system, mason:portal, mason:text, mason:email, mason:call, mason:system, or mason:recurring. It describes the origin/channel, not the requester identity. Legacy values are returned unchanged."}},{"name":"createdAfter","in":"query","required":false,"description":"Inclusive lower bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive lower bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"createdBefore","in":"query","required":false,"description":"Inclusive upper bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive upper bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"updatedAfter","in":"query","required":false,"description":"Inclusive lower bound on lastUpdated. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive lower bound on lastUpdated. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp."}},{"name":"updatedBefore","in":"query","required":false,"description":"Inclusive upper bound on lastUpdated. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive upper bound on lastUpdated. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp."}}],"responses":{"200":{"description":"One page of work-orders visible to the token's property management account.","content":{"application/json":{"schema":{"type":"object","description":"Paginated resource response.","required":["data","pagination"],"additionalProperties":false,"properties":{"data":{"type":"array","description":"Matching work-orders records on this page. An empty array means no records matched.","items":{"$ref":"#/components/schemas/WorkOrder"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"401":{"description":"Missing, malformed, invalid, inactive, or expired bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed. The response contains a generic error message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/work-orders/{id}":{"get":{"tags":["work-orders"],"operationId":"getWorkOrder","summary":"Get one work-orders record","description":"Maintenance work orders belonging to your property management account. Priority describes office attention; urgencyLevel and isEmergency describe maintenance urgency. Returned values reflect current stored state, not a historical snapshot.\n\nReturns one record by its Mason UUID. Missing records and records outside the token's property management account both return 404.","parameters":[{"name":"id","in":"path","required":true,"description":"Mason UUID returned in the record id field. This is not a provider identifier or display number.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The requested record.","content":{"application/json":{"schema":{"type":"object","description":"Single-resource response.","required":["data"],"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/WorkOrder"}}}}}},"401":{"description":"Missing, malformed, invalid, inactive, or expired bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No record exists in this account with that ID, or the ID is not a valid UUID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed. The response contains a generic error message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/calls":{"get":{"tags":["calls"],"operationId":"listCall","summary":"List calls","description":"Recorded phone calls scoped to your property management account. Call content and recording availability depend on the stored record.\n\nFilters are combined with AND, except the documented id/ids aliases. Unknown query parameters and empty filter values are ignored. Results are ordered newest first by record creation time, then by ID descending. Continue with nextCursor and the same filters. Incremental date bounds filter current rows; they do not provide complete historical changes or a snapshot across pages.","parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, normally 1–100. Defaults to 50 when omitted, zero, or not parseable as an integer; other parsed values are clamped to 1–100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque nextCursor from the preceding page. Omit for the first page; do not construct or modify cursor values.","schema":{"type":"string"}},{"name":"callStatus","in":"query","required":false,"description":"Exact match on callStatus. Stored call outcome, such as completed, failed, busy, or no-answer.","schema":{"type":"string","description":"Exact match on callStatus. Stored call outcome, such as completed, failed, busy, or no-answer."}},{"name":"callerRole","in":"query","required":false,"description":"Exact match on callerRole. Recorded role of the other party, such as tenant, vendor, or property_manager. Legacy roles may occur.","schema":{"type":"string","description":"Exact match on callerRole. Recorded role of the other party, such as tenant, vendor, or property_manager. Legacy roles may occur."}},{"name":"inBound","in":"query","required":false,"description":"Exact match on inBound. True for an incoming call; false for an outgoing call.","schema":{"type":"boolean","description":"Exact match on inBound. True for an incoming call; false for an outgoing call."}},{"name":"workOrderId","in":"query","required":false,"description":"Exact match on internalWorkOrderId. Linked Mason work-order ID. Resolve it using GET /work-orders/{id}; null means no work order is linked.","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact match on internalWorkOrderId. Linked Mason work-order ID. Resolve it using GET /work-orders/{id}; null means no work order is linked."}},{"name":"contactId","in":"query","required":false,"description":"Exact match on masonContactId. Linked Mason contact ID. Resolve it using GET /contacts/{id}; null means no contact is linked.","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact match on masonContactId. Linked Mason contact ID. Resolve it using GET /contacts/{id}; null means no contact is linked."}},{"name":"createdAfter","in":"query","required":false,"description":"Inclusive lower bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive lower bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"createdBefore","in":"query","required":false,"description":"Inclusive upper bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive upper bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}}],"responses":{"200":{"description":"One page of calls visible to the token's property management account.","content":{"application/json":{"schema":{"type":"object","description":"Paginated resource response.","required":["data","pagination"],"additionalProperties":false,"properties":{"data":{"type":"array","description":"Matching calls records on this page. An empty array means no records matched.","items":{"$ref":"#/components/schemas/Call"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"401":{"description":"Missing, malformed, invalid, inactive, or expired bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed. The response contains a generic error message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/calls/{id}":{"get":{"tags":["calls"],"operationId":"getCall","summary":"Get one calls record","description":"Recorded phone calls scoped to your property management account. Call content and recording availability depend on the stored record.\n\nReturns one record by its Mason UUID. Missing records and records outside the token's property management account both return 404.","parameters":[{"name":"id","in":"path","required":true,"description":"Mason UUID returned in the record id field. This is not a provider identifier or display number.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The requested record.","content":{"application/json":{"schema":{"type":"object","description":"Single-resource response.","required":["data"],"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Call"}}}}}},"401":{"description":"Missing, malformed, invalid, inactive, or expired bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No record exists in this account with that ID, or the ID is not a valid UUID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed. The response contains a generic error message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/text-messages":{"get":{"tags":["text-messages"],"operationId":"listTextMessage","summary":"List text-messages","description":"Stored inbound and outbound text messages for your property management account. Work-order filtering matches the primary linked work order.\n\nFilters are combined with AND, except the documented id/ids aliases. Unknown query parameters and empty filter values are ignored. Results are ordered newest first by record creation time, then by ID descending. Continue with nextCursor and the same filters. Incremental date bounds filter current rows; they do not provide complete historical changes or a snapshot across pages.","parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, normally 1–100. Defaults to 50 when omitted, zero, or not parseable as an integer; other parsed values are clamped to 1–100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque nextCursor from the preceding page. Omit for the first page; do not construct or modify cursor values.","schema":{"type":"string"}},{"name":"senderRole","in":"query","required":false,"description":"Exact match on senderRole. Recorded sender role, such as tenant, vendor, owner, tech, or property_manager. Legacy roles may occur.","schema":{"type":"string","description":"Exact match on senderRole. Recorded sender role, such as tenant, vendor, owner, tech, or property_manager. Legacy roles may occur."}},{"name":"workOrderId","in":"query","required":false,"description":"Exact match on internalWorkOrderId. Linked Mason work-order ID. Resolve it using GET /work-orders/{id}; null means no work order is linked.","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact match on internalWorkOrderId. Linked Mason work-order ID. Resolve it using GET /work-orders/{id}; null means no work order is linked."}},{"name":"contactId","in":"query","required":false,"description":"Exact match on masonContactId. Linked Mason contact ID. Resolve it using GET /contacts/{id}; null means no contact is linked.","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact match on masonContactId. Linked Mason contact ID. Resolve it using GET /contacts/{id}; null means no contact is linked."}},{"name":"createdAfter","in":"query","required":false,"description":"Inclusive lower bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive lower bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"createdBefore","in":"query","required":false,"description":"Inclusive upper bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive upper bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}}],"responses":{"200":{"description":"One page of text-messages visible to the token's property management account.","content":{"application/json":{"schema":{"type":"object","description":"Paginated resource response.","required":["data","pagination"],"additionalProperties":false,"properties":{"data":{"type":"array","description":"Matching text-messages records on this page. An empty array means no records matched.","items":{"$ref":"#/components/schemas/TextMessage"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"401":{"description":"Missing, malformed, invalid, inactive, or expired bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed. The response contains a generic error message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/text-messages/{id}":{"get":{"tags":["text-messages"],"operationId":"getTextMessage","summary":"Get one text-messages record","description":"Stored inbound and outbound text messages for your property management account. Work-order filtering matches the primary linked work order.\n\nReturns one record by its Mason UUID. Missing records and records outside the token's property management account both return 404.","parameters":[{"name":"id","in":"path","required":true,"description":"Mason UUID returned in the record id field. This is not a provider identifier or display number.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The requested record.","content":{"application/json":{"schema":{"type":"object","description":"Single-resource response.","required":["data"],"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/TextMessage"}}}}}},"401":{"description":"Missing, malformed, invalid, inactive, or expired bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No record exists in this account with that ID, or the ID is not a valid UUID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed. The response contains a generic error message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/invoices":{"get":{"tags":["invoices"],"operationId":"listInvoice","summary":"List invoices","description":"Stored invoices, matching results, and review/billing state. Top-level monetary amounts are integer cents. Nested document data is returned as stored and may use different representations.\n\nFilters are combined with AND, except the documented id/ids aliases. Unknown query parameters and empty filter values are ignored. Results are ordered newest first by record creation time, then by ID descending. Continue with nextCursor and the same filters. Incremental date bounds filter current rows; they do not provide complete historical changes or a snapshot across pages.","parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, normally 1–100. Defaults to 50 when omitted, zero, or not parseable as an integer; other parsed values are clamped to 1–100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque nextCursor from the preceding page. Omit for the first page; do not construct or modify cursor values.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Exact match on status. Stored invoice processing status, such as pending, processed, incomplete, not_invoice, reprocessing, failed, failed_with_partial_data, or no_pdf_attachments.","schema":{"type":"string","description":"Exact match on status. Stored invoice processing status, such as pending, processed, incomplete, not_invoice, reprocessing, failed, failed_with_partial_data, or no_pdf_attachments."}},{"name":"confidence","in":"query","required":false,"description":"Exact match on confidence. Stored extraction confidence or processing classification. Common values include high, medium, low, failed, failed_with_partial_data, and no_pdf_attachments.","schema":{"type":"string","description":"Exact match on confidence. Stored extraction confidence or processing classification. Common values include high, medium, low, failed, failed_with_partial_data, and no_pdf_attachments."}},{"name":"isInvoice","in":"query","required":false,"description":"Exact match on isInvoice. Whether this record is classified as an invoice.","schema":{"type":"boolean","description":"Exact match on isInvoice. Whether this record is classified as an invoice."}},{"name":"isRecurring","in":"query","required":false,"description":"Exact match on isRecurring. Whether the invoice was classified as recurring.","schema":{"type":"boolean","description":"Exact match on isRecurring. Whether the invoice was classified as recurring."}},{"name":"reviewed","in":"query","required":false,"description":"Exact match on reviewed. Whether the invoice has been marked reviewed by the office/accounting process.","schema":{"type":"boolean","description":"Exact match on reviewed. Whether the invoice has been marked reviewed by the office/accounting process."}},{"name":"reviewReason","in":"query","required":false,"description":"Exact match on reviewReason. Recorded review disposition, commonly bill_created, completed_outside_mason, duplicate, not_an_invoice, or archived.","schema":{"type":"string","description":"Exact match on reviewReason. Recorded review disposition, commonly bill_created, completed_outside_mason, duplicate, not_an_invoice, or archived."}},{"name":"pmApproved","in":"query","required":false,"description":"Exact match on pmApproved. Whether the invoice is marked approved.","schema":{"type":"boolean","description":"Exact match on pmApproved. Whether the invoice is marked approved."}},{"name":"pmRejected","in":"query","required":false,"description":"Exact match on pmRejected. Whether the invoice is marked rejected.","schema":{"type":"boolean","description":"Exact match on pmRejected. Whether the invoice is marked rejected."}},{"name":"needsReview","in":"query","required":false,"description":"Exact match on needsReview. Whether the recorded validation result requires review.","schema":{"type":"boolean","description":"Exact match on needsReview. Whether the recorded validation result requires review."}},{"name":"workOrderId","in":"query","required":false,"description":"Exact match on internalWorkOrderId. Linked Mason work-order ID. Resolve it using GET /work-orders/{id}; null means no work order is linked.","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact match on internalWorkOrderId. Linked Mason work-order ID. Resolve it using GET /work-orders/{id}; null means no work order is linked."}},{"name":"workOrderNumber","in":"query","required":false,"description":"Case-insensitive literal substring match on workOrderNumber. Human-readable work-order number associated with the invoice. Percent and underscore characters are treated literally, not as wildcards.","schema":{"type":"string","description":"Case-insensitive literal substring match on workOrderNumber. Human-readable work-order number associated with the invoice. Percent and underscore characters are treated literally, not as wildcards."}},{"name":"invoiceNumber","in":"query","required":false,"description":"Case-insensitive literal substring match on invoiceNumber. Invoice number printed on the document. Percent and underscore characters are treated literally, not as wildcards.","schema":{"type":"string","description":"Case-insensitive literal substring match on invoiceNumber. Invoice number printed on the document. Percent and underscore characters are treated literally, not as wildcards."}},{"name":"emailSender","in":"query","required":false,"description":"Case-insensitive literal substring match on emailSender. Source email sender. Percent and underscore characters are treated literally, not as wildcards.","schema":{"type":"string","description":"Case-insensitive literal substring match on emailSender. Source email sender. Percent and underscore characters are treated literally, not as wildcards."}},{"name":"emailSubject","in":"query","required":false,"description":"Case-insensitive literal substring match on emailSubject. Source email subject. Percent and underscore characters are treated literally, not as wildcards.","schema":{"type":"string","description":"Case-insensitive literal substring match on emailSubject. Source email subject. Percent and underscore characters are treated literally, not as wildcards."}},{"name":"createdAfter","in":"query","required":false,"description":"Inclusive lower bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive lower bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"createdBefore","in":"query","required":false,"description":"Inclusive upper bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive upper bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"updatedAfter","in":"query","required":false,"description":"Inclusive lower bound on updatedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive lower bound on updatedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp."}},{"name":"updatedBefore","in":"query","required":false,"description":"Inclusive upper bound on updatedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive upper bound on updatedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp."}},{"name":"invoiceDateAfter","in":"query","required":false,"description":"Inclusive lower bound on invoiceDate. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive lower bound on invoiceDate. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"invoiceDateBefore","in":"query","required":false,"description":"Inclusive upper bound on invoiceDate. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive upper bound on invoiceDate. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"dueDateAfter","in":"query","required":false,"description":"Inclusive lower bound on dueDate. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive lower bound on dueDate. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"dueDateBefore","in":"query","required":false,"description":"Inclusive upper bound on dueDate. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive upper bound on dueDate. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"pmsUploadedAfter","in":"query","required":false,"description":"Inclusive lower bound on pmsUploadedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive lower bound on pmsUploadedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"pmsUploadedBefore","in":"query","required":false,"description":"Inclusive upper bound on pmsUploadedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive upper bound on pmsUploadedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}}],"responses":{"200":{"description":"One page of invoices visible to the token's property management account.","content":{"application/json":{"schema":{"type":"object","description":"Paginated resource response.","required":["data","pagination"],"additionalProperties":false,"properties":{"data":{"type":"array","description":"Matching invoices records on this page. An empty array means no records matched.","items":{"$ref":"#/components/schemas/Invoice"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"401":{"description":"Missing, malformed, invalid, inactive, or expired bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed. The response contains a generic error message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/invoices/{id}":{"get":{"tags":["invoices"],"operationId":"getInvoice","summary":"Get one invoices record","description":"Stored invoices, matching results, and review/billing state. Top-level monetary amounts are integer cents. Nested document data is returned as stored and may use different representations.\n\nReturns one record by its Mason UUID. Missing records and records outside the token's property management account both return 404.","parameters":[{"name":"id","in":"path","required":true,"description":"Mason UUID returned in the record id field. This is not a provider identifier or display number.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The requested record.","content":{"application/json":{"schema":{"type":"object","description":"Single-resource response.","required":["data"],"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Invoice"}}}}}},"401":{"description":"Missing, malformed, invalid, inactive, or expired bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No record exists in this account with that ID, or the ID is not a valid UUID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed. The response contains a generic error message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/contacts":{"get":{"tags":["contacts"],"operationId":"listContact","summary":"List contacts","description":"People and businesses in your property management account. Hydrate contact references with a detail request or the id/ids filters, even when the contact predates your incremental sync window.\n\nFilters are combined with AND, except the documented id/ids aliases. Unknown query parameters and empty filter values are ignored. Results are ordered newest first by record creation time, then by ID descending. Continue with nextCursor and the same filters. Incremental date bounds filter current rows; they do not provide complete historical changes or a snapshot across pages.","parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, normally 1–100. Defaults to 50 when omitted, zero, or not parseable as an integer; other parsed values are clamped to 1–100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque nextCursor from the preceding page. Omit for the first page; do not construct or modify cursor values.","schema":{"type":"string"}},{"name":"id","in":"query","required":false,"description":"Filter by one or more comma-separated Mason contact UUIDs. id and ids are aliases; when both are supplied their IDs are combined. Invalid UUID entries are ignored, and a set with no valid IDs matches nothing. Results still use normal pagination.","schema":{"type":"string","description":"Filter by one or more comma-separated Mason contact UUIDs. id and ids are aliases; when both are supplied their IDs are combined. Invalid UUID entries are ignored, and a set with no valid IDs matches nothing. Results still use normal pagination."}},{"name":"ids","in":"query","required":false,"description":"Filter by one or more comma-separated Mason contact UUIDs. id and ids are aliases; when both are supplied their IDs are combined. Invalid UUID entries are ignored, and a set with no valid IDs matches nothing. Results still use normal pagination.","schema":{"type":"string","description":"Filter by one or more comma-separated Mason contact UUIDs. id and ids are aliases; when both are supplied their IDs are combined. Invalid UUID entries are ignored, and a set with no valid IDs matches nothing. Results still use normal pagination."}},{"name":"contactType","in":"query","required":false,"description":"Exact match on contactType. Contact category, such as tenant, vendor, owner, tech, or property_manager.","schema":{"type":"string","description":"Exact match on contactType. Contact category, such as tenant, vendor, owner, tech, or property_manager."}},{"name":"isActive","in":"query","required":false,"description":"Exact match on isActive. Whether the contact is marked active.","schema":{"type":"boolean","description":"Exact match on isActive. Whether the contact is marked active."}},{"name":"search","in":"query","required":false,"description":"Case-insensitive literal substring match on name. Contact display name. Percent and underscore characters are treated literally, not as wildcards.","schema":{"type":"string","description":"Case-insensitive literal substring match on name. Contact display name. Percent and underscore characters are treated literally, not as wildcards."}},{"name":"createdAfter","in":"query","required":false,"description":"Inclusive lower bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive lower bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"createdBefore","in":"query","required":false,"description":"Inclusive upper bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive upper bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"updatedAfter","in":"query","required":false,"description":"Inclusive lower bound on updatedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive lower bound on updatedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp."}},{"name":"updatedBefore","in":"query","required":false,"description":"Inclusive upper bound on updatedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive upper bound on updatedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp."}}],"responses":{"200":{"description":"One page of contacts visible to the token's property management account.","content":{"application/json":{"schema":{"type":"object","description":"Paginated resource response.","required":["data","pagination"],"additionalProperties":false,"properties":{"data":{"type":"array","description":"Matching contacts records on this page. An empty array means no records matched.","items":{"$ref":"#/components/schemas/Contact"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"401":{"description":"Missing, malformed, invalid, inactive, or expired bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed. The response contains a generic error message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/contacts/{id}":{"get":{"tags":["contacts"],"operationId":"getContact","summary":"Get one contacts record","description":"People and businesses in your property management account. Hydrate contact references with a detail request or the id/ids filters, even when the contact predates your incremental sync window.\n\nReturns one record by its Mason UUID. Missing records and records outside the token's property management account both return 404.","parameters":[{"name":"id","in":"path","required":true,"description":"Mason UUID returned in the record id field. This is not a provider identifier or display number.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The requested record.","content":{"application/json":{"schema":{"type":"object","description":"Single-resource response.","required":["data"],"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Contact"}}}}}},"401":{"description":"Missing, malformed, invalid, inactive, or expired bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No record exists in this account with that ID, or the ID is not a valid UUID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed. The response contains a generic error message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/control-logs":{"get":{"tags":["control-logs"],"operationId":"listControlLog","summary":"List control-logs","description":"Maintenance visit/control-log records. Assigned technicians describe assignment, not completed labor. Nested JSON is returned as stored; changes to related records do not necessarily update this record timestamp.\n\nFilters are combined with AND, except the documented id/ids aliases. Unknown query parameters and empty filter values are ignored. Results are ordered newest first by record creation time, then by ID descending. Continue with nextCursor and the same filters. Incremental date bounds filter current rows; they do not provide complete historical changes or a snapshot across pages.","parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, normally 1–100. Defaults to 50 when omitted, zero, or not parseable as an integer; other parsed values are clamped to 1–100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque nextCursor from the preceding page. Omit for the first page; do not construct or modify cursor values.","schema":{"type":"string"}},{"name":"finalDisposition","in":"query","required":false,"description":"Exact match on finalDisposition. Recorded disposition, commonly Complete, Still Working, Canceled, Estimate, or an empty string.","schema":{"type":"string","description":"Exact match on finalDisposition. Recorded disposition, commonly Complete, Still Working, Canceled, Estimate, or an empty string."}},{"name":"priority","in":"query","required":false,"description":"Exact match on priority. Recorded visit priority, commonly urgent, normal, or low.","schema":{"type":"string","description":"Exact match on priority. Recorded visit priority, commonly urgent, normal, or low."}},{"name":"noteReviewed","in":"query","required":false,"description":"Exact match on noteReviewed. Whether the office has reviewed the recorded work notes; null means not recorded.","schema":{"type":"boolean","description":"Exact match on noteReviewed. Whether the office has reviewed the recorded work notes; null means not recorded."}},{"name":"assignedTech","in":"query","required":false,"description":"Match control logs whose assignedTechs contains this exact Mason technician contact ID.","schema":{"type":"string","description":"Match control logs whose assignedTechs contains this exact Mason technician contact ID."}},{"name":"initialRoutingTech","in":"query","required":false,"description":"Match control logs whose legacy initialRouting contains this exact technician name.","schema":{"type":"string","description":"Match control logs whose legacy initialRouting contains this exact technician name."}},{"name":"workOrderId","in":"query","required":false,"description":"Exact match on internalWorkOrderId. Linked Mason work-order ID. Resolve it using GET /work-orders/{id}; null means no work order is linked.","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact match on internalWorkOrderId. Linked Mason work-order ID. Resolve it using GET /work-orders/{id}; null means no work order is linked."}},{"name":"logDateAfter","in":"query","required":false,"description":"Inclusive lower bound on logDate. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive lower bound on logDate. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"logDateBefore","in":"query","required":false,"description":"Inclusive upper bound on logDate. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive upper bound on logDate. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"createdAfter","in":"query","required":false,"description":"Inclusive lower bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive lower bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"createdBefore","in":"query","required":false,"description":"Inclusive upper bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive upper bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"updatedAfter","in":"query","required":false,"description":"Inclusive lower bound on updatedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive lower bound on updatedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp."}},{"name":"updatedBefore","in":"query","required":false,"description":"Inclusive upper bound on updatedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive upper bound on updatedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp."}}],"responses":{"200":{"description":"One page of control-logs visible to the token's property management account.","content":{"application/json":{"schema":{"type":"object","description":"Paginated resource response.","required":["data","pagination"],"additionalProperties":false,"properties":{"data":{"type":"array","description":"Matching control-logs records on this page. An empty array means no records matched.","items":{"$ref":"#/components/schemas/ControlLog"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"401":{"description":"Missing, malformed, invalid, inactive, or expired bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed. The response contains a generic error message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/control-logs/{id}":{"get":{"tags":["control-logs"],"operationId":"getControlLog","summary":"Get one control-logs record","description":"Maintenance visit/control-log records. Assigned technicians describe assignment, not completed labor. Nested JSON is returned as stored; changes to related records do not necessarily update this record timestamp.\n\nReturns one record by its Mason UUID. Missing records and records outside the token's property management account both return 404.","parameters":[{"name":"id","in":"path","required":true,"description":"Mason UUID returned in the record id field. This is not a provider identifier or display number.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The requested record.","content":{"application/json":{"schema":{"type":"object","description":"Single-resource response.","required":["data"],"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/ControlLog"}}}}}},"401":{"description":"Missing, malformed, invalid, inactive, or expired bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No record exists in this account with that ID, or the ID is not a valid UUID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed. The response contains a generic error message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/properties":{"get":{"tags":["properties"],"operationId":"listProperty","summary":"List properties","description":"Properties associated with your account, including stored address, ownership, and provider details. No geocoding or owner lookup runs as part of this read.\n\nFilters are combined with AND, except the documented id/ids aliases. Unknown query parameters and empty filter values are ignored. Results are ordered newest first by record creation time, then by ID descending. Continue with nextCursor and the same filters. Incremental date bounds filter current rows; they do not provide complete historical changes or a snapshot across pages.","parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, normally 1–100. Defaults to 50 when omitted, zero, or not parseable as an integer; other parsed values are clamped to 1–100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque nextCursor from the preceding page. Omit for the first page; do not construct or modify cursor values.","schema":{"type":"string"}},{"name":"isActive","in":"query","required":false,"description":"Exact match on isActive. Whether the property is marked active.","schema":{"type":"boolean","description":"Exact match on isActive. Whether the property is marked active."}},{"name":"city","in":"query","required":false,"description":"Exact match on city. City.","schema":{"type":"string","description":"Exact match on city. City."}},{"name":"state","in":"query","required":false,"description":"Exact match on state. State or region.","schema":{"type":"string","description":"Exact match on state. State or region."}},{"name":"search","in":"query","required":false,"description":"Case-insensitive literal substring match on formattedAddress. Formatted property address. Percent and underscore characters are treated literally, not as wildcards.","schema":{"type":"string","description":"Case-insensitive literal substring match on formattedAddress. Formatted property address. Percent and underscore characters are treated literally, not as wildcards."}},{"name":"createdAfter","in":"query","required":false,"description":"Inclusive lower bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive lower bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"createdBefore","in":"query","required":false,"description":"Inclusive upper bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive upper bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"updatedAfter","in":"query","required":false,"description":"Inclusive lower bound on updatedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive lower bound on updatedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp."}},{"name":"updatedBefore","in":"query","required":false,"description":"Inclusive upper bound on updatedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive upper bound on updatedAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records. Related-record changes do not necessarily advance this timestamp."}}],"responses":{"200":{"description":"One page of properties visible to the token's property management account.","content":{"application/json":{"schema":{"type":"object","description":"Paginated resource response.","required":["data","pagination"],"additionalProperties":false,"properties":{"data":{"type":"array","description":"Matching properties records on this page. An empty array means no records matched.","items":{"$ref":"#/components/schemas/Property"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"401":{"description":"Missing, malformed, invalid, inactive, or expired bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed. The response contains a generic error message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/properties/{id}":{"get":{"tags":["properties"],"operationId":"getProperty","summary":"Get one properties record","description":"Properties associated with your account, including stored address, ownership, and provider details. No geocoding or owner lookup runs as part of this read.\n\nReturns one record by its Mason UUID. Missing records and records outside the token's property management account both return 404.","parameters":[{"name":"id","in":"path","required":true,"description":"Mason UUID returned in the record id field. This is not a provider identifier or display number.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The requested record.","content":{"application/json":{"schema":{"type":"object","description":"Single-resource response.","required":["data"],"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Property"}}}}}},"401":{"description":"Missing, malformed, invalid, inactive, or expired bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No record exists in this account with that ID, or the ID is not a valid UUID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed. The response contains a generic error message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/scheduling-blocks":{"get":{"tags":["scheduling-blocks"],"operationId":"listSchedulingBlock","summary":"List scheduling-blocks","description":"Stored availability and appointment blocks. blockType=confirmed identifies a confirmed work window. A confirmed block and tenantConfirmationStatus are distinct facts. Range endpoints can be null for unbounded windows.\n\nFilters are combined with AND, except the documented id/ids aliases. Unknown query parameters and empty filter values are ignored. Results are ordered newest first by record creation time, then by ID descending. Continue with nextCursor and the same filters. Incremental date bounds filter current rows; they do not provide complete historical changes or a snapshot across pages.","parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, normally 1–100. Defaults to 50 when omitted, zero, or not parseable as an integer; other parsed values are clamped to 1–100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque nextCursor from the preceding page. Omit for the first page; do not construct or modify cursor values.","schema":{"type":"string"}},{"name":"workOrderId","in":"query","required":false,"description":"Exact match on workOrderId. Linked Mason work-order ID. Resolve it using GET /work-orders/{id}; null means no work order is linked.","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact match on workOrderId. Linked Mason work-order ID. Resolve it using GET /work-orders/{id}; null means no work order is linked."}},{"name":"controlLogId","in":"query","required":false,"description":"Exact match on controlLogId. Linked Mason control-log ID; resolve using GET /control-logs/{id}.","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact match on controlLogId. Linked Mason control-log ID; resolve using GET /control-logs/{id}."}},{"name":"contactId","in":"query","required":false,"description":"Exact match on contactId. Linked Mason contact ID. Resolve it using GET /contacts/{id}; null means no contact is linked.","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact match on contactId. Linked Mason contact ID. Resolve it using GET /contacts/{id}; null means no contact is linked."}},{"name":"blockType","in":"query","required":false,"description":"Exact match on blockType. Stored scheduling category, such as tenant_available, vendor_available, tentative, confirmed, tech_scheduling_proposal, blocked, superseded, on_call_assignment, on_call_override, or on_call_cancellation.","schema":{"type":"string","description":"Exact match on blockType. Stored scheduling category, such as tenant_available, vendor_available, tentative, confirmed, tech_scheduling_proposal, blocked, superseded, on_call_assignment, on_call_override, or on_call_cancellation."}},{"name":"source","in":"query","required":false,"description":"Exact match on source. Stored scheduling source, such as tenant_portal, vendor_portal, pm_manual, or ai_suggested.","schema":{"type":"string","description":"Exact match on source. Stored scheduling source, such as tenant_portal, vendor_portal, pm_manual, or ai_suggested."}},{"name":"tenantConfirmationStatus","in":"query","required":false,"description":"Exact match on tenantConfirmationStatus. Stored tenant confirmation status, commonly pending or confirmed; null means legacy or unknown.","schema":{"type":"string","description":"Exact match on tenantConfirmationStatus. Stored tenant confirmation status, commonly pending or confirmed; null means legacy or unknown."}},{"name":"linkKey","in":"query","required":false,"description":"Exact match on linkKey. Identifier grouping blocks from one scheduling submission.","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact match on linkKey. Identifier grouping blocks from one scheduling submission."}},{"name":"createdAfter","in":"query","required":false,"description":"Inclusive lower bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive lower bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"createdBefore","in":"query","required":false,"description":"Inclusive upper bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive upper bound on createdAt. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"startAfter","in":"query","required":false,"description":"Inclusive lower bound on start. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive lower bound on start. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"startBefore","in":"query","required":false,"description":"Inclusive upper bound on start. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive upper bound on start. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"endAfter","in":"query","required":false,"description":"Inclusive lower bound on end. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive lower bound on end. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}},{"name":"endBefore","in":"query","required":false,"description":"Inclusive upper bound on end. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Inclusive upper bound on end. Use an ISO 8601 timestamp with a timezone. Invalid dates match no records."}}],"responses":{"200":{"description":"One page of scheduling-blocks visible to the token's property management account.","content":{"application/json":{"schema":{"type":"object","description":"Paginated resource response.","required":["data","pagination"],"additionalProperties":false,"properties":{"data":{"type":"array","description":"Matching scheduling-blocks records on this page. An empty array means no records matched.","items":{"$ref":"#/components/schemas/SchedulingBlock"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"401":{"description":"Missing, malformed, invalid, inactive, or expired bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed. The response contains a generic error message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/scheduling-blocks/{id}":{"get":{"tags":["scheduling-blocks"],"operationId":"getSchedulingBlock","summary":"Get one scheduling-blocks record","description":"Stored availability and appointment blocks. blockType=confirmed identifies a confirmed work window. A confirmed block and tenantConfirmationStatus are distinct facts. Range endpoints can be null for unbounded windows.\n\nReturns one record by its Mason UUID. Missing records and records outside the token's property management account both return 404.","parameters":[{"name":"id","in":"path","required":true,"description":"Mason UUID returned in the record id field. This is not a provider identifier or display number.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The requested record.","content":{"application/json":{"schema":{"type":"object","description":"Single-resource response.","required":["data"],"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/SchedulingBlock"}}}}}},"401":{"description":"Missing, malformed, invalid, inactive, or expired bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No record exists in this account with that ID, or the ID is not a valid UUID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed. The response contains a generic error message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/on-call-coverage":{"get":{"tags":["on-call-coverage"],"operationId":"listOnCallCoverage","summary":"List recorded on-call coverage","description":"Returns recorded effective coverage for the requested time window, ordered by coverage start, rotation name, then row ID. Projected coverage is excluded. This endpoint returns the full requested range and does not use limit/cursor pagination or a detail endpoint. Absence of a record does not establish complete coverage history.","parameters":[{"name":"start","in":"query","required":true,"description":"Beginning of the requested time window. Use an ISO 8601 timestamp with a timezone. start must precede end and the range must not exceed 400 days.","schema":{"type":"string","format":"date-time"}},{"name":"end","in":"query","required":true,"description":"End of the requested time window. Use an ISO 8601 timestamp with a timezone. start must precede end and the range must not exceed 400 days.","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Recorded coverage segments within the requested range.","content":{"application/json":{"schema":{"type":"object","description":"Recorded coverage response without pagination.","required":["data"],"additionalProperties":false,"properties":{"data":{"type":"array","description":"Coverage segments. Empty when no recorded coverage matches.","items":{"$ref":"#/components/schemas/OnCallCoverage"}}}}}}},"400":{"description":"A valid start/end range of at most 400 days is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, malformed, invalid, inactive, or expired bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed. The response contains a generic error message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/openapi.json":{"get":{"tags":["documentation"],"operationId":"getOpenApiDocument","summary":"Download this API specification","description":"Public OpenAPI 3.1 JSON document bundled with the API deployment. No token is needed. info.version is a content-derived contract revision; it changes when this specification changes. ETag supports identifying the published document. It contains documentation only and performs no customer-data reads.","security":[],"responses":{"200":{"description":"The OpenAPI document itself, without a data envelope.","content":{"application/json":{"schema":{"type":"object","description":"An OpenAPI 3.1 document. See https://spec.openapis.org/oas/v3.1.0 for the standard document structure.","additionalProperties":true}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Use the Mason API token issued for your property management account. Business-data requests remain scoped to that account."}},"schemas":{"Pagination":{"type":"object","properties":{"hasMore":{"type":"boolean","description":"Whether another page of matching records exists at the time of this read."},"nextCursor":{"description":"Opaque continuation token. Present only when hasMore is true; omitted on the last page. Reuse the same resource and filters with this cursor.","type":"string"}},"required":["hasMore"],"additionalProperties":false,"description":"Cursor pagination information. Fetch pages until hasMore is false. Reads are not an immutable historical snapshot."},"Error":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable error message. No diagnostic stack or execution details are returned."}},"required":["error"],"additionalProperties":false,"description":"Error response returned instead of a data envelope."},"OnCallCoverage":{"type":"object","properties":{"id":{"type":"string","description":"Opaque coverage-row identifier. It is not a UUID and has no detail endpoint."},"rotationId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Mason on-call rotation ID."},"rotationName":{"type":"string","description":"Recorded rotation name, or the current name when no snapshot is available."},"markets":{"type":"array","items":{"type":"string","description":"One coverage label."},"description":"Recorded property-class coverage labels for the rotation; an empty array means no labels are recorded."},"scheduledShiftStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Original scheduled shift start."},"scheduledShiftEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Original scheduled shift end."},"coverageStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Start of this effective coverage segment within the requested range."},"coverageEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"End of this effective coverage segment within the requested range."},"contactId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"Covered technician/contact Mason ID, when available."},"contactName":{"type":"string","description":"Recorded contact name; Unknown contact when a name is unavailable."},"contactEmail":{"anyOf":[{"type":"string","description":"Recorded contact email address."},{"type":"null"}]},"source":{"type":"string","enum":["rotation","override"],"description":"Whether coverage comes from the rotation or an override."},"overrideReason":{"anyOf":[{"type":"string","description":"Recorded business reason for an override."},{"type":"null"}]},"overrideRecurrence":{"anyOf":[{"type":"string","enum":["weekly","biweekly"]},{"type":"null"}],"description":"Override repetition; null indicates no repeating override."},"canCorrect":{"type":"boolean","description":"Whether the current application permits a correction to this coverage record; this API itself is read-only."},"recordStatus":{"type":"string","const":"recorded","description":"This endpoint returns recorded coverage only and excludes projected coverage."},"ledgerBlockId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"Scheduling-block ID supporting this coverage record."},"recordedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When the coverage record was created."},{"type":"null"}]},"recordedBy":{"anyOf":[{"type":"string","description":"Recorded author of the coverage record."},{"type":"null"}]},"ledgerSource":{"anyOf":[{"type":"string","description":"Stored business source of the coverage record."},{"type":"null"}]},"recordReason":{"anyOf":[{"type":"string","description":"Recorded business reason for the coverage record."},{"type":"null"}]}},"required":["id","rotationId","rotationName","markets","scheduledShiftStart","scheduledShiftEnd","coverageStart","coverageEnd","contactId","contactName","contactEmail","source","overrideReason","overrideRecurrence","canCorrect","recordStatus","ledgerBlockId","recordedAt","recordedBy","ledgerSource","recordReason"],"additionalProperties":false,"description":"One recorded on-call coverage segment. Results are ordered by coverage start, rotation name, and row ID."},"WorkOrder":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Unique Mason record ID. Use this value in the corresponding detail endpoint."},"description":{"type":"string","description":"Recorded description of the maintenance request."},"status":{"type":"string","description":"Stored work-order lifecycle status, for example created, reviewed, dispatched, work_in_progress, work_done, closed, cancelled, or duplicate. Other stored statuses may occur."},"propertyAddress":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Formatted address associated with the request."},"source":{"type":"string","description":"Stored intake channel, commonly pms:portal, pms:text, pms:email, pms:call, pms:system, mason:portal, mason:text, mason:email, mason:call, mason:system, or mason:recurring. It describes the origin/channel, not the requester identity. Legacy values are returned unchanged."},"workOrderType":{"type":"string","description":"Stored work category: reactive, reactive:recall, turn, recurring, misc, inspection, or an inspection subtype such as inspection:annual, inspection:move_in, inspection:move_out, inspection:pre_move_out, inspection:onboarding, inspection:semi_annual, or inspection:drive_by. Legacy values are returned unchanged."},"friendlyId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable Mason work-order number, when assigned. Use id for API lookups."},"isEmergency":{"type":"boolean","description":"Whether the work order is currently marked as an emergency."},"approved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Recorded work-order approval flag; null means not recorded."},"vendorWorkOrderStatus":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stored vendor progress status, such as sent, receipt_confirmed, or completed."},"hasEntryPermission":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Recorded permission to enter: true permits entry, false denies entry, and null means permission was not recorded."},"propertyId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"Linked Mason property ID. Resolve using GET /properties/{id}."},"unitId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"Linked Mason unit ID, when present. This API version currently has no units resource."},"tenantContactId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"Primary tenant Mason contact ID. Resolve using GET /contacts/{id}."},"vendorContactId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"Assigned vendor or in-house technician Mason contact ID. Resolve using GET /contacts/{id}; contactType may be vendor or tech."},"intakeMetadata":{"anyOf":[{"type":"object","properties":{"reportedByRole":{"type":"string","description":"Recorded role of the person who reported the issue."},"wrappedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When an existing provider work order was first imported into Mason."}},"additionalProperties":{},"description":"Stored intake metadata returned unchanged. Available keys vary by intake source and record age; this is an extensible JSON object, not a complete history."},{"type":"null"}],"description":"Stored intake metadata returned unchanged. Available keys vary by intake source and record age; this is an extensible JSON object, not a complete history."},"priority":{"anyOf":[{"type":"string","enum":["low","normal","urgent"]},{"type":"null"}],"description":"Effective attention priority: the explicit priorityOverride when present, otherwise aiPriority. Null means no recognized value is available."},"aiPriority":{"anyOf":[{"type":"string","enum":["low","normal","urgent"]},{"type":"null"}],"description":"Stored assessed attention priority, before an explicit user override."},"priorityOverride":{"anyOf":[{"type":"string","enum":["low","normal","urgent"]},{"type":"null"}],"description":"Explicit user override of attention priority; null means no override."},"urgencyLevel":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stored physical maintenance urgency from the work-order assessment; separate from office attention priority."},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When the record was created in Mason, as an ISO 8601 timestamp."},"lastUpdated":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Timestamp used by updatedAfter/updatedBefore. Includes initial import into Mason as well as stored work-order updates. Related-record changes and representation-only backfills may not advance it."}},"required":["id","description","status","propertyAddress","source","workOrderType","friendlyId","isEmergency","approved","vendorWorkOrderStatus","hasEntryPermission","propertyId","unitId","tenantContactId","vendorContactId","intakeMetadata","priority","aiPriority","priorityOverride","urgencyLevel","createdAt","lastUpdated"],"additionalProperties":false,"description":"Maintenance work orders belonging to your property management account. Priority describes office attention; urgencyLevel and isEmergency describe maintenance urgency. Returned values reflect current stored state, not a historical snapshot."},"Call":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Unique Mason record ID. Use this value in the corresponding detail endpoint."},"phoneNumber":{"type":"string","description":"Phone number associated with the other party."},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stored readable summary of the call."},"transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stored call transcript as text."},"callDuration":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Recorded call duration in seconds."},"recordingUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"URL of the stored call recording, when available."},"inBound":{"type":"boolean","description":"True for an incoming call; false for an outgoing call."},"callStatus":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stored call outcome, such as completed, failed, busy, or no-answer."},"callerRole":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Recorded role of the other party, such as tenant, vendor, or property_manager. Legacy roles may occur."},"callType":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Recorded business purpose of the call, such as vendor follow-up, scheduling, or work-order creation."},"requiresAction":{"type":"boolean","description":"Whether the call is currently marked as requiring attention."},"internalWorkOrderId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"Linked Mason work-order ID. Resolve it using GET /work-orders/{id}; null means no work order is linked."},"masonContactId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"Linked Mason contact ID. Resolve it using GET /contacts/{id}; null means no contact is linked."},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When the record was created in Mason, as an ISO 8601 timestamp."},"endedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"ISO 8601 timestamp."},{"type":"null"}],"description":"When the call ended, if recorded, as an ISO 8601 timestamp."}},"required":["id","phoneNumber","summary","transcript","callDuration","recordingUrl","inBound","callStatus","callerRole","callType","requiresAction","internalWorkOrderId","masonContactId","createdAt","endedAt"],"additionalProperties":false,"description":"Recorded phone calls scoped to your property management account. Call content and recording availability depend on the stored record."},"TextMessage":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Unique Mason record ID. Use this value in the corresponding detail endpoint."},"phoneNumber":{"type":"string","description":"Phone number associated with the other party."},"message":{"type":"string","description":"Stored message text."},"mediaUrls":{"anyOf":[{"type":"array","items":{"type":"string","description":"One attachment URL."},"description":"Stored URLs of media attached to this message."},{"type":"null"}],"description":"Stored URLs of media attached to this message."},"inBound":{"type":"boolean","description":"True for a received message; false for a sent message."},"senderRole":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Recorded sender role, such as tenant, vendor, owner, tech, or property_manager. Legacy roles may occur."},"internalWorkOrderId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"Linked Mason work-order ID. Resolve it using GET /work-orders/{id}; null means no work order is linked."},"masonContactId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"Linked Mason contact ID. Resolve it using GET /contacts/{id}; null means no contact is linked."},"fromNumber":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Recorded sending phone number."},"toNumber":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Recorded receiving phone number."},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When the record was created in Mason, as an ISO 8601 timestamp."}},"required":["id","phoneNumber","message","mediaUrls","inBound","senderRole","internalWorkOrderId","masonContactId","fromNumber","toNumber","createdAt"],"additionalProperties":false,"description":"Stored inbound and outbound text messages for your property management account. Work-order filtering matches the primary linked work order."},"Invoice":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Unique Mason record ID. Use this value in the corresponding detail endpoint."},"invoiceNumber":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Invoice number printed on the document."},"invoiceDate":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"ISO 8601 timestamp."},{"type":"null"}],"description":"Invoice date as an ISO 8601 timestamp."},"dueDate":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"ISO 8601 timestamp."},{"type":"null"}],"description":"Invoice due date as an ISO 8601 timestamp."},"totalAmount":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Invoice total in integer cents."},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stored currency code, commonly USD."},"subtotal":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Invoice subtotal in integer cents."},"tax":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Invoice tax in integer cents."},"vendorInfo":{"anyOf":[{"type":"object","properties":{"name":{"type":"string","description":"Party or company name."},"address":{"anyOf":[{"type":"string","description":"Address as supplied by the source."},{"type":"object","properties":{"street":{"type":"string","description":"Street address."},"address":{"type":"string","description":"First address line."},"address2":{"type":"string","description":"Apartment, suite, or second address line."},"city":{"type":"string","description":"City."},"state":{"type":"string","description":"State or region."},"zip":{"type":"string","description":"Postal code."},"country":{"type":"string","description":"Country."}},"additionalProperties":{},"description":"Structured postal address supplied by the source."}],"description":"Postal address; sources may store a string or a structured address."},"email":{"type":"string","description":"Email address supplied on the invoice."},"phone":{"type":"string","description":"Phone number supplied on the invoice."}},"additionalProperties":{},"description":"Vendor information recorded on the invoice document."},{"type":"null"}],"description":"Vendor information recorded on the invoice document."},"billToInfo":{"anyOf":[{"type":"object","properties":{"name":{"type":"string","description":"Party or company name."},"address":{"anyOf":[{"type":"string","description":"Address as supplied by the source."},{"type":"object","properties":{"street":{"type":"string","description":"Street address."},"address":{"type":"string","description":"First address line."},"address2":{"type":"string","description":"Apartment, suite, or second address line."},"city":{"type":"string","description":"City."},"state":{"type":"string","description":"State or region."},"zip":{"type":"string","description":"Postal code."},"country":{"type":"string","description":"Country."}},"additionalProperties":{},"description":"Structured postal address supplied by the source."}],"description":"Postal address; sources may store a string or a structured address."},"email":{"type":"string","description":"Email address supplied on the invoice."},"phone":{"type":"string","description":"Phone number supplied on the invoice."}},"additionalProperties":{},"description":"Bill-to party recorded on the invoice document."},{"type":"null"}],"description":"Bill-to party recorded on the invoice document."},"items":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"description":{"type":"string","description":"Description of the billed product or service."},"quantity":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Quantity as recorded on the invoice."},"unitPrice":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Price per unit in the stored invoice representation; unlike top-level totalAmount, this unnormalized JSON value is not guaranteed to be cents."},"totalPrice":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Extended line amount in the stored invoice representation."}},"additionalProperties":{},"description":"One recorded invoice line item. Historical values may be numeric strings; amounts use the stored document representation, not necessarily cents."},"description":"Stored invoice line items; nested amounts are not normalized by this read API."},{"type":"null"}],"description":"Stored invoice line items; nested amounts are not normalized by this read API."},"workOrderNumber":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable work-order number associated with the invoice."},"internalWorkOrderId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"Linked Mason work-order ID. Resolve it using GET /work-orders/{id}; null means no work order is linked."},"confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stored extraction confidence or processing classification. Common values include high, medium, low, failed, failed_with_partial_data, and no_pdf_attachments."},"isInvoice":{"type":"boolean","description":"Whether this record is classified as an invoice."},"additionalNotes":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Additional notes recorded with the invoice."},"isRecurring":{"type":"boolean","description":"Whether the invoice was classified as recurring."},"recurringDescription":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Recorded description of the recurring charge."},"matchedVendor":{"anyOf":[{"type":"object","properties":{"entityId":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Identifier in the connected property management system; meaningful only within that account."},"confidence":{"type":"string","description":"Stored confidence in this match, when present."},"matchType":{"type":"string","description":"Recorded matching category, when present."},"pmsUrl":{"anyOf":[{"type":"string","description":"Link to the matched record in the connected property management system."},{"type":"null"}]},"vendorId":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Vendor identifier in the connected system."},"vendorName":{"type":"string","description":"Matched vendor name."},"companyName":{"type":"string","description":"Matched vendor company name."},"telephone":{"type":"string","description":"Matched vendor phone number."},"email":{"type":"string","description":"Matched vendor email address."},"defaultBillSplitAccount":{"anyOf":[{"type":"string","description":"Default ledger account identifier for vendor bill splits."},{"type":"null"}]},"defaultMarkupDiscount":{"anyOf":[{"type":"string","description":"Default markup or discount setting from the connected system."},{"type":"null"}]},"vendorInfo":{"type":"object","properties":{"name":{"type":"string","description":"Party or company name."},"address":{"anyOf":[{"type":"string","description":"Address as supplied by the source."},{"type":"object","properties":{"street":{"type":"string","description":"Street address."},"address":{"type":"string","description":"First address line."},"address2":{"type":"string","description":"Apartment, suite, or second address line."},"city":{"type":"string","description":"City."},"state":{"type":"string","description":"State or region."},"zip":{"type":"string","description":"Postal code."},"country":{"type":"string","description":"Country."}},"additionalProperties":{},"description":"Structured postal address supplied by the source."}],"description":"Postal address; sources may store a string or a structured address."},"email":{"type":"string","description":"Email address supplied on the invoice."},"phone":{"type":"string","description":"Phone number supplied on the invoice."}},"additionalProperties":{},"description":"Invoice party information as recorded on the document. Keys may be missing."}},"additionalProperties":{},"description":"Vendor matched to the invoice. Provider-specific keys may be present; this is a stored snapshot, not a fresh vendor lookup."},{"type":"null"}],"description":"Vendor matched to the invoice. Provider-specific keys may be present; this is a stored snapshot, not a fresh vendor lookup."},"matchedProperty":{"anyOf":[{"type":"object","properties":{"entityId":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Identifier in the connected property management system; meaningful only within that account."},"confidence":{"type":"string","description":"Stored confidence in this match, when present."},"matchType":{"type":"string","description":"Recorded matching category, when present."},"pmsUrl":{"anyOf":[{"type":"string","description":"Link to the matched record in the connected property management system."},{"type":"null"}]},"propertyId":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Property identifier in the connected system."},"buildingName":{"type":"string","description":"Matched property or building name."},"fullAddress":{"type":"string","description":"Formatted property address."},"attachedPortfolio":{"anyOf":[{"type":"string","description":"Portfolio associated with the matched property."},{"type":"null"}]},"buildingAbbreviation":{"anyOf":[{"type":"string","description":"Short building label."},{"type":"null"}]},"propertyInfo":{"description":"Provider-specific property snapshot; no uniform nested schema is guaranteed."}},"additionalProperties":{},"description":"Property matched to the invoice. Stored provider snapshot; optional keys vary by provider and record age."},{"type":"null"}],"description":"Property matched to the invoice. Stored provider snapshot; optional keys vary by provider and record age."},"matchedWorkOrder":{"anyOf":[{"type":"object","properties":{"entityId":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Identifier in the connected property management system; meaningful only within that account."},"confidence":{"type":"string","description":"Stored confidence in this match, when present."},"matchType":{"type":"string","description":"Recorded matching category, when present."},"pmsUrl":{"anyOf":[{"type":"string","description":"Link to the matched record in the connected property management system."},{"type":"null"}]},"workOrderId":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Matched provider work-order identifier."},"workOrderNumber":{"type":"string","description":"Human-readable provider work-order number."},"appFolioServiceRequestId":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"AppFolio service-request identifier used to link to the work order."},"status":{"type":"string","description":"Stored status of the matched work order."},"type":{"anyOf":[{"type":"string","description":"Stored work-order type."},{"type":"null"}]},"source":{"anyOf":[{"type":"string","description":"Recorded source of the matched work order."},{"type":"null"}]},"isVacant":{"anyOf":[{"type":"boolean","description":"Whether the location was recorded as vacant."},{"type":"null"}]},"filename":{"type":"string","description":"Associated document filename."},"description":{"type":"string","description":"Description of the matched work."},"propertyAddress":{"type":"string","description":"Address associated with the work."},"workOrderGrammaticalSummary":{"type":"string","description":"Readable summary of the work order."},"doNotExceed":{"anyOf":[{"type":"string","description":"Stored spending limit from the connected system."},{"type":"null"}]},"stickyNote":{"anyOf":[{"type":"string","description":"Recorded work-order note."},{"type":"null"}]},"workStatus":{"anyOf":[{"type":"string","description":"Provider work status."},{"type":"null"}]},"tasks":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Provider task identifier."},"date":{"type":"string","description":"Recorded task date."},"delegated":{"type":"array","items":{"type":"string","description":"Delegate name or identifier."},"description":"People delegated to the task."},"description":{"type":"string","description":"Task description."},"isCompleted":{"type":"boolean","description":"Whether the task was completed."}},"additionalProperties":{},"description":"A task in the matched provider work order."}},{"type":"null"}],"description":"Stored provider tasks, when available."},"warnings":{"type":"array","items":{"description":"A recorded business warning associated with the match; shape varies by provider."},"description":"Warnings associated with the matched work order."},"upAndUpBillChecklist":{"description":"Provider-specific bill review checklist, when available."},"masonUrl":{"anyOf":[{"type":"string","description":"Link to the work order in Mason."},{"type":"null"}]},"workOrderInfo":{"description":"Provider-specific work-order snapshot; keys vary by integration."}},"additionalProperties":{},"description":"Work order matched to the invoice. Identifiers here belong to the connected system; use the invoice internalWorkOrderId for Mason API joins."},{"type":"null"}],"description":"Work order matched to the invoice. Identifiers here belong to the connected system; use the invoice internalWorkOrderId for Mason API joins."},"emailMessageId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stored source email identifier; it is not necessarily a Mason record UUID."},"emailSender":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Source email sender."},"emailSubject":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Source email subject."},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Primary document filename."},"pdfBlobUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"URL of the primary document. Despite this field name, the document can be an image or another supported attachment type; inspect attachment mimeType."},"attachments":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"filename":{"type":"string","description":"Attachment filename."},"mimeType":{"type":"string","description":"Content type, such as application/pdf or image/jpeg."},"size":{"type":"number","description":"File size in bytes, when recorded."},"blobUrl":{"anyOf":[{"type":"string","description":"URL for the stored attachment."},{"type":"null"}]},"contentId":{"anyOf":[{"type":"string","description":"Email content identifier for an inline attachment."},{"type":"null"}]},"isInline":{"anyOf":[{"type":"boolean","description":"Whether the attachment was displayed inline in the email."},{"type":"null"}]},"kind":{"type":"string","description":"Recorded attachment category."},"adjustment":{"type":"object","properties":{"originalTotalAmountCents":{"anyOf":[{"type":"number","description":"Original invoice total in cents."},{"type":"null"}]},"approvedTotalAmountCents":{"type":"number","description":"Approved replacement invoice total in cents."},"adjustmentAmountCents":{"anyOf":[{"type":"number","description":"Adjustment amount in cents."},{"type":"null"}]},"reason":{"anyOf":[{"type":"string","description":"Business reason for the adjustment."},{"type":"null"}]},"approvedBy":{"anyOf":[{"type":"string","description":"Recorded approver."},{"type":"null"}]},"approvedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When the adjustment was approved."},"originalPdfBlobUrl":{"anyOf":[{"type":"string","description":"Original document URL."},{"type":"null"}]},"originalFilename":{"anyOf":[{"type":"string","description":"Original document filename."},{"type":"null"}]}},"additionalProperties":{},"description":"Recorded adjustment to an invoice document."},"pdfEdit":{"type":"object","properties":{"originalPdfBlobUrl":{"anyOf":[{"type":"string","description":"Original document URL."},{"type":"null"}]},"originalFilename":{"anyOf":[{"type":"string","description":"Original document filename."},{"type":"null"}]},"editedPdfBlobUrl":{"type":"string","description":"Edited document URL."},"editedFilename":{"type":"string","description":"Edited document filename."},"editedBy":{"anyOf":[{"type":"string","description":"Recorded editor."},{"type":"null"}]},"editedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When the document was edited."},"reason":{"anyOf":[{"type":"string","description":"Business reason for the edit."},{"type":"null"}]},"editCount":{"type":"number","description":"Number of recorded document edits."}},"additionalProperties":{},"description":"Recorded edit to the invoice document."},"invoiceTemplate":{"description":"Stored invoice presentation metadata; optional keys vary by document format."},"sourceInvoiceSplit":{"description":"Stored relationship to a source invoice split across properties; optional keys vary by split format."}},"additionalProperties":{},"description":"An invoice attachment. Additional document-editing or source metadata may be present on historical records."},"description":"Stored attachment records; optional metadata varies by document."},{"type":"null"}],"description":"Stored attachment records; optional metadata varies by document."},"status":{"type":"string","description":"Stored invoice processing status, such as pending, processed, incomplete, not_invoice, reprocessing, failed, failed_with_partial_data, or no_pdf_attachments."},"reviewed":{"type":"boolean","description":"Whether the invoice has been marked reviewed by the office/accounting process."},"reviewReason":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Recorded review disposition, commonly bill_created, completed_outside_mason, duplicate, not_an_invoice, or archived."},"pmApproved":{"type":"boolean","description":"Whether the invoice is marked approved."},"pmApprovedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"ISO 8601 timestamp."},{"type":"null"}],"description":"Recorded approval timestamp."},"pmApprovedBy":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Recorded approving user identifier, typically an email address."},"pmRejected":{"type":"boolean","description":"Whether the invoice is marked rejected."},"pmRejectedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"ISO 8601 timestamp."},{"type":"null"}],"description":"Recorded rejection timestamp."},"pmRejectionReason":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Recorded business reason for rejection."},"pmsUploadedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"ISO 8601 timestamp."},{"type":"null"}],"description":"When bill upload to the connected property management system was recorded."},"pmsBillUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Link to the bill created in the connected property management system."},"workDoneDescription":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Recorded description of the completed work used for billing."},"selectedGlAccountId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Selected ledger account identifier in the connected system."},"selectedTerms":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stored payment terms selected for billing."},"selectedMarkupPercentage":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stored markup percentage as a decimal string; 10 means ten percent."},"selectedMarkupAccountId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Selected ledger account identifier for markup."},"selectedDiscountPercentage":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stored discount percentage as a decimal string; 10 means ten percent."},"shareInvoiceWithOwner":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether the invoice is marked to be shared with the owner; this flag alone does not prove delivery."},"suggestedBillSplits":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"description":{"type":"string","description":"Description for this allocation."},"amount":{"type":"string","description":"Stored allocation amount as a decimal string."},"glAccountId":{"anyOf":[{"type":"string","description":"Provider ledger account identifier."},{"type":"null"}]}},"additionalProperties":{},"description":"One recorded bill allocation."},"description":"Recorded proposed bill allocations, when available."},{"type":"null"}],"description":"Recorded proposed bill allocations, when available."},"tenantChargeSignal":{"anyOf":[{"type":"object","properties":{"recommended":{"type":"boolean","description":"Whether a resident charge is recommended."},"reason":{"anyOf":[{"type":"string","description":"Business explanation for the recommendation."},{"type":"null"}]},"glSuggestion":{"type":"string","description":"Suggested ledger category for the resident charge."}},"additionalProperties":{},"description":"Recorded recommendation about charging the resident."},{"type":"null"}],"description":"Recorded recommendation about charging the resident."},"needsReview":{"type":"boolean","description":"Whether the recorded validation result requires review."},"agreementValidation":{"anyOf":[{"type":"object","properties":{"isValid":{"type":"boolean","description":"Whether the recorded invoice checks passed."},"confidence":{"type":"string","description":"Confidence in the recorded validation result; commonly high, medium, or low."},"reasoning":{"type":"string","description":"Recorded business explanation of the validation result."},"conflicts":{"type":"array","items":{"type":"string","description":"One conflict or review reason."},"description":"Recorded disagreements or review reasons."},"rematchAttempt":{"anyOf":[{"type":"object","properties":{"attempted":{"type":"boolean","description":"Whether rematching was attempted."},"succeeded":{"type":"boolean","description":"Whether rematching succeeded."},"originalWorkOrderId":{"type":"string","description":"Original work-order reference."},"newWorkOrderId":{"type":"string","description":"Replacement work-order reference."},"reason":{"type":"string","description":"Recorded explanation for rematching."}},"additionalProperties":{},"description":"Recorded attempt to match the invoice to a different work order."},{"type":"null"}]},"alreadyProcessed":{"anyOf":[{"type":"object","properties":{"reason":{"type":"string","description":"Recorded disposition, such as duplicate or completed_outside_mason."},"duplicateOfInvoiceId":{"anyOf":[{"type":"string","description":"Mason invoice ID of the existing invoice."},{"type":"null"}]},"explanation":{"anyOf":[{"type":"string","description":"Business explanation for this disposition."},{"type":"null"}]}},"additionalProperties":{},"description":"Recorded determination that the invoice had already been handled."},{"type":"null"}]},"duplicateResolution":{"anyOf":[{"type":"object","properties":{"action":{"type":"string","description":"Recorded decision: keep_existing, keep_incoming, or keep_both."},"existingInvoiceId":{"type":"string","description":"Mason invoice ID considered during the decision."},"explanation":{"type":"string","description":"Business explanation for the duplicate decision."}},"additionalProperties":{},"description":"Recorded resolution of a duplicate invoice."},{"type":"null"}]},"invoiceSplitSource":{"description":"Stored multi-property source-document and allocation information, when present."},"invoiceAllocationSource":{"description":"Stored source-document allocation information, when present."}},"additionalProperties":{},"description":"Stored invoice validation result describing whether the vendor, property, and work order agree. The explanation is also displayed in the invoice review UI. Optional historical processing metadata may be present."},{"type":"null"}],"description":"Stored invoice validation result describing whether the vendor, property, and work order agree. The explanation is also displayed in the invoice review UI. Optional historical processing metadata may be present."},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When the record was created in Mason, as an ISO 8601 timestamp."},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When this record was last updated, as an ISO 8601 timestamp. Changes to related records do not necessarily advance this value."}},"required":["id","invoiceNumber","invoiceDate","dueDate","totalAmount","currency","subtotal","tax","vendorInfo","billToInfo","items","workOrderNumber","internalWorkOrderId","confidence","isInvoice","additionalNotes","isRecurring","recurringDescription","matchedVendor","matchedProperty","matchedWorkOrder","emailMessageId","emailSender","emailSubject","filename","pdfBlobUrl","attachments","status","reviewed","reviewReason","pmApproved","pmApprovedAt","pmApprovedBy","pmRejected","pmRejectedAt","pmRejectionReason","pmsUploadedAt","pmsBillUrl","workDoneDescription","selectedGlAccountId","selectedTerms","selectedMarkupPercentage","selectedMarkupAccountId","selectedDiscountPercentage","shareInvoiceWithOwner","suggestedBillSplits","tenantChargeSignal","needsReview","agreementValidation","createdAt","updatedAt"],"additionalProperties":false,"description":"Stored invoices, matching results, and review/billing state. Top-level monetary amounts are integer cents. Nested document data is returned as stored and may use different representations."},"Contact":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Unique Mason record ID. Use this value in the corresponding detail endpoint."},"name":{"type":"string","description":"Contact display name."},"phoneNumber":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Recorded contact phone number."},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Recorded contact email address."},"contactType":{"type":"string","description":"Contact category, such as tenant, vendor, owner, tech, or property_manager."},"isActive":{"type":"boolean","description":"Whether the contact is marked active."},"preferredContactMethod":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Recorded preferred communication method."},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Recorded preferred language."},"pmsUniqueId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Contact identifier from the connected property management system; scoped to your account."},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When the record was created in Mason, as an ISO 8601 timestamp."},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When this record was last updated, as an ISO 8601 timestamp. Changes to related records do not necessarily advance this value."}},"required":["id","name","phoneNumber","email","contactType","isActive","preferredContactMethod","language","pmsUniqueId","createdAt","updatedAt"],"additionalProperties":false,"description":"People and businesses in your property management account. Hydrate contact references with a detail request or the id/ids filters, even when the contact predates your incremental sync window."},"ControlLog":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Unique Mason record ID. Use this value in the corresponding detail endpoint."},"logDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Date represented by this control log, serialized as an ISO 8601 timestamp."},"controlNumber":{"type":"string","description":"Legacy control-log reference. Use id for API lookups."},"location":{"type":"string","description":"Recorded location of the work."},"problem":{"type":"string","description":"Recorded description of the issue."},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Dispatch instructions for the technician."},"priority":{"type":"string","description":"Recorded visit priority, commonly urgent, normal, or low."},"finalDisposition":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Recorded disposition, commonly Complete, Still Working, Canceled, Estimate, or an empty string."},"noteReviewed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether the office has reviewed the recorded work notes; null means not recorded."},"initialRouting":{"type":"array","items":{"type":"string","description":"One routing technician name."},"description":"Legacy routing technician names. Use assignedTechs for contact identifiers."},"workNotes":{"anyOf":[{"type":"object","properties":{"hoursWorked":{"type":"number","description":"Hours recorded in these notes; not a complete per-technician labor ledger."},"comments":{"type":"string","description":"Work notes or technician comments."},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When the notes were recorded."},"notBillable":{"type":"boolean","description":"Whether these notes mark the work as not billable."}},"additionalProperties":{},"description":"Recorded work notes. Keys may be absent on older records."},{"type":"null"}],"description":"Recorded work notes. Keys may be absent on older records."},"estimate":{"anyOf":[{"type":"object","properties":{"totalAmount":{"type":"number","description":"Total quoted amount in the stored representation."},"laborItems":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string","description":"Labor description."},"cost":{"type":"number","description":"Recorded labor cost."}},"additionalProperties":{},"description":"An estimated labor item."},"description":"Estimated labor items."},"materialItems":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string","description":"Material description."},"cost":{"type":"number","description":"Recorded material cost."}},"additionalProperties":{},"description":"An estimated material item."},"description":"Estimated material items."},"notes":{"type":"string","description":"Estimate notes."},"audioUrl":{"type":"string","description":"Associated audio recording URL."},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When the estimate was recorded."}},"additionalProperties":{},"description":"Recorded visit estimate. Amounts retain their stored representation."},{"type":"null"}],"description":"Recorded visit estimate. Amounts retain their stored representation."},"activity":{"type":"array","items":{"type":"object","properties":{"event":{"type":"string","description":"Recorded event label, such as confirmed, assigned, final_disposition_set, notes_added, or printed."},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When the event was recorded."}},"additionalProperties":{},"description":"A stored control-log activity entry. Other business keys may be present."},"description":"Stored control-log activity entries; this is not a complete work-order history."},"assignedTechs":{"type":"array","items":{"type":"string","description":"Mason contact ID for an assigned technician."},"description":"Assigned technician Mason contact IDs. These are assignments, not evidence of hours worked."},"internalWorkOrderId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"Linked Mason work-order ID. Resolve it using GET /work-orders/{id}; null means no work order is linked."},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When the record was created in Mason, as an ISO 8601 timestamp."},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When this record was last updated, as an ISO 8601 timestamp. Changes to related records do not necessarily advance this value."}},"required":["id","logDate","controlNumber","location","problem","instructions","priority","finalDisposition","noteReviewed","initialRouting","workNotes","estimate","activity","assignedTechs","internalWorkOrderId","createdAt","updatedAt"],"additionalProperties":false,"description":"Maintenance visit/control-log records. Assigned technicians describe assignment, not completed labor. Nested JSON is returned as stored; changes to related records do not necessarily update this record timestamp."},"Property":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Unique Mason record ID. Use this value in the corresponding detail endpoint."},"formattedAddress":{"type":"string","description":"Formatted property address."},"address":{"type":"string","description":"First address line."},"address2":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Second address line."},"city":{"type":"string","description":"City."},"state":{"type":"string","description":"State or region."},"zip":{"type":"string","description":"Postal code."},"isActive":{"type":"boolean","description":"Whether the property is marked active."},"multiUnit":{"type":"boolean","description":"Whether the property is marked as containing multiple units."},"ownerInfo":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Owner display name."},"email":{"type":"string","description":"Owner email address."},"homePhone":{"type":"string","description":"Home phone number."},"workPhone":{"type":"string","description":"Work phone number."},"mobilePhone":{"type":"string","description":"Mobile phone number."},"otherPhone":{"type":"string","description":"Additional phone number."},"ownershipPercentage":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Ownership percentage as stored; it can be text including a percent sign."},"isPrimary":{"type":"boolean","description":"Whether this is the primary owner."}},"additionalProperties":{},"description":"Stored property owner information. Keys vary by property management system."},"description":"Stored property owner records; null means no ownership data was recorded, while an empty array contains no listed owners."},{"type":"null"}],"description":"Stored property owner records; null means no ownership data was recorded, while an empty array contains no listed owners."},"propertyDetails":{"anyOf":[{"type":"object","properties":{"market":{"type":"string","description":"Stored market label; may be absent."},"lat":{"anyOf":[{"anyOf":[{"type":"number"},{"type":"string"}]},{"type":"null"}],"description":"Stored latitude, when available."},"long":{"anyOf":[{"anyOf":[{"type":"number"},{"type":"string"}]},{"type":"null"}],"description":"Stored longitude, when available."},"originalPropertyWareEntityId":{"type":"string","description":"Original PropertyWare property identifier."},"buildingName":{"type":"string","description":"Building display name."},"buildingType":{"type":"string","description":"Building classification supplied by the provider."},"yearBuilt":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Year built as stored."},"multiUnit":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Provider representation of multi-unit status; use the top-level multiUnit boolean for the Mason value."},"propertyType":{"type":"string","description":"Provider property classification."},"parcelNumber":{"type":"string","description":"Parcel identifier."},"numberOfFloors":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Number of floors as stored."},"readyToLease":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Provider leasing-readiness value as stored."}},"additionalProperties":{},"description":"Stored property details. Available keys and their representations depend on the connected property management system; additional keys may be present."},{"type":"null"}],"description":"Stored property details. Available keys and their representations depend on the connected property management system; additional keys may be present."},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When the record was created in Mason, as an ISO 8601 timestamp."},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When this record was last updated, as an ISO 8601 timestamp. Changes to related records do not necessarily advance this value."}},"required":["id","formattedAddress","address","address2","city","state","zip","isActive","multiUnit","ownerInfo","propertyDetails","createdAt","updatedAt"],"additionalProperties":false,"description":"Properties associated with your account, including stored address, ownership, and provider details. No geocoding or owner lookup runs as part of this read."},"SchedulingBlock":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Unique Mason record ID. Use this value in the corresponding detail endpoint."},"workOrderId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"Linked Mason work-order ID. Resolve it using GET /work-orders/{id}; null means no work order is linked."},"controlLogId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"Linked Mason control-log ID; resolve using GET /control-logs/{id}."},"contactId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"Linked Mason contact ID. Resolve it using GET /contacts/{id}; null means no contact is linked."},"blockType":{"type":"string","description":"Stored scheduling category, such as tenant_available, vendor_available, tentative, confirmed, tech_scheduling_proposal, blocked, superseded, on_call_assignment, on_call_override, or on_call_cancellation."},"source":{"type":"string","description":"Stored scheduling source, such as tenant_portal, vendor_portal, pm_manual, or ai_suggested."},"tenantConfirmationStatus":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stored tenant confirmation status, commonly pending or confirmed; null means legacy or unknown."},"timezone":{"type":"string","description":"IANA timezone associated with the scheduling block, for example America/Los_Angeles."},"linkKey":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Identifier grouping blocks from one scheduling submission."},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stored scheduling notes."},"start":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}],"description":"Beginning of the stored scheduling window; null means the range is unbounded at the start."},"end":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}],"description":"End of the stored scheduling window; null means the range is unbounded at the end."},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When the record was created in Mason, as an ISO 8601 timestamp."},"expiresAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"ISO 8601 timestamp."},{"type":"null"}],"description":"Expiration timestamp, when one is recorded. Expired records are not automatically excluded by this endpoint."}},"required":["id","workOrderId","controlLogId","contactId","blockType","source","tenantConfirmationStatus","timezone","linkKey","notes","start","end","createdAt","expiresAt"],"additionalProperties":false,"description":"Stored availability and appointment blocks. blockType=confirmed identifies a confirmed work window. A confirmed block and tenantConfirmationStatus are distinct facts. Range endpoints can be null for unbounded windows."}}}}