MENU navbar-image

Introduction

Introduction

Welcome to the Real Estate Projects API documentation.
This 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.
It is designed to support seamless integration with external systems and partner solutions.

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

Key Features

404 Not Found responses

HTTP/1.1 404 Not Found
Content-Type: application/json

{
  "message": "Resource not found"
}
HTTP/1.1 404 Not Found
Content-Type: application/json

{
  "message": "Project not found"
}

The API returns clear and consistent 404 responses in two main cases:

How to Use

  1. Obtain your team command token from your team administrator or team management dashboard.
  2. Include your team token in the Authorization header of every request:
    Authorization: Bearer {YOUR_TEAM_TOKEN}
  3. Explore the available endpoints below to find the data you need.

If you have any questions or need support, please contact your API administrator.

API Changelog

This document tracks all changes to the Red Bricks API endpoints, including new features, modifications, deprecations, and breaking changes.

Version History

Current Version: v1.0.4

Version Timeline

Recent Changes

Version 1.0.4 - Relationship Resources & Data Structure Improvements

Release Date: October 21, 2025 Previous Version: v1.0.3

Added

Updated

Deprecated

API Changes

For API Consumers
For Developers

Version 1.0.3 - Enhanced Data Attributes & Response Improvements

Release Date: September 24, 2025 Previous Version: v1.0.2

Added

Updated

Breaking Changes

API Changes

Enhanced Response Format
For API Consumers
For Developers

Version 1.0.2 - Search & Response Enhancement

Release Date: September 06, 2025 Previous Version: v1.0.1

Added

API Changes

New Query Parameters
Enhanced Response Format
For API Consumers
For Developers

Version 1.0.1 - Post-Launch Updates

Release Date: August 28, 2025
Previous Version: v1.0.0

Added

Updated

API Changes

New Query Parameters
For API Consumers
For Developers

Version 1.0.0 - Initial Launch

Release Date: August 14, 2025 Status: Initial Production Release

Core Features

API v1 Endpoints
Authentication & Security
Data Management

Last updated: September 24, 2025

Authenticating requests

To authenticate requests, include an Authorization header with the value "Bearer {YOUR_TEAM_TOKEN}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

This API uses Team Command Token Authentication.
To authenticate, include your team command token in the Authorization header of every request, prefixed with Bearer.

Example header:

Authorization: Bearer {API_TOKEN}




Team command tokens are associated with your team account and provide access to all API endpoints.
You can obtain your team command token from your team administrator or through your team management dashboard.
Keep your token secure and never share it with unauthorized users.

Note: All API endpoints require authentication. Requests without a valid team token will be rejected.

If your token is missing, expired, or invalid, you will receive one of the following error responses:

HTTP/1.1 401 Unauthorized
Content-Type: application/json

{
  "message": "Team token is required"
}
HTTP/1.1 401 Unauthorized
Content-Type: application/json

{
  "message": "Invalid or expired team token"
}
HTTP/1.1 401 Unauthorized
Content-Type: application/json

{
  "message": "Team token has expired"
}

Endpoints

Projects

List all projects

requires authentication

Retrieve a list of all real estate projects with optional filters and pagination.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/projects?name=Aurora+Hills&city=111%2C222%2C333&district=111%2C222%2C333&neighbourhood=111%2C222%2C333&sales_status=Selling&construction_status=Under+Construction&type=Condo&occupancy_date_min=2025-01-01&occupancy_date_max=2026-01-01&launch_date_min=2024-01-01&launch_date_max=2024-12-31&launch_psf_avg_min=1000&launch_psf_avg_max=2000&launch_price_min=300000&launch_price_max=900000&price_per_sqft_min=1000&price_per_sqft_max=2000&current_price_min=400000&current_price_max=800000&interior_size_min=500&interior_size_max=2000&maintenance_fees_min=0.5&maintenance_fees_max=1.5&parking_price_min=20000&parking_price_max=50000&locker_price_min=2000&locker_price_max=10000&deposit_min=5&deposit_max=20&developer=Tridel&architect=KPMB&sales_marketing_company=Baker&storeys_min=10&storeys_max=40&building_height_min=50&building_height_max=150&suites_min=100&suites_max=300&beds_min=1&beds_max=3&sort_by=price_per_sqft&sort_direction=asc&per_page=50&page=2&search=Tridel+downtown+toronto" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/projects';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'name' => 'Aurora Hills',
            'city' => '111,222,333',
            'district' => '111,222,333',
            'neighbourhood' => '111,222,333',
            'sales_status' => 'Selling',
            'construction_status' => 'Under Construction',
            'type' => 'Condo',
            'occupancy_date_min' => '2025-01-01',
            'occupancy_date_max' => '2026-01-01',
            'launch_date_min' => '2024-01-01',
            'launch_date_max' => '2024-12-31',
            'launch_psf_avg_min' => '1000',
            'launch_psf_avg_max' => '2000',
            'launch_price_min' => '300000',
            'launch_price_max' => '900000',
            'price_per_sqft_min' => '1000',
            'price_per_sqft_max' => '2000',
            'current_price_min' => '400000',
            'current_price_max' => '800000',
            'interior_size_min' => '500',
            'interior_size_max' => '2000',
            'maintenance_fees_min' => '0.5',
            'maintenance_fees_max' => '1.5',
            'parking_price_min' => '20000',
            'parking_price_max' => '50000',
            'locker_price_min' => '2000',
            'locker_price_max' => '10000',
            'deposit_min' => '5',
            'deposit_max' => '20',
            'developer' => 'Tridel',
            'architect' => 'KPMB',
            'sales_marketing_company' => 'Baker',
            'storeys_min' => '10',
            'storeys_max' => '40',
            'building_height_min' => '50',
            'building_height_max' => '150',
            'suites_min' => '100',
            'suites_max' => '300',
            'beds_min' => '1',
            'beds_max' => '3',
            'sort_by' => 'price_per_sqft',
            'sort_direction' => 'asc',
            'per_page' => '50',
            'page' => '2',
            'search' => 'Tridel downtown toronto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/projects"
);

const params = {
    "name": "Aurora Hills",
    "city": "111,222,333",
    "district": "111,222,333",
    "neighbourhood": "111,222,333",
    "sales_status": "Selling",
    "construction_status": "Under Construction",
    "type": "Condo",
    "occupancy_date_min": "2025-01-01",
    "occupancy_date_max": "2026-01-01",
    "launch_date_min": "2024-01-01",
    "launch_date_max": "2024-12-31",
    "launch_psf_avg_min": "1000",
    "launch_psf_avg_max": "2000",
    "launch_price_min": "300000",
    "launch_price_max": "900000",
    "price_per_sqft_min": "1000",
    "price_per_sqft_max": "2000",
    "current_price_min": "400000",
    "current_price_max": "800000",
    "interior_size_min": "500",
    "interior_size_max": "2000",
    "maintenance_fees_min": "0.5",
    "maintenance_fees_max": "1.5",
    "parking_price_min": "20000",
    "parking_price_max": "50000",
    "locker_price_min": "2000",
    "locker_price_max": "10000",
    "deposit_min": "5",
    "deposit_max": "20",
    "developer": "Tridel",
    "architect": "KPMB",
    "sales_marketing_company": "Baker",
    "storeys_min": "10",
    "storeys_max": "40",
    "building_height_min": "50",
    "building_height_max": "150",
    "suites_min": "100",
    "suites_max": "300",
    "beds_min": "1",
    "beds_max": "3",
    "sort_by": "price_per_sqft",
    "sort_direction": "asc",
    "per_page": "50",
    "page": "2",
    "search": "Tridel downtown toronto",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/projects'
params = {
  'name': 'Aurora Hills',
  'city': '111,222,333',
  'district': '111,222,333',
  'neighbourhood': '111,222,333',
  'sales_status': 'Selling',
  'construction_status': 'Under Construction',
  'type': 'Condo',
  'occupancy_date_min': '2025-01-01',
  'occupancy_date_max': '2026-01-01',
  'launch_date_min': '2024-01-01',
  'launch_date_max': '2024-12-31',
  'launch_psf_avg_min': '1000',
  'launch_psf_avg_max': '2000',
  'launch_price_min': '300000',
  'launch_price_max': '900000',
  'price_per_sqft_min': '1000',
  'price_per_sqft_max': '2000',
  'current_price_min': '400000',
  'current_price_max': '800000',
  'interior_size_min': '500',
  'interior_size_max': '2000',
  'maintenance_fees_min': '0.5',
  'maintenance_fees_max': '1.5',
  'parking_price_min': '20000',
  'parking_price_max': '50000',
  'locker_price_min': '2000',
  'locker_price_max': '10000',
  'deposit_min': '5',
  'deposit_max': '20',
  'developer': 'Tridel',
  'architect': 'KPMB',
  'sales_marketing_company': 'Baker',
  'storeys_min': '10',
  'storeys_max': '40',
  'building_height_min': '50',
  'building_height_max': '150',
  'suites_min': '100',
  'suites_max': '300',
  'beds_min': '1',
  'beds_max': '3',
  'sort_by': 'price_per_sqft',
  'sort_direction': 'asc',
  'per_page': '50',
  'page': '2',
  'search': 'Tridel downtown toronto',
}
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):


{
    "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": "[...]"
}
 

Request      

GET api/v1/projects

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

name   string  optional  

Filter by project name. Example: Aurora Hills

city   string  optional  

Filter by city, can be comma-separated ID or name value. Example: 111,222,333

district   string  optional  

Filter by district, can be comma-separated ID or name value. Example: 111,222,333

neighbourhood   string  optional  

Filter by neighbourhood, can be comma-separated ID or name value. Example: 111,222,333

sales_status   string  optional  

Filter by sales status. Example: Selling

Must be one of:
  • Cancelled
  • Developer Sold Out
  • Launching Soon
  • On Hold
  • Platinum Access & Selling
  • Registration Phase
  • Resale
  • Selling
construction_status   string  optional  

Filter by construction status. Example: Under Construction

Must be one of:
  • Complete
  • Pre-Construction
  • Under Construction
  • Cancelled
type   string  optional  

Filter by building type. Example: Condo

Must be one of:
  • Single Family Home
  • Condo
  • Townhouse
occupancy_date_min   string  optional  

Minimum occupancy date (YYYY-MM-DD). Must be a valid date. Example: 2025-01-01

occupancy_date_max   string  optional  

Maximum occupancy date (YYYY-MM-DD). Must be a valid date. Example: 2026-01-01

launch_date_min   string  optional  

Minimum launch date (YYYY-MM-DD). Must be a valid date. Example: 2024-01-01

launch_date_max   string  optional  

Maximum launch date (YYYY-MM-DD). Must be a valid date. Example: 2024-12-31

launch_psf_avg_min   number  optional  

Minimum launch price per square foot average. Example: 1000

launch_psf_avg_max   number  optional  

Maximum launch price per square foot average. Example: 2000

launch_price_min   number  optional  

Minimum launch price. Example: 300000

launch_price_max   number  optional  

Maximum launch price. Example: 900000

price_per_sqft_min   number  optional  

Minimum price per square foot. Example: 1000

price_per_sqft_max   number  optional  

Maximum price per square foot. Example: 2000

current_price_min   number  optional  

Minimum current price. Example: 400000

current_price_max   number  optional  

Maximum current price. Example: 800000

interior_size_min   number  optional  

Minimum interior size. Example: 500

interior_size_max   number  optional  

Maximum interior size. Example: 2000

maintenance_fees_min   number  optional  

Minimum maintenance fees. Example: 0.5

maintenance_fees_max   number  optional  

Maximum maintenance fees. Example: 1.5

parking_price_min   number  optional  

Minimum parking price. Example: 20000

parking_price_max   number  optional  

Maximum parking price. Example: 50000

locker_price_min   number  optional  

Minimum locker price. Example: 2000

locker_price_max   number  optional  

Maximum locker price. Example: 10000

deposit_min   number  optional  

Minimum deposit. Example: 5

deposit_max   number  optional  

Maximum deposit. Example: 20

developer   string  optional  

Filter by developer name. Example: Tridel

architect   string  optional  

Filter by architect name or slug. Example: KPMB

sales_marketing_company   string  optional  

Filter by sales and marketing company. Example: Baker

storeys_min   integer  optional  

Minimum number of storeys. Example: 10

storeys_max   integer  optional  

Maximum number of storeys. Example: 40

building_height_min   number  optional  

Minimum building height (meters). Example: 50

building_height_max   number  optional  

Maximum building height (meters). Example: 150

suites_min   integer  optional  

Minimum number of suites. Example: 100

suites_max   integer  optional  

Maximum number of suites. Example: 300

beds_min   integer  optional  

Minimum number of bedrooms. Example: 1

beds_max   integer  optional  

Maximum number of bedrooms. Example: 3

sort_by   string  optional  

Sort by field. Example: price_per_sqft

Must be one of:
  • updated_at
  • launch_date
  • price_per_sqft
sort_direction   string  optional  

Sort direction. Options: asc, desc. Example: asc

Must be one of:
  • asc
  • desc
per_page   integer  optional  

Number of projects per page. Default: 20. Max: 50. Must be at least 1. Must not be greater than 50. Example: 50

page   integer  optional  

The page number for pagination. Must be at least 1. Example: 2

search   string  optional  

Comprehensive search across project name, description, developer name, city, district, and neighbourhood. Example: Tridel downtown toronto

Get a single project

requires authentication

Retrieve detailed information about a specific project by its unique ID.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/projects/1?name=Aurora+Hills&city=111%2C222%2C333&district=111%2C222%2C333&neighbourhood=111%2C222%2C333&sales_status=Selling&construction_status=Under+Construction&type=Condo&occupancy_date_min=2025-01-01&occupancy_date_max=2026-01-01&launch_date_min=2024-01-01&launch_date_max=2024-12-31&launch_psf_avg_min=1000&launch_psf_avg_max=2000&launch_price_min=300000&launch_price_max=900000&price_per_sqft_min=1000&price_per_sqft_max=2000&current_price_min=400000&current_price_max=800000&interior_size_min=500&interior_size_max=2000&maintenance_fees_min=0.5&maintenance_fees_max=1.5&parking_price_min=20000&parking_price_max=50000&locker_price_min=2000&locker_price_max=10000&deposit_min=5&deposit_max=20&developer=Tridel&architect=KPMB&sales_marketing_company=Baker&storeys_min=10&storeys_max=40&building_height_min=50&building_height_max=150&suites_min=100&suites_max=300&beds_min=1&beds_max=3&sort_by=price_per_sqft&sort_direction=asc&per_page=50&page=2&search=Tridel+downtown+toronto" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/projects/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'name' => 'Aurora Hills',
            'city' => '111,222,333',
            'district' => '111,222,333',
            'neighbourhood' => '111,222,333',
            'sales_status' => 'Selling',
            'construction_status' => 'Under Construction',
            'type' => 'Condo',
            'occupancy_date_min' => '2025-01-01',
            'occupancy_date_max' => '2026-01-01',
            'launch_date_min' => '2024-01-01',
            'launch_date_max' => '2024-12-31',
            'launch_psf_avg_min' => '1000',
            'launch_psf_avg_max' => '2000',
            'launch_price_min' => '300000',
            'launch_price_max' => '900000',
            'price_per_sqft_min' => '1000',
            'price_per_sqft_max' => '2000',
            'current_price_min' => '400000',
            'current_price_max' => '800000',
            'interior_size_min' => '500',
            'interior_size_max' => '2000',
            'maintenance_fees_min' => '0.5',
            'maintenance_fees_max' => '1.5',
            'parking_price_min' => '20000',
            'parking_price_max' => '50000',
            'locker_price_min' => '2000',
            'locker_price_max' => '10000',
            'deposit_min' => '5',
            'deposit_max' => '20',
            'developer' => 'Tridel',
            'architect' => 'KPMB',
            'sales_marketing_company' => 'Baker',
            'storeys_min' => '10',
            'storeys_max' => '40',
            'building_height_min' => '50',
            'building_height_max' => '150',
            'suites_min' => '100',
            'suites_max' => '300',
            'beds_min' => '1',
            'beds_max' => '3',
            'sort_by' => 'price_per_sqft',
            'sort_direction' => 'asc',
            'per_page' => '50',
            'page' => '2',
            'search' => 'Tridel downtown toronto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/projects/1"
);

const params = {
    "name": "Aurora Hills",
    "city": "111,222,333",
    "district": "111,222,333",
    "neighbourhood": "111,222,333",
    "sales_status": "Selling",
    "construction_status": "Under Construction",
    "type": "Condo",
    "occupancy_date_min": "2025-01-01",
    "occupancy_date_max": "2026-01-01",
    "launch_date_min": "2024-01-01",
    "launch_date_max": "2024-12-31",
    "launch_psf_avg_min": "1000",
    "launch_psf_avg_max": "2000",
    "launch_price_min": "300000",
    "launch_price_max": "900000",
    "price_per_sqft_min": "1000",
    "price_per_sqft_max": "2000",
    "current_price_min": "400000",
    "current_price_max": "800000",
    "interior_size_min": "500",
    "interior_size_max": "2000",
    "maintenance_fees_min": "0.5",
    "maintenance_fees_max": "1.5",
    "parking_price_min": "20000",
    "parking_price_max": "50000",
    "locker_price_min": "2000",
    "locker_price_max": "10000",
    "deposit_min": "5",
    "deposit_max": "20",
    "developer": "Tridel",
    "architect": "KPMB",
    "sales_marketing_company": "Baker",
    "storeys_min": "10",
    "storeys_max": "40",
    "building_height_min": "50",
    "building_height_max": "150",
    "suites_min": "100",
    "suites_max": "300",
    "beds_min": "1",
    "beds_max": "3",
    "sort_by": "price_per_sqft",
    "sort_direction": "asc",
    "per_page": "50",
    "page": "2",
    "search": "Tridel downtown toronto",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/projects/1'
params = {
  'name': 'Aurora Hills',
  'city': '111,222,333',
  'district': '111,222,333',
  'neighbourhood': '111,222,333',
  'sales_status': 'Selling',
  'construction_status': 'Under Construction',
  'type': 'Condo',
  'occupancy_date_min': '2025-01-01',
  'occupancy_date_max': '2026-01-01',
  'launch_date_min': '2024-01-01',
  'launch_date_max': '2024-12-31',
  'launch_psf_avg_min': '1000',
  'launch_psf_avg_max': '2000',
  'launch_price_min': '300000',
  'launch_price_max': '900000',
  'price_per_sqft_min': '1000',
  'price_per_sqft_max': '2000',
  'current_price_min': '400000',
  'current_price_max': '800000',
  'interior_size_min': '500',
  'interior_size_max': '2000',
  'maintenance_fees_min': '0.5',
  'maintenance_fees_max': '1.5',
  'parking_price_min': '20000',
  'parking_price_max': '50000',
  'locker_price_min': '2000',
  'locker_price_max': '10000',
  'deposit_min': '5',
  'deposit_max': '20',
  'developer': 'Tridel',
  'architect': 'KPMB',
  'sales_marketing_company': 'Baker',
  'storeys_min': '10',
  'storeys_max': '40',
  'building_height_min': '50',
  'building_height_max': '150',
  'suites_min': '100',
  'suites_max': '300',
  'beds_min': '1',
  'beds_max': '3',
  'sort_by': 'price_per_sqft',
  'sort_direction': 'asc',
  'per_page': '50',
  'page': '2',
  'search': 'Tridel downtown toronto',
}
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Successful response):


{
  "data": {
    "id": 1,
    "name": "Central Park Residences",
    "description": "A premium residential complex in downtown.",
    "media": [
        url,
         ..
    ]",
    "completion_year": 2025,
    "status": "pre-sale",
    "city_id": 3,
    "city_name": "Toronto",
    "deposit_with_time": null,
    "deposit_full": null,
    "deposit": null,
    "size": null,
    "launch_price": null,
    "district_id": 5,
    "district_name": "Downtown",
    "neighbourhood_id": 17,
    "neighbourhood_name": "Financial District",
    "architect_id": 4,
    "interior_designer_id": 2,
    "developer_id": 7,
    "developer_name": "Tridel Corporation",
    "storeys": 25,
    "suites": null,
    "units": 120,
    "development_status": "in progress",
    "building_type": "Condominium",
    "building_height_m": 75,
    "underground_levels": null,
    "launch_date": "2024-08-01",
    "occupancy_date": "2026-05-01",
    "address": "123 Main St, Downtown",
    "google_map_link": null,
    "walk_score": 87,
    "transit_score": 90,
    "location": null,
    "current_price_from": 650000,
    "current_price_to": 1200000,
    "total_parking": null,
    "residential_parking": null,
    "parking_ratio": null,
    "residential_parking_ratio": null,
    "visitor_parking": null,
    "industrial_parking": null,
    "office_parking": null,
    "retail_parking": null,
    "bike_parking": null,
    "parking_price": null,
    "parking_details": null,
    "locker_price": null,
    "locker_details": null,
    "current_sales_status": null,
    "launch_psf_avg": null,
    "maintenance_fees": null,
    "maintenance_fees_details": null,
    "floorplan_premiums": null,
    "development_charges": null,
    "google_drive_portal": null,
    "amenities": "Pool,Gym,Concierge,Parking",
    "gfa": null,
    "price_per_sqft": null,
    "bedrooms_info": null,
    "bedrooms": "1-bedroom: 45 units, 2-bedroom: 60 units, 3-bedroom: 15 units",
    "bedrooms_percents": "1-bedroom: 37.5%, 2-bedroom: 50%, 3-bedroom: 12.5%",
    "highlights": "Premium location, Modern amenities, Panoramic city views",
    "launch_price_project": 480000,
    "created_at": "2024-05-01T08:13:17.000000Z",
    "updated_at": "2024-05-15T08:13:17.000000Z"
  }
}
 

Request      

GET api/v1/projects/{id}

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   integer   

The ID of the project. Example: 1

Query Parameters

name   string  optional  

Filter by project name. Example: Aurora Hills

city   string  optional  

Filter by city, can be comma-separated ID or name value. Example: 111,222,333

district   string  optional  

Filter by district, can be comma-separated ID or name value. Example: 111,222,333

neighbourhood   string  optional  

Filter by neighbourhood, can be comma-separated ID or name value. Example: 111,222,333

sales_status   string  optional  

Filter by sales status. Example: Selling

Must be one of:
  • Cancelled
  • Developer Sold Out
  • Launching Soon
  • On Hold
  • Platinum Access & Selling
  • Registration Phase
  • Resale
  • Selling
construction_status   string  optional  

Filter by construction status. Example: Under Construction

Must be one of:
  • Complete
  • Pre-Construction
  • Under Construction
  • Cancelled
type   string  optional  

Filter by building type. Example: Condo

Must be one of:
  • Single Family Home
  • Condo
  • Townhouse
occupancy_date_min   string  optional  

Minimum occupancy date (YYYY-MM-DD). Must be a valid date. Example: 2025-01-01

occupancy_date_max   string  optional  

Maximum occupancy date (YYYY-MM-DD). Must be a valid date. Example: 2026-01-01

launch_date_min   string  optional  

Minimum launch date (YYYY-MM-DD). Must be a valid date. Example: 2024-01-01

launch_date_max   string  optional  

Maximum launch date (YYYY-MM-DD). Must be a valid date. Example: 2024-12-31

launch_psf_avg_min   number  optional  

Minimum launch price per square foot average. Example: 1000

launch_psf_avg_max   number  optional  

Maximum launch price per square foot average. Example: 2000

launch_price_min   number  optional  

Minimum launch price. Example: 300000

launch_price_max   number  optional  

Maximum launch price. Example: 900000

price_per_sqft_min   number  optional  

Minimum price per square foot. Example: 1000

price_per_sqft_max   number  optional  

Maximum price per square foot. Example: 2000

current_price_min   number  optional  

Minimum current price. Example: 400000

current_price_max   number  optional  

Maximum current price. Example: 800000

interior_size_min   number  optional  

Minimum interior size. Example: 500

interior_size_max   number  optional  

Maximum interior size. Example: 2000

maintenance_fees_min   number  optional  

Minimum maintenance fees. Example: 0.5

maintenance_fees_max   number  optional  

Maximum maintenance fees. Example: 1.5

parking_price_min   number  optional  

Minimum parking price. Example: 20000

parking_price_max   number  optional  

Maximum parking price. Example: 50000

locker_price_min   number  optional  

Minimum locker price. Example: 2000

locker_price_max   number  optional  

Maximum locker price. Example: 10000

deposit_min   number  optional  

Minimum deposit. Example: 5

deposit_max   number  optional  

Maximum deposit. Example: 20

developer   string  optional  

Filter by developer name. Example: Tridel

architect   string  optional  

Filter by architect name or slug. Example: KPMB

sales_marketing_company   string  optional  

Filter by sales and marketing company. Example: Baker

storeys_min   integer  optional  

Minimum number of storeys. Example: 10

storeys_max   integer  optional  

Maximum number of storeys. Example: 40

building_height_min   number  optional  

Minimum building height (meters). Example: 50

building_height_max   number  optional  

Maximum building height (meters). Example: 150

suites_min   integer  optional  

Minimum number of suites. Example: 100

suites_max   integer  optional  

Maximum number of suites. Example: 300

beds_min   integer  optional  

Minimum number of bedrooms. Example: 1

beds_max   integer  optional  

Maximum number of bedrooms. Example: 3

sort_by   string  optional  

Sort by field. Example: price_per_sqft

Must be one of:
  • updated_at
  • launch_date
  • price_per_sqft
sort_direction   string  optional  

Sort direction. Options: asc, desc. Example: asc

Must be one of:
  • asc
  • desc
per_page   integer  optional  

Number of projects per page. Default: 20. Max: 50. Must be at least 1. Must not be greater than 50. Example: 50

page   integer  optional  

The page number for pagination. Must be at least 1. Example: 2

search   string  optional  

Comprehensive search across project name, description, developer name, city, district, and neighbourhood. Example: Tridel downtown toronto

Floorplans

List all floorplans for a project

requires authentication

Retrieve a list of all available floorplans for a specific project with pagination.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/projects/5/floorplans?name=Aurora+Hills&city=111%2C222%2C333&district=111%2C222%2C333&neighbourhood=111%2C222%2C333&sales_status=Selling&construction_status=Under+Construction&type=Condo&occupancy_date_min=2025-01-01&occupancy_date_max=2026-01-01&launch_date_min=2024-01-01&launch_date_max=2024-12-31&launch_psf_avg_min=1000&launch_psf_avg_max=2000&launch_price_min=300000&launch_price_max=900000&price_per_sqft_min=1000&price_per_sqft_max=2000&current_price_min=400000&current_price_max=800000&interior_size_min=500&interior_size_max=2000&maintenance_fees_min=0.5&maintenance_fees_max=1.5&parking_price_min=20000&parking_price_max=50000&locker_price_min=2000&locker_price_max=10000&deposit_min=5&deposit_max=20&developer=Tridel&architect=KPMB&sales_marketing_company=Baker&storeys_min=10&storeys_max=40&building_height_min=50&building_height_max=150&suites_min=100&suites_max=300&beds_min=1&beds_max=3&sort_by=price_per_sqft&sort_direction=asc&per_page=50&page=2&search=Tridel+downtown+toronto" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/projects/5/floorplans';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'name' => 'Aurora Hills',
            'city' => '111,222,333',
            'district' => '111,222,333',
            'neighbourhood' => '111,222,333',
            'sales_status' => 'Selling',
            'construction_status' => 'Under Construction',
            'type' => 'Condo',
            'occupancy_date_min' => '2025-01-01',
            'occupancy_date_max' => '2026-01-01',
            'launch_date_min' => '2024-01-01',
            'launch_date_max' => '2024-12-31',
            'launch_psf_avg_min' => '1000',
            'launch_psf_avg_max' => '2000',
            'launch_price_min' => '300000',
            'launch_price_max' => '900000',
            'price_per_sqft_min' => '1000',
            'price_per_sqft_max' => '2000',
            'current_price_min' => '400000',
            'current_price_max' => '800000',
            'interior_size_min' => '500',
            'interior_size_max' => '2000',
            'maintenance_fees_min' => '0.5',
            'maintenance_fees_max' => '1.5',
            'parking_price_min' => '20000',
            'parking_price_max' => '50000',
            'locker_price_min' => '2000',
            'locker_price_max' => '10000',
            'deposit_min' => '5',
            'deposit_max' => '20',
            'developer' => 'Tridel',
            'architect' => 'KPMB',
            'sales_marketing_company' => 'Baker',
            'storeys_min' => '10',
            'storeys_max' => '40',
            'building_height_min' => '50',
            'building_height_max' => '150',
            'suites_min' => '100',
            'suites_max' => '300',
            'beds_min' => '1',
            'beds_max' => '3',
            'sort_by' => 'price_per_sqft',
            'sort_direction' => 'asc',
            'per_page' => '50',
            'page' => '2',
            'search' => 'Tridel downtown toronto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/projects/5/floorplans"
);

const params = {
    "name": "Aurora Hills",
    "city": "111,222,333",
    "district": "111,222,333",
    "neighbourhood": "111,222,333",
    "sales_status": "Selling",
    "construction_status": "Under Construction",
    "type": "Condo",
    "occupancy_date_min": "2025-01-01",
    "occupancy_date_max": "2026-01-01",
    "launch_date_min": "2024-01-01",
    "launch_date_max": "2024-12-31",
    "launch_psf_avg_min": "1000",
    "launch_psf_avg_max": "2000",
    "launch_price_min": "300000",
    "launch_price_max": "900000",
    "price_per_sqft_min": "1000",
    "price_per_sqft_max": "2000",
    "current_price_min": "400000",
    "current_price_max": "800000",
    "interior_size_min": "500",
    "interior_size_max": "2000",
    "maintenance_fees_min": "0.5",
    "maintenance_fees_max": "1.5",
    "parking_price_min": "20000",
    "parking_price_max": "50000",
    "locker_price_min": "2000",
    "locker_price_max": "10000",
    "deposit_min": "5",
    "deposit_max": "20",
    "developer": "Tridel",
    "architect": "KPMB",
    "sales_marketing_company": "Baker",
    "storeys_min": "10",
    "storeys_max": "40",
    "building_height_min": "50",
    "building_height_max": "150",
    "suites_min": "100",
    "suites_max": "300",
    "beds_min": "1",
    "beds_max": "3",
    "sort_by": "price_per_sqft",
    "sort_direction": "asc",
    "per_page": "50",
    "page": "2",
    "search": "Tridel downtown toronto",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/projects/5/floorplans'
params = {
  'name': 'Aurora Hills',
  'city': '111,222,333',
  'district': '111,222,333',
  'neighbourhood': '111,222,333',
  'sales_status': 'Selling',
  'construction_status': 'Under Construction',
  'type': 'Condo',
  'occupancy_date_min': '2025-01-01',
  'occupancy_date_max': '2026-01-01',
  'launch_date_min': '2024-01-01',
  'launch_date_max': '2024-12-31',
  'launch_psf_avg_min': '1000',
  'launch_psf_avg_max': '2000',
  'launch_price_min': '300000',
  'launch_price_max': '900000',
  'price_per_sqft_min': '1000',
  'price_per_sqft_max': '2000',
  'current_price_min': '400000',
  'current_price_max': '800000',
  'interior_size_min': '500',
  'interior_size_max': '2000',
  'maintenance_fees_min': '0.5',
  'maintenance_fees_max': '1.5',
  'parking_price_min': '20000',
  'parking_price_max': '50000',
  'locker_price_min': '2000',
  'locker_price_max': '10000',
  'deposit_min': '5',
  'deposit_max': '20',
  'developer': 'Tridel',
  'architect': 'KPMB',
  'sales_marketing_company': 'Baker',
  'storeys_min': '10',
  'storeys_max': '40',
  'building_height_min': '50',
  'building_height_max': '150',
  'suites_min': '100',
  'suites_max': '300',
  'beds_min': '1',
  'beds_max': '3',
  'sort_by': 'price_per_sqft',
  'sort_direction': 'asc',
  'per_page': '50',
  'page': '2',
  'search': 'Tridel downtown toronto',
}
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Successful response):


{
    "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
    }
}
 

Request      

GET api/v1/projects/{project_id}/floorplans

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

project_id   integer   

The ID of the project. Example: 5

Query Parameters

name   string  optional  

Filter by project name. Example: Aurora Hills

city   string  optional  

Filter by city, can be comma-separated ID or name value. Example: 111,222,333

district   string  optional  

Filter by district, can be comma-separated ID or name value. Example: 111,222,333

neighbourhood   string  optional  

Filter by neighbourhood, can be comma-separated ID or name value. Example: 111,222,333

sales_status   string  optional  

Filter by sales status. Example: Selling

Must be one of:
  • Cancelled
  • Developer Sold Out
  • Launching Soon
  • On Hold
  • Platinum Access & Selling
  • Registration Phase
  • Resale
  • Selling
construction_status   string  optional  

Filter by construction status. Example: Under Construction

Must be one of:
  • Complete
  • Pre-Construction
  • Under Construction
  • Cancelled
type   string  optional  

Filter by building type. Example: Condo

Must be one of:
  • Single Family Home
  • Condo
  • Townhouse
occupancy_date_min   string  optional  

Minimum occupancy date (YYYY-MM-DD). Must be a valid date. Example: 2025-01-01

occupancy_date_max   string  optional  

Maximum occupancy date (YYYY-MM-DD). Must be a valid date. Example: 2026-01-01

launch_date_min   string  optional  

Minimum launch date (YYYY-MM-DD). Must be a valid date. Example: 2024-01-01

launch_date_max   string  optional  

Maximum launch date (YYYY-MM-DD). Must be a valid date. Example: 2024-12-31

launch_psf_avg_min   number  optional  

Minimum launch price per square foot average. Example: 1000

launch_psf_avg_max   number  optional  

Maximum launch price per square foot average. Example: 2000

launch_price_min   number  optional  

Minimum launch price. Example: 300000

launch_price_max   number  optional  

Maximum launch price. Example: 900000

price_per_sqft_min   number  optional  

Minimum price per square foot. Example: 1000

price_per_sqft_max   number  optional  

Maximum price per square foot. Example: 2000

current_price_min   number  optional  

Minimum current price. Example: 400000

current_price_max   number  optional  

Maximum current price. Example: 800000

interior_size_min   number  optional  

Minimum interior size. Example: 500

interior_size_max   number  optional  

Maximum interior size. Example: 2000

maintenance_fees_min   number  optional  

Minimum maintenance fees. Example: 0.5

maintenance_fees_max   number  optional  

Maximum maintenance fees. Example: 1.5

parking_price_min   number  optional  

Minimum parking price. Example: 20000

parking_price_max   number  optional  

Maximum parking price. Example: 50000

locker_price_min   number  optional  

Minimum locker price. Example: 2000

locker_price_max   number  optional  

Maximum locker price. Example: 10000

deposit_min   number  optional  

Minimum deposit. Example: 5

deposit_max   number  optional  

Maximum deposit. Example: 20

developer   string  optional  

Filter by developer name. Example: Tridel

architect   string  optional  

Filter by architect name or slug. Example: KPMB

sales_marketing_company   string  optional  

Filter by sales and marketing company. Example: Baker

storeys_min   integer  optional  

Minimum number of storeys. Example: 10

storeys_max   integer  optional  

Maximum number of storeys. Example: 40

building_height_min   number  optional  

Minimum building height (meters). Example: 50

building_height_max   number  optional  

Maximum building height (meters). Example: 150

suites_min   integer  optional  

Minimum number of suites. Example: 100

suites_max   integer  optional  

Maximum number of suites. Example: 300

beds_min   integer  optional  

Minimum number of bedrooms. Example: 1

beds_max   integer  optional  

Maximum number of bedrooms. Example: 3

sort_by   string  optional  

Sort by field. Example: price_per_sqft

Must be one of:
  • updated_at
  • launch_date
  • price_per_sqft
sort_direction   string  optional  

Sort direction. Options: asc, desc. Example: asc

Must be one of:
  • asc
  • desc
per_page   integer  optional  

Number of floorplans per page. Default: 20. Max: 50. Example: 50

page   integer  optional  

The page number for pagination. Example: 2

search   string  optional  

Comprehensive search across project name, description, developer name, city, district, and neighbourhood. Example: Tridel downtown toronto

Get a single floorplan in a project

requires authentication

Retrieve detailed information about a specific floorplan by ID within a given project.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/projects/5/floorplans/1?name=Aurora+Hills&city=111%2C222%2C333&district=111%2C222%2C333&neighbourhood=111%2C222%2C333&sales_status=Selling&construction_status=Under+Construction&type=Condo&occupancy_date_min=2025-01-01&occupancy_date_max=2026-01-01&launch_date_min=2024-01-01&launch_date_max=2024-12-31&launch_psf_avg_min=1000&launch_psf_avg_max=2000&launch_price_min=300000&launch_price_max=900000&price_per_sqft_min=1000&price_per_sqft_max=2000&current_price_min=400000&current_price_max=800000&interior_size_min=500&interior_size_max=2000&maintenance_fees_min=0.5&maintenance_fees_max=1.5&parking_price_min=20000&parking_price_max=50000&locker_price_min=2000&locker_price_max=10000&deposit_min=5&deposit_max=20&developer=Tridel&architect=KPMB&sales_marketing_company=Baker&storeys_min=10&storeys_max=40&building_height_min=50&building_height_max=150&suites_min=100&suites_max=300&beds_min=1&beds_max=3&sort_by=price_per_sqft&sort_direction=asc&per_page=50&page=2&search=Tridel+downtown+toronto" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/projects/5/floorplans/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'name' => 'Aurora Hills',
            'city' => '111,222,333',
            'district' => '111,222,333',
            'neighbourhood' => '111,222,333',
            'sales_status' => 'Selling',
            'construction_status' => 'Under Construction',
            'type' => 'Condo',
            'occupancy_date_min' => '2025-01-01',
            'occupancy_date_max' => '2026-01-01',
            'launch_date_min' => '2024-01-01',
            'launch_date_max' => '2024-12-31',
            'launch_psf_avg_min' => '1000',
            'launch_psf_avg_max' => '2000',
            'launch_price_min' => '300000',
            'launch_price_max' => '900000',
            'price_per_sqft_min' => '1000',
            'price_per_sqft_max' => '2000',
            'current_price_min' => '400000',
            'current_price_max' => '800000',
            'interior_size_min' => '500',
            'interior_size_max' => '2000',
            'maintenance_fees_min' => '0.5',
            'maintenance_fees_max' => '1.5',
            'parking_price_min' => '20000',
            'parking_price_max' => '50000',
            'locker_price_min' => '2000',
            'locker_price_max' => '10000',
            'deposit_min' => '5',
            'deposit_max' => '20',
            'developer' => 'Tridel',
            'architect' => 'KPMB',
            'sales_marketing_company' => 'Baker',
            'storeys_min' => '10',
            'storeys_max' => '40',
            'building_height_min' => '50',
            'building_height_max' => '150',
            'suites_min' => '100',
            'suites_max' => '300',
            'beds_min' => '1',
            'beds_max' => '3',
            'sort_by' => 'price_per_sqft',
            'sort_direction' => 'asc',
            'per_page' => '50',
            'page' => '2',
            'search' => 'Tridel downtown toronto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/projects/5/floorplans/1"
);

const params = {
    "name": "Aurora Hills",
    "city": "111,222,333",
    "district": "111,222,333",
    "neighbourhood": "111,222,333",
    "sales_status": "Selling",
    "construction_status": "Under Construction",
    "type": "Condo",
    "occupancy_date_min": "2025-01-01",
    "occupancy_date_max": "2026-01-01",
    "launch_date_min": "2024-01-01",
    "launch_date_max": "2024-12-31",
    "launch_psf_avg_min": "1000",
    "launch_psf_avg_max": "2000",
    "launch_price_min": "300000",
    "launch_price_max": "900000",
    "price_per_sqft_min": "1000",
    "price_per_sqft_max": "2000",
    "current_price_min": "400000",
    "current_price_max": "800000",
    "interior_size_min": "500",
    "interior_size_max": "2000",
    "maintenance_fees_min": "0.5",
    "maintenance_fees_max": "1.5",
    "parking_price_min": "20000",
    "parking_price_max": "50000",
    "locker_price_min": "2000",
    "locker_price_max": "10000",
    "deposit_min": "5",
    "deposit_max": "20",
    "developer": "Tridel",
    "architect": "KPMB",
    "sales_marketing_company": "Baker",
    "storeys_min": "10",
    "storeys_max": "40",
    "building_height_min": "50",
    "building_height_max": "150",
    "suites_min": "100",
    "suites_max": "300",
    "beds_min": "1",
    "beds_max": "3",
    "sort_by": "price_per_sqft",
    "sort_direction": "asc",
    "per_page": "50",
    "page": "2",
    "search": "Tridel downtown toronto",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/projects/5/floorplans/1'
params = {
  'name': 'Aurora Hills',
  'city': '111,222,333',
  'district': '111,222,333',
  'neighbourhood': '111,222,333',
  'sales_status': 'Selling',
  'construction_status': 'Under Construction',
  'type': 'Condo',
  'occupancy_date_min': '2025-01-01',
  'occupancy_date_max': '2026-01-01',
  'launch_date_min': '2024-01-01',
  'launch_date_max': '2024-12-31',
  'launch_psf_avg_min': '1000',
  'launch_psf_avg_max': '2000',
  'launch_price_min': '300000',
  'launch_price_max': '900000',
  'price_per_sqft_min': '1000',
  'price_per_sqft_max': '2000',
  'current_price_min': '400000',
  'current_price_max': '800000',
  'interior_size_min': '500',
  'interior_size_max': '2000',
  'maintenance_fees_min': '0.5',
  'maintenance_fees_max': '1.5',
  'parking_price_min': '20000',
  'parking_price_max': '50000',
  'locker_price_min': '2000',
  'locker_price_max': '10000',
  'deposit_min': '5',
  'deposit_max': '20',
  'developer': 'Tridel',
  'architect': 'KPMB',
  'sales_marketing_company': 'Baker',
  'storeys_min': '10',
  'storeys_max': '40',
  'building_height_min': '50',
  'building_height_max': '150',
  'suites_min': '100',
  'suites_max': '300',
  'beds_min': '1',
  'beds_max': '3',
  'sort_by': 'price_per_sqft',
  'sort_direction': 'asc',
  'per_page': '50',
  'page': '2',
  'search': 'Tridel downtown toronto',
}
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Successful response):


{
    "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"
    }
}
 

Request      

GET api/v1/projects/{project_id}/floorplans/{floorplan_id}

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

project_id   integer   

The ID of the project. Example: 5

floorplan_id   integer   

The ID of the floorplan. Example: 1

Query Parameters

name   string  optional  

Filter by project name. Example: Aurora Hills

city   string  optional  

Filter by city, can be comma-separated ID or name value. Example: 111,222,333

district   string  optional  

Filter by district, can be comma-separated ID or name value. Example: 111,222,333

neighbourhood   string  optional  

Filter by neighbourhood, can be comma-separated ID or name value. Example: 111,222,333

sales_status   string  optional  

Filter by sales status. Example: Selling

Must be one of:
  • Cancelled
  • Developer Sold Out
  • Launching Soon
  • On Hold
  • Platinum Access & Selling
  • Registration Phase
  • Resale
  • Selling
construction_status   string  optional  

Filter by construction status. Example: Under Construction

Must be one of:
  • Complete
  • Pre-Construction
  • Under Construction
  • Cancelled
type   string  optional  

Filter by building type. Example: Condo

Must be one of:
  • Single Family Home
  • Condo
  • Townhouse
occupancy_date_min   string  optional  

Minimum occupancy date (YYYY-MM-DD). Must be a valid date. Example: 2025-01-01

occupancy_date_max   string  optional  

Maximum occupancy date (YYYY-MM-DD). Must be a valid date. Example: 2026-01-01

launch_date_min   string  optional  

Minimum launch date (YYYY-MM-DD). Must be a valid date. Example: 2024-01-01

launch_date_max   string  optional  

Maximum launch date (YYYY-MM-DD). Must be a valid date. Example: 2024-12-31

launch_psf_avg_min   number  optional  

Minimum launch price per square foot average. Example: 1000

launch_psf_avg_max   number  optional  

Maximum launch price per square foot average. Example: 2000

launch_price_min   number  optional  

Minimum launch price. Example: 300000

launch_price_max   number  optional  

Maximum launch price. Example: 900000

price_per_sqft_min   number  optional  

Minimum price per square foot. Example: 1000

price_per_sqft_max   number  optional  

Maximum price per square foot. Example: 2000

current_price_min   number  optional  

Minimum current price. Example: 400000

current_price_max   number  optional  

Maximum current price. Example: 800000

interior_size_min   number  optional  

Minimum interior size. Example: 500

interior_size_max   number  optional  

Maximum interior size. Example: 2000

maintenance_fees_min   number  optional  

Minimum maintenance fees. Example: 0.5

maintenance_fees_max   number  optional  

Maximum maintenance fees. Example: 1.5

parking_price_min   number  optional  

Minimum parking price. Example: 20000

parking_price_max   number  optional  

Maximum parking price. Example: 50000

locker_price_min   number  optional  

Minimum locker price. Example: 2000

locker_price_max   number  optional  

Maximum locker price. Example: 10000

deposit_min   number  optional  

Minimum deposit. Example: 5

deposit_max   number  optional  

Maximum deposit. Example: 20

developer   string  optional  

Filter by developer name. Example: Tridel

architect   string  optional  

Filter by architect name or slug. Example: KPMB

sales_marketing_company   string  optional  

Filter by sales and marketing company. Example: Baker

storeys_min   integer  optional  

Minimum number of storeys. Example: 10

storeys_max   integer  optional  

Maximum number of storeys. Example: 40

building_height_min   number  optional  

Minimum building height (meters). Example: 50

building_height_max   number  optional  

Maximum building height (meters). Example: 150

suites_min   integer  optional  

Minimum number of suites. Example: 100

suites_max   integer  optional  

Maximum number of suites. Example: 300

beds_min   integer  optional  

Minimum number of bedrooms. Example: 1

beds_max   integer  optional  

Maximum number of bedrooms. Example: 3

sort_by   string  optional  

Sort by field. Example: price_per_sqft

Must be one of:
  • updated_at
  • launch_date
  • price_per_sqft
sort_direction   string  optional  

Sort direction. Options: asc, desc. Example: asc

Must be one of:
  • asc
  • desc
per_page   integer  optional  

Number of projects per page. Default: 20. Max: 50. Must be at least 1. Must not be greater than 50. Example: 50

page   integer  optional  

The page number for pagination. Must be at least 1. Example: 2

search   string  optional  

Comprehensive search across project name, description, developer name, city, district, and neighbourhood. Example: Tridel downtown toronto

Documents

List all documents for a project

requires authentication

Retrieve a list of all documents for a specific project with pagination.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/projects/5/documents?page=2&per_page=50" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/projects/5/documents';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '2',
            'per_page' => '50',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/projects/5/documents"
);

const params = {
    "page": "2",
    "per_page": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/projects/5/documents'
params = {
  'page': '2',
  'per_page': '50',
}
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Successful response):


{
    "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
    }
}
 

Request      

GET api/v1/projects/{project_id}/documents

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

project_id   integer   

The ID of the project. Example: 5

Query Parameters

page   integer  optional  

The page number for pagination. Example: 2

per_page   integer  optional  

Number of documents per page. Default: 20. Max: 50. Example: 50

Get a single document in a project

requires authentication

Retrieve detailed information about a document by its ID within a given project.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/projects/5/documents/1" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/projects/5/documents/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/projects/5/documents/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/projects/5/documents/1'
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Successful response):


{
    "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"
    }
}
 

Request      

GET api/v1/projects/{project_id}/documents/{document_id}

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

project_id   integer   

The ID of the project. Example: 5

document_id   integer   

The ID of the document. Example: 1

Architects

List all architects

requires authentication

Retrieve a collection of all architects with pagination.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/architects?search=Zaha&page=2&per_page=50" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/architects';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'search' => 'Zaha',
            'page' => '2',
            'per_page' => '50',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/architects"
);

const params = {
    "search": "Zaha",
    "page": "2",
    "per_page": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/architects'
params = {
  'search': 'Zaha',
  'page': '2',
  'per_page': '50',
}
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Successful response):


{
    "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
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/architects

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

search   string  optional  

Search architects by name. Example: Zaha

page   integer  optional  

The page number for pagination. Example: 2

per_page   integer  optional  

Number of architects per page. Default: 20. Max: 50. Example: 50

Get a single architect

requires authentication

Retrieve details of a specific architect by their unique ID.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/architects/1" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/architects/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/architects/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/architects/1'
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Successful response):


{
    "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"
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/architects/{id}

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   integer   

The ID of the architect. Example: 1

Cities

List all cities

requires authentication

Retrieve a collection of all cities with pagination.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/cities?search=Toronto&page=2&per_page=50" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/cities';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'search' => 'Toronto',
            'page' => '2',
            'per_page' => '50',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/cities"
);

const params = {
    "search": "Toronto",
    "page": "2",
    "per_page": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/cities'
params = {
  'search': 'Toronto',
  'page': '2',
  'per_page': '50',
}
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Successful response):


{
    "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
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/cities

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

search   string  optional  

Search cities by name. Example: Toronto

page   integer  optional  

The page number for pagination. Example: 2

per_page   integer  optional  

Number of cities per page. Default: 20. Max: 50. Example: 50

Get a single city

requires authentication

Retrieve details of a specific city by its unique ID.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/cities/1" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/cities/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/cities/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/cities/1'
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Successful response):


{
    "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"
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/cities/{id}

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   integer   

The ID of the city. Example: 1

Developers

List all developers

requires authentication

Retrieve a collection of all developers with pagination.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/developers?search=Great&page=2&per_page=50" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/developers';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'search' => 'Great',
            'page' => '2',
            'per_page' => '50',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/developers"
);

const params = {
    "search": "Great",
    "page": "2",
    "per_page": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/developers'
params = {
  'search': 'Great',
  'page': '2',
  'per_page': '50',
}
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Successful response):


{
    "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
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/developers

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

search   string  optional  

Search developers by name. Example: Great

page   integer  optional  

The page number for pagination. Example: 2

per_page   integer  optional  

Number of developers per page. Default: 20. Max: 50. Example: 50

Get a single developer

requires authentication

Retrieve details of a specific developer by its unique ID.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/developers/1" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/developers/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/developers/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/developers/1'
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Successful response):


{
    "data": {
        "id": 1,
        "name": "Great Builders Ltd.",
        "website": "https://greatbuilders.example.com",
        "logo": "https://example.com/storage/logos/greatbuilders.png"
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/developers/{id}

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   integer   

The ID of the developer. Example: 1

Districts

List all districts

requires authentication

Retrieve a collection of all districts with pagination.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/districts?search=Central&page=2&per_page=50" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/districts';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'search' => 'Central',
            'page' => '2',
            'per_page' => '50',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/districts"
);

const params = {
    "search": "Central",
    "page": "2",
    "per_page": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/districts'
params = {
  'search': 'Central',
  'page': '2',
  'per_page': '50',
}
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Successful response):


{
    "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
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/districts

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

search   string  optional  

Search districts by name. Example: Central

page   integer  optional  

The page number for pagination. Example: 2

per_page   integer  optional  

Number of districts per page. Default: 20. Max: 50. Example: 50

Get a single district

requires authentication

Retrieve details of a specific district by its unique ID.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/districts/1" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/districts/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/districts/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/districts/1'
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Successful response):


{
    "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"
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/districts/{id}

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   integer   

The ID of the district. Example: 1

Interior Designers

List all interior designers

requires authentication

Retrieve a collection of all interior designers with pagination.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/interior-designers?search=Kelly&page=2&per_page=50" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/interior-designers';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'search' => 'Kelly',
            'page' => '2',
            'per_page' => '50',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/interior-designers"
);

const params = {
    "search": "Kelly",
    "page": "2",
    "per_page": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/interior-designers'
params = {
  'search': 'Kelly',
  'page': '2',
  'per_page': '50',
}
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Successful response):


{
    "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
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/interior-designers

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

search   string  optional  

Search interior designers by name. Example: Kelly

page   integer  optional  

The page number for pagination. Example: 2

per_page   integer  optional  

Number of interior designers per page. Default: 20. Max: 50. Example: 50

Get a single interior designer

requires authentication

Retrieve details of a specific interior designer by their unique ID.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/interior-designers/1" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/interior-designers/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/interior-designers/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/interior-designers/1'
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Successful response):


{
    "data": {
        "id": 1,
        "name": "Kelly Hoppen",
        "created_at": "2024-05-01T08:13:17.000000Z",
        "updated_at": "2024-05-15T08:13:17.000000Z"
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/interior-designers/{id}

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   integer   

The ID of the interior designer. Example: 1

Neighbourhoods

List all neighbourhoods

requires authentication

Retrieve a collection of all neighbourhoods with pagination.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/neighbourhoods?search=Downtown&page=2&per_page=50" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/neighbourhoods';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'search' => 'Downtown',
            'page' => '2',
            'per_page' => '50',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/neighbourhoods"
);

const params = {
    "search": "Downtown",
    "page": "2",
    "per_page": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/neighbourhoods'
params = {
  'search': 'Downtown',
  'page': '2',
  'per_page': '50',
}
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Successful response):


{
    "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
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/neighbourhoods

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

search   string  optional  

Search neighbourhoods by name. Example: Downtown

page   integer  optional  

The page number for pagination. Example: 2

per_page   integer  optional  

Number of neighbourhoods per page. Default: 20. Max: 50. Example: 50

Get a single neighbourhood

requires authentication

Retrieve details of a specific neighbourhood by its unique ID.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/neighbourhoods/1" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/neighbourhoods/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/neighbourhoods/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/neighbourhoods/1'
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Successful response):


{
    "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"
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/neighbourhoods/{id}

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   integer   

The ID of the neighbourhood. Example: 1

Prices

List all prices

requires authentication

Retrieve a collection of all prices with pagination.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/prices?page=2&per_page=50&projects_id=1111%2C222%2C333&floorplans_id=1111%2C222%2C333" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/prices';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '2',
            'per_page' => '50',
            'projects_id' => '1111,222,333',
            'floorplans_id' => '1111,222,333',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/prices"
);

const params = {
    "page": "2",
    "per_page": "50",
    "projects_id": "1111,222,333",
    "floorplans_id": "1111,222,333",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/prices'
params = {
  'page': '2',
  'per_page': '50',
  'projects_id': '1111,222,333',
  'floorplans_id': '1111,222,333',
}
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Successful response):


{
  "data": [
    {
      "id": 1,
      "project_id": 5,
      "floorplan_id": 11,
      "amount": 750000,
      "amount_psf": 1100,
      "valid_from": "2024-05-01",
    }
  ],
  "links": {
    "first": "http://your-app.test/api/v1/prices?page=1",
    "last": "http://your-app.test/api/v1/prices?page=5",
    "prev": null,
    "next": "http://your-app.test/api/v1/prices?page=2"
  },
  "meta": {
    "current_page": 1,
    "from": 1,
    "last_page": 5,
    "path": "http://your-app.test/api/v1/prices",
    "per_page": 20,
    "to": 20,
    "total": 100
  }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/prices

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

The page number for pagination. Example: 2

per_page   integer  optional  

Number of prices per page. Default: 20. Max: 50. Example: 50

projects_id   string  optional  

Filter by project, comma-separated list of IDs. Example: 1111,222,333

floorplans_id   string  optional  

Filter by floorplan, comma-separated list of IDs. Example: 1111,222,333

Get a single price

requires authentication

Retrieve details of a specific price by its unique ID.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/prices/1" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/prices/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/prices/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/prices/1'
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Successful response):


{
    "data": {
        "id": 1,
        "project_id": 5,
        "floorplan_id": 11,
        "amount": 750000,
        "amount_psf": 1100,
        "valid_from": "2024-05-01"
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/prices/{id}

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   integer   

The ID of the price. Example: 1

Sales & Marketing Companies

List all sales & marketing companies

requires authentication

Retrieve a collection of all sales & marketing companies with pagination.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/sales-marketing-companies?search=Realty&page=2&per_page=50" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/sales-marketing-companies';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'search' => 'Realty',
            'page' => '2',
            'per_page' => '50',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/sales-marketing-companies"
);

const params = {
    "search": "Realty",
    "page": "2",
    "per_page": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/sales-marketing-companies'
params = {
  'search': 'Realty',
  'page': '2',
  'per_page': '50',
}
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Successful response):


{
  "data": [
    {
      "id": 1,
      "name": "Realty Sales Inc.",
      "slug": "realty-sales-inc",
    }
  ],
  "links": {
    "first": "http://your-app.test/api/v1/sales-marketing-companies?page=1",
    "last": "http://your-app.test/api/v1/sales-marketing-companies?page=5",
    "prev": null,
    "next": "http://your-app.test/api/v1/sales-marketing-companies?page=2"
  },
  "meta": {
    "current_page": 1,
    "from": 1,
    "last_page": 5,
    "path": "http://your-app.test/api/v1/sales-marketing-companies",
    "per_page": 20,
    "to": 20,
    "total": 100
  }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sales-marketing-companies

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

search   string  optional  

Search sales & marketing companies by name. Example: Realty

page   integer  optional  

The page number for pagination. Example: 2

per_page   integer  optional  

Number of sales & marketing companies per page. Default: 20. Max: 50. Example: 50

Get a single sales & marketing company

requires authentication

Retrieve details of a specific sales & marketing company by its unique ID.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/sales-marketing-companies/1" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/sales-marketing-companies/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/sales-marketing-companies/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/sales-marketing-companies/1'
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Successful response):


{
  "data": {
    "id": 1,
    "name": "Realty Sales Inc.",
    "slug": "realty-sales-inc",
  }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sales-marketing-companies/{id}

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   integer   

The ID of the sales & marketing company. Example: 1

Special Incentives

List all special incentives

requires authentication

Retrieve a collection of all special incentives with pagination.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/special-incentives?search=Early&page=2&per_page=50" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/special-incentives';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'search' => 'Early',
            'page' => '2',
            'per_page' => '50',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/special-incentives"
);

const params = {
    "search": "Early",
    "page": "2",
    "per_page": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/special-incentives'
params = {
  'search': 'Early',
  'page': '2',
  'per_page': '50',
}
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Successful response):


{
    "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
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/special-incentives

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

search   string  optional  

Search special incentives by name. Example: Early

page   integer  optional  

The page number for pagination. Example: 2

per_page   integer  optional  

Number of special incentives per page. Default: 20. Max: 50. Example: 50

Get a single special incentive

requires authentication

Retrieve details of a specific special incentive by its unique ID.

Example request:
curl --request GET \
    --get "https://api-staging.redbricksdata.com/api/v1/special-incentives/1" \
    --header "Authorization: Bearer {YOUR_TEAM_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/api/v1/special-incentives/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_TEAM_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/api/v1/special-incentives/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_TEAM_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/api/v1/special-incentives/1'
headers = {
  'Authorization': 'Bearer {YOUR_TEAM_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Successful response):


{
    "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"
    }
}
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/special-incentives/{id}

Headers

Authorization      

Example: Bearer {YOUR_TEAM_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   integer   

The ID of the special incentive. Example: 1

Webhooks

Real-time notifications for data changes in the Red Bricks API

Receive Webhook

This endpoint receives webhook notifications from the Red Bricks API when data changes occur.

Overview

Webhooks 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.

Available Events

Signature Verification

The webhook signature is calculated using HMAC-SHA256:

$signature = hash_hmac('sha256', $payload, $secret);

Important: Always verify the signature before processing webhook data to ensure the request came from the Red Bricks API.

Implementation Example

<?php
// Get the raw POST body
$receivedPayloadJson = file_get_contents('php://input');

// Get the signature from headers
$receivedSignature = $_SERVER['Signature'] ?? '';

// Your webhook secret (configured when creating the webhook)
$secret = 'your-webhook-secret';

// Calculate the expected signature
$calculatedSignature = hash_hmac('sha256', $receivedPayloadJson, $secret);

// Verify the signature
if (hash_equals($calculatedSignature, $receivedSignature)) {
    // Webhook is valid
    $payload = json_decode($receivedPayloadJson, true);

    // Process the webhook data
    $event = $payload['event'];
    $data = $payload['data'];

    // Handle different events
    switch ($event) {
        case 'project.created':
            handleProjectCreated($data);
            break;
        case 'project.updated':
            handleProjectUpdated($data);
            break;
        case 'floorplan.created':
            handleFloorplanCreated($data);
            break;
        case 'floorplan.updated':
            handleFloorplanUpdated($data);
            break;
        case 'document.created':
            handleDocumentCreated($data);
            break;
        // ... handle other events
    }

    // Return success response
    http_response_code(200);
    echo json_encode(['status' => 'success']);
} else {
    // Invalid signature
    http_response_code(401);
    echo json_encode(['error' => 'Invalid signature']);
}
?>
Example request:
curl --request POST \
    "https://api-staging.redbricksdata.com/webhooks/receive"
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.redbricksdata.com/webhooks/receive';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://api-staging.redbricksdata.com/webhooks/receive"
);

fetch(url, {
    method: "POST",
}).then(response => response.json());
import requests
import json

url = 'https://api-staging.redbricksdata.com/webhooks/receive'
response = requests.request('POST', url, )
response.json()

Request      

POST webhooks/receive