Sari la conținut

Ce integrezi?

Ești portal imobiliar?

Alege Partner API (recomandat) sau Feed. Cheia se cere la contact@habitoo.ro.

Ești agenție Habitoo și ai propriul site?

Folosește feedul pentru site-ul agenției. Administratorul agenției adaugă site-ul și generează cheia în Habitoo → Setări → Portaluri → „Site-ul agenției”. Feedul conține doar anunțurile bifate pentru site. Fără cereri la suport.

Habitoo / Dezvoltatori

Partner API pentru portaluri imobiliare

Anunțuri, agenții și agenți. Sincronizare incrementală și date trimise de portal.

Introducere

Partner API este integrarea recomandată pentru portaluri: citești agențiile care te-au activat, anunțurile și agenții lor, sincronizezi modificările și trimiți înapoi starea publicării, lead-uri, mesaje și statistici.

Feedul este alternativa simplă pentru preluarea inventarului JSON sau XML Kyero. Partner API adaugă chei de test/live, sincronizare incrementală și răspunsuri structurate ale portalului, fără să înlocuiască feedul.

Webhooks anunță schimbările imediat; /changes rămâne sursa de recuperare.

Pornire rapidă

1. Cere cheia de test la contact@habitoo.ro.

2. Verifică portalul și mediul cu /me.

Pasul 2 · curl
curl -X GET "https://www.habitoo.ro/api/public/partner/v1/me" \
  -H "Authorization: Bearer $HABITOO_API_KEY"

3. Importă toate paginile din /listings.

Pasul 3 · curl
curl -X GET "https://www.habitoo.ro/api/public/partner/v1/listings?status=all&limit=50" \
  -H "Authorization: Bearer $HABITOO_API_KEY"

4. Configurează webhooks și recuperează din /changes.

Pasul 4 · curl
curl -X GET "https://www.habitoo.ro/api/public/partner/v1/changes?limit=100" \
  -H "Authorization: Bearer $HABITOO_API_KEY"

5. Trimite starea publicării și lead-urile.

Pasul 5 · curl
curl -X POST "https://www.habitoo.ro/api/public/partner/v1/listings/11111111-1111-4111-8111-111111111111/publication" \
  -H "Authorization: Bearer $HABITOO_API_KEY" \
  -H "Idempotency-Key: DEMO--listings-id-publication-001" \
  -H "Content-Type: application/json" \
  --data '{
  "status": "published",
  "portal_listing_id": "DEMO-001",
  "url": "https://example.invalid/anunt/demo-001",
  "occurred_at": "2026-11-07T12:00:00Z"
}'
Trimite un lead fictiv
curl -X POST "https://www.habitoo.ro/api/public/partner/v1/leads" \
  -H "Authorization: Bearer $HABITOO_API_KEY" \
  -H "Idempotency-Key: DEMO--leads-001" \
  -H "Content-Type: application/json" \
  --data '{
  "external_id": "DEMO-LEAD-001",
  "agency_id": "a7b50000-0000-4000-8000-000000000001",
  "name": "Client Demo",
  "email": "demo@example.invalid",
  "message": "Mesaj fictiv pentru test."
}'

Chei și medii

Cere cheia la contact@habitoo.ro. Cheia de test oferă acces la Agenția Demo Habitoo, cu date fictive; emiterea este în prezent manuală, nu automată imediat după solicitare.

Cheia live se primește după verificarea integrării. Cheile se pot roti și revoca. O cheie de test începe cu hbpk_test_, iar una live cu hbpk_live_. Păstrează cheia doar pe serverul portalului, nu în pagini publice, URL-uri sau jurnale.

Live vede numai agenții reale care au activat portalul; test vede numai agenția demo.

Autentificare

Toate operațiile cer antetul Authorization: Bearer. Nu este necesară autentificarea în aplicația Habitoo.

Autentificare Bearer
# Valoare ilustrativă nefuncțională; înlocuiește local cu cheia emisă.
HABITOO_API_KEY="hbpk_test_EXEMPLU_FICTIV"
curl -X GET "https://www.habitoo.ro/api/public/partner/v1/me" \
  -H "Authorization: Bearer $HABITOO_API_KEY"

Limite de cereri

Implicit: 120 cereri pe minut, per cheie, într-o fereastră fixă de 60 secunde. Limita poate fi configurată pentru portal; citește valoarea din /me.

Headere de limitare
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 119
X-RateLimit-Reset: 1794052860
X-Request-Id: 11111111-1111-4111-8111-111111111111
# La 429:
Retry-After: 60

Respectă Retry-After la 429 și folosește reîncercări cu pauze. Dacă verificarea limitei este indisponibilă, cererea este permisă și jurnalizată; remaining poate fi 0 în această situație. Headerele de limită nu sunt garantate înainte de identificarea portalului.

Idempotență

Toate POST-urile cer Idempotency-Key: 1–200 caractere ASCII vizibile. Folosește un identificator unic pentru fiecare operație. Păstrează exact aceeași metodă, cale, query, Content-Type și corp brut la reîncercare.

Rezultatul se păstrează 24 ore. Aceeași cheie pentru altă cerere produce 409 IDEMPOTENCY_CONFLICT. O cerere în procesare produce 409 REQUEST_IN_PROGRESS și Retry-After: 1. Nu recicla aceeași cheie pentru alt endpoint.

Deduplicarea lead-urilor și mesajelor prin external_id este separată de idempotența cererii.

Erori

Erorile au un format comun; X-Request-Id este prezent în răspuns. details este o listă de detalii de validare, uneori goală.

Exemplu fictiv de eroare 422
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Datele trimise nu sunt valide.",
    "details": [
      {
        "field": "email",
        "message": "Adresă invalidă."
      }
    ],
    "request_id": "11111111-1111-4111-8111-111111111111"
  }
}
Câmp / tipDescriere și reguli
error
object
Obligatoriu / prezent
error.code
string
Obligatoriu / prezent
Valori: UNAUTHORIZED, FORBIDDEN, RATE_LIMIT_EXCEEDED, INVALID_IDEMPOTENCY_KEY, IDEMPOTENCY_KEY_REQUIRED, IDEMPOTENCY_CONFLICT, REQUEST_IN_PROGRESS, SERVICE_UNAVAILABLE, METHOD_NOT_ALLOWED, INVALID_PARAMETER, NOT_FOUND, UNSUPPORTED_MEDIA_TYPE, PAYLOAD_TOO_LARGE, INVALID_JSON, VALIDATION_ERROR, EXTERNAL_ID_CONFLICT.
error.message
string
Obligatoriu / prezent
error.details
object[]
Obligatoriu / prezent
error.request_id
string
Obligatoriu / prezent
Format: uuid.
  • Headerele de limită apar după identificarea portalului; la eșecul verificării limitei cererea este permisă și jurnalizată.
  • Sandbox poate întoarce {not_found:true} cu HTTP 200 când datele demo/portalul nu sunt disponibile.
  • Lead live: 201 nou / 200 deduplicat; test adaugă test:true și label:Test.
  • Anunțurile create suplimentar în sandbox devin tombstone după reset.

Agenții

Agenții activate

GET/api/public/partner/v1/agencies

Date accesibile numai portalului autentificat, în mediul cheii folosite.

Parametri

Fără parametri în cale sau query. Authorization: Bearer este obligatoriu.

curl · GET /agencies
curl -X GET "https://www.habitoo.ro/api/public/partner/v1/agencies" \
  -H "Authorization: Bearer $HABITOO_API_KEY"
Răspuns 200 · JSON
{
  "data": [
    {
      "id": "a7b50000-0000-4000-8000-000000000001",
      "name": "Agenția Demo Habitoo",
      "legal_name": "Agenția Demo Habitoo — FICTIV",
      "cui": "DEMO-FICTIV-000",
      "email": "demo@example.invalid",
      "phone": "0000000000",
      "website": null,
      "logo_url": null,
      "address": null,
      "city": null,
      "county": null,
      "activated_at": "2026-11-07T12:00:00Z",
      "status": "active"
    }
  ]
}
Schema completă a răspunsului
Câmp / tipDescriere și reguli
data
object[]
Obligatoriu / prezent
data[].id
string
Obligatoriu / prezent
Identificator UUID.
data[].name
string
Obligatoriu / prezent
Valoarea name a agenției.
data[].legal_name
string | null
Obligatoriu / prezent
Valoarea legal_name a agenției.
data[].cui
string | null
Obligatoriu / prezent
Valoarea cui a agenției.
data[].email
string | null
Obligatoriu / prezent
Valoarea email a agenției.
data[].phone
string | null
Obligatoriu / prezent
Valoarea phone a agenției.
data[].website
string | null
Obligatoriu / prezent
Valoarea website a agenției.
data[].logo_url
string | null
Obligatoriu / prezent
Valoarea logo_url a agenției.
data[].address
string | null
Obligatoriu / prezent
Valoarea address a agenției.
data[].city
string | null
Obligatoriu / prezent
Valoarea city a agenției.
data[].county
string | null
Obligatoriu / prezent
Valoarea county a agenției.
data[].activated_at
string | null
Obligatoriu / prezent
Valoarea activated_at a agenției.
data[].status
string
Obligatoriu / prezent
Starea entității.
Valoare fixă: active.

Coduri posibile

200Cerere reușită.
400Parametru sau Idempotency-Key invalid/lipsă.
401Cheie API lipsă sau invalidă.
403Cheie revocată, portal dezactivat sau acțiune rezervată testului.
404Entitatea nu este accesibilă acestui portal/mediu.
405Metodă neacceptată (la /me se întoarce 400).
429Limita de cereri este depășită.
503Serviciu indisponibil temporar.

Detaliile entității

GET/api/public/partner/v1/agencies/{id}

Date accesibile numai portalului autentificat, în mediul cheii folosite.

Parametri

id
path · string
Obligatoriu
UUID al entității accesibile acestui portal.
curl · GET /agencies/{id}
curl -X GET "https://www.habitoo.ro/api/public/partner/v1/agencies/11111111-1111-4111-8111-111111111111" \
  -H "Authorization: Bearer $HABITOO_API_KEY"
Răspuns 200 · JSON
{
  "id": "a7b50000-0000-4000-8000-000000000001",
  "name": "Agenția Demo Habitoo",
  "legal_name": "Agenția Demo Habitoo — FICTIV",
  "cui": "DEMO-FICTIV-000",
  "email": "demo@example.invalid",
  "phone": "0000000000",
  "website": null,
  "logo_url": null,
  "address": null,
  "city": null,
  "county": null,
  "activated_at": "2026-11-07T12:00:00Z",
  "status": "active"
}
Schema completă a răspunsului
Câmp / tipDescriere și reguli
id
string
Obligatoriu / prezent
Identificator UUID.
name
string
Obligatoriu / prezent
Valoarea name a agenției.
legal_name
string | null
Obligatoriu / prezent
Valoarea legal_name a agenției.
cui
string | null
Obligatoriu / prezent
Valoarea cui a agenției.
email
string | null
Obligatoriu / prezent
Valoarea email a agenției.
phone
string | null
Obligatoriu / prezent
Valoarea phone a agenției.
website
string | null
Obligatoriu / prezent
Valoarea website a agenției.
logo_url
string | null
Obligatoriu / prezent
Valoarea logo_url a agenției.
address
string | null
Obligatoriu / prezent
Valoarea address a agenției.
city
string | null
Obligatoriu / prezent
Valoarea city a agenției.
county
string | null
Obligatoriu / prezent
Valoarea county a agenției.
activated_at
string | null
Obligatoriu / prezent
Valoarea activated_at a agenției.
status
string
Obligatoriu / prezent
Starea entității.
Valoare fixă: active.

Coduri posibile

200Cerere reușită.
400Parametru sau Idempotency-Key invalid/lipsă.
401Cheie API lipsă sau invalidă.
403Cheie revocată, portal dezactivat sau acțiune rezervată testului.
404Entitatea nu este accesibilă acestui portal/mediu.
405Metodă neacceptată (la /me se întoarce 400).
429Limita de cereri este depășită.
503Serviciu indisponibil temporar.

Anunțuri

Locație imprecisă: street și street_number sunt null, coordonatele sunt aproximative ca pe site și în feed. Locație precisă: adresa și coordonatele rămân exacte. Tombstone-urile retrase păstrează identificarea și datele; detaliile sunt golite.

Toate câmpurile anunțului

Câmp / tipDescriere și reguli
id
string
Obligatoriu / prezent
Identificator UUID.
reference
string | null
Obligatoriu / prezent
Referința anunțului.
agency_id
string
Obligatoriu / prezent
Identificatorul agenției accesibile acestui portal.
agent_id
string | null
Obligatoriu / prezent
Identificatorul agentului responsabil; poate lipsi.
status
string
Obligatoriu / prezent
Starea entității.
Valori: active, reserved, withdrawn.
offers
object[]
Obligatoriu / prezent
Oferte de vânzare și/sau închiriere.
offers[].type
string
Obligatoriu / prezent
Valoarea type a entității.
Valori: sale, rent.
offers[].price
number | null
Obligatoriu / prezent
Valoarea price a entității.
offers[].currency
string | null
Obligatoriu / prezent
Valoarea currency a entității.
offers[].vat_included
boolean | null
Obligatoriu / prezent
Valoarea vat_included a entității.
offers[].negotiable
boolean
Obligatoriu / prezent
Valoarea negotiable a entității.
property_type
string | null
Obligatoriu / prezent
Valoarea property_type a entității.
property_subtype
string | null
Obligatoriu / prezent
Valoarea property_subtype a entității.
title
string | null
Obligatoriu / prezent
Valoarea title a entității.
description
string | null
Obligatoriu / prezent
Valoarea description a entității.
rooms
number | null
Obligatoriu / prezent
Valoarea rooms a entității.
bedrooms
number | null
Obligatoriu / prezent
Valoarea bedrooms a entității.
bathrooms
number | null
Obligatoriu / prezent
Valoarea bathrooms a entității.
kitchens
number | null
Obligatoriu / prezent
Valoarea kitchens a entității.
balconies
number | null
Obligatoriu / prezent
Valoarea balconies a entității.
usable_area
number | null
Obligatoriu / prezent
Valoarea usable_area a entității.
built_area
number | null
Obligatoriu / prezent
Valoarea built_area a entității.
land_area
number | null
Obligatoriu / prezent
Valoarea land_area a entității.
floor
number | null
Obligatoriu / prezent
Valoarea floor a entității.
floors_total
number | null
Obligatoriu / prezent
Valoarea floors_total a entității.
build_year
number | null
Obligatoriu / prezent
Valoarea build_year a entității.
layout
string | null
Obligatoriu / prezent
Valoarea layout a entității.
heating
string | null
Obligatoriu / prezent
Valoarea heating a entității.
furnishing
string | null
Obligatoriu / prezent
Valoarea furnishing a entității.
parking
string | null
Obligatoriu / prezent
Valoarea parking a entității.
energy_class
string | null
Obligatoriu / prezent
Valoarea energy_class a entității.
features
string[]
Obligatoriu / prezent
Valoarea features a entității.
location
object
Obligatoriu / prezent
Valoarea location a entității.
location.county
string | null
Obligatoriu / prezent
Valoarea county a entității.
location.city
string | null
Obligatoriu / prezent
Valoarea city a entității.
location.district
string | null
Obligatoriu / prezent
Valoarea district a entității.
location.street
string | null
Obligatoriu / prezent
Strada fictivă sau publică numai dacă is_precise este true; altfel null.
location.street_number
string | null
Obligatoriu / prezent
Numărul stradal numai pentru locație precisă; altfel null.
location.latitude
number | null
Obligatoriu / prezent
Coordonată exactă pentru locație precisă; altfel aproximată determinist.
location.longitude
number | null
Obligatoriu / prezent
Coordonată exactă pentru locație precisă; altfel aproximată determinist.
location.is_precise
boolean
Obligatoriu / prezent
Indică dacă locația poate fi prezentată exact.
images
object[]
Obligatoriu / prezent
Valoarea images a entității.
images[].url
string
Obligatoriu / prezent
Valoarea url a entității.
images[].position
number
Obligatoriu / prezent
Valoarea position a entității.
images[].is_cover
boolean
Obligatoriu / prezent
Valoarea is_cover a entității.
floor_plans
object[]
Obligatoriu / prezent
Listă rezervată; momentan goală.
floor_plans[].url
string
Obligatoriu / prezent
Valoarea url a entității.
floor_plans[].position
number
Obligatoriu / prezent
Valoarea position a entității.
video_url
string | null
Obligatoriu / prezent
Rezervat; momentan null.
virtual_tour_url
string | null
Obligatoriu / prezent
Rezervat; momentan null.
created_at
string | null
Obligatoriu / prezent
Valoarea created_at a entității.
updated_at
string | null
Obligatoriu / prezent
Valoarea updated_at a entității.
withdrawn_at
string | null
Obligatoriu / prezent
Momentul retragerii; null pentru anunț activ.

Inventarul anunțurilor

GET/api/public/partner/v1/listings

Ordine stabilă după actualizare și identificator. Retragerile se păstrează 30 zile.

Parametri

agency_id
query · string
Opțional
Restrânge inventarul la agenție.
updated_since
query · string
Opțional
Modificări după momentul indicat.
status
query · string
Opțional
active include anunțuri vizibile active sau rezervate.
active | withdrawn | all
Implicit: all.
limit
query · integer
Opțional
Dimensiunea paginii.
Implicit: 50.
Interval: 1–100.
cursor
query · string
Opțional
Cursor opac; păstrează aceleași filtre.
curl · GET /listings
curl -X GET "https://www.habitoo.ro/api/public/partner/v1/listings?status=all&limit=50" \
  -H "Authorization: Bearer $HABITOO_API_KEY"
Răspuns 200 · JSON
{
  "data": [
    {
      "id": "a7b50000-0000-4000-8000-000000000100",
      "reference": "TEST-001",
      "agency_id": "a7b50000-0000-4000-8000-000000000001",
      "agent_id": "a7b50000-0000-4000-8000-000000000002",
      "status": "active",
      "offers": [
        {
          "type": "sale",
          "price": 80000,
          "currency": "EUR",
          "vat_included": null,
          "negotiable": false
        }
      ],
      "property_type": "apartment",
      "property_subtype": null,
      "title": "[Test] apartment — exemplu 1",
      "description": "Anunț fictiv pentru testarea integrării Partner API. Nu reprezintă o ofertă reală.",
      "rooms": 3,
      "bedrooms": 2,
      "bathrooms": 1,
      "kitchens": null,
      "balconies": null,
      "usable_area": null,
      "built_area": null,
      "land_area": null,
      "floor": 1,
      "floors_total": null,
      "build_year": 2020,
      "layout": null,
      "heating": null,
      "furnishing": null,
      "parking": null,
      "energy_class": null,
      "features": [],
      "location": {
        "county": "București",
        "city": "București",
        "district": "Centru",
        "street": "Strada Fictivă Demo",
        "street_number": "1",
        "latitude": 44.43,
        "longitude": 26.1,
        "is_precise": true
      },
      "images": [
        {
          "url": "https://example.invalid/apartment.jpg",
          "position": 0,
          "is_cover": true
        }
      ],
      "floor_plans": [],
      "video_url": null,
      "virtual_tour_url": null,
      "created_at": "2026-11-07T12:00:00Z",
      "updated_at": "2026-11-07T12:00:00Z",
      "withdrawn_at": null
    }
  ],
  "next_cursor": null
}
Schema completă a răspunsului
Câmp / tipDescriere și reguli
data
object[]
Obligatoriu / prezent
data[].id
string
Obligatoriu / prezent
Identificator UUID.
data[].reference
string | null
Obligatoriu / prezent
Referința anunțului.
data[].agency_id
string
Obligatoriu / prezent
Identificatorul agenției accesibile acestui portal.
data[].agent_id
string | null
Obligatoriu / prezent
Identificatorul agentului responsabil; poate lipsi.
data[].status
string
Obligatoriu / prezent
Starea entității.
Valori: active, reserved, withdrawn.
data[].offers
object[]
Obligatoriu / prezent
Oferte de vânzare și/sau închiriere.
data[].offers[].type
string
Obligatoriu / prezent
Valoarea type a entității.
Valori: sale, rent.
data[].offers[].price
number | null
Obligatoriu / prezent
Valoarea price a entității.
data[].offers[].currency
string | null
Obligatoriu / prezent
Valoarea currency a entității.
data[].offers[].vat_included
boolean | null
Obligatoriu / prezent
Valoarea vat_included a entității.
data[].offers[].negotiable
boolean
Obligatoriu / prezent
Valoarea negotiable a entității.
data[].property_type
string | null
Obligatoriu / prezent
Valoarea property_type a entității.
data[].property_subtype
string | null
Obligatoriu / prezent
Valoarea property_subtype a entității.
data[].title
string | null
Obligatoriu / prezent
Valoarea title a entității.
data[].description
string | null
Obligatoriu / prezent
Valoarea description a entității.
data[].rooms
number | null
Obligatoriu / prezent
Valoarea rooms a entității.
data[].bedrooms
number | null
Obligatoriu / prezent
Valoarea bedrooms a entității.
data[].bathrooms
number | null
Obligatoriu / prezent
Valoarea bathrooms a entității.
data[].kitchens
number | null
Obligatoriu / prezent
Valoarea kitchens a entității.
data[].balconies
number | null
Obligatoriu / prezent
Valoarea balconies a entității.
data[].usable_area
number | null
Obligatoriu / prezent
Valoarea usable_area a entității.
data[].built_area
number | null
Obligatoriu / prezent
Valoarea built_area a entității.
data[].land_area
number | null
Obligatoriu / prezent
Valoarea land_area a entității.
data[].floor
number | null
Obligatoriu / prezent
Valoarea floor a entității.
data[].floors_total
number | null
Obligatoriu / prezent
Valoarea floors_total a entității.
data[].build_year
number | null
Obligatoriu / prezent
Valoarea build_year a entității.
data[].layout
string | null
Obligatoriu / prezent
Valoarea layout a entității.
data[].heating
string | null
Obligatoriu / prezent
Valoarea heating a entității.
data[].furnishing
string | null
Obligatoriu / prezent
Valoarea furnishing a entității.
data[].parking
string | null
Obligatoriu / prezent
Valoarea parking a entității.
data[].energy_class
string | null
Obligatoriu / prezent
Valoarea energy_class a entității.
data[].features
string[]
Obligatoriu / prezent
Valoarea features a entității.
data[].location
object
Obligatoriu / prezent
Valoarea location a entității.
data[].location.county
string | null
Obligatoriu / prezent
Valoarea county a entității.
data[].location.city
string | null
Obligatoriu / prezent
Valoarea city a entității.
data[].location.district
string | null
Obligatoriu / prezent
Valoarea district a entității.
data[].location.street
string | null
Obligatoriu / prezent
Strada fictivă sau publică numai dacă is_precise este true; altfel null.
data[].location.street_number
string | null
Obligatoriu / prezent
Numărul stradal numai pentru locație precisă; altfel null.
data[].location.latitude
number | null
Obligatoriu / prezent
Coordonată exactă pentru locație precisă; altfel aproximată determinist.
data[].location.longitude
number | null
Obligatoriu / prezent
Coordonată exactă pentru locație precisă; altfel aproximată determinist.
data[].location.is_precise
boolean
Obligatoriu / prezent
Indică dacă locația poate fi prezentată exact.
data[].images
object[]
Obligatoriu / prezent
Valoarea images a entității.
data[].images[].url
string
Obligatoriu / prezent
Valoarea url a entității.
data[].images[].position
number
Obligatoriu / prezent
Valoarea position a entității.
data[].images[].is_cover
boolean
Obligatoriu / prezent
Valoarea is_cover a entității.
data[].floor_plans
object[]
Obligatoriu / prezent
Listă rezervată; momentan goală.
data[].floor_plans[].url
string
Obligatoriu / prezent
Valoarea url a entității.
data[].floor_plans[].position
number
Obligatoriu / prezent
Valoarea position a entității.
data[].video_url
string | null
Obligatoriu / prezent
Rezervat; momentan null.
data[].virtual_tour_url
string | null
Obligatoriu / prezent
Rezervat; momentan null.
data[].created_at
string | null
Obligatoriu / prezent
Valoarea created_at a entității.
data[].updated_at
string | null
Obligatoriu / prezent
Valoarea updated_at a entității.
data[].withdrawn_at
string | null
Obligatoriu / prezent
Momentul retragerii; null pentru anunț activ.
next_cursor
string | null
Obligatoriu / prezent

Coduri posibile

200Cerere reușită.
400Parametru sau Idempotency-Key invalid/lipsă.
401Cheie API lipsă sau invalidă.
403Cheie revocată, portal dezactivat sau acțiune rezervată testului.
404Entitatea nu este accesibilă acestui portal/mediu.
405Metodă neacceptată (la /me se întoarce 400).
429Limita de cereri este depășită.
503Serviciu indisponibil temporar.

Detaliile anunțului

GET/api/public/partner/v1/listings/{id}

Date accesibile numai portalului autentificat, în mediul cheii folosite.

Parametri

id
path · string
Obligatoriu
UUID al entității accesibile acestui portal.
curl · GET /listings/{id}
curl -X GET "https://www.habitoo.ro/api/public/partner/v1/listings/11111111-1111-4111-8111-111111111111" \
  -H "Authorization: Bearer $HABITOO_API_KEY"
Răspuns 200 · JSON
{
  "id": "a7b50000-0000-4000-8000-000000000100",
  "reference": "TEST-001",
  "agency_id": "a7b50000-0000-4000-8000-000000000001",
  "agent_id": "a7b50000-0000-4000-8000-000000000002",
  "status": "active",
  "offers": [
    {
      "type": "sale",
      "price": 80000,
      "currency": "EUR",
      "vat_included": null,
      "negotiable": false
    }
  ],
  "property_type": "apartment",
  "property_subtype": null,
  "title": "[Test] apartment — exemplu 1",
  "description": "Anunț fictiv pentru testarea integrării Partner API. Nu reprezintă o ofertă reală.",
  "rooms": 3,
  "bedrooms": 2,
  "bathrooms": 1,
  "kitchens": null,
  "balconies": null,
  "usable_area": null,
  "built_area": null,
  "land_area": null,
  "floor": 1,
  "floors_total": null,
  "build_year": 2020,
  "layout": null,
  "heating": null,
  "furnishing": null,
  "parking": null,
  "energy_class": null,
  "features": [],
  "location": {
    "county": "București",
    "city": "București",
    "district": "Centru",
    "street": "Strada Fictivă Demo",
    "street_number": "1",
    "latitude": 44.43,
    "longitude": 26.1,
    "is_precise": true
  },
  "images": [
    {
      "url": "https://example.invalid/apartment.jpg",
      "position": 0,
      "is_cover": true
    }
  ],
  "floor_plans": [],
  "video_url": null,
  "virtual_tour_url": null,
  "created_at": "2026-11-07T12:00:00Z",
  "updated_at": "2026-11-07T12:00:00Z",
  "withdrawn_at": null
}
Schema completă a răspunsului
Câmp / tipDescriere și reguli
id
string
Obligatoriu / prezent
Identificator UUID.
reference
string | null
Obligatoriu / prezent
Referința anunțului.
agency_id
string
Obligatoriu / prezent
Identificatorul agenției accesibile acestui portal.
agent_id
string | null
Obligatoriu / prezent
Identificatorul agentului responsabil; poate lipsi.
status
string
Obligatoriu / prezent
Starea entității.
Valori: active, reserved, withdrawn.
offers
object[]
Obligatoriu / prezent
Oferte de vânzare și/sau închiriere.
offers[].type
string
Obligatoriu / prezent
Valoarea type a entității.
Valori: sale, rent.
offers[].price
number | null
Obligatoriu / prezent
Valoarea price a entității.
offers[].currency
string | null
Obligatoriu / prezent
Valoarea currency a entității.
offers[].vat_included
boolean | null
Obligatoriu / prezent
Valoarea vat_included a entității.
offers[].negotiable
boolean
Obligatoriu / prezent
Valoarea negotiable a entității.
property_type
string | null
Obligatoriu / prezent
Valoarea property_type a entității.
property_subtype
string | null
Obligatoriu / prezent
Valoarea property_subtype a entității.
title
string | null
Obligatoriu / prezent
Valoarea title a entității.
description
string | null
Obligatoriu / prezent
Valoarea description a entității.
rooms
number | null
Obligatoriu / prezent
Valoarea rooms a entității.
bedrooms
number | null
Obligatoriu / prezent
Valoarea bedrooms a entității.
bathrooms
number | null
Obligatoriu / prezent
Valoarea bathrooms a entității.
kitchens
number | null
Obligatoriu / prezent
Valoarea kitchens a entității.
balconies
number | null
Obligatoriu / prezent
Valoarea balconies a entității.
usable_area
number | null
Obligatoriu / prezent
Valoarea usable_area a entității.
built_area
number | null
Obligatoriu / prezent
Valoarea built_area a entității.
land_area
number | null
Obligatoriu / prezent
Valoarea land_area a entității.
floor
number | null
Obligatoriu / prezent
Valoarea floor a entității.
floors_total
number | null
Obligatoriu / prezent
Valoarea floors_total a entității.
build_year
number | null
Obligatoriu / prezent
Valoarea build_year a entității.
layout
string | null
Obligatoriu / prezent
Valoarea layout a entității.
heating
string | null
Obligatoriu / prezent
Valoarea heating a entității.
furnishing
string | null
Obligatoriu / prezent
Valoarea furnishing a entității.
parking
string | null
Obligatoriu / prezent
Valoarea parking a entității.
energy_class
string | null
Obligatoriu / prezent
Valoarea energy_class a entității.
features
string[]
Obligatoriu / prezent
Valoarea features a entității.
location
object
Obligatoriu / prezent
Valoarea location a entității.
location.county
string | null
Obligatoriu / prezent
Valoarea county a entității.
location.city
string | null
Obligatoriu / prezent
Valoarea city a entității.
location.district
string | null
Obligatoriu / prezent
Valoarea district a entității.
location.street
string | null
Obligatoriu / prezent
Strada fictivă sau publică numai dacă is_precise este true; altfel null.
location.street_number
string | null
Obligatoriu / prezent
Numărul stradal numai pentru locație precisă; altfel null.
location.latitude
number | null
Obligatoriu / prezent
Coordonată exactă pentru locație precisă; altfel aproximată determinist.
location.longitude
number | null
Obligatoriu / prezent
Coordonată exactă pentru locație precisă; altfel aproximată determinist.
location.is_precise
boolean
Obligatoriu / prezent
Indică dacă locația poate fi prezentată exact.
images
object[]
Obligatoriu / prezent
Valoarea images a entității.
images[].url
string
Obligatoriu / prezent
Valoarea url a entității.
images[].position
number
Obligatoriu / prezent
Valoarea position a entității.
images[].is_cover
boolean
Obligatoriu / prezent
Valoarea is_cover a entității.
floor_plans
object[]
Obligatoriu / prezent
Listă rezervată; momentan goală.
floor_plans[].url
string
Obligatoriu / prezent
Valoarea url a entității.
floor_plans[].position
number
Obligatoriu / prezent
Valoarea position a entității.
video_url
string | null
Obligatoriu / prezent
Rezervat; momentan null.
virtual_tour_url
string | null
Obligatoriu / prezent
Rezervat; momentan null.
created_at
string | null
Obligatoriu / prezent
Valoarea created_at a entității.
updated_at
string | null
Obligatoriu / prezent
Valoarea updated_at a entității.
withdrawn_at
string | null
Obligatoriu / prezent
Momentul retragerii; null pentru anunț activ.

Coduri posibile

200Cerere reușită.
400Parametru sau Idempotency-Key invalid/lipsă.
401Cheie API lipsă sau invalidă.
403Cheie revocată, portal dezactivat sau acțiune rezervată testului.
404Entitatea nu este accesibilă acestui portal/mediu.
405Metodă neacceptată (la /me se întoarce 400).
429Limita de cereri este depășită.
503Serviciu indisponibil temporar.

Agenți

Agenți accesibili

GET/api/public/partner/v1/agents

Date accesibile numai portalului autentificat, în mediul cheii folosite.

Parametri

agency_id
query · string
Opțional
Filtru opțional pe agenție.
curl · GET /agents
curl -X GET "https://www.habitoo.ro/api/public/partner/v1/agents" \
  -H "Authorization: Bearer $HABITOO_API_KEY"
Răspuns 200 · JSON
{
  "data": [
    {
      "id": "a7b50000-0000-4000-8000-000000000002",
      "agency_id": "a7b50000-0000-4000-8000-000000000001",
      "name": "Agent Demo 1",
      "first_name": "Agent",
      "last_name": "Demo 1",
      "email": "agent1@example.invalid",
      "phone": "0000000000",
      "photo_url": null,
      "position": "Agent Demo"
    }
  ]
}
Schema completă a răspunsului
Câmp / tipDescriere și reguli
data
object[]
Obligatoriu / prezent
data[].id
string
Obligatoriu / prezent
Identificator UUID.
data[].agency_id
string
Obligatoriu / prezent
Identificatorul agenției accesibile acestui portal.
data[].name
string
Obligatoriu / prezent
Valoarea name a entității.
data[].first_name
string | null
Obligatoriu / prezent
Valoarea first_name a entității.
data[].last_name
string | null
Obligatoriu / prezent
Valoarea last_name a entității.
data[].email
string | null
Obligatoriu / prezent
Valoarea email a entității.
data[].phone
string | null
Obligatoriu / prezent
Valoarea phone a entității.
data[].photo_url
string | null
Obligatoriu / prezent
Valoarea photo_url a entității.
data[].position
string | null
Obligatoriu / prezent
Valoarea position a entității.

Coduri posibile

200Cerere reușită.
400Parametru sau Idempotency-Key invalid/lipsă.
401Cheie API lipsă sau invalidă.
403Cheie revocată, portal dezactivat sau acțiune rezervată testului.
404Entitatea nu este accesibilă acestui portal/mediu.
405Metodă neacceptată (la /me se întoarce 400).
429Limita de cereri este depășită.
503Serviciu indisponibil temporar.

Detaliile entității

GET/api/public/partner/v1/agents/{id}

Date accesibile numai portalului autentificat, în mediul cheii folosite.

Parametri

id
path · string
Obligatoriu
UUID al entității accesibile acestui portal.
curl · GET /agents/{id}
curl -X GET "https://www.habitoo.ro/api/public/partner/v1/agents/11111111-1111-4111-8111-111111111111" \
  -H "Authorization: Bearer $HABITOO_API_KEY"
Răspuns 200 · JSON
{
  "id": "a7b50000-0000-4000-8000-000000000002",
  "agency_id": "a7b50000-0000-4000-8000-000000000001",
  "name": "Agent Demo 1",
  "first_name": "Agent",
  "last_name": "Demo 1",
  "email": "agent1@example.invalid",
  "phone": "0000000000",
  "photo_url": null,
  "position": "Agent Demo"
}
Schema completă a răspunsului
Câmp / tipDescriere și reguli
id
string
Obligatoriu / prezent
Identificator UUID.
agency_id
string
Obligatoriu / prezent
Identificatorul agenției accesibile acestui portal.
name
string
Obligatoriu / prezent
Valoarea name a entității.
first_name
string | null
Obligatoriu / prezent
Valoarea first_name a entității.
last_name
string | null
Obligatoriu / prezent
Valoarea last_name a entității.
email
string | null
Obligatoriu / prezent
Valoarea email a entității.
phone
string | null
Obligatoriu / prezent
Valoarea phone a entității.
photo_url
string | null
Obligatoriu / prezent
Valoarea photo_url a entității.
position
string | null
Obligatoriu / prezent
Valoarea position a entității.

Coduri posibile

200Cerere reușită.
400Parametru sau Idempotency-Key invalid/lipsă.
401Cheie API lipsă sau invalidă.
403Cheie revocată, portal dezactivat sau acțiune rezervată testului.
404Entitatea nu este accesibilă acestui portal/mediu.
405Metodă neacceptată (la /me se întoarce 400).
429Limita de cereri este depășită.
503Serviciu indisponibil temporar.

Liste de valori

Liste de valori

GET/api/public/partner/v1/taxonomies

Date accesibile numai portalului autentificat, în mediul cheii folosite.

Parametri

Fără parametri în cale sau query. Authorization: Bearer este obligatoriu.

curl · GET /taxonomies
curl -X GET "https://www.habitoo.ro/api/public/partner/v1/taxonomies" \
  -H "Authorization: Bearer $HABITOO_API_KEY"
Răspuns 200 · JSON
{
  "listing_status": [
    {
      "code": "active",
      "label": "Activ"
    },
    {
      "code": "reserved",
      "label": "Rezervat"
    },
    {
      "code": "withdrawn",
      "label": "Retras"
    }
  ],
  "offer_type": [
    {
      "code": "sale",
      "label": "Vânzare"
    },
    {
      "code": "rent",
      "label": "Închiriere"
    }
  ],
  "currency": [
    {
      "code": "EUR",
      "label": "Euro"
    },
    {
      "code": "RON",
      "label": "Leu"
    },
    {
      "code": "USD",
      "label": "Dolar american"
    }
  ],
  "property_type": [
    {
      "code": "apartment",
      "label": "Apartament"
    },
    {
      "code": "studio",
      "label": "Garsonieră"
    },
    {
      "code": "house",
      "label": "Casă"
    },
    {
      "code": "villa",
      "label": "Vilă"
    },
    {
      "code": "land",
      "label": "Teren"
    },
    {
      "code": "commercial",
      "label": "Spațiu comercial"
    },
    {
      "code": "office",
      "label": "Birou"
    },
    {
      "code": "industrial",
      "label": "Hală / spațiu industrial"
    },
    {
      "code": "duplex",
      "label": "Duplex"
    },
    {
      "code": "penthouse",
      "label": "Penthouse"
    },
    {
      "code": "other",
      "label": "Altele"
    }
  ],
  "layout": [
    {
      "code": "decomandat",
      "label": "Decomandat"
    },
    {
      "code": "semidecomandat",
      "label": "Semidecomandat"
    },
    {
      "code": "nedecomandat",
      "label": "Nedecomandat"
    },
    {
      "code": "circular",
      "label": "Circular"
    },
    {
      "code": "vagon",
      "label": "Vagon"
    },
    {
      "code": "open_space",
      "label": "Open space"
    }
  ],
  "heating": [
    {
      "code": "termoficare",
      "label": "Termoficare"
    },
    {
      "code": "centrala_proprie",
      "label": "Centrală proprie"
    },
    {
      "code": "centrala_imobil",
      "label": "Centrală imobil"
    },
    {
      "code": "convectoare",
      "label": "Convectoare"
    },
    {
      "code": "soba_teracota",
      "label": "Sobă teracotă"
    },
    {
      "code": "centrala_pe_lemne",
      "label": "Centrală pe lemne"
    },
    {
      "code": "incalzire_pardoseala",
      "label": "Încălzire pardoseală"
    },
    {
      "code": "calorifere",
      "label": "Calorifere"
    },
    {
      "code": "pompa_de_caldura",
      "label": "Pompă de căldură"
    }
  ],
  "furnishing": [
    {
      "code": "complet",
      "label": "Complet"
    },
    {
      "code": "partial",
      "label": "Parțial"
    },
    {
      "code": "nemobilat",
      "label": "Nemobilat"
    },
    {
      "code": "lux",
      "label": "Lux"
    },
    {
      "code": "modern",
      "label": "Modern"
    }
  ],
  "parking": [
    {
      "code": "fara",
      "label": "Fără"
    },
    {
      "code": "loc_de_parcare",
      "label": "Loc de parcare"
    },
    {
      "code": "garaj",
      "label": "Garaj"
    },
    {
      "code": "parcare_subterana",
      "label": "Parcare subterană"
    },
    {
      "code": "parcare_supraterana",
      "label": "Parcare supraterană"
    }
  ],
  "energy_class": [
    {
      "code": "A++",
      "label": "Clasa A++"
    },
    {
      "code": "A+",
      "label": "Clasa A+"
    },
    {
      "code": "A",
      "label": "Clasa A"
    },
    {
      "code": "B",
      "label": "Clasa B"
    },
    {
      "code": "C",
      "label": "Clasa C"
    },
    {
      "code": "D",
      "label": "Clasa D"
    },
    {
      "code": "E",
      "label": "Clasa E"
    },
    {
      "code": "F",
      "label": "Clasa F"
    },
    {
      "code": "G",
      "label": "Clasa G"
    }
  ],
  "features": [
    {
      "code": "terasa",
      "label": "Terasă"
    },
    {
      "code": "wc_serviciu",
      "label": "WC serviciu"
    },
    {
      "code": "boxa_la_subsol",
      "label": "Boxă la subsol"
    },
    {
      "code": "debara",
      "label": "Debara"
    },
    {
      "code": "pivnita",
      "label": "Pivniță"
    },
    {
      "code": "dressing",
      "label": "Dressing"
    },
    {
      "code": "mobilata",
      "label": "Mobilată"
    },
    {
      "code": "partial_mobilata",
      "label": "Parțial mobilată"
    },
    {
      "code": "utilata",
      "label": "Utilată"
    },
    {
      "code": "partial_utilata",
      "label": "Parțial utilată"
    },
    {
      "code": "nemobilata",
      "label": "Nemobilată"
    },
    {
      "code": "neutilata",
      "label": "Neutilată"
    },
    {
      "code": "apometre",
      "label": "Apometre"
    },
    {
      "code": "contor_caldura",
      "label": "Contor căldură"
    },
    {
      "code": "contor_gaz",
      "label": "Contor gaz"
    },
    {
      "code": "contor_curent_electric",
      "label": "Contor curent electric"
    },
    {
      "code": "contorizare_separata",
      "label": "Contorizare separată"
    },
    {
      "code": "masina_de_spalat_rufe",
      "label": "Mașină de spălat rufe"
    },
    {
      "code": "frigider",
      "label": "Frigider"
    },
    {
      "code": "aragaz",
      "label": "Aragaz"
    },
    {
      "code": "masina_de_spalat_vase",
      "label": "Mașină de spălat vase"
    },
    {
      "code": "fier_de_calcat",
      "label": "Fier de călcat"
    },
    {
      "code": "tv",
      "label": "TV"
    },
    {
      "code": "cafetiera",
      "label": "Cafetieră"
    },
    {
      "code": "uscator_par",
      "label": "Uscător păr"
    },
    {
      "code": "toaster",
      "label": "Toaster"
    },
    {
      "code": "dvd",
      "label": "DVD"
    },
    {
      "code": "sandwich_maker",
      "label": "Sandwich-maker"
    },
    {
      "code": "cuptor_microunde",
      "label": "Cuptor microunde"
    },
    {
      "code": "hota",
      "label": "Hotă"
    },
    {
      "code": "robot_bucatarie",
      "label": "Robot bucătărie"
    },
    {
      "code": "aspirator",
      "label": "Aspirator"
    },
    {
      "code": "hi_fi",
      "label": "HI-FI"
    },
    {
      "code": "plita_electrica",
      "label": "Plită electrică"
    },
    {
      "code": "interfon",
      "label": "Interfon"
    },
    {
      "code": "videointerfon",
      "label": "Videointerfon"
    },
    {
      "code": "supraveghere_video",
      "label": "Supraveghere video"
    },
    {
      "code": "lift",
      "label": "Lift"
    },
    {
      "code": "spatii_agrement",
      "label": "Spații agrement"
    },
    {
      "code": "sauna",
      "label": "Sauna"
    },
    {
      "code": "spa",
      "label": "SPA"
    },
    {
      "code": "acoperis",
      "label": "Acoperiș"
    },
    {
      "code": "curte",
      "label": "Curte"
    },
    {
      "code": "curte_comuna",
      "label": "Curte comună"
    },
    {
      "code": "gradina",
      "label": "Grădină"
    },
    {
      "code": "piscina_interioara",
      "label": "Piscină interioară"
    },
    {
      "code": "piscina_exterioara",
      "label": "Piscină exterioară"
    },
    {
      "code": "uscatorie",
      "label": "Uscătorie"
    },
    {
      "code": "asfaltate",
      "label": "Asfaltate"
    },
    {
      "code": "pietruite",
      "label": "Pietruite"
    },
    {
      "code": "neamenajate",
      "label": "Neamenajate"
    },
    {
      "code": "betonate",
      "label": "Betonate"
    },
    {
      "code": "iluminat_stradal",
      "label": "Iluminat stradal"
    },
    {
      "code": "mijloace_de_transport_in_comun",
      "label": "Mijloace de transport în comun"
    },
    {
      "code": "panoramica",
      "label": "Panoramică"
    },
    {
      "code": "spre_lac",
      "label": "Spre lac"
    },
    {
      "code": "spre_mare",
      "label": "Spre mare"
    },
    {
      "code": "spre_munte",
      "label": "Spre munte"
    },
    {
      "code": "spre_oras",
      "label": "Spre oraș"
    },
    {
      "code": "spre_padure",
      "label": "Spre pădure"
    },
    {
      "code": "jacuzzi",
      "label": "Jacuzzi"
    },
    {
      "code": "scara_interioara",
      "label": "Scară interioară"
    },
    {
      "code": "semineu",
      "label": "Șemineu"
    },
    {
      "code": "senzor_de_fum",
      "label": "Senzor de fum"
    },
    {
      "code": "sistem_de_alarma",
      "label": "Sistem de alarmă"
    },
    {
      "code": "telecomanda_poarta_garaj",
      "label": "Telecomandă poartă garaj"
    },
    {
      "code": "telecomanda_poarta_acces_auto",
      "label": "Telecomandă poartă acces auto"
    },
    {
      "code": "aer_conditionat",
      "label": "Aer condiționat"
    },
    {
      "code": "ventiloconvectoare",
      "label": "Ventiloconvectoare"
    },
    {
      "code": "aeroterme",
      "label": "Aeroterme"
    }
  ],
  "event_type": [
    {
      "code": "listing.upserted",
      "label": "Anunț nou sau modificat"
    },
    {
      "code": "listing.withdrawn",
      "label": "Anunț retras"
    },
    {
      "code": "agency.activated",
      "label": "Agenție activată"
    },
    {
      "code": "agency.deactivated",
      "label": "Agenție dezactivată"
    },
    {
      "code": "agent.updated",
      "label": "Agent modificat"
    }
  ]
}
Schema completă a răspunsului
Câmp / tipDescriere și reguli
listing_status
object[]
Obligatoriu / prezent
listing_status[].code
string
Obligatoriu / prezent
Valori: active, reserved, withdrawn.
listing_status[].label
string
Obligatoriu / prezent
offer_type
object[]
Obligatoriu / prezent
offer_type[].code
string
Obligatoriu / prezent
Valori: sale, rent.
offer_type[].label
string
Obligatoriu / prezent
currency
object[]
Obligatoriu / prezent
currency[].code
string
Obligatoriu / prezent
Valori: EUR, RON, USD.
currency[].label
string
Obligatoriu / prezent
property_type
object[]
Obligatoriu / prezent
property_type[].code
string
Obligatoriu / prezent
Valori: apartment, studio, house, villa, land, commercial, office, industrial, duplex, penthouse, other.
property_type[].label
string
Obligatoriu / prezent
layout
object[]
Obligatoriu / prezent
layout[].code
string
Obligatoriu / prezent
Valori: decomandat, semidecomandat, nedecomandat, circular, vagon, open_space.
layout[].label
string
Obligatoriu / prezent
heating
object[]
Obligatoriu / prezent
heating[].code
string
Obligatoriu / prezent
Valori: termoficare, centrala_proprie, centrala_imobil, convectoare, soba_teracota, centrala_pe_lemne, incalzire_pardoseala, calorifere, pompa_de_caldura.
heating[].label
string
Obligatoriu / prezent
furnishing
object[]
Obligatoriu / prezent
furnishing[].code
string
Obligatoriu / prezent
Valori: complet, partial, nemobilat, lux, modern.
furnishing[].label
string
Obligatoriu / prezent
parking
object[]
Obligatoriu / prezent
parking[].code
string
Obligatoriu / prezent
Valori: fara, loc_de_parcare, garaj, parcare_subterana, parcare_supraterana.
parking[].label
string
Obligatoriu / prezent
energy_class
object[]
Obligatoriu / prezent
energy_class[].code
string
Obligatoriu / prezent
Valori: A++, A+, A, B, C, D, E, F, G.
energy_class[].label
string
Obligatoriu / prezent
features
object[]
Obligatoriu / prezent
features[].code
string
Obligatoriu / prezent
Valori: terasa, wc_serviciu, boxa_la_subsol, debara, pivnita, dressing, mobilata, partial_mobilata, utilata, partial_utilata, nemobilata, neutilata, apometre, contor_caldura, contor_gaz, contor_curent_electric, contorizare_separata, masina_de_spalat_rufe, frigider, aragaz, masina_de_spalat_vase, fier_de_calcat, tv, cafetiera, uscator_par, toaster, dvd, sandwich_maker, cuptor_microunde, hota, robot_bucatarie, aspirator, hi_fi, plita_electrica, interfon, videointerfon, supraveghere_video, lift, spatii_agrement, sauna, spa, acoperis, curte, curte_comuna, gradina, piscina_interioara, piscina_exterioara, uscatorie, asfaltate, pietruite, neamenajate, betonate, iluminat_stradal, mijloace_de_transport_in_comun, panoramica, spre_lac, spre_mare, spre_munte, spre_oras, spre_padure, jacuzzi, scara_interioara, semineu, senzor_de_fum, sistem_de_alarma, telecomanda_poarta_garaj, telecomanda_poarta_acces_auto, aer_conditionat, ventiloconvectoare, aeroterme.
features[].label
string
Obligatoriu / prezent
event_type
object[]
Obligatoriu / prezent
event_type[].code
string
Obligatoriu / prezent
Valori: listing.upserted, listing.withdrawn, agency.activated, agency.deactivated, agent.updated.
event_type[].label
string
Obligatoriu / prezent

Coduri posibile

200Cerere reușită.
400Parametru sau Idempotency-Key invalid/lipsă.
401Cheie API lipsă sau invalidă.
403Cheie revocată, portal dezactivat sau acțiune rezervată testului.
404Entitatea nu este accesibilă acestui portal/mediu.
405Metodă neacceptată (la /me se întoarce 400).
429Limita de cereri este depășită.
503Serviciu indisponibil temporar.

Flux de modificări

Înainte de importul complet, citește /changes fără cursor și păstrează next_cursor: acest apel pornește de la poziția curentă și nu întoarce istoricul.

Importă toate paginile /listings, apoi reia /changes cu cursorul inițial. Aplică evenimentele în ordine după seq, citește detaliile entității, iar la listing.withdrawn retrage anunțul. Persistă cursorul numai după aplicarea completă a paginii; continuă cât has_more este true.

Evenimentele se păstrează 90 zile. Interoghează periodic cu ultimul cursor; după o pauză care depășește retenția, reia importul complet. Cursorul /listings nu este interschimbabil cu cel /changes.

Flux de modificări

GET/api/public/partner/v1/changes

Evenimente crescătoare după seq, păstrate 90 zile. Salvează next_cursor numai după aplicarea paginii.

Parametri

cursor
query · string
Opțional
Fără cursor: inițializează poziția curentă, fără evenimente.
limit
query · integer
Opțional
Numărul de evenimente.
Implicit: 100.
Interval: 1–500.
curl · GET /changes
curl -X GET "https://www.habitoo.ro/api/public/partner/v1/changes?limit=100" \
  -H "Authorization: Bearer $HABITOO_API_KEY"
Răspuns 200 · JSON
{
  "data": [],
  "next_cursor": "eyJzIjowfQ",
  "has_more": false
}
Schema completă a răspunsului
Câmp / tipDescriere și reguli
data
object[]
Obligatoriu / prezent
data[].seq
integer
Obligatoriu / prezent
Minim: 1.
data[].type
string
Obligatoriu / prezent
Valori: listing.upserted, listing.withdrawn, agency.activated, agency.deactivated, agent.updated.
data[].entity_type
string
Obligatoriu / prezent
Valori: listing, agency, agent.
data[].entity_id
string
Obligatoriu / prezent
Format: uuid.
data[].agency_id
string
Obligatoriu / prezent
Format: uuid.
data[].occurred_at
string
Obligatoriu / prezent
Format: date-time.
next_cursor
string
Obligatoriu / prezent
has_more
boolean
Obligatoriu / prezent

Coduri posibile

200Cerere reușită.
400Parametru sau Idempotency-Key invalid/lipsă.
401Cheie API lipsă sau invalidă.
403Cheie revocată, portal dezactivat sau acțiune rezervată testului.
404Entitatea nu este accesibilă acestui portal/mediu.
405Metodă neacceptată (la /me se întoarce 400).
429Limita de cereri este depășită.
503Serviciu indisponibil temporar.

Webhooks

Configurează o adresă HTTPS publică pe portul 443, fără credențiale sau IP literal. DNS A și AAAA sunt verificate înainte de salvare și fiecare livrare; adresele private, rezervate și redirecționările sunt respinse.

Secretul de 32 bytes, hex, apare numai la prima setare sau rotate_secret:true. Decodează hex înainte de HMAC-SHA256. Semnătura X-Habitoo-Signature este t=timestamp,v1=hex, calculată pe timestamp + "." + corpul brut. Păstrează corpul brut, verifică semnătura în timp constant și respinge timestamp-uri mai vechi de 5 minute.

POST-ul conține id, type, seq, occurred_at și numai identificatori în data. Citește obiectul complet din API. X-Habitoo-Event indică tipul, X-Habitoo-Delivery identifică încercarea, User-Agent este Habitoo-Webhooks/1.0. Orice 2xx confirmă; timeout 10 secunde, citire răspuns maximum 64 KB, fără urmarea redirecționărilor.

Ordinea seq se păstrează per portal și mediu. Reîncercări după 1 min, 5 min, 30 min, 2 h, 6 h, 12 h, maximum 24 h; apoi suspendare și notificare SuperAdmin. PUT pe webhook activ păstrează livrările în așteptare; după suspendare reactivează o subscriere nouă, iar evenimentele omise se recuperează din /changes. Jurnalul livrărilor păstrează 14 zile. Deduplică id într-o coadă persistentă și confirmă după salvare, înainte de procesarea lentă.

Test și live au configurații și secrete separate. webhook.test încearcă imediat livrarea, dar nu depășește evenimente anterioare care așteaptă reîncercarea.

Verificarea semnăturii · Node.js
// Express: mount express.raw({ type: 'application/json' }) before JSON parsing.
import { createHmac, timingSafeEqual } from 'node:crypto';
const signature = req.get('X-Habitoo-Signature') ?? '';
const match = /^t=(\d+),v1=([a-f0-9]{64})$/.exec(signature);
if (!match || Math.abs(Date.now() / 1000 - Number(match[1])) > 300) {
  return res.sendStatus(401);
}
const secret = Buffer.from(process.env.HABITOO_WEBHOOK_SECRET, 'hex');
const expected = createHmac('sha256', secret)
  .update(match[1] + '.').update(req.body).digest();
if (!timingSafeEqual(expected, Buffer.from(match[2], 'hex'))) {
  return res.sendStatus(401);
}
const event = JSON.parse(req.body.toString('utf8'));
// Persist event.id in a durable inbox with a UNIQUE constraint.
// Atomically enqueue once, then acknowledge; do not process twice.
await saveToInboxOnce(event);
res.sendStatus(204);
Verificarea semnăturii · PHP
<?php
$raw = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_HABITOO_SIGNATURE'] ?? '';
if (!preg_match('/^t=(\d+),v1=([a-f0-9]{64})$/', $signature, $m)
    || abs(time() - (int)$m[1]) > 300) {
    http_response_code(401); exit;
}
$secret = hex2bin(getenv('HABITOO_WEBHOOK_SECRET'));
$expected = hash_hmac('sha256', $m[1] . '.' . $raw, $secret);
if (!hash_equals($expected, $m[2])) {
    http_response_code(401); exit;
}
$event = json_decode($raw, true, 512, JSON_THROW_ON_ERROR);
// Durable inbox, UNIQUE event.id; enqueue atomically only once.
save_to_inbox_once($event);
http_response_code(204);
Verificarea semnăturii · Python
import hashlib, hmac, os, re, time, json
# Flask: read the raw body before decoding JSON.
raw = request.get_data()
match = re.fullmatch(r"t=(\d+),v1=([a-f0-9]{64})",
                     request.headers.get("X-Habitoo-Signature", ""))
if not match or abs(time.time() - int(match[1])) > 300:
    abort(401)
secret = bytes.fromhex(os.environ["HABITOO_WEBHOOK_SECRET"])
expected = hmac.new(secret, match[1].encode() + b"." + raw,
                    hashlib.sha256).hexdigest()
if not hmac.compare_digest(expected, match[2]):
    abort(401)
event = json.loads(raw)
# Durable inbox, UNIQUE event.id; enqueue atomically only once.
save_to_inbox_once(event)
return "", 204

Configurația webhook

GET/api/public/partner/v1/webhook

Configurație separată per portal și mediu; null dacă nu există. Secretul nu apare în listări.

Parametri

Fără parametri în cale sau query. Authorization: Bearer este obligatoriu.

curl · GET /webhook
curl -X GET "https://www.habitoo.ro/api/public/partner/v1/webhook" \
  -H "Authorization: Bearer $HABITOO_API_KEY"
Răspuns 200 · JSON
{}
Schema completă a răspunsului
Câmp / tipDescriere și reguli
url
string
Obligatoriu / prezent
events
string[]
Obligatoriu / prezent
status
string
Obligatoriu / prezent
Valori: active, suspended.
has_secret
boolean
Obligatoriu / prezent
Valoare fixă: true.
last_success_at
string | null
Obligatoriu / prezent
consecutive_failures
integer
Obligatoriu / prezent
Minim: 0.

Coduri posibile

200Cerere reușită.
400Parametru sau Idempotency-Key invalid/lipsă.
401Cheie API lipsă sau invalidă.
403Cheie revocată, portal dezactivat sau acțiune rezervată testului.
404Entitatea nu este accesibilă acestui portal/mediu.
405Metodă neacceptată (la /me se întoarce 400).
429Limita de cereri este depășită.
503Serviciu indisponibil temporar.

Configurează sau reactivează webhook

PUT/api/public/partner/v1/webhook

Prima setare sau rotate_secret:true întoarce secretul o singură dată. Pentru webhook activ păstrează livrările în așteptare. Pentru webhook suspendat, PUT reactivează o subscriere nouă; recuperează evenimentele omise din /changes. Lipsa events sau [] înseamnă toate evenimentele.

Parametri

Fără parametri în cale sau query. Authorization: Bearer este obligatoriu.

Corpul cererii

Câmp / tipDescriere și reguli
url
string
Obligatoriu / prezent
HTTPS public sur portul 443, fără credențiale, IP literal sau redirecționări. A și AAAA verificate prin DNS-over-HTTPS la salvare și livrare; orice adresă nepublică este respinsă.
Format: uri.
Maximum 2048 caractere.
events
string[]
Opțional
Valoare events.
rotate_secret
boolean
Opțional
Generează un secret nou; vechiul secret nu mai semnează livrările viitoare.
curl · PUT /webhook
curl -X PUT "https://www.habitoo.ro/api/public/partner/v1/webhook" \
  -H "Authorization: Bearer $HABITOO_API_KEY" \
  -H "Content-Type: application/json" \
  --data '{
  "url": "https://example.invalid/habitoo-webhook",
  "events": [
    "listing.upserted",
    "listing.withdrawn"
  ]
}'
Răspuns 200 · JSON
{
  "url": "https://example.invalid/habitoo-webhook",
  "events": [],
  "status": "active",
  "has_secret": true,
  "last_success_at": null,
  "consecutive_failures": 0
}
Schema completă a răspunsului
Câmp / tipDescriere și reguli
url
string
Obligatoriu / prezent
events
string[]
Obligatoriu / prezent
status
string
Obligatoriu / prezent
Valori: active, suspended.
has_secret
boolean
Obligatoriu / prezent
Valoare fixă: true.
last_success_at
string | null
Obligatoriu / prezent
consecutive_failures
integer
Obligatoriu / prezent
Minim: 0.
secret
string
Opțional
32 bytes hex, afișat numai la prima setare sau rotate_secret. Pentru HMAC se decodează hex în 32 bytes, nu se folosește șirul hex ca text.

Coduri posibile

200Cerere reușită.
400Parametru sau Idempotency-Key invalid/lipsă.
401Cheie API lipsă sau invalidă.
403Cheie revocată, portal dezactivat sau acțiune rezervată testului.
404Entitatea nu este accesibilă acestui portal/mediu.
405Metodă neacceptată (la /me se întoarce 400).
409Conflict de idempotență, cerere în procesare sau external_id conflictual.
413Corpul cererii depășește limita.
415Content-Type trebuie să fie application/json.
422JSON sau date invalide.
429Limita de cereri este depășită.
503Serviciu indisponibil temporar.

Oprește webhook

DELETE/api/public/partner/v1/webhook

Date accesibile numai portalului autentificat, în mediul cheii folosite.

Parametri

Fără parametri în cale sau query. Authorization: Bearer este obligatoriu.

curl · DELETE /webhook
curl -X DELETE "https://www.habitoo.ro/api/public/partner/v1/webhook" \
  -H "Authorization: Bearer $HABITOO_API_KEY"
Răspuns 200 · JSON
{
  "deleted": true
}
Schema completă a răspunsului
Câmp / tipDescriere și reguli
deleted
boolean
Obligatoriu / prezent

Coduri posibile

200Cerere reușită.
400Parametru sau Idempotency-Key invalid/lipsă.
401Cheie API lipsă sau invalidă.
403Cheie revocată, portal dezactivat sau acțiune rezervată testului.
404Entitatea nu este accesibilă acestui portal/mediu.
405Metodă neacceptată (la /me se întoarce 400).
429Limita de cereri este depășită.
503Serviciu indisponibil temporar.

Trimite un test webhook

POST/api/public/partner/v1/webhook/test

Încearcă imediat webhook.test prin aceeași coadă ordonată. Dacă un eveniment anterior așteaptă reîncercarea, testul rămâne în coadă; queued nu confirmă livrarea.

Parametri

Idempotency-Key
header · string
Obligatoriu
1–200 caractere ASCII vizibile; unic per operație, păstrat 24 ore. Reîncercarea păstrează metoda, URL-ul, Content-Type și corpul brut identice.

Corpul cererii

Câmp / tipDescriere și reguli
curl · POST /webhook/test
curl -X POST "https://www.habitoo.ro/api/public/partner/v1/webhook/test" \
  -H "Authorization: Bearer $HABITOO_API_KEY" \
  -H "Idempotency-Key: DEMO--webhook-test-001" \
  -H "Content-Type: application/json" \
  --data '{}'
Răspuns 200 · JSON
{
  "id": "11111111-1111-4111-8111-111111111111",
  "queued": true
}
Schema completă a răspunsului
Câmp / tipDescriere și reguli
id
string
Obligatoriu / prezent
Format: uuid.
queued
boolean
Obligatoriu / prezent

Coduri posibile

200Cerere reușită.
400Parametru sau Idempotency-Key invalid/lipsă.
401Cheie API lipsă sau invalidă.
403Cheie revocată, portal dezactivat sau acțiune rezervată testului.
404Entitatea nu este accesibilă acestui portal/mediu.
405Metodă neacceptată (la /me se întoarce 400).
409Conflict de idempotență, cerere în procesare sau external_id conflictual.
413Corpul cererii depășește limita.
415Content-Type trebuie să fie application/json.
422JSON sau date invalide.
429Limita de cereri este depășită.
503Serviciu indisponibil temporar.

Jurnal livrări webhook

GET/api/public/partner/v1/webhook/deliveries

Încercări în ordine descrescătoare, separate test/live, păstrate 14 zile.

Parametri

limit
query · integer
Opțional
Dimensiunea paginii.
Implicit: 20.
Interval: 1–100.
cursor
query · string
Opțional
Cursor numeric opac de la pagina anterioară.
curl · GET /webhook/deliveries
curl -X GET "https://www.habitoo.ro/api/public/partner/v1/webhook/deliveries?limit=20" \
  -H "Authorization: Bearer $HABITOO_API_KEY"
Răspuns 200 · JSON
{
  "data": [],
  "next_cursor": null
}
Schema completă a răspunsului
Câmp / tipDescriere și reguli
data
object[]
Obligatoriu / prezent
data[].id
string
Obligatoriu / prezent
Format: uuid.
data[].event
string
Obligatoriu / prezent
Valori: listing.upserted, listing.withdrawn, agency.activated, agency.deactivated, agent.updated, webhook.test.
data[].seq
integer
Obligatoriu / prezent
data[].http_status
integer | null
Obligatoriu / prezent
data[].duration_ms
integer
Obligatoriu / prezent
data[].attempt
integer
Obligatoriu / prezent
data[].occurred_at
string
Obligatoriu / prezent
Format: date-time.
data[].error
string | null
Obligatoriu / prezent
next_cursor
string | null
Obligatoriu / prezent

Coduri posibile

200Cerere reușită.
400Parametru sau Idempotency-Key invalid/lipsă.
401Cheie API lipsă sau invalidă.
403Cheie revocată, portal dezactivat sau acțiune rezervată testului.
404Entitatea nu este accesibilă acestui portal/mediu.
405Metodă neacceptată (la /me se întoarce 400).
429Limita de cereri este depășită.
503Serviciu indisponibil temporar.

Starea publicării

Starea publicării

POST/api/public/partner/v1/listings/{id}/publication

Acceptă anunțuri vizibile acum sau retrase în ultimele 30 zile. O stare mai veche nu suprascrie starea nouă. Test: id este identificatorul înregistrării de feedback, nu listing_id.

Parametri

id
path · string
Obligatoriu
UUID al entității accesibile acestui portal.
Idempotency-Key
header · string
Obligatoriu
1–200 caractere ASCII vizibile; unic per operație, păstrat 24 ore. Reîncercarea păstrează metoda, URL-ul, Content-Type și corpul brut identice.

Corpul cererii

Câmp / tipDescriere și reguli
status
string
Obligatoriu / prezent
Starea entității.
Valori: published, pending_review, rejected, removed.
portal_listing_id
string
Opțional
Valoare portal_listing_id.
Maximum 200 caractere.
url
string
Opțional
URL HTTPS opțional.
Format: uri.
Maximum 2000 caractere.
reasons
object[]
Opțional
Valoare reasons.
reasons[].code
string
Opțional
Valoare code.
Maximum 100 caractere.
reasons[].message
string
Obligatoriu / prezent
Valoare message.
Maximum 2000 caractere.
occurred_at
string
Opțional
Momentul evenimentului ISO 8601.
Format: date-time.
curl · POST /listings/{id}/publication
curl -X POST "https://www.habitoo.ro/api/public/partner/v1/listings/11111111-1111-4111-8111-111111111111/publication" \
  -H "Authorization: Bearer $HABITOO_API_KEY" \
  -H "Idempotency-Key: DEMO--listings-id-publication-001" \
  -H "Content-Type: application/json" \
  --data '{
  "status": "published",
  "portal_listing_id": "DEMO-001",
  "url": "https://example.invalid/anunt/demo-001",
  "occurred_at": "2026-11-07T12:00:00Z"
}'
Răspuns 200 · JSON
{
  "id": "a7b50000-0000-4000-8000-000000000100",
  "applied": true
}
Schema completă a răspunsului
Câmp / tipDescriere și reguli
id
string
Obligatoriu / prezent
Format: uuid.
deduplicated
boolean
Opțional
applied
boolean
Opțional
test
boolean
Opțional

Coduri posibile

200Cerere reușită.
400Parametru sau Idempotency-Key invalid/lipsă.
401Cheie API lipsă sau invalidă.
403Cheie revocată, portal dezactivat sau acțiune rezervată testului.
404Entitatea nu este accesibilă acestui portal/mediu.
405Metodă neacceptată (la /me se întoarce 400).
409Conflict de idempotență, cerere în procesare sau external_id conflictual.
413Corpul cererii depășește limita.
415Content-Type trebuie să fie application/json.
422JSON sau date invalide.
429Limita de cereri este depășită.
503Serviciu indisponibil temporar.

Lead-uri și mesaje

Trimite lead

POST/api/public/partner/v1/leads

Email sau telefon obligatoriu; listing_id sau agency_id obligatoriu. Deduplicare portal + external_id. Testul folosește date separate, fără emailuri, cu marcaj Test.

Parametri

Idempotency-Key
header · string
Obligatoriu
1–200 caractere ASCII vizibile; unic per operație, păstrat 24 ore. Reîncercarea păstrează metoda, URL-ul, Content-Type și corpul brut identice.

Corpul cererii

Câmp / tipDescriere și reguli
external_id
string
Obligatoriu / prezent
Valoare external_id.
Maximum 200 caractere.
listing_id
string
Opțional
Valoare listing_id.
Format: uuid.
agency_id
string
Opțional
Identificatorul agenției accesibile acestui portal.
Format: uuid.
name
string
Obligatoriu / prezent
Valoare name.
Maximum 200 caractere.
email
string
Opțional
Valoare email.
Format: email.
Maximum 254 caractere.
phone
string
Opțional
Valoare phone.
Maximum 50 caractere.
message
string
Opțional
Valoare message.
Maximum 4000 caractere.
created_at
string
Opțional
Valoare created_at.
Format: date-time.
curl · POST /leads
curl -X POST "https://www.habitoo.ro/api/public/partner/v1/leads" \
  -H "Authorization: Bearer $HABITOO_API_KEY" \
  -H "Idempotency-Key: DEMO--leads-001" \
  -H "Content-Type: application/json" \
  --data '{
  "external_id": "DEMO-LEAD-001",
  "agency_id": "a7b50000-0000-4000-8000-000000000001",
  "name": "Client Demo",
  "email": "demo@example.invalid",
  "message": "Mesaj fictiv pentru test."
}'
Răspuns 200 · JSON
{
  "id": "11111111-1111-4111-8111-111111111111",
  "status": "accepted",
  "deduplicated": false
}
Schema completă a răspunsului
Câmp / tipDescriere și reguli
id
string
Obligatoriu / prezent
Format: uuid.
status
string
Obligatoriu / prezent
Valoare fixă: accepted.
deduplicated
boolean
Obligatoriu / prezent
test
boolean
Opțional
label
string
Opțional
Valoare fixă: Test.

Coduri posibile

200Lead deduplicat.
201Cerere reușită.
400Parametru sau Idempotency-Key invalid/lipsă.
401Cheie API lipsă sau invalidă.
403Cheie revocată, portal dezactivat sau acțiune rezervată testului.
404Entitatea nu este accesibilă acestui portal/mediu.
405Metodă neacceptată (la /me se întoarce 400).
409Conflict de idempotență, cerere în procesare sau external_id conflictual.
413Corpul cererii depășește limita.
415Content-Type trebuie să fie application/json.
422JSON sau date invalide.
429Limita de cereri este depășită.
503Serviciu indisponibil temporar.

Mesaj client

POST/api/public/partner/v1/leads/{id}/messages

Acceptă numai lead-uri ale aceluiași portal și mediu.

Parametri

id
path · string
Obligatoriu
UUID al entității accesibile acestui portal.
Idempotency-Key
header · string
Obligatoriu
1–200 caractere ASCII vizibile; unic per operație, păstrat 24 ore. Reîncercarea păstrează metoda, URL-ul, Content-Type și corpul brut identice.

Corpul cererii

Câmp / tipDescriere și reguli
external_id
string
Obligatoriu / prezent
Valoare external_id.
Maximum 200 caractere.
body
string
Obligatoriu / prezent
Valoare body.
Maximum 4000 caractere.
sender
string
Obligatoriu / prezent
Valoare sender.
Valoare fixă: client.
created_at
string
Opțional
Valoare created_at.
Format: date-time.
curl · POST /leads/{id}/messages
curl -X POST "https://www.habitoo.ro/api/public/partner/v1/leads/11111111-1111-4111-8111-111111111111/messages" \
  -H "Authorization: Bearer $HABITOO_API_KEY" \
  -H "Idempotency-Key: DEMO--leads-id-messages-001" \
  -H "Content-Type: application/json" \
  --data '{
  "external_id": "DEMO-MSG-001",
  "sender": "client",
  "body": "Mesaj fictiv."
}'
Răspuns 200 · JSON
{
  "id": "11111111-1111-4111-8111-111111111111",
  "deduplicated": false
}
Schema completă a răspunsului
Câmp / tipDescriere și reguli
id
string
Obligatoriu / prezent
Format: uuid.
deduplicated
boolean
Opțional
applied
boolean
Opțional
test
boolean
Opțional

Coduri posibile

200Cerere reușită.
400Parametru sau Idempotency-Key invalid/lipsă.
401Cheie API lipsă sau invalidă.
403Cheie revocată, portal dezactivat sau acțiune rezervată testului.
404Entitatea nu este accesibilă acestui portal/mediu.
405Metodă neacceptată (la /me se întoarce 400).
409Conflict de idempotență, cerere în procesare sau external_id conflictual.
413Corpul cererii depășește limita.
415Content-Type trebuie să fie application/json.
422JSON sau date invalide.
429Limita de cereri este depășită.
503Serviciu indisponibil temporar.

Statistici

Statistici zilnice

POST/api/public/partner/v1/stats

Maximum 500 rânduri; valorile suprascriu ziua, fără adunare la retrimitere. Anunț accesibil acum sau retras în ultimele 30 zile. Corpul este limitat la 1 MiB.

Parametri

Idempotency-Key
header · string
Obligatoriu
1–200 caractere ASCII vizibile; unic per operație, păstrat 24 ore. Reîncercarea păstrează metoda, URL-ul, Content-Type și corpul brut identice.

Corpul cererii

Câmp / tipDescriere și reguli
items
object[]
Obligatoriu / prezent
Valoare items.
items[].listing_id
string
Obligatoriu / prezent
Valoare listing_id.
Format: uuid.
items[].date
string
Obligatoriu / prezent
Valoare date.
Format: date.
items[].views
integer
Opțional
Valoare views.
Minim: 0.
Maxim: 2147483647.
items[].contacts
integer
Opțional
Valoare contacts.
Minim: 0.
Maxim: 2147483647.
items[].favorites
integer
Opțional
Valoare favorites.
Minim: 0.
Maxim: 2147483647.
curl · POST /stats
curl -X POST "https://www.habitoo.ro/api/public/partner/v1/stats" \
  -H "Authorization: Bearer $HABITOO_API_KEY" \
  -H "Idempotency-Key: DEMO--stats-001" \
  -H "Content-Type: application/json" \
  --data '{
  "items": [
    {
      "listing_id": "a7b50000-0000-4000-8000-000000000100",
      "date": "2026-11-07",
      "views": 12,
      "contacts": 2,
      "favorites": 1
    }
  ]
}'
Răspuns 200 · JSON
{
  "accepted": 1
}
Schema completă a răspunsului
Câmp / tipDescriere și reguli
accepted
integer
Obligatoriu / prezent

Coduri posibile

200Cerere reușită.
400Parametru sau Idempotency-Key invalid/lipsă.
401Cheie API lipsă sau invalidă.
403Cheie revocată, portal dezactivat sau acțiune rezervată testului.
404Entitatea nu este accesibilă acestui portal/mediu.
405Metodă neacceptată (la /me se întoarce 400).
409Conflict de idempotență, cerere în procesare sau external_id conflictual.
413Corpul cererii depășește limita.
415Content-Type trebuie să fie application/json.
422JSON sau date invalide.
429Limita de cereri este depășită.
503Serviciu indisponibil temporar.

Mediul de test

Agenția Demo Habitoo are 2 agenți fictivi și 12 anunțuri variate: apartamente, garsoniere, case, teren și spațiu comercial; vânzare/închiriere, EUR/RON și locații precise/neprecise.

Demo nu intră în feedurile existente, paginile publice sau statisticile reale. Scrierile test sunt separate, nu trimit emailuri unor oameni reali și pot produce numai notificări SuperAdmin în aplicație marcate Test. Lead-urile sunt marcate Test; datele de scriere expiră după 30 zile.

Simularea generează aceleași evenimente în /changes și webhooks din mediul test. Resetarea restaurează datele portalului curent și elimină scrierile de test, fără a afecta alt portal.

Simulează o modificare demo

POST/api/public/partner/v1/sandbox/simulate

Doar test; live primește 403. Generează eveniment în /changes. Corpul este limitat la 1000 caractere.

Parametri

Idempotency-Key
header · string
Obligatoriu
1–200 caractere ASCII vizibile; unic per operație, păstrat 24 ore. Reîncercarea păstrează metoda, URL-ul, Content-Type și corpul brut identice.

Corpul cererii

Câmp / tipDescriere și reguli
action
string
Obligatoriu / prezent
Valori: listing_update, listing_withdraw, listing_create, agent_update.
curl · POST /sandbox/simulate
curl -X POST "https://www.habitoo.ro/api/public/partner/v1/sandbox/simulate" \
  -H "Authorization: Bearer $HABITOO_API_KEY" \
  -H "Idempotency-Key: DEMO--sandbox-simulate-001" \
  -H "Content-Type: application/json" \
  --data '{
  "action": "listing_update"
}'
Răspuns 200 · JSON
{
  "id": "a7b50000-0000-4000-8000-000000000100",
  "type": "listing.upserted",
  "seq": 1,
  "agency_id": "a7b50000-0000-4000-8000-000000000001"
}
Schema completă a răspunsului
Câmp / tipDescriere și reguli
id
string
Obligatoriu / prezent
Format: uuid.
type
string
Obligatoriu / prezent
Valori: listing.upserted, listing.withdrawn, agent.updated.
seq
integer
Obligatoriu / prezent
agency_id
string
Obligatoriu / prezent
Format: uuid.

Coduri posibile

200Cerere reușită.
400Parametru sau Idempotency-Key invalid/lipsă.
401Cheie API lipsă sau invalidă.
403Cheie revocată, portal dezactivat sau acțiune rezervată testului.
404Entitatea nu este accesibilă acestui portal/mediu.
405Metodă neacceptată (la /me se întoarce 400).
409Conflict de idempotență, cerere în procesare sau external_id conflictual.
413Corpul cererii depășește limita.
415Content-Type trebuie să fie application/json.
422JSON sau date invalide.
429Limita de cereri este depășită.
503Serviciu indisponibil temporar.

Resetează datele demo

POST/api/public/partner/v1/sandbox/reset

Restaurează 12 anunțuri și 2 agenți pentru portalul curent. Șterge feedbackul demo, nu datele reale. Corpul este limitat la 1000 caractere.

Parametri

Idempotency-Key
header · string
Obligatoriu
1–200 caractere ASCII vizibile; unic per operație, păstrat 24 ore. Reîncercarea păstrează metoda, URL-ul, Content-Type și corpul brut identice.

Corpul cererii

Câmp / tipDescriere și reguli
curl · POST /sandbox/reset
curl -X POST "https://www.habitoo.ro/api/public/partner/v1/sandbox/reset" \
  -H "Authorization: Bearer $HABITOO_API_KEY" \
  -H "Idempotency-Key: DEMO--sandbox-reset-001" \
  -H "Content-Type: application/json" \
  --data '{}'
Răspuns 200 · JSON
{
  "reset": true,
  "listings": 12,
  "agents": 2,
  "agency_id": "a7b50000-0000-4000-8000-000000000001"
}
Schema completă a răspunsului
Câmp / tipDescriere și reguli
reset
boolean
Obligatoriu / prezent
listings
integer
Obligatoriu / prezent
Valoare fixă: 12.
agents
integer
Obligatoriu / prezent
Valoare fixă: 2.
agency_id
string
Obligatoriu / prezent
Format: uuid.

Coduri posibile

200Cerere reușită.
400Parametru sau Idempotency-Key invalid/lipsă.
401Cheie API lipsă sau invalidă.
403Cheie revocată, portal dezactivat sau acțiune rezervată testului.
404Entitatea nu este accesibilă acestui portal/mediu.
405Metodă neacceptată (la /me se întoarce 400).
409Conflict de idempotență, cerere în procesare sau external_id conflictual.
413Corpul cererii depășește limita.
415Content-Type trebuie să fie application/json.
422JSON sau date invalide.
429Limita de cereri este depășită.
503Serviciu indisponibil temporar.

Bune practici și verificare live

  • Validează /me și mediul test înaintea fiecărui import.
  • Importă toate paginile; nu retrage inventarul după un răspuns incomplet sau eroare.
  • Păstrează filtrele /listings neschimbate când reutilizezi cursorul.
  • Verifică locațiile imprecise: nu reconstrui strada sau numărul ascuns.
  • Aplică evenimentele după seq și persistă cursorul numai după succes.
  • Testează publicare, respingere, lead deduplicat, mesaje, statistici și reset.
  • Respectă limitele și idempotența; nu înregistra chei sau date personale în jurnale.
  • Solicită verificarea și cheia live; nu folosi agenția demo ca inventar real.

Istoric versiuni

1.1.0 · 7 noiembrie 2026

Documentație Partner API: autentificare, citire și sincronizare, feedback și mediu demo. Webhooks semnate, reîncercări și jurnal de livrări disponibile în 1.1.0. Specificația feedului rămâne separată și neschimbată.

Contact

Pentru cheia de test, verificarea integrării, cheia live, rotire sau revocare:

contact@habitoo.ro