API Status: Operational

Repliers MLS® API Reference

Complete integration guide for HomeSignal's property data engine. Repliers provides normalized MLS® data across Canada and US, with built-in image CDN, AI-powered search, property estimates, webhooks, and real-time listing sync.

1
API Key
Multiple
MLS® Boards
Real-time
Listing Sync
CDN
Image Delivery
AI
Powered Search
API Categories
Everything Repliers covers for HomeSignal
Property Search & Filtering
Price, beds, baths, city, type, status, sqft — full filter suite
Market Reports & Analytics
Real-time market stats, trends, DOM, sold price ratios
AI Property Estimates
AI-powered AVM valuations for any address instantly
Property Photos CDN
Hosted image CDN with dynamic resizing and WEBP conversion
Webhooks
Real-time listing event notifications via HTTP push
Saved Searches & Alerts
Automate alerts for new listings matching client criteria
Favorites & Saved Listings
Manage client-side saved property lists per user
Geo Search & Polygons
Map-based searches with GeoJSON polygon support
MLS® Board Coverage
TRREB, CREA DDF®, GVR, FVREB and more boards
Data Normalization
Unified field schema across all MLS® boards
Client-Side API Keys
Restrict keys by domain for safe frontend use
Property History
Access historical listing and sale data per property
Authentication
Two methods — header auth is recommended
Your API Key: iUxwvExYsFxgF5QEo1rQjHdokyymTh — Use this in the header REPLIERS-API-KEY on all requests.
Method 2: Query Param

Append the key as a URL query parameter. Simpler but key appears in server logs and browser history.

URL
https://api.repliers.io/listings
  ?repliers_api_key=iUxwvExYsFxgF5QEo1rQjHdokyymTh
cURL
# Header Authentication (Recommended)
curl -X GET "https://api.repliers.io/listings" \
  -H "REPLIERS-API-KEY: iUxwvExYsFxgF5QEo1rQjHdokyymTh" \
  -H "Content-Type: application/json"

# With filters
curl -X GET "https://api.repliers.io/listings?minPrice=500000&maxPrice=800000&minBedrooms=3&city=Toronto" \
  -H "REPLIERS-API-KEY: iUxwvExYsFxgF5QEo1rQjHdokyymTh"
JavaScript (fetch)
const fetchListings = async (params = {}) => {
  const url = new URL('https://api.repliers.io/listings');
  Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));

  const res = await fetch(url.toString(), {
    method: 'GET',
    headers: {
      'REPLIERS-API-KEY': 'iUxwvExYsFxgF5QEo1rQjHdokyymTh',
      'Content-Type': 'application/json'
    }
  });

  if (!res.ok) throw new Error(`Repliers API error: ${res.status}`);
  return res.json();
};

// Usage
const data = await fetchListings({
  minPrice: 500000,
  maxPrice: 800000,
  minBedrooms: 3,
  city: 'Toronto'
});
Cloudflare Worker (Proxy)
// workers/repliers-proxy.js
// Store key via: wrangler secret put REPLIERS_API_KEY

export default {
  async fetch(request, env) {
    const url = new URL(request.url);
    const path = url.pathname.replace('/api/repliers', '');
    const apiUrl = `https://api.repliers.io${path}${url.search}`;

    // Forward to Repliers with secret key in header
    const res = await fetch(apiUrl, {
      headers: {
        'REPLIERS-API-KEY': env.REPLIERS_API_KEY,
        'Content-Type': 'application/json'
      }
    });

    return new Response(res.body, {
      status: res.status,
      headers: {
        'Content-Type': 'application/json',
        'Access-Control-Allow-Origin': '*'
      }
    });
  }
};
Cloudflare Worker pattern: Never expose your API key in frontend code. The Worker acts as a proxy — your key stays in wrangler secret, never in client-side JS.
Python (requests)
import requests

headers = {
    'REPLIERS-API-KEY': 'iUxwvExYsFxgF5QEo1rQjHdokyymTh',
    'Content-Type': 'application/json'
}
params = {
    'minPrice': 500000,
    'maxPrice': 800000,
    'minBedrooms': 3,
    'city': 'Toronto'
}
res = requests.get('https://api.repliers.io/listings', headers=headers, params=params)
data = res.json()
Error Responses
StatusErrorCauseFix
401Invalid API keyKey missing, malformed, or expiredCheck header name is exactly REPLIERS-API-KEY
403ForbiddenKey lacks access to this MLS® boardRequest board access via Developer Portal
404Not foundListing ID doesn't existVerify mlsNumber or listingId
429Rate limit exceededToo many requests per minuteImplement exponential backoff
Base URLs
All requests go to these endpoints
API BaseREST
https://api.repliers.io
Image CDNCDN
https://cdn.repliers.io
Developer PortalDashboard
https://login.repliers.com
Help CenterDocs
https://help.repliers.com/en/
Rate Limits & Usage
API plans accommodate all scales
Rate limits apply per API key. When you exceed limits, the API returns HTTP 429. Implement exponential backoff and cache responses where possible. Monthly allowances reset on billing cycle date.
PlanRequests/minMonthly AllowanceOverageFeatures
Starter 60/minContact RepliersPer-request billing ListingsImages
Pro 120/minContact RepliersPer-request billing All EndpointsWebhooksAI Search
Enterprise CustomCustomNegotiated Custom BoardsSLADedicated Support
Property Search & Listings
The core endpoint — search, filter, paginate MLS® listings
GET /listings Search listings with filters and pagination

Price Filters

ParameterTypeRequiredDescription
minPricenumberOptionalMinimum listing price in local currency
maxPricenumberOptionalMaximum listing price in local currency

Location Filters

ParameterTypeRequiredDescription
citystringOptionalCity name (e.g. "Toronto", "New York", "Vancouver")
neighborhoodstringOptionalNeighborhood or district name
postalCodestringOptionalPostal/ZIP code filter
mapstringOptionalBounding box: sw_lat,sw_lng,ne_lat,ne_lng
boardIdnumberOptionalTarget specific MLS® board ID

Property Filters

ParameterTypeRequiredDescription
minBedroomsnumberOptionalMinimum number of bedrooms
maxBedroomsnumberOptionalMaximum number of bedrooms
minBathsnumberOptionalMinimum number of bathrooms
maxBathsnumberOptionalMaximum number of bathrooms
minSqftnumberOptionalMinimum square footage
maxSqftnumberOptionalMaximum square footage
propertyTypestringOptionalProperty type: house, condo, townhouse, land, commercial
statusstringOptionalListing status: A (Active), U (Sold/Closed), P (Pending)
hasGaragebooleanOptionalFilter for listings with garage
hasPoolbooleanOptionalFilter for listings with pool

Pagination & Sorting

ParameterTypeDefaultDescription
resultsPerPagenumber10Results per page (max 100)
pageNumnumber1Page number for pagination
sortBystringSort field: createdOnDesc, listPriceAsc, listPriceDesc, bedroomsAsc
Example: 3BR homes under $800k in Toronto
GET https://api.repliers.io/listings
  ?minBedrooms=3
  &maxPrice=800000
  &city=Toronto
  &status=A
  &resultsPerPage=20
  &sortBy=listPriceAsc

REPLIERS-API-KEY: iUxwvExYsFxgF5QEo1rQjHdokyymTh
numPagesnumber
Total pages available for this query
pagenumber
Current page number
listingsarray
Array of listing objects. Each contains: mlsNumber, listPrice, address, details (beds, baths, sqft), images (CDN paths), daysOnMarket, status, map (lat/lng), office, agents
statisticsobject
Market stats for this search result set
GET /listings/{mlsNumber} Get full detail for a single listing by MLS® number
ParameterTypeRequiredDescription
mlsNumberstringRequiredMLS® listing number (path parameter)
boardIdnumberOptionalMLS® board ID (required for multi-board keys)
Example
GET https://api.repliers.io/listings/E8418368
REPLIERS-API-KEY: iUxwvExYsFxgF5QEo1rQjHdokyymTh
Market Statistics
Real-time market analytics for any search criteria
GET /listings?statistics=true Returns aggregated market stats with your search results
Statistics are returned alongside listing results. Add statistics=true to any listing query to get market analytics for that search context (avg price, median DOM, sold-to-list ratio, etc.).
statistics.avgListPricenumber
Average list price for the queried results
statistics.avgSoldPricenumber
Average sold price (for sold listings)
statistics.avgDaysOnMarketnumber
Average days on market for active listings
statistics.soldToListRationumber
Sold-to-list price ratio (e.g. 1.02 = 2% over asking)
AI Property Estimates (AVM)
AI-powered automated valuation model — instant property estimates
GET /property-estimates Get AI-powered AVM estimate for a property address
ParameterTypeRequiredDescription
addressstringRequiredFull property address
citystringRequiredCity of the property
This is what powers the AI Copilot's valuation cards in HomeSignal. One API call gives you: estimated value, confidence score, comparable sales, and price-per-sqft metrics — all normalized from live MLS® data.
Webhooks
Real-time listing event push notifications to your endpoint
Webhooks push listing events to your URL in real-time. Configure via Developer Portal: set your endpoint URL + events to subscribe to. Repliers signs each payload — verify the signature before processing.
Webhook Event Types
EventTriggerUse Case
listing.newNew listing added to MLS®Alert clients of new matches
listing.updatedPrice change, status update, new photosKeep listings fresh in real-time
listing.soldListing changes to Sold statusTrigger sold notification flows
listing.expiredListing expires from MLS®Re-engagement campaign trigger
listing.removedListing pulled from MLS®Clean up saved/favorited listings
Webhook Payload Example
{
  "event": "listing.new",
  "timestamp": "2026-04-15T10:30:00Z",
  "listing": {
    "mlsNumber": "E8418368",
    "listPrice": 749000,
    "address": {
      "streetNumber": "123",
      "streetName": "Main St",
      "city": "Toronto"
    },
    "details": {
      "numBedrooms": 3,
      "numBaths": 2,
      "sqft": 1400
    },
    "images": ["area/IMG-E8418368_1.jpg"]
  }
}
Favorites & Saved Listings
Manage per-user saved property lists
GET /favorites Get all favorites for the authenticated user

Returns an array of saved listing objects for the current user context.

POST /favorites Add a listing to user favorites
Request Body
{ "mlsNumber": "E8418368", "boardId": 20 }
DELETE /favorites/{mlsNumber} Remove a listing from user favorites

Path parameter mlsNumber is the MLS® number of the listing to remove.

Saved Searches & Alerts
Automate new listing alerts for saved client criteria
POST /saved-searches Create a saved search with alert notifications
Request Body
{
  "name": "Downtown Toronto 3BR under $800k",
  "filters": {
    "city": "Toronto",
    "minBedrooms": 3,
    "maxPrice": 800000,
    "status": "A"
  },
  "notifications": {
    "email": "client@example.com",
    "frequency": "instant"
  }
}
Property Photos CDN
Dynamic image resizing, WEBP conversion, shared caching
CDN Base URL: https://cdn.repliers.io/ — Prefix this to any image path from the listings API response. No additional auth needed for image requests.
Image URL Construction
// Images array from listing response:
"images": [
  "area/IMG-N8418368_1.jpg",
  "area/IMG-N8418368_2.jpg"
]

// Construct full CDN URL:
const imgUrl = `https://cdn.repliers.io/${listing.images[0]}`;
// → https://cdn.repliers.io/area/IMG-N8418368_1.jpg

// Custom size (append query params):
`https://cdn.repliers.io/${img}?w=800&h=600&fit=crop`
Default Mobilemax-width
800px — served automatically to mobile user-agents
Default Desktopmax-width
1600px — served automatically to desktop user-agents
Formatauto
Automatically returns WEBP if browser supports it
Cachingshared CDN
Shared cache across all Repliers customers — faster loads, lower bandwidth
Geo Search & Map Polygons
Map-based property search with bounding box or GeoJSON polygon
GeoJSON polygon limit: If your polygon is too detailed and causes a 414 (URL Too Long) error, switch to a POST request with the polygon in the request body instead of the query string.
Bounding Box Search
GET https://api.repliers.io/listings
  ?map=43.60,-79.50,43.70,-79.30
  &status=A

# Format: sw_lat,sw_lng,ne_lat,ne_lng
GeoJSON Polygon Search (POST for large polygons)
POST https://api.repliers.io/listings
REPLIERS-API-KEY: iUxwvExYsFxgF5QEo1rQjHdokyymTh
Content-Type: application/json

{
  "geoFilter": {
    "type": "Polygon",
    "coordinates": [[
      [-79.50, 43.60], [-79.30, 43.60],
      [-79.30, 43.70], [-79.50, 43.70],
      [-79.50, 43.60]
    ]]
  },
  "status": "A",
  "minBedrooms": 3
}
Client-Side API Keys
Domain-restricted keys safe to use in browser JavaScript
Client-side keys are a special key type restricted to specific domains you configure in the Developer Portal. They can be safely included in frontend code. For HomeSignal's multi-tenant model, create one client-side key per tenant domain and store in Cloudflare KV.
Server-Side KeyPRIVATE
Full API access. Never expose in client code. Use in Cloudflare Worker proxy only. Store via wrangler secret put REPLIERS_API_KEY
Client-Side KeyPUBLIC-SAFE
Domain-restricted. Safe in frontend JS. Create in Developer Portal → restrict to yourdomain.com. Faster searches (no proxy hop).
MLS® Board Coverage
Repliers-supported boards — one API key for all
MLS® data access requires board approval. Repliers handles the data licensing and normalization. You (or your real estate professional client) must have a valid MLS® membership for the board(s) you want to access. Developers building for agents must get MLS® approval as a vendor.
BoardRegionData TypeHistorical
TRREBToronto, Ontario, CanadaActiveSold✓ Yes
CREA DDF®Canada (National)Active Only✗ No
GVR (REBGV)Greater Vancouver, BCActiveSold✓ Yes
FVREBFraser Valley, BCActiveSold✓ Yes
Centris (Quebec)Quebec, CanadaActive✗ No
Single key, multiple boards: With one Repliers API key you can access multiple MLS® boards simultaneously. Repliers handles deduplication of listings that appear across boards. Set boardId param to target a specific board.
Data Normalization
Unified field schema across all MLS® boards — no custom mapping needed

Each MLS® board has its own field names, formats, and conventions. Repliers normalizes all boards into a single consistent schema so you build once and it works everywhere.

Normalized Listing Fields
mlsNumberstring
Unique MLS® listing identifier
listPricenumber
Current listing price
soldPricenumber
Final sold price (for sold listings)
addressobject
streetNumber, streetName, city, state, zip
mapobject
latitude, longitude — always present
detailsobject
numBedrooms, numBaths, sqft, propertyType, style, garage
imagesarray
CDN image paths — prefix with https://cdn.repliers.io/
daysOnMarketnumber
Days listing has been on market
officeobject
Listing brokerage: name, phone
agentsarray
Listing agents: name, phone, email
Property History
Historical listing and sale data for a specific property
GET /listings?address={address}&history=true Get historical listing events for a property address

Returns all historical MLS® activity for a given property address — price changes, expired listings, previous sold events, and ownership history where available through MLS® data.

Historical data availability depends on the MLS® board. CREA DDF® provides active listings only — no history. TRREB, GVR, and other regional boards provide full historical sold data.
Live API Tester
Test Repliers endpoints directly from this page
Live Repliers API Test
Note: Direct browser calls to api.repliers.io may be blocked by CORS. In production, route all API calls through your Cloudflare Worker proxy. This tester works when your Worker is deployed.
Endpoint
City Filter (optional)
Full URL Preview