openapi: 3.2.0 info: title: Street Open Portal Listings API description: Build on top of the UKs most advanced Estate Agency software. version: '1.0' contact: name: Street API Development Team url: https://street.co.uk email: apis@street.co.uk servers: - url: https://street.co.uk/open-api/v1 description: Production. - url: https://demo.street.co.uk/open-api/v1 description: Testing. security: - your-api-token: [] tags: - name: Portal Listings description: Portal Listings endpoints for this API. paths: /portal-listings/{listing_id}: parameters: - schema: type: string name: listing_id in: path required: true description: External listing ID from the portal get: summary: Get Portal Listing by ID description: This endpoint retrieves a single portal listing by its external listing ID. operationId: get-portal-listings-listing-id tags: - Portal Listings responses: '200': description: Portal listing retrieved successfully content: application/vnd.api+json: schema: type: object properties: data: $ref: '#/components/schemas/PortalListing' included: type: array items: anyOf: - $ref: '#/components/schemas/IncludedProperty' - $ref: '#/components/schemas/IncludedPortal' - $ref: '#/components/schemas/IncludedSalesListing' - $ref: '#/components/schemas/IncludedLettingsListing' links: $ref: '#/components/schemas/IncludedLinks' meta: type: object jsonapi: $ref: '#/components/schemas/JsonApi' examples: Basic Portal Listing: summary: Basic portal listing response value: data: id: 550e8400-e29b-41d4-a716-446655440010 type: portal_listing attributes: remote_identifier: '12345' remote_url: https://portal.com/listing/12345 listing_type: salesListing active: true created_at: '2024-01-01T00:00:00Z' updated_at: '2024-01-01T00:00:00Z' relationships: portal: data: type: portal id: 550e8400-e29b-41d4-a716-446655440020 links: self: https://api.street.co.uk/open-api/v1/portal-listings/12345 Portal Listing with Property: summary: Portal listing with property included value: data: id: 550e8400-e29b-41d4-a716-446655440011 type: portal_listing attributes: remote_identifier: '12345' remote_url: https://portal.com/listing/12345 listing_type: salesListing active: true created_at: '2024-01-01T00:00:00Z' updated_at: '2024-01-01T00:00:00Z' relationships: property: data: type: property id: 550e8400-e29b-41d4-a716-446655440001 links: self: https://api.street.co.uk/open-api/v1/portal-listings/12345 included: - id: 550e8400-e29b-41d4-a716-446655440001 type: property attributes: inline_address: 123 Main Street, London public_address: 123 Main Street, London bedrooms: 3 bathrooms: 2 receptions: 1 status: For Sale links: self: https://api.street.co.uk/open-api/v1/properties/550e8400-e29b-41d4-a716-446655440001 '400': $ref: '#/components/responses/400' '401': $ref: '#/components/responses/401' '403': $ref: '#/components/responses/403' '404': $ref: '#/components/responses/404' '406': $ref: '#/components/responses/406' '415': $ref: '#/components/responses/415' '500': $ref: '#/components/responses/500' parameters: - schema: type: array uniqueItems: true minItems: 1 items: type: string enum: - property - portal - salesListing - lettingsListing in: query name: include description: Comma-separated list of relationships to include, e.g. `property,portal` style: form explode: false components: responses: '406': description: The HTTP 406 Not Acceptable client error response code indicates that the server cannot produce a response matching the list of acceptable values defined in the request's proactive content negotiation headers, and that the server is unwilling to supply a default representation. content: application/vnd.api+json: schema: $ref: '#/components/schemas/jsonApiErrorResponseBody' '404': description: The HTTP 404 Not Found response status code indicates that the server cannot find the requested resource. content: application/vnd.api+json: schema: $ref: '#/components/schemas/jsonApiErrorResponseBody' '403': description: The HTTP 403 Forbidden response status code indicates that the server understands the request but refuses to authorize it. content: application/vnd.api+json: schema: $ref: '#/components/schemas/jsonApiErrorResponseBody' '500': description: The HTTP 500 Internal Server Error server error response code indicates that the server encountered an unexpected condition that prevented it from fulfilling the request. content: application/vnd.api+json: schema: $ref: '#/components/schemas/jsonApiMultiErrorResponseBody' '401': description: The HTTP 401 Unauthorized response status code indicates that the client request has not been completed because it lacks valid authentication credentials for the requested resource. content: application/vnd.api+json: schema: $ref: '#/components/schemas/jsonApiErrorResponseBody' '415': description: The HTTP 415 Unsupported Media Type client error response code indicates that the server refuses to accept the request because the payload format is in an unsupported format. content: application/vnd.api+json: schema: $ref: '#/components/schemas/jsonApiErrorResponseBody' '400': description: The HTTP 400 Bad Request response status code indicates that the server cannot or will not process the request due to something that is perceived to be a client error. content: application/vnd.api+json: schema: $ref: '#/components/schemas/jsonApiMultiErrorResponseBody' schemas: IncludedLettingsListing: title: Lettings Listing (included) allOf: - $ref: '#/components/schemas/IncludedResource' - type: object properties: type: type: string enum: - lettings_listing attributes: $ref: '#/components/schemas/LettingsListingAttributes' x-tags: - Lettings Listings IncludedResource: title: Included Resource type: object examples: [] required: - type - id properties: type: type: string id: type: string format: uuid attributes: type: object relationships: type: - object - 'null' meta: $ref: '#/components/schemas/Meta' IncludedProperty: title: Property (included) allOf: - $ref: '#/components/schemas/IncludedResource' - type: object properties: type: type: string enum: - property attributes: $ref: '#/components/schemas/PropertyAttributes' relationships: type: object properties: branch: allOf: - $ref: '#/components/schemas/RelationshipSingular' - type: object properties: data: type: object properties: type: type: string enum: - branch jsonApiErrorResponseBody: title: JSON:API Error Response Body description: Response body for JSON:API errors, containing an array of `errors` in place of the `data` property provided in JSON:API success responses. Used for non-400/500 error codes where only a single error is expected. type: object properties: meta: type: object source: type: object description: The primary source of the conflict for 409 responses. properties: pointer: type: string description: JSON Pointer to the conflicting request value. parameter: type: string description: URI parameter related to the conflict. errors: description: An array of error objects providing additional information about problems encountered while processing the request. type: array maxItems: 1 items: $ref: '#/components/schemas/jsonApiError' required: - errors RelationshipSingular: title: Relationship Singular description: Inheritable schema for 1:1 relationships. Data may be null if the relationship is empty. type: object properties: data: oneOf: - type: object properties: type: type: string id: type: string format: uuid example: a827a3ae-4c74-4c32-8b42-42248d4010d3 required: - type - id - type: 'null' links: type: object properties: self: $ref: '#/components/schemas/Link' related: $ref: '#/components/schemas/Link' IncludedPortal: title: Portal (included) allOf: - $ref: '#/components/schemas/IncludedResource' - type: object properties: type: type: string enum: - portal attributes: $ref: '#/components/schemas/PortalAttributes' PortalListing: allOf: - $ref: '#/components/schemas/BaseModel' - type: object properties: type: type: string enum: - portal_listing attributes: $ref: '#/components/schemas/PortalListingAttributes' relationships: type: object properties: property: allOf: - $ref: '#/components/schemas/RelationshipSingular' - type: object properties: data: type: - object - 'null' portal: allOf: - $ref: '#/components/schemas/RelationshipSingular' - type: object properties: data: type: - object - 'null' salesListing: allOf: - $ref: '#/components/schemas/RelationshipSingular' - type: object properties: data: type: - object - 'null' lettingsListing: allOf: - $ref: '#/components/schemas/RelationshipSingular' - type: object properties: data: type: - object - 'null' title: Portal Listing PortalListingAttributes: type: object title: Portal Listing Attributes properties: remote_identifier: type: string description: External listing ID from the portal example: '12345' remote_url: type: string format: uri description: URL of the listing on the external portal example: https://portal.com/listing/12345 listing_type: type: string enum: - salesListing - lettingsListing description: Type of listing (sales or lettings) active: type: boolean description: Whether the portal listing is active created_at: type: string format: date-time updated_at: type: string format: date-time SalesListingAttributes: title: Sales Listing (included) type: object properties: brand_id: type: string format: uuid personal_interest_disclosure: type: - string - 'null' price_qualifier: type: - string - 'null' enum: - None - In Excess of - Prices From - Guide Price - Offers Over - Offers in Region of - Fixed Price - Price On Application - Part Buy, Part Rent - null archived: type: boolean is_low_profile: type: boolean is_not_in_property_feed_api: type: boolean spectre_social_campaigns: type: boolean spectre_email_campaigns: type: boolean is_auction: type: boolean new_home: type: boolean retirement: type: boolean full_description: type: - string - 'null' short_description: type: - string - 'null' location_summary: type: - string - 'null' has_parking: type: - boolean - 'null' virtual_tour: type: - string - 'null' format: uri-reference price: type: integer example: 500000 status: type: string enum: - For Sale - Sold STC - Withdrawn - Under Offer marketing_status: type: string enum: - For Sale - Sold STC - Withdrawn - Under Offer created_at: type: string format: date-time updated_at: type: string format: date-time deleted_at: type: - string - 'null' format: date-time PortalAttributes: type: object title: Portal Attributes properties: name: type: string description: Name of the portal example: Rightmove created_at: type: string format: date-time updated_at: type: string format: date-time Link: title: Link oneOf: - description: a string containing the link's URL type: string format: uri-reference - type: object required: - href properties: href: description: a string containing the link's URL type: string format: uri-reference meta: $ref: '#/components/schemas/Meta' PropertyAttributes: type: object title: Property (attributes) properties: is_sales: type: boolean is_lettings: type: boolean company_owned: type: boolean is_commercial: type: boolean is_residential: type: boolean address: $ref: '#/components/schemas/AddressSimple' inline_address: type: string public_address: type: string status: type: string enum: - Not On The Market - Valuation Lost - Valuation Booked - Provisional Valuation Booked - Valuation Pending - Valuation Cancelled - Valuation Completed - Instructed - For Sale - Under Offer - Sold STC - Exchanged - Let - To Let - Let Agreed - For Sale and To Let - Withdrawn Sales - Withdrawn Lettings - Withdrawn Sales And Lettings - Completed bedrooms: type: integer bathrooms: type: integer receptions: type: integer floor_area: type: - string - 'null' plot_area: type: - string - 'null' land_area: type: - string - 'null' full_description: type: - string - 'null' short_description: type: - string - 'null' location_summary: type: - string - 'null' full_description_lettings: type: - string - 'null' short_description_lettings: type: - string - 'null' location_summary_lettings: type: - string - 'null' property_type: type: string property_style: type: string property_age_bracket: type: string construction_year: type: - string - integer - 'null' is_listed_building: type: - boolean - 'null' is_conservation_area: type: - boolean - 'null' tenure: type: string tenure_notes: type: - string - 'null' lease_expiry_year: type: - string - 'null' lease_expiry_date: type: - string - 'null' format: date display_property_style: type: string work_required: type: boolean heating_system: type: string council_tax_band: type: string council_tax_cost: type: - integer - 'null' local_authority: type: - string - 'null' service_charge: type: integer service_charge_period: type: string default: month service_charge_notes: type: - string - 'null' ground_rent: type: - integer - 'null' ground_rent_period: type: string default: month ground_rent_review_period_years: type: - integer - 'null' ground_rent_uplift: type: - integer - 'null' ground_rent_expiry: type: - string - 'null' has_outdoor_space: type: - boolean - 'null' shared_ownership: type: boolean default: false shared_ownership_notes: type: - string - 'null' shared_ownership_rent: type: - integer - 'null' shared_ownership_rent_frequency: type: - string - 'null' shared_ownership_percentage_sold: type: - integer - 'null' tags: type: array uniqueItems: true items: type: object properties: name: type: string slug: type: string order: type: number features: type: array uniqueItems: true items: type: object properties: id: type: string format: uuid description: The ID of the feature name: type: string order: type: number include_on_portals: type: boolean highlight: type: boolean material_information: type: object properties: council_tax_band: type: - string - 'null' example: D maxLength: 1 lease_expiry_date: type: - string - 'null' format: date ground_rent_pence: type: - integer - 'null' ground_rent_period: type: - string - 'null' ground_rent_expiry: type: - string - 'null' format: date ground_rent_review_period_years: type: - integer - 'null' ground_rent_uplift: type: - integer - 'null' description: Value is a percentage service_charge_pence: type: - integer - 'null' service_charge_period: type: - string - 'null' service_charge_notes: type: - string - 'null' water_supply: type: - array - 'null' uniqueItems: true minItems: 1 items: type: string enum: - direct_main_waters - wells - boreholes - springs - other water_supply_other: type: - string - 'null' electricity_supply: type: - array - 'null' uniqueItems: true minItems: 1 items: type: string enum: - national_grid - wind_turbine - solar_panels - generator - other electricity_supply_other: type: - string - 'null' sewerage: type: - array - 'null' uniqueItems: true minItems: 1 items: type: string enum: - standard - septic_tank - sewage_treatment_plants - cesspit - cesspool - other sewerage_other: type: - string - 'null' heating_supply: type: - array - 'null' uniqueItems: true minItems: 1 items: type: string enum: - electric_central - gas_central - gas_other - communal_heating - lpg_central - wood_burner - biomass_boiler - solar_panels - heat_pump - other heating_supply_other: type: - string - 'null' heating_system: type: - string - 'null' broadband: type: - string - 'null' enum: - adsl - cable - fttc - fttp - null has_restrictions: type: - boolean - 'null' has_required_access: type: - boolean - 'null' public_right_of_way: type: - boolean - 'null' flood_risk: type: - boolean - 'null' sources_of_flooding: type: - array - 'null' items: type: string sources_of_flooding_other: type: - string - 'null' has_flood_defences: type: - boolean - 'null' has_flooded_in_last_five_years: type: - boolean - 'null' adaptations_list: type: - array - 'null' items: {} adaptations_other: type: - string - 'null' viewing_booking_url: type: - string - 'null' last_instructed_sales_at: type: - string - 'null' format: date-time last_instructed_lettings_at: type: - string - 'null' format: date-time last_exchanged_at: type: - string - 'null' format: date-time last_completed_at: type: - string - 'null' format: date-time created_at: type: string format: date-time updated_at: type: string format: date-time custom_meta_data: type: - object - array items: {} lead_source: type: - string - 'null' publish_after: type: - string - 'null' format: date-time archived_at: type: - string - 'null' format: date-time virtual_tour: type: - string - 'null' format: uri property_urls: type: - array - 'null' items: type: object properties: title: type: string type: type: string enum: - image - floor_plan - brochure - virtual_tour - audio_tour - ipack url: type: string format: uri maxLength: 2048 required: - title - type - url IncludedLinks: title: Included Links type: object properties: self: $ref: '#/components/schemas/Link' related: $ref: '#/components/schemas/Link' examples: [] AddressSimple: title: Address (simple) type: object properties: single_line: type: string example: 19 Lansdowne Road, Monton, Manchester anon_single_line: type: string example: Lansdowne Road, Monton, Manchester building_number: type: - string - 'null' example: '19' building_name: type: - string - 'null' street: type: - string - 'null' line_1: type: string example: 19 Lansdowne Road line_2: type: - string - 'null' example: Monton line_3: type: - string - 'null' example: Manchester line_4: type: - string - 'null' town: type: - string - 'null' example: Manchester country: type: string example: United Kingdom postcode: type: string example: M30 9PA udprn: type: - string - 'null' example: '28327204' geo: type: object properties: lat: type: - number - 'null' example: 0.2365698 format: float lng: type: - number - 'null' example: 53.023654 format: float royal_mail: type: - object - 'null' properties: postcode: type: string post_town: type: string thoroughfare: type: string building_name: type: - string - 'null' building_number: type: - string - 'null' department_name: type: - string - 'null' organisation_name: type: - string - 'null' sub_building_name: type: - string - 'null' dependent_locality: type: - string - 'null' dependent_thoroughfare: type: - string - 'null' double_dependent_locality: type: - string - 'null' street_group_property_id: type: - string - 'null' Meta: title: Meta Information description: The server's implementation. type: object jsonApiError: title: JSON:API Error Object description: A JSON:API object representing a single error. type: object properties: title: type: string detail: type: string code: type: string source: type: object description: An object containing references to the primary source of the error. properties: pointer: type: string description: A JSON Pointer to the value in the request document that caused the error. parameter: type: string description: A string indicating which URI query parameter caused the error. required: - title examples: - title: 401 Unauthorized detail: The requester is not authorized to access the resource. code: '401' LettingsListingAttributes: title: Lettings Listing (included) type: object properties: brand_id: type: string format: uuid price_pcm: type: integer example: 850 deposit: type: integer example: 1700 let_type: type: string allows_pets: type: boolean available_from: type: string furnished: type: boolean is_student_rental: type: boolean is_shared_accommodation: type: boolean min_tenancy_period: type: string archived: type: boolean is_low_profile: type: boolean is_not_in_property_feed_api: type: boolean spectre_social_campaigns: type: boolean spectre_email_campaigns: type: boolean full_description: type: string short_description: type: string location_summary: type: string has_parking: type: boolean virtual_tour: type: string status: type: string created_at: type: string format: date-time updated_at: type: string format: date-time deleted_at: type: - string - 'null' format: date-time IncludedSalesListing: title: Sales Listing (included) allOf: - $ref: '#/components/schemas/IncludedResource' - type: object properties: type: type: string enum: - sales_listing attributes: $ref: '#/components/schemas/SalesListingAttributes' BaseModel: title: Base Model type: object properties: id: type: string format: uuid type: type: string attributes: type: object relationships: type: object JsonApi: title: API Details description: The server's implementation. type: object properties: version: type: string meta: $ref: '#/components/schemas/Meta' jsonApiMultiErrorResponseBody: title: JSON:API Multi-Error Response Body description: Response body for JSON:API errors that may contain multiple error objects (400 Bad Request and 500 Internal Server Error). type: object properties: meta: type: object errors: description: An array of error objects providing additional information about problems encountered while processing the request. type: array items: $ref: '#/components/schemas/jsonApiError' required: - errors securitySchemes: your-api-token: type: http scheme: bearer x-ext-urls: {}