Developers

Integrate your CRM feed

Send your listings to Century 21 Global in REAXML. Test the exact mapping production uses — right here, before you go live.

One pipeline, two front doors

Push to the REST API or drop REAXML via SFTP — both funnel through the same validate → canonical-map → queue path.

Test = production

The validator below runs the identical mapping logic as live ingestion, so a passing dry-run means a working integration.

Quarantine, never drop

Malformed or invalid listings are reported with precise issues and quarantined upstream — never silently lost.

Test your integration

Paste a REAXML <propertyList> or a RESO Web API record and validate it — both map into the same canonical model. Neither format carries a currency, so a 3-letter ISO-4217 code is required.

Both formats map into the one canonical model via the same validate path — nothing is persisted.

The canonical preview + any issues appear here.

Demo data & sample feeds

Grab a working sample of each inbound format — every file validates cleanly against the console above and can be POSTed as-is. The live read API also serves demo content you can extract while you build: the same endpoints your integration will verify against.

# 60-second quickstart: validate every sample + check your key's office scope
for f in reaxml-feed.xml reso-feed.json project-feed.json quickstart.sh; do
  curl -sO "https://c21global.cservices.au/samples/$f"; done
API_BASE=https://api.cservices.au C21_KEY=c21_yourkey bash quickstart.sh

# Verify a key by hand (401 = wrong/revoked; 200 lists the offices it may push for)
curl "https://api.cservices.au/v1/feeds/whoami" -H "Authorization: Bearer c21_yourkey"

# Extract demo data from the live read API (no auth) — listings, projects, directory
curl "https://api.cservices.au/v1/listings?country=AU&limit=5"
curl "https://api.cservices.au/v1/projects?stage=offThePlan"
curl "https://api.cservices.au/v1/projects/Century%2021%20Coastal/AU-PRJ-9001"   # project + child listings
curl "https://api.cservices.au/v1/countries"

# Dry-run a downloaded sample against the sandbox (no auth, persists nothing)
curl -X POST "https://api.cservices.au/v1/validate" -H "content-type: application/json" -d @project-feed.json

Prefer Postman? Import the ready-made collection — postman-collection.json — every request above plus push, full-snapshot, and admin examples, with {{baseUrl}} and {{clientKey}} variables.

Ready-made clients

Single-file, dependency-free clients for the whole API surface — drop one into your codebase and go. The MCP server plugs the API straight into an AI coding assistant as callable tools.

Get an API key

Reads and the validator need no key. To push, request one here — it's created instantly (shown once, scoped to your offices) and activates on operator approval. No email thread required: your integration can poll GET /v1/feeds/whoami to see the moment it goes live.

Your key is created suspended and shown once, right here. It activates when the operator approves the request; the alert email also receives feed-failure notifications later.

Build it with AI

The whole integration contract — endpoints, auth, all three payload formats, idempotency and snapshot semantics, error model, worked examples — lives in one self-contained document written for AI assistants: ai-integration-guide.md. Give it to Claude, ChatGPT, Copilot or Cursor with a prompt like:

Using the attached Century 21 Global integration guide, build a service that syncs
listings from our CRM to Century 21 Global:
- our CRM is <name it> and exports <describe your export format / API>
- validate every export against POST /v1/validate until it is clean
- push changes incrementally, plus a daily mode=full snapshot per office
- include our new-development projects via the project format, linked to their unit listings
- add a round-trip test that pushes a fixture and reads it back

API reference

Per-office API-key auth (replaces REAXML's plaintext credentials). Full interactive docs: Swagger UI · OpenAPI spec

MethodEndpointPurpose
POST/v1/validateSandbox dry-run — preview the canonical mapping + issues. No persistence, no auth.
GET/v1/feeds/whoamiVerify your feed key before the first push: returns the client name and the office IDs the key may push for.
POST/v1/feedsValidate + persist a feed (REAXML, RESO, or project JSON); returns per-listing actions. Requires your feed key (Authorization: Bearer).
GET/v1/listings/{office}/{uniqueId}Read a listing back as the platform stores it — confirm the mapping round-trips.
GET/v1/projects/{office}/{uniqueId}Read a development project back with its linked child listings.

REAXML → canonical mapping

REAXML is adapter #1, not the schema. Every feed normalizes into the canonical superset:

REAXML realityCanonical model
No currency in REAXMLExplicit currency code on every price (injected from office/country context).
AU-centric address, no lat/longCountry-first address + geocoded lat/long.
uniqueID unique per officeComposite identity key (sourceOfficeId + uniqueID).
No deleted statusSoft-delete state machine (status transitions + full-feed reconcile under the circuit breaker).
beds/baths in <features>, area variesNormalized bedrooms/bathrooms + area in m².
Images url= or file=, ordered m,a,b…Media order + hero flag preserved; photos served from the feed's own image URLs.
Developers — CRM feed integration · Century 21 Global