{
    "openapi": "3.1.0",
    "info": {
        "title": "Cashio API",
        "version": "1.0.0",
        "description": "Forward the visitor's IP in `X-Forwarded-For` on every call: rate limits and Turnstile use it. Limits per visitor IP: 10 new drafts and 5 submit attempts a minute, 60 requests a minute overall. Over a limit the API returns 429 with a `Retry-After` header."
    },
    "servers": [
        {
            "url": "/api"
        }
    ],
    "tags": [
        {
            "name": "Sell wizard"
        },
        {
            "name": "Short forms"
        },
        {
            "name": "Agent referrals"
        },
        {
            "name": "Site content"
        },
        {
            "name": "Area pages"
        },
        {
            "name": "Address lookup"
        }
    ],
    "security": [
        {
            "sharedSecret": []
        }
    ],
    "paths": {
        "/v1/address/find": {
            "post": {
                "operationId": "address.find",
                "description": "Suggestions for what the seller has typed. A suggestion with `is_address: false` is a group\n(e.g. a postcode): call Find again with its id as `container` to list the addresses in it.",
                "summary": "Find addresses",
                "tags": [
                    "Address lookup"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/FindAddressRequest"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Array of `AddressSuggestionResource`",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/AddressSuggestionResource"
                                            }
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationException"
                    },
                    "503": {
                        "description": "Address lookup is unavailable: show the manual address fields.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "message": {
                                            "type": "string"
                                        },
                                        "manual_entry": {
                                            "type": "boolean"
                                        }
                                    },
                                    "required": [
                                        "message",
                                        "manual_entry"
                                    ]
                                }
                            }
                        }
                    }
                }
            }
        },
        "/v1/address/retrieve": {
            "get": {
                "operationId": "address.retrieve",
                "description": "The full address for a suggestion with `is_address: true`, in wizard step 1's field names.",
                "summary": "Retrieve an address",
                "tags": [
                    "Address lookup"
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "query",
                        "required": true,
                        "description": "The id of a suggestion whose is_address is true. An opaque Loqate id, not personal data.",
                        "schema": {
                            "type": "string",
                            "pattern": "^[A-Za-z0-9|_\\-.]+$",
                            "maxLength": 255
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "`UkAddressResource`",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/UkAddressResource"
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationException"
                    },
                    "503": {
                        "description": "Address lookup is unavailable: show the manual address fields.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "message": {
                                            "type": "string"
                                        },
                                        "manual_entry": {
                                            "type": "boolean"
                                        }
                                    },
                                    "required": [
                                        "message",
                                        "manual_entry"
                                    ]
                                }
                            }
                        }
                    }
                }
            }
        },
        "/v1/referrals": {
            "post": {
                "operationId": "referral.store",
                "description": "An estate agent refers a vendor for a direct sale or a chain rescue. The agent must confirm\n(`vendor_consent`) that the vendor agreed to their details being shared. The agent is\nmatched by email, and gets an acknowledgement email. The vendor is not emailed or texted.",
                "summary": "Refer a vendor",
                "tags": [
                    "Agent referrals"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ReferralRequest"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "`EnquiryReceiptResource`",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/EnquiryReceiptResource"
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationException"
                    }
                }
            }
        },
        "/v1/areas": {
            "get": {
                "operationId": "area.index",
                "description": "Ordered by name. Use the slugs to build the area pages.",
                "summary": "List published areas",
                "tags": [
                    "Area pages"
                ],
                "responses": {
                    "200": {
                        "description": "Array of `AreaSummaryResource`",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/AreaSummaryResource"
                                            }
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    }
                }
            }
        },
        "/v1/areas/{slug}": {
            "get": {
                "operationId": "area.show",
                "description": "404 for a draft or an unknown slug.",
                "summary": "Get a published area",
                "tags": [
                    "Area pages"
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "`AreaPageResource`",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/AreaPageResource"
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    }
                }
            }
        },
        "/v1/drafts": {
            "post": {
                "operationId": "draft.store",
                "description": "Returns the draft id and a token that is shown only once.",
                "summary": "Start a draft",
                "tags": [
                    "Sell wizard"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/StoreDraftRequest"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "`DraftCreatedResource`",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/DraftCreatedResource"
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationException"
                    }
                }
            }
        },
        "/v1/drafts/{draft}/steps/1": {
            "patch": {
                "operationId": "draft.address",
                "summary": "Save step 1: address",
                "tags": [
                    "Sell wizard"
                ],
                "parameters": [
                    {
                        "name": "draft",
                        "in": "path",
                        "required": true,
                        "description": "The draft ID",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "X-Draft-Token",
                        "in": "header",
                        "required": true,
                        "description": "Token returned when the draft was created.",
                        "schema": {}
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/DraftAddressStepRequest"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "`DraftResource`",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/DraftResource"
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/ModelNotFoundException"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationException"
                    }
                }
            }
        },
        "/v1/drafts/{draft}/steps/2": {
            "patch": {
                "operationId": "draft.property",
                "summary": "Save step 2: property",
                "tags": [
                    "Sell wizard"
                ],
                "parameters": [
                    {
                        "name": "draft",
                        "in": "path",
                        "required": true,
                        "description": "The draft ID",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "X-Draft-Token",
                        "in": "header",
                        "required": true,
                        "description": "Token returned when the draft was created.",
                        "schema": {}
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/DraftPropertyStepRequest"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "`DraftResource`",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/DraftResource"
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/ModelNotFoundException"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationException"
                    }
                }
            }
        },
        "/v1/drafts/{draft}/steps/3": {
            "patch": {
                "operationId": "draft.situation",
                "summary": "Save step 3: situation",
                "tags": [
                    "Sell wizard"
                ],
                "parameters": [
                    {
                        "name": "draft",
                        "in": "path",
                        "required": true,
                        "description": "The draft ID",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "X-Draft-Token",
                        "in": "header",
                        "required": true,
                        "description": "Token returned when the draft was created.",
                        "schema": {}
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/DraftSituationStepRequest"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "`DraftResource`",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/DraftResource"
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/ModelNotFoundException"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationException"
                    }
                }
            }
        },
        "/v1/drafts/{draft}/steps/4": {
            "patch": {
                "operationId": "draft.contact",
                "summary": "Save step 4: contact details",
                "tags": [
                    "Sell wizard"
                ],
                "parameters": [
                    {
                        "name": "draft",
                        "in": "path",
                        "required": true,
                        "description": "The draft ID",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "X-Draft-Token",
                        "in": "header",
                        "required": true,
                        "description": "Token returned when the draft was created.",
                        "schema": {}
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/DraftContactStepRequest"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "`DraftResource`",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/DraftResource"
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/ModelNotFoundException"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationException"
                    }
                }
            }
        },
        "/v1/drafts/{draft}/submit": {
            "post": {
                "operationId": "draft.submit",
                "description": "Creates the enquiry, deletes the draft and returns the enquiry reference.",
                "summary": "Submit the draft",
                "tags": [
                    "Sell wizard"
                ],
                "parameters": [
                    {
                        "name": "draft",
                        "in": "path",
                        "required": true,
                        "description": "The draft ID",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "X-Draft-Token",
                        "in": "header",
                        "required": true,
                        "description": "Token returned when the draft was created.",
                        "schema": {}
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/SubmitDraftRequest"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "`EnquiryReceiptResource`",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/EnquiryReceiptResource"
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/ModelNotFoundException"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationException"
                    }
                }
            }
        },
        "/v1/enquiries/callback": {
            "post": {
                "operationId": "enquiryForm.callback",
                "summary": "Request a callback",
                "tags": [
                    "Short forms"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/CallbackRequest"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "`EnquiryReceiptResource`",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/EnquiryReceiptResource"
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationException"
                    }
                }
            }
        },
        "/v1/enquiries/contact": {
            "post": {
                "operationId": "enquiryForm.contact",
                "summary": "Send a contact form message",
                "tags": [
                    "Short forms"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ContactRequest"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "`EnquiryReceiptResource`",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/EnquiryReceiptResource"
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationException"
                    }
                }
            }
        },
        "/v1/enquiries/chain-rescue": {
            "post": {
                "operationId": "enquiryForm.chainRescue",
                "summary": "Ask for help with a broken chain",
                "tags": [
                    "Short forms"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ChainRescueRequest"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "`EnquiryReceiptResource`",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/EnquiryReceiptResource"
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationException"
                    }
                }
            }
        },
        "/v1/content/settings": {
            "get": {
                "operationId": "content.settings",
                "description": "Contact details, company line, social links, the main button label and link, and the\nshared words on situation pages. 404 until first published.",
                "summary": "Site settings",
                "tags": [
                    "Site content"
                ],
                "responses": {
                    "200": {
                        "description": "",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "phone": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "email": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "registered_office": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "company_number": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "footer_note": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "social_links": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "network": {
                                                                "type": "string"
                                                            },
                                                            "url": {
                                                                "type": "string"
                                                            }
                                                        },
                                                        "required": [
                                                            "network",
                                                            "url"
                                                        ]
                                                    }
                                                },
                                                "primary_cta_label": {
                                                    "type": "string"
                                                },
                                                "primary_cta_link": {
                                                    "type": "string"
                                                },
                                                "situation_labels": {
                                                    "type": "object",
                                                    "properties": {
                                                        "eyebrow": {
                                                            "type": "string"
                                                        },
                                                        "look_at_heading": {
                                                            "type": "string"
                                                        },
                                                        "cta_label": {
                                                            "type": "string"
                                                        },
                                                        "reassurance": {
                                                            "type": "string"
                                                        }
                                                    },
                                                    "required": [
                                                        "eyebrow",
                                                        "look_at_heading",
                                                        "cta_label",
                                                        "reassurance"
                                                    ]
                                                }
                                            },
                                            "required": [
                                                "phone",
                                                "email",
                                                "registered_office",
                                                "company_number",
                                                "footer_note",
                                                "social_links",
                                                "primary_cta_label",
                                                "primary_cta_link",
                                                "situation_labels"
                                            ]
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/ModelNotFoundException"
                    }
                }
            }
        },
        "/v1/content/pages/{slug}": {
            "get": {
                "operationId": "content.page",
                "description": "Meta fields plus the visible sections in order. Each section is `{type, data}`, where\n`type` is a `SectionType` and `data` holds that type's fields. Images are absolute URLs;\nevery markdown field also comes as sanitised HTML in `<field>_html`. 404 until the page is\nfirst published.",
                "summary": "Get a page",
                "tags": [
                    "Site content"
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "path": {
                                                    "type": "string"
                                                },
                                                "meta_title": {
                                                    "type": "string"
                                                },
                                                "meta_description": {
                                                    "type": "string"
                                                },
                                                "og_image": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "og_image_alt": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "published_at": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "sections": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "type": {
                                                                "type": "string"
                                                            },
                                                            "data": {
                                                                "type": "object",
                                                                "additionalProperties": {}
                                                            }
                                                        },
                                                        "required": [
                                                            "type",
                                                            "data"
                                                        ]
                                                    }
                                                }
                                            },
                                            "required": [
                                                "slug",
                                                "path",
                                                "meta_title",
                                                "meta_description",
                                                "og_image",
                                                "og_image_alt",
                                                "published_at",
                                                "sections"
                                            ]
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/ModelNotFoundException"
                    }
                }
            }
        },
        "/v1/content/pages/{slug}/preview": {
            "get": {
                "operationId": "content.preview",
                "description": "The unpublished working copy (or stored version `version`), shaped exactly like the live\npage. Needs the signed `token` from the CRM's Preview button, valid for 15 minutes for this\nslug and version only; anything else is 403. Never cached.",
                "summary": "Preview a page draft",
                "tags": [
                    "Site content"
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "version",
                        "in": "query",
                        "description": "A stored version number from the versions panel; leave out for the current draft.",
                        "schema": {
                            "type": [
                                "integer",
                                "null"
                            ],
                            "minimum": 1
                        }
                    },
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "description": "The signed preview token from the CRM.",
                        "schema": {
                            "type": "string",
                            "maxLength": 500
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "path": {
                                                    "type": "string"
                                                },
                                                "meta_title": {
                                                    "type": "string"
                                                },
                                                "meta_description": {
                                                    "type": "string"
                                                },
                                                "og_image": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "og_image_alt": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "published_at": {
                                                    "type": "null"
                                                },
                                                "sections": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "type": {
                                                                "type": "string"
                                                            },
                                                            "data": {
                                                                "type": "object",
                                                                "additionalProperties": {}
                                                            }
                                                        },
                                                        "required": [
                                                            "type",
                                                            "data"
                                                        ]
                                                    }
                                                }
                                            },
                                            "required": [
                                                "slug",
                                                "path",
                                                "meta_title",
                                                "meta_description",
                                                "og_image",
                                                "og_image_alt",
                                                "published_at",
                                                "sections"
                                            ]
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationException"
                    },
                    "403": {
                        "$ref": "#/components/responses/AuthorizationException"
                    }
                }
            }
        },
        "/v1/content/situations": {
            "get": {
                "operationId": "content.situations",
                "description": "Published situations in display order, with everything their pages need.",
                "summary": "List situations",
                "tags": [
                    "Site content"
                ],
                "responses": {
                    "200": {
                        "description": "",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "slug": {
                                                        "type": "string"
                                                    },
                                                    "reason_for_sale": {
                                                        "type": "string"
                                                    },
                                                    "title": {
                                                        "type": "string"
                                                    },
                                                    "heading": {
                                                        "type": "string"
                                                    },
                                                    "intro": {
                                                        "type": "string"
                                                    },
                                                    "bullets": {
                                                        "type": "array",
                                                        "items": {
                                                            "type": "string"
                                                        }
                                                    },
                                                    "meta_title": {
                                                        "type": "string"
                                                    },
                                                    "meta_description": {
                                                        "type": "string"
                                                    },
                                                    "path": {
                                                        "type": "string"
                                                    }
                                                },
                                                "required": [
                                                    "slug",
                                                    "reason_for_sale",
                                                    "title",
                                                    "heading",
                                                    "intro",
                                                    "bullets",
                                                    "meta_title",
                                                    "meta_description",
                                                    "path"
                                                ]
                                            }
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    }
                }
            }
        },
        "/v1/content/faqs": {
            "get": {
                "operationId": "content.faqs",
                "description": "Published FAQs in display order. `page` is the slug of the page they belong to, or null\nfor site-wide ones. Markdown answers also come as sanitised HTML in `answer_html`.",
                "summary": "List FAQs",
                "tags": [
                    "Site content"
                ],
                "responses": {
                    "200": {
                        "description": "",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "question": {
                                                        "type": "string"
                                                    },
                                                    "answer": {
                                                        "type": "string"
                                                    },
                                                    "answer_html": {
                                                        "type": "string"
                                                    },
                                                    "page": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    }
                                                },
                                                "required": [
                                                    "question",
                                                    "answer",
                                                    "answer_html",
                                                    "page"
                                                ]
                                            }
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    }
                }
            }
        },
        "/v1/content/banner": {
            "get": {
                "operationId": "banner.show",
                "description": "The published copy, alt text, focal point and every image variant with its pixel size as an\nabsolute URL. `cta_link` is fixed by the API. 404 until first published.",
                "summary": "Homepage banner",
                "tags": [
                    "Site content"
                ],
                "responses": {
                    "200": {
                        "description": "",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "string"
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/ModelNotFoundException"
                    }
                }
            }
        },
        "/v1/content/banner/preview": {
            "get": {
                "operationId": "banner.preview",
                "description": "The unpublished draft, shaped exactly like the live banner (`published_at` null). Needs the\nsigned `token` the CRM issues for the home page preview, valid for 15 minutes; anything else\nis 403. Never cached.",
                "summary": "Preview the banner draft",
                "tags": [
                    "Site content"
                ],
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "description": "The signed preview token from the CRM.",
                        "schema": {
                            "type": "string",
                            "maxLength": 500
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "`BannerResource`",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/BannerResource"
                                        }
                                    },
                                    "required": [
                                        "data"
                                    ]
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/ModelNotFoundException"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationException"
                    },
                    "403": {
                        "$ref": "#/components/responses/AuthorizationException"
                    }
                }
            }
        }
    },
    "components": {
        "securitySchemes": {
            "sharedSecret": {
                "type": "apiKey",
                "description": "Shared secret between the Cashio website and this API. Server-to-server only; never expose it to browsers.",
                "in": "header",
                "name": "X-Cashio-Secret"
            }
        },
        "schemas": {
            "AddressSuggestionResource": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "Pass to Retrieve when is_address is true, or back to Find as container when it is false."
                    },
                    "type": {
                        "type": "string",
                        "description": "Loqate's type, e.g. \"Address\", \"Postcode\", \"Street\"."
                    },
                    "text": {
                        "type": "string",
                        "description": "e.g. \"10 Downing Street\""
                    },
                    "description": {
                        "type": "string",
                        "description": "e.g. \"London, SW1A 2AA\" or \"12 Addresses\""
                    },
                    "is_address": {
                        "type": "boolean",
                        "description": "True: a single address. False: a group to search inside."
                    }
                },
                "required": [
                    "id",
                    "type",
                    "text",
                    "description",
                    "is_address"
                ],
                "title": "AddressSuggestionResource"
            },
            "AddresseeCapacity": {
                "type": "string",
                "description": "In what capacity the addressee of an offer letter is selling, which shapes the address block.\n",
                "enum": [
                    "owner",
                    "joint_owners",
                    "executor_or_administrator",
                    "attorney",
                    "other"
                ],
                "x-enum-varnames": [
                    "Owner",
                    "JointOwners",
                    "ExecutorOrAdministrator",
                    "Attorney",
                    "Other"
                ],
                "x-enum-descriptions": [
                    "Owner",
                    "Joint owners",
                    "Executor or administrator",
                    "Attorney",
                    "Other"
                ],
                "title": "AddresseeCapacity"
            },
            "AreaPageResource": {
                "type": "object",
                "properties": {
                    "slug": {
                        "type": "string",
                        "description": "e.g. \"leeds\""
                    },
                    "name": {
                        "type": "string",
                        "description": "e.g. \"Leeds\""
                    },
                    "region": {
                        "type": "string",
                        "description": "e.g. \"Yorkshire\""
                    },
                    "postcode_prefixes": {
                        "type": "array",
                        "description": "Postcode areas or districts the page covers, e.g. [\"LS1\", \"LS2\"].",
                        "items": {
                            "type": "string"
                        }
                    },
                    "updated_at": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "intro": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "The intro as written in the CRM (markdown)."
                    },
                    "intro_html": {
                        "type": "string",
                        "description": "The intro rendered to HTML, with raw HTML and unsafe links removed."
                    }
                },
                "required": [
                    "slug",
                    "name",
                    "region",
                    "postcode_prefixes",
                    "updated_at",
                    "intro",
                    "intro_html"
                ],
                "title": "AreaPageResource"
            },
            "AreaSummaryResource": {
                "type": "object",
                "properties": {
                    "slug": {
                        "type": "string",
                        "description": "e.g. \"leeds\""
                    },
                    "name": {
                        "type": "string",
                        "description": "e.g. \"Leeds\""
                    },
                    "region": {
                        "type": "string",
                        "description": "e.g. \"Yorkshire\""
                    },
                    "postcode_prefixes": {
                        "type": "array",
                        "description": "Postcode areas or districts the page covers, e.g. [\"LS1\", \"LS2\"].",
                        "items": {
                            "type": "string"
                        }
                    },
                    "updated_at": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                },
                "required": [
                    "slug",
                    "name",
                    "region",
                    "postcode_prefixes",
                    "updated_at"
                ],
                "title": "AreaSummaryResource"
            },
            "BannerResource": {
                "type": "object",
                "properties": {
                    "eyebrow": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "heading": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "subheading": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "cta_label": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "cta_link": {
                        "type": "string",
                        "description": "Fixed by the API, e.g. /tell-us"
                    },
                    "reassurance": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "image_alt": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "focal": {
                        "type": "object",
                        "description": "Which part of the photo stays in view, as a percentage from the left and the top.",
                        "properties": {
                            "x": {
                                "type": "integer"
                            },
                            "y": {
                                "type": "integer"
                            }
                        },
                        "required": [
                            "x",
                            "y"
                        ]
                    },
                    "desktop": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "ratio": {
                                "type": "string"
                            },
                            "width": {
                                "type": "integer"
                            },
                            "height": {
                                "type": "integer"
                            },
                            "sources": {
                                "type": "array",
                                "items": {}
                            }
                        },
                        "required": [
                            "ratio",
                            "width",
                            "height",
                            "sources"
                        ]
                    },
                    "mobile": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "description": "Null when no mobile photo is set: crop the desktop photo around the focal point.",
                        "properties": {
                            "ratio": {
                                "type": "string"
                            },
                            "width": {
                                "type": "integer"
                            },
                            "height": {
                                "type": "integer"
                            },
                            "sources": {
                                "type": "array",
                                "items": {}
                            }
                        },
                        "required": [
                            "ratio",
                            "width",
                            "height",
                            "sources"
                        ]
                    },
                    "published_at": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                },
                "required": [
                    "eyebrow",
                    "heading",
                    "subheading",
                    "cta_label",
                    "cta_link",
                    "reassurance",
                    "image_alt",
                    "focal",
                    "desktop",
                    "mobile",
                    "published_at"
                ],
                "title": "BannerResource"
            },
            "BannerStatus": {
                "type": "string",
                "description": "A homepage banner row: the one draft being edited, the one version that is live, or a past version kept for Restore.\n",
                "enum": [
                    "draft",
                    "published",
                    "archived"
                ],
                "x-enum-varnames": [
                    "Draft",
                    "Published",
                    "Archived"
                ],
                "x-enum-descriptions": [
                    "Draft",
                    "Live",
                    "Archived"
                ],
                "title": "BannerStatus"
            },
            "CallbackRequest": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string",
                        "maxLength": 255
                    },
                    "phone": {
                        "type": "string"
                    },
                    "postcode": {
                        "type": "string"
                    },
                    "best_time_to_call": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 64
                    },
                    "consent_accepted": {
                        "enum": [
                            "yes",
                            "on",
                            "1",
                            1,
                            "true",
                            true
                        ]
                    },
                    "consent_version": {
                        "type": "string",
                        "enum": [
                            "2026-10"
                        ]
                    },
                    "marketing_opt_in": {
                        "type": "boolean"
                    },
                    "turnstile_token": {
                        "type": "string"
                    }
                },
                "required": [
                    "name",
                    "phone",
                    "postcode",
                    "consent_version",
                    "turnstile_token"
                ],
                "title": "CallbackRequest"
            },
            "ChainRescueRequest": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string",
                        "maxLength": 255
                    },
                    "phone": {
                        "type": "string"
                    },
                    "email": {
                        "type": "string",
                        "format": "email",
                        "maxLength": 255
                    },
                    "postcode": {
                        "type": "string"
                    },
                    "sale_stage": {
                        "$ref": "#/components/schemas/SaleStage"
                    },
                    "message": {
                        "type": "string",
                        "description": "What went wrong with the sale.",
                        "maxLength": 2000
                    },
                    "consent_accepted": {
                        "enum": [
                            "yes",
                            "on",
                            "1",
                            1,
                            "true",
                            true
                        ]
                    },
                    "consent_version": {
                        "type": "string",
                        "enum": [
                            "2026-10"
                        ]
                    },
                    "marketing_opt_in": {
                        "type": "boolean"
                    },
                    "turnstile_token": {
                        "type": "string"
                    }
                },
                "required": [
                    "name",
                    "phone",
                    "email",
                    "postcode",
                    "sale_stage",
                    "message",
                    "consent_version",
                    "turnstile_token"
                ],
                "title": "ChainRescueRequest"
            },
            "ContactEnquiryType": {
                "type": "string",
                "description": "What a contact form message is about.\n",
                "enum": [
                    "selling",
                    "buying_partnership",
                    "general",
                    "complaint",
                    "other"
                ],
                "x-enum-varnames": [
                    "Selling",
                    "BuyingPartnership",
                    "General",
                    "Complaint",
                    "Other"
                ],
                "x-enum-descriptions": [
                    "Selling a property",
                    "Partnership or referral",
                    "General question",
                    "Complaint",
                    "Other"
                ],
                "title": "ContactEnquiryType"
            },
            "ContactRequest": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string",
                        "maxLength": 255
                    },
                    "email": {
                        "type": "string",
                        "format": "email",
                        "maxLength": 255
                    },
                    "phone": {
                        "type": "string"
                    },
                    "enquiry_type": {
                        "$ref": "#/components/schemas/ContactEnquiryType"
                    },
                    "message": {
                        "type": "string",
                        "maxLength": 2000
                    },
                    "consent_accepted": {
                        "enum": [
                            "yes",
                            "on",
                            "1",
                            1,
                            "true",
                            true
                        ]
                    },
                    "consent_version": {
                        "type": "string",
                        "enum": [
                            "2026-10"
                        ]
                    },
                    "marketing_opt_in": {
                        "type": "boolean"
                    },
                    "turnstile_token": {
                        "type": "string"
                    }
                },
                "required": [
                    "name",
                    "email",
                    "phone",
                    "enquiry_type",
                    "message",
                    "consent_version",
                    "turnstile_token"
                ],
                "title": "ContactRequest"
            },
            "DocumentCategory": {
                "type": "string",
                "description": "What an enquiry document is. id_document is sensitive: seeing it needs documents.view_sensitive.\n",
                "enum": [
                    "photo",
                    "epc",
                    "title_register",
                    "survey",
                    "offer_pdf",
                    "id_document",
                    "correspondence",
                    "other"
                ],
                "x-enum-varnames": [
                    "Photo",
                    "Epc",
                    "TitleRegister",
                    "Survey",
                    "OfferPdf",
                    "IdDocument",
                    "Correspondence",
                    "Other"
                ],
                "x-enum-descriptions": [
                    "Photo",
                    "EPC",
                    "Title register",
                    "Survey",
                    "Offer PDF",
                    "ID document",
                    "Correspondence",
                    "Other"
                ],
                "title": "DocumentCategory"
            },
            "DraftAddressStepRequest": {
                "type": "object",
                "description": "Wizard step 1: the property's address, plus an optional phone number so an abandoned draft can be followed up.",
                "properties": {
                    "postcode": {
                        "type": "string"
                    },
                    "address_line_1": {
                        "type": "string",
                        "maxLength": 255
                    },
                    "address_line_2": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 255
                    },
                    "town": {
                        "type": "string",
                        "maxLength": 255
                    },
                    "county": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 255
                    },
                    "uprn": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{1,12}$"
                    },
                    "callback_phone": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "callback_consent": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "description": "Must be accepted when callback_phone is given."
                    }
                },
                "required": [
                    "postcode",
                    "address_line_1",
                    "town"
                ],
                "title": "DraftAddressStepRequest"
            },
            "DraftContactStepRequest": {
                "type": "object",
                "description": "Wizard step 4: the seller's contact details.",
                "properties": {
                    "seller_name": {
                        "type": "string",
                        "maxLength": 255
                    },
                    "seller_phone": {
                        "type": "string"
                    },
                    "seller_email": {
                        "type": "string",
                        "format": "email",
                        "maxLength": 255
                    },
                    "best_time_to_call": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 64
                    },
                    "is_legal_owner": {
                        "type": "boolean"
                    }
                },
                "required": [
                    "seller_name",
                    "seller_phone",
                    "seller_email",
                    "is_legal_owner"
                ],
                "title": "DraftContactStepRequest"
            },
            "DraftCreatedResource": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string"
                    },
                    "token": {
                        "type": "string",
                        "description": "Shown once. Send as the X-Draft-Token header on every later call for this draft."
                    },
                    "step": {
                        "type": "integer"
                    },
                    "expires_at": {
                        "type": "string"
                    }
                },
                "required": [
                    "id",
                    "token",
                    "step",
                    "expires_at"
                ],
                "title": "DraftCreatedResource"
            },
            "DraftPropertyStepRequest": {
                "type": "object",
                "description": "Wizard step 2: the property.",
                "properties": {
                    "property_class": {
                        "$ref": "#/components/schemas/PropertyClass"
                    },
                    "property_type": {
                        "type": "string",
                        "maxLength": 64
                    },
                    "tenure": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 64
                    },
                    "bedrooms": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 20
                    },
                    "bathrooms": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "minimum": 0,
                        "maximum": 20
                    },
                    "approx_age": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 64
                    },
                    "condition": {
                        "$ref": "#/components/schemas/PropertyCondition"
                    },
                    "occupancy": {
                        "$ref": "#/components/schemas/Occupancy"
                    }
                },
                "required": [
                    "property_class",
                    "property_type",
                    "bedrooms",
                    "condition",
                    "occupancy"
                ],
                "title": "DraftPropertyStepRequest"
            },
            "DraftResource": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string"
                    },
                    "step": {
                        "type": "integer",
                        "description": "The furthest wizard step saved so far (0 when none)."
                    },
                    "expires_at": {
                        "type": "string"
                    }
                },
                "required": [
                    "id",
                    "step",
                    "expires_at"
                ],
                "title": "DraftResource"
            },
            "DraftSituationStepRequest": {
                "type": "object",
                "description": "Wizard step 3: why and when the seller wants to sell. Money is integer pence.",
                "properties": {
                    "route": {
                        "$ref": "#/components/schemas/EnquiryRoute"
                    },
                    "reason_for_sale": {
                        "$ref": "#/components/schemas/ReasonForSale"
                    },
                    "timeframe": {
                        "$ref": "#/components/schemas/Timeframe"
                    },
                    "is_listed": {
                        "type": "boolean"
                    },
                    "asking_price": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "minimum": 0,
                        "maximum": 10000000000
                    },
                    "mortgage_outstanding": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "minimum": 0,
                        "maximum": 10000000000
                    },
                    "seller_estimate": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "minimum": 0,
                        "maximum": 10000000000
                    }
                },
                "required": [
                    "route",
                    "reason_for_sale",
                    "timeframe",
                    "is_listed"
                ],
                "title": "DraftSituationStepRequest"
            },
            "EnquiryEventType": {
                "type": "string",
                "description": "Kind of entry on an enquiry's timeline.\n",
                "enum": [
                    "note",
                    "call",
                    "email",
                    "sms",
                    "status_change",
                    "assignment",
                    "offer",
                    "document"
                ],
                "x-enum-varnames": [
                    "Note",
                    "Call",
                    "Email",
                    "Sms",
                    "StatusChange",
                    "Assignment",
                    "Offer",
                    "Document"
                ],
                "x-enum-descriptions": [
                    "Note",
                    "Call",
                    "Email",
                    "SMS",
                    "Status change",
                    "Assignment",
                    "Offer",
                    "Document"
                ],
                "title": "EnquiryEventType"
            },
            "EnquiryReceiptResource": {
                "type": "object",
                "properties": {
                    "reference": {
                        "type": "string",
                        "description": "e.g. CSH-7KQ2MX"
                    }
                },
                "required": [
                    "reference"
                ],
                "title": "EnquiryReceiptResource"
            },
            "EnquiryRoute": {
                "type": "string",
                "description": "How we intend to buy or help with the property.\n",
                "enum": [
                    "direct",
                    "share",
                    "chain_rescue",
                    "valuation_only"
                ],
                "x-enum-varnames": [
                    "Direct",
                    "Share",
                    "ChainRescue",
                    "ValuationOnly"
                ],
                "x-enum-descriptions": [
                    "Direct purchase",
                    "Share",
                    "Chain rescue",
                    "Valuation only"
                ],
                "title": "EnquiryRoute"
            },
            "EnquirySource": {
                "type": "string",
                "description": "Which web form the enquiry came from.\n",
                "enum": [
                    "wizard",
                    "callback",
                    "chain_rescue_form",
                    "area_form",
                    "contact_form",
                    "wizard_abandoned",
                    "referral"
                ],
                "x-enum-varnames": [
                    "Wizard",
                    "Callback",
                    "ChainRescueForm",
                    "AreaForm",
                    "ContactForm",
                    "WizardAbandoned",
                    "Referral"
                ],
                "x-enum-descriptions": [
                    "Sell-my-home wizard",
                    "Callback request",
                    "Chain rescue form",
                    "Area page form",
                    "Contact form",
                    "Abandoned wizard (called)",
                    "Agent referral"
                ],
                "title": "EnquirySource"
            },
            "EnquiryStatus": {
                "type": "string",
                "description": "Where an enquiry is in the buying pipeline.\n",
                "enum": [
                    "new",
                    "contacted",
                    "survey_booked",
                    "valued",
                    "offer_made",
                    "accepted",
                    "legal",
                    "completed",
                    "declined",
                    "withdrawn",
                    "not_proceeding"
                ],
                "x-enum-varnames": [
                    "New",
                    "Contacted",
                    "SurveyBooked",
                    "Valued",
                    "OfferMade",
                    "Accepted",
                    "Legal",
                    "Completed",
                    "Declined",
                    "Withdrawn",
                    "NotProceeding"
                ],
                "x-enum-descriptions": [
                    "New",
                    "Contacted",
                    "Survey booked",
                    "Valued",
                    "Offer made",
                    "Accepted",
                    "With solicitors",
                    "Completed",
                    "Declined",
                    "Withdrawn",
                    "Not proceeding"
                ],
                "title": "EnquiryStatus"
            },
            "FindAddressRequest": {
                "type": "object",
                "description": "Sent as a JSON body, not a query string: what the seller types is part of their address and\nmust not end up in URLs or access logs.",
                "properties": {
                    "text": {
                        "type": "string",
                        "description": "What the seller has typed so far, e.g. \"10 Downing\" or \"SW1A 2\".",
                        "minLength": 2,
                        "maxLength": 100
                    },
                    "container": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "The id of a suggestion whose is_address is false, to list the addresses inside it.",
                        "maxLength": 255
                    }
                },
                "required": [
                    "text"
                ],
                "title": "FindAddressRequest"
            },
            "LegalFeesCover": {
                "type": "string",
                "description": "How much of the seller's legal fees Cashio pays on an offer.\n",
                "enum": [
                    "none",
                    "full",
                    "capped"
                ],
                "x-enum-varnames": [
                    "None",
                    "Full",
                    "Capped"
                ],
                "x-enum-descriptions": [
                    "Seller pays their own",
                    "We pay in full",
                    "We pay up to a cap"
                ],
                "title": "LegalFeesCover"
            },
            "LetterSignatoryMode": {
                "type": "string",
                "description": "Who signs offer letters (Company & offer settings).\n",
                "enum": [
                    "assigned_manager",
                    "named_director",
                    "both"
                ],
                "x-enum-varnames": [
                    "AssignedManager",
                    "NamedDirector",
                    "Both"
                ],
                "x-enum-descriptions": [
                    "The assigned manager",
                    "A named director",
                    "Both"
                ],
                "title": "LetterSignatoryMode"
            },
            "Occupancy": {
                "type": "string",
                "description": "Who currently occupies the property.\n",
                "enum": [
                    "owner",
                    "tenanted",
                    "empty",
                    "probate"
                ],
                "x-enum-varnames": [
                    "Owner",
                    "Tenanted",
                    "Empty",
                    "Probate"
                ],
                "x-enum-descriptions": [
                    "Owner-occupied",
                    "Tenanted",
                    "Empty",
                    "In probate"
                ],
                "title": "Occupancy"
            },
            "OfferStatus": {
                "type": "string",
                "description": "Lifecycle of an offer made to a seller.\n| |\n|---|\n| `draft` <br/>  |\n| `sent` <br/>  |\n| `accepted` <br/>  |\n| `declined` <br/>  |\n| `expired` <br/>  |\n| `superseded` <br/> Replaced by a revised offer; its letter stays on file. |",
                "enum": [
                    "draft",
                    "sent",
                    "accepted",
                    "declined",
                    "expired",
                    "superseded"
                ],
                "x-enum-varnames": [
                    "Draft",
                    "Sent",
                    "Accepted",
                    "Declined",
                    "Expired",
                    "Superseded"
                ],
                "x-enum-descriptions": [
                    "Draft",
                    "Sent",
                    "Accepted",
                    "Declined",
                    "Expired",
                    "Superseded"
                ],
                "title": "OfferStatus"
            },
            "PageStatus": {
                "type": "string",
                "description": "Whether a site page has ever been published. A published page can still have unpublished changes in its working copy.\n",
                "enum": [
                    "draft",
                    "published"
                ],
                "x-enum-varnames": [
                    "Draft",
                    "Published"
                ],
                "x-enum-descriptions": [
                    "Draft",
                    "Published"
                ],
                "title": "PageStatus"
            },
            "Possession": {
                "type": "string",
                "description": "What the buyer gets on completion: an empty property, or one with tenants in place.\n",
                "enum": [
                    "vacant",
                    "with_tenants"
                ],
                "x-enum-varnames": [
                    "Vacant",
                    "WithTenants"
                ],
                "x-enum-descriptions": [
                    "Vacant possession",
                    "With tenants in place"
                ],
                "title": "Possession"
            },
            "ProbateStatus": {
                "type": "string",
                "description": "For a sale by executors or administrators: whether the grant of probate (or letters of administration) is in hand. Decides the probate line of the letter.\n",
                "enum": [
                    "not_applicable",
                    "granted",
                    "applied_for",
                    "not_yet_applied"
                ],
                "x-enum-varnames": [
                    "NotApplicable",
                    "Granted",
                    "AppliedFor",
                    "NotYetApplied"
                ],
                "x-enum-descriptions": [
                    "Not applicable",
                    "Granted",
                    "Applied for",
                    "Not yet applied for"
                ],
                "title": "ProbateStatus"
            },
            "PropertyClass": {
                "type": "string",
                "description": "Broad class of property.\n",
                "enum": [
                    "residential",
                    "commercial",
                    "land",
                    "development",
                    "investment",
                    "other"
                ],
                "x-enum-varnames": [
                    "Residential",
                    "Commercial",
                    "Land",
                    "Development",
                    "Investment",
                    "Other"
                ],
                "x-enum-descriptions": [
                    "Residential",
                    "Commercial",
                    "Land",
                    "Development",
                    "Investment",
                    "Other"
                ],
                "title": "PropertyClass"
            },
            "PropertyCondition": {
                "type": "string",
                "description": "Seller's view of the property's condition.\n",
                "enum": [
                    "good",
                    "some_work",
                    "full_refurb"
                ],
                "x-enum-varnames": [
                    "Good",
                    "SomeWork",
                    "FullRefurb"
                ],
                "x-enum-descriptions": [
                    "Good",
                    "Needs some work",
                    "Needs full refurbishment"
                ],
                "title": "PropertyCondition"
            },
            "ReasonForSale": {
                "type": "string",
                "description": "Why the seller wants to sell.\n",
                "enum": [
                    "sell_quickly",
                    "not_selling",
                    "buyer_pulled_out",
                    "inherited_probate",
                    "landlord",
                    "needs_work",
                    "empty_property",
                    "chain_problem",
                    "unwanted",
                    "other"
                ],
                "x-enum-varnames": [
                    "SellQuickly",
                    "NotSelling",
                    "BuyerPulledOut",
                    "InheritedProbate",
                    "Landlord",
                    "NeedsWork",
                    "EmptyProperty",
                    "ChainProblem",
                    "Unwanted",
                    "Other"
                ],
                "x-enum-descriptions": [
                    "Need to sell quickly",
                    "Not selling on the open market",
                    "Buyer pulled out",
                    "Inherited or probate",
                    "Landlord selling up",
                    "Property needs work",
                    "Empty property",
                    "Chain problem",
                    "Unwanted property",
                    "Other"
                ],
                "title": "ReasonForSale"
            },
            "RedFlag": {
                "type": "string",
                "description": "Circumstances that need extra care when buying.\n",
                "enum": [
                    "probate",
                    "tenanted",
                    "repossession",
                    "empty"
                ],
                "x-enum-varnames": [
                    "Probate",
                    "Tenanted",
                    "Repossession",
                    "Empty"
                ],
                "x-enum-descriptions": [
                    "Probate",
                    "Tenanted",
                    "Repossession risk",
                    "Empty property"
                ],
                "title": "RedFlag"
            },
            "ReferralRequest": {
                "type": "object",
                "description": "An estate agent referring a vendor. The agent must confirm they have the vendor's permission\nto share these details (vendor_consent); that confirmation is what gets recorded as consent.",
                "properties": {
                    "agent": {
                        "type": "object",
                        "properties": {
                            "firm": {
                                "type": "string",
                                "maxLength": 255
                            },
                            "contact_name": {
                                "type": "string",
                                "maxLength": 255
                            },
                            "email": {
                                "type": "string",
                                "format": "email",
                                "maxLength": 255
                            },
                            "phone": {
                                "type": "string"
                            }
                        },
                        "required": [
                            "firm",
                            "contact_name",
                            "email",
                            "phone"
                        ]
                    },
                    "vendor": {
                        "type": "object",
                        "properties": {
                            "name": {
                                "type": "string",
                                "maxLength": 255
                            },
                            "phone": {
                                "type": "string"
                            },
                            "email": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "email",
                                "maxLength": 255
                            },
                            "best_time_to_call": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "maxLength": 64
                            }
                        },
                        "required": [
                            "name",
                            "phone"
                        ]
                    },
                    "property": {
                        "type": "object",
                        "properties": {
                            "postcode": {
                                "type": "string"
                            },
                            "address_line_1": {
                                "type": "string",
                                "maxLength": 255
                            },
                            "address_line_2": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "maxLength": 255
                            },
                            "town": {
                                "type": "string",
                                "maxLength": 255
                            },
                            "county": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "maxLength": 255
                            },
                            "uprn": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "pattern": "^\\d{1,12}$"
                            },
                            "property_type": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "maxLength": 64
                            }
                        },
                        "required": [
                            "postcode",
                            "address_line_1",
                            "town"
                        ]
                    },
                    "route": {
                        "type": "string",
                        "description": "How we intend to buy or help with the property.\n",
                        "enum": [
                            "direct",
                            "chain_rescue"
                        ]
                    },
                    "sale_stage": {
                        "anyOf": [
                            {
                                "$ref": "#/components/schemas/SaleStage"
                            },
                            {
                                "type": "null"
                            }
                        ]
                    },
                    "message": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 2000
                    },
                    "vendor_consent": {
                        "description": "The agent confirms they have the vendor's permission to share these details.",
                        "enum": [
                            "yes",
                            "on",
                            "1",
                            1,
                            "true",
                            true
                        ]
                    },
                    "turnstile_token": {
                        "type": "string"
                    }
                },
                "required": [
                    "agent",
                    "vendor",
                    "property",
                    "route",
                    "turnstile_token"
                ],
                "title": "ReferralRequest"
            },
            "ResponseState": {
                "type": "string",
                "description": "Where an open enquiry stands against its response target (docs/terminology.md). Closed enquiries have no response state.\n",
                "enum": [
                    "on_track",
                    "due_soon",
                    "overdue",
                    "contacted"
                ],
                "x-enum-varnames": [
                    "OnTrack",
                    "DueSoon",
                    "Overdue",
                    "Contacted"
                ],
                "x-enum-descriptions": [
                    "On track",
                    "Due soon",
                    "Overdue",
                    "Contacted"
                ],
                "title": "ResponseState"
            },
            "SaleStage": {
                "type": "string",
                "description": "How far a chain rescue seller's existing sale had got.\n",
                "enum": [
                    "on_market",
                    "sale_agreed",
                    "conveyancing",
                    "exchange_due",
                    "fell_through"
                ],
                "x-enum-varnames": [
                    "OnMarket",
                    "SaleAgreed",
                    "Conveyancing",
                    "ExchangeDue",
                    "FellThrough"
                ],
                "x-enum-descriptions": [
                    "On the market",
                    "Sale agreed",
                    "With solicitors",
                    "Exchange due",
                    "Sale fell through"
                ],
                "title": "SaleStage"
            },
            "SectionType": {
                "type": "string",
                "description": "The kinds of block a site page is built from. Each has a fixed layout on the website and a Data class (App\\Cms\\Sections) that says which fields an editor may change.\n",
                "enum": [
                    "hero",
                    "promise_cards",
                    "steps",
                    "routes",
                    "situations_grid",
                    "comparison",
                    "rich_text",
                    "trust_points",
                    "cta",
                    "faq_list",
                    "page_header",
                    "text_link",
                    "legal_sections",
                    "checklist",
                    "form",
                    "contact_details"
                ],
                "x-enum-varnames": [
                    "Hero",
                    "PromiseCards",
                    "Steps",
                    "Routes",
                    "SituationsGrid",
                    "Comparison",
                    "RichText",
                    "TrustPoints",
                    "Cta",
                    "FaqList",
                    "PageHeader",
                    "TextLink",
                    "LegalSections",
                    "Checklist",
                    "Form",
                    "ContactDetails"
                ],
                "x-enum-descriptions": [
                    "Hero",
                    "Promise cards",
                    "Steps",
                    "Cashio routes",
                    "Situations grid",
                    "Comparison table",
                    "Text",
                    "Trust points",
                    "Call to action",
                    "FAQs",
                    "Page header",
                    "Text with link",
                    "Legal sections",
                    "Checklist",
                    "Form",
                    "Contact details"
                ],
                "title": "SectionType"
            },
            "StoreDraftRequest": {
                "type": "object",
                "properties": {
                    "page_url": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "uri",
                        "maxLength": 2048
                    },
                    "referrer": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 2048
                    },
                    "utm_source": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 255
                    },
                    "utm_medium": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 255
                    },
                    "utm_campaign": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 255
                    },
                    "device": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 32
                    },
                    "situation": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Landing-page situation, e.g. \"inherited_probate\". Pre-fills reason_for_sale when it matches one.",
                        "maxLength": 64
                    }
                },
                "title": "StoreDraftRequest"
            },
            "SubmitDraftRequest": {
                "type": "object",
                "properties": {
                    "consent_accepted": {
                        "enum": [
                            "yes",
                            "on",
                            "1",
                            1,
                            "true",
                            true
                        ]
                    },
                    "consent_version": {
                        "type": "string",
                        "enum": [
                            "2026-10"
                        ]
                    },
                    "marketing_opt_in": {
                        "type": "boolean"
                    },
                    "turnstile_token": {
                        "type": "string"
                    }
                },
                "required": [
                    "consent_version",
                    "turnstile_token"
                ],
                "title": "SubmitDraftRequest"
            },
            "SurveyStatus": {
                "type": "string",
                "description": "Where the survey stands when an offer is made; decides the \"Survey\" line of the letter.\n",
                "enum": [
                    "required_not_booked",
                    "booked",
                    "completed",
                    "not_required"
                ],
                "x-enum-varnames": [
                    "RequiredNotBooked",
                    "Booked",
                    "Completed",
                    "NotRequired"
                ],
                "x-enum-descriptions": [
                    "Required, not yet booked",
                    "Booked",
                    "Completed",
                    "Not required"
                ],
                "title": "SurveyStatus"
            },
            "Timeframe": {
                "type": "string",
                "description": "How soon the seller wants to complete.\n",
                "enum": [
                    "asap",
                    "weeks_1_4",
                    "months_1_3",
                    "flexible"
                ],
                "x-enum-varnames": [
                    "Asap",
                    "Weeks1To4",
                    "Months1To3",
                    "Flexible"
                ],
                "x-enum-descriptions": [
                    "As soon as possible",
                    "Within 1 to 4 weeks",
                    "Within 1 to 3 months",
                    "Flexible"
                ],
                "title": "Timeframe"
            },
            "UkAddressResource": {
                "type": "object",
                "properties": {
                    "line_1": {
                        "type": "string"
                    },
                    "line_2": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "town": {
                        "type": "string"
                    },
                    "county": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "postcode": {
                        "type": "string",
                        "description": "Normalised, e.g. \"SW1A 1AA\"."
                    },
                    "uprn": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Unique Property Reference Number, when Loqate has one."
                    }
                },
                "required": [
                    "line_1",
                    "line_2",
                    "town",
                    "county",
                    "postcode",
                    "uprn"
                ],
                "title": "UkAddressResource"
            }
        },
        "responses": {
            "ValidationException": {
                "description": "Validation error",
                "content": {
                    "application/json": {
                        "schema": {
                            "type": "object",
                            "properties": {
                                "message": {
                                    "type": "string",
                                    "description": "Errors overview."
                                },
                                "errors": {
                                    "type": "object",
                                    "description": "A detailed description of each field that failed validation.",
                                    "additionalProperties": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        }
                                    }
                                }
                            },
                            "required": [
                                "message",
                                "errors"
                            ]
                        }
                    }
                }
            },
            "ModelNotFoundException": {
                "description": "Not found",
                "content": {
                    "application/json": {
                        "schema": {
                            "type": "object",
                            "properties": {
                                "message": {
                                    "type": "string",
                                    "description": "Error overview."
                                }
                            },
                            "required": [
                                "message"
                            ]
                        }
                    }
                }
            },
            "AuthorizationException": {
                "description": "Authorization error",
                "content": {
                    "application/json": {
                        "schema": {
                            "type": "object",
                            "properties": {
                                "message": {
                                    "type": "string",
                                    "description": "Error overview."
                                }
                            },
                            "required": [
                                "message"
                            ]
                        }
                    }
                }
            }
        }
    }
}