Resales Online
Search, fetch, and check connection status for Resales Online inventory through the Fondaro API.
The Resales Online endpoints proxy searches against the Resales Online MLS using the credentials your organization has stored under Integrations. Results are always live; nothing is cached in Fondaro's database.
Every endpoint requires a valid Clerk session and an active organization. If your organization has not configured Resales Online credentials, search and detail requests return a 400 with a message telling you where to add them.
Connection status
GET /resales-online/status
Authentication: Required (Clerk JWT + organization)
Returns whether the current organization has Resales Online credentials configured. Cheap to call; useful for UI gating.
Response
{
"connected": true
}| Field | Type | Description |
|---|---|---|
connected | boolean | true if Resales Online credentials exist for this organization |
Example
curl -X GET https://api.fondaro.com/resales-online/status \
-H "Authorization: Bearer <clerk_jwt>" \
-H "x-organization-id: <organization_id>"Search
POST /resales-online/search
Authentication: Required (Clerk JWT + organization, must be connected)
Runs a search against Resales Online V6 and returns normalized properties. Feature filters (featureIds) are applied server-side via Resales' P_MustHaveFeatures=1 flag, so paging is stable.
Request Body
All fields are optional except page and limit.
| Field | Type | Description |
|---|---|---|
minPrice | number | Minimum price |
maxPrice | number | Maximum price |
minBedrooms | integer | "At least N" bedrooms (maps to Resales P_Beds=Nx) |
minBathrooms | integer | "At least N" bathrooms (maps to Resales P_Baths=Nx) |
minBuiltSize | integer | Minimum built size in m² |
maxBuiltSize | integer | Maximum built size in m² |
minPlotSize | integer | Minimum plot size in m² |
maxPlotSize | integer | Maximum plot size in m² |
propertyTypes | string[] | Pre-translated Resales TypeId-SubtypeId codes, e.g. ["1-1", "2-2"] |
propertyTypeEnums | string[] | Fondaro PropertyType enum values (e.g. ["apartment", "townhouse"]) — translated server-side. Prefer this unless you already know the Resales codes. |
location | string | Resales P_Location (CSV) |
province | string | Resales P_Province |
sort | string | One of "newest", "price_asc", "price_desc", "last_updated" |
featureIds | string[] | Resales feature paramName values (e.g. ["1Pool2", "1Views1"]). Applied AND-wise via P_MustHaveFeatures=1. Fetch the full catalog from GET /resales-online/features. Unknown IDs are rejected. |
page | integer | Required. 1-indexed page number |
limit | integer | Required. Page size (1–40) |
queryId | string | Omit on page 1; pass the queryId from the page-1 response on pages 2+ for stable pagination |
Response
{
"properties": [
{
"id": "R123456",
"source": "resales_online",
"title": "3-bed Apartment in Marbella",
"price": 850000,
"currency": "EUR",
"bedrooms": 3,
"bathrooms": 2,
"propertyType": "Apartment",
"location": "Marbella",
"area": "Costa del Sol",
"description": "...",
"mainImage": "https://cdn.resales-online.com/...",
"images": ["https://..."],
"builtSize": 120,
"plotSize": 0,
"terraceSize": 15,
"hasPool": true,
"hasParking": true,
"hasGarden": false,
"features": ["Climate Control: Air Conditioning"],
"latitude": 36.5101,
"longitude": -4.8824,
"reference": "R123456",
"agencyRef": "AG-789",
"status": "available",
"virtualTour": null,
"energyRating": "C"
}
],
"page": 1,
"pageSize": 24,
"totalResults": 142,
"queryId": "q-abc-123"
}| Field | Type | Description |
|---|---|---|
properties | array | Normalized Resales properties |
page | integer | Echo of the returned page number |
pageSize | integer | Echo of the returned page size |
totalResults | integer | Total matching properties upstream |
queryId | string | Must be passed on page 2+ requests |
Pagination lifecycle
Resales Online V6 requires a P_QueryId on every request after page 1 so that listings added or removed between requests don't shift your results. Fondaro's proxy handles this for you:
- Make the page-1 request without a
queryId. - Capture
queryIdfrom the response. - Include that
queryIdon every subsequent page request.
If you jump directly to a later page without a cached queryId, the frontend helper re-fetches page 1 silently to establish one.
Example
curl -X POST https://api.fondaro.com/resales-online/search \
-H "Authorization: Bearer <clerk_jwt>" \
-H "x-organization-id: <organization_id>" \
-H "Content-Type: application/json" \
-d '{
"minPrice": 500000,
"maxPrice": 1500000,
"minBedrooms": 3,
"propertyTypeEnums": ["apartment", "townhouse"],
"sort": "price_asc",
"featureIds": ["1Pool2", "1Views1"],
"page": 1,
"limit": 24
}'Feature catalog
GET /resales-online/features
Authentication: Required (Clerk JWT + organization; connection not required)
Returns the hardcoded Resales feature catalog — the reference list for any featureIds values you send to /resales-online/search. The response is static for a given Fondaro deploy and safe to cache forever client-side.
Response
{
"categories": [
{
"name": "Pool",
"features": [
{ "paramName": "1Pool1", "name": "Communal Pool" },
{ "paramName": "1Pool2", "name": "Private Pool" }
]
},
{
"name": "Views",
"features": [
{ "paramName": "1Views1", "name": "Sea Views" }
]
}
]
}| Field | Type | Description |
|---|---|---|
categories | array | Feature categories as Resales exposes them (Setting, Orientation, Condition, Pool, Climate Control, Views, Features, Furniture, Kitchen, Garden, Security, Parking, Utilities, Category, Plots and Ventures, Rentals) |
categories[].name | string | Category label |
categories[].features | array | Features in this category |
categories[].features[].paramName | string | Value to send in featureIds |
categories[].features[].name | string | Human-readable English label |
Property detail
GET /resales-online/detail/:reference
Authentication: Required (Clerk JWT + organization, must be connected)
Returns a single Resales Online property by its reference number. The detail response is richer than search results and includes community fees, annual taxes, the full picture array, completion dates, and GPS coordinates where available.
Response
{
"property": {
"id": "R123456",
"source": "resales_online",
"title": "3-bed Apartment in Marbella",
"price": 850000,
"currency": "EUR",
"bedrooms": 3,
"bathrooms": 2,
"propertyType": "Apartment",
"location": "Marbella",
"description": "Fully furnished, walking distance to the beach...",
"mainImage": "https://cdn.resales-online.com/...",
"images": ["https://...", "https://..."],
"features": ["Climate Control: Air Conditioning", "Views: Sea"],
"latitude": 36.5101,
"longitude": -4.8824,
"reference": "R123456",
"status": "available",
"virtualTour": "https://tour.example.com/R123456",
"energyRating": "C",
"communityFeesPerYear": 2400,
"basuraTaxPerYear": 180,
"ibiFeesPerYear": 1200,
"completionDate": "2018-06-15",
"builtYear": "2018",
"pictures": [
{ "id": 0, "url": "https://..." },
{ "id": 1, "url": "https://..." }
]
}
}Detail-only fields (communityFeesPerYear, basuraTaxPerYear, ibiFeesPerYear, completionDate, builtYear, pictures) appear only on this endpoint. The same normalized shape is returned from /search with these fields omitted.
Example
curl -X GET https://api.fondaro.com/resales-online/detail/R123456 \
-H "Authorization: Bearer <clerk_jwt>" \
-H "x-organization-id: <organization_id>"Status values
The status field on every normalized property is one of:
| Value | Meaning |
|---|---|
available | Listed and available |
under_offer | Offer received, awaiting acceptance |
sale_agreed | Sale agreed, property reserved |
unknown | Status not recognized or not provided |
Property type mapping
When you send propertyTypeEnums, the server translates each Fondaro enum value to a Resales TypeId-SubtypeId code. Unmapped enums are silently omitted (the search then returns all property types). Current mapping:
| Fondaro enum | Resales code |
|---|---|
apartment | 1-1 |
house_detached | 2-2 |
house_semi_detached | 2-1 |
house_terraced | 2-5 |
townhouse | 2-5 |
land_residential | 3-1 |
land_commercial | 3-1 |
land_agricultural | 3-1 |
land_other | 3-1 |
Errors
| Status | Meaning |
|---|---|
400 | Organization has no Resales Online credentials, or request body failed validation |
404 | Detail endpoint: reference not found |
401 | Missing or invalid Clerk JWT |