Open a deposit
Send one JSON object per deposit. Evorest creates the deposit synchronously and answers with the outcome.
POST /webhook/<integration> HTTP/1.1Host: be-api.admin.evorest.chContent-Type: application/jsonx-api-key: <your-api-key>x-external-org-id: <external-org-id>Replace <integration> with the path for your system. There is no /webhook/partner route.
| System | Path |
|---|---|
| Custom | POST /webhook/custom |
| Woonig | POST /webhook/woonig |
| Emonitor | POST /webhook/emonitor |
| Propbase | POST /webhook/propbase |
| Flatfox | POST /webhook/flatfox |
The body is the same for each of those paths. The OpenAPI file is the machine-readable field list. Differences between the systems are on each system’s page, and are limited to the response of Flatfox, how Flatfox treats incomplete data, and which documents Evorest sends back.
Rules for every value
Section titled “Rules for every value”- Every value is a JSON string, including amounts, dates and flags. A number or a boolean (
3560,true) is rejected as invalid. Send"3560"and"true". - A field that is
""ornullis treated as if it were not sent. - Fields Evorest does not know are ignored.
- Enum values (
natural,ms,de, …) are lower case.
Result
Section titled “Result”HTTP 200 means the deposit was accepted:
{ "success": true, "result": "success"}Anything else is HTTP 500. There is no 400, 401, or 404 on this call. Read result:
{ "success": false, "result": "errored", "reason": "Not Authorised!"}result | Meaning |
|---|---|
skipped | Nothing was created, on purpose. The usual cause is that externalContractId already exists and the deposit was not withdrawn. Sending the same payload again does not open a second deposit. |
errored | The request was rejected: authentication failed, the organization id is unknown, or a field is missing or invalid. Nothing was created. Fix the payload and send it again with the same externalContractId. |
reason is for people. It is not a stable code, so do not branch on its text. Branch on result, and show reason to whoever has to fix the data. What to expect:
| Case | result | reason |
|---|---|---|
Same externalContractId already used | skipped | Contract with external ID already exists |
No externalContractId | skipped | Data item without external contract ID |
| The contract is on an ignore list set up with Evorest | skipped | Contract temporarily ignored or Contract permanently ignored |
Wrong or missing x-api-key | errored | Not Authorised! |
Missing x-external-org-id | errored | External Org ID not provided |
Unknown x-external-org-id | errored | Organization with external ID ... not found ... |
| Missing or invalid fields | errored | One line per problem, in the language of the responsible property manager (German, French, Italian, or English), for example Missing data: Main tenant, E-mail address |
Unknown tenantType | errored | Unknown tenant type |
| More than two legal signatories | errored | Too many signatories for a legal entity tenant |
Validation messages arrive as one string with each problem introduced by <br> - . Emonitor receives the same list separated by ; instead. Strip or replace the separator before you show it.
A deposit that is rejected for data reasons also makes Evorest email the responsible property manager about the import error. The same error for the same externalContractId is mailed at most once every 24 hours.
What happens after success
Section titled “What happens after success”The deposit now exists in the property-manager app in state opening. What happens next is part of the organization setup:
- Pre-signed organizations. Evorest signs for the property manager and sends the deposit to the tenant without waiting for anyone, unless the organization has set a send delay. The property manager gets a notice that it was sent.
- All other organizations. The responsible property manager gets an email that a deposit was imported. They check it and sign in the property-manager app. Only then does the tenant receive it.
After that the tenant signs and Evorest asks the bank to open the account. A QR payment slip is created, the tenant pays, and the deposit becomes open. Use Contract status to follow this, and the Document callback to receive the PDFs.
Contract and property
Section titled “Contract and property”| Field | Required | Rule |
|---|---|---|
externalContractId | Yes | Unique per organization. The Mietvertragsnummer, or another id you can look the deposit up with later. |
propertyId | Yes | The property id in your system. |
street, streetNumber | Yes | House number is at most 10 characters. See Streets and house numbers. |
zip | Yes | Exactly four digits (Swiss postal code). |
city | Yes | |
rentalStart | Yes | YYYY-MM-DD. |
rentalDeposit | Yes | CHF, greater than 0, for example "3560" or "3560.50". No thousands separator. Evorest rounds it to the nearest 0.05. |
tenantLanguage | No | de, en, fr, or it. The language of the tenant emails. Send it. |
allowInvestment | No | true, false, 1, or 0. If you omit it, investment is allowed. Any other value is rejected as invalid. Evorest can still switch investment off, for example for a legal entity, a small deposit, or an organization that does not offer it. |
Whether the tenant may choose the insurance product is set up on the organization. It is not a field you send.
| Field | Required | Rule |
|---|---|---|
ownerName | Yes | The property owner. |
ownerStreet, ownerStreetNumber | Send them | Same rule as the property street. |
ownerZip | Send it | Any postal code. |
ownerCity | Send it | |
ownerCountryCode | No | ISO 3166-1 alpha-2. |
Evorest replaces the owner address with the address of the property-management organization, and writes the owner as <ownerName> c/o <organization>, in three cases:
- the owner address is outside Switzerland (the country is not
CH, or no country is sent and the postal code is not four digits), - the owner street, house number, postal code, or city is missing,
- the organization asks for it.
Do not rely on the last two to skip the owner address. Send the real address whenever you have it.
Property manager
Section titled “Property manager”These fields choose who looks after the deposit. They are not stored as contract fields.
| Field | Rule |
|---|---|
propertyManagerEmail | A member of the organization is assigned the deposit. |
propertyManagerFirstName, propertyManagerLastName | Needed when the email is not yet a member and Evorest must invite them. |
assistentEmail, assistentFirstName, assistentLastName | Optional second person who is copied on the notifications. Spelled assistent. |
How the email is resolved:
- The email belongs to a member of the organization. That person gets the deposit.
- It is not a member, and its domain is the organization’s email domain. If the organization has sub-organizations, the person must be a member of one of them. Otherwise Evorest invites them as a new member, which needs first and last name. Without the names the deposit is rejected with
Property manager first and last name missing - cannot invite new user. - It is not a member and the domain differs. The deposit goes to the organization’s default property manager.
- The email is not a valid address. The deposit is rejected.
- No email at all. The deposit goes to the default property manager.
Streets and house numbers
Section titled “Streets and house numbers”Send the street and the house number in separate fields. This applies to the property (street, streetNumber), the owner (ownerStreet, ownerStreetNumber), and every tenant address (tenantAddressStreet, tenantAddressStNumber, and the same for tenants 2 to 4).
If the house number field is empty, Evorest splits the street field at its first digit. Beispielstrasse 42 becomes Beispielstrasse and 42. Rue du 1er Août 12 becomes Rue du and 1er Août 12, which is probably not what you want. If the street has no digit at all, the house number becomes -.
Tenants
Section titled “Tenants”Send up to four tenants. The first tenant uses tenantFirstName. Further tenants use tenant2FirstName, tenant3FirstName, and tenant4FirstName, with the same number after tenant on every other field: tenant2Email, tenant2Type, tenant2AddressStreet, and so on.
A further tenant is only read when tenant2Type (or tenant3Type, tenant4Type) is present. If it is present, every required field of that tenant must be present, or the whole deposit is rejected. Fields for a further tenant without a tenantNType are ignored.
The first tenant is the main tenant. The deposit account is opened for the main tenant, and a natural main tenant must be at least 18 years old. Do not mix natural and legal tenants on one deposit: if the first tenant is natural, a legal tenant after it is silently removed.
Every tenant
Section titled “Every tenant”| Field | Rule |
|---|---|
tenantType | natural or legal. |
tenantFirstName, tenantLastName | |
tenantEmail | A valid email address. |
tenantPhoneNumber | See Phone numbers. |
tenantAddressCountryCode | ISO 3166-1 alpha-2, upper case, for example CH. The tenant’s previous address, which is where they live before the tenancy. |
tenantAddressStreet, tenantAddressStNumber | |
tenantAddressPostalCode, tenantAddressCity | A foreign postal code is fine here. |
Natural person
Section titled “Natural person”| Field | Rule |
|---|---|
tenantTitle | mr or ms. |
tenantBirthDate | YYYY-MM-DD. |
tenantNationality | ISO 3166-1 alpha-2, upper case. |
tenantCivilStatus | Required. single, married, divorced, widowed, or other. |
Legal entity
Section titled “Legal entity”tenantFirstName, tenantLastName, and tenantEmail are a signatory, not the company. Also send:
| Field | Rule |
|---|---|
tenantCompanyName | |
tenantLegalForm | ag, gmbh, simple_partnership, general_partnership, limited_partnership, sole_proprietorship, cooperative, association, foundation, or other. |
tenantDomicile | The seat of the company. Always required. |
tenantZefixUid | The commercial-register UID. Required for ag, gmbh, general_partnership, limited_partnership, and cooperative. Optional for the other forms. The company data has to match the commercial register or the bank will not open the account. |
One signatory is treated as a single signature (Einzelunterschrift). A second signatory is tenant2FirstName, tenant2LastName, tenant2Email, and the rest of the tenant 2 fields. Two signatories are treated as joint signature by two (Kollektivunterschrift zu zweien). Repeat the company fields on the second signatory (tenant2CompanyName, tenant2LegalForm, tenant2Domicile, tenant2ZefixUid). A legal tenant cannot have more than two signatories.
Phone numbers
Section titled “Phone numbers”Evorest removes everything except digits and +, then:
- a leading
00becomes+, - a number that starts with
41gets a+in front, - a number that starts with
0is treated as Swiss and becomes+41followed by the rest, - anything else gets a
+in front.
The result must be +, then a non-zero digit, then 6 to 14 more digits. Send the full international format, for example +41790000000, and you avoid all of the above.
Example
Section titled “Example”curl -X POST 'https://be-api.test.admin.evorest.ch/webhook/custom' \ -H 'content-type: application/json' \ -H 'x-api-key: <your-api-key>' \ -H 'x-external-org-id: <external-org-id>' \ -d '{ "externalContractId": "514.320.02.03", "propertyId": "45.1.42", "street": "Beispielstrasse", "streetNumber": "42", "zip": "8001", "city": "Zürich", "ownerName": "Example AG", "ownerStreet": "Marktstrasse", "ownerStreetNumber": "7", "ownerZip": "8001", "ownerCity": "Zürich", "rentalStart": "2026-04-01", "rentalDeposit": "3560", "propertyManagerEmail": "pm@example.com", "propertyManagerFirstName": "Alex", "propertyManagerLastName": "Meier", "tenantType": "natural", "tenantFirstName": "Laura", "tenantLastName": "Example", "tenantEmail": "laura@example.com", "tenantPhoneNumber": "+41790000000", "tenantLanguage": "de", "tenantTitle": "ms", "tenantNationality": "CH", "tenantBirthDate": "1996-11-25", "tenantCivilStatus": "single", "tenantAddressCountryCode": "CH", "tenantAddressStreet": "Altstrasse", "tenantAddressStNumber": "1", "tenantAddressPostalCode": "4058", "tenantAddressCity": "Basel" }'The example is for a natural main tenant. A second natural tenant adds the same tenant fields with tenant2:
{ "tenant2Type": "natural", "tenant2FirstName": "Max", "tenant2LastName": "Example", "tenant2Email": "max@example.com", "tenant2PhoneNumber": "+41790000001", "tenant2Title": "mr", "tenant2Nationality": "CH", "tenant2BirthDate": "1994-03-02", "tenant2CivilStatus": "single", "tenant2AddressCountryCode": "CH", "tenant2AddressStreet": "Altstrasse", "tenant2AddressStNumber": "1", "tenant2AddressPostalCode": "4058", "tenant2AddressCity": "Basel"}