{"success":true,"version":"v1","api_version":"v1","schema_version":"crm-property-v1","authentication":["hmac","timestamp","idempotency"],"property_events":["property.created","property.updated","property.withdrawn","property.deleted","property.archived","property.restored","property.reactivated"],"supports":{"create_update":true,"status_updates":true,"withdraw_archive_restore":true,"media":true,"documents":true,"branch_authorisation":true,"event_ordering":true},"capabilities":{"supports_create":true,"supports_update":true,"supports_delete":true,"supports_webhooks":true,"supports_media":true,"supports_documents":true,"supports_lifecycle":true,"supports_idempotency":true,"supports_hmac":true,"supports_canonical_property_schema":true,"supports_field_ownership_metadata":true,"supports_event_envelope":true,"supports_event_ordering":true,"supports_support_references":true,"max_body_bytes":1048576,"max_images":70,"max_floorplans":20,"max_documents":20},"enums":{"marketing_status":["draft","available","under_offer","sold_stc","sold","let_agreed","let","withdrawn","archived"],"status_id":["0 draft/default","1 available","2 under_offer","3 sold_stc","4 sold","5 inactive"],"trans_type_id":["1 sale","2 let","3 auction","4 commercial"],"property_types":["Residential Property","Commercial Property","land","house","flat","bungalow","maisonette","commercial","other","internal property type id"],"tenure":["Freehold","Leasehold","Share of Freehold","Commonhold","Unknown","1 Freehold","2 Leasehold"],"rent_frequency":["PCM","PW","pcm","pw","1 pcm","2 pw"],"furnishing":["Unfurnished","Furnished","Part Furnished","1 Unfurnished","2 Furnished","3 Part Furnished"],"let_type_id":["1 Long term","2 Short term"],"is_student_accommodation":["yes","no","not_specified"],"is_house_share":["yes","no","not_specified"],"pets_policy":["yes","no","not_specified"],"bills_included":["yes","no","partial","not_specified"],"document_types":["brochure_pdf","epc_pdf","media_document_00..19"],"media_types":["media_image_00..69","media_floorplan_00..19","epc_image","virtual_tour"],"departments":["sale","let","rent","auction","commercial"],"managed_mode":["CRM_MASTER","HYBRID","PORTAL_MASTER"],"lifecycle":["withdraw","delete","archive","restore","reactivate"],"providers":["generic","quardlyn"],"event_type":["property.created","property.updated","property.withdrawn","property.deleted","property.archived","property.restored","property.reactivated"]},"external_ref":{"field":"property.external_ref","max_length":191,"case_sensitive":true,"unique_scope":"authenticated_connection","allowed_characters":"printable UTF-8 except control characters and URL path separators","path_encoding":"URL encode when used in a path segment"},"event_envelope":{"required":["event_id","event_type","event_version","occurred_at","property_ref","payload"],"fields":{"event_id":"Stable unique event id from the CRM. Used for idempotency/replay.","event_type":"property.created/property.updated/property.withdrawn/property.deleted/property.archived/property.restored/property.reactivated","event_version":"Envelope version. Use v1.","occurred_at":"ISO-8601 UTC timestamp when the source event occurred.","branch_ref":"Provider branch/office reference when available.","property_ref":"Provider property reference. Also becomes property.external_ref if payload omits it.","sequence":"Monotonically increasing per-property source sequence, preferred for ordering.","source_version":"Alias for sequence when the CRM uses source versions.","source_updated_at":"Fallback ordering timestamp when no sequence is available.","payload":"Canonical CRM property object, not a second custom schema."},"legacy_body":"Existing non-envelope {property:{...}} requests remain accepted, but certified integrations should use the envelope."},"event_ordering":{"primary":"sequence/source_version must increase for each property. Older or repeated sequences are rejected as conflict/stale_event.","fallback":"If no sequence is supplied, source_updated_at/occurred_at is compared with the last accepted event timestamp.","idempotency":"Exact retries must reuse event_id or Idempotency-Key so the previous response can be replayed.","legacy_requests":"Requests without sequence or source timestamp are accepted but cannot receive stale-event protection."},"media":{"public_https_urls":"Supported by the generic downloader with SSRF, MIME and size checks.","authenticated_media":"Requires a provider adapter/authenticated media fetcher. Do not place long-lived secrets in media URLs.","recommended_push_model":"Provide public short-lived HTTPS URLs or use an agreed provider-specific media fetch method.","max_image_count":70,"max_floorplan_count":20,"max_document_count":20,"max_file_bytes":26214400},"errors":{"shape":{"success":false,"error":["code","message","details","request_id","support_reference","retryable"]},"codes":["unauthorized","forbidden","not_found","method_not_allowed","validation_failed","duplicate_request","already_processing","rate_limited","payload_too_large","conflict","internal_error"],"safe_messages_only":true,"no_internal_diagnostics":["tokens","passwords","raw signatures","stack traces","SQL","filesystem paths"]}}