Alto API

The full Alto REST API for UK estate agency operations — 95 documented paths across 27 resource families covering contacts and applicants, property inventory, listings and media, appraisals and valuations, appointments and viewings, leads, offers, sales progression, lettings progression, tenancies, landlords and owners, work orders, suppliers, documents, file notes, branches, negotiators and partner integration status. OpenAPI 3.0.4 with a sandbox and a production server, Bearer JWT obtained via OAuth2 client-credentials against the /token endpoint, an AgencyRef header scoping every call to one agency, and route-level scopes of the form alto/read:contacts and alto/route:get-inventory.

Documentation

Specifications

Other Resources

OpenAPI Specification

alto-api-openapi.json Raw ↑
{
  "openapi": "3.0.4",
  "info": {
    "title": "Alto API",
    "version": "1.0"
  },
  "servers": [
    {
      "url": "https://api.alto.zoopladev.co.uk",
      "description": "Sandbox"
    },
    {
      "url": "https://api.alto.zoopla.co.uk",
      "description": "Production"
    }
  ],
  "paths": {
    "/appointments/{appointmentId}/{instanceId}": {
      "get": {
        "tags": [
          "Appointments"
        ],
        "summary": "Retrieves an appointment by their unique identifier and numeric instance",
        "description": "Retrieves an appointment by their unique identifier and numeric instance.\n            \nRequired scope: alto/read:appointments",
        "parameters": [
          {
            "name": "appointmentId",
            "in": "path",
            "description": "The unique identifier of the appointment",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          },
          {
            "name": "instanceId",
            "in": "path",
            "description": "The numeric instance of an appointment; this value is only greater than zero for general appointment types that are marked as recurring and represents the xth instance of a given appointment in a recurring series.",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "AgencyRef",
            "in": "header",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Appointment retrieved for requested appointment id and instance.",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalPartnerAppointment"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalPartnerAppointment"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalPartnerAppointment"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "403": {
            "description": "Invalid scope or AgencyRef for request.",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Appointment not found within the scope of the AgencyRef's authorised group and branches",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error"
          },
          "400": {
            "description": "Validation error e.g. invalid format for appointment identifier or instance"
          }
        },
        "security": [
          {
            "appAuth": [
              "alto/route:get-appointments-appointmentid-instanceid"
            ]
          }
        ]
      }
    },
    "/appointments/general": {
      "post": {
        "tags": [
          "Appointments"
        ],
        "summary": "Create a general appointment.",
        "description": "Creates an appointment with the requested contacts and properties for the given negotiators.\nRequired scope: alto/write:appointments_general",
        "parameters": [
          {
            "name": "AgencyRef",
            "in": "header",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "The object containing the appointment details.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralAppointmentRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralAppointmentRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralAppointmentRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Returns an object containing the newly created appointment's unique identifier",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/CreateAppointmentData"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateAppointmentData"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateAppointmentData"
                }
              }
            }
          },
          "400": {
            "description": "Validation error e.g. invalid date range selection.",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "403": {
            "description": "Invalid scope or AgencyRef for request.",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error"
          }
        },
        "security": [
          {
            "appAuth": [
              "alto/route:post-appointments-general"
            ]
          }
        ]
      }
    },
    "/appointments/general/{appointmentId}": {
      "patch": {
        "tags": [
          "Appointments"
        ],
        "summary": "Updates an existing general appointment",
        "description": "Updates a general appointment with any of the following fields supported for update:\n- /startDate ie. The start date and time in ISO 8601 format to update against the requested general appointment\n- /endDate ie. The end date and time in ISO 8601 format to update against the requested general appointment\n- /negotiatorIds ie. An array of all negotiators' unique identifiers to be associated against the requested general appointment\n            \nRequired scope: alto/write:appointments_general",
        "parameters": [
          {
            "name": "appointmentId",
            "in": "path",
            "description": "The appointment's unique identifier",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          },
          {
            "name": "AgencyRef",
            "in": "header",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralAppointmentPatchJsonPatchDocument"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralAppointmentPatchJsonPatchDocument"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralAppointmentPatchJsonPatchDocument"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Returns an object with a flag indicating a successful update"
          },
          "400": {
            "description": "Validation error e.g. invalid date range selection or unsupported patch path/value.",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "403": {
            "description": "Invalid scope or AgencyRef for request.",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Appointment requesting to be updated does not exist against the requested AgencyRef",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error"
          }
        },
        "security": [
          {
            "appAuth": [
              "alto/route:patch-appointments-general-appointmentid"
            ]
          }
        ]
      }
    },
    "/appointments/negotiators": {
      "get": {
        "tags": [
          "Appointments"
        ],
        "summary": "Get negotiator's appointments within a selected time range.",
        "description": "Retrieves a paginated list of the requested negotiator's appointments within the selected time range, grouped by negotiator.\nRequired scope: alto/read:appointments",
        "parameters": [
          {
            "name": "start-date",
            "in": "query",
            "description": "Required: The start date and time in ISO 8601 format for filtering negotiator's appointments.\nInterpreted as UK local diary time: a value with a UTC marker (a trailing `Z`) or an explicit offset\nis converted to UK local time (Europe/London); a plain local value with no offset is taken as-is.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time",
              "example": "2023-01-01T00:00:00.0000000+00:00"
            },
            "example": "2023-01-01T00:00:00.0000000+00:00"
          },
          {
            "name": "end-date",
            "in": "query",
            "description": "Required: The end date and time in ISO 8601 format for filtering negotiator's appointments.\nInterpreted as UK local diary time: a value with a UTC marker (a trailing `Z`) or an explicit offset\nis converted to UK local time (Europe/London); a plain local value with no offset is taken as-is.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time",
              "example": "2023-01-01T00:00:00.0000000+00:00"
            },
            "example": "2023-01-01T00:00:00.0000000+00:00"
          },
          {
            "name": "type-id",
            "in": "query",
            "description": "Optional: The appointment type for filtering negotiator appointments;\nNOTE: If not set, this will return all appointment types",
            "schema": {
              "enum": [
                "Unspecified",
                "General",
                "Valuation",
                "Viewing",
                "Communication",
                "InternalMessage",
                "Offer",
                "AgreedOffer",
                "Note",
                "AuditedChange",
                "StickyNote",
                "FinancialTransaction",
                "Marketing",
                "Creation",
                "SyncedEmail",
                "AccountingTransaction",
                "WorkOrderEvent",
                "TenancyEvent",
                "FollowUp",
                "PersonalInformationRequest",
                "TdsEvent",
                "SigningRequest",
                "MaintenanceRequest",
                "DocumentSharing",
                "ConveyancerReferral"
              ],
              "type": "string",
              "example": "General"
            },
            "example": "General"
          },
          {
            "name": "next-token",
            "in": "query",
            "description": "The token for the next page of results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "max-results",
            "in": "query",
            "description": "The maximum number of results to return. The default value is 50, and the maximum value is 250.",
            "schema": {
              "maximum": 250,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "example": 50
            },
            "example": 50
          },
          {
            "name": "negotiator-id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "AgencyRef",
            "in": "header",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Appointments retrieved for negotiator.",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalPartnerUserAppointmentsPagedResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalPartnerUserAppointmentsPagedResponse"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalPartnerUserAppointmentsPagedResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation error e.g. invalid date range selection.",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "403": {
            "description": "Invalid scope or AgencyRef for request.",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error"
          }
        },
        "security": [
          {
            "appAuth": [
              "alto/route:get-appointments-negotiators"
            ]
          }
        ]
      }
    },
    "/appointments/valuations": {
      "get": {
        "tags": [
          "Appointments"
        ],
        "summary": "Get valuations within a selected time range.",
        "description": "Retrieves a paged collection of valuations per the search criteria, which must include at least a Created Date range.",
        "parameters": [
          {
            "name": "created-from",
            "in": "query",
            "description": "Required: The lower limit for created date and time in ISO 8601 format for filtering appointments",
            "schema": {
              "type": "string",
              "format": "date-time",
              "example": "2023-01-01T00:00:00.0000000+00:00"
            },
            "example": "2023-01-01T00:00:00.0000000+00:00"
          },
          {
            "name": "created-to",
            "in": "query",
            "description": "Required: The upper limit for created date and time in ISO 8601 format for filtering appointments",
            "schema": {
              "type": "string",
              "format": "date-time",
              "example": "2023-01-01T00:00:00.0000000+00:00"
            },
            "example": "2023-01-01T00:00:00.0000000+00:00"
          },
          {
            "name": "negotiator-ids",
            "in": "query",
            "description": "Optional: A comma-separated list of negotiator ids for filtering appointments\nNOTE: If not set, this will default to all negotiators in the searched branches",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "branch-ids",
            "in": "query",
            "description": "Optional: A comma-separated list of branch ids for filtering appointments\nNOTE: If not set, this will default to all branches",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "next-token",
            "in": "query",
            "description": "The token for the next page of results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "max-results",
            "in": "query",
            "description": "The maximum number of results to return. The default value is 50, and the maximum value is 250.",
            "schema": {
              "maximum": 250,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "example": 50
            },
            "example": 50
          },
          {
            "name": "AgencyRef",
            "in": "header",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Valuations retrieved.",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalPartnerAppointmentPagedResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalPartnerAppointmentPagedResponse"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalPartnerAppointmentPagedResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation error e.g. invalid date range selection.",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "403": {
            "description": "Invalid scope or AgencyRef for request.",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "appAuth": [
              "alto/route:get-appointments-valuations"
            ]
          }
        ]
      }
    },
    "/appointments/viewings": {
      "post": {
        "tags": [
          "Appointments"
        ],
        "summary": "Create a viewing appointment.",
        "description": "Creates a viewing appointment with the requested applicant and property in a negotiator's calender.\nRequired scope: alto/write:appointments_viewings",
        "parameters": [
          {
            "name": "AgencyRef",
            "in": "header",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "The object containing the viewing details.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ViewingRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ViewingRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ViewingRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Returns an object containing the newly created viewing appointment's unique identifier",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/CreateAppointmentData"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateAppointmentData"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateAppointmentData"
                }
              }
            }
          },
          "400": {
            "description": "Validation error e.g. invalid date range selection.",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "403": {
            "description": "Invalid scope or AgencyRef for request.",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error"
          }
        },
        "security": [
          {
            "appAuth": [
              "alto/route:post-appointments-viewings"
            ]
          }
        ]
      }
    },
    "/appointments/viewings/{appointmentId}": {
      "patch": {
        "tags": [
          "Appointments"
        ],
        "summary": "Updates an existing viewing",
        "description": "Updates a viewing with any of the following fields supported for update:\n- /startDate ie. The start date and time in ISO 8601 format to update against the requested viewing\n- /endDate ie. The end date and time in ISO 8601 format to update against the requested viewing\n- /negotiatorId ie. The unique identifier of the negotiator to be associated with the requested viewing\n- /status ie. When cancelling, the status the requested viewing should be set to\n- /notes ie. The notes to be associated with the requested viewing\n- /internalNotes ie. The internal notes to be associated with the requested viewing\n- /applicantFeedback ie. The applicant feedback to be associated with the requested viewing\n            \nRequired scope: alto/write:appointments_viewings",
        "parameters": [
          {
            "name": "appointmentId",
            "in": "path",
            "description": "The appointment's unique identifier",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          },
          {
            "name": "AgencyRef",
            "in": "header",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ViewingPatchJsonPatchDocument"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ViewingPatchJsonPatchDocument"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ViewingPatchJsonPatchDocument"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Returns an object with a flag indicating a successful update"
          },
          "400": {
            "description": "Validation error e.g. invalid date range selection or unsupported patch path/value.",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetail

# --- truncated at 32 KB (718 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/alto-vebra/refs/heads/main/openapi/alto-api-openapi.json