chathome.lu — Luxembourg Real Estate
Server Details
Luxembourg real estate for AI agents: property search, price estimates, market data, commutes.
- Status
- Healthy
- Uptime
- 95.5% over 55 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 15 tools
Most tools have clearly distinct purposes, but get_listing and get_listing_truth overlap substantially as two views of the same listing page, and search_vibe overlaps with search_for_sale/search_rentals for users who want natural-language search. Descriptions mitigate the confusion, so only minimal ambiguity remains.
All tool names use snake_case with predictable verb_noun or verb_preposition_noun structures, such as get_listing, search_for_sale, compare_listings, and submit_inquiry. There is no mixing of conventions.
Fifteen tools is at the upper end of the ideal range but appropriate for a rich real-estate domain covering search, listing detail, comparison, valuation, affordability, commute, agencies, lease analysis, and inquiries. Each tool appears to serve a distinct workflow rather than duplicating functionality.
The surface covers the core lifecycle from property search and comparison through valuation, market context, agency lookup, inquiry submission, and inquiry status polling. Minor gaps remain, such as saved searches/favorites or viewing scheduling, but agents can work around them.
Available Tools
15 toolsanalyze_leaseAnalyze LeaseAInspect
Analyze a caller-provided Luxembourg residential lease PDF or raw text, persist the full user-scoped analysis, and return a compact risk summary. Do not provide payment-card data, government identifiers, health data, passwords, API keys, or authentication codes.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Raw lease text when a PDF is not available. Do not pass URLs, payment-card data, government identifiers, health data, passwords, API keys, or authentication codes. | |
| fileName | No | ||
| language | No | fr | |
| pdfBase64 | No | Base64-encoded PDF bytes. Do not pass URLs, payment-card data, government identifiers, health data, passwords, API keys, or authentication codes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| trust | Yes | |
| clauses | Yes | |
| isLease | Yes | |
| persisted | Yes | |
| severityCounts | Yes | |
| overallRiskScore | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-read-only behavior. The description adds that it persists the full user-scoped analysis and returns a summary, which gives useful behavioral context beyond the annotations. It also includes a safety warning about not sending sensitive data, which is relevant for a tool that processes user-provided content. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two sentences, front-loaded with the core purpose and then a warning. It is succinct, with no redundant information, and each sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has moderate complexity (4 params, non-read-only, output schema). The description covers the main function, side effect (persist), and output. It mentions the Luxembourg context. It does not explain what constitutes a risk summary or edge cases, but given the output schema exists, this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides descriptions for text and pdfBase64 (including sensitive data warnings). The description mentions 'lease PDF or raw text' linking to these params but does not clarify filename or language semantics. With 50% schema coverage, the description adds marginal value but does not fully compensate for undocumented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: analyzing a Luxembourg residential lease from a PDF or raw text, persisting the analysis, and returning a compact risk summary. It distinguishes itself from sibling tools (which are mostly read/search operations) by being the only lease-analysis tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use: when a caller provides a lease document to analyze. It does not explicitly mention alternatives or when not to use, but the context is clear from the purpose. It would benefit from explicit 'use when...' guidance, but the intent is understandable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_listingsCompare ListingsARead-onlyIdempotentInspect
Compare two to eight listings through one normalized AgentListing v2 response, including known and estimated costs, availability, property facts, official flood/noise checks, station frequency, commute summaries, value context, provenance, freshness, duplicates, constraints, and explicit unknown fields.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Two to eight listing IDs returned by a ChatHome search tool | |
| locale | No | Response locale: en, fr, de, lu (Luxembourgish), pt (default: en; 'lb' is a deprecated alias for 'lu') |
Output Schema
| Name | Required | Description |
|---|---|---|
| trust | Yes | |
| listings | Yes | |
| notFoundIds | Yes | |
| schemaVersion | Yes | |
| comparisonFields | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive safety properties. The description adds substantial response-content context—costs, availability, flood/noise checks, provenance, freshness, duplicates, explicit unknowns—which helps the agent understand what comes back and how normalized the comparison is.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single front-loaded sentence that begins with the core action and scope before listing response contents. The enumeration is dense but each item appears intended to signal comparison coverage rather than being outright filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition is complete enough to call correctly: inputs are fully specified by the schema, safety annotations are present, and an output schema exists. The remaining gap is usage/routing guidance, but the purpose and response scope are otherwise well covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents both parameters, including the 2–8 ID bound and locale enum. The description reinforces the 2–8 listing range but adds no parameter meaning beyond that baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Compare two to eight listings through one normalized AgentListing v2 response.' The multi-listing scope and explicit bounds distinguish it from single-listing siblings like get_listing and search tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for comparing listings but gives no explicit when-to-use guidance, prerequisites, or alternatives. It does not say to prefer this over calling get_listing repeatedly or otherwise route the agent among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_affordabilityGet AffordabilityARead-onlyIdempotentInspect
Calculate Luxembourg mortgage affordability and state whether the property-price ceiling includes every acquisition cost or only currently known costs.
| Name | Required | Description | Default |
|---|---|---|---|
| marketRate | No | ||
| monthlyDebts | No | Existing monthly debt payments | |
| residenceUse | No | Residence use; omitted or unknown preserves an unconfirmed Bëllegen position | |
| householdType | Yes | ||
| loanTermYears | No | ||
| residencyType | Yes | ||
| employmentType | Yes | ||
| annualNetIncome | Yes | User-confirmed annual household net income | |
| isFirstTimeBuyer | No | Deprecated optional compatibility signal; never proves Bëllegen entitlement | |
| savingsAvailable | Yes | Available savings/down payment | |
| isPersonalResidence | No | Deprecated residence-use compatibility flag; prefer residenceUse | |
| maxDebtToIncomeRatio | Yes | Explicit housing-payment share of net income, e.g. 0.35 | |
| energyClassDiscountPct | No | ||
| bellegenAktEligibleBuyers | No | Explicitly confirmed eligible acquirer count | |
| bellegenAktCreditAvailable | No | Aggregate unused Bëllegen Akt balance explicitly confirmed for the acquirers | |
| floodZoneRateAdjustmentPct | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| trust | Yes | |
| freshness | Yes | |
| confidence | Yes | |
| maxPropertyPrice | Yes | |
| maxPropertyPriceCostBasis | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive. The description adds useful behavioral context by stating that the tool reports whether the property-price ceiling includes all acquisition costs or only currently known costs — a non-obvious caveat about how to interpret the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the action, and no filler. The additional clause about acquisition-cost coverage is meaningful and earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-param tool with an output schema and safety annotations, the description captures the core purpose and the most important interpretative caveat. It does not explain every parameter or selection context, but those gaps are partly filled by the input schema and sibling names.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 56%, yet the description adds no parameter-level meaning. It does not explain key inputs such as annualNetIncome, maxDebtToIncomeRatio, savingsAvailable, or the residency/employment enums. The schema does partial work, but the description fails to compensate for the under-documented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Calculate') with a specific resource ('Luxembourg mortgage affordability') and adds a distinctive output nuance about acquisition-cost coverage. This separates it clearly from siblings like get_price_estimate or get_market_context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: anytime mortgage affordability in Luxembourg needs to be calculated. It does not explicitly name alternatives or exclusions, but the purpose is self-evidentifying against the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_commute_timesGet Commute TimesARead-onlyIdempotentInspect
Commute time estimates from a Luxembourg commune to a major employment hub (Luxembourg City, Kirchberg EU Quarter, or Belval) across four transport modes.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | Transport mode | |
| commune | Yes | Luxembourg commune name or slug to get commute times from, e.g. 'esch-sur-alzette', 'differdange' | |
| destination | Yes | Commute destination: lux-city (Luxembourg City centre), kirchberg (EU Quarter), or belval (Esch/Belval) |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| stale | Yes | |
| trust | Yes | |
| source | Yes | |
| commune | Yes | |
| minutes | Yes | |
| distanceKm | Yes | |
| destination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds scoping context but does not describe behavioral details such as data recency, availability limitations, or response characteristics; with annotations present, this is adequate but not exceptional.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with no filler. The key distinction (commute estimates from commune to employment hub) is front-loaded, and the extra destination/mode detail is compact and relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a low-complexity, read-only tool with a full input schema and an output schema present. The description, combined with annotations and structured schemas, gives an agent everything needed to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both enum parameters are documented in the schema. The description summarizes the modes and destinations but does not add meaning beyond the schema, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact resource ('commute time estimates'), the origin scope ('Luxembourg commune'), the destination types, and the four modes. It is specific enough that an agent can distinguish it from the real-estate sibling tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the intended context clear: use when commute estimates from a Luxembourg commune to a major hub are needed. None of the sibling tools cover commuting, so explicit alternatives or exclusions are not required, though no when-to-use language is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_inquiry_statusGet Inquiry StatusARead-onlyIdempotentInspect
Poll an MCP agent inquiry conversation for agent replies. Returns the current status and full message thread.
| Name | Required | Description | Default |
|---|---|---|---|
| conversationId | Yes | The conversation ID returned by submit_inquiry when kind is conversation_created |
Output Schema
| Name | Required | Description |
|---|---|---|
| trust | Yes | |
| status | Yes | |
| messages | Yes | |
| conversationId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds that the tool returns the current status and the full message thread, and 'poll' implies non-blocking repeated calls. This aligns with the idempotent/read-only behavior without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with zero filler. The first sentence front-loads the action and resource; the second states the return value. Every word contributes meaning, and there is no redundancy with schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter, read-only polling tool, the description covers the core purpose, return value, and workflow. An output schema exists to define the exact return shape. It could explicitly mention polling until a terminal state, but this is not essential given the simplicity and the annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already clearly explains conversationId as 'The conversation ID returned by submit_inquiry when kind is conversation_created'. The tool description adds no additional parameter-specific information, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'poll' and identifies the resource as 'MCP agent inquiry conversation' with the purpose 'for agent replies'. This distinguishes it clearly from siblings like submit_inquiry (which creates the conversation) and other search/list tools. It also states the return content: current status and full message thread.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a polling workflow after an inquiry has been submitted, as it says 'poll... for agent replies'. The parameter description also references submit_inquiry, linking the tool to its creation counterpart. It does not explicitly name alternatives or exclusions, but the intended usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_listingGet Listing DetailsRead-onlyIdempotentInspect
Get the full fail-closed listing page: its public record, price history, area trend, family amenities, neighbourhood facts, property passport, parcel dossier, normalized costs, official checks, transport, provenance, unknown fields, a summary line built from its facts, proven features and measured area facts with their sources, URL, and photos.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Listing ID | |
| locale | No | Response locale: en, fr, de, lu (Luxembourgish), pt (default: en; 'lb' is a deprecated alias for 'lu') | |
| includePhotos | No | Attach thumbnail photos of the listing as image content blocks (default: true). Set false for a lean text-only response. |
Output Schema
| Name | Required | Description |
|---|---|---|
| trust | Yes | |
| listing | Yes | |
| pageText | Yes | |
| listingPage | Yes | |
| listingPageContext | Yes |
get_listing_truthGet Listing TruthRead-onlyIdempotentInspect
Trust-layer view of the full fail-closed listing page, including its public record and page context, normalized costs, official checks, sources, freshness, explicit unknowns, and privacy-safe correction totals. No reporter identities are exposed.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Listing ID | |
| locale | No | Response locale: en, fr, de, lu (Luxembourgish), pt (default: en; 'lb' is a deprecated alias for 'lu') |
Output Schema
| Name | Required | Description |
|---|---|---|
| trust | Yes | |
| listing | Yes | |
| corrections | Yes | |
| listingPage | Yes | |
| listingPageContext | Yes |
get_market_contextGet Market ContextBRead-onlyIdempotentInspect
Get bounded, source-backed property context for a commune, with source dates and unknown states.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Response locale: en, fr, de, lu (Luxembourgish), pt (default: en; 'lb' is a deprecated alias for 'lu') | |
| commune | Yes | Luxembourg commune slug or name (e.g. 'luxembourg', 'esch-sur-alzette', 'kirchberg') |
Output Schema
| Name | Required | Description |
|---|---|---|
| trust | Yes | |
| commune | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe, idempotent, closed-world read, so safety behavior is covered. The description does add useful context beyond that: results are 'bounded' and 'source-backed' with 'source dates,' and some values may be in 'unknown states,' which tells the agent to expect incomplete data. It stops short of describing coverage limits, staleness windows, or granularity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with no padding, and the key qualifiers (bounded, source-backed, source dates, unknown states) are packed efficiently. It is well-formed, though the extreme density leaves no room for the routing guidance an agent would want.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With full schema coverage and an output schema, return-value explanation is unnecessary, and the provenance/'unknown states' note covers the data-quality angle. The remaining gap is tool selection — nothing explains how this differs from the estimation and search tools it sits beside.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the commune slug/name and locale enum (including the deprecated 'lb' alias) are fully documented in the schema. The description only echoes that context is per-commune, adding no format or resolution guidance beyond it — baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Get) and resource (bounded, source-backed property context) scoped to a commune, so an agent understands the intent immediately. It does not, however, distinguish this from siblings such as get_price_estimate or search_vibe, which also return commune-level property information.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no stated prerequisites, and no mention of when another tool (e.g. get_price_estimate, get_affordability) would be the better choice. The agent must infer the use case entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_price_estimateGet Price EstimateARead-onlyIdempotentInspect
AI-powered price estimate for a Luxembourg property. The chathome valuation model is trained and backtested on historical property listing asking prices, not deed-level sales. Returns an estimated price, confidence interval, and comparable listing statistics.
| Name | Required | Description | Default |
|---|---|---|---|
| areaSqm | Yes | Living area in square metres | |
| commune | Yes | Luxembourg commune name or slug, e.g. 'luxembourg', 'esch-sur-alzette' | |
| bedrooms | No | Number of bedrooms | |
| energyClass | No | Energy performance certificate class, e.g. 'A', 'B', 'C' | |
| listingType | Yes | Whether the property is for rent or sale | |
| propertyType | Yes | Property type, e.g. 'apartment', 'house', 'studio', 'penthouse' | |
| constructionYear | No | Year the property was built, e.g. 1995 |
Output Schema
| Name | Required | Description |
|---|---|---|
| trust | Yes | |
| areaSqm | Yes | |
| commune | Yes | |
| listingType | Yes | |
| propertyType | Yes | |
| estimatedPrice | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool read-only, idempotent, and non-destructive. The description adds meaningful behavioral context by explaining the model is trained on historical listing asking prices, not deed-level sales, which informs the trustworthiness of the result. This is valuable context beyond the annotation flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose. The second sentence adds a meaningful caveat about training data, and the third sentence summarizes outputs. It is slightly verbose with 'AI-powered' and the model name, but overall every sentence contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotations, a fully documented schema, and an output schema, the description is sufficiently complete. It explains the data basis and high-level returns, and the structured fields carry the remaining technical details. No critical operational information for calling the tool appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the input schema. The description adds no additional parameter-level meaning, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it provides an AI-powered price estimate for a Luxembourg property. It also clarifies the output (estimated price, confidence interval, comparable statistics), making it clearly distinct from sibling tools like get_listing or get_market_context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates this is the tool for obtaining a property valuation, and the 'estimate' wording implies it should be used when a predicted price is needed rather than raw listing or market context. It does not explicitly name alternatives or exclusions, but the context is sufficiently clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_town_agenciesGet Town AgenciesARead-onlyIdempotentInspect
Get every estate agency with active listings in a supported Luxembourg town, including current buy/rent stock and asking-price ranges.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Response locale: en, fr, de, lu (Luxembourgish), pt (default: en; 'lb' is a deprecated alias for 'lu') | |
| commune | Yes | One of the supported Luxembourg town names or slugs, e.g. 'Mersch' or 'esch-sur-alzette' |
Output Schema
| Name | Required | Description |
|---|---|---|
| trust | Yes | |
| source | Yes | |
| commune | Yes | |
| pageUrl | Yes | |
| agencies | Yes | |
| localityId | Yes | |
| measuredAt | Yes | |
| agencyCount | Yes | |
| buyListings | Yes | |
| communeSlug | Yes | |
| rentListings | Yes | |
| activeListings | Yes | |
| unclassifiedListings | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the active-listings filter and mentions that output includes buy/rent stock and asking-price ranges, but it does not disclose potential edge cases such as unsupported communes or result-volume behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one clear sentence that front-loads the action and resource, then adds the key qualifiers ('active listings', 'supported Luxembourg town', 'buy/rent stock and asking-price ranges'). Every part earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, has full schema coverage, annotations, and an output schema, so the description does not need to explain return values or safety. It covers the resource, scope, and output focus; it only lacks explicit sibling routing or error-behavior guidance, which would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters, including the locale enum and commune name/slug format. The description's mention of a 'supported Luxembourg town' adds little beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and names the precise resource: estate agencies with active listings in a supported Luxembourg town. It distinguishes itself from sibling tools by focusing on agencies rather than individual listings, market estimates, or inquiries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use case is implied clearly: call this when you need agency-level stock and price-range information for a town. However, it does not explicitly state when not to use it, nor does it mention alternatives such as search_for_sale or search_rentals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_listing_cardsShow Listing CardsARead-onlyIdempotentInspect
Render one to eight exact results from a prior property search as an interactive MCP Apps photo carousel. Call a search tool first, then copy its listing IDs and any returned match scores/reasons without alteration. The tool re-reads canonical public listing facts before display.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Response locale: en, fr, de, lu (Luxembourgish), pt (default: en; 'lb' is a deprecated alias for 'lu') | |
| heading | No | Short user-facing heading grounded in the search request | |
| listings | Yes | One to eight exact listing IDs from search_vibe, search_rentals, or search_for_sale, in display order |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| total | Yes | Exact number of listing objects returned in this response; not the number of matches in the market. |
| trust | No | |
| source | No | |
| hasMore | No | |
| ranking | No | |
| session | No | |
| followUp | No | |
| listings | Yes | |
| countKind | No | |
| truncated | No | |
| nextCursor | No | |
| matchingCount | No | |
| returnedCount | No | |
| understanding | No | What the engine understood from the request. notChecked lists wishes no returned home is confirmed to have. |
| searchExhaustive | No | |
| matchingCountKind | No | |
| excludedUnprovenCount | No | Upstream rows omitted because public facts could not prove every requested hard filter. |
| marketMatchingUpperBound | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: the tool 're-reads canonical public listing facts before display' (data may be refreshed, not a blind echo of cached input) and enforces the 1–8 display cap. It does not discuss rendering failures or locale fallback behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the capability and cardinality limit, followed by the prerequisite and the data-freshness note. No filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and annotations carry the safety profile. The description supplies the missing pieces an agent actually needs: the search-first prerequisite, the 1–8 constraint, exact-copy semantics, and the canonical re-read behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description earns above baseline by stressing that listing IDs, scores, and match reasons must be copied 'without alteration' — a constraint on how the parameters must be sourced that the schema only implies. It does not add meaning for locale or heading.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Render') and resource ('one to eight exact results ... as an interactive MCP Apps photo carousel'), and distinguishes itself from the search siblings by operating on results of a prior search rather than performing one. An agent can tell this display tool apart from search_vibe/search_rentals without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit prerequisite: 'Call a search tool first, then copy its listing IDs and any returned match scores/reasons without alteration.' This tells the agent the ordering and the input provenance clearly. It does not state when-not to use it or name a preferred search sibling in the prose, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_for_saleSearch Properties For SaleARead-onlyIdempotentInspect
Search properties for sale across supported Grande Région inventory by location, price, rooms, area, property type, and positive-evidence amenities, with explicit sort and completeness metadata. Every sourced result identifies and links the original agency listing and states its latest catalogue re-sighting time; thumbnails of the top results are attached as image content blocks.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort by relevance, listing date, or asking price | |
| limit | No | Number of results to return (max 50, default 20) | |
| garden | No | Require a source-confirmed garden | |
| locale | No | Response locale: en, fr, de, lu (Luxembourgish), pt (default: en; 'lb' is a deprecated alias for 'lu') | |
| balcony | No | Require a source-confirmed balcony | |
| commune | No | Luxembourg commune name or slug | |
| minBeds | No | Minimum number of bedrooms | |
| elevator | No | Require lift/elevator evidence | |
| maxPrice | No | Maximum sale price in EUR | |
| minPrice | No | Minimum sale price in EUR | |
| furnished | No | Require furnished evidence | |
| maxAreaSqm | No | Maximum area in m² | |
| minAreaSqm | No | Minimum area in m² | |
| parkingType | No | Require source-backed parking evidence | |
| petsAllowed | No | Require pets-allowed evidence | |
| minBathrooms | No | Minimum number of bathrooms | |
| propertyType | No | Property type: apartment, house, villa, etc. | |
| includePhotos | No | Attach thumbnail photos of the top results as image content blocks (default: true). Set false for a lean text-only response. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| total | Yes | Exact number of listing objects returned in this response; not the number of matches in the market. |
| trust | No | |
| source | No | |
| hasMore | No | |
| ranking | No | |
| session | No | |
| followUp | No | |
| listings | Yes | |
| countKind | No | |
| truncated | No | |
| nextCursor | No | |
| matchingCount | No | |
| returnedCount | No | |
| understanding | No | What the engine understood from the request. notChecked lists wishes no returned home is confirmed to have. |
| searchExhaustive | No | |
| matchingCountKind | No | |
| excludedUnprovenCount | No | Upstream rows omitted because public facts could not prove every requested hard filter. |
| marketMatchingUpperBound | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, so the safety profile is covered. The description adds genuinely useful behavior beyond that: each result links its original agency listing and carries a latest catalogue 're-sighting' time, and thumbnails are returned as image content blocks — non-obvious output behavior worth disclosing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two front-loaded sentences: capability and filter scope first, return-shape detail second. Dense but every clause carries information; the only mild padding is the dual phrasing around 'explicit sort and completeness metadata'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be fully spelled out, yet the description still flags the key output traits (attribution links, re-sighting timestamps, image blocks). For an 18-parameter discovery tool this is complete enough; only explicit sibling routing is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents all 18 parameters and the baseline would be 3. The description earns a bump by explaining that amenity/feature filters (garden, balcony, elevator, parking, furnished, pets) are 'positive-evidence' filters, which clarifies why those schema booleans are const:true and set user expectations about source-confirmed data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search properties for sale') plus the scope of the index ('supported Grande Région inventory') and enumerates the filter dimensions it accepts. It is immediately distinguishable from the sibling search_rentals (sale vs rent) and from get_listing/compare_listings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the name and the description (this is the entry-point discovery tool), but there is no explicit guidance on when to prefer it over siblings such as compare_listings, render_listing_cards, or get_listing, nor any stated exclusions or prerequisites. Adequate but with a clear routing gap in a 14-sibling toolset.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_rentalsSearch Rental ListingsARead-onlyIdempotentInspect
Search active Luxembourg rentals by location, rooms, area, property type, positive-evidence amenities, advertised base rent, or a separate strict confirmed monthly-obligation ceiling. The strict ceiling excludes listings when required recurring charges, fees, evidence, or source freshness are incomplete. Returned counts include explicit completeness metadata; every sourced result links the original agency listing and states its latest catalogue re-sighting time.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort the proven result set. price-asc means base rent, not all-in monthly cost. | |
| limit | No | Number of results to return (max 50, default 20) | |
| garden | No | Require a source-confirmed garden | |
| locale | No | Response locale: en, fr, de, lu (Luxembourgish), pt (default: en; 'lb' is a deprecated alias for 'lu') | |
| balcony | No | Require a source-confirmed balcony | |
| commune | No | Luxembourg commune name or slug | |
| minBeds | No | Minimum number of bedrooms | |
| elevator | No | Require positive source evidence of a lift/elevator | |
| maxPrice | No | Maximum advertised base monthly rent in EUR, excluding separate charges | |
| minPrice | No | Minimum monthly rent in EUR | |
| furnished | No | Require positive source evidence that the rental is furnished | |
| maxAreaSqm | No | Maximum area in m² | |
| minAreaSqm | No | Minimum area in m² | |
| parkingType | No | Require source-backed parking evidence | |
| petsAllowed | No | Require positive source evidence that pets are allowed | |
| minBathrooms | No | Minimum number of bathrooms | |
| propertyType | No | Property type: apartment, house, studio, room, etc. | |
| includePhotos | No | Attach thumbnail photos of the top results as image content blocks (default: true). Set false for a lean text-only response. | |
| maxTotalMonthly | No | Strict maximum confirmed monthly obligation in EUR: advertised rent plus source-confirmed required recurring charges and fees. Listings with missing, estimated, conflicting, or stale cost evidence are excluded. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| total | Yes | Exact number of listing objects returned in this response; not the number of matches in the market. |
| trust | No | |
| source | No | |
| hasMore | No | |
| ranking | No | |
| session | No | |
| followUp | No | |
| listings | Yes | |
| countKind | No | |
| truncated | No | |
| nextCursor | No | |
| matchingCount | No | |
| returnedCount | No | |
| understanding | No | What the engine understood from the request. notChecked lists wishes no returned home is confirmed to have. |
| searchExhaustive | No | |
| matchingCountKind | No | |
| excludedUnprovenCount | No | Upstream rows omitted because public facts could not prove every requested hard filter. |
| marketMatchingUpperBound | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive and a closed-world catalogue, so the safety burden is light. The description adds real behavioral value beyond them: the strict ceiling deliberately excludes listings with incomplete/stale/conflicting cost evidence, counts carry completeness metadata, and results link the source listing plus a re-sighting timestamp.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the search facets, then the exclusion rule, then the result/metadata behavior. Dense but organized by importance; only mild verbosity in the metadata sentence prevents a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 19 parameters, a 100% schema description coverage, and an output schema that documents the return shape, the description only needs to supply the conceptual model — filter categories, the strict-ceiling exclusion policy, and provenance metadata — and it does exactly that. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by framing the two price filters as distinct concepts — 'advertised base rent' versus a 'strict confirmed monthly-obligation ceiling' — and by characterizing amenity filters as positive-evidence requirements, which helps an agent choose the right parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search active Luxembourg rentals') and enumerates the filterable facets (location, rooms, area, property type, amenities, rent, monthly-obligation ceiling). The Luxembourg/rental scoping cleanly separates it from search_for_sale and search_vibe without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly conveys that this is the rental-search entry point and explains the distinction between the advertised-rent filter and the strict all-in ceiling, which is useful intra-tool guidance. However, it never names alternative siblings (get_listing, compare_listings, search_for_sale) or states when to prefer one over another, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_vibeVibe SearchARead-onlyIdempotentInspect
Preferred natural-language ('vibe') property search. Pass the user's request as prose and the engine matches on lifestyle, mood, proximity, and soft preferences via embeddings + LLM reasoning. Healthy runs return source-grounded match reasons and a 0-100 request-fit score (not a probability); degraded runs explicitly omit ranking claims. Every sourced result identifies and links the original agency listing and states its latest catalogue re-sighting time. The response's understanding block states what was understood; wishes in understanding.notChecked are not confirmed for any returned home. If the requested place cannot be resolved safely, it returns no listings plus a machine-readable unanswerable reason instead of substituting unrelated homes.
| Name | Required | Description | Default |
|---|---|---|---|
| brief | No | The `session.brief` object from the previous search_vibe response, passed back unchanged to continue that search. Without `followUp` it replays the same search without re-reading the request. | |
| limit | No | Number of results to return (max 50, default 20) | |
| query | Yes | Natural-language description of what the user wants, in their own words — e.g. "quiet 2-bed near Kirchberg with a balcony under €2000" or "bright family house with a garden, short commute to Belval, energy class A". Lifestyle, vibe, proximity, and soft preferences all work here. | |
| intent | No | Whether to search rentals or properties for sale (default: "rent") | |
| locale | No | Response locale: en, fr, de, lu (Luxembourgish), pt (default: en; 'lb' is a deprecated alias for 'lu') | |
| followUp | No | A change to the previous search or a question about its results, in the user’s own words — e.g. "cheaper", "like #2 but with a garden", "which one has parking?". Send it with the `brief` from the previous response (`session.brief`) and the same `query`. A question leaves the search unchanged and comes back as `followUp.reply`. | |
| includePhotos | No | Attach thumbnail photos of the top results as image content blocks (default: true). Set false for a lean text-only response. | |
| shownListingIds | No | Ids of the listings you showed the user, in the order shown, so "#2" or "the second one" in `followUp` points at the right home. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| total | Yes | Exact number of listing objects returned in this response; not the number of matches in the market. |
| trust | No | |
| source | No | |
| hasMore | No | |
| ranking | No | |
| session | No | |
| followUp | No | |
| listings | Yes | |
| countKind | No | |
| truncated | No | |
| nextCursor | No | |
| matchingCount | No | |
| returnedCount | No | |
| understanding | No | What the engine understood from the request. notChecked lists wishes no returned home is confirmed to have. |
| searchExhaustive | No | |
| matchingCountKind | No | |
| excludedUnprovenCount | No | Upstream rows omitted because public facts could not prove every requested hard filter. |
| marketMatchingUpperBound | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly/idempotent/non-destructive/openWorld=false), disclosing degraded-run behavior (ranking claims omitted), that the fit score is not a probability, sourcing/re-sighting guarantees, and that unresolved places yield an unanswerable reason rather than substituted homes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and dense with useful specifics, though the final sentences about sourcing and unanswerable results make it fairly long. Nearly every clause earns its place, but it could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with nested objects and an output schema, the description covers the operational edge cases an agent needs (degraded runs, unconfirmed wishes, unanswerable reasons, follow-up flow) without redundantly restating return shapes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all eight parameters including brief, followUp, and shownListingIds. The description adds no syntax or format detail beyond that, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with its distinguishing mechanism: a natural-language 'vibe' search matched via embeddings + LLM reasoning. It is clearly separable from keyword siblings like search_rentals and search_for_sale.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Declares itself the 'preferred natural-language' search and tells the agent to pass the user's request as prose, which is clear usage context. It stops short of naming the sibling tools it should be chosen over, so the when-not/alternative case is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_inquirySubmit InquiryADestructiveInspect
Submit an inquiry about a listing. For chathome-hosted listings creates a conversation thread; for external agency listings returns agency contact details.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Inquiry message to send to the listing owner (10–5000 characters) | |
| agentName | No | Optional display name for the inquiring agent | |
| listingId | Yes | The ID of the listing to inquire about | |
| contactEmail | No | Optional contact email for the inquiring agent |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| trust | Yes | |
| listingId | No | |
| conversationId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal mutation (readOnlyHint=false, destructiveHint=true), and the description adds concrete behavioral details: it either creates a conversation thread or returns agency contact details. This clarifies the side-effect nature beyond the raw hints, though it omits prerequisites like authentication or persistence guarantees.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that efficiently conveys the primary action and the two possible outcomes. Every word adds value with no repetition of the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and annotations cover the safety profile, the description is complete enough for an agent to understand invocation intent and expected behavior. It could mention how to identify listing type, but that is likely available from listing data and not essential for tool selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters. The description does not add parameter-specific meaning, but the baseline of 3 is appropriate since structured fields carry the semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Submit an inquiry about a listing') and adds a meaningful behavioral distinction: chathome-hosted listings create a conversation thread, while external agency listings return contact details. This clearly differentiates the tool from siblings like get_inquiry_status and get_listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool and how behavior changes based on listing type. It does not explicitly name alternatives or state when not to use it, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Changed
get_listing3 fields changed- added
Output schema / properties / listingPageContext / properties / storedCommuteAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listingPageContext / properties / storedPlanningAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / listingPageContext / requiredPrevious value: -[ - "priceHistory", - "priceEvolution", - "familyAmenities", - "neighborhoodFacts", - "countryEvidence", - "transitSummary", - "commuteSummary", - "passport", - "propertyChecks", - "parcelDossier" -]New value: +[ + "storedPlanning", + "storedCommute", + "priceHistory", + "priceEvolution", + "familyAmenities", + "neighborhoodFacts", + "countryEvidence", + "transitSummary", + "commuteSummary", + "passport", + "propertyChecks", + "parcelDossier" +]
- Changed
get_listing_truth3 fields changed- added
Output schema / properties / listingPageContext / properties / storedCommuteAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listingPageContext / properties / storedPlanningAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / listingPageContext / requiredPrevious value: -[ - "priceHistory", - "priceEvolution", - "familyAmenities", - "neighborhoodFacts", - "countryEvidence", - "transitSummary", - "commuteSummary", - "passport", - "propertyChecks", - "parcelDossier" -]New value: +[ + "storedPlanning", + "storedCommute", + "priceHistory", + "priceEvolution", + "familyAmenities", + "neighborhoodFacts", + "countryEvidence", + "transitSummary", + "commuteSummary", + "passport", + "propertyChecks", + "parcelDossier" +]
7 tool updates
- Changed
compare_listings1 field changed- added
Output schema / properties / listings / items / properties / unknownAdded value: +{ + "description": "Why each missingFields entry is unknown. not_in_search_result means get_listing may know it.", + "items": { + "additionalProperties": false, + "properties": { + "field": { + "type": "string" + }, + "reason": { + "enum": [ + "not_stated", + "not_proven", + "conflicted", + "not_in_search_result" + ], + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" +}
- Changed
get_listing1 field changed- added
Output schema / properties / listing / properties / unknownAdded value: +{ + "description": "Why each missingFields entry is unknown. not_in_search_result means get_listing may know it.", + "items": { + "additionalProperties": false, + "properties": { + "field": { + "type": "string" + }, + "reason": { + "enum": [ + "not_stated", + "not_proven", + "conflicted", + "not_in_search_result" + ], + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" +}
- Changed
get_listing_truth1 field changed- added
Output schema / properties / listing / properties / unknownAdded value: +{ + "description": "Why each missingFields entry is unknown. not_in_search_result means get_listing may know it.", + "items": { + "additionalProperties": false, + "properties": { + "field": { + "type": "string" + }, + "reason": { + "enum": [ + "not_stated", + "not_proven", + "conflicted", + "not_in_search_result" + ], + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" +}
- Changed
render_listing_cards1 field changed- added
Output schema / properties / listings / items / properties / unknownAdded value: +{ + "description": "Why each missingFields entry is unknown. not_in_search_result means get_listing may know it.", + "items": { + "additionalProperties": false, + "properties": { + "field": { + "type": "string" + }, + "reason": { + "enum": [ + "not_stated", + "not_proven", + "conflicted", + "not_in_search_result" + ], + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" +}
- Changed
search_for_sale1 field changed- added
Output schema / properties / listings / items / properties / unknownAdded value: +{ + "description": "Why each missingFields entry is unknown. not_in_search_result means get_listing may know it.", + "items": { + "additionalProperties": false, + "properties": { + "field": { + "type": "string" + }, + "reason": { + "enum": [ + "not_stated", + "not_proven", + "conflicted", + "not_in_search_result" + ], + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" +}
- Changed
search_rentals1 field changed- added
Output schema / properties / listings / items / properties / unknownAdded value: +{ + "description": "Why each missingFields entry is unknown. not_in_search_result means get_listing may know it.", + "items": { + "additionalProperties": false, + "properties": { + "field": { + "type": "string" + }, + "reason": { + "enum": [ + "not_stated", + "not_proven", + "conflicted", + "not_in_search_result" + ], + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" +}
- Changed
search_vibe1 field changed- added
Output schema / properties / listings / items / properties / unknownAdded value: +{ + "description": "Why each missingFields entry is unknown. not_in_search_result means get_listing may know it.", + "items": { + "additionalProperties": false, + "properties": { + "field": { + "type": "string" + }, + "reason": { + "enum": [ + "not_stated", + "not_proven", + "conflicted", + "not_in_search_result" + ], + "type": "string" + } + }, + "required": [ + "field", + "reason" + ], + "type": "object" + }, + "type": "array" +}
4 tool updates
- Changed
render_listing_cards4 fields changed- removed
Output schema / properties / coverageNoticeRemoved value: -{ - "additionalProperties": false, - "properties": { - "reason": { - "const": "outside_luxembourg", - "type": "string" - } - }, - "required": [ - "reason" - ], - "type": "object" -} - added
Output schema / properties / followUpAdded value: +{ + "additionalProperties": false, + "properties": { + "outcome": { + "enum": [ + "applied", + "answered" + ], + "type": "string" + }, + "reply": { + "type": "string" + } + }, + "required": [ + "outcome" + ], + "type": "object" +} - added
Output schema / properties / sessionAdded value: +{ + "additionalProperties": false, + "properties": { + "brief": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + } + }, + "required": [ + "brief" + ], + "type": "object" +} - added
Output schema / properties / understandingAdded value: +{ + "additionalProperties": false, + "description": "What the engine understood from the request. notChecked lists wishes no returned home is confirmed to have.", + "properties": { + "checked": { + "items": { + "additionalProperties": false, + "properties": { + "force": { + "enum": [ + "must", + "should", + "nice" + ], + "type": "string" + }, + "meaning": { + "type": "string" + }, + "needId": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "unit": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "meaning", + "needId", + "operator", + "value", + "unit", + "force" + ], + "type": "object" + }, + "type": "array" + }, + "commutes": { + "items": { + "additionalProperties": false, + "properties": { + "destination": { + "type": "string" + }, + "force": { + "enum": [ + "must", + "should", + "nice" + ], + "type": "string" + }, + "maxMinutes": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mode": { + "anyOf": [ + { + "enum": [ + "transit", + "drive", + "walk", + "bike" + ], + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "destination", + "mode", + "maxMinutes", + "force" + ], + "type": "object" + }, + "type": "array" + }, + "excludedPropertyTypes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "notChecked": { + "items": { + "additionalProperties": false, + "properties": { + "force": { + "enum": [ + "must", + "should", + "nice" + ], + "type": "string" + }, + "meaning": { + "type": "string" + }, + "reason": { + "enum": [ + "no_listing_fact", + "fact_not_collected_yet" + ], + "type": "string" + } + }, + "required": [ + "meaning", + "force", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "offer": { + "enum": [ + "whole", + "room", + "either" + ], + "type": "string" + }, + "places": { + "items": { + "additionalProperties": false, + "properties": { + "country": { + "anyOf": [ + { + "enum": [ + "LU", + "FR", + "BE", + "DE" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "force": { + "enum": [ + "must", + "should", + "nice" + ], + "type": "string" + }, + "kind": { + "type": "string" + }, + "name": { + "type": "string" + }, + "radiusKm": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "role": { + "enum": [ + "live", + "work", + "near", + "avoid" + ], + "type": "string" + } + }, + "required": [ + "name", + "role", + "kind", + "country", + "radiusKm", + "force" + ], + "type": "object" + }, + "type": "array" + }, + "propertyTypes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "transaction": { + "anyOf": [ + { + "enum": [ + "buy", + "rent" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "understood": { + "type": "string" + } + }, + "required": [ + "understood", + "transaction", + "propertyTypes", + "excludedPropertyTypes", + "offer", + "places", + "commutes", + "checked", + "notChecked" + ], + "type": "object" +}
- Changed
search_for_sale4 fields changed- removed
Output schema / properties / coverageNoticeRemoved value: -{ - "additionalProperties": false, - "properties": { - "reason": { - "const": "outside_luxembourg", - "type": "string" - } - }, - "required": [ - "reason" - ], - "type": "object" -} - added
Output schema / properties / followUpAdded value: +{ + "additionalProperties": false, + "properties": { + "outcome": { + "enum": [ + "applied", + "answered" + ], + "type": "string" + }, + "reply": { + "type": "string" + } + }, + "required": [ + "outcome" + ], + "type": "object" +} - added
Output schema / properties / sessionAdded value: +{ + "additionalProperties": false, + "properties": { + "brief": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + } + }, + "required": [ + "brief" + ], + "type": "object" +} - added
Output schema / properties / understandingAdded value: +{ + "additionalProperties": false, + "description": "What the engine understood from the request. notChecked lists wishes no returned home is confirmed to have.", + "properties": { + "checked": { + "items": { + "additionalProperties": false, + "properties": { + "force": { + "enum": [ + "must", + "should", + "nice" + ], + "type": "string" + }, + "meaning": { + "type": "string" + }, + "needId": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "unit": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "meaning", + "needId", + "operator", + "value", + "unit", + "force" + ], + "type": "object" + }, + "type": "array" + }, + "commutes": { + "items": { + "additionalProperties": false, + "properties": { + "destination": { + "type": "string" + }, + "force": { + "enum": [ + "must", + "should", + "nice" + ], + "type": "string" + }, + "maxMinutes": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mode": { + "anyOf": [ + { + "enum": [ + "transit", + "drive", + "walk", + "bike" + ], + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "destination", + "mode", + "maxMinutes", + "force" + ], + "type": "object" + }, + "type": "array" + }, + "excludedPropertyTypes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "notChecked": { + "items": { + "additionalProperties": false, + "properties": { + "force": { + "enum": [ + "must", + "should", + "nice" + ], + "type": "string" + }, + "meaning": { + "type": "string" + }, + "reason": { + "enum": [ + "no_listing_fact", + "fact_not_collected_yet" + ], + "type": "string" + } + }, + "required": [ + "meaning", + "force", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "offer": { + "enum": [ + "whole", + "room", + "either" + ], + "type": "string" + }, + "places": { + "items": { + "additionalProperties": false, + "properties": { + "country": { + "anyOf": [ + { + "enum": [ + "LU", + "FR", + "BE", + "DE" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "force": { + "enum": [ + "must", + "should", + "nice" + ], + "type": "string" + }, + "kind": { + "type": "string" + }, + "name": { + "type": "string" + }, + "radiusKm": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "role": { + "enum": [ + "live", + "work", + "near", + "avoid" + ], + "type": "string" + } + }, + "required": [ + "name", + "role", + "kind", + "country", + "radiusKm", + "force" + ], + "type": "object" + }, + "type": "array" + }, + "propertyTypes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "transaction": { + "anyOf": [ + { + "enum": [ + "buy", + "rent" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "understood": { + "type": "string" + } + }, + "required": [ + "understood", + "transaction", + "propertyTypes", + "excludedPropertyTypes", + "offer", + "places", + "commutes", + "checked", + "notChecked" + ], + "type": "object" +}
- Changed
search_rentals4 fields changed- removed
Output schema / properties / coverageNoticeRemoved value: -{ - "additionalProperties": false, - "properties": { - "reason": { - "const": "outside_luxembourg", - "type": "string" - } - }, - "required": [ - "reason" - ], - "type": "object" -} - added
Output schema / properties / followUpAdded value: +{ + "additionalProperties": false, + "properties": { + "outcome": { + "enum": [ + "applied", + "answered" + ], + "type": "string" + }, + "reply": { + "type": "string" + } + }, + "required": [ + "outcome" + ], + "type": "object" +} - added
Output schema / properties / sessionAdded value: +{ + "additionalProperties": false, + "properties": { + "brief": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + } + }, + "required": [ + "brief" + ], + "type": "object" +} - added
Output schema / properties / understandingAdded value: +{ + "additionalProperties": false, + "description": "What the engine understood from the request. notChecked lists wishes no returned home is confirmed to have.", + "properties": { + "checked": { + "items": { + "additionalProperties": false, + "properties": { + "force": { + "enum": [ + "must", + "should", + "nice" + ], + "type": "string" + }, + "meaning": { + "type": "string" + }, + "needId": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "unit": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "meaning", + "needId", + "operator", + "value", + "unit", + "force" + ], + "type": "object" + }, + "type": "array" + }, + "commutes": { + "items": { + "additionalProperties": false, + "properties": { + "destination": { + "type": "string" + }, + "force": { + "enum": [ + "must", + "should", + "nice" + ], + "type": "string" + }, + "maxMinutes": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mode": { + "anyOf": [ + { + "enum": [ + "transit", + "drive", + "walk", + "bike" + ], + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "destination", + "mode", + "maxMinutes", + "force" + ], + "type": "object" + }, + "type": "array" + }, + "excludedPropertyTypes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "notChecked": { + "items": { + "additionalProperties": false, + "properties": { + "force": { + "enum": [ + "must", + "should", + "nice" + ], + "type": "string" + }, + "meaning": { + "type": "string" + }, + "reason": { + "enum": [ + "no_listing_fact", + "fact_not_collected_yet" + ], + "type": "string" + } + }, + "required": [ + "meaning", + "force", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "offer": { + "enum": [ + "whole", + "room", + "either" + ], + "type": "string" + }, + "places": { + "items": { + "additionalProperties": false, + "properties": { + "country": { + "anyOf": [ + { + "enum": [ + "LU", + "FR", + "BE", + "DE" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "force": { + "enum": [ + "must", + "should", + "nice" + ], + "type": "string" + }, + "kind": { + "type": "string" + }, + "name": { + "type": "string" + }, + "radiusKm": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "role": { + "enum": [ + "live", + "work", + "near", + "avoid" + ], + "type": "string" + } + }, + "required": [ + "name", + "role", + "kind", + "country", + "radiusKm", + "force" + ], + "type": "object" + }, + "type": "array" + }, + "propertyTypes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "transaction": { + "anyOf": [ + { + "enum": [ + "buy", + "rent" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "understood": { + "type": "string" + } + }, + "required": [ + "understood", + "transaction", + "propertyTypes", + "excludedPropertyTypes", + "offer", + "places", + "commutes", + "checked", + "notChecked" + ], + "type": "object" +}
- Changed
search_vibe7 fields changed- added
Input schema / properties / briefAdded value: +{ + "additionalProperties": {}, + "description": "The `session.brief` object from the previous search_vibe response, passed back unchanged to continue that search. Without `followUp` it replays the same search without re-reading the request.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Input schema / properties / followUpAdded value: +{ + "description": "A change to the previous search or a question about its results, in the user’s own words — e.g. \"cheaper\", \"like #2 but with a garden\", \"which one has parking?\". Send it with the `brief` from the previous response (`session.brief`) and the same `query`. A question leaves the search unchanged and comes back as `followUp.reply`.", + "maxLength": 800, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / shownListingIdsAdded value: +{ + "description": "Ids of the listings you showed the user, in the order shown, so \"#2\" or \"the second one\" in `followUp` points at the right home.", + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "maxItems": 10, + "type": "array" +} - removed
Output schema / properties / coverageNoticeRemoved value: -{ - "additionalProperties": false, - "properties": { - "reason": { - "const": "outside_luxembourg", - "type": "string" - } - }, - "required": [ - "reason" - ], - "type": "object" -} - added
Output schema / properties / followUpAdded value: +{ + "additionalProperties": false, + "properties": { + "outcome": { + "enum": [ + "applied", + "answered" + ], + "type": "string" + }, + "reply": { + "type": "string" + } + }, + "required": [ + "outcome" + ], + "type": "object" +} - added
Output schema / properties / sessionAdded value: +{ + "additionalProperties": false, + "properties": { + "brief": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + } + }, + "required": [ + "brief" + ], + "type": "object" +} - added
Output schema / properties / understandingAdded value: +{ + "additionalProperties": false, + "description": "What the engine understood from the request. notChecked lists wishes no returned home is confirmed to have.", + "properties": { + "checked": { + "items": { + "additionalProperties": false, + "properties": { + "force": { + "enum": [ + "must", + "should", + "nice" + ], + "type": "string" + }, + "meaning": { + "type": "string" + }, + "needId": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "unit": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "meaning", + "needId", + "operator", + "value", + "unit", + "force" + ], + "type": "object" + }, + "type": "array" + }, + "commutes": { + "items": { + "additionalProperties": false, + "properties": { + "destination": { + "type": "string" + }, + "force": { + "enum": [ + "must", + "should", + "nice" + ], + "type": "string" + }, + "maxMinutes": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mode": { + "anyOf": [ + { + "enum": [ + "transit", + "drive", + "walk", + "bike" + ], + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "destination", + "mode", + "maxMinutes", + "force" + ], + "type": "object" + }, + "type": "array" + }, + "excludedPropertyTypes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "notChecked": { + "items": { + "additionalProperties": false, + "properties": { + "force": { + "enum": [ + "must", + "should", + "nice" + ], + "type": "string" + }, + "meaning": { + "type": "string" + }, + "reason": { + "enum": [ + "no_listing_fact", + "fact_not_collected_yet" + ], + "type": "string" + } + }, + "required": [ + "meaning", + "force", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "offer": { + "enum": [ + "whole", + "room", + "either" + ], + "type": "string" + }, + "places": { + "items": { + "additionalProperties": false, + "properties": { + "country": { + "anyOf": [ + { + "enum": [ + "LU", + "FR", + "BE", + "DE" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "force": { + "enum": [ + "must", + "should", + "nice" + ], + "type": "string" + }, + "kind": { + "type": "string" + }, + "name": { + "type": "string" + }, + "radiusKm": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "role": { + "enum": [ + "live", + "work", + "near", + "avoid" + ], + "type": "string" + } + }, + "required": [ + "name", + "role", + "kind", + "country", + "radiusKm", + "force" + ], + "type": "object" + }, + "type": "array" + }, + "propertyTypes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "transaction": { + "anyOf": [ + { + "enum": [ + "buy", + "rent" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "understood": { + "type": "string" + } + }, + "required": [ + "understood", + "transaction", + "propertyTypes", + "excludedPropertyTypes", + "offer", + "places", + "commutes", + "checked", + "notChecked" + ], + "type": "object" +}
1 tool update
- Changed
get_listing2 fields changed- added
Output schema / properties / pageTextAdded value: +{ + "additionalProperties": false, + "properties": { + "areaFacts": { + "items": { + "additionalProperties": false, + "properties": { + "distanceMeters": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "floodLevel": { + "anyOf": [ + { + "enum": [ + "low", + "moderate", + "high", + "very_high" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "enum": [ + "nearest_transit_stop", + "nearest_rail_station", + "nearest_school", + "flood_zone", + "road_noise", + "rail_noise", + "aircraft_noise" + ], + "type": "string" + }, + "inFloodZone": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "label": { + "type": "string" + }, + "measuredAt": { + "type": "string" + }, + "measuredFrom": { + "enum": [ + "address", + "block", + "street", + "district" + ], + "type": "string" + }, + "measuredFromLabel": { + "type": "string" + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "noiseLdenDb": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "source": { + "enum": [ + "public_transport_timetables", + "school_registers", + "official_flood_maps", + "official_noise_maps" + ], + "type": "string" + }, + "sourceLabel": { + "type": "string" + }, + "text": { + "type": "string" + }, + "walkingMinutes": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "id", + "label", + "text", + "walkingMinutes", + "distanceMeters", + "name", + "inFloodZone", + "floodLevel", + "noiseLdenDb", + "source", + "sourceLabel", + "measuredFrom", + "measuredFromLabel", + "measuredAt" + ], + "type": "object" + }, + "type": "array" + }, + "locale": { + "enum": [ + "en", + "fr", + "de", + "lu", + "pt" + ], + "type": "string" + }, + "provenFeatures": { + "items": { + "additionalProperties": false, + "properties": { + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "source": { + "const": "agency_listing_page", + "type": "string" + } + }, + "required": [ + "key", + "label", + "source" + ], + "type": "object" + }, + "type": "array" + }, + "schemaVersion": { + "const": "listing-page-text.v1", + "type": "string" + }, + "summary": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "agencyWords": { + "const": false, + "type": "boolean" + }, + "basis": { + "const": "listing_facts_and_public_data", + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "text", + "basis", + "agencyWords" + ], + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "schemaVersion", + "locale", + "summary", + "provenFeatures", + "areaFacts" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "listing", - "listingPage", - "listingPageContext", - "trust" -]New value: +[ + "listing", + "listingPage", + "listingPageContext", + "pageText", + "trust" +]
1 tool update
- Changed
search_rentals2 fields changed- changed
Input schema / properties / maxPrice / descriptionPrevious value: -"Maximum monthly rent in EUR"New value: +"Maximum advertised base monthly rent in EUR, excluding separate charges" - added
Input schema / properties / maxTotalMonthlyAdded value: +{ + "description": "Strict maximum confirmed monthly obligation in EUR: advertised rent plus source-confirmed required recurring charges and fees. Listings with missing, estimated, conflicting, or stale cost evidence are excluded.", + "type": "number" +}
8 tool updates
- Added
compare_listings - Changed
get_affordability5 fields changed- removed
Input schema / properties / annualIncomeRemoved value: -{ - "description": "Gross annual household income", - "exclusiveMinimum": 0, - "type": "number" -} - added
Input schema / properties / annualNetIncomeAdded value: +{ + "description": "User-confirmed annual household net income", + "exclusiveMinimum": 0, + "type": "number" +} - removed
Input schema / properties / communeTaxRateRemoved value: -{ - "exclusiveMinimum": 0, - "type": "number" -} - added
Input schema / properties / maxDebtToIncomeRatioAdded value: +{ + "description": "Explicit housing-payment share of net income, e.g. 0.35", + "exclusiveMinimum": 0, + "maximum": 0.6, + "type": "number" +} - changed
Input schema / requiredPrevious value: -[ - "annualIncome", - "savingsAvailable", - "householdType", - "employmentType", - "residencyType" -]New value: +[ + "annualNetIncome", + "maxDebtToIncomeRatio", + "savingsAvailable", + "householdType", + "employmentType", + "residencyType" +]
- Changed
get_listing20 fields changed- added
Output schema / properties / listing / properties / amenitiesAdded value: +{ + "additionalProperties": false, + "properties": { + "balcony": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "elevator": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "furnished": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "garden": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "parking": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "petsAllowed": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "stepFreeAccess": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "wheelchairAccessible": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "furnished", + "elevator", + "parking", + "balcony", + "garden", + "petsAllowed", + "stepFreeAccess", + "wheelchairAccessible" + ], + "type": "object" +} - added
Output schema / properties / listing / properties / availabilityAdded value: +{ + "additionalProperties": false, + "properties": { + "availableFrom": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "moveInState": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "offerStatus": { + "enum": [ + "available", + "under_offer", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "offerStatus", + "availableFrom", + "moveInState" + ], + "type": "object" +} - added
Output schema / properties / listing / properties / duplicatesAdded value: +{ + "additionalProperties": false, + "properties": { + "confirmedOtherSources": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "confirmedSourceCount": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "confirmedOtherSources", + "confirmedSourceCount" + ], + "type": "object" +} - added
Output schema / properties / listing / properties / fieldProvenanceAdded value: +{ + "additionalProperties": { + "additionalProperties": false, + "properties": { + "method": { + "enum": [ + "source_structured", + "source_text", + "official_dataset", + "calculation", + "manual_review", + "model_extraction", + "model_only", + "unknown" + ], + "type": "string" + }, + "observedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "publisher": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "sourceUrl": { + "anyOf": [ + { + "format": "uri", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "confirmed", + "estimated", + "thin_sample", + "stale", + "context_only", + "conflicted", + "not_collected", + "source_unavailable", + "suppressed" + ], + "type": "string" + } + }, + "required": [ + "status", + "publisher", + "method", + "sourceUrl", + "observedAt" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / listing / properties / historyAdded value: +{ + "additionalProperties": false, + "properties": { + "daysListed": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "firstObservedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "firstObservedBasis": { + "const": "source_listing_date_or_chathome_ingest", + "type": "string" + }, + "lastChangedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "priceDropTotalEur": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "firstObservedAt", + "firstObservedBasis", + "daysListed", + "priceDropTotalEur", + "lastChangedAt" + ], + "type": "object" +} - added
Output schema / properties / listing / properties / locationAdded value: +{ + "additionalProperties": false, + "properties": { + "address": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "city": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "confidence": { + "enum": [ + "verified", + "unverified", + "contradicted", + "unknown" + ], + "type": "string" + }, + "district": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "postalCode": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "precision": { + "enum": [ + "exact_address", + "street", + "district", + "commune_only", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "city", + "district", + "address", + "postalCode", + "precision", + "confidence" + ], + "type": "object" +} - added
Output schema / properties / listing / properties / matchAdded value: +{ + "additionalProperties": false, + "properties": { + "allRequiredConstraintsSatisfied": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "reasons": { + "items": { + "type": "string" + }, + "maxItems": 3, + "type": "array" + }, + "requiredConstraints": { + "items": { + "additionalProperties": false, + "properties": { + "actual": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": "string" + }, + "status": { + "enum": [ + "matched", + "not_matched", + "not_verified", + "not_applied" + ], + "type": "string" + }, + "target": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "id", + "status", + "target", + "actual" + ], + "type": "object" + }, + "type": "array" + }, + "resultKind": { + "anyOf": [ + { + "enum": [ + "strict_match", + "partial_match", + "relaxed_alternative" + ], + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "allRequiredConstraintsSatisfied", + "resultKind", + "requiredConstraints", + "reasons" + ], + "type": "object" +} - added
Output schema / properties / listing / properties / missingFieldsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / listing / properties / officialScreeningAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / propertyAdded value: +{ + "additionalProperties": false, + "properties": { + "airConditioning": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "colocation": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "completionYear": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "condition": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "constructionYear": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "floor": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "hasFloorplan": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "heatingEnergy": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "heatingType": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "landAreaSqm": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "privateRoomAreaSqm": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "rentByOwner": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "rooms": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "totalFloors": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "rooms", + "floor", + "totalFloors", + "constructionYear", + "completionYear", + "landAreaSqm", + "privateRoomAreaSqm", + "condition", + "heatingType", + "heatingEnergy", + "airConditioning", + "hasFloorplan", + "rentByOwner", + "colocation" + ], + "type": "object" +} - added
Output schema / properties / listing / properties / propertyChecksAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / rentAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "agencyFee": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "agencyFeeBasis": { + "anyOf": [ + { + "enum": [ + "tenant_share", + "total_commission", + "unknown" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "baseMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "chargesIncluded": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "chargesMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "deposit": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "depositExceedsMaximum": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "depositMaximum": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "estimatedMonthlyTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "estimatedMonthlyTotalIsLowerBound": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "estimatedUtilitiesMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "exactUpfrontCost": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "firstChargeAdvance": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "heatingMayBeDoubleCounted": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "indicativeInsuranceMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "knownMonthlyLowerBound": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "knownUpfrontCost": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mandatoryMoveInFeeTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mandatoryMoveInFees": { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "mandatoryRecurringFeeTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mandatoryRecurringFees": { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "monthlyTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "monthlyTotalStatus": { + "anyOf": [ + { + "enum": [ + "known", + "unknown_charges", + "conflicting_charges", + "invalid_price", + "unknown_mandatory_recurring_fees" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "reportedDeposit": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "unknownComponents": { + "items": { + "type": "string" + }, + "type": "array" + }, + "upfrontCostIsExact": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "upfrontCostIsLowerBound": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "baseMonthly", + "chargesMonthly", + "chargesIncluded", + "monthlyTotal", + "monthlyTotalStatus", + "knownMonthlyLowerBound", + "estimatedMonthlyTotal", + "estimatedMonthlyTotalIsLowerBound", + "estimatedUtilitiesMonthly", + "indicativeInsuranceMonthly", + "heatingMayBeDoubleCounted", + "firstChargeAdvance", + "reportedDeposit", + "deposit", + "depositMaximum", + "depositExceedsMaximum", + "agencyFee", + "agencyFeeBasis", + "mandatoryRecurringFees", + "mandatoryRecurringFeeTotal", + "mandatoryMoveInFees", + "mandatoryMoveInFeeTotal", + "knownUpfrontCost", + "exactUpfrontCost", + "upfrontCostIsLowerBound", + "upfrontCostIsExact", + "unknownComponents" + ], + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / schemaVersionAdded value: +{ + "const": "agent-listing.v2", + "type": "string" +} - added
Output schema / properties / listing / properties / sourceAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "agencyConfirmedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "agencyListingId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "agencyName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "lastSeenAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "listingUrl": { + "format": "uri", + "type": "string" + }, + "status": { + "enum": [ + "active", + "under_offer", + "unknown" + ], + "type": "string" + }, + "statusBasis": { + "enum": [ + "source_catalog_seen", + "listing_record_active" + ], + "type": "string" + }, + "type": { + "const": "original_agency_listing", + "type": "string" + } + }, + "required": [ + "type", + "agencyName", + "listingUrl", + "agencyListingId", + "lastSeenAt", + "status", + "statusBasis", + "agencyConfirmedAt" + ], + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / transportAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / valueContextAdded value: +{ + "additionalProperties": false, + "properties": { + "fairPrice": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "marketContext": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "priceIntegrity": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "priceIntegrity", + "fairPrice", + "marketContext" + ], + "type": "object" +} - changed
Output schema / properties / listing / requiredPrevious value: -[ - "id", - "url", - "title", - "status", - "price", - "currency", - "listingType", - "propertyType", - "city", - "district", - "country", - "beds", - "baths", - "areaSqm", - "energyClass", - "imageUrl", - "agencyName", - "latitude", - "longitude" -]New value: +[ + "schemaVersion", + "id", + "url", + "title", + "status", + "price", + "currency", + "listingType", + "propertyType", + "city", + "district", + "country", + "beds", + "baths", + "areaSqm", + "energyClass", + "imageUrl", + "agencyName", + "source", + "rent", + "availability", + "property", + "location", + "history", + "duplicates", + "amenities", + "fieldProvenance", + "officialScreening", + "propertyChecks", + "transport", + "valueContext", + "missingFields", + "match", + "latitude", + "longitude" +] - added
Output schema / properties / listingPageAdded value: +{ + "additionalProperties": {}, + "properties": {}, + "type": "object" +} - added
Output schema / properties / listingPageContextAdded value: +{ + "additionalProperties": false, + "properties": { + "commuteSummary": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "countryEvidence": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "familyAmenities": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "neighborhoodFacts": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "parcelDossier": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "passport": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "priceEvolution": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "priceHistory": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "propertyChecks": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "transitSummary": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "priceHistory", + "priceEvolution", + "familyAmenities", + "neighborhoodFacts", + "countryEvidence", + "transitSummary", + "commuteSummary", + "passport", + "propertyChecks", + "parcelDossier" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "listing", - "trust" -]New value: +[ + "listing", + "listingPage", + "listingPageContext", + "trust" +]
- Changed
get_listing_truth20 fields changed- added
Output schema / properties / listing / properties / amenitiesAdded value: +{ + "additionalProperties": false, + "properties": { + "balcony": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "elevator": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "furnished": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "garden": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "parking": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "petsAllowed": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "stepFreeAccess": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "wheelchairAccessible": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "furnished", + "elevator", + "parking", + "balcony", + "garden", + "petsAllowed", + "stepFreeAccess", + "wheelchairAccessible" + ], + "type": "object" +} - added
Output schema / properties / listing / properties / availabilityAdded value: +{ + "additionalProperties": false, + "properties": { + "availableFrom": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "moveInState": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "offerStatus": { + "enum": [ + "available", + "under_offer", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "offerStatus", + "availableFrom", + "moveInState" + ], + "type": "object" +} - added
Output schema / properties / listing / properties / duplicatesAdded value: +{ + "additionalProperties": false, + "properties": { + "confirmedOtherSources": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "confirmedSourceCount": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "confirmedOtherSources", + "confirmedSourceCount" + ], + "type": "object" +} - added
Output schema / properties / listing / properties / fieldProvenanceAdded value: +{ + "additionalProperties": { + "additionalProperties": false, + "properties": { + "method": { + "enum": [ + "source_structured", + "source_text", + "official_dataset", + "calculation", + "manual_review", + "model_extraction", + "model_only", + "unknown" + ], + "type": "string" + }, + "observedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "publisher": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "sourceUrl": { + "anyOf": [ + { + "format": "uri", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "confirmed", + "estimated", + "thin_sample", + "stale", + "context_only", + "conflicted", + "not_collected", + "source_unavailable", + "suppressed" + ], + "type": "string" + } + }, + "required": [ + "status", + "publisher", + "method", + "sourceUrl", + "observedAt" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / listing / properties / historyAdded value: +{ + "additionalProperties": false, + "properties": { + "daysListed": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "firstObservedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "firstObservedBasis": { + "const": "source_listing_date_or_chathome_ingest", + "type": "string" + }, + "lastChangedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "priceDropTotalEur": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "firstObservedAt", + "firstObservedBasis", + "daysListed", + "priceDropTotalEur", + "lastChangedAt" + ], + "type": "object" +} - added
Output schema / properties / listing / properties / locationAdded value: +{ + "additionalProperties": false, + "properties": { + "address": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "city": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "confidence": { + "enum": [ + "verified", + "unverified", + "contradicted", + "unknown" + ], + "type": "string" + }, + "district": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "postalCode": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "precision": { + "enum": [ + "exact_address", + "street", + "district", + "commune_only", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "city", + "district", + "address", + "postalCode", + "precision", + "confidence" + ], + "type": "object" +} - added
Output schema / properties / listing / properties / matchAdded value: +{ + "additionalProperties": false, + "properties": { + "allRequiredConstraintsSatisfied": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "reasons": { + "items": { + "type": "string" + }, + "maxItems": 3, + "type": "array" + }, + "requiredConstraints": { + "items": { + "additionalProperties": false, + "properties": { + "actual": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": "string" + }, + "status": { + "enum": [ + "matched", + "not_matched", + "not_verified", + "not_applied" + ], + "type": "string" + }, + "target": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "id", + "status", + "target", + "actual" + ], + "type": "object" + }, + "type": "array" + }, + "resultKind": { + "anyOf": [ + { + "enum": [ + "strict_match", + "partial_match", + "relaxed_alternative" + ], + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "allRequiredConstraintsSatisfied", + "resultKind", + "requiredConstraints", + "reasons" + ], + "type": "object" +} - added
Output schema / properties / listing / properties / missingFieldsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / listing / properties / officialScreeningAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / propertyAdded value: +{ + "additionalProperties": false, + "properties": { + "airConditioning": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "colocation": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "completionYear": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "condition": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "constructionYear": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "floor": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "hasFloorplan": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "heatingEnergy": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "heatingType": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "landAreaSqm": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "privateRoomAreaSqm": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "rentByOwner": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "rooms": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "totalFloors": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "rooms", + "floor", + "totalFloors", + "constructionYear", + "completionYear", + "landAreaSqm", + "privateRoomAreaSqm", + "condition", + "heatingType", + "heatingEnergy", + "airConditioning", + "hasFloorplan", + "rentByOwner", + "colocation" + ], + "type": "object" +} - added
Output schema / properties / listing / properties / propertyChecksAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / rentAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "agencyFee": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "agencyFeeBasis": { + "anyOf": [ + { + "enum": [ + "tenant_share", + "total_commission", + "unknown" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "baseMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "chargesIncluded": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "chargesMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "deposit": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "depositExceedsMaximum": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "depositMaximum": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "estimatedMonthlyTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "estimatedMonthlyTotalIsLowerBound": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "estimatedUtilitiesMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "exactUpfrontCost": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "firstChargeAdvance": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "heatingMayBeDoubleCounted": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "indicativeInsuranceMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "knownMonthlyLowerBound": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "knownUpfrontCost": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mandatoryMoveInFeeTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mandatoryMoveInFees": { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "mandatoryRecurringFeeTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mandatoryRecurringFees": { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "monthlyTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "monthlyTotalStatus": { + "anyOf": [ + { + "enum": [ + "known", + "unknown_charges", + "conflicting_charges", + "invalid_price", + "unknown_mandatory_recurring_fees" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "reportedDeposit": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "unknownComponents": { + "items": { + "type": "string" + }, + "type": "array" + }, + "upfrontCostIsExact": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "upfrontCostIsLowerBound": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "baseMonthly", + "chargesMonthly", + "chargesIncluded", + "monthlyTotal", + "monthlyTotalStatus", + "knownMonthlyLowerBound", + "estimatedMonthlyTotal", + "estimatedMonthlyTotalIsLowerBound", + "estimatedUtilitiesMonthly", + "indicativeInsuranceMonthly", + "heatingMayBeDoubleCounted", + "firstChargeAdvance", + "reportedDeposit", + "deposit", + "depositMaximum", + "depositExceedsMaximum", + "agencyFee", + "agencyFeeBasis", + "mandatoryRecurringFees", + "mandatoryRecurringFeeTotal", + "mandatoryMoveInFees", + "mandatoryMoveInFeeTotal", + "knownUpfrontCost", + "exactUpfrontCost", + "upfrontCostIsLowerBound", + "upfrontCostIsExact", + "unknownComponents" + ], + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / schemaVersionAdded value: +{ + "const": "agent-listing.v2", + "type": "string" +} - added
Output schema / properties / listing / properties / sourceAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "agencyConfirmedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "agencyListingId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "agencyName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "lastSeenAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "listingUrl": { + "format": "uri", + "type": "string" + }, + "status": { + "enum": [ + "active", + "under_offer", + "unknown" + ], + "type": "string" + }, + "statusBasis": { + "enum": [ + "source_catalog_seen", + "listing_record_active" + ], + "type": "string" + }, + "type": { + "const": "original_agency_listing", + "type": "string" + } + }, + "required": [ + "type", + "agencyName", + "listingUrl", + "agencyListingId", + "lastSeenAt", + "status", + "statusBasis", + "agencyConfirmedAt" + ], + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / transportAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / valueContextAdded value: +{ + "additionalProperties": false, + "properties": { + "fairPrice": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "marketContext": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "priceIntegrity": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "priceIntegrity", + "fairPrice", + "marketContext" + ], + "type": "object" +} - changed
Output schema / properties / listing / requiredPrevious value: -[ - "id", - "url", - "title", - "status", - "price", - "currency", - "listingType", - "propertyType", - "city", - "district", - "country", - "beds", - "baths", - "areaSqm", - "energyClass", - "imageUrl", - "agencyName", - "latitude", - "longitude" -]New value: +[ + "schemaVersion", + "id", + "url", + "title", + "status", + "price", + "currency", + "listingType", + "propertyType", + "city", + "district", + "country", + "beds", + "baths", + "areaSqm", + "energyClass", + "imageUrl", + "agencyName", + "source", + "rent", + "availability", + "property", + "location", + "history", + "duplicates", + "amenities", + "fieldProvenance", + "officialScreening", + "propertyChecks", + "transport", + "valueContext", + "missingFields", + "match", + "latitude", + "longitude" +] - added
Output schema / properties / listingPageAdded value: +{ + "additionalProperties": {}, + "properties": {}, + "type": "object" +} - added
Output schema / properties / listingPageContextAdded value: +{ + "additionalProperties": false, + "properties": { + "commuteSummary": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "countryEvidence": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "familyAmenities": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "neighborhoodFacts": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "parcelDossier": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "passport": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "priceEvolution": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "priceHistory": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "propertyChecks": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "transitSummary": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "priceHistory", + "priceEvolution", + "familyAmenities", + "neighborhoodFacts", + "countryEvidence", + "transitSummary", + "commuteSummary", + "passport", + "propertyChecks", + "parcelDossier" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "listing", - "corrections", - "trust" -]New value: +[ + "listing", + "listingPage", + "listingPageContext", + "corrections", + "trust" +]
- Changed
render_listing_cards25 fields changed- added
Output schema / properties / excludedUnprovenCountAdded value: +{ + "description": "Upstream rows omitted because public facts could not prove every requested hard filter.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / hasMoreAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / listings / items / properties / amenitiesAdded value: +{ + "additionalProperties": false, + "properties": { + "balcony": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "elevator": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "furnished": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "garden": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "parking": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "petsAllowed": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "stepFreeAccess": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "wheelchairAccessible": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "furnished", + "elevator", + "parking", + "balcony", + "garden", + "petsAllowed", + "stepFreeAccess", + "wheelchairAccessible" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / availabilityAdded value: +{ + "additionalProperties": false, + "properties": { + "availableFrom": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "moveInState": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "offerStatus": { + "enum": [ + "available", + "under_offer", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "offerStatus", + "availableFrom", + "moveInState" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / duplicatesAdded value: +{ + "additionalProperties": false, + "properties": { + "confirmedOtherSources": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "confirmedSourceCount": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "confirmedOtherSources", + "confirmedSourceCount" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / fieldProvenanceAdded value: +{ + "additionalProperties": { + "additionalProperties": false, + "properties": { + "method": { + "enum": [ + "source_structured", + "source_text", + "official_dataset", + "calculation", + "manual_review", + "model_extraction", + "model_only", + "unknown" + ], + "type": "string" + }, + "observedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "publisher": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "sourceUrl": { + "anyOf": [ + { + "format": "uri", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "confirmed", + "estimated", + "thin_sample", + "stale", + "context_only", + "conflicted", + "not_collected", + "source_unavailable", + "suppressed" + ], + "type": "string" + } + }, + "required": [ + "status", + "publisher", + "method", + "sourceUrl", + "observedAt" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / listings / items / properties / historyAdded value: +{ + "additionalProperties": false, + "properties": { + "daysListed": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "firstObservedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "firstObservedBasis": { + "const": "source_listing_date_or_chathome_ingest", + "type": "string" + }, + "lastChangedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "priceDropTotalEur": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "firstObservedAt", + "firstObservedBasis", + "daysListed", + "priceDropTotalEur", + "lastChangedAt" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / locationAdded value: +{ + "additionalProperties": false, + "properties": { + "address": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "city": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "confidence": { + "enum": [ + "verified", + "unverified", + "contradicted", + "unknown" + ], + "type": "string" + }, + "district": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "postalCode": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "precision": { + "enum": [ + "exact_address", + "street", + "district", + "commune_only", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "city", + "district", + "address", + "postalCode", + "precision", + "confidence" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / matchAdded value: +{ + "additionalProperties": false, + "properties": { + "allRequiredConstraintsSatisfied": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "reasons": { + "items": { + "type": "string" + }, + "maxItems": 3, + "type": "array" + }, + "requiredConstraints": { + "items": { + "additionalProperties": false, + "properties": { + "actual": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": "string" + }, + "status": { + "enum": [ + "matched", + "not_matched", + "not_verified", + "not_applied" + ], + "type": "string" + }, + "target": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "id", + "status", + "target", + "actual" + ], + "type": "object" + }, + "type": "array" + }, + "resultKind": { + "anyOf": [ + { + "enum": [ + "strict_match", + "partial_match", + "relaxed_alternative" + ], + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "allRequiredConstraintsSatisfied", + "resultKind", + "requiredConstraints", + "reasons" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / missingFieldsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / listings / items / properties / officialScreeningAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / propertyAdded value: +{ + "additionalProperties": false, + "properties": { + "airConditioning": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "colocation": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "completionYear": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "condition": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "constructionYear": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "floor": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "hasFloorplan": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "heatingEnergy": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "heatingType": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "landAreaSqm": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "privateRoomAreaSqm": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "rentByOwner": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "rooms": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "totalFloors": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "rooms", + "floor", + "totalFloors", + "constructionYear", + "completionYear", + "landAreaSqm", + "privateRoomAreaSqm", + "condition", + "heatingType", + "heatingEnergy", + "airConditioning", + "hasFloorplan", + "rentByOwner", + "colocation" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / propertyChecksAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / rentAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "agencyFee": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "agencyFeeBasis": { + "anyOf": [ + { + "enum": [ + "tenant_share", + "total_commission", + "unknown" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "baseMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "chargesIncluded": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "chargesMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "deposit": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "depositExceedsMaximum": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "depositMaximum": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "estimatedMonthlyTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "estimatedMonthlyTotalIsLowerBound": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "estimatedUtilitiesMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "exactUpfrontCost": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "firstChargeAdvance": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "heatingMayBeDoubleCounted": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "indicativeInsuranceMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "knownMonthlyLowerBound": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "knownUpfrontCost": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mandatoryMoveInFeeTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mandatoryMoveInFees": { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "mandatoryRecurringFeeTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mandatoryRecurringFees": { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "monthlyTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "monthlyTotalStatus": { + "anyOf": [ + { + "enum": [ + "known", + "unknown_charges", + "conflicting_charges", + "invalid_price", + "unknown_mandatory_recurring_fees" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "reportedDeposit": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "unknownComponents": { + "items": { + "type": "string" + }, + "type": "array" + }, + "upfrontCostIsExact": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "upfrontCostIsLowerBound": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "baseMonthly", + "chargesMonthly", + "chargesIncluded", + "monthlyTotal", + "monthlyTotalStatus", + "knownMonthlyLowerBound", + "estimatedMonthlyTotal", + "estimatedMonthlyTotalIsLowerBound", + "estimatedUtilitiesMonthly", + "indicativeInsuranceMonthly", + "heatingMayBeDoubleCounted", + "firstChargeAdvance", + "reportedDeposit", + "deposit", + "depositMaximum", + "depositExceedsMaximum", + "agencyFee", + "agencyFeeBasis", + "mandatoryRecurringFees", + "mandatoryRecurringFeeTotal", + "mandatoryMoveInFees", + "mandatoryMoveInFeeTotal", + "knownUpfrontCost", + "exactUpfrontCost", + "upfrontCostIsLowerBound", + "upfrontCostIsExact", + "unknownComponents" + ], + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / schemaVersionAdded value: +{ + "const": "agent-listing.v2", + "type": "string" +} - added
Output schema / properties / listings / items / properties / sourceAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "agencyConfirmedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "agencyListingId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "agencyName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "lastSeenAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "listingUrl": { + "format": "uri", + "type": "string" + }, + "status": { + "enum": [ + "active", + "under_offer", + "unknown" + ], + "type": "string" + }, + "statusBasis": { + "enum": [ + "source_catalog_seen", + "listing_record_active" + ], + "type": "string" + }, + "type": { + "const": "original_agency_listing", + "type": "string" + } + }, + "required": [ + "type", + "agencyName", + "listingUrl", + "agencyListingId", + "lastSeenAt", + "status", + "statusBasis", + "agencyConfirmedAt" + ], + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / transportAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / valueContextAdded value: +{ + "additionalProperties": false, + "properties": { + "fairPrice": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "marketContext": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "priceIntegrity": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "priceIntegrity", + "fairPrice", + "marketContext" + ], + "type": "object" +} - changed
Output schema / properties / listings / items / requiredPrevious value: -[ - "id", - "url", - "title", - "status", - "price", - "currency", - "listingType", - "propertyType", - "city", - "district", - "country", - "beds", - "baths", - "areaSqm", - "energyClass", - "imageUrl", - "agencyName", - "latitude", - "longitude" -]New value: +[ + "schemaVersion", + "id", + "url", + "title", + "status", + "price", + "currency", + "listingType", + "propertyType", + "city", + "district", + "country", + "beds", + "baths", + "areaSqm", + "energyClass", + "imageUrl", + "agencyName", + "source", + "rent", + "availability", + "property", + "location", + "history", + "duplicates", + "amenities", + "fieldProvenance", + "officialScreening", + "propertyChecks", + "transport", + "valueContext", + "missingFields", + "match", + "latitude", + "longitude" +] - added
Output schema / properties / marketMatchingUpperBoundAdded value: +{ + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / matchingCountAdded value: +{ + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / matchingCountKindAdded value: +{ + "enum": [ + "exact", + "lower_bound", + "unavailable" + ], + "type": "string" +} - added
Output schema / properties / nextCursorAdded value: +{ + "type": "null" +} - added
Output schema / properties / returnedCountAdded value: +{ + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / searchExhaustiveAdded value: +{ + "type": "boolean" +}
- Changed
search_for_sale34 fields changed- added
Input schema / properties / balconyAdded value: +{ + "const": true, + "description": "Require a source-confirmed balcony", + "type": "boolean" +} - added
Input schema / properties / elevatorAdded value: +{ + "const": true, + "description": "Require lift/elevator evidence", + "type": "boolean" +} - added
Input schema / properties / furnishedAdded value: +{ + "const": true, + "description": "Require furnished evidence", + "type": "boolean" +} - added
Input schema / properties / gardenAdded value: +{ + "const": true, + "description": "Require a source-confirmed garden", + "type": "boolean" +} - added
Input schema / properties / maxAreaSqmAdded value: +{ + "description": "Maximum area in m²", + "type": "number" +} - added
Input schema / properties / minBathroomsAdded value: +{ + "description": "Minimum number of bathrooms", + "type": "number" +} - added
Input schema / properties / parkingTypeAdded value: +{ + "description": "Require source-backed parking evidence", + "enum": [ + "off_street", + "garage", + "covered" + ], + "type": "string" +} - added
Input schema / properties / petsAllowedAdded value: +{ + "const": true, + "description": "Require pets-allowed evidence", + "type": "boolean" +} - added
Input schema / properties / sortAdded value: +{ + "description": "Sort by relevance, listing date, or asking price", + "enum": [ + "relevance", + "newest", + "price-asc", + "price-desc" + ], + "type": "string" +} - added
Output schema / properties / excludedUnprovenCountAdded value: +{ + "description": "Upstream rows omitted because public facts could not prove every requested hard filter.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / hasMoreAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / listings / items / properties / amenitiesAdded value: +{ + "additionalProperties": false, + "properties": { + "balcony": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "elevator": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "furnished": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "garden": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "parking": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "petsAllowed": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "stepFreeAccess": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "wheelchairAccessible": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "furnished", + "elevator", + "parking", + "balcony", + "garden", + "petsAllowed", + "stepFreeAccess", + "wheelchairAccessible" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / availabilityAdded value: +{ + "additionalProperties": false, + "properties": { + "availableFrom": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "moveInState": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "offerStatus": { + "enum": [ + "available", + "under_offer", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "offerStatus", + "availableFrom", + "moveInState" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / duplicatesAdded value: +{ + "additionalProperties": false, + "properties": { + "confirmedOtherSources": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "confirmedSourceCount": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "confirmedOtherSources", + "confirmedSourceCount" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / fieldProvenanceAdded value: +{ + "additionalProperties": { + "additionalProperties": false, + "properties": { + "method": { + "enum": [ + "source_structured", + "source_text", + "official_dataset", + "calculation", + "manual_review", + "model_extraction", + "model_only", + "unknown" + ], + "type": "string" + }, + "observedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "publisher": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "sourceUrl": { + "anyOf": [ + { + "format": "uri", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "confirmed", + "estimated", + "thin_sample", + "stale", + "context_only", + "conflicted", + "not_collected", + "source_unavailable", + "suppressed" + ], + "type": "string" + } + }, + "required": [ + "status", + "publisher", + "method", + "sourceUrl", + "observedAt" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / listings / items / properties / historyAdded value: +{ + "additionalProperties": false, + "properties": { + "daysListed": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "firstObservedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "firstObservedBasis": { + "const": "source_listing_date_or_chathome_ingest", + "type": "string" + }, + "lastChangedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "priceDropTotalEur": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "firstObservedAt", + "firstObservedBasis", + "daysListed", + "priceDropTotalEur", + "lastChangedAt" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / locationAdded value: +{ + "additionalProperties": false, + "properties": { + "address": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "city": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "confidence": { + "enum": [ + "verified", + "unverified", + "contradicted", + "unknown" + ], + "type": "string" + }, + "district": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "postalCode": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "precision": { + "enum": [ + "exact_address", + "street", + "district", + "commune_only", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "city", + "district", + "address", + "postalCode", + "precision", + "confidence" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / matchAdded value: +{ + "additionalProperties": false, + "properties": { + "allRequiredConstraintsSatisfied": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "reasons": { + "items": { + "type": "string" + }, + "maxItems": 3, + "type": "array" + }, + "requiredConstraints": { + "items": { + "additionalProperties": false, + "properties": { + "actual": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": "string" + }, + "status": { + "enum": [ + "matched", + "not_matched", + "not_verified", + "not_applied" + ], + "type": "string" + }, + "target": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "id", + "status", + "target", + "actual" + ], + "type": "object" + }, + "type": "array" + }, + "resultKind": { + "anyOf": [ + { + "enum": [ + "strict_match", + "partial_match", + "relaxed_alternative" + ], + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "allRequiredConstraintsSatisfied", + "resultKind", + "requiredConstraints", + "reasons" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / missingFieldsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / listings / items / properties / officialScreeningAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / propertyAdded value: +{ + "additionalProperties": false, + "properties": { + "airConditioning": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "colocation": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "completionYear": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "condition": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "constructionYear": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "floor": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "hasFloorplan": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "heatingEnergy": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "heatingType": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "landAreaSqm": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "privateRoomAreaSqm": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "rentByOwner": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "rooms": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "totalFloors": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "rooms", + "floor", + "totalFloors", + "constructionYear", + "completionYear", + "landAreaSqm", + "privateRoomAreaSqm", + "condition", + "heatingType", + "heatingEnergy", + "airConditioning", + "hasFloorplan", + "rentByOwner", + "colocation" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / propertyChecksAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / rentAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "agencyFee": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "agencyFeeBasis": { + "anyOf": [ + { + "enum": [ + "tenant_share", + "total_commission", + "unknown" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "baseMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "chargesIncluded": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "chargesMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "deposit": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "depositExceedsMaximum": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "depositMaximum": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "estimatedMonthlyTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "estimatedMonthlyTotalIsLowerBound": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "estimatedUtilitiesMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "exactUpfrontCost": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "firstChargeAdvance": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "heatingMayBeDoubleCounted": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "indicativeInsuranceMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "knownMonthlyLowerBound": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "knownUpfrontCost": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mandatoryMoveInFeeTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mandatoryMoveInFees": { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "mandatoryRecurringFeeTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mandatoryRecurringFees": { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "monthlyTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "monthlyTotalStatus": { + "anyOf": [ + { + "enum": [ + "known", + "unknown_charges", + "conflicting_charges", + "invalid_price", + "unknown_mandatory_recurring_fees" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "reportedDeposit": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "unknownComponents": { + "items": { + "type": "string" + }, + "type": "array" + }, + "upfrontCostIsExact": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "upfrontCostIsLowerBound": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "baseMonthly", + "chargesMonthly", + "chargesIncluded", + "monthlyTotal", + "monthlyTotalStatus", + "knownMonthlyLowerBound", + "estimatedMonthlyTotal", + "estimatedMonthlyTotalIsLowerBound", + "estimatedUtilitiesMonthly", + "indicativeInsuranceMonthly", + "heatingMayBeDoubleCounted", + "firstChargeAdvance", + "reportedDeposit", + "deposit", + "depositMaximum", + "depositExceedsMaximum", + "agencyFee", + "agencyFeeBasis", + "mandatoryRecurringFees", + "mandatoryRecurringFeeTotal", + "mandatoryMoveInFees", + "mandatoryMoveInFeeTotal", + "knownUpfrontCost", + "exactUpfrontCost", + "upfrontCostIsLowerBound", + "upfrontCostIsExact", + "unknownComponents" + ], + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / schemaVersionAdded value: +{ + "const": "agent-listing.v2", + "type": "string" +} - added
Output schema / properties / listings / items / properties / sourceAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "agencyConfirmedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "agencyListingId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "agencyName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "lastSeenAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "listingUrl": { + "format": "uri", + "type": "string" + }, + "status": { + "enum": [ + "active", + "under_offer", + "unknown" + ], + "type": "string" + }, + "statusBasis": { + "enum": [ + "source_catalog_seen", + "listing_record_active" + ], + "type": "string" + }, + "type": { + "const": "original_agency_listing", + "type": "string" + } + }, + "required": [ + "type", + "agencyName", + "listingUrl", + "agencyListingId", + "lastSeenAt", + "status", + "statusBasis", + "agencyConfirmedAt" + ], + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / transportAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / valueContextAdded value: +{ + "additionalProperties": false, + "properties": { + "fairPrice": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "marketContext": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "priceIntegrity": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "priceIntegrity", + "fairPrice", + "marketContext" + ], + "type": "object" +} - changed
Output schema / properties / listings / items / requiredPrevious value: -[ - "id", - "url", - "title", - "status", - "price", - "currency", - "listingType", - "propertyType", - "city", - "district", - "country", - "beds", - "baths", - "areaSqm", - "energyClass", - "imageUrl", - "agencyName", - "latitude", - "longitude" -]New value: +[ + "schemaVersion", + "id", + "url", + "title", + "status", + "price", + "currency", + "listingType", + "propertyType", + "city", + "district", + "country", + "beds", + "baths", + "areaSqm", + "energyClass", + "imageUrl", + "agencyName", + "source", + "rent", + "availability", + "property", + "location", + "history", + "duplicates", + "amenities", + "fieldProvenance", + "officialScreening", + "propertyChecks", + "transport", + "valueContext", + "missingFields", + "match", + "latitude", + "longitude" +] - added
Output schema / properties / marketMatchingUpperBoundAdded value: +{ + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / matchingCountAdded value: +{ + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / matchingCountKindAdded value: +{ + "enum": [ + "exact", + "lower_bound", + "unavailable" + ], + "type": "string" +} - added
Output schema / properties / nextCursorAdded value: +{ + "type": "null" +} - added
Output schema / properties / returnedCountAdded value: +{ + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / searchExhaustiveAdded value: +{ + "type": "boolean" +}
- Changed
search_rentals34 fields changed- added
Input schema / properties / balconyAdded value: +{ + "const": true, + "description": "Require a source-confirmed balcony", + "type": "boolean" +} - added
Input schema / properties / elevatorAdded value: +{ + "const": true, + "description": "Require positive source evidence of a lift/elevator", + "type": "boolean" +} - added
Input schema / properties / furnishedAdded value: +{ + "const": true, + "description": "Require positive source evidence that the rental is furnished", + "type": "boolean" +} - added
Input schema / properties / gardenAdded value: +{ + "const": true, + "description": "Require a source-confirmed garden", + "type": "boolean" +} - added
Input schema / properties / maxAreaSqmAdded value: +{ + "description": "Maximum area in m²", + "type": "number" +} - added
Input schema / properties / minBathroomsAdded value: +{ + "description": "Minimum number of bathrooms", + "type": "number" +} - added
Input schema / properties / parkingTypeAdded value: +{ + "description": "Require source-backed parking evidence", + "enum": [ + "off_street", + "garage", + "covered" + ], + "type": "string" +} - added
Input schema / properties / petsAllowedAdded value: +{ + "const": true, + "description": "Require positive source evidence that pets are allowed", + "type": "boolean" +} - added
Input schema / properties / sortAdded value: +{ + "description": "Sort the proven result set. price-asc means base rent, not all-in monthly cost.", + "enum": [ + "relevance", + "newest", + "price-asc", + "price-desc" + ], + "type": "string" +} - added
Output schema / properties / excludedUnprovenCountAdded value: +{ + "description": "Upstream rows omitted because public facts could not prove every requested hard filter.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / hasMoreAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / listings / items / properties / amenitiesAdded value: +{ + "additionalProperties": false, + "properties": { + "balcony": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "elevator": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "furnished": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "garden": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "parking": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "petsAllowed": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "stepFreeAccess": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "wheelchairAccessible": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "furnished", + "elevator", + "parking", + "balcony", + "garden", + "petsAllowed", + "stepFreeAccess", + "wheelchairAccessible" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / availabilityAdded value: +{ + "additionalProperties": false, + "properties": { + "availableFrom": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "moveInState": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "offerStatus": { + "enum": [ + "available", + "under_offer", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "offerStatus", + "availableFrom", + "moveInState" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / duplicatesAdded value: +{ + "additionalProperties": false, + "properties": { + "confirmedOtherSources": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "confirmedSourceCount": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "confirmedOtherSources", + "confirmedSourceCount" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / fieldProvenanceAdded value: +{ + "additionalProperties": { + "additionalProperties": false, + "properties": { + "method": { + "enum": [ + "source_structured", + "source_text", + "official_dataset", + "calculation", + "manual_review", + "model_extraction", + "model_only", + "unknown" + ], + "type": "string" + }, + "observedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "publisher": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "sourceUrl": { + "anyOf": [ + { + "format": "uri", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "confirmed", + "estimated", + "thin_sample", + "stale", + "context_only", + "conflicted", + "not_collected", + "source_unavailable", + "suppressed" + ], + "type": "string" + } + }, + "required": [ + "status", + "publisher", + "method", + "sourceUrl", + "observedAt" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / listings / items / properties / historyAdded value: +{ + "additionalProperties": false, + "properties": { + "daysListed": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "firstObservedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "firstObservedBasis": { + "const": "source_listing_date_or_chathome_ingest", + "type": "string" + }, + "lastChangedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "priceDropTotalEur": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "firstObservedAt", + "firstObservedBasis", + "daysListed", + "priceDropTotalEur", + "lastChangedAt" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / locationAdded value: +{ + "additionalProperties": false, + "properties": { + "address": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "city": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "confidence": { + "enum": [ + "verified", + "unverified", + "contradicted", + "unknown" + ], + "type": "string" + }, + "district": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "postalCode": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "precision": { + "enum": [ + "exact_address", + "street", + "district", + "commune_only", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "city", + "district", + "address", + "postalCode", + "precision", + "confidence" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / matchAdded value: +{ + "additionalProperties": false, + "properties": { + "allRequiredConstraintsSatisfied": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "reasons": { + "items": { + "type": "string" + }, + "maxItems": 3, + "type": "array" + }, + "requiredConstraints": { + "items": { + "additionalProperties": false, + "properties": { + "actual": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": "string" + }, + "status": { + "enum": [ + "matched", + "not_matched", + "not_verified", + "not_applied" + ], + "type": "string" + }, + "target": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "id", + "status", + "target", + "actual" + ], + "type": "object" + }, + "type": "array" + }, + "resultKind": { + "anyOf": [ + { + "enum": [ + "strict_match", + "partial_match", + "relaxed_alternative" + ], + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "allRequiredConstraintsSatisfied", + "resultKind", + "requiredConstraints", + "reasons" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / missingFieldsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / listings / items / properties / officialScreeningAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / propertyAdded value: +{ + "additionalProperties": false, + "properties": { + "airConditioning": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "colocation": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "completionYear": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "condition": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "constructionYear": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "floor": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "hasFloorplan": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "heatingEnergy": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "heatingType": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "landAreaSqm": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "privateRoomAreaSqm": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "rentByOwner": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "rooms": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "totalFloors": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "rooms", + "floor", + "totalFloors", + "constructionYear", + "completionYear", + "landAreaSqm", + "privateRoomAreaSqm", + "condition", + "heatingType", + "heatingEnergy", + "airConditioning", + "hasFloorplan", + "rentByOwner", + "colocation" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / propertyChecksAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / rentAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "agencyFee": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "agencyFeeBasis": { + "anyOf": [ + { + "enum": [ + "tenant_share", + "total_commission", + "unknown" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "baseMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "chargesIncluded": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "chargesMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "deposit": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "depositExceedsMaximum": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "depositMaximum": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "estimatedMonthlyTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "estimatedMonthlyTotalIsLowerBound": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "estimatedUtilitiesMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "exactUpfrontCost": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "firstChargeAdvance": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "heatingMayBeDoubleCounted": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "indicativeInsuranceMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "knownMonthlyLowerBound": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "knownUpfrontCost": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mandatoryMoveInFeeTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mandatoryMoveInFees": { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "mandatoryRecurringFeeTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mandatoryRecurringFees": { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "monthlyTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "monthlyTotalStatus": { + "anyOf": [ + { + "enum": [ + "known", + "unknown_charges", + "conflicting_charges", + "invalid_price", + "unknown_mandatory_recurring_fees" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "reportedDeposit": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "unknownComponents": { + "items": { + "type": "string" + }, + "type": "array" + }, + "upfrontCostIsExact": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "upfrontCostIsLowerBound": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "baseMonthly", + "chargesMonthly", + "chargesIncluded", + "monthlyTotal", + "monthlyTotalStatus", + "knownMonthlyLowerBound", + "estimatedMonthlyTotal", + "estimatedMonthlyTotalIsLowerBound", + "estimatedUtilitiesMonthly", + "indicativeInsuranceMonthly", + "heatingMayBeDoubleCounted", + "firstChargeAdvance", + "reportedDeposit", + "deposit", + "depositMaximum", + "depositExceedsMaximum", + "agencyFee", + "agencyFeeBasis", + "mandatoryRecurringFees", + "mandatoryRecurringFeeTotal", + "mandatoryMoveInFees", + "mandatoryMoveInFeeTotal", + "knownUpfrontCost", + "exactUpfrontCost", + "upfrontCostIsLowerBound", + "upfrontCostIsExact", + "unknownComponents" + ], + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / schemaVersionAdded value: +{ + "const": "agent-listing.v2", + "type": "string" +} - added
Output schema / properties / listings / items / properties / sourceAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "agencyConfirmedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "agencyListingId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "agencyName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "lastSeenAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "listingUrl": { + "format": "uri", + "type": "string" + }, + "status": { + "enum": [ + "active", + "under_offer", + "unknown" + ], + "type": "string" + }, + "statusBasis": { + "enum": [ + "source_catalog_seen", + "listing_record_active" + ], + "type": "string" + }, + "type": { + "const": "original_agency_listing", + "type": "string" + } + }, + "required": [ + "type", + "agencyName", + "listingUrl", + "agencyListingId", + "lastSeenAt", + "status", + "statusBasis", + "agencyConfirmedAt" + ], + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / transportAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / valueContextAdded value: +{ + "additionalProperties": false, + "properties": { + "fairPrice": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "marketContext": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "priceIntegrity": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "priceIntegrity", + "fairPrice", + "marketContext" + ], + "type": "object" +} - changed
Output schema / properties / listings / items / requiredPrevious value: -[ - "id", - "url", - "title", - "status", - "price", - "currency", - "listingType", - "propertyType", - "city", - "district", - "country", - "beds", - "baths", - "areaSqm", - "energyClass", - "imageUrl", - "agencyName", - "latitude", - "longitude" -]New value: +[ + "schemaVersion", + "id", + "url", + "title", + "status", + "price", + "currency", + "listingType", + "propertyType", + "city", + "district", + "country", + "beds", + "baths", + "areaSqm", + "energyClass", + "imageUrl", + "agencyName", + "source", + "rent", + "availability", + "property", + "location", + "history", + "duplicates", + "amenities", + "fieldProvenance", + "officialScreening", + "propertyChecks", + "transport", + "valueContext", + "missingFields", + "match", + "latitude", + "longitude" +] - added
Output schema / properties / marketMatchingUpperBoundAdded value: +{ + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / matchingCountAdded value: +{ + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / matchingCountKindAdded value: +{ + "enum": [ + "exact", + "lower_bound", + "unavailable" + ], + "type": "string" +} - added
Output schema / properties / nextCursorAdded value: +{ + "type": "null" +} - added
Output schema / properties / returnedCountAdded value: +{ + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / searchExhaustiveAdded value: +{ + "type": "boolean" +}
- Changed
search_vibe25 fields changed- added
Output schema / properties / excludedUnprovenCountAdded value: +{ + "description": "Upstream rows omitted because public facts could not prove every requested hard filter.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / hasMoreAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / listings / items / properties / amenitiesAdded value: +{ + "additionalProperties": false, + "properties": { + "balcony": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "elevator": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "furnished": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "garden": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "parking": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "petsAllowed": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "stepFreeAccess": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "wheelchairAccessible": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "furnished", + "elevator", + "parking", + "balcony", + "garden", + "petsAllowed", + "stepFreeAccess", + "wheelchairAccessible" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / availabilityAdded value: +{ + "additionalProperties": false, + "properties": { + "availableFrom": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "moveInState": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "offerStatus": { + "enum": [ + "available", + "under_offer", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "offerStatus", + "availableFrom", + "moveInState" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / duplicatesAdded value: +{ + "additionalProperties": false, + "properties": { + "confirmedOtherSources": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "confirmedSourceCount": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "confirmedOtherSources", + "confirmedSourceCount" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / fieldProvenanceAdded value: +{ + "additionalProperties": { + "additionalProperties": false, + "properties": { + "method": { + "enum": [ + "source_structured", + "source_text", + "official_dataset", + "calculation", + "manual_review", + "model_extraction", + "model_only", + "unknown" + ], + "type": "string" + }, + "observedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "publisher": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "sourceUrl": { + "anyOf": [ + { + "format": "uri", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "confirmed", + "estimated", + "thin_sample", + "stale", + "context_only", + "conflicted", + "not_collected", + "source_unavailable", + "suppressed" + ], + "type": "string" + } + }, + "required": [ + "status", + "publisher", + "method", + "sourceUrl", + "observedAt" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / listings / items / properties / historyAdded value: +{ + "additionalProperties": false, + "properties": { + "daysListed": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "firstObservedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "firstObservedBasis": { + "const": "source_listing_date_or_chathome_ingest", + "type": "string" + }, + "lastChangedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "priceDropTotalEur": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "firstObservedAt", + "firstObservedBasis", + "daysListed", + "priceDropTotalEur", + "lastChangedAt" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / locationAdded value: +{ + "additionalProperties": false, + "properties": { + "address": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "city": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "confidence": { + "enum": [ + "verified", + "unverified", + "contradicted", + "unknown" + ], + "type": "string" + }, + "district": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "postalCode": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "precision": { + "enum": [ + "exact_address", + "street", + "district", + "commune_only", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "city", + "district", + "address", + "postalCode", + "precision", + "confidence" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / matchAdded value: +{ + "additionalProperties": false, + "properties": { + "allRequiredConstraintsSatisfied": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "reasons": { + "items": { + "type": "string" + }, + "maxItems": 3, + "type": "array" + }, + "requiredConstraints": { + "items": { + "additionalProperties": false, + "properties": { + "actual": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": "string" + }, + "status": { + "enum": [ + "matched", + "not_matched", + "not_verified", + "not_applied" + ], + "type": "string" + }, + "target": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "id", + "status", + "target", + "actual" + ], + "type": "object" + }, + "type": "array" + }, + "resultKind": { + "anyOf": [ + { + "enum": [ + "strict_match", + "partial_match", + "relaxed_alternative" + ], + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "allRequiredConstraintsSatisfied", + "resultKind", + "requiredConstraints", + "reasons" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / missingFieldsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / listings / items / properties / officialScreeningAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / propertyAdded value: +{ + "additionalProperties": false, + "properties": { + "airConditioning": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "colocation": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "completionYear": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "condition": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "constructionYear": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "floor": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "hasFloorplan": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "heatingEnergy": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "heatingType": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "landAreaSqm": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "privateRoomAreaSqm": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "rentByOwner": { + "anyOf": [ + { + "const": true, + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "rooms": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "totalFloors": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "rooms", + "floor", + "totalFloors", + "constructionYear", + "completionYear", + "landAreaSqm", + "privateRoomAreaSqm", + "condition", + "heatingType", + "heatingEnergy", + "airConditioning", + "hasFloorplan", + "rentByOwner", + "colocation" + ], + "type": "object" +} - added
Output schema / properties / listings / items / properties / propertyChecksAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / rentAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "agencyFee": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "agencyFeeBasis": { + "anyOf": [ + { + "enum": [ + "tenant_share", + "total_commission", + "unknown" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "baseMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "chargesIncluded": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "chargesMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "deposit": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "depositExceedsMaximum": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "depositMaximum": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "estimatedMonthlyTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "estimatedMonthlyTotalIsLowerBound": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "estimatedUtilitiesMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "exactUpfrontCost": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "firstChargeAdvance": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "heatingMayBeDoubleCounted": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "indicativeInsuranceMonthly": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "knownMonthlyLowerBound": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "knownUpfrontCost": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mandatoryMoveInFeeTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mandatoryMoveInFees": { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "mandatoryRecurringFeeTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "mandatoryRecurringFees": { + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "monthlyTotal": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "monthlyTotalStatus": { + "anyOf": [ + { + "enum": [ + "known", + "unknown_charges", + "conflicting_charges", + "invalid_price", + "unknown_mandatory_recurring_fees" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "reportedDeposit": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "unknownComponents": { + "items": { + "type": "string" + }, + "type": "array" + }, + "upfrontCostIsExact": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "upfrontCostIsLowerBound": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "baseMonthly", + "chargesMonthly", + "chargesIncluded", + "monthlyTotal", + "monthlyTotalStatus", + "knownMonthlyLowerBound", + "estimatedMonthlyTotal", + "estimatedMonthlyTotalIsLowerBound", + "estimatedUtilitiesMonthly", + "indicativeInsuranceMonthly", + "heatingMayBeDoubleCounted", + "firstChargeAdvance", + "reportedDeposit", + "deposit", + "depositMaximum", + "depositExceedsMaximum", + "agencyFee", + "agencyFeeBasis", + "mandatoryRecurringFees", + "mandatoryRecurringFeeTotal", + "mandatoryMoveInFees", + "mandatoryMoveInFeeTotal", + "knownUpfrontCost", + "exactUpfrontCost", + "upfrontCostIsLowerBound", + "upfrontCostIsExact", + "unknownComponents" + ], + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / schemaVersionAdded value: +{ + "const": "agent-listing.v2", + "type": "string" +} - added
Output schema / properties / listings / items / properties / sourceAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "agencyConfirmedAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "agencyListingId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "agencyName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "lastSeenAt": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "listingUrl": { + "format": "uri", + "type": "string" + }, + "status": { + "enum": [ + "active", + "under_offer", + "unknown" + ], + "type": "string" + }, + "statusBasis": { + "enum": [ + "source_catalog_seen", + "listing_record_active" + ], + "type": "string" + }, + "type": { + "const": "original_agency_listing", + "type": "string" + } + }, + "required": [ + "type", + "agencyName", + "listingUrl", + "agencyListingId", + "lastSeenAt", + "status", + "statusBasis", + "agencyConfirmedAt" + ], + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / transportAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / valueContextAdded value: +{ + "additionalProperties": false, + "properties": { + "fairPrice": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "marketContext": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "priceIntegrity": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "priceIntegrity", + "fairPrice", + "marketContext" + ], + "type": "object" +} - changed
Output schema / properties / listings / items / requiredPrevious value: -[ - "id", - "url", - "title", - "status", - "price", - "currency", - "listingType", - "propertyType", - "city", - "district", - "country", - "beds", - "baths", - "areaSqm", - "energyClass", - "imageUrl", - "agencyName", - "latitude", - "longitude" -]New value: +[ + "schemaVersion", + "id", + "url", + "title", + "status", + "price", + "currency", + "listingType", + "propertyType", + "city", + "district", + "country", + "beds", + "baths", + "areaSqm", + "energyClass", + "imageUrl", + "agencyName", + "source", + "rent", + "availability", + "property", + "location", + "history", + "duplicates", + "amenities", + "fieldProvenance", + "officialScreening", + "propertyChecks", + "transport", + "valueContext", + "missingFields", + "match", + "latitude", + "longitude" +] - added
Output schema / properties / marketMatchingUpperBoundAdded value: +{ + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / matchingCountAdded value: +{ + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / matchingCountKindAdded value: +{ + "enum": [ + "exact", + "lower_bound", + "unavailable" + ], + "type": "string" +} - added
Output schema / properties / nextCursorAdded value: +{ + "type": "null" +} - added
Output schema / properties / returnedCountAdded value: +{ + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / searchExhaustiveAdded value: +{ + "type": "boolean" +}
6 tool updates
- Changed
get_listing28 fields changed- added
Output schema / properties / listing / properties / agencyNameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / areaSqmAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / bathsAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / bedsAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / chargesAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / cityAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / countryAdded value: +{ + "anyOf": [ + { + "enum": [ + "LU", + "FR", + "BE", + "DE" + ], + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / currencyAdded value: +{ + "const": "EUR", + "type": "string" +} - added
Output schema / properties / listing / properties / descriptionAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / districtAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / energyClassAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / featuresAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / listing / properties / hasSourceCheckedFactsAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / listing / properties / idAdded value: +{ + "type": "string" +} - added
Output schema / properties / listing / properties / imageUrlAdded value: +{ + "anyOf": [ + { + "format": "uri", + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / latitudeAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / listingTypeAdded value: +{ + "enum": [ + "rent", + "sale" + ], + "type": "string" +} - added
Output schema / properties / listing / properties / longitudeAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / matchReasonsAdded value: +{ + "items": { + "type": "string" + }, + "maxItems": 3, + "type": "array" +} - added
Output schema / properties / listing / properties / photoUrlsAdded value: +{ + "items": { + "format": "uri", + "type": "string" + }, + "maxItems": 5, + "type": "array" +} - added
Output schema / properties / listing / properties / priceAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / pricePerSqmAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / propertyTypeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / scoreAdded value: +{ + "maximum": 100, + "minimum": 0, + "type": "number" +} - added
Output schema / properties / listing / properties / statusAdded value: +{ + "const": "active", + "type": "string" +} - added
Output schema / properties / listing / properties / titleAdded value: +{ + "type": "string" +} - added
Output schema / properties / listing / properties / urlAdded value: +{ + "format": "uri", + "type": "string" +} - added
Output schema / properties / listing / requiredAdded value: +[ + "id", + "url", + "title", + "status", + "price", + "currency", + "listingType", + "propertyType", + "city", + "district", + "country", + "beds", + "baths", + "areaSqm", + "energyClass", + "imageUrl", + "agencyName", + "latitude", + "longitude" +]
- Changed
get_listing_truth28 fields changed- added
Output schema / properties / listing / properties / agencyNameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / areaSqmAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / bathsAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / bedsAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / chargesAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / cityAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / countryAdded value: +{ + "anyOf": [ + { + "enum": [ + "LU", + "FR", + "BE", + "DE" + ], + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / currencyAdded value: +{ + "const": "EUR", + "type": "string" +} - added
Output schema / properties / listing / properties / descriptionAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / districtAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / energyClassAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / featuresAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / listing / properties / hasSourceCheckedFactsAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / listing / properties / idAdded value: +{ + "type": "string" +} - added
Output schema / properties / listing / properties / imageUrlAdded value: +{ + "anyOf": [ + { + "format": "uri", + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / latitudeAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / listingTypeAdded value: +{ + "enum": [ + "rent", + "sale" + ], + "type": "string" +} - added
Output schema / properties / listing / properties / longitudeAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / matchReasonsAdded value: +{ + "items": { + "type": "string" + }, + "maxItems": 3, + "type": "array" +} - added
Output schema / properties / listing / properties / photoUrlsAdded value: +{ + "items": { + "format": "uri", + "type": "string" + }, + "maxItems": 5, + "type": "array" +} - added
Output schema / properties / listing / properties / priceAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / pricePerSqmAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / propertyTypeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listing / properties / scoreAdded value: +{ + "maximum": 100, + "minimum": 0, + "type": "number" +} - added
Output schema / properties / listing / properties / statusAdded value: +{ + "const": "active", + "type": "string" +} - added
Output schema / properties / listing / properties / titleAdded value: +{ + "type": "string" +} - added
Output schema / properties / listing / properties / urlAdded value: +{ + "format": "uri", + "type": "string" +} - added
Output schema / properties / listing / requiredAdded value: +[ + "id", + "url", + "title", + "status", + "price", + "currency", + "listingType", + "propertyType", + "city", + "district", + "country", + "beds", + "baths", + "areaSqm", + "energyClass", + "imageUrl", + "agencyName", + "latitude", + "longitude" +]
- Changed
render_listing_cards34 fields changed- added
Output schema / properties / countKindAdded value: +{ + "const": "returned", + "type": "string" +} - added
Output schema / properties / listings / items / properties / agencyNameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / areaSqmAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / bathsAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / bedsAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / chargesAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / cityAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / countryAdded value: +{ + "anyOf": [ + { + "enum": [ + "LU", + "FR", + "BE", + "DE" + ], + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / currencyAdded value: +{ + "const": "EUR", + "type": "string" +} - added
Output schema / properties / listings / items / properties / descriptionAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / districtAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / energyClassAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / featuresAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / listings / items / properties / hasSourceCheckedFactsAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / listings / items / properties / idAdded value: +{ + "type": "string" +} - added
Output schema / properties / listings / items / properties / imageUrlAdded value: +{ + "anyOf": [ + { + "format": "uri", + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / latitudeAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / listingTypeAdded value: +{ + "enum": [ + "rent", + "sale" + ], + "type": "string" +} - added
Output schema / properties / listings / items / properties / longitudeAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / matchReasonsAdded value: +{ + "items": { + "type": "string" + }, + "maxItems": 3, + "type": "array" +} - added
Output schema / properties / listings / items / properties / photoUrlsAdded value: +{ + "items": { + "format": "uri", + "type": "string" + }, + "maxItems": 5, + "type": "array" +} - added
Output schema / properties / listings / items / properties / priceAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / pricePerSqmAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / propertyTypeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / scoreAdded value: +{ + "maximum": 100, + "minimum": 0, + "type": "number" +} - added
Output schema / properties / listings / items / properties / statusAdded value: +{ + "const": "active", + "type": "string" +} - added
Output schema / properties / listings / items / properties / titleAdded value: +{ + "type": "string" +} - added
Output schema / properties / listings / items / properties / urlAdded value: +{ + "format": "uri", + "type": "string" +} - added
Output schema / properties / listings / items / requiredAdded value: +[ + "id", + "url", + "title", + "status", + "price", + "currency", + "listingType", + "propertyType", + "city", + "district", + "country", + "beds", + "baths", + "areaSqm", + "energyClass", + "imageUrl", + "agencyName", + "latitude", + "longitude" +] - added
Output schema / properties / rankingAdded value: +{ + "additionalProperties": false, + "properties": { + "planFingerprint": { + "type": "string" + }, + "probability": { + "const": false, + "type": "boolean" + }, + "scoreKind": { + "const": "request_fit", + "type": "string" + }, + "status": { + "enum": [ + "available", + "degraded" + ], + "type": "string" + } + }, + "required": [ + "status", + "scoreKind", + "probability" + ], + "type": "object" +} - added
Output schema / properties / total / descriptionAdded value: +"Exact number of listing objects returned in this response; not the number of matches in the market." - added
Output schema / properties / total / maximumAdded value: +9007199254740991 - added
Output schema / properties / total / minimumAdded value: +0 - changed
Output schema / properties / total / typePrevious value: -"number"New value: +"integer"
- Changed
search_for_sale34 fields changed- added
Output schema / properties / countKindAdded value: +{ + "const": "returned", + "type": "string" +} - added
Output schema / properties / listings / items / properties / agencyNameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / areaSqmAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / bathsAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / bedsAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / chargesAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / cityAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / countryAdded value: +{ + "anyOf": [ + { + "enum": [ + "LU", + "FR", + "BE", + "DE" + ], + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / currencyAdded value: +{ + "const": "EUR", + "type": "string" +} - added
Output schema / properties / listings / items / properties / descriptionAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / districtAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / energyClassAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / featuresAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / listings / items / properties / hasSourceCheckedFactsAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / listings / items / properties / idAdded value: +{ + "type": "string" +} - added
Output schema / properties / listings / items / properties / imageUrlAdded value: +{ + "anyOf": [ + { + "format": "uri", + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / latitudeAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / listingTypeAdded value: +{ + "enum": [ + "rent", + "sale" + ], + "type": "string" +} - added
Output schema / properties / listings / items / properties / longitudeAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / matchReasonsAdded value: +{ + "items": { + "type": "string" + }, + "maxItems": 3, + "type": "array" +} - added
Output schema / properties / listings / items / properties / photoUrlsAdded value: +{ + "items": { + "format": "uri", + "type": "string" + }, + "maxItems": 5, + "type": "array" +} - added
Output schema / properties / listings / items / properties / priceAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / pricePerSqmAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / propertyTypeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / scoreAdded value: +{ + "maximum": 100, + "minimum": 0, + "type": "number" +} - added
Output schema / properties / listings / items / properties / statusAdded value: +{ + "const": "active", + "type": "string" +} - added
Output schema / properties / listings / items / properties / titleAdded value: +{ + "type": "string" +} - added
Output schema / properties / listings / items / properties / urlAdded value: +{ + "format": "uri", + "type": "string" +} - added
Output schema / properties / listings / items / requiredAdded value: +[ + "id", + "url", + "title", + "status", + "price", + "currency", + "listingType", + "propertyType", + "city", + "district", + "country", + "beds", + "baths", + "areaSqm", + "energyClass", + "imageUrl", + "agencyName", + "latitude", + "longitude" +] - added
Output schema / properties / rankingAdded value: +{ + "additionalProperties": false, + "properties": { + "planFingerprint": { + "type": "string" + }, + "probability": { + "const": false, + "type": "boolean" + }, + "scoreKind": { + "const": "request_fit", + "type": "string" + }, + "status": { + "enum": [ + "available", + "degraded" + ], + "type": "string" + } + }, + "required": [ + "status", + "scoreKind", + "probability" + ], + "type": "object" +} - added
Output schema / properties / total / descriptionAdded value: +"Exact number of listing objects returned in this response; not the number of matches in the market." - added
Output schema / properties / total / maximumAdded value: +9007199254740991 - added
Output schema / properties / total / minimumAdded value: +0 - changed
Output schema / properties / total / typePrevious value: -"number"New value: +"integer"
- Changed
search_rentals34 fields changed- added
Output schema / properties / countKindAdded value: +{ + "const": "returned", + "type": "string" +} - added
Output schema / properties / listings / items / properties / agencyNameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / areaSqmAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / bathsAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / bedsAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / chargesAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / cityAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / countryAdded value: +{ + "anyOf": [ + { + "enum": [ + "LU", + "FR", + "BE", + "DE" + ], + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / currencyAdded value: +{ + "const": "EUR", + "type": "string" +} - added
Output schema / properties / listings / items / properties / descriptionAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / districtAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / energyClassAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / featuresAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / listings / items / properties / hasSourceCheckedFactsAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / listings / items / properties / idAdded value: +{ + "type": "string" +} - added
Output schema / properties / listings / items / properties / imageUrlAdded value: +{ + "anyOf": [ + { + "format": "uri", + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / latitudeAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / listingTypeAdded value: +{ + "enum": [ + "rent", + "sale" + ], + "type": "string" +} - added
Output schema / properties / listings / items / properties / longitudeAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / matchReasonsAdded value: +{ + "items": { + "type": "string" + }, + "maxItems": 3, + "type": "array" +} - added
Output schema / properties / listings / items / properties / photoUrlsAdded value: +{ + "items": { + "format": "uri", + "type": "string" + }, + "maxItems": 5, + "type": "array" +} - added
Output schema / properties / listings / items / properties / priceAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / pricePerSqmAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / propertyTypeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / scoreAdded value: +{ + "maximum": 100, + "minimum": 0, + "type": "number" +} - added
Output schema / properties / listings / items / properties / statusAdded value: +{ + "const": "active", + "type": "string" +} - added
Output schema / properties / listings / items / properties / titleAdded value: +{ + "type": "string" +} - added
Output schema / properties / listings / items / properties / urlAdded value: +{ + "format": "uri", + "type": "string" +} - added
Output schema / properties / listings / items / requiredAdded value: +[ + "id", + "url", + "title", + "status", + "price", + "currency", + "listingType", + "propertyType", + "city", + "district", + "country", + "beds", + "baths", + "areaSqm", + "energyClass", + "imageUrl", + "agencyName", + "latitude", + "longitude" +] - added
Output schema / properties / rankingAdded value: +{ + "additionalProperties": false, + "properties": { + "planFingerprint": { + "type": "string" + }, + "probability": { + "const": false, + "type": "boolean" + }, + "scoreKind": { + "const": "request_fit", + "type": "string" + }, + "status": { + "enum": [ + "available", + "degraded" + ], + "type": "string" + } + }, + "required": [ + "status", + "scoreKind", + "probability" + ], + "type": "object" +} - added
Output schema / properties / total / descriptionAdded value: +"Exact number of listing objects returned in this response; not the number of matches in the market." - added
Output schema / properties / total / maximumAdded value: +9007199254740991 - added
Output schema / properties / total / minimumAdded value: +0 - changed
Output schema / properties / total / typePrevious value: -"number"New value: +"integer"
- Changed
search_vibe34 fields changed- added
Output schema / properties / countKindAdded value: +{ + "const": "returned", + "type": "string" +} - added
Output schema / properties / listings / items / properties / agencyNameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / areaSqmAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / bathsAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / bedsAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / chargesAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / cityAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / countryAdded value: +{ + "anyOf": [ + { + "enum": [ + "LU", + "FR", + "BE", + "DE" + ], + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / currencyAdded value: +{ + "const": "EUR", + "type": "string" +} - added
Output schema / properties / listings / items / properties / descriptionAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / districtAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / energyClassAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / featuresAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / listings / items / properties / hasSourceCheckedFactsAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / listings / items / properties / idAdded value: +{ + "type": "string" +} - added
Output schema / properties / listings / items / properties / imageUrlAdded value: +{ + "anyOf": [ + { + "format": "uri", + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / latitudeAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / listingTypeAdded value: +{ + "enum": [ + "rent", + "sale" + ], + "type": "string" +} - added
Output schema / properties / listings / items / properties / longitudeAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / matchReasonsAdded value: +{ + "items": { + "type": "string" + }, + "maxItems": 3, + "type": "array" +} - added
Output schema / properties / listings / items / properties / photoUrlsAdded value: +{ + "items": { + "format": "uri", + "type": "string" + }, + "maxItems": 5, + "type": "array" +} - added
Output schema / properties / listings / items / properties / priceAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / pricePerSqmAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / propertyTypeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / listings / items / properties / scoreAdded value: +{ + "maximum": 100, + "minimum": 0, + "type": "number" +} - added
Output schema / properties / listings / items / properties / statusAdded value: +{ + "const": "active", + "type": "string" +} - added
Output schema / properties / listings / items / properties / titleAdded value: +{ + "type": "string" +} - added
Output schema / properties / listings / items / properties / urlAdded value: +{ + "format": "uri", + "type": "string" +} - added
Output schema / properties / listings / items / requiredAdded value: +[ + "id", + "url", + "title", + "status", + "price", + "currency", + "listingType", + "propertyType", + "city", + "district", + "country", + "beds", + "baths", + "areaSqm", + "energyClass", + "imageUrl", + "agencyName", + "latitude", + "longitude" +] - added
Output schema / properties / rankingAdded value: +{ + "additionalProperties": false, + "properties": { + "planFingerprint": { + "type": "string" + }, + "probability": { + "const": false, + "type": "boolean" + }, + "scoreKind": { + "const": "request_fit", + "type": "string" + }, + "status": { + "enum": [ + "available", + "degraded" + ], + "type": "string" + } + }, + "required": [ + "status", + "scoreKind", + "probability" + ], + "type": "object" +} - added
Output schema / properties / total / descriptionAdded value: +"Exact number of listing objects returned in this response; not the number of matches in the market." - added
Output schema / properties / total / maximumAdded value: +9007199254740991 - added
Output schema / properties / total / minimumAdded value: +0 - changed
Output schema / properties / total / typePrevious value: -"number"New value: +"integer"
4 tool updates
- Changed
render_listing_cards1 field changed- added
Output schema / properties / coverageNoticeAdded value: +{ + "additionalProperties": false, + "properties": { + "reason": { + "const": "outside_luxembourg", + "type": "string" + } + }, + "required": [ + "reason" + ], + "type": "object" +}
- Changed
search_for_sale1 field changed- added
Output schema / properties / coverageNoticeAdded value: +{ + "additionalProperties": false, + "properties": { + "reason": { + "const": "outside_luxembourg", + "type": "string" + } + }, + "required": [ + "reason" + ], + "type": "object" +}
- Changed
search_rentals1 field changed- added
Output schema / properties / coverageNoticeAdded value: +{ + "additionalProperties": false, + "properties": { + "reason": { + "const": "outside_luxembourg", + "type": "string" + } + }, + "required": [ + "reason" + ], + "type": "object" +}
- Changed
search_vibe1 field changed- added
Output schema / properties / coverageNoticeAdded value: +{ + "additionalProperties": false, + "properties": { + "reason": { + "const": "outside_luxembourg", + "type": "string" + } + }, + "required": [ + "reason" + ], + "type": "object" +}
14 tool updates
- First observed
analyze_lease - First observed
get_affordability - First observed
get_commute_times - First observed
get_inquiry_status - First observed
get_listing - First observed
get_listing_truth - First observed
get_market_context - First observed
get_price_estimate - First observed
get_town_agencies - First observed
render_listing_cards - First observed
search_for_sale - First observed
search_rentals - First observed
search_vibe - First observed
submit_inquiry
Related MCP Connectors
AI-native real estate discovery with structured property search and market intelligence.
Portugal real estate search — 224,000+ listings, commute times and market prices
UK area & property intelligence for AI agents: reports, EPC, comparables, with source provenance.
Search and manage Paraguay & LatAm real estate from any AI assistant.
Related MCP Servers
- FlicenseNot gradedqualityFmaintenanceFrench real estate data platform for AI agents. Identifies property owners likely to sell and tracks behavioral signals on active listings. Coverage: metropolitan France.-

Yatmo MCP serverofficial
AlicenseNot gradedqualityCmaintenanceEnables AI assistants and agents to query real neighbourhood data around a property, including nearest schools, nurseries, supermarkets, public transport, train stations, motorway access, distances with travel times, and quotable summaries across 25 countries.MIT- AlicenseAqualityDmaintenancePhilippine real estate data for AI agents — search verified listings, calculate transfer costs, and get accurate legal information via lupaph.com.643 npmMIT
- AlicenseNot gradedqualityCmaintenanceAccess 17M+ geocoded French property transactions (DVF), 22M+ DPE energy ratings, and 20M+ building records via MCP or REST API. Search transactions, market stats, comparables, price trends, rental yield, flip detection, and more.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.