# Immofacile API V2

# Welcome to the Immofacile API

This documentation will guide you through integrating with Immofacile, the leading SaaS CRM for real estate agencies. Our REST APIs allow you to connect your applications, automate your business workflows, and extend the power of our ecosystem.

## Target Audience

This documentation and APIs are designed for three distinct types of users:

- **IT Departments (CIO) of large networks / Franchises:** Who want to interconnect Immofacile with their proprietary internal tools.
- **Developers / Partners:** Commissioned by our clients to build custom showcase websites or specific business applications.
- **Software Vendors (PropTech / Ecosystem Partners):** Valuation tools, marketing automation providers, and any type of partner we want to connect to our system.
- **Real estate listing portals:** Currently fed mostly via CSV or XML feeds, APIs are needed to better manage listing distribution and lead returns.

## 1. API Platform Overview

The Immofacile API is built on **REST** standards. It uses standard HTTP request methods, explicit HTTP status codes, and a JSON response format.

### 1.1 "API-First" Philosophy

To support the digitalization of real estate agencies, Immofacile offers a bidirectional architecture:

- **Extraction (Read):** Securely access your client data (properties, contacts, events, etc.).
- **Injection (Write):** Create, update, or enrich the agency database (leads, properties, actions, etc.) while respecting the CRM's business rules.

### 1.2 Environments & Authentication

- **Sandbox (Test):** An isolated environment containing demo data for development without risk of polluting production (coming soon).
- **Production:** The agency's live environment.
- **Security:** Authentication relies on the **OAuth 2.0** protocol (via a `Client ID` and `Client Secret` generated from the Immofacile admin dashboard) or by **API Key** for simple internal script integrations.

## 2. Key Concepts & Operating Rules

To interact effectively with Immofacile, you must understand two core pillars of our architecture: the **Discovery API** for accessing authorized resources, and **Webhooks** for real-time synchronization.

### 2.1 Discovery (Entry Point Discovery)

To avoid hardcoding URLs and to dynamically adapt to the client agency's access rights, our API implements the **Discovery** principle.

- **The concept:** By querying the single entry point, the API returns the list of all resources you have access to, along with associated URLs and available actions (`GET`, `POST`, etc.).
- **Example request:** `GET https://api.immofacile.com/v2/`

### 2.2 Webhooks (Real-Time Events)

Intensive polling is prohibited on our platform. To synchronize your data in real time, you must use our **Webhooks** system. Rather than asking Immofacile whether data has changed, Immofacile sends an HTTP `POST` notification to your server as soon as an event occurs.

- **Event format:** Each payload sent by our Webhook contains the event type (`event_type`) and the identifier of the related resource.

## 3. Business Use Cases & Implementation

Here is how to orchestrate our APIs to meet the real-world needs of real estate agents.

### Use Case 1: Create / Update a Lead from an External Tool (Data Write)

- **Step 1:** Duplicate check — Before creating a contact, the third-party application must verify the prospect does not already exist in the agency database via email or phone.
  - Action: `POST /customers/search` with email criterion
- **Step 2:** Contact creation — If the contact does not exist, create it.
  - Action: `POST /customers`
  - Payload: `{"firstname": "Jean", "lastname": "Dupont", "phone": "0601020304", "type": "Prospect Vendeur"}`
- **Step 3:** Search project creation — Create the search project based on the property the contact inquired about.
- **Step 4:** Add property to contact follow-up — Associate the listing details to the contact so the agent has context during callback.

### Use Case 2: Real-Time Feed for Agency Website / Portal / Partner (Data Read & Webhooks)

- **Step 1:** Initialization (Full Sync) — On first connection, retrieve the entire active catalog.
- **Step 2:** Listen for updates (Delta Sync via Webhook) — Register the website URL on our webhook to listen for the `property.updated` event.
  - Action: Configuration via dashboard or `POST /hooks` to subscribe to `property.updated`.
- **Step 3:** Targeted update — When a price changes or a property is sold in Immofacile, the website receives the webhook. It then queries the specific property to update its local database.

## 4. Support & Escalation

**Having trouble with your integration?**

1. **Check the Logs:** Every error response from our API contains a unique `request_id`.
2. **Contact dev support:** Send an email to api.imf@orisha.com, always including the `request_id`, the sent payload, and the environment concerned (Sandbox or Prod).

---

## Packs

The API is organized into subscription packs:
- **Properties** — Property listings and criteria management
- **Customers** — Customer management, search requests, follow-ups, actions
- **Leads** — Seller and buyer lead creation
- **Sales** — Sale agreements, offers, and leases
- **Websites** — Read feeds for websites and portals
- **Mandates** — Mandate register
- **Access** — Agent/collaborator (user) management
- **Full** — Complete pack bundling multiples packs

Each endpoint carries one or more colored badges indicating which
subscription pack(s) grant access to it. An endpoint may belong to
several packs. Use these badges to check whether your subscription
covers a given endpoint.

The **Full** badge marks every endpoint included in the all-in-one
*Complete* pack. It is additive: an endpoint showing **Full** is also
reachable through its individual pack badge(s).

## Authentication

Obtain a Bearer token via `POST /api/client/token/site` (OAuth2 client credentials).
Include it in the `Authorization: Bearer {token}` header for all requests.

**Base URL is dynamic.** The token response includes a `domain` field. Use it
as the base for every subsequent call (`{domain}/api/v2/site/...`). In the
Try it console, set the `domain` server variable to that value.

## Error format
```json
{ "error": { "code": "ERROR_CODE", "message": "Human-readable message." } }
```

## Pagination
List endpoints use cursor-based pagination: `next_cursor` + `has_more`.

## Headers
All responses include `X-Request-Id` (UUID) for log correlation.


Version: 1.4.0
License: Proprietary — © Orisha Real Estate

## Servers

[object Object]
```
{domain}/api/v2/site
```

Variables:
- `domain`: [object Object]
  Default: "https://v2.immo-facile.com"
  Enum: "https://v2.immo-facile.com", "https://ac3.staging.immo-facile.com"

## Security

### bearerAuth

Type: http
Scheme: bearer
Bearer Format: opaque

### basicAuth

[object Object]

Type: http
Scheme: basic

## Download OpenAPI description

 - [Immofacile API V2](https://api-doc.immo-facile.com/_bundle/openapi.yaml)

## Authentication

 - [POST /api/client/token/site](https://api-doc.immo-facile.com/openapi/authentication/obtainsitetoken.md): Authenticate using client credentials to obtain a Bearer token scoped to a site. This endpoint is shared between V1 and V2. The token must be included in the `Authorization: Bearer {token}` header for
## Discovery

 - [GET /discovery](https://api-doc.immo-facile.com/openapi/discovery/getdiscovery.md): Returns all agencies accessible by the authenticated client, together with the API packs attached to its access. This is the recommended **first call** when integrating. It tells you: - Which agencies
## Agencies

 - [GET /agencies](https://api-doc.immo-facile.com/openapi/agencies/listagencies.md): Returns all agencies accessible by the authenticated token with cursor-based pagination.
 - [GET /agencies/{agencyId}](https://api-doc.immo-facile.com/openapi/agencies/getagency.md): Returns detailed information about a specific agency, including its users.
## Products

 - [POST /products](https://api-doc.immo-facile.com/openapi/products/createproduct.md): Creates a new product (property listing). **Criteria (`criteria` field):** - Each criterion is an object with `id` (criteria identifier) and `value`. - The `id` accepts **either** the XML identifier (
 - [POST /products/search](https://api-doc.immo-facile.com/openapi/products/searchproducts.md): Searches products by criteria with cursor-based or offset-based pagination. **Pagination modes:** - **Cursor-based (recommended):** Provide `cursor` parameter. Returns `next_cursor` for the next page.
 - [GET /products/{productId}](https://api-doc.immo-facile.com/openapi/products/getproduct.md): Returns detailed information about a product. Use `?fetch=` to include additional related data (same values as search endpoint). Without `?fetch=`, returns the base product fields via the standard res
 - [PATCH /products/{productId}](https://api-doc.immo-facile.com/openapi/products/updateproduct.md): Partially updates a product. Only provided fields are modified. **Important:** The request body must include `product_id` (same value as the path parameter) — used for scope verification. **Criteria:*
 - [GET /products/{productId}/lots](https://api-doc.immo-facile.com/openapi/products/getproductlots.md): Returns the lots associated with a product (sub-products, e.g. units in a building).
 - [POST /products/{productId}/views](https://api-doc.immo-facile.com/openapi/products/addproductview.md): Increments the view counter of a product from an external website.
 - [POST /products/{productId}/dpeGes](https://api-doc.immo-facile.com/openapi/products/generateproductdpeges.md): Generates the DPE/GES energy label visual for a product. The DPE/GES letters and values come from the product's criteria; only the rendering options below can be provided. All fields are optional and
 - [POST /products/{productId}/pictures/public](https://api-doc.immo-facile.com/openapi/products/addproductpublicphoto.md): Uploads a public photo for a product. Minimum width 800px, max 20MB.
 - [POST /products/{productId}/pictures/private](https://api-doc.immo-facile.com/openapi/products/addproductprivatephoto.md): Uploads a private photo for a product. Minimum width 800px, max 20MB.
 - [GET /products/{productId}/actions](https://api-doc.immo-facile.com/openapi/products/listproductactions.md): Returns paginated action history for a product.
 - [POST /products/{productId}/actions](https://api-doc.immo-facile.com/openapi/products/createproductaction.md): Logs a new action on a product record. **Important:** The action is always recorded in the application log (journal). However, it will only appear in the product's action history tab if the action typ
## Criterias

 - [GET /criterias/product/all](https://api-doc.immo-facile.com/openapi/criterias/listproductcriteria.md): Returns all product criteria definitions for the site, including type, label, activation state and personalisation flags. **Criteria types:** | Type | Description | Value format | | --- | --- | --- |
 - [GET /criterias/product/{criteriaId}](https://api-doc.immo-facile.com/openapi/criterias/getproductcriteria.md): Returns a single product criteria definition with its possible values.
 - [GET /criterias/search-requests](https://api-doc.immo-facile.com/openapi/criterias/listsearchrequestcriteria.md): Returns the criteria available for buyer search requests on this site. Use these criteria IDs when creating search requests via `POST /leads/buyers` or `POST /customers/{id}/search-requests`.
 - [GET /criterias/zone-list](https://api-doc.immo-facile.com/openapi/criterias/getzonelist.md): Returns the list of geographic zones available for the site. Zones are used in search request criteria (typically criterion ID 30) to filter properties by location. Responses are cached with ETag.
 - [GET /criterias/categories/{categoryId}](https://api-doc.immo-facile.com/openapi/criterias/getcriteriabycategory.md): Returns the criteria belonging to a given product category. Categories group criteria by property type (e.g. criteria specific to apartments vs. houses vs. land).
## Customers

 - [POST /customers](https://api-doc.immo-facile.com/openapi/customers/createcustomer.md): Creates a new customer. **Duplicate handling:** - The system checks for duplicates by **email OR phones** (any match on the same site). - Without `check_duplicate`: if a duplicate is found, the existi
 - [POST /customers/search](https://api-doc.immo-facile.com/openapi/customers/searchcustomers.md): Searches customers with cursor-based pagination. Results are ordered by `customers_id` descending (most recent first).
 - [GET /customers/{customerId}](https://api-doc.immo-facile.com/openapi/customers/getcustomer.md): Returns detailed customer information. Use `include` to load additional relations. **Available includes:** `address`, `groups`, `color`, `origin`, `user`, `gender`, `stopSms`, `notary`, `relations`, `
 - [PATCH /customers/{customerId}](https://api-doc.immo-facile.com/openapi/customers/updatecustomer.md): Partially updates a customer. Only provided fields are modified.
 - [POST /customers/{customerId}/consent](https://api-doc.immo-facile.com/openapi/customers/upsertcustomerconsent.md): Creates or updates the cold-calling consent (consentement anti-démarchage) for a customer. **Behavior:** - One consent record per customer (upsert). - If the customer previously had their consent revo
 - [DELETE /customers/{customerId}/consent](https://api-doc.immo-facile.com/openapi/customers/revokecustomerconsent.md): Revokes the cold-calling consent for a customer. **Behavior:** - Sets a revocation date on the consent record. - If no consent exists, the operation still returns 204.
 - [POST /customers/{customerId}/search-requests](https://api-doc.immo-facile.com/openapi/customers/createsearchrequest.md): Creates a search request for a customer with criteria. Search requests define what a buyer/tenant is looking for. When active, the system runs automatic matching against new property listings.
 - [PATCH /customers/{customerId}/search-requests/{searchRequestId}](https://api-doc.immo-facile.com/openapi/customers/updatesearchrequest.md): Partially updates a search request for a customer. Only provided fields are modified. Criteria are replaced entirely when provided (not merged with existing ones).
 - [GET /customers/{customerId}/follow-ups](https://api-doc.immo-facile.com/openapi/customers/listcustomerfollowups.md): Returns paginated follow-ups (rapprochements) for a customer. A follow-up links a customer to a product they are interested in, tracking the progression of the relationship.
 - [POST /customers/{customerId}/follow-ups/{productId}](https://api-doc.immo-facile.com/openapi/customers/createcustomerfollowup.md): Creates a follow-up linking a customer to a product. Returns 409 if the follow-up already exists (customer already follows this product).
 - [PATCH /customers/{customerId}/follow-ups/{productId}](https://api-doc.immo-facile.com/openapi/customers/updatecustomerfollowup.md): Updates a follow-up (e.g. rating).
 - [DELETE /customers/{customerId}/follow-ups/{productId}](https://api-doc.immo-facile.com/openapi/customers/deletecustomerfollowup.md): Removes a follow-up between a customer and a product.
 - [GET /customers/{customerId}/actions](https://api-doc.immo-facile.com/openapi/customers/listcustomeractions.md): Returns paginated action history for a customer. Actions are commercial activities logged on a customer (calls, visits, emails, etc.). Uses offset-based pagination with `cursor` parameter.
 - [POST /customers/{customerId}/actions](https://api-doc.immo-facile.com/openapi/customers/createcustomeraction.md): Logs a new commercial action on a customer record. **Important:** The action is always recorded in the application journal. However, it will only appear in the customer's action history tab if the act
 - [GET /customers/groups](https://api-doc.immo-facile.com/openapi/customers/listcustomergroups.md): Returns all available customer groups for the site. Groups categorize customers (e.g. "Demandeur", "Propriétaire", "Locataire"). Use group IDs when creating customers or leads.
 - [GET /customers/origins](https://api-doc.immo-facile.com/openapi/customers/listcustomerorigins.md): Returns all available customer origins for the site. Origins track how a customer entered the system (e.g. "Site internet", "Portail", "Recommandation"). Use origin IDs when creating customers or lea
 - [GET /actions/types](https://api-doc.immo-facile.com/openapi/customers/listactiontypes.md): Returns the action types configured for the site. Action types are used when logging an action on a customer or a product (`POST /customers/{id}/actions`, `POST /products/{id}/actions`). Use the retur
## Leads

 - [POST /leads/sellers](https://api-doc.immo-facile.com/openapi/leads/createsellerlead.md): Creates a seller lead with a customer and a product. **Synchronization & duplicate behavior:** - The system automatically checks for duplicate customers by email OR phone OR mobile_phone. - Without `c
 - [POST /leads/buyers](https://api-doc.immo-facile.com/openapi/leads/createbuyerlead.md): Creates a buyer lead with a customer and optional search requests. **Synchronization & duplicate behavior:** Same as seller leads (see above). **Search requests:** Each search request contains criteri
## Transactions

 - [POST /transactions/agreement/search](https://api-doc.immo-facile.com/openapi/transactions/searchsaleagreements.md): Searches sale agreements (compromis de vente) with cursor-based pagination. **Use cases:** - Retrieve all sales completed after a given date - Find a sale agreement by product reference or customer na
 - [POST /transactions/sales-offers/search](https://api-doc.immo-facile.com/openapi/transactions/searchsalesoffers.md): Searches sales offers (offres d'achat) with cursor-based pagination. Offers have an additional `offer_status` field indicating the current state of the offer (`attente`, `acceptee`, `refusee`, `annule
 - [POST /transactions/leases/search](https://api-doc.immo-facile.com/openapi/transactions/searchleases.md): Searches lease agreements (baux de location) with cursor-based pagination. **Includes:** Use the `include` **query parameter** (comma-separated) to load additional relations, e.g. `?include=buyer,sell
 - [GET /agreement/{compromisId}](https://api-doc.immo-facile.com/openapi/transactions/getsaletransaction.md): Returns detailed information about a sale transaction (compromis, offer, or lease). Use `?include=` to load additional relations. Available includes: `compromis_cs`, `agencies`, `buyer`, `buyer_groups
 - [PUT /agreement/{compromisId}](https://api-doc.immo-facile.com/openapi/transactions/updatesaletransaction.md): Updates billing and invoicing fields on a sale transaction. **Important limitations:** - This endpoint only accepts **billing/invoicing fields** (conformity, payment, invoice numbers, fees). - It does
## Users

 - [GET /users](https://api-doc.immo-facile.com/openapi/users/listusers.md): Returns all users (agents/collaborators) for the authenticated site, with optional filters and cursor-based pagination. **Filters:** All query parameters are optional. Combine them to narrow results.
 - [POST /users](https://api-doc.immo-facile.com/openapi/users/createuser.md): Creates a new user (agent/collaborator) in the system. **Password requirements (RGPD):** - Length: 12-40 characters - Must contain: uppercase, lowercase, digit, special character **Agency assignment:
 - [GET /users/{userId}](https://api-doc.immo-facile.com/openapi/users/getuser.md): Returns detailed information about a user (agent/collaborator). Use `?include=logs` to include the user's recent action log entries.
 - [PATCH /users/{userId}](https://api-doc.immo-facile.com/openapi/users/updateuser.md): Partially updates a user. Only provided fields are modified. **Note:** Password can be changed via this endpoint. Same RGPD requirements apply.
 - [DELETE /users/{userId}](https://api-doc.immo-facile.com/openapi/users/deleteuser.md): Deletes a user. Their properties, customers, and other entities are automatically reassigned according to the site's configuration rules. **Warning:** This operation is irreversible. The user will be
 - [POST /users/{userId}/photo](https://api-doc.immo-facile.com/openapi/users/adduserphoto.md): Uploads the profile picture and/or signature of a user (agent/collaborator). Use `multipart/form-data`. At least one of `profile_picture` or `signature_picture` must be provided. Images only, max 20MB
 - [DELETE /users/{userId}/photo](https://api-doc.immo-facile.com/openapi/users/deleteuserphoto.md): Removes the profile picture and/or signature of a user (agent/collaborator). Use the `profile_picture` / `signature_picture` boolean flags to indicate which photo(s) to delete.
 - [GET /users/groups](https://api-doc.immo-facile.com/openapi/users/listusergroups.md): Returns all available user groups (permission levels) for the site. Groups determine the access level and permissions of a user within the agency (e.g. "Administrateur", "Négociateur", "Assistante").
 - [GET /users/types](https://api-doc.immo-facile.com/openapi/users/listusertypes.md): Returns all available user types (professional roles) for the site. User types categorize the professional role (e.g. "Négociateur", "Gestionnaire", "Directeur"). A user can have multiple types. Use t
 - [GET /users/genders](https://api-doc.immo-facile.com/openapi/users/listgenders.md): Returns all available gender options. Gender codes are used when creating users or customers (e.g. `"m"`, `"f"`). Some genders represent legal entities (companies) — check the `is_entity` flag.
## Mandates

 - [GET /mandates](https://api-doc.immo-facile.com/openapi/mandates/searchmandates.md): Searches mandates in the mandate register (registre des mandats) with cursor-based pagination. Results are ordered by `mandat_id` descending. The mandate register must be enabled for the site (`MODULE
 - [GET /mandates/{mandateId}](https://api-doc.immo-facile.com/openapi/mandates/getmandate.md): Returns detailed information about a single mandate. Use `include` to load additional related data.
## Webhooks

 - [GET /hooks](https://api-doc.immo-facile.com/openapi/webhooks/listwebhooks.md): Returns all webhooks registered by the authenticated client. Each webhook has a list of subscribed event types (`origines`) and a target URL.
 - [POST /hooks](https://api-doc.immo-facile.com/openapi/webhooks/createwebhook.md): Registers a new webhook subscription for specific events. ## How webhooks work Webhooks allow your application to receive real-time notifications when events occur in Immofacile (e.g. a customer is cr
 - [PUT /hooks/{hookId}](https://api-doc.immo-facile.com/openapi/webhooks/updatewebhook.md): Updates an existing webhook (URL, events, headers, auth). Use this endpoint to: - Change the target URL - Add/remove subscribed event types - Update authentication headers - Reactivate a suspended we
 - [DELETE /hooks/{hookId}](https://api-doc.immo-facile.com/openapi/webhooks/deletewebhook.md): Removes a webhook subscription. Events will no longer be delivered to this URL. This action is **irreversible** — to temporarily stop deliveries without losing the configuration, consider updating the
 - [POST customerEvent](https://api-doc.immo-facile.com/openapi/webhooks/oncustomerevent.md): Sent to your registered URL when a subscribed **customer** event occurs (`CUSTOMER_CREATE`, `CUSTOMER_UPDATE`). Respond with HTTP `200` within 10 seconds to acknowledge receipt. Return `422` to intent
 - [POST productEvent](https://api-doc.immo-facile.com/openapi/webhooks/onproductevent.md): Sent to your registered URL when a subscribed **product** event occurs (`PRODUCT_CREATE`, `PRODUCT_UPDATE`). Respond with HTTP `200` within 10 seconds to acknowledge receipt.
## Configs

 - [GET /configs/listes/{listeId}/values](https://api-doc.immo-facile.com/openapi/configs/getlistvalues.md): Returns all values for a given referential list (liste_id). Lists contain predefined values used in forms and validated fields. **Common list IDs:** | ID | Usage | | --- | --- | | 1 | Room types (Cha
## Agenda

 - [GET /calendar/events/types](https://api-doc.immo-facile.com/openapi/agenda/listeventtypes.md): Returns the agency configured event types with their display form (visible and collapsed fields). Cursor-based pagination. Requires the `MODULE_IMMO_AGENDA` module and `SITE_CALENDAR:READ` permission.
 - [GET /calendar/permanences/timeframe](https://api-doc.immo-facile.com/openapi/agenda/getpermanencetimeframe.md): Returns the client reception (permanence) slots configured for an agency, grouped by day of week. Requires `SITE_CALENDAR:READ`.
 - [GET /calendar/permanences/timeframe/users](https://api-doc.immo-facile.com/openapi/agenda/listpermanenceusers.md): Returns the users assigned to permanence slots over a period for an agency. Defaults to the current week when `from`/`to` are omitted. Requires `SITE_CALENDAR:READ`.
 - [GET /calendar/users/{userId}/working-time](https://api-doc.immo-facile.com/openapi/agenda/getuserworkingtime.md): Returns the working time slots of a user for the current week, grouped by day. Requires `SITE_CALENDAR:READ`.
 - [GET /calendar/users/{userId}/availability](https://api-doc.immo-facile.com/openapi/agenda/getuseravailability.md): Returns the available slots of a user over a period, computed from their working time and existing events. Defaults to the current week when `from`/`to` are omitted. Requires `SITE_CALENDAR:READ`.
 - [GET /calendar/users/{userId}/shared-agenda](https://api-doc.immo-facile.com/openapi/agenda/listsharedagendas.md): Returns the agendas accessible by the given user (users whose calendar is shared with them). Requires `SITE_CALENDAR:READ`.
 - [GET /calendar/events](https://api-doc.immo-facile.com/openapi/agenda/searchevents.md): Searches events over a period with optional filters. Defaults to the current day when `from`/`to` are omitted. Recurring events are expanded by default. Requires `SITE_CALENDAR:READ`.
 - [POST /calendar/events](https://api-doc.immo-facile.com/openapi/agenda/createevent.md): Creates a calendar event. Exactly one participant must be flagged as `is_organizer` and exactly one as `is_creator`, and each participant must have a unique `user_id`. Requires `SITE_CALENDAR:WRITE`.
 - [GET /calendar/events/{eventId}](https://api-doc.immo-facile.com/openapi/agenda/getevent.md): Returns a single event by ID. Requires `SITE_CALENDAR:READ`.
 - [PATCH /calendar/events/{eventId}](https://api-doc.immo-facile.com/openapi/agenda/updateevent.md): Partially updates an event. When participants are provided, exactly one must be flagged `is_organizer` and exactly one `is_creator`, with unique `user_id`. Requires `SITE_CALENDAR:WRITE`.
 - [DELETE /calendar/events/{eventId}](https://api-doc.immo-facile.com/openapi/agenda/deleteevent.md): Permanently deletes an event. Requires `SITE_CALENDAR:WRITE`.
 - [PATCH /calendar/events/{eventId}/status](https://api-doc.immo-facile.com/openapi/agenda/changeeventstatus.md): Archives or restores an event. Requires `SITE_CALENDAR:WRITE`.
## Changelog

 - [1.4.0 — 2026-10-07](https://api-doc.immo-facile.com/openapi/changelog/1.4.0-2026-10-07.md): ## 1.4.0 — 2026-10-07 **Added** - `GET /discovery` now returns a `packs` array listing the API packs (subscription scopes) attached to the authenticated access. Each pack exposes `name` and `descripti
 - [1.3.0 — 2026-09-30](https://api-doc.immo-facile.com/openapi/changelog/1.3.0-2026-09-30.md): ## 1.3.0 — 2026-09-30 **Added** - Seller and buyer lead endpoints now automatically record cold-calling consent on the contact (set to "collected" and timestamped) for anti-cold-calling law / GDPR com
 - [1.2.0 — 2026-09-23](https://api-doc.immo-facile.com/openapi/changelog/1.2.0-2026-09-23.md): ## 1.2.0 — 2026-09-23 **Added** - Sale transactions now expose the assigned agent (negotiator) under `assigned_user`, loadable via the new `include=user`. **Deprecated** - Transaction field and inclu
 - [1.1.0 — 2026-09-16](https://api-doc.immo-facile.com/openapi/changelog/1.1.0-2026-09-16.md): ## 1.1.0 — 2026-09-16 **Added** - Richer customer profiles: phone numbers, mandates, client-area access, color, notary, and related contacts. - More detail on search requests: criteria, key points (pr
 - [1.0.0 — 2026-06-17](https://api-doc.immo-facile.com/openapi/changelog/1.0.0-2026-06-17.md): ## 1.0.0 — 2026-06-17 **Added** - First public release of the V2 API (REST, OAuth 2.0 authentication). - Endpoints for Products, Customers, Leads, Transactions, Users, Agencies, Configs, and Calendar.
