openapi: 3.0.3 info: title: 'Laravel API Documentation' description: "
\nWelcome to the Real Estate Projects API documentation.
\nThis REST API provides a robust and secure programming interface for integrating, retrieving, and managing data related to real estate projects, including projects, floorplans, pricing, locations, developers, and associated companies.
\nIt is designed to support seamless integration with external systems and partner solutions.\n
\nThis documentation contains details about available endpoints, request and response formats, authentication, and practical usage examples.\n
\n\n429 Too Many Requests response.401 Unauthenticated), missing resources, and rate limits.HTTP/1.1 404 Not Found\nContent-Type: application/json\n\n{\n \"message\": \"Resource not found\"\n}\n\nHTTP/1.1 404 Not Found\nContent-Type: application/json\n\n{\n \"message\": \"Project not found\"\n}\n\n\nThe API returns clear and consistent 404 responses in two main cases:\n
\nAuthorization header of every request:Authorization: Bearer {YOUR_TEAM_TOKEN}\n \nIf you have any questions or need support, please contact your API administrator.\n
\n" version: 1.0.0 servers: - url: 'https://api-staging.redbricksdata.com' tags: - name: Endpoints description: '' - name: Webhooks description: 'Real-time notifications for data changes in the Red Bricks API' components: securitySchemes: default: type: http scheme: bearer description: "\n This API uses Team Command Token Authentication.
\n To authenticate, include your team command token in the Authorization header of every request, prefixed\n with Bearer.
\n
Example header:
\nAuthorization: Bearer {API_TOKEN}\n\n Team command tokens are associated with your team account and provide access to all API endpoints.
\n You can obtain your team command token from your team administrator or through your team management dashboard.
\n Keep your token secure and never share it with unauthorized users.\n
\n Note: All API endpoints require authentication. Requests without a valid team token will be\n rejected.\n
\n\n If your token is missing, expired, or invalid, you will receive one of the following error responses:\n
\n\nHTTP/1.1 401 Unauthorized\nContent-Type: application/json\n\n{\n \"message\": \"Team token is required\"\n}\n\n\nHTTP/1.1 401 Unauthorized\nContent-Type: application/json\n\n{\n \"message\": \"Invalid or expired team token\"\n}\n\n\nHTTP/1.1 401 Unauthorized\nContent-Type: application/json\n\n{\n \"message\": \"Team token has expired\"\n}\n\n"
security:
-
default: []
paths:
/api/v1/projects:
get:
summary: 'List all projects'
operationId: listAllProjects
description: 'Retrieve a list of all real estate projects with optional filters and pagination.'
parameters:
-
in: query
name: name
description: 'Filter by project name.'
example: 'Aurora Hills'
required: false
schema:
type: string
description: 'Filter by project name.'
example: 'Aurora Hills'
nullable: true
-
in: query
name: city
description: 'Filter by city, can be comma-separated ID or name value.'
example: '111,222,333'
required: false
schema:
type: string
description: 'Filter by city, can be comma-separated ID or name value.'
example: '111,222,333'
nullable: true
-
in: query
name: district
description: 'Filter by district, can be comma-separated ID or name value.'
example: '111,222,333'
required: false
schema:
type: string
description: 'Filter by district, can be comma-separated ID or name value.'
example: '111,222,333'
nullable: true
-
in: query
name: neighbourhood
description: 'Filter by neighbourhood, can be comma-separated ID or name value.'
example: '111,222,333'
required: false
schema:
type: string
description: 'Filter by neighbourhood, can be comma-separated ID or name value.'
example: '111,222,333'
nullable: true
-
in: query
name: sales_status
description: 'Filter by sales status.'
example: Selling
required: false
schema:
type: string
description: 'Filter by sales status.'
example: Selling
nullable: true
enum:
- Cancelled
- 'Developer Sold Out'
- 'Launching Soon'
- 'On Hold'
- 'Platinum Access & Selling'
- 'Registration Phase'
- Resale
- Selling
-
in: query
name: construction_status
description: 'Filter by construction status.'
example: 'Under Construction'
required: false
schema:
type: string
description: 'Filter by construction status.'
example: 'Under Construction'
nullable: true
enum:
- Complete
- Pre-Construction
- 'Under Construction'
- Cancelled
-
in: query
name: type
description: 'Filter by building type.'
example: Condo
required: false
schema:
type: string
description: 'Filter by building type.'
example: Condo
nullable: true
enum:
- 'Single Family Home'
- Condo
- Townhouse
-
in: query
name: occupancy_date_min
description: 'Minimum occupancy date (YYYY-MM-DD). Must be a valid date.'
example: '2025-01-01'
required: false
schema:
type: string
description: 'Minimum occupancy date (YYYY-MM-DD). Must be a valid date.'
example: '2025-01-01'
nullable: true
-
in: query
name: occupancy_date_max
description: 'Maximum occupancy date (YYYY-MM-DD). Must be a valid date.'
example: '2026-01-01'
required: false
schema:
type: string
description: 'Maximum occupancy date (YYYY-MM-DD). Must be a valid date.'
example: '2026-01-01'
nullable: true
-
in: query
name: launch_date_min
description: 'Minimum launch date (YYYY-MM-DD). Must be a valid date.'
example: '2024-01-01'
required: false
schema:
type: string
description: 'Minimum launch date (YYYY-MM-DD). Must be a valid date.'
example: '2024-01-01'
nullable: true
-
in: query
name: launch_date_max
description: 'Maximum launch date (YYYY-MM-DD). Must be a valid date.'
example: '2024-12-31'
required: false
schema:
type: string
description: 'Maximum launch date (YYYY-MM-DD). Must be a valid date.'
example: '2024-12-31'
nullable: true
-
in: query
name: launch_psf_avg_min
description: 'Minimum launch price per square foot average.'
example: 1000.0
required: false
schema:
type: number
description: 'Minimum launch price per square foot average.'
example: 1000.0
nullable: true
-
in: query
name: launch_psf_avg_max
description: 'Maximum launch price per square foot average.'
example: 2000.0
required: false
schema:
type: number
description: 'Maximum launch price per square foot average.'
example: 2000.0
nullable: true
-
in: query
name: launch_price_min
description: 'Minimum launch price.'
example: 300000.0
required: false
schema:
type: number
description: 'Minimum launch price.'
example: 300000.0
nullable: true
-
in: query
name: launch_price_max
description: 'Maximum launch price.'
example: 900000.0
required: false
schema:
type: number
description: 'Maximum launch price.'
example: 900000.0
nullable: true
-
in: query
name: price_per_sqft_min
description: 'Minimum price per square foot.'
example: 1000.0
required: false
schema:
type: number
description: 'Minimum price per square foot.'
example: 1000.0
nullable: true
-
in: query
name: price_per_sqft_max
description: 'Maximum price per square foot.'
example: 2000.0
required: false
schema:
type: number
description: 'Maximum price per square foot.'
example: 2000.0
nullable: true
-
in: query
name: current_price_min
description: 'Minimum current price.'
example: 400000.0
required: false
schema:
type: number
description: 'Minimum current price.'
example: 400000.0
nullable: true
-
in: query
name: current_price_max
description: 'Maximum current price.'
example: 800000.0
required: false
schema:
type: number
description: 'Maximum current price.'
example: 800000.0
nullable: true
-
in: query
name: interior_size_min
description: 'Minimum interior size.'
example: 500.0
required: false
schema:
type: number
description: 'Minimum interior size.'
example: 500.0
nullable: true
-
in: query
name: interior_size_max
description: 'Maximum interior size.'
example: 2000.0
required: false
schema:
type: number
description: 'Maximum interior size.'
example: 2000.0
nullable: true
-
in: query
name: maintenance_fees_min
description: 'Minimum maintenance fees.'
example: 0.5
required: false
schema:
type: number
description: 'Minimum maintenance fees.'
example: 0.5
nullable: true
-
in: query
name: maintenance_fees_max
description: 'Maximum maintenance fees.'
example: 1.5
required: false
schema:
type: number
description: 'Maximum maintenance fees.'
example: 1.5
nullable: true
-
in: query
name: parking_price_min
description: 'Minimum parking price.'
example: 20000.0
required: false
schema:
type: number
description: 'Minimum parking price.'
example: 20000.0
nullable: true
-
in: query
name: parking_price_max
description: 'Maximum parking price.'
example: 50000.0
required: false
schema:
type: number
description: 'Maximum parking price.'
example: 50000.0
nullable: true
-
in: query
name: locker_price_min
description: 'Minimum locker price.'
example: 2000.0
required: false
schema:
type: number
description: 'Minimum locker price.'
example: 2000.0
nullable: true
-
in: query
name: locker_price_max
description: 'Maximum locker price.'
example: 10000.0
required: false
schema:
type: number
description: 'Maximum locker price.'
example: 10000.0
nullable: true
-
in: query
name: deposit_min
description: 'Minimum deposit.'
example: 5.0
required: false
schema:
type: number
description: 'Minimum deposit.'
example: 5.0
nullable: true
-
in: query
name: deposit_max
description: 'Maximum deposit.'
example: 20.0
required: false
schema:
type: number
description: 'Maximum deposit.'
example: 20.0
nullable: true
-
in: query
name: developer
description: 'Filter by developer name.'
example: Tridel
required: false
schema:
type: string
description: 'Filter by developer name.'
example: Tridel
nullable: true
-
in: query
name: architect
description: 'Filter by architect name or slug.'
example: KPMB
required: false
schema:
type: string
description: 'Filter by architect name or slug.'
example: KPMB
nullable: true
-
in: query
name: sales_marketing_company
description: 'Filter by sales and marketing company.'
example: Baker
required: false
schema:
type: string
description: 'Filter by sales and marketing company.'
example: Baker
nullable: true
-
in: query
name: storeys_min
description: 'Minimum number of storeys.'
example: 10
required: false
schema:
type: integer
description: 'Minimum number of storeys.'
example: 10
nullable: true
-
in: query
name: storeys_max
description: 'Maximum number of storeys.'
example: 40
required: false
schema:
type: integer
description: 'Maximum number of storeys.'
example: 40
nullable: true
-
in: query
name: building_height_min
description: 'Minimum building height (meters).'
example: 50.0
required: false
schema:
type: number
description: 'Minimum building height (meters).'
example: 50.0
nullable: true
-
in: query
name: building_height_max
description: 'Maximum building height (meters).'
example: 150.0
required: false
schema:
type: number
description: 'Maximum building height (meters).'
example: 150.0
nullable: true
-
in: query
name: suites_min
description: 'Minimum number of suites.'
example: 100
required: false
schema:
type: integer
description: 'Minimum number of suites.'
example: 100
nullable: true
-
in: query
name: suites_max
description: 'Maximum number of suites.'
example: 300
required: false
schema:
type: integer
description: 'Maximum number of suites.'
example: 300
nullable: true
-
in: query
name: beds_min
description: 'Minimum number of bedrooms.'
example: 1
required: false
schema:
type: integer
description: 'Minimum number of bedrooms.'
example: 1
nullable: true
-
in: query
name: beds_max
description: 'Maximum number of bedrooms.'
example: 3
required: false
schema:
type: integer
description: 'Maximum number of bedrooms.'
example: 3
nullable: true
-
in: query
name: sort_by
description: 'Sort by field.'
example: price_per_sqft
required: false
schema:
type: string
description: 'Sort by field.'
example: price_per_sqft
nullable: true
enum:
- updated_at
- launch_date
- price_per_sqft
-
in: query
name: sort_direction
description: 'Sort direction. Options: asc, desc.'
example: asc
required: false
schema:
type: string
description: 'Sort direction. Options: asc, desc.'
example: asc
nullable: true
enum:
- asc
- desc
-
in: query
name: per_page
description: 'Number of projects per page. Default: 20. Max: 50. Must be at least 1. Must not be greater than 50.'
example: 50
required: false
schema:
type: integer
description: 'Number of projects per page. Default: 20. Max: 50. Must be at least 1. Must not be greater than 50.'
example: 50
nullable: true
-
in: query
name: page
description: 'The page number for pagination. Must be at least 1.'
example: 2
required: false
schema:
type: integer
description: 'The page number for pagination. Must be at least 1.'
example: 2
nullable: true
-
in: query
name: search
description: 'Comprehensive search across project name, description, developer name, city, district, and neighbourhood.'
example: 'Tridel downtown toronto'
required: false
schema:
type: string
description: 'Comprehensive search across project name, description, developer name, city, district, and neighbourhood.'
example: 'Tridel downtown toronto'
nullable: true
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 6508
name: 'Ullrich-Mayert Tower'
description: 'Odit doloribus repellat officiis corporis nesciunt ut ratione iure. Molestiae ut rem est esse. Aut molestiae sunt suscipit doloribus fugiat. Aut deserunt et error neque recusandae et. Dolorem et ut dicta. Assumenda consequatur ut et sunt quisquam.'
status: 'Under Construction'
construction_status: 'Under Construction'
media: '["https:\/\/via.placeholder.com\/640x480.png\/00cc99?text=ut","https:\/\/via.placeholder.com\/640x480.png\/001133?text=alias"]'
city_id: 242
city_name: Ashlymouth
deposit_with_time: null
deposit_full: null
deposit: 24
deposit_data: null
size: null
launch_price: null
district_id: 263
district_name: 'recusandae District'
neighbourhood_id: 699
neighbourhood_name: 'rerum ex'
architect_id: ''
architect_name: ''
interior_designer_id: ''
interior_designer_name: ''
developer_id: ''
developer_name: ''
developers: []
architects: []
interior_designers: []
sales_marketing_companies:
-
id: 280
name: 'Fahey, Lesch and Christiansen Sales & Marketing'
slug: null
storeys: 7
suites: 188
units_condo: 0
units_hotel: 0
units_rental: 0
units_market_rate_rental: 0
units_rental_replacement: 0
units_affordable_rental: 0
building_type: Townhouse
building_height_m: null
underground_levels: null
launch_date: '2025-12-15'
occupancy_date: '2026-01-09 19:13:51'
address: '660 Lambert Neck'
google_map_link: 'http://konopelski.com/a-consectetur-assumenda-eaque-neque-sit'
walk_score: 42
transit_score: null
location: ','
current_price_from: '622722.00'
current_price_to: '1234613.00'
total_parking: 381
residential_parking: 337
parking_ratio: null
residential_parking_ratio: '0.76'
visitor_parking: 27
industrial_parking: 8
office_parking: 4
retail_parking: null
bike_parking: 46
parking_price: null
parking_details: 'Voluptates exercitationem est aperiam quis est nulla.'
locker_price: '11860'
locker_details: 'Molestiae voluptatem est voluptatem molestiae magnam blanditiis.'
current_sales_status: 'Platinum Access & Selling'
launch_psf_avg: null
maintenance_fees: '1.16'
maintenance_fees_details: 'Eos voluptatem et qui unde et esse pariatur.'
floorplan_premiums: null
development_charges: '49641'
google_drive_portal: 'http://www.gleason.com/sed-dolorem-sed-voluptatem-ut-enim-sed'
google_drive_archive_portal: 'http://www.lang.info/'
amenities: 'facilis error vel omnis tempora'
finishes: null
gfa: null
price_per_sqft: 1472
bedrooms_info: 'Rerum voluptas ab maxime qui rerum sed.'
bedrooms: []
bedrooms_percents: []
highlights: null
special_incentives:
-
id: 106
name: 'Cashback on Closing'
slug: null
description: null
latest_documents: []
historical_documents: []
launch_price_project: null
townhouse_types: []
ownership_types: []
low_rise_types: []
low_rise_storeys: []
created_at: '2025-12-05T10:56:33.000000Z'
updated_at: '2025-12-05T10:56:33.000000Z'
links: '[...]'
meta: '[...]'
properties:
data:
type: object
properties:
id:
type: integer
example: 6508
name:
type: string
example: 'Ullrich-Mayert Tower'
description:
type: string
example: 'Odit doloribus repellat officiis corporis nesciunt ut ratione iure. Molestiae ut rem est esse. Aut molestiae sunt suscipit doloribus fugiat. Aut deserunt et error neque recusandae et. Dolorem et ut dicta. Assumenda consequatur ut et sunt quisquam.'
status:
type: string
example: 'Under Construction'
construction_status:
type: string
example: 'Under Construction'
media:
type: string
example: '["https:\/\/via.placeholder.com\/640x480.png\/00cc99?text=ut","https:\/\/via.placeholder.com\/640x480.png\/001133?text=alias"]'
city_id:
type: integer
example: 242
city_name:
type: string
example: Ashlymouth
deposit_with_time:
type: string
example: null
deposit_full:
type: string
example: null
deposit:
type: integer
example: 24
deposit_data:
type: string
example: null
size:
type: string
example: null
launch_price:
type: string
example: null
district_id:
type: integer
example: 263
district_name:
type: string
example: 'recusandae District'
neighbourhood_id:
type: integer
example: 699
neighbourhood_name:
type: string
example: 'rerum ex'
architect_id:
type: string
example: ''
architect_name:
type: string
example: ''
interior_designer_id:
type: string
example: ''
interior_designer_name:
type: string
example: ''
developer_id:
type: string
example: ''
developer_name:
type: string
example: ''
developers:
type: array
example: []
architects:
type: array
example: []
interior_designers:
type: array
example: []
sales_marketing_companies:
type: array
example:
-
id: 280
name: 'Fahey, Lesch and Christiansen Sales & Marketing'
slug: null
items:
type: object
properties:
id:
type: integer
example: 280
name:
type: string
example: 'Fahey, Lesch and Christiansen Sales & Marketing'
slug:
type: string
example: null
storeys:
type: integer
example: 7
suites:
type: integer
example: 188
units_condo:
type: integer
example: 0
units_hotel:
type: integer
example: 0
units_rental:
type: integer
example: 0
units_market_rate_rental:
type: integer
example: 0
units_rental_replacement:
type: integer
example: 0
units_affordable_rental:
type: integer
example: 0
building_type:
type: string
example: Townhouse
building_height_m:
type: string
example: null
underground_levels:
type: string
example: null
launch_date:
type: string
example: '2025-12-15'
occupancy_date:
type: string
example: '2026-01-09 19:13:51'
address:
type: string
example: '660 Lambert Neck'
google_map_link:
type: string
example: 'http://konopelski.com/a-consectetur-assumenda-eaque-neque-sit'
walk_score:
type: integer
example: 42
transit_score:
type: string
example: null
location:
type: string
example: ','
current_price_from:
type: string
example: '622722.00'
current_price_to:
type: string
example: '1234613.00'
total_parking:
type: integer
example: 381
residential_parking:
type: integer
example: 337
parking_ratio:
type: string
example: null
residential_parking_ratio:
type: string
example: '0.76'
visitor_parking:
type: integer
example: 27
industrial_parking:
type: integer
example: 8
office_parking:
type: integer
example: 4
retail_parking:
type: string
example: null
bike_parking:
type: integer
example: 46
parking_price:
type: string
example: null
parking_details:
type: string
example: 'Voluptates exercitationem est aperiam quis est nulla.'
locker_price:
type: string
example: '11860'
locker_details:
type: string
example: 'Molestiae voluptatem est voluptatem molestiae magnam blanditiis.'
current_sales_status:
type: string
example: 'Platinum Access & Selling'
launch_psf_avg:
type: string
example: null
maintenance_fees:
type: string
example: '1.16'
maintenance_fees_details:
type: string
example: 'Eos voluptatem et qui unde et esse pariatur.'
floorplan_premiums:
type: string
example: null
development_charges:
type: string
example: '49641'
google_drive_portal:
type: string
example: 'http://www.gleason.com/sed-dolorem-sed-voluptatem-ut-enim-sed'
google_drive_archive_portal:
type: string
example: 'http://www.lang.info/'
amenities:
type: string
example: 'facilis error vel omnis tempora'
finishes:
type: string
example: null
gfa:
type: string
example: null
price_per_sqft:
type: integer
example: 1472
bedrooms_info:
type: string
example: 'Rerum voluptas ab maxime qui rerum sed.'
bedrooms:
type: array
example: []
bedrooms_percents:
type: array
example: []
highlights:
type: string
example: null
special_incentives:
type: array
example:
-
id: 106
name: 'Cashback on Closing'
slug: null
description: null
items:
type: object
properties:
id:
type: integer
example: 106
name:
type: string
example: 'Cashback on Closing'
slug:
type: string
example: null
description:
type: string
example: null
latest_documents:
type: array
example: []
historical_documents:
type: array
example: []
launch_price_project:
type: string
example: null
townhouse_types:
type: array
example: []
ownership_types:
type: array
example: []
low_rise_types:
type: array
example: []
low_rise_storeys:
type: array
example: []
created_at:
type: string
example: '2025-12-05T10:56:33.000000Z'
updated_at:
type: string
example: '2025-12-05T10:56:33.000000Z'
links:
type: string
example: '[...]'
meta:
type: string
example: '[...]'
tags:
- Endpoints
'/api/v1/projects/{id}':
get:
summary: 'Get a single project'
operationId: getASingleProject
description: 'Retrieve detailed information about a specific project by its unique ID.'
parameters:
-
in: query
name: name
description: 'Filter by project name.'
example: 'Aurora Hills'
required: false
schema:
type: string
description: 'Filter by project name.'
example: 'Aurora Hills'
nullable: true
-
in: query
name: city
description: 'Filter by city, can be comma-separated ID or name value.'
example: '111,222,333'
required: false
schema:
type: string
description: 'Filter by city, can be comma-separated ID or name value.'
example: '111,222,333'
nullable: true
-
in: query
name: district
description: 'Filter by district, can be comma-separated ID or name value.'
example: '111,222,333'
required: false
schema:
type: string
description: 'Filter by district, can be comma-separated ID or name value.'
example: '111,222,333'
nullable: true
-
in: query
name: neighbourhood
description: 'Filter by neighbourhood, can be comma-separated ID or name value.'
example: '111,222,333'
required: false
schema:
type: string
description: 'Filter by neighbourhood, can be comma-separated ID or name value.'
example: '111,222,333'
nullable: true
-
in: query
name: sales_status
description: 'Filter by sales status.'
example: Selling
required: false
schema:
type: string
description: 'Filter by sales status.'
example: Selling
nullable: true
enum:
- Cancelled
- 'Developer Sold Out'
- 'Launching Soon'
- 'On Hold'
- 'Platinum Access & Selling'
- 'Registration Phase'
- Resale
- Selling
-
in: query
name: construction_status
description: 'Filter by construction status.'
example: 'Under Construction'
required: false
schema:
type: string
description: 'Filter by construction status.'
example: 'Under Construction'
nullable: true
enum:
- Complete
- Pre-Construction
- 'Under Construction'
- Cancelled
-
in: query
name: type
description: 'Filter by building type.'
example: Condo
required: false
schema:
type: string
description: 'Filter by building type.'
example: Condo
nullable: true
enum:
- 'Single Family Home'
- Condo
- Townhouse
-
in: query
name: occupancy_date_min
description: 'Minimum occupancy date (YYYY-MM-DD). Must be a valid date.'
example: '2025-01-01'
required: false
schema:
type: string
description: 'Minimum occupancy date (YYYY-MM-DD). Must be a valid date.'
example: '2025-01-01'
nullable: true
-
in: query
name: occupancy_date_max
description: 'Maximum occupancy date (YYYY-MM-DD). Must be a valid date.'
example: '2026-01-01'
required: false
schema:
type: string
description: 'Maximum occupancy date (YYYY-MM-DD). Must be a valid date.'
example: '2026-01-01'
nullable: true
-
in: query
name: launch_date_min
description: 'Minimum launch date (YYYY-MM-DD). Must be a valid date.'
example: '2024-01-01'
required: false
schema:
type: string
description: 'Minimum launch date (YYYY-MM-DD). Must be a valid date.'
example: '2024-01-01'
nullable: true
-
in: query
name: launch_date_max
description: 'Maximum launch date (YYYY-MM-DD). Must be a valid date.'
example: '2024-12-31'
required: false
schema:
type: string
description: 'Maximum launch date (YYYY-MM-DD). Must be a valid date.'
example: '2024-12-31'
nullable: true
-
in: query
name: launch_psf_avg_min
description: 'Minimum launch price per square foot average.'
example: 1000.0
required: false
schema:
type: number
description: 'Minimum launch price per square foot average.'
example: 1000.0
nullable: true
-
in: query
name: launch_psf_avg_max
description: 'Maximum launch price per square foot average.'
example: 2000.0
required: false
schema:
type: number
description: 'Maximum launch price per square foot average.'
example: 2000.0
nullable: true
-
in: query
name: launch_price_min
description: 'Minimum launch price.'
example: 300000.0
required: false
schema:
type: number
description: 'Minimum launch price.'
example: 300000.0
nullable: true
-
in: query
name: launch_price_max
description: 'Maximum launch price.'
example: 900000.0
required: false
schema:
type: number
description: 'Maximum launch price.'
example: 900000.0
nullable: true
-
in: query
name: price_per_sqft_min
description: 'Minimum price per square foot.'
example: 1000.0
required: false
schema:
type: number
description: 'Minimum price per square foot.'
example: 1000.0
nullable: true
-
in: query
name: price_per_sqft_max
description: 'Maximum price per square foot.'
example: 2000.0
required: false
schema:
type: number
description: 'Maximum price per square foot.'
example: 2000.0
nullable: true
-
in: query
name: current_price_min
description: 'Minimum current price.'
example: 400000.0
required: false
schema:
type: number
description: 'Minimum current price.'
example: 400000.0
nullable: true
-
in: query
name: current_price_max
description: 'Maximum current price.'
example: 800000.0
required: false
schema:
type: number
description: 'Maximum current price.'
example: 800000.0
nullable: true
-
in: query
name: interior_size_min
description: 'Minimum interior size.'
example: 500.0
required: false
schema:
type: number
description: 'Minimum interior size.'
example: 500.0
nullable: true
-
in: query
name: interior_size_max
description: 'Maximum interior size.'
example: 2000.0
required: false
schema:
type: number
description: 'Maximum interior size.'
example: 2000.0
nullable: true
-
in: query
name: maintenance_fees_min
description: 'Minimum maintenance fees.'
example: 0.5
required: false
schema:
type: number
description: 'Minimum maintenance fees.'
example: 0.5
nullable: true
-
in: query
name: maintenance_fees_max
description: 'Maximum maintenance fees.'
example: 1.5
required: false
schema:
type: number
description: 'Maximum maintenance fees.'
example: 1.5
nullable: true
-
in: query
name: parking_price_min
description: 'Minimum parking price.'
example: 20000.0
required: false
schema:
type: number
description: 'Minimum parking price.'
example: 20000.0
nullable: true
-
in: query
name: parking_price_max
description: 'Maximum parking price.'
example: 50000.0
required: false
schema:
type: number
description: 'Maximum parking price.'
example: 50000.0
nullable: true
-
in: query
name: locker_price_min
description: 'Minimum locker price.'
example: 2000.0
required: false
schema:
type: number
description: 'Minimum locker price.'
example: 2000.0
nullable: true
-
in: query
name: locker_price_max
description: 'Maximum locker price.'
example: 10000.0
required: false
schema:
type: number
description: 'Maximum locker price.'
example: 10000.0
nullable: true
-
in: query
name: deposit_min
description: 'Minimum deposit.'
example: 5.0
required: false
schema:
type: number
description: 'Minimum deposit.'
example: 5.0
nullable: true
-
in: query
name: deposit_max
description: 'Maximum deposit.'
example: 20.0
required: false
schema:
type: number
description: 'Maximum deposit.'
example: 20.0
nullable: true
-
in: query
name: developer
description: 'Filter by developer name.'
example: Tridel
required: false
schema:
type: string
description: 'Filter by developer name.'
example: Tridel
nullable: true
-
in: query
name: architect
description: 'Filter by architect name or slug.'
example: KPMB
required: false
schema:
type: string
description: 'Filter by architect name or slug.'
example: KPMB
nullable: true
-
in: query
name: sales_marketing_company
description: 'Filter by sales and marketing company.'
example: Baker
required: false
schema:
type: string
description: 'Filter by sales and marketing company.'
example: Baker
nullable: true
-
in: query
name: storeys_min
description: 'Minimum number of storeys.'
example: 10
required: false
schema:
type: integer
description: 'Minimum number of storeys.'
example: 10
nullable: true
-
in: query
name: storeys_max
description: 'Maximum number of storeys.'
example: 40
required: false
schema:
type: integer
description: 'Maximum number of storeys.'
example: 40
nullable: true
-
in: query
name: building_height_min
description: 'Minimum building height (meters).'
example: 50.0
required: false
schema:
type: number
description: 'Minimum building height (meters).'
example: 50.0
nullable: true
-
in: query
name: building_height_max
description: 'Maximum building height (meters).'
example: 150.0
required: false
schema:
type: number
description: 'Maximum building height (meters).'
example: 150.0
nullable: true
-
in: query
name: suites_min
description: 'Minimum number of suites.'
example: 100
required: false
schema:
type: integer
description: 'Minimum number of suites.'
example: 100
nullable: true
-
in: query
name: suites_max
description: 'Maximum number of suites.'
example: 300
required: false
schema:
type: integer
description: 'Maximum number of suites.'
example: 300
nullable: true
-
in: query
name: beds_min
description: 'Minimum number of bedrooms.'
example: 1
required: false
schema:
type: integer
description: 'Minimum number of bedrooms.'
example: 1
nullable: true
-
in: query
name: beds_max
description: 'Maximum number of bedrooms.'
example: 3
required: false
schema:
type: integer
description: 'Maximum number of bedrooms.'
example: 3
nullable: true
-
in: query
name: sort_by
description: 'Sort by field.'
example: price_per_sqft
required: false
schema:
type: string
description: 'Sort by field.'
example: price_per_sqft
nullable: true
enum:
- updated_at
- launch_date
- price_per_sqft
-
in: query
name: sort_direction
description: 'Sort direction. Options: asc, desc.'
example: asc
required: false
schema:
type: string
description: 'Sort direction. Options: asc, desc.'
example: asc
nullable: true
enum:
- asc
- desc
-
in: query
name: per_page
description: 'Number of projects per page. Default: 20. Max: 50. Must be at least 1. Must not be greater than 50.'
example: 50
required: false
schema:
type: integer
description: 'Number of projects per page. Default: 20. Max: 50. Must be at least 1. Must not be greater than 50.'
example: 50
nullable: true
-
in: query
name: page
description: 'The page number for pagination. Must be at least 1.'
example: 2
required: false
schema:
type: integer
description: 'The page number for pagination. Must be at least 1.'
example: 2
nullable: true
-
in: query
name: search
description: 'Comprehensive search across project name, description, developer name, city, district, and neighbourhood.'
example: 'Tridel downtown toronto'
required: false
schema:
type: string
description: 'Comprehensive search across project name, description, developer name, city, district, and neighbourhood.'
example: 'Tridel downtown toronto'
nullable: true
responses:
200:
description: 'Successful response'
content:
text/plain:
schema:
type: string
example: "{\n \"data\": {\n \"id\": 1,\n \"name\": \"Central Park Residences\",\n \"description\": \"A premium residential complex in downtown.\",\n \"media\": [\n url,\n ..\n ]\",\n \"completion_year\": 2025,\n \"status\": \"pre-sale\",\n \"city_id\": 3,\n \"city_name\": \"Toronto\",\n \"deposit_with_time\": null,\n \"deposit_full\": null,\n \"deposit\": null,\n \"size\": null,\n \"launch_price\": null,\n \"district_id\": 5,\n \"district_name\": \"Downtown\",\n \"neighbourhood_id\": 17,\n \"neighbourhood_name\": \"Financial District\",\n \"architect_id\": 4,\n \"interior_designer_id\": 2,\n \"developer_id\": 7,\n \"developer_name\": \"Tridel Corporation\",\n \"storeys\": 25,\n \"suites\": null,\n \"units\": 120,\n \"development_status\": \"in progress\",\n \"building_type\": \"Condominium\",\n \"building_height_m\": 75,\n \"underground_levels\": null,\n \"launch_date\": \"2024-08-01\",\n \"occupancy_date\": \"2026-05-01\",\n \"address\": \"123 Main St, Downtown\",\n \"google_map_link\": null,\n \"walk_score\": 87,\n \"transit_score\": 90,\n \"location\": null,\n \"current_price_from\": 650000,\n \"current_price_to\": 1200000,\n \"total_parking\": null,\n \"residential_parking\": null,\n \"parking_ratio\": null,\n \"residential_parking_ratio\": null,\n \"visitor_parking\": null,\n \"industrial_parking\": null,\n \"office_parking\": null,\n \"retail_parking\": null,\n \"bike_parking\": null,\n \"parking_price\": null,\n \"parking_details\": null,\n \"locker_price\": null,\n \"locker_details\": null,\n \"current_sales_status\": null,\n \"launch_psf_avg\": null,\n \"maintenance_fees\": null,\n \"maintenance_fees_details\": null,\n \"floorplan_premiums\": null,\n \"development_charges\": null,\n \"google_drive_portal\": null,\n \"amenities\": \"Pool,Gym,Concierge,Parking\",\n \"gfa\": null,\n \"price_per_sqft\": null,\n \"bedrooms_info\": null,\n \"bedrooms\": \"1-bedroom: 45 units, 2-bedroom: 60 units, 3-bedroom: 15 units\",\n \"bedrooms_percents\": \"1-bedroom: 37.5%, 2-bedroom: 50%, 3-bedroom: 12.5%\",\n \"highlights\": \"Premium location, Modern amenities, Panoramic city views\",\n \"launch_price_project\": 480000,\n \"created_at\": \"2024-05-01T08:13:17.000000Z\",\n \"updated_at\": \"2024-05-15T08:13:17.000000Z\"\n }\n}"
tags:
- Endpoints
parameters:
-
in: path
name: id
description: 'The ID of the project.'
example: 1
required: true
schema:
type: integer
'/api/v1/projects/{project_id}/floorplans':
get:
summary: 'List all floorplans for a project'
operationId: listAllFloorplansForAProject
description: 'Retrieve a list of all available floorplans for a specific project with pagination.'
parameters:
-
in: query
name: name
description: 'Filter by project name.'
example: 'Aurora Hills'
required: false
schema:
type: string
description: 'Filter by project name.'
example: 'Aurora Hills'
nullable: true
-
in: query
name: city
description: 'Filter by city, can be comma-separated ID or name value.'
example: '111,222,333'
required: false
schema:
type: string
description: 'Filter by city, can be comma-separated ID or name value.'
example: '111,222,333'
nullable: true
-
in: query
name: district
description: 'Filter by district, can be comma-separated ID or name value.'
example: '111,222,333'
required: false
schema:
type: string
description: 'Filter by district, can be comma-separated ID or name value.'
example: '111,222,333'
nullable: true
-
in: query
name: neighbourhood
description: 'Filter by neighbourhood, can be comma-separated ID or name value.'
example: '111,222,333'
required: false
schema:
type: string
description: 'Filter by neighbourhood, can be comma-separated ID or name value.'
example: '111,222,333'
nullable: true
-
in: query
name: sales_status
description: 'Filter by sales status.'
example: Selling
required: false
schema:
type: string
description: 'Filter by sales status.'
example: Selling
nullable: true
enum:
- Cancelled
- 'Developer Sold Out'
- 'Launching Soon'
- 'On Hold'
- 'Platinum Access & Selling'
- 'Registration Phase'
- Resale
- Selling
-
in: query
name: construction_status
description: 'Filter by construction status.'
example: 'Under Construction'
required: false
schema:
type: string
description: 'Filter by construction status.'
example: 'Under Construction'
nullable: true
enum:
- Complete
- Pre-Construction
- 'Under Construction'
- Cancelled
-
in: query
name: type
description: 'Filter by building type.'
example: Condo
required: false
schema:
type: string
description: 'Filter by building type.'
example: Condo
nullable: true
enum:
- 'Single Family Home'
- Condo
- Townhouse
-
in: query
name: occupancy_date_min
description: 'Minimum occupancy date (YYYY-MM-DD). Must be a valid date.'
example: '2025-01-01'
required: false
schema:
type: string
description: 'Minimum occupancy date (YYYY-MM-DD). Must be a valid date.'
example: '2025-01-01'
nullable: true
-
in: query
name: occupancy_date_max
description: 'Maximum occupancy date (YYYY-MM-DD). Must be a valid date.'
example: '2026-01-01'
required: false
schema:
type: string
description: 'Maximum occupancy date (YYYY-MM-DD). Must be a valid date.'
example: '2026-01-01'
nullable: true
-
in: query
name: launch_date_min
description: 'Minimum launch date (YYYY-MM-DD). Must be a valid date.'
example: '2024-01-01'
required: false
schema:
type: string
description: 'Minimum launch date (YYYY-MM-DD). Must be a valid date.'
example: '2024-01-01'
nullable: true
-
in: query
name: launch_date_max
description: 'Maximum launch date (YYYY-MM-DD). Must be a valid date.'
example: '2024-12-31'
required: false
schema:
type: string
description: 'Maximum launch date (YYYY-MM-DD). Must be a valid date.'
example: '2024-12-31'
nullable: true
-
in: query
name: launch_psf_avg_min
description: 'Minimum launch price per square foot average.'
example: 1000.0
required: false
schema:
type: number
description: 'Minimum launch price per square foot average.'
example: 1000.0
nullable: true
-
in: query
name: launch_psf_avg_max
description: 'Maximum launch price per square foot average.'
example: 2000.0
required: false
schema:
type: number
description: 'Maximum launch price per square foot average.'
example: 2000.0
nullable: true
-
in: query
name: launch_price_min
description: 'Minimum launch price.'
example: 300000.0
required: false
schema:
type: number
description: 'Minimum launch price.'
example: 300000.0
nullable: true
-
in: query
name: launch_price_max
description: 'Maximum launch price.'
example: 900000.0
required: false
schema:
type: number
description: 'Maximum launch price.'
example: 900000.0
nullable: true
-
in: query
name: price_per_sqft_min
description: 'Minimum price per square foot.'
example: 1000.0
required: false
schema:
type: number
description: 'Minimum price per square foot.'
example: 1000.0
nullable: true
-
in: query
name: price_per_sqft_max
description: 'Maximum price per square foot.'
example: 2000.0
required: false
schema:
type: number
description: 'Maximum price per square foot.'
example: 2000.0
nullable: true
-
in: query
name: current_price_min
description: 'Minimum current price.'
example: 400000.0
required: false
schema:
type: number
description: 'Minimum current price.'
example: 400000.0
nullable: true
-
in: query
name: current_price_max
description: 'Maximum current price.'
example: 800000.0
required: false
schema:
type: number
description: 'Maximum current price.'
example: 800000.0
nullable: true
-
in: query
name: interior_size_min
description: 'Minimum interior size.'
example: 500.0
required: false
schema:
type: number
description: 'Minimum interior size.'
example: 500.0
nullable: true
-
in: query
name: interior_size_max
description: 'Maximum interior size.'
example: 2000.0
required: false
schema:
type: number
description: 'Maximum interior size.'
example: 2000.0
nullable: true
-
in: query
name: maintenance_fees_min
description: 'Minimum maintenance fees.'
example: 0.5
required: false
schema:
type: number
description: 'Minimum maintenance fees.'
example: 0.5
nullable: true
-
in: query
name: maintenance_fees_max
description: 'Maximum maintenance fees.'
example: 1.5
required: false
schema:
type: number
description: 'Maximum maintenance fees.'
example: 1.5
nullable: true
-
in: query
name: parking_price_min
description: 'Minimum parking price.'
example: 20000.0
required: false
schema:
type: number
description: 'Minimum parking price.'
example: 20000.0
nullable: true
-
in: query
name: parking_price_max
description: 'Maximum parking price.'
example: 50000.0
required: false
schema:
type: number
description: 'Maximum parking price.'
example: 50000.0
nullable: true
-
in: query
name: locker_price_min
description: 'Minimum locker price.'
example: 2000.0
required: false
schema:
type: number
description: 'Minimum locker price.'
example: 2000.0
nullable: true
-
in: query
name: locker_price_max
description: 'Maximum locker price.'
example: 10000.0
required: false
schema:
type: number
description: 'Maximum locker price.'
example: 10000.0
nullable: true
-
in: query
name: deposit_min
description: 'Minimum deposit.'
example: 5.0
required: false
schema:
type: number
description: 'Minimum deposit.'
example: 5.0
nullable: true
-
in: query
name: deposit_max
description: 'Maximum deposit.'
example: 20.0
required: false
schema:
type: number
description: 'Maximum deposit.'
example: 20.0
nullable: true
-
in: query
name: developer
description: 'Filter by developer name.'
example: Tridel
required: false
schema:
type: string
description: 'Filter by developer name.'
example: Tridel
nullable: true
-
in: query
name: architect
description: 'Filter by architect name or slug.'
example: KPMB
required: false
schema:
type: string
description: 'Filter by architect name or slug.'
example: KPMB
nullable: true
-
in: query
name: sales_marketing_company
description: 'Filter by sales and marketing company.'
example: Baker
required: false
schema:
type: string
description: 'Filter by sales and marketing company.'
example: Baker
nullable: true
-
in: query
name: storeys_min
description: 'Minimum number of storeys.'
example: 10
required: false
schema:
type: integer
description: 'Minimum number of storeys.'
example: 10
nullable: true
-
in: query
name: storeys_max
description: 'Maximum number of storeys.'
example: 40
required: false
schema:
type: integer
description: 'Maximum number of storeys.'
example: 40
nullable: true
-
in: query
name: building_height_min
description: 'Minimum building height (meters).'
example: 50.0
required: false
schema:
type: number
description: 'Minimum building height (meters).'
example: 50.0
nullable: true
-
in: query
name: building_height_max
description: 'Maximum building height (meters).'
example: 150.0
required: false
schema:
type: number
description: 'Maximum building height (meters).'
example: 150.0
nullable: true
-
in: query
name: suites_min
description: 'Minimum number of suites.'
example: 100
required: false
schema:
type: integer
description: 'Minimum number of suites.'
example: 100
nullable: true
-
in: query
name: suites_max
description: 'Maximum number of suites.'
example: 300
required: false
schema:
type: integer
description: 'Maximum number of suites.'
example: 300
nullable: true
-
in: query
name: beds_min
description: 'Minimum number of bedrooms.'
example: 1
required: false
schema:
type: integer
description: 'Minimum number of bedrooms.'
example: 1
nullable: true
-
in: query
name: beds_max
description: 'Maximum number of bedrooms.'
example: 3
required: false
schema:
type: integer
description: 'Maximum number of bedrooms.'
example: 3
nullable: true
-
in: query
name: sort_by
description: 'Sort by field.'
example: price_per_sqft
required: false
schema:
type: string
description: 'Sort by field.'
example: price_per_sqft
nullable: true
enum:
- updated_at
- launch_date
- price_per_sqft
-
in: query
name: sort_direction
description: 'Sort direction. Options: asc, desc.'
example: asc
required: false
schema:
type: string
description: 'Sort direction. Options: asc, desc.'
example: asc
nullable: true
enum:
- asc
- desc
-
in: query
name: per_page
description: 'Number of floorplans per page. Default: 20. Max: 50.'
example: 50
required: false
schema:
type: integer
description: 'Number of floorplans per page. Default: 20. Max: 50.'
example: 50
nullable: true
-
in: query
name: page
description: 'The page number for pagination.'
example: 2
required: false
schema:
type: integer
description: 'The page number for pagination.'
example: 2
nullable: true
-
in: query
name: search
description: 'Comprehensive search across project name, description, developer name, city, district, and neighbourhood.'
example: 'Tridel downtown toronto'
required: false
schema:
type: string
description: 'Comprehensive search across project name, description, developer name, city, district, and neighbourhood.'
example: 'Tridel downtown toronto'
nullable: true
responses:
200:
description: 'Successful response'
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
project_id: 5
name: '2 Bedroom Suite'
bedrooms: 2
bathrooms: 2
size: '950'
image_url: 'https://example.com/floorplans/2br.jpg'
exposure: East
floor_range: 10-15
availability: Available
current_price: 820000
current_price_date: '2024-05-22'
current_psf: 1100
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
links:
first: 'http://your-app.test/api/v1/projects/5/floorplans?page=1'
last: 'http://your-app.test/api/v1/projects/5/floorplans?page=5'
prev: null
next: 'http://your-app.test/api/v1/projects/5/floorplans?page=2'
meta:
current_page: 1
from: 1
last_page: 5
path: 'http://your-app.test/api/v1/projects/5/floorplans'
per_page: 20
to: 20
total: 100
properties:
data:
type: array
example:
-
id: 1
project_id: 5
name: '2 Bedroom Suite'
bedrooms: 2
bathrooms: 2
size: '950'
image_url: 'https://example.com/floorplans/2br.jpg'
exposure: East
floor_range: 10-15
availability: Available
current_price: 820000
current_price_date: '2024-05-22'
current_psf: 1100
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
items:
type: object
properties:
id:
type: integer
example: 1
project_id:
type: integer
example: 5
name:
type: string
example: '2 Bedroom Suite'
bedrooms:
type: integer
example: 2
bathrooms:
type: integer
example: 2
size:
type: string
example: '950'
image_url:
type: string
example: 'https://example.com/floorplans/2br.jpg'
exposure:
type: string
example: East
floor_range:
type: string
example: 10-15
availability:
type: string
example: Available
current_price:
type: integer
example: 820000
current_price_date:
type: string
example: '2024-05-22'
current_psf:
type: integer
example: 1100
created_at:
type: string
example: '2024-05-01T08:13:17.000000Z'
updated_at:
type: string
example: '2024-05-15T08:13:17.000000Z'
links:
type: object
properties:
first:
type: string
example: 'http://your-app.test/api/v1/projects/5/floorplans?page=1'
last:
type: string
example: 'http://your-app.test/api/v1/projects/5/floorplans?page=5'
prev:
type: string
example: null
next:
type: string
example: 'http://your-app.test/api/v1/projects/5/floorplans?page=2'
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 5
path:
type: string
example: 'http://your-app.test/api/v1/projects/5/floorplans'
per_page:
type: integer
example: 20
to:
type: integer
example: 20
total:
type: integer
example: 100
tags:
- Endpoints
parameters:
-
in: path
name: project_id
description: 'The ID of the project.'
example: 5
required: true
schema:
type: integer
'/api/v1/projects/{project_id}/floorplans/{floorplan_id}':
get:
summary: 'Get a single floorplan in a project'
operationId: getASingleFloorplanInAProject
description: 'Retrieve detailed information about a specific floorplan by ID within a given project.'
parameters:
-
in: query
name: name
description: 'Filter by project name.'
example: 'Aurora Hills'
required: false
schema:
type: string
description: 'Filter by project name.'
example: 'Aurora Hills'
nullable: true
-
in: query
name: city
description: 'Filter by city, can be comma-separated ID or name value.'
example: '111,222,333'
required: false
schema:
type: string
description: 'Filter by city, can be comma-separated ID or name value.'
example: '111,222,333'
nullable: true
-
in: query
name: district
description: 'Filter by district, can be comma-separated ID or name value.'
example: '111,222,333'
required: false
schema:
type: string
description: 'Filter by district, can be comma-separated ID or name value.'
example: '111,222,333'
nullable: true
-
in: query
name: neighbourhood
description: 'Filter by neighbourhood, can be comma-separated ID or name value.'
example: '111,222,333'
required: false
schema:
type: string
description: 'Filter by neighbourhood, can be comma-separated ID or name value.'
example: '111,222,333'
nullable: true
-
in: query
name: sales_status
description: 'Filter by sales status.'
example: Selling
required: false
schema:
type: string
description: 'Filter by sales status.'
example: Selling
nullable: true
enum:
- Cancelled
- 'Developer Sold Out'
- 'Launching Soon'
- 'On Hold'
- 'Platinum Access & Selling'
- 'Registration Phase'
- Resale
- Selling
-
in: query
name: construction_status
description: 'Filter by construction status.'
example: 'Under Construction'
required: false
schema:
type: string
description: 'Filter by construction status.'
example: 'Under Construction'
nullable: true
enum:
- Complete
- Pre-Construction
- 'Under Construction'
- Cancelled
-
in: query
name: type
description: 'Filter by building type.'
example: Condo
required: false
schema:
type: string
description: 'Filter by building type.'
example: Condo
nullable: true
enum:
- 'Single Family Home'
- Condo
- Townhouse
-
in: query
name: occupancy_date_min
description: 'Minimum occupancy date (YYYY-MM-DD). Must be a valid date.'
example: '2025-01-01'
required: false
schema:
type: string
description: 'Minimum occupancy date (YYYY-MM-DD). Must be a valid date.'
example: '2025-01-01'
nullable: true
-
in: query
name: occupancy_date_max
description: 'Maximum occupancy date (YYYY-MM-DD). Must be a valid date.'
example: '2026-01-01'
required: false
schema:
type: string
description: 'Maximum occupancy date (YYYY-MM-DD). Must be a valid date.'
example: '2026-01-01'
nullable: true
-
in: query
name: launch_date_min
description: 'Minimum launch date (YYYY-MM-DD). Must be a valid date.'
example: '2024-01-01'
required: false
schema:
type: string
description: 'Minimum launch date (YYYY-MM-DD). Must be a valid date.'
example: '2024-01-01'
nullable: true
-
in: query
name: launch_date_max
description: 'Maximum launch date (YYYY-MM-DD). Must be a valid date.'
example: '2024-12-31'
required: false
schema:
type: string
description: 'Maximum launch date (YYYY-MM-DD). Must be a valid date.'
example: '2024-12-31'
nullable: true
-
in: query
name: launch_psf_avg_min
description: 'Minimum launch price per square foot average.'
example: 1000.0
required: false
schema:
type: number
description: 'Minimum launch price per square foot average.'
example: 1000.0
nullable: true
-
in: query
name: launch_psf_avg_max
description: 'Maximum launch price per square foot average.'
example: 2000.0
required: false
schema:
type: number
description: 'Maximum launch price per square foot average.'
example: 2000.0
nullable: true
-
in: query
name: launch_price_min
description: 'Minimum launch price.'
example: 300000.0
required: false
schema:
type: number
description: 'Minimum launch price.'
example: 300000.0
nullable: true
-
in: query
name: launch_price_max
description: 'Maximum launch price.'
example: 900000.0
required: false
schema:
type: number
description: 'Maximum launch price.'
example: 900000.0
nullable: true
-
in: query
name: price_per_sqft_min
description: 'Minimum price per square foot.'
example: 1000.0
required: false
schema:
type: number
description: 'Minimum price per square foot.'
example: 1000.0
nullable: true
-
in: query
name: price_per_sqft_max
description: 'Maximum price per square foot.'
example: 2000.0
required: false
schema:
type: number
description: 'Maximum price per square foot.'
example: 2000.0
nullable: true
-
in: query
name: current_price_min
description: 'Minimum current price.'
example: 400000.0
required: false
schema:
type: number
description: 'Minimum current price.'
example: 400000.0
nullable: true
-
in: query
name: current_price_max
description: 'Maximum current price.'
example: 800000.0
required: false
schema:
type: number
description: 'Maximum current price.'
example: 800000.0
nullable: true
-
in: query
name: interior_size_min
description: 'Minimum interior size.'
example: 500.0
required: false
schema:
type: number
description: 'Minimum interior size.'
example: 500.0
nullable: true
-
in: query
name: interior_size_max
description: 'Maximum interior size.'
example: 2000.0
required: false
schema:
type: number
description: 'Maximum interior size.'
example: 2000.0
nullable: true
-
in: query
name: maintenance_fees_min
description: 'Minimum maintenance fees.'
example: 0.5
required: false
schema:
type: number
description: 'Minimum maintenance fees.'
example: 0.5
nullable: true
-
in: query
name: maintenance_fees_max
description: 'Maximum maintenance fees.'
example: 1.5
required: false
schema:
type: number
description: 'Maximum maintenance fees.'
example: 1.5
nullable: true
-
in: query
name: parking_price_min
description: 'Minimum parking price.'
example: 20000.0
required: false
schema:
type: number
description: 'Minimum parking price.'
example: 20000.0
nullable: true
-
in: query
name: parking_price_max
description: 'Maximum parking price.'
example: 50000.0
required: false
schema:
type: number
description: 'Maximum parking price.'
example: 50000.0
nullable: true
-
in: query
name: locker_price_min
description: 'Minimum locker price.'
example: 2000.0
required: false
schema:
type: number
description: 'Minimum locker price.'
example: 2000.0
nullable: true
-
in: query
name: locker_price_max
description: 'Maximum locker price.'
example: 10000.0
required: false
schema:
type: number
description: 'Maximum locker price.'
example: 10000.0
nullable: true
-
in: query
name: deposit_min
description: 'Minimum deposit.'
example: 5.0
required: false
schema:
type: number
description: 'Minimum deposit.'
example: 5.0
nullable: true
-
in: query
name: deposit_max
description: 'Maximum deposit.'
example: 20.0
required: false
schema:
type: number
description: 'Maximum deposit.'
example: 20.0
nullable: true
-
in: query
name: developer
description: 'Filter by developer name.'
example: Tridel
required: false
schema:
type: string
description: 'Filter by developer name.'
example: Tridel
nullable: true
-
in: query
name: architect
description: 'Filter by architect name or slug.'
example: KPMB
required: false
schema:
type: string
description: 'Filter by architect name or slug.'
example: KPMB
nullable: true
-
in: query
name: sales_marketing_company
description: 'Filter by sales and marketing company.'
example: Baker
required: false
schema:
type: string
description: 'Filter by sales and marketing company.'
example: Baker
nullable: true
-
in: query
name: storeys_min
description: 'Minimum number of storeys.'
example: 10
required: false
schema:
type: integer
description: 'Minimum number of storeys.'
example: 10
nullable: true
-
in: query
name: storeys_max
description: 'Maximum number of storeys.'
example: 40
required: false
schema:
type: integer
description: 'Maximum number of storeys.'
example: 40
nullable: true
-
in: query
name: building_height_min
description: 'Minimum building height (meters).'
example: 50.0
required: false
schema:
type: number
description: 'Minimum building height (meters).'
example: 50.0
nullable: true
-
in: query
name: building_height_max
description: 'Maximum building height (meters).'
example: 150.0
required: false
schema:
type: number
description: 'Maximum building height (meters).'
example: 150.0
nullable: true
-
in: query
name: suites_min
description: 'Minimum number of suites.'
example: 100
required: false
schema:
type: integer
description: 'Minimum number of suites.'
example: 100
nullable: true
-
in: query
name: suites_max
description: 'Maximum number of suites.'
example: 300
required: false
schema:
type: integer
description: 'Maximum number of suites.'
example: 300
nullable: true
-
in: query
name: beds_min
description: 'Minimum number of bedrooms.'
example: 1
required: false
schema:
type: integer
description: 'Minimum number of bedrooms.'
example: 1
nullable: true
-
in: query
name: beds_max
description: 'Maximum number of bedrooms.'
example: 3
required: false
schema:
type: integer
description: 'Maximum number of bedrooms.'
example: 3
nullable: true
-
in: query
name: sort_by
description: 'Sort by field.'
example: price_per_sqft
required: false
schema:
type: string
description: 'Sort by field.'
example: price_per_sqft
nullable: true
enum:
- updated_at
- launch_date
- price_per_sqft
-
in: query
name: sort_direction
description: 'Sort direction. Options: asc, desc.'
example: asc
required: false
schema:
type: string
description: 'Sort direction. Options: asc, desc.'
example: asc
nullable: true
enum:
- asc
- desc
-
in: query
name: per_page
description: 'Number of projects per page. Default: 20. Max: 50. Must be at least 1. Must not be greater than 50.'
example: 50
required: false
schema:
type: integer
description: 'Number of projects per page. Default: 20. Max: 50. Must be at least 1. Must not be greater than 50.'
example: 50
nullable: true
-
in: query
name: page
description: 'The page number for pagination. Must be at least 1.'
example: 2
required: false
schema:
type: integer
description: 'The page number for pagination. Must be at least 1.'
example: 2
nullable: true
-
in: query
name: search
description: 'Comprehensive search across project name, description, developer name, city, district, and neighbourhood.'
example: 'Tridel downtown toronto'
required: false
schema:
type: string
description: 'Comprehensive search across project name, description, developer name, city, district, and neighbourhood.'
example: 'Tridel downtown toronto'
nullable: true
responses:
200:
description: 'Successful response'
content:
application/json:
schema:
type: object
example:
data:
id: 1
project_id: 5
name: '2 Bedroom Suite'
bedrooms: 2
bathrooms: 2
size: '950'
image_url: 'https://example.com/floorplans/2br.jpg'
exposure: East
floor_range: 10-15
availability: Available
current_price: 820000
current_price_date: '2024-05-22'
current_psf: 1100
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
properties:
data:
type: object
properties:
id:
type: integer
example: 1
project_id:
type: integer
example: 5
name:
type: string
example: '2 Bedroom Suite'
bedrooms:
type: integer
example: 2
bathrooms:
type: integer
example: 2
size:
type: string
example: '950'
image_url:
type: string
example: 'https://example.com/floorplans/2br.jpg'
exposure:
type: string
example: East
floor_range:
type: string
example: 10-15
availability:
type: string
example: Available
current_price:
type: integer
example: 820000
current_price_date:
type: string
example: '2024-05-22'
current_psf:
type: integer
example: 1100
created_at:
type: string
example: '2024-05-01T08:13:17.000000Z'
updated_at:
type: string
example: '2024-05-15T08:13:17.000000Z'
tags:
- Endpoints
parameters:
-
in: path
name: project_id
description: 'The ID of the project.'
example: 5
required: true
schema:
type: integer
-
in: path
name: floorplan_id
description: 'The ID of the floorplan.'
example: 1
required: true
schema:
type: integer
'/api/v1/projects/{project_id}/documents':
get:
summary: 'List all documents for a project'
operationId: listAllDocumentsForAProject
description: 'Retrieve a list of all documents for a specific project with pagination.'
parameters:
-
in: query
name: page
description: 'The page number for pagination.'
example: 2
required: false
schema:
type: integer
description: 'The page number for pagination.'
example: 2
nullable: false
-
in: query
name: per_page
description: 'Number of documents per page. Default: 20. Max: 50.'
example: 50
required: false
schema:
type: integer
description: 'Number of documents per page. Default: 20. Max: 50.'
example: 50
nullable: false
responses:
200:
description: 'Successful response'
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
project_id: 5
name: Brochure
document_type: PDF
file_url: 'https://example.com/storage/documents/brochure.pdf'
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
links:
first: 'http://your-app.test/api/v1/projects/5/documents?page=1'
last: 'http://your-app.test/api/v1/projects/5/documents?page=5'
prev: null
next: 'http://your-app.test/api/v1/projects/5/documents?page=2'
meta:
current_page: 1
from: 1
last_page: 5
path: 'http://your-app.test/api/v1/projects/5/documents'
per_page: 20
to: 20
total: 100
properties:
data:
type: array
example:
-
id: 1
project_id: 5
name: Brochure
document_type: PDF
file_url: 'https://example.com/storage/documents/brochure.pdf'
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
items:
type: object
properties:
id:
type: integer
example: 1
project_id:
type: integer
example: 5
name:
type: string
example: Brochure
document_type:
type: string
example: PDF
file_url:
type: string
example: 'https://example.com/storage/documents/brochure.pdf'
created_at:
type: string
example: '2024-05-01T08:13:17.000000Z'
updated_at:
type: string
example: '2024-05-15T08:13:17.000000Z'
links:
type: object
properties:
first:
type: string
example: 'http://your-app.test/api/v1/projects/5/documents?page=1'
last:
type: string
example: 'http://your-app.test/api/v1/projects/5/documents?page=5'
prev:
type: string
example: null
next:
type: string
example: 'http://your-app.test/api/v1/projects/5/documents?page=2'
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 5
path:
type: string
example: 'http://your-app.test/api/v1/projects/5/documents'
per_page:
type: integer
example: 20
to:
type: integer
example: 20
total:
type: integer
example: 100
tags:
- Endpoints
parameters:
-
in: path
name: project_id
description: 'The ID of the project.'
example: 5
required: true
schema:
type: integer
'/api/v1/projects/{project_id}/documents/{document_id}':
get:
summary: 'Get a single document in a project'
operationId: getASingleDocumentInAProject
description: 'Retrieve detailed information about a document by its ID within a given project.'
parameters: []
responses:
200:
description: 'Successful response'
content:
application/json:
schema:
type: object
example:
data:
id: 1
project_id: 5
name: Brochure
document_type: PDF
file_url: 'https://example.com/storage/documents/brochure.pdf'
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
properties:
data:
type: object
properties:
id:
type: integer
example: 1
project_id:
type: integer
example: 5
name:
type: string
example: Brochure
document_type:
type: string
example: PDF
file_url:
type: string
example: 'https://example.com/storage/documents/brochure.pdf'
created_at:
type: string
example: '2024-05-01T08:13:17.000000Z'
updated_at:
type: string
example: '2024-05-15T08:13:17.000000Z'
tags:
- Endpoints
parameters:
-
in: path
name: project_id
description: 'The ID of the project.'
example: 5
required: true
schema:
type: integer
-
in: path
name: document_id
description: 'The ID of the document.'
example: 1
required: true
schema:
type: integer
/api/v1/architects:
get:
summary: 'List all architects'
operationId: listAllArchitects
description: 'Retrieve a collection of all architects with pagination.'
parameters:
-
in: query
name: search
description: 'Search architects by name.'
example: Zaha
required: false
schema:
type: string
description: 'Search architects by name.'
example: Zaha
nullable: false
-
in: query
name: page
description: 'The page number for pagination.'
example: 2
required: false
schema:
type: integer
description: 'The page number for pagination.'
example: 2
nullable: false
-
in: query
name: per_page
description: 'Number of architects per page. Default: 20. Max: 50.'
example: 50
required: false
schema:
type: integer
description: 'Number of architects per page. Default: 20. Max: 50.'
example: 50
nullable: false
responses:
200:
description: 'Successful response'
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
name: 'Zaha Hadid'
slug: zaha-hadid
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
links:
first: 'http://your-app.test/api/v1/architects?page=1'
last: 'http://your-app.test/api/v1/architects?page=5'
prev: null
next: 'http://your-app.test/api/v1/architects?page=2'
meta:
current_page: 1
from: 1
last_page: 5
path: 'http://your-app.test/api/v1/architects'
per_page: 20
to: 20
total: 100
properties:
data:
type: array
example:
-
id: 1
name: 'Zaha Hadid'
slug: zaha-hadid
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
items:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: 'Zaha Hadid'
slug:
type: string
example: zaha-hadid
created_at:
type: string
example: '2024-05-01T08:13:17.000000Z'
updated_at:
type: string
example: '2024-05-15T08:13:17.000000Z'
links:
type: object
properties:
first:
type: string
example: 'http://your-app.test/api/v1/architects?page=1'
last:
type: string
example: 'http://your-app.test/api/v1/architects?page=5'
prev:
type: string
example: null
next:
type: string
example: 'http://your-app.test/api/v1/architects?page=2'
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 5
path:
type: string
example: 'http://your-app.test/api/v1/architects'
per_page:
type: integer
example: 20
to:
type: integer
example: 20
total:
type: integer
example: 100
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Endpoints
'/api/v1/architects/{id}':
get:
summary: 'Get a single architect'
operationId: getASingleArchitect
description: 'Retrieve details of a specific architect by their unique ID.'
parameters: []
responses:
200:
description: 'Successful response'
content:
application/json:
schema:
type: object
example:
data:
id: 1
name: 'Zaha Hadid'
slug: zaha-hadid
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
properties:
data:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: 'Zaha Hadid'
slug:
type: string
example: zaha-hadid
created_at:
type: string
example: '2024-05-01T08:13:17.000000Z'
updated_at:
type: string
example: '2024-05-15T08:13:17.000000Z'
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Endpoints
parameters:
-
in: path
name: id
description: 'The ID of the architect.'
example: 1
required: true
schema:
type: integer
/api/v1/cities:
get:
summary: 'List all cities'
operationId: listAllCities
description: 'Retrieve a collection of all cities with pagination.'
parameters:
-
in: query
name: search
description: 'Search cities by name.'
example: Toronto
required: false
schema:
type: string
description: 'Search cities by name.'
example: Toronto
nullable: false
-
in: query
name: page
description: 'The page number for pagination.'
example: 2
required: false
schema:
type: integer
description: 'The page number for pagination.'
example: 2
nullable: false
-
in: query
name: per_page
description: 'Number of cities per page. Default: 20. Max: 50.'
example: 50
required: false
schema:
type: integer
description: 'Number of cities per page. Default: 20. Max: 50.'
example: 50
nullable: false
responses:
200:
description: 'Successful response'
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
name: Toronto
slug: toronto
description: 'The largest city in Canada.'
google_map_url: 'https://maps.google.com/?q=Toronto'
map_geometry: MULTIPOLYGON(((...)))
center: '43.6532,-79.3832'
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
links:
first: 'http://your-app.test/api/v1/cities?page=1'
last: 'http://your-app.test/api/v1/cities?page=5'
prev: null
next: 'http://your-app.test/api/v1/cities?page=2'
meta:
current_page: 1
from: 1
last_page: 5
path: 'http://your-app.test/api/v1/cities'
per_page: 20
to: 20
total: 100
properties:
data:
type: array
example:
-
id: 1
name: Toronto
slug: toronto
description: 'The largest city in Canada.'
google_map_url: 'https://maps.google.com/?q=Toronto'
map_geometry: MULTIPOLYGON(((...)))
center: '43.6532,-79.3832'
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
items:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: Toronto
slug:
type: string
example: toronto
description:
type: string
example: 'The largest city in Canada.'
google_map_url:
type: string
example: 'https://maps.google.com/?q=Toronto'
map_geometry:
type: string
example: MULTIPOLYGON(((...)))
center:
type: string
example: '43.6532,-79.3832'
created_at:
type: string
example: '2024-05-01T08:13:17.000000Z'
updated_at:
type: string
example: '2024-05-15T08:13:17.000000Z'
links:
type: object
properties:
first:
type: string
example: 'http://your-app.test/api/v1/cities?page=1'
last:
type: string
example: 'http://your-app.test/api/v1/cities?page=5'
prev:
type: string
example: null
next:
type: string
example: 'http://your-app.test/api/v1/cities?page=2'
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 5
path:
type: string
example: 'http://your-app.test/api/v1/cities'
per_page:
type: integer
example: 20
to:
type: integer
example: 20
total:
type: integer
example: 100
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Endpoints
'/api/v1/cities/{id}':
get:
summary: 'Get a single city'
operationId: getASingleCity
description: 'Retrieve details of a specific city by its unique ID.'
parameters: []
responses:
200:
description: 'Successful response'
content:
application/json:
schema:
type: object
example:
data:
id: 1
name: Toronto
slug: toronto
description: 'The largest city in Canada.'
google_map_url: 'https://maps.google.com/?q=Toronto'
map_geometry: MULTIPOLYGON(((...)))
center: '43.6532,-79.3832'
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
properties:
data:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: Toronto
slug:
type: string
example: toronto
description:
type: string
example: 'The largest city in Canada.'
google_map_url:
type: string
example: 'https://maps.google.com/?q=Toronto'
map_geometry:
type: string
example: MULTIPOLYGON(((...)))
center:
type: string
example: '43.6532,-79.3832'
created_at:
type: string
example: '2024-05-01T08:13:17.000000Z'
updated_at:
type: string
example: '2024-05-15T08:13:17.000000Z'
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Endpoints
parameters:
-
in: path
name: id
description: 'The ID of the city.'
example: 1
required: true
schema:
type: integer
/api/v1/developers:
get:
summary: 'List all developers'
operationId: listAllDevelopers
description: 'Retrieve a collection of all developers with pagination.'
parameters:
-
in: query
name: search
description: 'Search developers by name.'
example: Great
required: false
schema:
type: string
description: 'Search developers by name.'
example: Great
nullable: false
-
in: query
name: page
description: 'The page number for pagination.'
example: 2
required: false
schema:
type: integer
description: 'The page number for pagination.'
example: 2
nullable: false
-
in: query
name: per_page
description: 'Number of developers per page. Default: 20. Max: 50.'
example: 50
required: false
schema:
type: integer
description: 'Number of developers per page. Default: 20. Max: 50.'
example: 50
nullable: false
responses:
200:
description: 'Successful response'
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
name: 'Great Builders Ltd.'
slug: great-builders-ltd
website: 'https://greatbuilders.example.com'
logo: 'https://example.com/storage/logos/greatbuilders.png'
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
links:
first: 'http://your-app.test/api/v1/developers?page=1'
last: 'http://your-app.test/api/v1/developers?page=5'
prev: null
next: 'http://your-app.test/api/v1/developers?page=2'
meta:
current_page: 1
from: 1
last_page: 5
path: 'http://your-app.test/api/v1/developers'
per_page: 20
to: 20
total: 100
properties:
data:
type: array
example:
-
id: 1
name: 'Great Builders Ltd.'
slug: great-builders-ltd
website: 'https://greatbuilders.example.com'
logo: 'https://example.com/storage/logos/greatbuilders.png'
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
items:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: 'Great Builders Ltd.'
slug:
type: string
example: great-builders-ltd
website:
type: string
example: 'https://greatbuilders.example.com'
logo:
type: string
example: 'https://example.com/storage/logos/greatbuilders.png'
created_at:
type: string
example: '2024-05-01T08:13:17.000000Z'
updated_at:
type: string
example: '2024-05-15T08:13:17.000000Z'
links:
type: object
properties:
first:
type: string
example: 'http://your-app.test/api/v1/developers?page=1'
last:
type: string
example: 'http://your-app.test/api/v1/developers?page=5'
prev:
type: string
example: null
next:
type: string
example: 'http://your-app.test/api/v1/developers?page=2'
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 5
path:
type: string
example: 'http://your-app.test/api/v1/developers'
per_page:
type: integer
example: 20
to:
type: integer
example: 20
total:
type: integer
example: 100
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Endpoints
'/api/v1/developers/{id}':
get:
summary: 'Get a single developer'
operationId: getASingleDeveloper
description: 'Retrieve details of a specific developer by its unique ID.'
parameters: []
responses:
200:
description: 'Successful response'
content:
application/json:
schema:
type: object
example:
data:
id: 1
name: 'Great Builders Ltd.'
website: 'https://greatbuilders.example.com'
logo: 'https://example.com/storage/logos/greatbuilders.png'
properties:
data:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: 'Great Builders Ltd.'
website:
type: string
example: 'https://greatbuilders.example.com'
logo:
type: string
example: 'https://example.com/storage/logos/greatbuilders.png'
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Endpoints
parameters:
-
in: path
name: id
description: 'The ID of the developer.'
example: 1
required: true
schema:
type: integer
/api/v1/districts:
get:
summary: 'List all districts'
operationId: listAllDistricts
description: 'Retrieve a collection of all districts with pagination.'
parameters:
-
in: query
name: search
description: 'Search districts by name.'
example: Central
required: false
schema:
type: string
description: 'Search districts by name.'
example: Central
nullable: false
-
in: query
name: page
description: 'The page number for pagination.'
example: 2
required: false
schema:
type: integer
description: 'The page number for pagination.'
example: 2
nullable: false
-
in: query
name: per_page
description: 'Number of districts per page. Default: 20. Max: 50.'
example: 50
required: false
schema:
type: integer
description: 'Number of districts per page. Default: 20. Max: 50.'
example: 50
nullable: false
responses:
200:
description: 'Successful response'
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
name: 'Central District'
slug: central-district
city_id: 1
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
links:
first: 'http://your-app.test/api/v1/districts?page=1'
last: 'http://your-app.test/api/v1/districts?page=5'
prev: null
next: 'http://your-app.test/api/v1/districts?page=2'
meta:
current_page: 1
from: 1
last_page: 5
path: 'http://your-app.test/api/v1/districts'
per_page: 20
to: 20
total: 100
properties:
data:
type: array
example:
-
id: 1
name: 'Central District'
slug: central-district
city_id: 1
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
items:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: 'Central District'
slug:
type: string
example: central-district
city_id:
type: integer
example: 1
created_at:
type: string
example: '2024-05-01T08:13:17.000000Z'
updated_at:
type: string
example: '2024-05-15T08:13:17.000000Z'
links:
type: object
properties:
first:
type: string
example: 'http://your-app.test/api/v1/districts?page=1'
last:
type: string
example: 'http://your-app.test/api/v1/districts?page=5'
prev:
type: string
example: null
next:
type: string
example: 'http://your-app.test/api/v1/districts?page=2'
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 5
path:
type: string
example: 'http://your-app.test/api/v1/districts'
per_page:
type: integer
example: 20
to:
type: integer
example: 20
total:
type: integer
example: 100
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Endpoints
'/api/v1/districts/{id}':
get:
summary: 'Get a single district'
operationId: getASingleDistrict
description: 'Retrieve details of a specific district by its unique ID.'
parameters: []
responses:
200:
description: 'Successful response'
content:
application/json:
schema:
type: object
example:
data:
id: 1
name: 'Central District'
slug: central-district
city_id: 1
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
properties:
data:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: 'Central District'
slug:
type: string
example: central-district
city_id:
type: integer
example: 1
created_at:
type: string
example: '2024-05-01T08:13:17.000000Z'
updated_at:
type: string
example: '2024-05-15T08:13:17.000000Z'
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Endpoints
parameters:
-
in: path
name: id
description: 'The ID of the district.'
example: 1
required: true
schema:
type: integer
/api/v1/interior-designers:
get:
summary: 'List all interior designers'
operationId: listAllInteriorDesigners
description: 'Retrieve a collection of all interior designers with pagination.'
parameters:
-
in: query
name: search
description: 'Search interior designers by name.'
example: Kelly
required: false
schema:
type: string
description: 'Search interior designers by name.'
example: Kelly
nullable: false
-
in: query
name: page
description: 'The page number for pagination.'
example: 2
required: false
schema:
type: integer
description: 'The page number for pagination.'
example: 2
nullable: false
-
in: query
name: per_page
description: 'Number of interior designers per page. Default: 20. Max: 50.'
example: 50
required: false
schema:
type: integer
description: 'Number of interior designers per page. Default: 20. Max: 50.'
example: 50
nullable: false
responses:
200:
description: 'Successful response'
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
name: 'Kelly Hoppen'
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
links:
first: 'http://your-app.test/api/v1/interior-designers?page=1'
last: 'http://your-app.test/api/v1/interior-designers?page=5'
prev: null
next: 'http://your-app.test/api/v1/interior-designers?page=2'
meta:
current_page: 1
from: 1
last_page: 5
path: 'http://your-app.test/api/v1/interior-designers'
per_page: 20
to: 20
total: 100
properties:
data:
type: array
example:
-
id: 1
name: 'Kelly Hoppen'
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
items:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: 'Kelly Hoppen'
created_at:
type: string
example: '2024-05-01T08:13:17.000000Z'
updated_at:
type: string
example: '2024-05-15T08:13:17.000000Z'
links:
type: object
properties:
first:
type: string
example: 'http://your-app.test/api/v1/interior-designers?page=1'
last:
type: string
example: 'http://your-app.test/api/v1/interior-designers?page=5'
prev:
type: string
example: null
next:
type: string
example: 'http://your-app.test/api/v1/interior-designers?page=2'
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 5
path:
type: string
example: 'http://your-app.test/api/v1/interior-designers'
per_page:
type: integer
example: 20
to:
type: integer
example: 20
total:
type: integer
example: 100
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Endpoints
'/api/v1/interior-designers/{id}':
get:
summary: 'Get a single interior designer'
operationId: getASingleInteriorDesigner
description: 'Retrieve details of a specific interior designer by their unique ID.'
parameters: []
responses:
200:
description: 'Successful response'
content:
application/json:
schema:
type: object
example:
data:
id: 1
name: 'Kelly Hoppen'
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
properties:
data:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: 'Kelly Hoppen'
created_at:
type: string
example: '2024-05-01T08:13:17.000000Z'
updated_at:
type: string
example: '2024-05-15T08:13:17.000000Z'
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Endpoints
parameters:
-
in: path
name: id
description: 'The ID of the interior designer.'
example: 1
required: true
schema:
type: integer
/api/v1/neighbourhoods:
get:
summary: 'List all neighbourhoods'
operationId: listAllNeighbourhoods
description: 'Retrieve a collection of all neighbourhoods with pagination.'
parameters:
-
in: query
name: search
description: 'Search neighbourhoods by name.'
example: Downtown
required: false
schema:
type: string
description: 'Search neighbourhoods by name.'
example: Downtown
nullable: false
-
in: query
name: page
description: 'The page number for pagination.'
example: 2
required: false
schema:
type: integer
description: 'The page number for pagination.'
example: 2
nullable: false
-
in: query
name: per_page
description: 'Number of neighbourhoods per page. Default: 20. Max: 50.'
example: 50
required: false
schema:
type: integer
description: 'Number of neighbourhoods per page. Default: 20. Max: 50.'
example: 50
nullable: false
responses:
200:
description: 'Successful response'
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
name: Downtown
slug: downtown
description: 'Central business district.'
google_map_url: 'https://maps.google.com/?q=Downtown'
map_geometry: MULTIPOLYGON(((...)))
center: '43.6500,-79.3800'
district_id: 1
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
links:
first: 'http://your-app.test/api/v1/neighbourhoods?page=1'
last: 'http://your-app.test/api/v1/neighbourhoods?page=5'
prev: null
next: 'http://your-app.test/api/v1/neighbourhoods?page=2'
meta:
current_page: 1
from: 1
last_page: 5
path: 'http://your-app.test/api/v1/neighbourhoods'
per_page: 20
to: 20
total: 100
properties:
data:
type: array
example:
-
id: 1
name: Downtown
slug: downtown
description: 'Central business district.'
google_map_url: 'https://maps.google.com/?q=Downtown'
map_geometry: MULTIPOLYGON(((...)))
center: '43.6500,-79.3800'
district_id: 1
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
items:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: Downtown
slug:
type: string
example: downtown
description:
type: string
example: 'Central business district.'
google_map_url:
type: string
example: 'https://maps.google.com/?q=Downtown'
map_geometry:
type: string
example: MULTIPOLYGON(((...)))
center:
type: string
example: '43.6500,-79.3800'
district_id:
type: integer
example: 1
created_at:
type: string
example: '2024-05-01T08:13:17.000000Z'
updated_at:
type: string
example: '2024-05-15T08:13:17.000000Z'
links:
type: object
properties:
first:
type: string
example: 'http://your-app.test/api/v1/neighbourhoods?page=1'
last:
type: string
example: 'http://your-app.test/api/v1/neighbourhoods?page=5'
prev:
type: string
example: null
next:
type: string
example: 'http://your-app.test/api/v1/neighbourhoods?page=2'
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 5
path:
type: string
example: 'http://your-app.test/api/v1/neighbourhoods'
per_page:
type: integer
example: 20
to:
type: integer
example: 20
total:
type: integer
example: 100
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Endpoints
'/api/v1/neighbourhoods/{id}':
get:
summary: 'Get a single neighbourhood'
operationId: getASingleNeighbourhood
description: 'Retrieve details of a specific neighbourhood by its unique ID.'
parameters: []
responses:
200:
description: 'Successful response'
content:
application/json:
schema:
type: object
example:
data:
id: 1
name: Downtown
slug: downtown
description: 'Central business district.'
google_map_url: 'https://maps.google.com/?q=Downtown'
map_geometry: MULTIPOLYGON(((...)))
center: '43.6500,-79.3800'
district_id: 1
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
properties:
data:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: Downtown
slug:
type: string
example: downtown
description:
type: string
example: 'Central business district.'
google_map_url:
type: string
example: 'https://maps.google.com/?q=Downtown'
map_geometry:
type: string
example: MULTIPOLYGON(((...)))
center:
type: string
example: '43.6500,-79.3800'
district_id:
type: integer
example: 1
created_at:
type: string
example: '2024-05-01T08:13:17.000000Z'
updated_at:
type: string
example: '2024-05-15T08:13:17.000000Z'
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Endpoints
parameters:
-
in: path
name: id
description: 'The ID of the neighbourhood.'
example: 1
required: true
schema:
type: integer
/api/v1/prices:
get:
summary: 'List all prices'
operationId: listAllPrices
description: 'Retrieve a collection of all prices with pagination.'
parameters:
-
in: query
name: page
description: 'The page number for pagination.'
example: 2
required: false
schema:
type: integer
description: 'The page number for pagination.'
example: 2
nullable: false
-
in: query
name: per_page
description: 'Number of prices per page. Default: 20. Max: 50.'
example: 50
required: false
schema:
type: integer
description: 'Number of prices per page. Default: 20. Max: 50.'
example: 50
nullable: false
-
in: query
name: projects_id
description: 'Filter by project, comma-separated list of IDs.'
example: '1111,222,333'
required: false
schema:
type: string
description: 'Filter by project, comma-separated list of IDs.'
example: '1111,222,333'
nullable: false
-
in: query
name: floorplans_id
description: 'Filter by floorplan, comma-separated list of IDs.'
example: '1111,222,333'
required: false
schema:
type: string
description: 'Filter by floorplan, comma-separated list of IDs.'
example: '1111,222,333'
nullable: false
responses:
200:
description: 'Successful response'
content:
text/plain:
schema:
type: string
example: "{\n \"data\": [\n {\n \"id\": 1,\n \"project_id\": 5,\n \"floorplan_id\": 11,\n \"amount\": 750000,\n \"amount_psf\": 1100,\n \"valid_from\": \"2024-05-01\",\n }\n ],\n \"links\": {\n \"first\": \"http://your-app.test/api/v1/prices?page=1\",\n \"last\": \"http://your-app.test/api/v1/prices?page=5\",\n \"prev\": null,\n \"next\": \"http://your-app.test/api/v1/prices?page=2\"\n },\n \"meta\": {\n \"current_page\": 1,\n \"from\": 1,\n \"last_page\": 5,\n \"path\": \"http://your-app.test/api/v1/prices\",\n \"per_page\": 20,\n \"to\": 20,\n \"total\": 100\n }\n}"
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Endpoints
'/api/v1/prices/{id}':
get:
summary: 'Get a single price'
operationId: getASinglePrice
description: 'Retrieve details of a specific price by its unique ID.'
parameters: []
responses:
200:
description: 'Successful response'
content:
application/json:
schema:
type: object
example:
data:
id: 1
project_id: 5
floorplan_id: 11
amount: 750000
amount_psf: 1100
valid_from: '2024-05-01'
properties:
data:
type: object
properties:
id:
type: integer
example: 1
project_id:
type: integer
example: 5
floorplan_id:
type: integer
example: 11
amount:
type: integer
example: 750000
amount_psf:
type: integer
example: 1100
valid_from:
type: string
example: '2024-05-01'
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Endpoints
parameters:
-
in: path
name: id
description: 'The ID of the price.'
example: 1
required: true
schema:
type: integer
/api/v1/sales-marketing-companies:
get:
summary: 'List all sales & marketing companies'
operationId: listAllSalesMarketingCompanies
description: 'Retrieve a collection of all sales & marketing companies with pagination.'
parameters:
-
in: query
name: search
description: 'Search sales & marketing companies by name.'
example: Realty
required: false
schema:
type: string
description: 'Search sales & marketing companies by name.'
example: Realty
nullable: false
-
in: query
name: page
description: 'The page number for pagination.'
example: 2
required: false
schema:
type: integer
description: 'The page number for pagination.'
example: 2
nullable: false
-
in: query
name: per_page
description: 'Number of sales & marketing companies per page. Default: 20. Max: 50.'
example: 50
required: false
schema:
type: integer
description: 'Number of sales & marketing companies per page. Default: 20. Max: 50.'
example: 50
nullable: false
responses:
200:
description: 'Successful response'
content:
text/plain:
schema:
type: string
example: "{\n \"data\": [\n {\n \"id\": 1,\n \"name\": \"Realty Sales Inc.\",\n \"slug\": \"realty-sales-inc\",\n }\n ],\n \"links\": {\n \"first\": \"http://your-app.test/api/v1/sales-marketing-companies?page=1\",\n \"last\": \"http://your-app.test/api/v1/sales-marketing-companies?page=5\",\n \"prev\": null,\n \"next\": \"http://your-app.test/api/v1/sales-marketing-companies?page=2\"\n },\n \"meta\": {\n \"current_page\": 1,\n \"from\": 1,\n \"last_page\": 5,\n \"path\": \"http://your-app.test/api/v1/sales-marketing-companies\",\n \"per_page\": 20,\n \"to\": 20,\n \"total\": 100\n }\n}"
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Endpoints
'/api/v1/sales-marketing-companies/{id}':
get:
summary: 'Get a single sales & marketing company'
operationId: getASingleSalesMarketingCompany
description: 'Retrieve details of a specific sales & marketing company by its unique ID.'
parameters: []
responses:
200:
description: 'Successful response'
content:
text/plain:
schema:
type: string
example: "{\n \"data\": {\n \"id\": 1,\n \"name\": \"Realty Sales Inc.\",\n \"slug\": \"realty-sales-inc\",\n }\n}"
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Endpoints
parameters:
-
in: path
name: id
description: 'The ID of the sales & marketing company.'
example: 1
required: true
schema:
type: integer
/api/v1/special-incentives:
get:
summary: 'List all special incentives'
operationId: listAllSpecialIncentives
description: 'Retrieve a collection of all special incentives with pagination.'
parameters:
-
in: query
name: search
description: 'Search special incentives by name.'
example: Early
required: false
schema:
type: string
description: 'Search special incentives by name.'
example: Early
nullable: false
-
in: query
name: page
description: 'The page number for pagination.'
example: 2
required: false
schema:
type: integer
description: 'The page number for pagination.'
example: 2
nullable: false
-
in: query
name: per_page
description: 'Number of special incentives per page. Default: 20. Max: 50.'
example: 50
required: false
schema:
type: integer
description: 'Number of special incentives per page. Default: 20. Max: 50.'
example: 50
nullable: false
responses:
200:
description: 'Successful response'
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
name: 'Early Bird Discount'
slug: early-bird-discount
description: 'Get 5% off if you purchase before June.'
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
links:
first: 'http://your-app.test/api/v1/special-incentives?page=1'
last: 'http://your-app.test/api/v1/special-incentives?page=5'
prev: null
next: 'http://your-app.test/api/v1/special-incentives?page=2'
meta:
current_page: 1
from: 1
last_page: 5
path: 'http://your-app.test/api/v1/special-incentives'
per_page: 20
to: 20
total: 100
properties:
data:
type: array
example:
-
id: 1
name: 'Early Bird Discount'
slug: early-bird-discount
description: 'Get 5% off if you purchase before June.'
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
items:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: 'Early Bird Discount'
slug:
type: string
example: early-bird-discount
description:
type: string
example: 'Get 5% off if you purchase before June.'
created_at:
type: string
example: '2024-05-01T08:13:17.000000Z'
updated_at:
type: string
example: '2024-05-15T08:13:17.000000Z'
links:
type: object
properties:
first:
type: string
example: 'http://your-app.test/api/v1/special-incentives?page=1'
last:
type: string
example: 'http://your-app.test/api/v1/special-incentives?page=5'
prev:
type: string
example: null
next:
type: string
example: 'http://your-app.test/api/v1/special-incentives?page=2'
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 5
path:
type: string
example: 'http://your-app.test/api/v1/special-incentives'
per_page:
type: integer
example: 20
to:
type: integer
example: 20
total:
type: integer
example: 100
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Endpoints
'/api/v1/special-incentives/{id}':
get:
summary: 'Get a single special incentive'
operationId: getASingleSpecialIncentive
description: 'Retrieve details of a specific special incentive by its unique ID.'
parameters: []
responses:
200:
description: 'Successful response'
content:
application/json:
schema:
type: object
example:
data:
id: 1
name: 'Early Bird Discount'
slug: early-bird-discount
description: 'Get 5% off if you purchase before June.'
created_at: '2024-05-01T08:13:17.000000Z'
updated_at: '2024-05-15T08:13:17.000000Z'
properties:
data:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: 'Early Bird Discount'
slug:
type: string
example: early-bird-discount
description:
type: string
example: 'Get 5% off if you purchase before June.'
created_at:
type: string
example: '2024-05-01T08:13:17.000000Z'
updated_at:
type: string
example: '2024-05-15T08:13:17.000000Z'
401:
description: Unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Endpoints
parameters:
-
in: path
name: id
description: 'The ID of the special incentive.'
example: 1
required: true
schema:
type: integer
/webhooks/receive:
post:
summary: 'Receive Webhook'
operationId: receiveWebhook
description: "This endpoint receives webhook notifications from the Red Bricks API when data changes occur.\n\n## Overview\n\nWebhooks allow you to receive real-time notifications when data changes in the API. When an event occurs (such as a project being updated), the API will send a POST request to your configured webhook URL with the event data.\n\n## Available Events\n\n- `project.created` - When a new project is created\n- `project.updated` - When an existing project is updated\n- `project.deleted` - When a project is deleted\n- `floorplan.created` - When a new floorplan is added\n- `floorplan.updated` - When a floorplan is updated\n- `floorplan.deleted` - When a floorplan is deleted\n- `document.created` - When a new document is added\n- `document.updated` - When a document is updated\n\n## Signature Verification\n\nThe webhook signature is calculated using HMAC-SHA256:\n\n```php\n$signature = hash_hmac('sha256', $payload, $secret);\n```\n\n**Important:** Always verify the signature before processing webhook data to ensure the request came from the Red Bricks API.\n\n## Implementation Example\n\n```php\n 'success']);\n} else {\n // Invalid signature\n http_response_code(401);\n echo json_encode(['error' => 'Invalid signature']);\n}\n?>\n```\n"
parameters: []
responses: { }
tags:
- Webhooks
security: []