Rones Partner API

For estate agencies, software vendors and portals: publish listings from your system, fetch enquiries and use tools built for Swiss listings – in German, French, Italian and English.

What the API does

Manage listings

Create, change, archive, photos by address. Every listing is reviewed as on the website.

Fetch enquiries

Interested people with short profile and fit – straight into your CRM.

Scam check

Risk score 0–100 for a listing with reasons: advance-payment schemes, price far below the market, copied texts, contact via messenger.

Search by sentence

"3½ rooms in Biel up to 2000 with balcony" → filters. Knows Swiss place names, all four languages.

Texts and translation

Listing text from facts, translation with Swiss terms (Nebenkosten, 3½ rooms).

Check SwissRETS

Check an export file before it goes live: errors per object, nothing is imported.

In three steps

  1. A confirmed business account on Rones (My Rones → Business account).
  2. My Rones → API: create a key with the permissions you need. It is shown only once.
  3. Send requests with the key:
curl https://rones.ch/api/v1/partner/tools/risk-check \
  -H "Authorization: Bearer rk_live_…" \
  -H "Content-Type: application/json" \
  -d '{"category":"property","intent":"rent","cantonCode":"ZH","priceAmount":900,
       "details":{"areaSqm":85},"description":"Ich bin im Ausland, Kaution bitte per Western Union …"}'
{ "score": 70, "level": "high",
  "signals": [ { "code": "scam_wording", "weight": 45, "detail": "western union", "meaning": "Typical advance-payment …" }, … ] }

Endpoints

MethodPathPermissionPurpose
GET/partner/me–Company, permissions, quota
GET/partner/listingslistings:readOwn listings (every state)
POST/partner/listingslistings:writeCreate a listing (goes into review)
PUT/partner/listings/{id}listings:writeChange a listing
POST/partner/listings/{id}/photoslistings:writePhoto from an https address
POST/partner/listings/{id}/archivelistings:writeArchive (let/sold)
GET/partner/leadsleads:readEnquiries with short profile and fit
GET/partner/searchsearchSearch all published listings
POST/partner/tools/risk-checktoolsScam check of a listing
POST/partner/tools/understand-searchtoolsSentence → search filters
POST/partner/tools/listing-texttoolsListing text from facts
POST/partner/tools/translatetoolsTranslate (DE/FR/IT/EN)
POST/partner/tools/swissrets/validatetoolsCheck a SwissRETS file

Base URL: https://rones.ch/api/v1

Quota and limits

Per month: Start 1,000, Pro 20,000, Business 100,000, Enterprise 1,000,000 calls (more by agreement). 120 calls per minute per key. Every answer carries X-Quota-Remaining and X-RateLimit-Remaining; on 429, Retry-After says when to continue.

Errors

401 key missing or invalid · 403 permission missing · 404 not found or not your listing · 400 invalid input (the message says what) · 429 limit reached · 503 service (e.g. AI) unavailable.

Webhooks

Rones reports events by POST to your https address (set up under My Rones → API). Message texts and enquirers' contact details are never included – ids only. Failed deliveries are retried after 1, 5, 30, 120 and 720 minutes.

EventWhen
lead.createdNew enquiry for one of your listings
listing.publishedListing live after review
listing.rejectedListing rejected (with reason)
listing.changes_approvedChange approved
listing.changes_rejectedChange rejected (with reason)
listing.archivedListing archived

Verify the signature

Every delivery carries Rones-Signature: t=<time>,v1=<HMAC-SHA256 of "<t>.<body>"> with your secret. Check it and reject old timestamps (older than 5 minutes):

import { createHmac, timingSafeEqual } from "node:crypto";

export function verifyRones(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(",").map(p => p.split("=")));
  if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false;   // older than 5 minutes
  const expected = createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest("hex");
  return expected.length === parts.v1?.length && timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}

Machine-readable description

All endpoints with their fields as OpenAPI 3: https://rones.ch/api/v1/partner/openapi.json

Questions, a higher quota or a contract for portals: Contact