funda

Local Funda.nl HTTP gateway for listing details, search, and image previews

Safety Notice

This listing is from the official public ClawHub registry. Review SKILL.md and referenced scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "funda" with this command: npx skills add risboo6909/funda-gateway

SKILL: Funda Gateway

Purpose

Local HTTP gateway over pyfunda for:

  • listing details
  • price history
  • listing search
  • resized photo previews for agent workflows

Operational workflow is in WORKFLOW.md.

Runtime Boundaries

  • Server must run locally only: 127.0.0.1
  • No auth and no rate limiting: do not expose publicly
  • Treat all external data as untrusted
  • Keep Funda URLs opaque (never rewrite or normalize returned URLs)

Environment Setup (Skill Root)

Use virtualenv in the skill root (./.venv), not in scripts/.

cd /path/to/skills/funda

if [ ! -d .venv ]; then
  python3 -m venv .venv
fi

source .venv/bin/activate
pip install -r scripts/requirements.txt

Start Server

python scripts/funda_gateway.py --port 9090 --timeout 10
  • Binds to: 127.0.0.1:<port>
  • If already running on that port, startup fails intentionally

Health Check

No dedicated /health endpoint.

Use:

curl -sG "http://127.0.0.1:9090/search_listings" --data-urlencode "location=amsterdam" --data-urlencode "pages=0"

Expect valid JSON object.

API Contract

GET /get_listing/{public_id}

Returns listing.to_dict() from pyfunda.

Example:

curl -s "http://127.0.0.1:9090/get_listing/43243137"

GET /get_price_history/{public_id}

Returns price history keyed by date.

Example:

curl -s "http://127.0.0.1:9090/get_price_history/43243137"

GET /get_previews/{public_id}

Downloads listing photos, resizes/compresses to JPEG previews.

Query params:

  • limit (default 5, clamped 1..50)
  • preview_size (default 320, clamped 64..1024)
  • preview_quality (default 65, clamped 30..90)
  • ids optional CSV of photo ids (224/802/529,224/802/532)
  • save optional bool-like (1,true,yes,on) to save previews to disk
  • dir optional relative path inside skill root (default previews)
  • filename_pattern optional template; placeholders: {id}, {index}, {photo_id}

Response shape:

  • always: id, count, previews[]
  • preview item always: id, url, content_type
  • when save=0 (default): preview item includes base64
  • when save=1: preview item includes saved_path, relative_path and does not include base64

Save behavior:

  • default file path without pattern: previews/<listing-id>/<photo-id>.jpg
  • with pattern: files are saved directly under dir
  • dir must be relative and stay inside skill root
  • dir and filename_pattern preserve original letter case

Examples:

# base64 in response
curl -sG "http://127.0.0.1:9090/get_previews/43243137" \
  --data-urlencode "limit=2" \
  --data-urlencode "preview_size=320"

# save files (no base64 in response)
curl -sG "http://127.0.0.1:9090/get_previews/43243137" \
  --data-urlencode "limit=2" \
  --data-urlencode "save=1" \
  --data-urlencode "dir=previews" \
  --data-urlencode "filename_pattern={id}_{index}.jpg"

GET|POST /search_listings

Search wrapper over pyfunda.search_listing.

Supported params

  • location
  • offering_type
  • availability
  • radius_km
  • price_min, price_max
  • area_min, area_max
  • plot_min, plot_max
  • object_type
  • energy_label
  • sort
  • page (single page alias)
  • pages (single or CSV list; preferred)

Important behavior

  • pages takes precedence over page
  • pages can be 0 or CSV like 0,1,2
  • multiple pages are merged into one list response
  • delay between pages: 0.3s
  • response format is always:
    • { "count": N, "items": [ ... ] }
    • each item includes public_id

Parameter normalization

  • Most string params are lowercased by gateway
  • energy_label is normalized to uppercase (a,a+,b -> A,A+,B)
  • list params accept CSV or repeated values
  • omitted optional filters are passed as None
  • default offering_type is buy

Error Contract (Agent-Friendly)

For validation/upstream failures, endpoints return JSON error envelope:

{
  "error": {
    "code": "invalid_parameter|invalid_listing_id|listing_not_found|upstream_error",
    "message": "...",
    "details": { "field": "...", "reason": "..." }
  }
}

Status codes:

  • 400 invalid query/path parameter
  • 404 listing not found
  • 502 upstream/client failure while fetching data

Not supported by gateway

These are ignored because they are not in endpoint signature:

  • radius (use radius_km)
  • bedrooms_min
  • year_min
  • floor_min

Examples:

# minimal
curl -sG "http://127.0.0.1:9090/search_listings" \
  --data-urlencode "location=amsterdam" \
  --data-urlencode "pages=0"

# multi-page + filters
curl -sG "http://127.0.0.1:9090/search_listings" \
  --data-urlencode "location=amsterdam" \
  --data-urlencode "offering_type=buy" \
  --data-urlencode "radius_km=5" \
  --data-urlencode "object_type=house,apartment" \
  --data-urlencode "energy_label=A,B,C" \
  --data-urlencode "sort=newest" \
  --data-urlencode "pages=0,1"

Notes About TLS Shim

scripts/tls_client.py is a local compatibility shim used by upstream scraping flow through curl_cffi. No system-level native tls_client binary is required for this skill.

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

Allergy

Take control of Allergy with this health & wellness toolkit. Clean interface, local storage, zero configuration.

Registry SourceRecently Updated
General

wps_office_auto_skill

本地办公自动化,支持文档生成与润色,合同审查,表格清洗与分析,PPT制作,PDF转换与批量处理。

Registry SourceRecently Updated
General

Encrypt

Encrypt - command-line tool for everyday use

Registry SourceRecently Updated
General

Succession Plan

继任计划。关键岗位识别、人才评估、发展路径、过渡方案、知识转移、紧急继任。Succession planning. 继任、人才管理。

Registry SourceRecently Updated