Ts-Immo REST API

Complete REST API reference — all endpoints, parameters, request bodies, and examples based on the OpenAPI specification.

Base URL

https://api.ts-immo.org/v1

Authentication

Every API call must include your API key in the X-TS-IMMO-KEY HTTP header.

X-TS-IMMO-KEY: <your-api-key>
Content-Type: application/json
Never share your API key. Use environment variables and server-side secrets only.

Endpoints

Estates

Property management: search, view details, assign public URLs, submit leads, and replay synchronization.

GET/v1/estatesSearch estates with filters
GET/v1/estates/{id}Get estate details
PUT/v1/estates/{id}/urlAssign public URL
PUT/v1/estates/{id}/leadSubmit a buyer lead
POST/v1/estates/{id}/replayReplay estate sync

GET/v1/estates

Returns a paginated list of properties. All filter parameters are optional and can be combined.

ParamTypeReq.Description
querystringFree text search
typestringProperty type (apartment, house, land…)
sub_typestringProperty subtype (studio, penthouse, villa…)
offer_typestringOffer type (sale, rental, auction…)
statusstringProperty status (available, sold, rented…)
min_pricenumberMinimum price
max_pricenumberMaximum price
min_surfacenumberMinimum surface area (m²)
max_surfacenumberMaximum surface area (m²)
bedroomsintegerNumber of bedrooms
bathroomsintegerNumber of bathrooms
citystringCity
postal_codestringPostal code
countrystringCountry (ISO code)
regionstringRegion
featuredbooleanFeatured properties only
is_projectbooleanNew development projects only
pageintegerPage number (default: 1, min: 1)
limitintegerResults per page (default: 50, max: 100)
orderbystringSort field (default: created_at)
orderstringSort order: ASC | DESC (default: DESC)
curl -X GET "https://api.ts-immo.org/v1/estates?page=1&limit=20&city=Paris&offer_type=sale&min_price=100000" \
  -H "X-TS-IMMO-KEY: your-api-key"

Example response:

{
  "data": [
    {
      "id": "uuid",
      "reference": "REF-001",
      "type": "apartment",
      "sub_type": "penthouse",
      "offer_type": "sale",
      "status": "available",
      "bedrooms": 3,
      "bathrooms": 2,
      "location": {
        "city": "Paris",
        "postal_code": "75008",
        "country": "FR",
        "geo": { "latitude": 48.8566, "longitude": 2.3522 }
      },
      "financial": {
        "transaction": {
          "price": { "amount": 450000, "currency": "EUR" }
        }
      },
      "images": [...],
      "amenities": ["parking", "terrace", "elevator"],
      "created_at": "2025-01-15T10:30:00Z"
    }
  ],
  "total": 142,
  "page": 1,
  "limit": 20
}

GET/v1/estates/{id}

Returns the full details of a property by its UUID identifier.

ParamTypeReq.Description
idstring*Ts-Immo property ID — not the slug (path)
curl -X GET "https://api.ts-immo.org/v1/estates/550e8400-e29b-41d4-a716-446655440000" \
  -H "X-TS-IMMO-KEY: your-api-key"

PUT/v1/estates/{id}/url

Assigns the public URL of a property on your website. Allows Ts-Immo to know the address of the property detail page.

ParamTypeReq.Description
idstring*Ts-Immo property ID — not the slug (path)

Request body

{
  "url": "https://www.your-agency.com/property/apartment-t3-paris"
}
curl -X PUT "https://api.ts-immo.org/v1/estates/ESTATE_ID/url" \
  -H "X-TS-IMMO-KEY: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://www.your-agency.com/property/apartment-t3-paris" }'

PUT/v1/estates/{id}/lead

Submits buyer/prospect information for this property. Creates or updates the contact in the CRM.

ParamTypeReq.Description
idstring*Ts-Immo property ID — not the slug (path)

Request body

{
  "streamId": "stream-uuid",
  "civility": "MR",
  "firstname": "Jean",
  "lastname": "Dupont",
  "type": "PERSON",
  "mail": "jean.dupont@example.com",
  "phones": [
    { "number": "+33612345678", "type": "mobile" }
  ],
  "message": "I am interested in this property.",
  "lang": "fr",
  "preferences": [
    {
      "offerType": "sale",
      "budget": {
        "currency": "EUR",
        "min_price": { "amount": 200000 },
        "max_price": { "amount": 500000 }
      }
    }
  ]
}
Only the streamId field is required. All other fields are optional and allow enriching the buyer profile.

Lead fields (TsImmoBuyer):

ParamTypeReq.Description
streamIdstring*Unique stream identifier (required)
civilityenumMR | MS
firstnamestringContact first name
lastnamestringContact last name
typeenumPERSON | COMPANY
companyNamestringCompany name (if type = COMPANY)
mailstringPrimary email address
secondaryMailstringSecondary email address
phonesTsImmoPhone[]List of phone numbers
messagestringProspect message
internalNotestringInternal note (not visible to the prospect)
langenumfr | en
locationTsImmoLocationContact location
preferencesPreferences[]Search preferences (budget, location, property type…)

POST/v1/estates/{id}/replay

Replays synchronization for a specific property. Useful to force an update after a CRM modification.

ParamTypeReq.Description
idstring*Ts-Immo property ID — not the slug (path)
curl -X POST "https://api.ts-immo.org/v1/estates/ESTATE_ID/replay" \
  -H "X-TS-IMMO-KEY: your-api-key"

Support (Tickets)

Support ticket management: creation, viewing, comments, and closing.

GET/v1/support/?domain=...List support tickets
POST/v1/support/Create a support ticket
GET/v1/support/{id}?domain=...View a ticket
GET/v1/support/{id}/commentAdd a comment
POST/v1/support/support/{id}/close?domain=...Close a ticket

GET/v1/support/

Returns all support tickets associated with your domain.

ParamTypeReq.Description
domainstring*Website domain name
curl -X GET "https://api.ts-immo.org/v1/support/?domain=www.your-site.com" \
  -H "X-TS-IMMO-KEY: your-api-key"

POST/v1/support/

Creates a new support ticket with a subject, message, and reporter information.

Request body

{
  "domain": "www.your-site.com",
  "subject": "Sync issue on property REF-001",
  "message": "The property is not appearing on the website after sync.",
  "reporter": {
    "username": "admin",
    "mail": "admin@your-site.com",
    "display_name": "Site Admin"
  },
  "attachments": [
    {
      "filename": "screenshot.png",
      "mime_type": "image/png",
      "content_base64": "iVBORw0KGgo..."
    }
  ]
}
ParamTypeReq.Description
domainstring*Website domain name
subjectstring*Ticket subject
messagestring*Problem description
reporterSupportReporter*Reporter information (username, mail, display_name)
attachmentsSupportAttachment[]Base64-encoded attachments (filename, mime_type, content_base64)

Possible ticket statuses:

IN_PROGRESS | WAITING_FOR_SUPPORT | PENDING | DONE | CLOSED

GET/v1/support/{id}/comment

Adds a comment to an existing support ticket.

ParamTypeReq.Description
idstring*Ticket UUID identifier
commentSupportComment*Comment to add (comment, reporter)

POST/v1/support/support/{id}/close

Closes an existing support ticket.

ParamTypeReq.Description
idstring*Ticket UUID identifier
domainstring*Website domain name

Sites

Activate, deactivate, and replay synchronization for connected sites.

POST/v1/sites/activateActivate a site
POST/v1/sites/deactivateDeactivate a site
POST/v1/sites/replayReplay global sync

POST/v1/sites/activate

Activates a site by associating it with your Ts-Immo account via the plugin authentication key.

Request body

{
  "domain": "www.your-site.com",
  "plugin_auth_key": "your-plugin-auth-key",
  "theme_id": "theme-uuid"
}
ParamTypeReq.Description
domainstring*Domain name of the site to activate
plugin_auth_keystring*Plugin authentication key
theme_idstringTheme identifier (optional)

Example response:

{
  "success": true,
  "plan": "professional",
  "expires_at": "2026-12-31",
  "max_properties": 500,
  "error_message": null
}

POST/v1/sites/deactivate

Deactivates a site and stops property synchronization.

Request body

{
  "domain": "www.your-site.com"
}

POST/v1/sites/replay

Replays a global synchronization of all properties to all active sites.

curl -X POST "https://api.ts-immo.org/v1/sites/replay" \
  -H "X-TS-IMMO-KEY: your-api-key"

Plugins

List and download available plugins for your domain.

GET/v1/plugins/plugins?domain=...List available plugins
GET/v1/plugins/plugins/{pluginId}/download?domain=...Download a plugin

GET/v1/plugins/plugins

Returns the list of available plugins for your domain with their metadata.

ParamTypeReq.Description
domainstring*Website domain name

Example response:

[
  {
    "id": "plugin-uuid",
    "name": "ts-immo-sync",
    "description": "WordPress synchronization plugin",
    "version": "2.1.0",
    "shortcodes": ["ts_immo_listings", "ts_immo_property", "ts_immo_search", "ts_immo_map"],
    "signature": "sha256:abc123...",
    "file_url": "https://api.ts-immo.org/v1/plugins/plugins/plugin-uuid/download"
  }
]

GET/v1/plugins/plugins/{pluginId}/download

Downloads a specific plugin file. Returns the binary content of the plugin.

ParamTypeReq.Description
pluginIdstring*Plugin UUID identifier
domainstring*Website domain name
curl -X GET "https://api.ts-immo.org/v1/plugins/plugins/PLUGIN_ID/download?domain=www.your-site.com" \
  -H "X-TS-IMMO-KEY: your-api-key" \
  -o plugin.zip

Error Codes

On failure, the API returns a structured JSON error with an HTTP code and a descriptive message.

{
  "statusCode": 400,
  "message": ["One or more fields are invalid"],
  "error": "Bad Request"
}
ParamTypeReq.Description
200Success
400Bad request — missing or invalid parameters
401Unauthorized — missing or invalid API key
403Forbidden — insufficient permissions
404Resource not found
429Too many requests — rate limit exceeded
500Internal server error
The rate limit is 100 requests/minute per API key. Monitor the X-RateLimit-Remaining and X-RateLimit-Reset headers to smooth your load and avoid 429 errors.