Resales Own-Listings Import
Check import configuration, dry-run a safe manifest, and manually copy Resales own inventory into Fondaro.
The Resales own-listings import is a Clerk-authenticated organization workflow. It uses the Resales credentials already stored for the organization plus a dedicated p_own_filterid. It does not use the normal Resales search cache.
These endpoints require a Clerk session JWT and active organization; they do not accept a Fondaro property API key.
Authorization: Bearer CLERK_SESSION_JWT
x-organization-id: ORGANIZATION_IDThe dashboard configuration steps and filter-safety rules are in Import Own Listings from Resales Online.
Route catalogue
| Method | Route | Access | Purpose |
|---|---|---|---|
GET | /resales-online/import/own-listings/status | Any organization member | Configuration, last-run metadata, and current imported counts |
POST | /resales-online/import/own-listings | Organization admin | Dry-run or execute an import |
Get import status
GET /resales-online/import/own-listings/status
Authorization: Bearer CLERK_SESSION_JWT
x-organization-id: ORGANIZATION_ID{
"configured": true,
"lastRun": {
"completedAt": "2026-07-23T16:15:42.000Z",
"counts": {
"total": 12,
"created": 2,
"updated": 7,
"skipped": 3,
"errors": 0
}
},
"counts": {
"imported": 12,
"active": 10,
"inactive": 1
}
}| Field | Meaning |
|---|---|
configured | true only when active p1, p2, and p_own_filterid values exist |
lastRun | Last completed real import; dry runs do not replace it. null before the first real run |
counts.imported | Current number of Fondaro properties with externalSource: "resales_online" |
counts.active | Imported rows currently in Active status |
counts.inactive | Imported rows currently in Inactive status |
Other statuses such as Sold, Rented, or Deleted are included in imported but not in active or inactive.
Dry-run an import
Always dry-run immediately before a real import:
POST /resales-online/import/own-listings
Authorization: Bearer CLERK_SESSION_JWT
x-organization-id: ORGANIZATION_ID
Content-Type: application/json{
"dryRun": true
}The only request field is optional dryRun: boolean. Omission defaults to false, so an integration should send true explicitly for its preview request.
{
"dryRun": true,
"counts": {
"total": 12,
"created": 2,
"updated": 7,
"skipped": 3,
"errors": 0
},
"errors": []
}Dry run fetches a fresh complete Resales snapshot and compares mapped values with the properties database. It does not create properties, update lastSyncedAt, write history, persist last-run metadata, or send the completion summary.
updated means at least one synchronized field differs. skipped includes unchanged rows and duplicate external references found in the same upstream snapshot. Mapping or inspection problems increment errors and add an item such as:
{
"externalRef": "VIVI-1042",
"message": "Resales reference exceeds 64 characters"
}Execute the import
After reviewing the dry-run result, send a fresh request:
{
"dryRun": false
}The response has the same shape with dryRun: false. A real run:
- fetches and maps the complete upstream snapshot before the first listing write;
- upserts by
(organizationId, externalSource, externalRef); - creates new listings as Active with auto-renew enabled;
- updates synchronized fields on existing rows;
- preserves local agent, commission, lead-group, and locally changed status;
- stamps
lastSyncedAtand writes animportedlisting event for each processed row; and - persists last-run counts and sends one operational summary after the run.
Each listing write uses its own transaction. A per-listing failure is reported in errors, while other rows can succeed. Treat a response with counts.errors > 0 as a partial success and surface its issue list.
Safety failures before writes
Both dry-run and real modes enforce the same hard boundary:
- If Resales reports more than 50 properties, the API returns
400and writes no listings. - If the complete expected snapshot cannot be fetched, the API returns
502and writes no listings. - Missing own-listings configuration returns
400before import. - A non-admin import request returns
403.
The 50-property response is intentionally actionable:
{
"statusCode": 400,
"message": "Your Resales own-listings filter returned 3142 properties, which exceeds the 50-property safety limit. This looks like the shared MLS feed, not your own inventory. Check the filter's “Only own properties” setting. No listings were imported."
}The integration-credential service also refuses to save p_own_filterid when it exactly matches the active p_agency_filterid, and applies the same check when the browse filter is changed later.
Current synchronization model
This endpoint is manual-only. There is no Fondaro cron or automatic background run. Re-run it when you want current Resales fields copied into Fondaro.
The import is sale-only. It does not infer deletion from an absent upstream row and does not mark a missing listing Inactive. A locally changed status remains authoritative on subsequent imports.
Related Articles
Dashboard Walkthrough
Safely configure a dedicated Resales own-inventory filter, preview an import, and manually sync sale listings into Fondaro.
Resales Online API
Search, fetch, and check connection status for Resales Online inventory through the Fondaro API.
Own-Listing Lifecycle
Understand creation, editing, terminal statuses, soft deletion, import provenance, and server-written listing history.
Authentication
How to create, use, and revoke Fondaro API keys for programmatic access.