Reapit · AsyncAPI Specification

Reapit Foundations Webhooks

Version

View Spec View on GitHub Real-EstateUnited KingdomPropTechCRMEstate AgentsProperty ListingsProperty ManagementRentalsConveyancingAustraliaAsyncAPIEvents

AsyncAPI Specification

reapit-foundations-webhooks.yml Raw ↑
generated: '2026-07-26'
method: searched
source: https://foundations-documentation.reapit.cloud/api/webhooks
spec_type: null
spec_status: >-
  No AsyncAPI, CloudEvents or event-catalog document is published anywhere on
  the Reapit estate — the GitHub org (reapit/foundations, reapit/foundations-
  documentation, reapit/ts-cdk-constructs) carries none, and no /asyncapi.yaml
  or /asyncapi.json exists on any host. This file is the webhook catalog
  captured from the documentation, not a fabricated AsyncAPI.
description: >-
  Reapit Foundations Webhooks is a genuinely complete outbound event system for
  a CRM vendor: 55 published topics across 17 entity domains, per-customer
  subscription (including the SBOX sandbox), JSON-Schema event filters,
  Ed25519 asymmetric payload signing, documented exponential-backoff retry, and
  published static source IPs for allowlisting. Events fire on data changes from
  ANY application touching the customer's CRM — AgencyCloud, Property Cloud or
  another AppMarket app — which is what makes it the practical integration
  substrate for the UK agency market. Payload bodies reuse the same schemas as
  the corresponding REST endpoints.
transport: HTTPS POST
content_type: application/json
management:
  ui: https://developers.reapit.cloud/webhooks/new
  manage_ui: https://developers.reapit.cloud/webhooks/manage
  api: https://platform.reapit.cloud/webhooks
  api_note: webhooks can be created and managed programmatically through the REST API
  subscription_scope: per customer (per Reapit tenant), including SBOX
  filters: >-
    Optional per-webhook event filters expressed as JSON Schema; a filter is
    tied to a single topic and the event is only delivered when the payload
    validates. Example use is targeting a specific appointment typeId (e.g. VL
    for valuation) on appointments.created / appointments.modified.
  payload_data: optional inclusion of semi-structured payload data
security:
  signing:
    algorithm: Ed25519
    header: X-Signature
    format: 's:keyId:timestamp:signature'
    key_scope: key pair is generated per APP, not per webhook
    public_key_endpoint: https://platform.reapit.cloud/webhooks/signing/{id}
    public_key_endpoint_auth: bearer token required; an app can only fetch its own keys
    public_key_format: JWK set with crv Ed25519 and base64url-encoded x
    verification: >-
      Concatenate the timestamp (segment 3) with the RAW request body (no
      delimiter) and verify segment 4 against the app's public key using Ed25519.
    legacy: >-
      A legacy symmetric signing method exists and is documented as obsolescent;
      asymmetric signing should be used.
  source_ips:
  - 18.133.192.77
  - 18.133.96.95
  - 18.132.113.124
  source_ip_note: >-
    Static Elastic IPs used for webhook egress in eu-west-2 across multiple AZs.
    Reapit commits to documenting future changes here in advance where possible.
  endpoint_requirements:
  - publicly reachable URI using the https scheme
  - accepts POST
  - accepts an application/json request body
  - 'AWS API Gateway execute-api DNS namespace is NOT supported — use a custom domain'
delivery:
  retry_policy: exponential backoff
  max_attempts: 6
  schedule:
  - attempt: 2
    delay: at least 60s after attempt 1
  - attempt: 3
    delay: at least 120s after attempt 2
  - attempt: 4
    delay: at least 300s after attempt 3
  - attempt: 5
    delay: at least 600s after attempt 4
  - attempt: 6
    delay: at least 900s after attempt 5; no further attempts
  no_retry_when:
  - the event is associated with Sandbox data
  - the receiving endpoint returned a 4xx response (treated as misconfiguration)
  ordering: not guaranteed — use eventTime to order
  duplicates: 'at-least-once: a single event may produce more than one notification'
  recommended_handling: respond fast (202 Accepted) and process asynchronously
  billing: webhook-originated requests count toward developer analytics and billing
testing:
  ping: >-
    The developer portal Ping function sends an example payload to the
    configured URL for the selected topic.
  ping_customer_id: webhook-test
  ping_entity_id: 9e7e4181-6210-49ea-abf5-d5ce16d23647
  recommendation: register webhooks inactive, Ping first, then test against SBOX
envelope:
  SendAttempts: number of attempts it took to deliver the message
  eventId: unique identifier for the event
  entityId: identifier of the entity — unique per customer database, NOT globally unique
  customerId: the Reapit customer the event belongs to
  eventTime: UTC timestamp the event was emitted
  topicId: the topic (see topics below)
  new: new version of the entity; null when the entity was deleted or archived
  old: previous version; null on .created events
  diff: field-level diff; only populated on .modified events
  schema_note: >-
    new/old/diff use the same schema as the corresponding REST endpoint, e.g.
    contacts.modified carries the GET /contacts shape. Types are published as
    @reapit/foundations-ts-definitions.
  metadata_note: app-specific metadata is NOT currently included in webhook payloads
topic_count: 55
topics:
- topic: application.install
  scope: none
  description: A customer installs the application in the AppMarket.
  note: payload carries applicationId (auth client id) and internalAppId (portal app id)
- topic: application.uninstall
  scope: none
  description: A customer uninstalls the application in the AppMarket.
- topic: applicants.created
  scope: applicants.read
  description: A new applicant is created.
- topic: applicants.modified
  scope: applicants.read
  description: An applicant, or any of its associated contacts, is modified.
- topic: appointments.cancelled
  scope: appointments.read
  description: An appointment is created as cancelled or an existing one is cancelled.
- topic: appointments.confirmed
  scope: appointments.read
  description: All required parties have confirmed attendance.
- topic: appointments.created
  scope: appointments.read
  description: A new appointment is created.
- topic: appointments.modified
  scope: appointments.read
  description: An existing appointment is modified.
- topic: companies.created
  scope: companies.read
  description: A new company is created.
- topic: companies.modified
  scope: companies.read
  description: An existing company is modified.
- topic: contacts.created
  scope: contacts.read
  description: A new contact is created.
- topic: contacts.landlorddetails.updated
  scope: contacts.read
  description: An agent updates a landlord's Making Tax Digital consent status.
- topic: contacts.modified
  scope: contacts.read
  description: An existing contact is modified.
- topic: contacts.optedout
  scope: contacts.read
  description: Marketing consent is set to or changed to deny.
- topic: conveyancing.modified
  scope: conveyancing.read
  description: A conveyancing (sales progression) entity is modified.
- topic: documents.created
  scope: documents.read
  description: A new document is created.
- topic: documents.modified
  scope: documents.read
  description: An existing document is modified.
- topic: enquiries.accepted
  scope: enquiries.read
  description: An enquiry status changes to added.
- topic: enquiries.created
  scope: enquiries.read
  description: A new enquiry is created.
- topic: enquiries.modified
  scope: enquiries.read
  description: An existing enquiry is modified.
- topic: enquiries.rejected
  scope: enquiries.read
  description: An enquiry status changes to rejected.
- topic: identitychecks.created
  scope: identitychecks.read
  description: A new identity check is created against an existing contact.
- topic: identitychecks.modified
  scope: identitychecks.read
  description: An existing identity check is modified.
- topic: landlords.created
  scope: landlords.read
  description: A new landlord is created.
- topic: landlords.modified
  scope: landlords.read
  description: A landlord, or any of its associated contacts, is modified.
- topic: offers.accepted
  scope: offers.read
  description: An offer is created accepted or an existing offer becomes accepted.
- topic: offers.created
  scope: offers.read
  description: A new offer is created.
- topic: offers.modified
  scope: offers.read
  description: An existing offer is modified.
- topic: offers.rejected
  scope: offers.read
  description: An offer is created rejected or an existing offer becomes rejected.
- topic: offers.withdrawn
  scope: offers.read
  description: An offer is created withdrawn or an existing offer becomes withdrawn.
- topic: offices.created
  scope: offices.read
  description: A new office is created.
- topic: offices.modified
  scope: offices.read
  description: An existing office is modified.
- topic: properties.created
  scope: properties.read
  description: A new property is created.
- topic: properties.modified
  scope: properties.read
  description: An existing property is modified.
- topic: properties.selling.askingpricechanged
  scope: properties.read
  description: The asking price of a sales property is changed.
- topic: properties.selling.completed
  scope: properties.read
  description: A sales property reaches completed status.
- topic: properties.selling.exchanged
  scope: properties.read
  description: A sales property reaches exchanged status.
- topic: properties.selling.withdrawn
  scope: properties.read
  description: A sales property is withdrawn.
- topic: properties.selling.instructed
  scope: properties.read
  description: A sales property reaches forSale or forSaleUnavailable status.
- topic: properties.selling.lostinstruction
  scope: properties.read
  description: A sales property enters a lost-instruction state.
- topic: properties.selling.underoffer
  scope: properties.read
  description: A sales property reaches underOffer or underOfferUnavailable status.
- topic: propertyimages.created
  scope: properties.read
  description: A new property image is created.
- topic: propertyimages.modified
  scope: properties.read
  description: An existing property image is modified.
- topic: referrals.created
  scope: referrals.read
  description: A new referral is created.
- topic: referrals.modified
  scope: referrals.read
  description: An existing referral is modified.
- topic: tenancies.created
  scope: tenancies.read
  description: A new tenancy is created.
- topic: tenancies.modified
  scope: tenancies.write
  description: An existing tenancy is modified.
  note: documented as requiring tenancies.write, unlike every other .modified topic
- topic: vendors.created
  scope: vendors.read
  description: Vendor information is associated with a sales property for the first time.
- topic: vendors.modified
  scope: vendors.read
  description: Vendor information, or an associated vendor contact, is modified.
- topic: worksorders.cancelled
  scope: worksorders.read
  description: A works order is created cancelled or becomes cancelled.
- topic: worksorders.complete
  scope: worksorders.read
  description: A works order is created complete or becomes complete.
- topic: worksorders.modified
  scope: worksorders.read
  description: An existing works order is modified.
- topic: worksorders.raised
  scope: worksorders.read
  description: A works order is created raised or becomes raised.
domains:
- applicants
- appointments
- companies
- contacts
- conveyancing
- documents
- enquiries
- identity checks
- landlords
- offers
- offices
- properties
- property images
- referrals
- tenancies
- vendors
- works orders
- appmarket application lifecycle
inbound_events:
  name: Foundations Notifications API
  direction: inbound (third party -> Reapit products)
  endpoint: POST https://platform.reapit.cloud/notifications
  scope: negotiators.read
  targets: '{ "targets": { "negotiatorId": [...] } } — multiple ids fan out'
  docs: https://foundations-documentation.reapit.cloud/api/notifications
  note: >-
    The counterpart of webhooks — pushes an app's real-time events INTO the CRM
    for display to named negotiators. Sandbox testing needs an active Developer
    Edition subscription and a dedicated negotiator id; display inside a live
    customer CRM must be enabled by Reapit support at the customer's request.

Work with this as data

Every AsyncAPI spec here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for asyncapi

4 MCP tools reach this
  • find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/reapit-foundations-webhooks"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.