Homesage.ai
Find and analyze US properties
- Category
- Data & Analytics
- Primary Subcategory
- Real Estate Investment & Deal Analytics
Integration details
Description
Homesage.ai turns ChatGPT into a real estate analyst with investor-grade data on 155M+ US residential properties. Connect once, then ask in plain language for valuations, comparable sales, rental and flip returns, renovation costs, owner details, and Full Property Reports. No spreadsheets or manual data pulls. Ask about any US residential address and get property investment metrics, an automated valuation (AVM), comparable sales with after-repair value (ARV), and an AI-assessed property condition, including analysis of listing photos or your own images. The Price Flexibility Score, a Homesage.ai signature signal, predicts how negotiable a seller really is. For investors, Homesage.ai projects fix-and-flip returns, renovation costs with room-by-room breakdowns, and both long-term and short-term rental economics such as cash flow, cap rate, NOI, and cash-on-cash return. Screen entire markets with ZIP-level sold data and Market Outlook scores, or search the national property database with investor filters for price, condition, equity, distress signals, and more. Additional tools cover solar potential and AI roof analysis, mortgage and lien records, pre-foreclosure status, location risk flags, and owner skip-tracing for outreach. Most analytics tools consume credits from your Homesage.ai account, and each tool's credit cost is listed in its description. The property database search always previews the result count and cost for free before charging. Homesage.ai reads property data and returns analysis. It does not modify your account, move funds, or take actions on your behalf. Coverage is US residential properties only, and comparable-sale and ARV data is limited in non-disclosure states where sale prices aren't public.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Real Estate Investment & Deal Analytics
- Secondary Subcategories
- None listed
- Brand
- Homesage.ai
- Access
- Account required
- First tracked
- 2026-08-20
- Tool count
- 33
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competing in ChatGPT Real Estate Investment & Deal Analytics
View Category33 tools agents can invoke
## What it returns Up to 5 address suggestions matching a partial address string. Powered by a national address graph and curated to US street-level results only — city names, state codes, and ZIP codes alone return no matches. ## When to use it - Power a typeahead input on a "lookup property" form. - Resolve user-typed input to a canonical address string before calling `info` / `current-estimate`. - Disambiguate between similar-named streets in the same city. ## Pricing **Free — 0 credits.** Safe to fire on every keystroke (debounce in the client recommended for cost-of-network, not credits). ## Errors | Status | Meaning | |---|---| | 400 | `input` parameter missing or shorter than 2 characters. | | 401 | Authentication failed. | | 503 | Upstream address service unavailable. Retry with backoff. | ## FAQ ### Does this work for commercial addresses? No. Only US residential street addresses are returned. The endpoint upstream filters to `area_type == "address"` records only. ### Can I autocomplete by ZIP code? No — ZIP-only input returns an empty `data` array. Provide a street fragment with at least one number or street word.
auto_complete_address
## What it returns An itemized **room-by-room renovation cost breakdown** powered by a multimodal LLM analyzing the property's images plus its size/feature metadata. Returns per-room scope, material/labor split, and total cost — significantly more detailed than the top-level `renovation-cost` aggregate. ## When to use it - Generate detailed scope-of-work documents from photos. - Underwrite specific renovation strategies. - Show investor clients exactly where the money goes. ## Pricing 5 credits. ## Request Send a JSON body. Provide either `property_id` (we'll pull images and metadata for it), `property_address` (we'll resolve it), or the full `property` object plus an `images` array of URLs. ## FAQ ### Can I force a fresh LLM analysis (bypass cache)? Yes — set `force_refresh: true` in the request body. Bypasses the per-property cache. ### What LLM is used? A multimodal model tuned for construction-cost estimation. Outputs are in domain terms (rooms, materials, line-items) and stable across model swaps.
advanced_renovation_cost_breakdown
## What it returns Up to 5 **area suggestions** (city, county, or ZIP) matching a partial place name — each a structured object you pass straight into the `location` filter of `preview_property_search` / `run_property_search`. This is how you turn "Austin" or "Travis County" into the exact object the search needs. Distinct from `auto_complete_address`: that resolves a single street address (for the single-property analysis tools); this resolves a search **area** (a whole city / county / ZIP) for database search. ## When to use it - ALWAYS before a property search, to build the `location` filter. Don't hand-craft area objects — resolve them here so the city name, `state_code`, and county name match the database. - Pick the suggestion whose `type` (`city` / `county` / `postal_code`) matches what the user meant, then JSON-encode it as a one-element array for `location` — e.g. `location=[{the chosen suggestion}]`. ## Pricing **Free — 0 credits.** ## Errors | Status | Meaning | |---|---| | 400 | `input` missing. | | 404 | No areas matched the input. |
area_autocomplete
## What it returns Paginated search across all US residential properties matching geo + price + bed/bath/sqft/year-built/DOM/lot filters. Each result row carries ROI-relevant fields (AVM bands, financing/holding/project-cost breakdowns, potential ROI) — designed to feed investor screening dashboards, not detail pages. ## When to use it - Build investor screening with multi-criteria filters (e.g. "active listings under $300k in zip 65802 with potential_roi > 0.15"). - Generate market reports: average AVM, average days on market, count of matches. - Seed a recommendation engine with filtered candidate pools. ## Performance **This is a slow endpoint — use a 60-second client timeout and cache responses.** ## Pricing **1 credit per property in the response.** A page with 50 properties costs 50 credits. Use `page_size` to cap cost — for screening UI, smaller pages with manual paginate-on-demand is the cost-effective pattern. ## Errors | Status | Meaning | |---|---| | 400 | Invalid filter values (e.g. `min_price > max_price`, non-numeric `beds_max`). | | 401 | Authentication failed. | | 402 | No subscription or insufficient credits for the page size requested. | | 503 / 504 | Backend datastore unavailable or query timed out. | ## FAQ ### What's the difference between `property_status: "Active"` and `"Sold"`? `Active` queries `residential_for_sale`. `Sold` queries `residential_sold` (same backing as the dedicated `sold-by-zip` endpoint). Both share the same response shape. ### Why is `dom` calculated rather than stored? The MLS doesn't always carry days-on-market natively. When the field is absent, the endpoint computes it from `list_date` to `sold_date` (or to "now" for active listings). ### Can I filter by neighborhood? Not directly. Filter by city + state + zip; the response includes a `neighborhood` field for client-side post-filtering. ### Is `avm_confidence` a percentage? A `0.0`–`1.0` float. Higher = the AVM model is more confident in the band. Filter on `avm_confidence > 0.7` for high-quality estimates only.
bulk_property_info
## What it returns A boolean / confidence-scored flag indicating whether the property is likely a **fixer-upper** — i.e. needs material renovation to reach market potential. Built from the AI property-condition signal, photo-based wear indicators, listing-language NLP (detects 'cash offers only', 'as-is', 'investor special'), and pricing relative to comps. ## When to use it - Filter MLS results to fixer-upper candidates for flip investors. - Pre-flag listings for wholesale outreach. ## Pricing 1 credit. ## FAQ ### What does TLC stand for? 'Tender Loving Care' — real estate slang for a property needing meaningful work. Same as fixer-upper. ### Why might a clearly-rough property return `false`? When the listing is priced at market rate (suggesting the seller is asking move-in-ready prices), the signal is weak even if condition is poor.
check_needs_tlc
## What it returns A ranked list of **comparable sold properties** within a search radius of the subject — each comp scored on similarity (size, beds/baths, year built, distance, condition delta) with the sale price and date. Powers AVM and ARV computations. ## When to use it - Build a comps table on a property report page. - Validate AVM against the comparable set it's derived from. - Power custom value models with raw comp inputs. ## Performance **This is a slow endpoint — use a 60-second client timeout and cache responses.** ## Pricing 5 credits. ## FAQ ### How are comps ranked? By a weighted similarity score that favors smaller size/feature deltas and shorter geographic distance. Sold date recency is a strong negative weight on older sales. ### Does it adjust for condition? Yes — if both the subject and comp have AI-condition scores, prices are adjusted up/down for the condition delta. ## Fallback parameters You can pass user-supplied values for the attributes the comp model uses, as **fallbacks**: Homesage.ai data is always used when available; your value is used only when our record is missing that field — so verified data is never overridden. Supported fallbacks: `total_size`, `bedrooms`, `bathrooms`, `property_type`. Only `total_size` can unblock an otherwise-empty result; the others just refine comp matching. `year_built` is intentionally **not** a factor in the comp/ARV model. Every response includes a `field_sources` object telling you where each value came from: `homesage` (our data), `user_provided` (your fallback), or `unavailable`.
get_comps
## What it returns Your account's current API credit balance plus the plan and billing context that puts the number in context — `credits_used`, `credits_remaining`, `total_credits`, `usage_percentage`, current `plan_name` and `subscription_status`, and the `renewal_date` when the allowance resets. Sourced from your subscription record and live credit-usage counters; no third-party data providers involved. ## When to use it - Display the user's remaining credits in your dashboard. - Poll before a batch job to check headroom — calls are free (`0` credits). - Surface `subscription_status` to gate paid features in your UI. - Compare `renewal_date` to "now" to show countdown timers. ## Pricing Free. This endpoint costs **0 credits** per call. Safe to poll on every page load. ## Errors | Status | Meaning | |---|---| | 401 | Missing or invalid API key. | | 403 | API key valid but account is suspended. | ## FAQ ### Why is `credits_remaining` `null`? Your plan is unlimited or a custom plan with no fixed per-period cap. The other balance fields are also `null` in that case. `credits_used` is always populated. ### When does the balance reset? At `renewal_date`. For monthly plans, that's the Stripe billing-period end. For yearly plans, the credit allowance resets monthly even though the subscription itself renews yearly — `renewal_date` is the next monthly reset, not the yearly one. ### What if the user has no subscription at all? `plan_name`, `total_credits`, and most other fields are `null`. `credits_used` is still populated (any credits consumed outside a subscription period are reported). `subscription_status` is an empty string.
get_credit_balance
## What it returns The current Homesage.ai AVM (Automated Valuation Model) estimate for a US residential property — a single point estimate: the current estimated value (`current_value`), returned inside an `Estimates` object. Sourced from Homesage.ai's first-party AVM service. ## When to use it - Set a listing price for a property about to go on the market. - Cross-check against a third-party AVM. - Trigger an alert when AVM moves beyond a threshold. ## Pricing **2 credits per successful call.** `404`/`401`/`402` cost 0 credits. ## FAQ ### Why does the AVM disagree with other estimates? Different models, different training data, different feature weights. Homesage.ai emphasizes recent comparable sales + condition signals; other estimates may emphasize a broader market-trend model. Neither is right or wrong — they answer slightly different questions. ### How fresh is the estimate? Recomputed when the underlying property record refreshes (cache TTL ~24h).
get_current_estimate
## What it returns A fix-and-flip return summary for the property — four numbers: - `total_project_cost` — all-in cost: acquisition + renovation + holding + financing. - `profit` — projected profit at resale, net of selling costs. - `resale_roi` — return on investment, as a percent of total project cost (can be negative). - `max_recommended_renovation_budget` — the renovation-spend ceiling that keeps the deal profitable. Differs from `renovation-return` by folding holding and financing costs into the project total. ## When to use it - Underwrite flip candidates with a standard model. - Sort lead lists by projected flip ROI. ## Pricing 3 credits. ## FAQ ### What financing terms are assumed? Hard-money standard — 70% LTC, 12% interest, 2 points, 6-month hold. Override is on the roadmap. ### Does it deduct agent commissions? Yes — 6% commission + 1.5% closing assumed on the sale side.
get_flip_return
## What it returns The most comprehensive property analysis endpoint — aggregates **11 internal sources** into a single response with **292 data fields**. One call instead of orchestrating a dozen individual endpoints. **Includes:** - Property photos (exclusive to this endpoint) - Property info, valuation, condition - Investment potential, flip / resale analysis - Rental projections, renovation cost - Home value history, school ratings, local data - Comparable properties **Does NOT include:** - Solar analysis — call `/solar/analysis/` separately (4 credits) - Mortgage / lien data - Skip tracing / owner information ## When to use it - Render a deep property-analysis dashboard page. - One-shot underwriting export for an investor. - Train ML models on multi-signal property snapshots. ## Performance **This is the slowest, most expensive endpoint — it runs the full AI pipeline and comp search end-to-end. Use a 120-second client timeout and cache responses.** ## Pricing **15 credits per request** — about **25% cheaper** than calling the individual endpoints separately (~20 credits). ## Data availability Because this aggregates many internal sources, sub-fields may be `null`, `0`, or empty arrays when the underlying data is unavailable for a property — e.g. `comps` may be empty in rural areas, `last_sold_price` is `0` in non-disclosure states, and `photos` can be empty for unlisted properties. ## FAQ ### Why is this so much more than the individual endpoints? It runs the AI condition pipeline and comp search end-to-end. The value vs. calling endpoints individually is one round-trip and guaranteed shape consistency. ### Can I disable sub-sections to save credits? Not currently — the report is all-or-nothing. Call the individual endpoints if you only need specific signals.
get_full_report
## What it returns A time-series of monthly AVM estimates for a property over the last 5 years. Designed to plot value-over-time charts and detect inflection points (renovation, neighborhood revaluation, market cycle). ## When to use it - Render a value-history chart on a property detail page. - Detect properties whose value diverged from their neighborhood trend. ## Pricing 1 credit. ## FAQ ### How far back does the history go? Up to 60 months. New construction has shorter history. Pre-MLS-era properties may have gaps.
get_home_value_history
## What it returns An **Investment Potential** score for a US residential property — a single `investment_potential` value on a 0-100 scale, where higher is better. Designed as a first-pass filter for investor screening. The value is `null` when a score cannot be computed for that property. ## When to use it - Rank a watchlist of properties by overall investment quality. - Power a 'top opportunities in your market' feed. ## Pricing 3 credits. ## FAQ ### Is the score a percentage? No — it's a 0-100 composite index. Higher = better. ### Why is the score `null`? A score could not be computed for that property. Use `current-estimate` and `comps` to assess it directly. ### Does it account for my financing assumptions? No — it's a property-level score, not deal-specific. For deal-level returns, use `flip-return` or `rental-long-term`.
get_investment_potential
## What it returns Projected long-term rental income — monthly rent band, vacancy assumption, gross operating income, net operating income after standard expense ratios, and capitalization rate vs. the AVM. Built from MLS-comparable rentals in the same micro-market. ## When to use it - Underwrite buy-and-hold rental candidates. - Compute cap rates across a watchlist. ## Pricing 5 credits. ## FAQ ### What's included in the expense assumption? Property management (8%), maintenance (5%), vacancy (5%), insurance, property tax. Mortgage cost is NOT included — these are pre-debt-service numbers (NOI).
get_long_term_rental
## What it returns A composite **Market Outlook score** (0-100) classifying a ZIP code as a buyer's market (<40), balanced (40-60), or seller's market (>60). Built from a hybrid weighted model — 40% macro market indicators (market-heat index and forecasts), 40% Homesage.ai absorption-rate analytics, and 20% live market signals when available. Includes 1/3/6-month forecasts, days-on-market velocity, active/sold/pending counts, and a per-signal breakdown. ## When to use it - Render a market-context widget on a property report. - Power a 'best markets to buy' / 'best markets to sell' ranking. - Inform pricing-strategy recommendations. ## Pricing 2 credits. ## FAQ ### What if live market data is unavailable? The live-signal weight rebalances to the macro and Homesage.ai components (50% / 50%). The response's `weights_used` field reflects the actual weights applied. ### Why ZIP-level instead of city or county? ZIP is the smallest unit that all three sources support consistently. For city/county roll-ups, query multiple ZIPs and aggregate.
get_market_outlook
## What it returns Mortgage and lien records for a US property — current and historical mortgages, lien summary, involuntary liens, pre-foreclosure status, and data quality metadata. Sourced from a county-records aggregator and cached for 7 days; cached responses cost 0 credits. ## Performance **Fresh lookups are slow — use a 60-second client timeout and cache responses (we cache for 7 days; cached reads are fast and free).** ## When to use it - Identify distressed properties (high lien-to-value ratio, pre-foreclosure). - Pre-screen wholesale outreach lists for owner-equity position. - Disclose lien position to a buyer or lender. ## Pricing 5 credits per **fresh** request. Cached responses (within 7 days of the prior fetch for the same address) cost 0 credits. ## FAQ ### Is this real-time? No — mortgage recordings post to county records with days-to-weeks lag. The 7-day cache reflects that natural cadence. ### What if the property has no mortgage? Returns an empty mortgages array and the lien summary reflects equity-only status. Still counts as 5 credits (the call ran).
get_mortgage_lien_analysis
## What it returns A **Price Flexibility Score (PFS)** for an active listing — an estimate of how much price-negotiation room it has, derived from days-on-market, price-change history, comparable activity, and seasonal demand. Higher score = more flexible (buyer can negotiate down more). ## When to use it - Suggest a target offer percentage to a buyer. - Sort lead lists by negotiation opportunity. - Trigger an alert when a watched property's PFS climbs. ## Pricing 2 credits. ## FAQ ### Does PFS work on sold properties? PFS scores a live asking price, so it returns a 400 error (`{"error": "Property is sold"}`) only when the property's current listing status is exactly `sold`. A recently-sold property whose status is anything else (`for_sale`, `off_market`, `pending`, ...) still returns a normal score — so a property can show up in `sold-by-zip` results and still be scorable here. ### Is PFS the same as AVM? No. AVM estimates *what the property is worth*. PFS estimates *how movable the asking price is* — orthogonal questions.
get_price_flexibility_score
## What it returns An **AI condition assessment** for a US residential property — overall condition category (Excellent/Good/Fair/Poor), confidence score, per-room breakdown when photos are available, and any flags (water damage, deferred maintenance signals). Built from a computer-vision pipeline on the listing's photo set. ## When to use it - Filter MLS feeds to move-in-ready vs. fixer candidates. - Adjust AVM expectations based on actual condition. - Pre-screen photos to skip a manual review pass. ## Pricing 2 credits. ## FAQ ### What model is used? A multimodal AI vision pipeline; specific models aren't disclosed. Outputs are described in domain terms (`Excellent`, `Good`, …) so the contract is stable across model swaps. ### Does it work on listings without photos? No — returns `null` overall and a low confidence score. To supply your own photos for a more accurate assessment, use `property-condition-custom-photos`.
get_property_condition
## What it returns Full property record for a single US residential property — address, coordinates, listing status and price, AVM-estimated value, size, days on market, building/lot/parking/interior breakdown, listing-office details, recent property history, and nearby school ratings. Sourced from a national listing graph + Homesage.ai's AVM, hydrated on the first call per property and cached. ## When to use it - Render a property-detail page in your UI. - Enrich a CRM lead record with the latest listing status and AVM. - Cross-check a third-party AVM against Homesage.ai's. - Look up listing-office contact info from a property address. ## Pricing **2 credits per successful call.** `null` returns from missing source data still cost 2 credits because the upstream call still ran. `404`/`401`/`402` cost 0 credits. ## Errors | Status | Meaning | |---|---| | 400 | Neither `property_address` nor `property_id` provided, or `property_id` is not valid base64. | | 401 | Authentication failed. | | 402 | No subscription, or out of credits. | | 404 | The autocomplete suggestion didn't match a real listing. Response includes `did_you_mean` suggestions. | ## FAQ ### What's the difference between `info` and `updated-info`? `info` is the fast lookup and may serve recently stored data. `updated-info` always returns the freshest available record (slower). Use `updated-info` when stale data matters — pricing decisions, just-listed alerts, post-sale follow-ups. ### Why is `listing_price` `null`? The property is not currently listed for sale. `estimated_value` (AVM) is still populated when available. ### Can I look up by `property_id` instead of address? Yes — pass `property_id` as a base64-encoded string. Use the `id` field returned by `auto-complete`. ### How fresh are school ratings? Refreshed annually from national school-ratings data.
get_property_info
## What it returns An aggregate estimated renovation cost for a property, plus the sqft basis and the per-sqft cost-of-construction model used. For a room-by-room breakdown with material/labor split, use `renovation-cost-breakdown` instead. ## When to use it - Quick screening of fix-and-flip cost before detailed underwriting. - Feed into `flip-return` for an end-to-end deal-level projection. ## Pricing 5 credits. ## FAQ ### What renovation scope is assumed? A standard mid-grade refresh. Use `renovation-cost-breakdown` for explicit room/scope control.
get_renovation_cost
## What it returns Projected return analysis assuming a standard renovation is performed: pre-renovation AVM, projected post-renovation ARV (After Repair Value), renovation cost estimate (see `renovation-cost` for a breakdown), and net return + ROI percent. ## When to use it - Evaluate buy-and-fix-up opportunities. - Compare renovation vs. cosmetic-only strategies on a single property. ## Pricing 3 credits. ## FAQ ### What renovation scope is assumed? A mid-grade full-interior refresh. For a custom scope, use `renovation-cost` with explicit room-level inputs. ### How is ARV calculated? From renovated comps in the same micro-market, adjusted for size and condition delta. See `comps` for the underlying comparable set.
get_renovation_return
## What it returns Projected short-term rental performance — nightly rate band, expected occupancy, monthly gross income, net of typical expense ratios. Built from STR comparables in the same micro-market. ## When to use it - Evaluate STR opportunities for buy-and-host investors. - Compare LTR vs. STR income on the same property. ## Pricing 5 credits. ## FAQ ### Does it account for local STR regulations? No — markets with STR bans/caps may produce projections that aren't operationally achievable. Verify local rules before underwriting.
get_short_term_rental
## What it returns Two coupled analyses in one call: 1. **Solar Potential** — 20-year cost projection, payback timeline, energy coverage percentage, federal/state incentive estimate. 2. **Roof Condition** — AI roof condition score (0-10), condition category, material identification, damage indicators, and risk assessment, from AI analysis of aerial imagery. ## When to use it - Pre-screen properties for solar installation viability. - Underwrite roof replacement cost for an investor offer. - Add a solar-readiness flag to a property report. ## Performance **This is an expensive, slow endpoint — use a 90-second client timeout and cache responses.** ## Response shape The response shape varies with the optional query parameters: - `detailed=true` — adds the raw `solar_potential.data` blob and includes both `roof_image_url` and `roof_image_base64` in `roof_condition.imagery`. - `agent=false` — sets `roof_condition.analysis` to `null` (skips the AI roof analysis). If the roof image fails to upload to storage, `roof_condition.imagery` contains `roof_image_base64` (raw base64 PNG) instead of `roof_image_url`. Individual entries in `solar_layers` may be missing if a particular data layer was unavailable for the address. ## FAQ ### Why is `agent=true` the default? Without it, the roof condition section is skipped (you get solar potential only). The AI roof analysis is the expensive part but it's what makes the endpoint useful — leave it on unless you specifically need solar-only. ### What if the building isn't covered? Returns a clear error indicating imagery unavailable. Charges 0 credits in that case.
get_solar_analysis
## What it returns Just the **count** of residential properties sold in a ZIP within the last 365 days. Same dedup + recency rules as `sold-by-zip`, but only the integer count — useful when you don't need the property details and want to minimize cost. ## When to use it - Display market velocity in a header widget (no need to render rows). - Drive a chart of monthly sales trend across many ZIPs cheaply. - Pre-check whether a ZIP has enough comp activity before calling `sold-by-zip`. ## Date range By default the endpoint returns the full trailing 365 days. Pass `start_date`, `end_date`, or both (`YYYY-MM-DD`) to narrow that to a specific window — for example one calendar month at a time instead of re-pulling the whole year on every poll: ``` ?zip=95630&start_date=2026-08-01&end_date=2026-08-31 ``` Both bounds are optional and inclusive, and both are independent: pass only `start_date` for an open-ended window, or only `end_date` to cut off recent sales. Passing neither leaves existing behaviour unchanged. Either bound must fall within the last 365 days. An older date returns `400` naming the earliest date we can serve, rather than quietly returning a partial set. ## Pricing 1 credit per call regardless of the count. ## FAQ ### What's the difference between this and `sold-by-zip`? This returns one integer (1 credit). `sold-by-zip` returns the full list (1 credit per 20 properties). Use this for cost-efficient screening; use `sold-by-zip` when you need details.
get_sold_count_by_zip
## What it returns Every residential property sold in a given US ZIP code within the last 365 days, with sale date, sale price, coordinates, and basic property characteristics (bed/bath, square footage, year built, lot size). Sourced from the `residential_sold` collection — a deduplicated rollup of MLS sold records refreshed on demand when the per-ZIP cache is older than 4 hours. ## When to use it - Build a "recent sales in my neighborhood" widget on a property page. - Estimate market velocity for a ZIP code (sales per month, median DOM). - Seed a comps analysis without specifying individual subject properties. - Sanity-check listing prices against actual sale prices. ## Date range By default the endpoint returns the full trailing 365 days. Pass `start_date`, `end_date`, or both (`YYYY-MM-DD`) to narrow that to a specific window — for example one calendar month at a time instead of re-pulling the whole year on every poll: ``` ?zip=95630&start_date=2026-08-01&end_date=2026-08-31 ``` Both bounds are optional and inclusive, and both are independent: pass only `start_date` for an open-ended window, or only `end_date` to cut off recent sales. Passing neither leaves existing behaviour unchanged. Either bound must fall within the last 365 days. An older date returns `400` naming the earliest date we can serve, rather than quietly returning a partial set. ## Pricing **1 credit per 20 properties returned**, rounded up. A request that returns 100 properties costs 5 credits. Use the `limit` parameter to cap the cost — a `limit=20` always costs exactly 1 credit. Charged only on `200`; `402`/`400`/`5xx` cost nothing. ## Errors | Status | Meaning | |---|---| | 400 | Missing `zip` parameter, non-integer `limit`, or a malformed / out-of-window `start_date` or `end_date`. | | 401 | Authentication failed or account missing. | | 402 | No subscription, or insufficient credits for the property count this ZIP would return. The error body includes the credit estimate so you can lower `limit` and retry. | | 503 | Upstream datastore or refresh error. Safe to retry. | ## FAQ ### How fresh is the data? The per-ZIP cache refreshes when stale (older than 4 hours) on demand. A first request to a cold ZIP may take longer while the refresh runs; subsequent requests within the 4-hour window hit cache. ### Why do some properties have `sold_price: null`? The MLS suppresses price on private sales, off-market transfers, and some agent-sale records. The property still appears (it sold), but the price field is `null`. Filter on your side if you need price-bearing records only. ### What counts as "residential"? Single-family, condo, townhouse, and multi-family (2-4 unit) records. Commercial, land-only, and 5+ unit multi-family are excluded at the collection level — they live in different collections not exposed by this endpoint. ### Why is `dom` sometimes `null`? Days-on-market requires listing-history dates that older records may not carry. For records that lack `dom` natively, we compute it best-effort from `list_date` to `sold_date`; when neither path resolves, the field is `null`.
get_sold_properties_by_zip
## What it returns Per-floor square-footage distribution for a US residential property, derived from a multi-stage AI analysis (photo/room detection, architectural-style inference, and multi-method validation). Returns the total square footage and a `square_feet_by_floor` map keyed by floor. ## When to use it - Break out living area by floor for renovation, valuation, or listing copy. - Sanity-check a single total-sqft figure against a per-floor split. **Note:** this is a heavy AI workflow — use a **45-second client timeout**. **Costs 1 credit per call.**
get_sqft_per_floor
Identical response shape to `info` — see that endpoint's docs for fields and FAQ. The difference: `info` is the fast lookup and may serve recently stored data; `updated-info` always returns the freshest available record. Use this when freshness matters more than the ~2-second latency cost — pricing decisions, just-listed alerts, post-sale confirmation. **Costs 1 credit per call** (cheaper than `info` because the cache hit-rate doesn't apply).
get_updated_property_info
Scan a US property address for location-based red flags — flood, crime, environmental hazards, school-district decline, and other neighborhood risks. Consumes the streaming risk pipeline to completion and returns the final aggregated report. Costs 5 credits per fresh request; repeat lookups of the same address within the cache window are free.
location_red_flags
## What it returns A **free preview** of a property-database search: `count` (how many properties match the filters) and `cost` (the credits the full search would charge). **This call never charges credits.** This is the mandatory safety step before `run_property_search`. The charged search costs **1 credit per matching property**, so a broad filter set can cost thousands of credits. Always preview here, tell the user the count and cost, and get an explicit yes before running the paid search. ## When to use it - ALWAYS before `run_property_search`, to size and price the result set. - To tighten filters (narrow the location, add a price band / condition / ROI floor) until the count and cost fit the user's budget. - To confirm a search returns anything before spending. ## Required filters Every search needs a `location` (a city, county, or ZIP — NEVER a whole state: state-wide queries time out, this free preview included), a `property_status`, AND at least one investment filter (price range, property type, condition, investment-potential grade, ROI range, …). The investment-filter rule keeps results pertinent and cost-effective. It can be waived with `allow_location_only=true`, but a location-only search in a dense metro can match thousands of properties — check the cost first. ## Pricing **Free — 0 credits.** Only `run_property_search` charges. ## Errors | Status | Meaning | |---|---| | 400 | Required filters missing — the `missing` array names them (`location`, `property_status`, and/or `investment_lens`). | | 401 | Authentication failed. | | 402 | No active subscription. |
preview_property_search
## What it returns An overall property-condition rating and confidence score, combining a database lookup with AI vision analysis of property photos you supply. Providing images yields a more accurate assessment than the address-only `property-condition` endpoint. ## Performance **Image analysis is slow — use a 60-second client timeout and cache responses.** ## Input modes - **Address only** — database lookup (same as `property-condition`). - **Image URLs** — pass `image_urls`, comma-separated (up to 25). - **File upload** — `POST multipart/form-data` with an `images` field (up to 15 files). - **Combined** — address + images for the most accurate result. **Costs 3 credits per call.**
property_condition_custom_photos
## What it returns The full set of properties matching your investment filters — each with valuation, investment metrics, condition, and location detail. This is the **charged** database search. ## ⚠️ Cost — read before calling **1 credit per property returned.** A search that matches 1,200 properties costs **1,200 credits**. Charging is all-or-nothing: if the balance can't cover the whole set, nothing is charged and the call returns `402`. **Always call `preview_property_search` first**, show the user the count and cost, and get an explicit yes before calling this. Never run a broad or location-only search without confirming the cost. ## When to use it - After `preview_property_search` and explicit user confirmation of the credit cost. - To pull a curated, filtered list of investment properties for an area. ## Required filters Same as `preview_property_search`: a `location` (city/county/ZIP — NEVER a whole state: state-wide queries time out before returning), a `property_status`, and at least one investment filter (or `allow_location_only=true` to waive only the investment filter). Send the SAME filters you previewed so the cost matches. ## Pricing **1 credit per matching property**, charged all-or-nothing on success. `400`/`401`/`402` cost 0 credits.
run_property_search
## What it returns A list of **people associated** with a property address — historical residents, current and former owners, related family members. Each person carries a `person_id` you can pass to `skip-tracing/person-details` for a full dossier. ## When to use it - Build outreach lists beyond just the legal owner (e.g. family members of a deceased owner). - Discover hidden parties to a property (trust beneficiaries, relatives). ## Pricing 1 credit per call. ## FAQ ### What's the difference vs. `property-owner`? This returns the broader set (everyone linked to the address), at the cost of less identity detail per person. Use `property-owner` for the legal owner; `associated-people` for the wider net; `person-details` for the deep dive on a specific person.
skip_trace_associated_people
## What it returns Full skip-trace dossier for a single person — current and previous addresses, phone numbers (with type and connectivity status), email addresses (with verification status), relatives, and associates. The `person_id` input must come from a prior call to `skip-tracing/associated-people` — this endpoint does not accept free-form name lookup. ## When to use it - You have a `person_id` from `associated-people` and want full contact details before reaching out. - You're enriching a CRM record with verified phones/emails for a known person. - You need historical address data to verify identity or reconstruct timelines. ## Pricing **1 credit per call.** A first call for a given `person_id` hits the upstream provider; subsequent calls within the per-user history cache are free. Identical calls from other accounts hit a shared global cache but still cost 1 credit (the data has value; the speed is the gift). ## Errors | Status | Meaning | |---|---| | 400 | Missing `person_id` field, or `person_id` not recognized by the provider. | | 401 | Authentication failed. | | 402 | Insufficient credits. | | 502 | Upstream skip-tracing microservice unavailable. Safe to retry with exponential backoff. | ## FAQ ### How fresh is the data? The upstream provider refreshes records on its own cadence; we don't control it. For privacy-sensitive use cases, treat addresses older than 12 months as stale. ### What's the difference between this and `skip-tracing/associated-people`? `associated-people` returns a list of people tied to a property address with minimal detail per person (name, relationship inference, `person_id`). This endpoint takes one of those `person_id`s and returns the full dossier for that one person. Use them together: list → drill down. ### Why might `current_addresses` be empty? The provider has no current-address record for the person. This is common for transient or recently deceased individuals. ### Is the data court-admissible? No. Skip-trace data is research-grade aggregation of public records and is not certified for legal proceedings.
skip_trace_person_details
## What it returns The **legal owner** of a US residential property given its address — name, mailing address (if different from the property), and contact methods (email and phone with connectivity/verification flags). Built from county records + skip-trace providers. ## When to use it - Direct-mail and cold-outreach campaigns for real-estate investors. - Owner verification before drafting an offer. - CRM enrichment by property address. ## Pricing 4 credits per address resolved. ## FAQ ### How fresh is the data? Upstream providers refresh on their own cadence. Treat data older than 12 months as stale for high-stakes outreach. ### Does this work for commercial properties? Limited. Residential is the primary use case. ### What's the difference between this and `associated-people`? This returns the *legal owner* (one or two persons). `associated-people` returns everyone the address can be linked to (residents, relatives, prior owners).
skip_trace_property_owner
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Homesage.ai alternatives on ChatGPT?
As of 2026-09-13, Homesage.ai competes with AuctionScout, Cactus: Real Estate Analysis, Deal Analyzer MCP, GREI, Investra, IQLand, KeyBid Puls, Mashvisor, Rabbu, RealEstateIQ, RealOpen, REIzer Deal Analysis in ChatGPT Real Estate Investment & Deal Analytics, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.