agentsclimarketplace

Redfin fpx

Skill chrischall/redfin-mcp/skills/redfin-fpx

Query redfin.com (US real-estate portal) from a shell with the fpx CLI (@fetchproxy/cli) instead of running the redfin-mcp server — resolve locations/addresses, search for-sale listings, read property detail (price, beds/baths, price history, tax history), market trends, comparable rentals, climate risk, photos, and (signed-in) saved homes and saved searches, via one-shot calls through a signed-in browser tab. Use when you want Redfin data without the MCP, in a script, or on a machine where the MCP isn't installed.From its SKILL.md

Install
npx -y skills add chrischall/redfin-mcp --skill redfin-fpx

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 3 stars3 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

4.9 KB, as published. Nobody here has run it

Redfin via fpx (no MCP)

Redfin fronts www.redfin.com — including every /stingray/... JSON endpoint — with an AWS WAF challenge that blocks plain curl/Node requests regardless of headers. fpx routes the request through the user's own signed-in browser tab (the Transporter extension), which has already cleared the challenge, so the same request succeeds. Most reads are anonymous (no Redfin login needed — just an open tab); the saved-homes and saved-searches endpoints additionally require the tab to be signed in to redfin.com.

This is the same data the redfin_* MCP tools return, reached with one CLI call instead of a running server. Every call rides through the bridge (no bootstrap-then-direct-fetch shortcut) — Redfin validates each request at the session level.

One-time setup

npm install -g @fetchproxy/cli              # provides `fpx`
fpx profile add redfin --domain redfin.com  # only the fetch capability is needed
fpx pair -p redfin                          # prints a pair code → approve in Transporter

Requirements: the Transporter browser extension installed, with an open www.redfin.com tab, and its Chrome Site access allowing redfin.com. Pairing persists — after the first approval every later fpx call reuses it.

Core call

Almost every endpoint is a GET to a /stingray/... path. Redfin prefixes every stingray JSON body with a literal anti-CSRF {}&&, so strip that before piping to jq:

fpx get 'https://www.redfin.com/stingray/api/gis?...' -p redfin \
  | sed -E 's/^\{\}&&//' \
  | jq '.payload.homes'

Every stripped body is an envelope { version, errorMessage, resultCode, payload } — check resultCode == 0 before trusting payload (a nonzero code means Redfin rejected the request; errorMessage explains why).

Ready-to-run request paths (autocomplete, search, property detail, price history, market trends, comparable rentals, climate risk, saved homes) are in references/stingray-endpoints.md. Exhaustive field lists live in the repo at src/tools/*.ts — the endpoints here are compact, live-verified subsets.

The one rule: resolve the location/address first

Redfin search takes numeric region_id + region_type, never place names, and property detail wants a propertyId + listingId pair. Always autocomplete first:

fpx get 'https://www.redfin.com/stingray/do/location-autocomplete?location=Seattle&start=0&count=1&v=2&iss=false&ooa=true&mrs=false' \
  -p redfin | sed -E 's/^\{\}&&//' \
  | jq -r '.payload.sections[] | select(.name=="Places") | .rows[0] | "\(.id)\t\(.name)"'
# 2_16163  Seattle

id is formatted "<region_type>_<region_id>". An Addresses section (instead of/alongside Places) means autocomplete resolved a specific home rather than a region — its url embeds the home's canonical /home/<id> path (use that with the property-detail calls instead of a region search).

Two-step property detail

A homedetails URL only gets you propertyId/listingId via one extra round trip:

  1. GET /stingray/api/home/details/initialInfo?path=<url-path> → {propertyId, listingId, ...}
  2. GET /stingray/api/home/details/aboveTheFold?propertyId=…&listingId=…&accessLevel=1 → the actual detail

If you already have property_id + listing_id (e.g. from a search result), skip step 1 and go straight to aboveTheFold (and belowTheFold for price/tax history).

Exit codes (fetch verbs)

  • 0 — success (still check the stripped envelope's resultCode).
  • 2 — bridge unavailable: extension not connected or pairing pending → run fpx pair -p redfin, confirm a redfin.com tab is open.
  • 3 — bot wall: the tab hasn't cleared the AWS WAF challenge → open/refresh a www.redfin.com tab and retry.
  • 4 — upstream non-2xx from Redfin.

Notes

  • Anonymous reads only work for search/property/market/history/rentals; redfin_get_saved_homes / redfin_get_saved_searches need the bridged tab signed in to redfin.com.
  • Climate-risk data is not a JSON endpoint — it's regex-extracted from the server-rendered homedetails HTML (fpx get the page, then grep/extract; see references/stingray-endpoints.md §7 for the field names to look for). There's no clean stingray path for it.
  • fpx health -p redfin shows bridge connection state when a call fails.
  • This project is developed and maintained by AI (Claude).

Keep looking

Skills are one crate of 627,801. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.