Guide d’intégration de la Housing Market API

Les tableaux de référence, les descriptions des points de terminaison, les codes d’erreur et les exemples sont générés à partir de la spécification de l’API et restent en anglais dans toutes les langues. Les noms, paramètres et codes sont identiques partout.

Exemples de requêtes et de réponses

Les exemples lisent la clé dans la variable d’environnement HMA_API_KEY. Les valeurs des réponses sont fournies à titre d’illustration.

Vérifier votre clé et votre adresse

GET /v1/ping

curl
curl -H "x-api-key: $HMA_API_KEY" \
  "https://api.housingmarketapi.com/v1/ping"
Response ok
{
  "ok": true,
  "revision": "3f9c2a1",
  "key": "acme-live",
  "address": "203.0.113.7"
}

Lister des biens

GET /v1/properties

curl
curl -H "x-api-key: $HMA_API_KEY" \
  "https://api.housingmarketapi.com/v1/properties?country=TH&listing_type=sale&property_type=condominium&limit=100"
Node.js
const base = 'https://api.housingmarketapi.com';
const headers = { 'x-api-key': process.env.HMA_API_KEY };

let cursor;
do {
  const url = new URL('/v1/properties', base);
  url.searchParams.set('country', 'TH');
  url.searchParams.set('listing_type', 'sale');
  if (cursor) url.searchParams.set('cursor', cursor);

  const res = await fetch(url, { headers });
  if (!res.ok) throw new Error(`${res.status} ${(await res.json()).error}`);
  const page = await res.json();

  for (const property of page.data) console.log(property.id, property.price);
  cursor = page.next_cursor ?? undefined;
} while (cursor);
Python
import os
import requests

base = "https://api.housingmarketapi.com"
headers = {"x-api-key": os.environ["HMA_API_KEY"]}
params = {"country": "TH", "listing_type": "sale"}

while True:
    res = requests.get(f"{base}/v1/properties", headers=headers, params=params)
    res.raise_for_status()
    page = res.json()
    for prop in page["data"]:
        print(prop["id"], prop["price"])
    if not page["next_cursor"]:
        break
    params["cursor"] = page["next_cursor"]
Response firstPage
{
  "data": [
    {
      "id": "kQ3vXr0bT1uYvW2aP8sLgA",
      "country": "TH",
      "listing_type": "sale",
      "property_type": "condominium",
      "province": "Example Province",
      "province_id": 1,
      "city": "Example City",
      "city_id": 11,
      "area": "Example District",
      "area_id": 111,
      "address": "Example Road",
      "post_code": null,
      "latitude": 13.75,
      "longitude": 100.5,
      "location_precision": "approximate",
      "price": 4500000,
      "price_max": null,
      "currency": "THB",
      "bedrooms": 2,
      "bathrooms": 2,
      "rooms": null,
      "living_area": 65,
      "living_area_sqm": 65,
      "lot_area": null,
      "lot_area_sqm": null,
      "build_year": 2019,
      "published_date": "2026-09-01T00:00:00Z",
      "last_updated": "2026-10-02T08:30:00Z",
      "features": [],
      "appliances": [],
      "neighbourhood": [],
      "tags": [],
      "developer": "Example Developer Co., Ltd.",
      "summary": "Bright two-bedroom condominium close to the station.",
      "description": "Bright two-bedroom condominium close to the station. Quiet building with a pool and gym.",
      "location_text": null,
      "images": []
    }
  ],
  "next_cursor": "EXAMPLE-OPAQUE-CURSOR",
  "has_more": true
}

Lire un point de terminaison Insights

GET /v1/insights/prices

Response monthly
{
  "data": [
    {
      "period_start": "2026-09-01",
      "period_end": "2026-09-30",
      "geography": {
        "level": "city",
        "id": 11,
        "name": "Example City"
      },
      "suppressed": false,
      "currency": "THB",
      "median_price": 4200000,
      "median_price_per_sqm": 68000,
      "listing_count": 310
    }
  ],
  "meta": {
    "country": "TH",
    "level": "city",
    "granularity": "month",
    "suppression_min_cell": 10
  },
  "next_cursor": null,
  "has_more": false
}

Une erreur

HTTP 403
{
  "error": "upgrade_required",
  "message": "Insights are included in the Advanced tier."
}