Zoopla · AsyncAPI Specification

Zoopla Leads Webhooks

Version

View Spec View on GitHub Real EstateUnited KingdomProperty ListingsProperty PortalPropTechRentalsEstate AgentsLeadsCRM IntegrationAsyncAPIWebhooksEvents

AsyncAPI Specification

Raw ↑
generated: '2026-07-26'
method: searched
source: https://developers.zoopla.co.uk/leads/docs/push-service
name: Zoopla Lead Push Service
summary: >-
  Zoopla's only event surface is an outbound webhook: the Lead Push Service
  POSTs one HTTP request per lead, in real time, to an endpoint the member
  hosts. The relationship is inverted from the rest of the platform — Zoopla is
  the client and the member is the server — so the member supplies either their
  own OAuth 2.0 token endpoint plus credentials, or a static API key that Zoopla
  sends verbatim as the Authorization header value. There is no event bus, no
  streaming surface, no WebSocket and no published AsyncAPI document.
asyncapi_published: false
delivery:
  style: outbound webhook (HTTP POST per lead)
  content_type: application/json
  direction: Zoopla -> member endpoint
  endpoints: >-
    One recipient endpoint can receive everything, or separate endpoints can be
    configured for applicant and appraisal leads. When one endpoint is shared,
    the two are distinguished by the top-level key on the payload.
  retry: >-
    Retried for 24 hours against an unavailable consumer. After that there is no
    automatic replay; leads are retained for a further 29 days (30 total) and a
    manual recovery may be possible by contacting Zoopla.
  ordering: not documented
  signature_verification: >-
    None. Zoopla authenticates itself to the member endpoint with the member's
    own OAuth token or API key; there is no request-signing scheme, no shared
    secret HMAC and no timestamp header to verify.
authentication_to_consumer:
  methods:
  - method: oauth2
    grant: client_credentials
    requires_from_member: [client_id, client_secret, token endpoint, audience (configuration dependent)]
    usage: 'Authorization: Bearer {access_token}'
  - method: api_key
    requires_from_member: [key]
    usage: 'Authorization: {api-key}   # sent verbatim, no scheme prefix'
filters:
- name: applicant leads
  description: Consumers looking to buy or rent properties.
- name: appraisal leads
  description: Consumers looking to sell or let properties.
- name: sales leads
  description: Consumers looking to buy or sell properties.
- name: lettings leads
  description: Consumers looking to rent or let properties.
filter_note: All four are independent booleans set per configured endpoint.
events:
- name: applicant.lead
  top_level_key: applicant
  description: >-
    A consumer has enquired about a property they want to buy or rent. Payload
    carries contact details and preferences, intent, enquiry type, free-text
    message, viewing times, consumer situation and postcode, the search criteria
    behind the enquiry, and full details of the listing enquired about.
  schema: openapi/zoopla-leads-api-openapi.json#/definitions/Applicant
  example: examples/zoopla-push-applicant-lead.json
  also_available_by_poll: 'GET /applicant-leads'
- name: appraisal.lead
  top_level_key: appraisal
  description: >-
    A property owner has asked for a valuation. Payload carries contact details,
    intent, whether they are "just curious", and full property details including
    size, tenure, energy rating, an automated estimate with confidence band, last
    sale price and coordinates.
  schema: openapi/zoopla-leads-api-openapi.json#/definitions/Appraisal
  example: examples/zoopla-push-appraisal-lead.json
  also_available_by_poll: 'GET /appraisal-leads'
compatibility:
  additive_change_without_notice: true
  evidence: '"NOTE: New fields and enum values can be added at any time."'
consumer_obligations:
- >-
  Sanitise the `message` field before display — it is user-generated and may
  contain HTML or other formatting.
- Tolerate unknown fields and unknown enum members.
- >-
  Acknowledge quickly; a consumer outage longer than 24 hours loses automatic
  redelivery.
alternatives:
  poll: >-
    The same lead payloads are available by polling the Leads API, which returns
    the last 24 hours by default and supports a from-time/to-time window over the
    full 30-day retention period. Push is recommended where latency matters.
  legacy: >-
    Leads were historically delivered as XML over FTP; that mechanism is
    superseded by push and poll.
derived_spec: asyncapi/zoopla-leads-push-asyncapi.yml