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.
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.
REAXML feed
2 listings (sale + rental) as <propertyList> XML — the AU/NZ industry format.
Download reaxml-feed.xmlRESO Web API feed
Ready-to-POST body: a RESO Data Dictionary record, incl. the ProjectKey link extension.
Download reso-feed.jsonProject feed (JSON)
Ready-to-POST body: a new-home development with price range, stage, and child listings.
Download project-feed.json# 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.jsonPrefer 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.
TypeScript client
Zero-dependency fetch client for Node 18+/Deno/Bun — whoami, validate, push, and all reads in one file.
Download c21-client.tsPython client
Stdlib-only (urllib) client for Python 3.8+ — the same seven methods, nothing to pip install.
Download c21-client.pyPHP client
PHP 8 + curl client — drop into any CRM plugin or cron job.
Download c21-client.phpMCP server
Zero-dependency Model Context Protocol server: plug the API into Claude Code / Claude Desktop / Cursor as native tools.
Download c21-mcp-server.mjsGet 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.
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 backAPI reference
Per-office API-key auth (replaces REAXML's plaintext credentials). Full interactive docs: Swagger UI · OpenAPI spec
| Method | Endpoint | Purpose |
|---|---|---|
| POST | /v1/validate | Sandbox dry-run — preview the canonical mapping + issues. No persistence, no auth. |
| GET | /v1/feeds/whoami | Verify your feed key before the first push: returns the client name and the office IDs the key may push for. |
| POST | /v1/feeds | Validate + 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 reality | Canonical model |
|---|---|
| No currency in REAXML | Explicit currency code on every price (injected from office/country context). |
| AU-centric address, no lat/long | Country-first address + geocoded lat/long. |
| uniqueID unique per office | Composite identity key (sourceOfficeId + uniqueID). |
| No deleted status | Soft-delete state machine (status transitions + full-feed reconcile under the circuit breaker). |
| beds/baths in <features>, area varies | Normalized 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. |