Bridge API Reference
Quick reference for working with Bridge/RESO Web API (OData)
Quick reference for working with Bridge/RESO Web API (OData).
https://api.bridgedataoutput.com/api/v2/OData/{dataset_id}/
Common datasets:
test — Sandbox/test data
- Your actual dataset ID (provided by Bridge)
Pass token as query parameter:
Or as header:
Authorization: Bearer YOUR_TOKEN
| Resource | Path | Description |
|---|
| Property | /Property | Listings |
| Media | /Media | Photos (or expand with Property) |
| Member | /Member | Agents |
| Office | /Office | Brokerages |
| OpenHouse | /OpenHouse | Upcoming open houses |
| Parameter | Description | Example |
|---|
$filter | Filter results | StandardStatus eq 'Active' |
$select | Choose fields | ListingKey,ListPrice,City |
$top | Limit results (max 200) | 200 |
$skip | Pagination offset | 200 |
$orderby | Sort results | ModificationTimestamp desc |
$expand | Include related data | Media |
$count | Include total count | true |
| Operator | Description | Example |
|---|
eq | Equals | City eq 'Miami' |
ne | Not equals | Status ne 'Closed' |
gt | Greater than | ListPrice gt 500000 |
ge | Greater than or equal | Bedrooms ge 3 |
lt | Less than | ListPrice lt 1000000 |
le | Less than or equal | YearBuilt le 2020 |
and | Logical AND | City eq 'Miami' and Bedrooms ge 2 |
or | Logical OR | City eq 'Miami' or City eq 'Miami Beach' |
contains() | String contains | contains(City, 'Miami') |
ISO 8601 format for timestamps:
ModificationTimestamp gt 2024-01-15T00:00:00Z
/Property?$filter=StandardStatus eq 'Active'&$top=200
/Property?$filter=ModificationTimestamp gt 2024-01-15T12:00:00Z&$orderby=ModificationTimestamp asc&$top=200
/Property?$expand=Media&$top=200
/Property?$select=ListingKey,ListPrice,City,BedroomsTotal&$top=200
/Property?$count=true&$top=1
{
"@odata.context": "...",
"@odata.count": 2847,
"@odata.nextLink": "https://api.bridgedataoutput.com/api/v2/OData/test/Property?$skip=200",
"value": [
{
"ListingKey": "123456",
"ListingId": "A123456",
"StandardStatus": "Active",
"ModificationTimestamp": "2024-01-15T14:30:00Z",
"PropertyType": "Condominium",
"ListPrice": 750000,
"BedroomsTotal": 2,
"BathroomsTotalInteger": 2,
"LivingArea": 1250,
"City": "Miami Beach",
"StateOrProvince": "FL",
"PostalCode": "33139",
"UnparsedAddress": "123 Ocean Dr #4A",
"SubdivisionName": "South Beach",
"BuildingName": "The Ocean Tower",
"Latitude": 25.7617,
"Longitude": -80.1918,
"PublicRemarks": "Stunning ocean view...",
"Media": [
{
"MediaKey": "m123",
"MediaURL": "https://...",
"Order": 1,
"MediaCategory": "Photo"
}
]
}
]
}
| RESO Field | Description |
|---|
ListingKey | Primary key (unique across system) |
ListingId | MLS number (user-facing) |
StandardStatus | Active, Pending, Closed, etc. |
ModificationTimestamp | Last modified (for sync) |
OriginalEntryTimestamp | First listed |
| RESO Field | Description |
|---|
PropertyType | Condominium, Single Family, etc. |
PropertySubType | More specific type |
BedroomsTotal | Bedroom count |
BathroomsTotalInteger | Bathroom count (integer) |
BathroomsFull | Full bathrooms |
BathroomsHalf | Half bathrooms |
LivingArea | Square footage |
LotSizeSquareFeet | Lot size |
YearBuilt | Year constructed |
| RESO Field | Description |
|---|
ListPrice | Current asking price |
ClosePrice | Final sale price (if closed) |
OriginalListPrice | Initial list price |
PricePerSquareFoot | Calculated $/sqft |
| RESO Field | Description |
|---|
UnparsedAddress | Full address string |
StreetNumber | Street number |
StreetName | Street name |
UnitNumber | Apt/unit number |
City | City name |
StateOrProvince | State code |
PostalCode | ZIP code |
CountyOrParish | County |
SubdivisionName | Neighborhood |
BuildingName | Condo/building name |
Latitude | GPS latitude |
Longitude | GPS longitude |
| RESO Field | Description |
|---|
PublicRemarks | Marketing description |
PrivateRemarks | Agent-only notes (not public!) |
Directions | Driving directions |
| RESO Field | Description |
|---|
ListingContractDate | Date listing agreement signed |
OnMarketDate | Date went active |
CloseDate | Sale closing date |
ExpirationDate | Listing expiration |
| RESO Field | Description |
|---|
ListAgentKey | Listing agent ID |
ListAgentFullName | Agent name |
ListOfficeName | Brokerage name |
BuyerAgentKey | Buyer agent (if closed) |
Bridge limits to 200 results per request.
let skip = 0;
let hasMore = true;
while (hasMore) {
const response = await fetch(`${baseUrl}/Property?$top=200&$skip=${skip}`);
const data = await response.json();
// Process data.value
hasMore = data.value.length === 200;
skip += 200;
}
let url = `${baseUrl}/Property?$top=200`;
while (url) {
const response = await fetch(url);
const data = await response.json();
// Process data.value
url = data['@odata.nextLink'] || null;
}
- Check your Bridge subscription for specific limits
- Generally safe: 1-2 requests/second for bulk operations
- Add delay between pages:
await sleep(100)
| Status | Meaning | Action |
|---|
| 401 | Invalid token | Check token, refresh if OAuth |
| 403 | Access denied | Check dataset permissions |
| 404 | Resource not found | Check dataset ID |
| 429 | Rate limited | Back off, retry with delay |
| 500 | Server error | Retry with backoff |
async function fetchWithRetry(url, maxRetries = 3) {
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
const response = await fetch(url);
if (response.status === 429) {
// Rate limited - wait and retry
await sleep(1000 * attempt);
continue;
}
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
return await response.json();
} catch (error) {
if (attempt === maxRetries) throw error;
await sleep(1000 * Math.pow(2, attempt - 1));
}
}
}
Quick test to verify credentials:
GET /Property?$top=1&$count=true
Success response includes @odata.count with total listings.