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.
iUxwvExYsFxgF5QEo1rQjHdokyymTh — Use this in the header REPLIERS-API-KEY on all requests.
Pass your API key as a request header. More secure — keeps key out of browser logs, history, and server logs.
REPLIERS-API-KEY: iUxwvExYsFxgF5QEo1rQjHdokyymTh Content-Type: application/json
Append the key as a URL query parameter. Simpler but key appears in server logs and browser history.
https://api.repliers.io/listings ?repliers_api_key=iUxwvExYsFxgF5QEo1rQjHdokyymTh
# 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"
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' });
// 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': '*' } }); } };
wrangler secret, never in client-side JS.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()
| Status | Error | Cause | Fix |
|---|---|---|---|
| 401 | Invalid API key | Key missing, malformed, or expired | Check header name is exactly REPLIERS-API-KEY |
| 403 | Forbidden | Key lacks access to this MLS® board | Request board access via Developer Portal |
| 404 | Not found | Listing ID doesn't exist | Verify mlsNumber or listingId |
| 429 | Rate limit exceeded | Too many requests per minute | Implement exponential backoff |
https://api.repliers.iohttps://cdn.repliers.iohttps://login.repliers.comhttps://help.repliers.com/en/| Plan | Requests/min | Monthly Allowance | Overage | Features |
|---|---|---|---|---|
| Starter | 60/min | Contact Repliers | Per-request billing | ListingsImages |
| Pro | 120/min | Contact Repliers | Per-request billing | All EndpointsWebhooksAI Search |
| Enterprise | Custom | Custom | Negotiated | Custom BoardsSLADedicated Support |
Price Filters
| Parameter | Type | Required | Description |
|---|---|---|---|
| minPrice | number | Optional | Minimum listing price in local currency |
| maxPrice | number | Optional | Maximum listing price in local currency |
Location Filters
| Parameter | Type | Required | Description |
|---|---|---|---|
| city | string | Optional | City name (e.g. "Toronto", "New York", "Vancouver") |
| neighborhood | string | Optional | Neighborhood or district name |
| postalCode | string | Optional | Postal/ZIP code filter |
| map | string | Optional | Bounding box: sw_lat,sw_lng,ne_lat,ne_lng |
| boardId | number | Optional | Target specific MLS® board ID |
Property Filters
| Parameter | Type | Required | Description |
|---|---|---|---|
| minBedrooms | number | Optional | Minimum number of bedrooms |
| maxBedrooms | number | Optional | Maximum number of bedrooms |
| minBaths | number | Optional | Minimum number of bathrooms |
| maxBaths | number | Optional | Maximum number of bathrooms |
| minSqft | number | Optional | Minimum square footage |
| maxSqft | number | Optional | Maximum square footage |
| propertyType | string | Optional | Property type: house, condo, townhouse, land, commercial |
| status | string | Optional | Listing status: A (Active), U (Sold/Closed), P (Pending) |
| hasGarage | boolean | Optional | Filter for listings with garage |
| hasPool | boolean | Optional | Filter for listings with pool |
Pagination & Sorting
| Parameter | Type | Default | Description |
|---|---|---|---|
| resultsPerPage | number | 10 | Results per page (max 100) |
| pageNum | number | 1 | Page number for pagination |
| sortBy | string | — | Sort field: createdOnDesc, listPriceAsc, listPriceDesc, bedroomsAsc |
GET https://api.repliers.io/listings ?minBedrooms=3 &maxPrice=800000 &city=Toronto &status=A &resultsPerPage=20 &sortBy=listPriceAsc REPLIERS-API-KEY: iUxwvExYsFxgF5QEo1rQjHdokyymTh
mlsNumber, listPrice, address, details (beds, baths, sqft), images (CDN paths), daysOnMarket, status, map (lat/lng), office, agents| Parameter | Type | Required | Description |
|---|---|---|---|
| mlsNumber | string | Required | MLS® listing number (path parameter) |
| boardId | number | Optional | MLS® board ID (required for multi-board keys) |
GET https://api.repliers.io/listings/E8418368 REPLIERS-API-KEY: iUxwvExYsFxgF5QEo1rQjHdokyymTh
statistics=true to any listing query to get market analytics for that search context (avg price, median DOM, sold-to-list ratio, etc.).| Parameter | Type | Required | Description |
|---|---|---|---|
| address | string | Required | Full property address |
| city | string | Required | City of the property |
| Event | Trigger | Use Case |
|---|---|---|
| listing.new | New listing added to MLS® | Alert clients of new matches |
| listing.updated | Price change, status update, new photos | Keep listings fresh in real-time |
| listing.sold | Listing changes to Sold status | Trigger sold notification flows |
| listing.expired | Listing expires from MLS® | Re-engagement campaign trigger |
| listing.removed | Listing pulled from MLS® | Clean up saved/favorited listings |
{
"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"]
}
}
Returns an array of saved listing objects for the current user context.
{ "mlsNumber": "E8418368", "boardId": 20 }
Path parameter mlsNumber is the MLS® number of the listing to remove.
{
"name": "Downtown Toronto 3BR under $800k",
"filters": {
"city": "Toronto",
"minBedrooms": 3,
"maxPrice": 800000,
"status": "A"
},
"notifications": {
"email": "client@example.com",
"frequency": "instant"
}
}
https://cdn.repliers.io/ — Prefix this to any image path from the listings API response. No additional auth needed for image requests.// 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`
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
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 }
wrangler secret put REPLIERS_API_KEYyourdomain.com. Faster searches (no proxy hop).| Board | Region | Data Type | Historical |
|---|---|---|---|
| TRREB | Toronto, Ontario, Canada | ActiveSold | ✓ Yes |
| CREA DDF® | Canada (National) | Active Only | ✗ No |
| GVR (REBGV) | Greater Vancouver, BC | ActiveSold | ✓ Yes |
| FVREB | Fraser Valley, BC | ActiveSold | ✓ Yes |
| Centris (Quebec) | Quebec, Canada | Active | ✗ No |
boardId param to target a specific board.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.
streetNumber, streetName, city, state, ziplatitude, longitude — always presentnumBedrooms, numBaths, sqft, propertyType, style, garagehttps://cdn.repliers.io/name, phonename, phone, emailReturns all historical MLS® activity for a given property address — price changes, expired listings, previous sold events, and ownership history where available through MLS® data.
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.