Skip to content

Open a deposit

Send one JSON object per deposit. Evorest creates the deposit synchronously and answers with the outcome.

POST /webhook/<integration> HTTP/1.1
Host: be-api.admin.evorest.ch
Content-Type: application/json
x-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.

SystemPath
CustomPOST /webhook/custom
WoonigPOST /webhook/woonig
EmonitorPOST /webhook/emonitor
PropbasePOST /webhook/propbase
FlatfoxPOST /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.

  • 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 "" or null is treated as if it were not sent.
  • Fields Evorest does not know are ignored.
  • Enum values (natural, ms, de, …) are lower case.

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!"
}
resultMeaning
skippedNothing 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.
erroredThe 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:

Caseresultreason
Same externalContractId already usedskippedContract with external ID already exists
No externalContractIdskippedData item without external contract ID
The contract is on an ignore list set up with EvorestskippedContract temporarily ignored or Contract permanently ignored
Wrong or missing x-api-keyerroredNot Authorised!
Missing x-external-org-iderroredExternal Org ID not provided
Unknown x-external-org-iderroredOrganization with external ID ... not found ...
Missing or invalid fieldserroredOne 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 tenantTypeerroredUnknown tenant type
More than two legal signatorieserroredToo 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.

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.

FieldRequiredRule
externalContractIdYesUnique per organization. The Mietvertragsnummer, or another id you can look the deposit up with later.
propertyIdYesThe property id in your system.
street, streetNumberYesHouse number is at most 10 characters. See Streets and house numbers.
zipYesExactly four digits (Swiss postal code).
cityYes
rentalStartYesYYYY-MM-DD.
rentalDepositYesCHF, greater than 0, for example "3560" or "3560.50". No thousands separator. Evorest rounds it to the nearest 0.05.
tenantLanguageNode, en, fr, or it. The language of the tenant emails. Send it.
allowInvestmentNotrue, 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.

FieldRequiredRule
ownerNameYesThe property owner.
ownerStreet, ownerStreetNumberSend themSame rule as the property street.
ownerZipSend itAny postal code.
ownerCitySend it
ownerCountryCodeNoISO 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.

These fields choose who looks after the deposit. They are not stored as contract fields.

FieldRule
propertyManagerEmailA member of the organization is assigned the deposit.
propertyManagerFirstName, propertyManagerLastNameNeeded when the email is not yet a member and Evorest must invite them.
assistentEmail, assistentFirstName, assistentLastNameOptional second person who is copied on the notifications. Spelled assistent.

How the email is resolved:

  1. The email belongs to a member of the organization. That person gets the deposit.
  2. 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.
  3. It is not a member and the domain differs. The deposit goes to the organization’s default property manager.
  4. The email is not a valid address. The deposit is rejected.
  5. No email at all. The deposit goes to the default property manager.

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 -.

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.

FieldRule
tenantTypenatural or legal.
tenantFirstName, tenantLastName
tenantEmailA valid email address.
tenantPhoneNumberSee Phone numbers.
tenantAddressCountryCodeISO 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, tenantAddressCityA foreign postal code is fine here.
FieldRule
tenantTitlemr or ms.
tenantBirthDateYYYY-MM-DD.
tenantNationalityISO 3166-1 alpha-2, upper case.
tenantCivilStatusRequired. single, married, divorced, widowed, or other.

tenantFirstName, tenantLastName, and tenantEmail are a signatory, not the company. Also send:

FieldRule
tenantCompanyName
tenantLegalFormag, gmbh, simple_partnership, general_partnership, limited_partnership, sole_proprietorship, cooperative, association, foundation, or other.
tenantDomicileThe seat of the company. Always required.
tenantZefixUidThe 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.

Evorest removes everything except digits and +, then:

  • a leading 00 becomes +,
  • a number that starts with 41 gets a + in front,
  • a number that starts with 0 is treated as Swiss and becomes +41 followed 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.

Terminal window
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"
}