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_ID

The dashboard configuration steps and filter-safety rules are in Import Own Listings from Resales Online.

Route catalogue

MethodRouteAccessPurpose
GET/resales-online/import/own-listings/statusAny organization memberConfiguration, last-run metadata, and current imported counts
POST/resales-online/import/own-listingsOrganization adminDry-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
  }
}
FieldMeaning
configuredtrue only when active p1, p2, and p_own_filterid values exist
lastRunLast completed real import; dry runs do not replace it. null before the first real run
counts.importedCurrent number of Fondaro properties with externalSource: "resales_online"
counts.activeImported rows currently in Active status
counts.inactiveImported 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:

  1. fetches and maps the complete upstream snapshot before the first listing write;
  2. upserts by (organizationId, externalSource, externalRef);
  3. creates new listings as Active with auto-renew enabled;
  4. updates synchronized fields on existing rows;
  5. preserves local agent, commission, lead-group, and locally changed status;
  6. stamps lastSyncedAt and writes an imported listing event for each processed row; and
  7. 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 400 and writes no listings.
  • If the complete expected snapshot cannot be fetched, the API returns 502 and writes no listings.
  • Missing own-listings configuration returns 400 before 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.

Fondaro Help

Docs & support

Hi there, how can we help?

Browse popular articles or ask a question below.

Popular articles

Powered by Claude

Or ask a question