openapi: 3.0.3 info: title: 'Laravel API Documentation' description: "

Introduction

\n\n

\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

\n\n

\nThis documentation contains details about available endpoints, request and response formats, authentication, and practical usage examples.\n

\n\n

Key Features

\n\n\n

404 Not Found responses

\n
HTTP/1.1 404 Not Found\nContent-Type: application/json\n\n{\n  \"message\": \"Resource not found\"\n}\n
\n
HTTP/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

\n\n\n\n\n

How to Use

\n
    \n
  1. Obtain your team command token from your team administrator or team management dashboard.
  2. \n
  3. Include your team token in the Authorization header of every request:
    \n Authorization: Bearer {YOUR_TEAM_TOKEN}\n
  4. \n
  5. Explore the available endpoints below to find the data you need.
  6. \n
\n\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

\n

Example header:

\n
Authorization: Bearer {API_TOKEN}
\n
\n
\n
\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

\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: []