Skip to main content
Skip to main content

Brokers and property management firms

Documentation

Last updated: 13 November 2026

Everything a property management firm or an independent broker needs to know to publish on ImmGate: what it costs, how we open your space, how to connect your software, and what happens to your listings. This page is public: read it before you sign up.

Joining ImmGate, in four steps

Nothing to install, nothing to re-enter. Allow half an hour, twenty minutes of which are spent in your own software.

You reserve your place

Through the form on the home page, or by email. We check your entry in the commercial register, which is the condition for publishing, and we create your agency’s profile.

We open your space

You receive a one-time sign-in link that lets you choose your password. You are the administrator of your space: you can add your team members.

You connect your software

In your space, the “Feed” tab waits for the address of your SwissRETS export. The “Test the connection” button fetches it and tells you what it contains, without publishing anything.

Your listings appear

With the same visibility as everyone else’s. Your agency profile and each broker’s profile are public and indexed, at no extra cost.

What it costs, and what it includes

CHF 49 per month, all inclusive, for all your listings. Rent and sale, no per-listing fees, cancellable every month.

  • Unlimited listings: the price does not depend on how many properties you publish.
  • No paid options, no tiers, no promotion for sale.
  • The first 100 partners: six months free, then the price guaranteed for three years.
  • A public profile for the agency and one for each broker, included in the subscription.
  • Automatic import from your software, included as well.

There is no second price. If you are looking for one, it does not exist.

Visibility cannot be bought

This is the rule that holds everything else together: the ranking of results depends on what the visitor is looking for, never on what the advertiser pays. There are no subscription tiers, no sponsored listings, no moving up the list for a fee.

This means you cannot buy visibility from us, and nobody can buy it against you.

The listings map, on swisstopo’s official base map.
All properties, at the same scale

Who can publish

Real estate professionals registered in the Swiss commercial register: property management firms, independent brokers, developers. We check the registration before activating an account.

Private individuals do not publish on ImmGate. Browsing, on the other hand, is free for everyone, forever: no subscription, no paid priority access, no listing reserved for those who pay.

Your space, on one page

Once signed in, the “My space” button at the top right opens your dashboard. It answers four questions, in this order.

  • My feed: its status, the last successful reading, and the button to set it up and test it.
  • My listings: how many are online, which are offline, and the link to correct each one.
  • My team: your brokers’ profiles, and what you need to add a team member.
  • My profile: your public profile, your cantons, and your default fees.

The space looks like the rest of the site, in your language. You never have to deal with a technical administration interface.

An agency’s dashboard: the feed status, the counters, the team.
Your dashboard

Connecting your software: the format

ImmGate reads the Swiss SwissRETS standard, in both its forms. You have nothing to export in a format of ours.

  • SwissRETS JSON, version 3.x: the form the standard keeps developing, the one we ask for first.
  • SwissRETS XML, version 2.7: frozen by Qualipool, but still produced by many Swiss software packages. We accept it in exactly the same way.

The XML is translated on our side into the JSON structure, then both follow the same path. In other words: your software’s format changes nothing about what your listings become with us.

If your software exports to CASAGATEWAY, Immomig, Casasoft or another distributor, it is the same file you give us to read. Tell us which one you use and we will give you the exact setting.

Connecting your software: the address and the key

In the “Feed” tab of your profile, three fields are enough.

  • The format: leave “Detect automatically” if in doubt. A document starting with “<” is read as XML, a document starting with “{” as JSON.
  • The export address: an https address, or the path of a file placed on our server. No plain http: an inventory sent in clear can be read and altered on the way, and it carries your sellers’ contact details.
  • The access key, if your export is protected. It is sent in an “Authorization” header, never in the address: an address ends up in the other server’s logs, a header does not.

Connecting your software: the API, if it can send

Some software does not expose its inventory at an address: it sends it. For those, ImmGate has an API. In the “API” tab of your space, create a key (it is shown only once) and put it in your software.

  • POST /api/v1/inventaire: your software uploads its complete SwissRETS inventory, in JSON or XML. Response 202: it is read within a minute.
  • POST /api/v1/reveil: “my inventory has changed”. An export we read from your side is read again straight away, without waiting for the half hour.
  • GET /api/v1/etat: the last reading, when it happened, and what was created, updated or removed.
  • GET /api/v1/journal/{number}: one reading in detail, with the exact error for each listing.

The key is sent in the “Authorization: Bearer …” header, never in an address. We keep only its fingerprint: a lost key is revoked and recreated. Two keys can be active at once, so you can change keys without interruption.

An unreadable document is rejected straight away (422), with the reason. Messages follow the language your software asks for (Accept-Language: fr, de, it or en). An upload is always a complete inventory. There is no “delete listing 12” command: what is missing is removed with the same safeguards as a feed.

curl -X POST https://www.immgate.ch/api/v1/inventaire \
  -H "Authorization: Bearer ig_live_…" \
  -H "Content-Type: application/json" \
  -H "Accept-Language: en" \
  --data-binary @inventaire.json

# 202 Accepted
{
  "accepte": true,
  "annonces": 42,
  "projets": 1,
  "ecarts": [],
  "etat": "https://www.immgate.ch/api/v1/etat"
}
An agency’s API tab: a key in use, of which only the start is shown, and the field to create another one.
Your API keys: only their start remains visible.

The connection test, before anything is published

The “Test the connection” button fetches your document, reads it, checks it against the standard’s official schema and answers you within seconds:

  • the size received and the format recognised
  • the software that produced the file, when it says so
  • the number of listings read
  • and, if there are any, the deviations from the standard, listing by listing and field by field.

Nothing is written, no listing is created, none is changed. You correct in your software, run the test again, and you have nobody to call.

A successful test moves your feed from “draft” to “tested”. It does not activate it: activation remains a decision, not a side effect.

The test report: document received, format recognised, listings read.
The test, in ten seconds

Choosing what you publish

Your software exports your whole inventory, but you do not necessarily want to publish all of it on ImmGate. You set this in the “Feed” tab, without changing anything in your software and without calling your provider. By default, everything is taken over.

  • Offers: properties for rent, properties for sale, or both.
  • Property types: residential, commercial, parking, land… Untick parking spaces, for example, if you only let them together with a home.
  • Cantons: all of Switzerland, or only the ones you tick.
  • Properties to always take over, by their reference, even if your other choices leave them out.
  • Properties never to take over, by their reference.

The connection test shows you what your choices give before you save them: how many properties are taken over, which are not, and why. The log says it again at each reading.

A property you leave out is not created. If it was already online, it is removed at the next reading, with no delay since it is your decision. It is never deleted and comes back as soon as your choices take it over again.

The states of a feed

Your feed has a state, visible on the dashboard as well as in the “Feed” tab.

  • Draft: the source is declared, nothing has been tried yet.
  • Tested: the connection responds and the document can be read. Deviations from the standard do not prevent activation: they are reported to you.
  • Active: the feed’s listings are taken over.
  • Paused: your listings stay online, but are no longer updated.
  • Error: three readings in a row have failed. The exact message is in your log. We keep trying, less and less often, and the feed becomes active again as soon as a reading succeeds.

No import ever deletes anything. A property that disappears from your export is unpublished and kept: if it comes back, it takes its place again.

Synchronisation, once the feed is active

An active feed is read every half hour, without you having to do anything. You can also read it straight away, with the “Read my feed now” button or through the API. Each reading follows the same six steps.

  • Fetch: we fetch your document, at your address or where your software placed it. If it does not respond, we stop there: nothing changes.
  • Read: the document is checked against the official SwissRETS schema. Anything that deviates is reported in the log for your software provider, but everything that can be understood is taken over.
  • Translate: each listing becomes an ImmGate listing, in the languages you provide. Projects first, then their units.
  • Compare: a fingerprint of each listing tells whether anything has changed. An identical listing is not touched, not even its history.
  • Apply: a new listing is created. A changed listing is updated, and the history says what changed (“Net rent”, “Photos”). Photos are copied to our side. If one does not respond, the old gallery stays and we try again. If your inventory no longer gives any photo for a property, its gallery is emptied.
  • Reconcile: a listing missing from your inventory is removed only after two readings and twenty-four hours. It is unpublished, not deleted: if it comes back, it takes back its place, its address and its history.

Three safeguards protect your showcase from a faulty export, without ever asking you anything. The one-day delay applies to everything: whether one listing is missing or all of them, nothing is removed before twenty-four hours and two readings, and the log tells you from the first one when the removal will take place. What was removed by mistake comes back by itself, at the same address, as soon as your inventory mentions it again. Finally, an unreachable feed never removes anything: a three-day outage at your software provider does not count as three days of absence. After three failures in a row, your feed goes into “error” in your space, and becomes “active” again by itself at the next successful reading.

Each reading leaves a line in the log of the “Feed” tab, in your language: what was created, updated or removed, and the exact error for each listing that could not be taken over.

What the feed owns, it keeps. A price corrected on our side would be overwritten at the next reading, so correct it in your software. Your fees entered in your space, on the other hand, are never overwritten as long as your feed does not declare any. Documents such as floor plans and land register extracts keep their link to your server.

The log of a feed’s readings: the date, the outcome, and the count of listings created, updated, unchanged and removed.
The log: each reading, what it did.

Removing a property, and what happens to its address

A property that has been let or sold can be removed in two ways, and the difference matters.

  • Unpublish it: it disappears from the site, but keeps its address and its history. If it comes back on the market, it takes its place again. This is what your feed does when a property leaves your inventory.
  • Delete it: it disappears for good. Its address, in each language, then redirects to its project if it has one, otherwise to your agency’s page: a shared or bookmarked link never ends on an empty page.

A property that your feed removed and that has not come back within six months is deleted by itself, with the same redirection: we do not keep the data of a listing that will not come back without a reason. A listing entered by hand, or put back online by you, is never deleted by a machine.

Be careful with a listing that comes from your feed: if you delete it on our side while it is still in your export, the next reading recreates it. Remove it from your software, and we take care of the rest.

Fees: you set them, we show them

This is what makes ImmGate different, and it deserves to be said precisely. We never interfere with the amount of your fees: no recommended rate, no cap, no default value, no average shown anywhere. You set your rates freely.

What we ask for is that they are shown. On the listing, not on your public profile: a rate out of context becomes a price tag, and that is not what someone looking at a property is after.

  • The fields live at three levels: the listing, the broker, the agency. The first value filled in wins.
  • You set your default rate on your agency profile. A broker who works differently replaces it on theirs, and a particular listing can replace it again.
  • The feed can carry them too, through the options of the “immgate” publisher. Tell us and we will give you the exact keys.
  • The fields are not mandatory: a listing without fees filled in still appears, simply without the box.
A listing and its fees box.
What the visitor sees

Entering a listing by hand

You have no export software, or you want to publish a property before connecting your feed? Your space lets you enter a listing directly. The fields follow the standard, and the form only shows you those that match your transaction: no “net rent” on a sale.

A broker corrects their own listings. The agency administrator sees and corrects all of the firm’s listings.

Projects: developments and new buildings

A development of twelve homes is not twelve unrelated listings. On ImmGate, a project has its own page: its photos, its construction progress, its ranges of prices, rooms and areas, and the list of its units still available, from the cheapest to the most expensive.

  • Through your feed: SwissRETS describes projects in “projects”, and each unit says which project it belongs to through its “unitReferenceId”. We create the project and link its units to it, with nothing to do on your side.
  • By hand: in your space, “Add a project”, then, on each listing concerned, choose it in the “Project” field. Only your agency’s projects are offered to you.
  • Each unit remains a listing in its own right, with its price and its fees. Its page links to the project and its other units.

A project follows the same rules as a listing: read again at each reading, removed if it leaves your inventory, never deleted at once. When deleted, it releases its units, which stay online.

A project’s page: the development under construction, its ranges of prices, rooms and areas, and its available units.
A project, and its available units.

Your languages

The portal, search and alerts are in French, German, Italian and English. Each listing appears in the languages you publish: we do not translate your texts automatically.

A listing you provide only in French stays in French, in all four versions of the site. It is your text, your responsibility, and a machine translation of a property description is spotted straight away.

Your listings, in AI assistants

ImmGate opens its catalogue to AI assistants, such as Claude, ChatGPT and any agent that speaks the MCP protocol, through a server: https://www.immgate.ch/mcp. The person connects their free ImmGate account to it. When they ask their assistant for “a 3.5-room flat to rent near Geneva, up to 3000 francs”, they can come across your properties, with their address on ImmGate.

  1. Someone asks Their assistant, as they would ask a person: a 3.5-room flat around Lausanne.
  2. It searches ImmGate The same search as the website, the same ranking for everyone.
  3. It writes to you The enquiry goes to your agency, in the person’s name, marked as sent by an assistant.
  4. You reply By e-mail, as to an enquiry from the website. Your address was never given out.
  • The same search and ranking as on the site: newest first, never according to payment.
  • Your fees as you publish them, never a suggested rate.
  • No e-mail address is passed on: when someone asks their assistant to write to you, the enquiry reaches you like those from the website, by e-mail, with a copy for them and a note that an assistant sent it.
  • A rate limit and at most one hundred listings per search: a competitor cannot scrape your inventory.

Write to the agency of the 4.5-room flat in Biel about a viewing, and ask what documents they need.

Enquiry to the advertiser contact_advertiser

Enquiry sent to the agency 4.5-room flat with lake view, BielCopy to your address

Done, in your name. The agency will reply to you directly by e-mail.

Example conversation about a demonstration listing: nothing is sent before the portal opens in 2027.

There is nothing for you to do: your listings published on ImmGate are there, in their languages.

The application files you receive

A home seeker can build their file once on ImmGate (identity, income bracket, debt collection register extract, payslips, identity document) and attach it to their request. The e-mail you receive then carries an “Open the application file” button.

  • The link leads to an ImmGate page: enter one of the addresses that received the request (the broker’s, the agency’s or your software’s inbox).
  • A six-digit code arrives there at once, valid for fifteen minutes.
  • The code opens the file for two hours in that browser: the information, each document to download, or everything in one ZIP file.
  • The link stays valid for thirty days, unless the applicant withdraws access. Every opening and download is shown to them.

This is sensitive data the applicant entrusts to you. The Federal Data Protection Commissioner points out that a letting agency may only require a copy of the identity document or payslips from the applicant it chooses, and must destroy the copies of the others: ImmGate reminds you of this on the file page.

“Apply with ImmGate”: two lines on your website

Two lines to paste, and your website has its “Apply with ImmGate” button. The applicant clicks, accepts on ImmGate, and their complete file, information and documents, arrives as JSON on your website, at the address your developer gave (below).

In your ImmGate space, “Apply with ImmGate” card: “Activate”, then enter your developer’s address. They receive their page, with the two lines already filled in.

  • Paste the script line in the head of your pages, once.
  • Paste the button where it should appear, with the property reference and title.
  • That’s it. The button draws itself, in our colours, in your page’s language, and turns to “File sent” once the applicant has accepted.

Optional settings, on the same line: data-dossier="achat" for a property for sale, data-langue="de" to force the language, data-taille="grand", data-largeur="plein" for a full-width button, data-fenetre="meme" to open ImmGate in the same tab.

Your button key is not secret: it only opens the consent page. The file always goes to your agency’s receiving address, never anywhere else. Copied to another site, it would send the files to you. A new key is one click away in your space.

<!-- 1. Once, in the head of your pages -->
<script src="https://www.immgate.ch/postuler.js" defer></script>

<!-- 2. Where the button should appear -->
<div class="immgate-postuler" data-agence="YOUR_KEY"
     data-bien-ref="LAC-12" data-bien-titre="3.5 rooms, Lake Street 12"></div>
A property page on a letting agency’s website, with the red “Apply with ImmGate” button.
The button, on your website

Receive applications as JSON, on your website

The file arrives only this way, with no e-mail. In your space, enter your developer’s address: they receive a link to a page where everything is ready. The button works as soon as they have given the receiving address.

  1. They paste the button’s two lines.
  2. They give the address on your website that will receive applications (https).
  3. They send themselves an example, in one click, to check.
  4. From then on, for each accepted application, ImmGate sends the file to that address: a signed POST request with JSON.

Each request carries the X-ImmGate-Signature header: “sha256=” followed by the HMAC-SHA256 of the body, computed with the secret from the developer page. Check it before reading the JSON, and answer 200.

The JSON gives the property (your reference and title), the applicant, the brackets and statuses in plain words under “labels”, and each document with its download address. These addresses, and “file_url” to read the file again, work while the share is open: thirty days, or until the applicant withdraws access (403 “access_withdrawn”).

If your website does not answer, or answers with anything other than a 2xx code, ImmGate tries again after 5 minutes, 30 minutes, 2, 6 and 12 hours. Your space shows the state of each delivery and lets you retry it. The applicant sees in “My sendings” that their file was handed to your website, and each download.

// What ImmGate sends to your address, for each accepted application
POST https://votre-site.ch/immgate/candidature
Content-Type: application/json
X-ImmGate-Event: candidature
X-ImmGate-Signature: sha256=5f2c…

{
  "event": "candidature",
  "agency": { "name": "Régie du Lac SA" },
  "reference": 41,
  "file": "rental",
  "property": { "reference": "LAC-12", "title": "3.5 rooms, Rue du Lac 12" },
  "complete": true,
  "applicant": {
    "email": "[email protected]",
    "first_name": "Léa", "last_name": "Exemple",
    "profession": "Nurse", "annual_income": "80_100"
  },
  "labels": { "annual_income": "CHF 80’000 to 100’000" },
  "documents": [
    { "category": "payslip", "name": "Payslip-October.pdf",
      "url": "https://www.immgate.ch/api/v1/partage/…/pieces/2" }
  ],
  "file_url": "https://www.immgate.ch/api/v1/partage/…",
  "shared_until": "2026-12-13T20:20:54+01:00"
}

// Your address, in PHP: check the signature, then read
$body = file_get_contents('php://input');
$expected = 'sha256=' . hash_hmac('sha256', $body, IMMGATE_SECRET);
if (!hash_equals($expected, $_SERVER['HTTP_X_IMMGATE_SIGNATURE'] ?? '')) {
  http_response_code(401);
  exit;
}
$application = json_decode($body, true);
http_response_code(200);
The developer page: the two lines, the receiving address, the signing secret and the test.
Your developer’s page

Going further: the file in your software (API)

The button and JSON delivery are enough for most agencies. If your software must request the file itself, create an identifier and a secret in your space, with your website’s return address: it is OAuth 2.1, with PKCE.

  • The button leads to ImmGate’s authorisation page, with the dossier_location (or dossier_achat) scope and a PKCE challenge.
  • The applicant signs in and shares their file. It can only be shared when complete.
  • Your website receives a code at its return address, and exchanges it for a token with your secret.
  • With the token, it reads the file as JSON, then each document.
  • The share lasts thirty days. The applicant sees every reading and can withdraw access: the token is then useless.

The PKCE challenge and the state are created on each click: a random verifier kept in the session, its SHA-256 fingerprint in base64url as the challenge, and a random state. Store the property reference with the state: on return, it tells you which property the applicant is applying for. A return with an unknown state is rejected.

Add the property reference and title to the button (bien_ref, bien_titre): the applicant sees which property they are applying for, finds it in “My sendings”, and the response gives it back to you in “property”. If your agency removes its button or leaves ImmGate, shares close and the button leads to a “This button is no longer active” page.

The response gives the applicant (their fields, with brackets and statuses spelled out in “labels”, in the applicant’s language or that of ?lang=fr|de|it|en), then their documents with their address. With both scopes, ?file=rental or ?file=purchase picks the file.

Refusals: 401 without a valid token, 403 “access_withdrawn” if the applicant withdrew access or after thirty days, 403 “insufficient_scope” for a file not requested, 429 beyond three hundred readings per hour. The token lasts one hour, and the refresh token thirty days at most. If the applicant declines, your return address receives error=access_denied.

The applicant entrusts you with their file: you process it under your own responsibility. The Federal Data Protection Commissioner asks you to keep copies of the identity document and payslips only for the applicant you choose, and to destroy the others’.

# PKCE: PKCE_VERIFIER = 64 random characters, kept in the session;
#       PKCE_CHALLENGE = base64url(sha256(PKCE_VERIFIER)), without “=”.

# 1. The button, on your website
<a href="https://www.immgate.ch/oauth/authorize?response_type=code&client_id=YOUR_ID&redirect_uri=https%3A%2F%2Fyour-site.ch%2Fimmgate%2Freturn&scope=dossier_location&state=STATE&code_challenge=PKCE_CHALLENGE&code_challenge_method=S256&bien_ref=PROPERTY_REF&bien_titre=PROPERTY_TITLE"
   style="display:inline-flex;align-items:center;gap:10px;padding:12px 22px;border-radius:999px;background:#E8192C;color:#fff;font:600 16px system-ui,sans-serif;text-decoration:none">
  <img src="https://www.immgate.ch/themes/custom/immgate/images/logo-mark-white.svg" alt="" width="20" height="20">
  Apply with ImmGate
</a>

# 2. The code for a token (on your server)
curl -X POST https://www.immgate.ch/oauth/token \
  -d grant_type=authorization_code -d client_id=YOUR_ID -d client_secret=YOUR_SECRET \
  -d code=CODE -d redirect_uri=https://your-site.ch/immgate/return -d code_verifier=PKCE_VERIFIER

# 3. The file, then each document
curl https://www.immgate.ch/api/v1/candidature -H "Authorization: Bearer TOKEN"
curl -O https://www.immgate.ch/api/v1/candidature/pieces/123 -H "Authorization: Bearer TOKEN"

# 4. The response (excerpt)
{
  "reference": 21,
  "file": "rental",
  "property": { "reference": "LHA-LAC-12", "title": "3,5 pièces, Rue du Lac 12" },
  "complete": true,
  "applicant": {
    "email": "[email protected]",
    "first_name": "Léa", "last_name": "Exemple", "phone": "021 000 00 00",
    "residence_status": "suisse", "annual_income": "80_100",
    "profession": "Infirmière", "employer": "Hôpital Exemple SA",
    "adults": 2, "children": 1, "move_in_date": "2027-04-01",
    "co_first_name": "Marc", "co_last_name": "Exemple"
  },
  "labels": { "residence_status": "Suisse", "annual_income": "80’000 à 100’000 CHF" },
  "language": "fr",
  "documents": [
    { "id": 92, "category": "debt_collection_extract", "name": "Extrait-poursuites.pdf",
      "size_kb": 84, "uploaded": "2026-11-13", "to_renew": false,
      "url": "https://www.immgate.ch/api/v1/candidature/pieces/92" }
  ],
  "shared_until": "2026-12-13T19:17:21+01:00",
  "notice": "Shared by the applicant through ImmGate. …"
}
The page where the applicant shares their rental file with a letting agency: what it will receive, and what it will not be able to do.
What the applicant sees

Does your software only export IDX 3.01, or via SFTP?

That is the old Swiss format for exchanging listings, still produced by some software and often placed via SFTP. We do not connect it by default: SwissRETS does better, and most software already offers it.

If yours can only do that, tell us: we integrate it on request, so that you have nothing to re-enter.

Your data, and ours

No tracking cookie, no audience measurement tool on this site. Owners’ contact details that may be present in your export are left out when it is read: they never enter our database.

The details of what we collect, why, and how long we keep it are in our privacy policy.

Pioneer partners

The first 100 get six months free

Reserve your place now: 6 months free, then CHF 49 per month, all inclusive, price guaranteed for 3 years. All your listings, no per-listing fees, cancellable every month.

A question this page does not answer

Write to us: a team in Switzerland will answer, as quickly as possible. Tell us which software you use. It is the first thing we would ask.

[email protected]