chathome.lu — Luxembourg Real Estate
Server Details
Luxembourg real estate for AI agents: property search, price estimates, market data, commutes.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
TDQS
Scored across 15 tools
Most tools target clearly distinct workflows: searching, listing details, market context, affordability, lease analysis, and inquiries. The only mild ambiguity is between get_listing and get_listing_truth, which both describe views of the same listing page but are differentiated by their trust-layer emphasis.
All tool names follow a consistent snake_case verb_noun pattern, such as search_for_sale, get_market_context, compare_listings, and submit_inquiry. The naming clearly signals both action and resource, with no mixed casing or vague generic verbs.
Fifteen tools is at the upper end of the ideal range but each tool supports a distinct real-estate workflow, from search and comparison to affordability, commute, lease analysis, and inquiries. The count feels well-scoped for a full-featured property platform rather than bloated.
The tool surface covers the major consumer real-estate lifecycle: searching sale and rental inventory, natural-language search, listing detail and trust views, comparison, market context, price estimation, affordability, commute analysis, lease review, and inquiries. There are no obvious dead ends or critical missing operations for the apparent purpose.
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 declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds substantial behavioral context: it normalizes multiple listings into one response and explicitly handles known/estimated costs, availability, property facts, official checks, commute summaries, provenance, freshness, duplicates, constraints, and unknown fields.
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 core behavior is front-loaded and the description is a single sentence with no filler. The trailing list of output fields is long but each item contributes useful behavioral signal.
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 description covers input bounds, output shape, response normalization, and edge-case handling like explicit unknown fields. An output schema exists, so return values do not need to be explained further; the description is complete enough for correct tool selection and invocation.
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 baseline is 3. The description aligns with the ids parameter by mentioning two to eight listings, but it adds no meaningful detail about locale or parameter formatting beyond what the schema already provides.
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 a specific verb ('Compare'), a precise resource ('listings'), and a bounded scope ('two to eight'). It also identifies the normalized AgentListing v2 response, which clearly differentiates it from single-listing tools like 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 tool is clearly positioned for comparing two to eight listings, giving an agent a clear trigger condition. However, it does not explicitly name alternatives or state when not to use it, such as pointing to get_listing for a single listing.
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 DetailsARead-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, 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 | |
| listingPage | Yes | |
| listingPageContext | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds meaningful behavioral context with 'fail-closed', indicating the tool returns complete data or fails rather than partial results, and 'unknown fields', signaling unmapped/raw fields are surfaced. No contradiction with 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 front-loaded with the core behavior and then lists content areas, each of which earns its place. The long enumeration is dense but not padded with filler or repetition.
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?
An output schema exists, so return values do not need to be described. The schema covers all parameters, and the description provides the high-level output scope and failure behavior. It is complete enough for an agent to invoke 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 coverage is 100%, and the schema already fully describes id, locale (including defaults and deprecated alias), and includePhotos. The description does not need to add parameter semantics beyond the schema.
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 'Get' with the clear object 'full fail-closed listing page' and enumerates the many data sections included. This establishes a distinct scope that separates it from narrower siblings like get_listing_truth or render_listing_cards.
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 word 'full' implies when the tool should be used, but there is no explicit guidance on when to prefer this tool over alternative siblings, nor any exclusion or conditional routing. The intended use is inferable, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_listing_truthGet Listing TruthARead-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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds valuable behavioral context beyond that: the listing page is 'fail-closed,' explicit unknowns are surfaced, correction totals are privacy-safe, and no reporter identities are exposed. This materially improves the agent's understanding of what to expect.
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 dense, front-loaded sentence followed by one short privacy guarantee. Every listed component adds semantic value about what the trust-layer view includes. It is somewhat jargon-heavy ('fail-closed', 'trust-layer'), but nothing is wasted.
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 presence of an output schema and safety annotations, the description is reasonably complete: it communicates the tool's trust focus, fail-closed behavior, included data categories, unknown handling, and privacy constraints. It does not explicitly mention parameters or locale, but the schema fully covers those, so nothing critical 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 description coverage is 100%, so the input schema fully documents both 'id' and 'locale,' including the locale enum and the deprecated 'lb' alias. The description does not need to explain parameters; it provides output-scope context instead, which is acceptable at the baseline level.
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 a specific verb-resource pair: a 'trust-layer view' of the 'fail-closed listing page.' It enumerates distinctive contents (normalized costs, official checks, sources, freshness, explicit unknowns, privacy-safe correction totals) that clearly separate it from the basic sibling 'get_listing.' The second sentence reinforces its unique privacy-safe scope.
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 phrase 'trust-layer view' implies this tool is for getting verified/trust-oriented listing context rather than a plain listing view, so the intended use is somewhat inferable. However, it never explicitly states when to choose this over siblings like get_listing, compare_listings, or get_market_context, nor does it mention any exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_market_contextGet Market ContextARead-onlyIdempotentInspect
Get real estate market data and liveability scores for a commune — prices, trends, schools, transport.
| 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 readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is well covered. The description adds useful context about the types of data returned but does not disclose additional behavioral traits such as rate limits, authentication, or output limitations.
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, information-dense sentence with no filler. The core action and scope are front-loaded, and the listed data categories add value without redundancy.
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 read-only tool with full schema coverage, a detailed output schema, and safety annotations, the description is complete enough. An agent can correctly understand what the tool returns and how it behaves without additional clarification.
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 both 'commune' and 'locale' are already well documented. The description reinforces that the tool operates on a commune, but it adds no additional parameter-level meaning beyond the schema.
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') with a clear resource ('real estate market data and liveability scores for a commune') and lists concrete data categories ('prices, trends, schools, transport'). This distinguishes it from narrower siblings like get_price_estimate or get_commute_times, which focus on single dimensions.
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 implies the tool is for commune-level market overview rather than property-specific or narrow tasks. However, it does not explicitly state when not to use it or name alternative tools, leaving some selection inference to the agent.
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 | |
| listings | Yes | |
| countKind | No | |
| truncated | No | |
| nextCursor | No | |
| matchingCount | No | |
| returnedCount | No | |
| coverageNotice | No | |
| 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 readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds meaningful behavioral context beyond these annotations by stating the tool 're-reads canonical public listing facts before display,' which informs the agent that the output is grounded in canonical data rather than blindly echoing inputs. It also emphasizes copying score/reason values 'without alteration,' a useful behavioral constraint.
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, with the core purpose and constraints front-loaded in the first sentence and usage guidance in the second. Every clause contributes essential information: count limit, source dependency, exact-copy instruction, and canonical re-read behavior. No filler or repetition.
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 that the input schema is exhaustive, there is an output schema present, and annotations cover safety and idempotency, the description adds the missing workflow context: it must follow a search, the data must be copied exactly, and canonical facts are re-read. This is sufficient for an agent to invoke the tool correctly in sequence.
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 documents each parameter precisely, including exactness of IDs, scores/reasons returned by search_vibe, and display order. The description reinforces these semantics ('copy... without alteration') but does not add meaningful new information 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 ('Render'), a precise resource ('exact results from a prior property search'), and a concrete presentation format ('interactive MCP Apps photo carousel'). It clearly differentiates this display tool from the search siblings by requiring a prior search, so an agent cannot mistake it for a search operation.
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 explicit sequencing guidance: 'Call a search tool first, then copy its listing IDs and any returned match scores/reasons without alteration.' This states when to use the tool and its precondition, but it stops short of naming specific sibling tools or explicitly saying 'do not use for searching' as an exclusion, so it lacks the full when-not/alternatives detail.
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 | |
| listings | Yes | |
| countKind | No | |
| truncated | No | |
| nextCursor | No | |
| matchingCount | No | |
| returnedCount | No | |
| coverageNotice | No | |
| 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 cover readOnlyHint=true, openWorldHint=false, idempotentHint=true, destructiveHint=false. The description adds valuable behavioral context: every sourced result identifies and links the original agency listing and states latest catalogue re-sighting time, and thumbnails are attached as image content blocks. It also implies open-world semantics are false by saying 'supported Grande Région inventory'. Minor gap: does not describe pagination or what happens with zero results.
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 sentences, front-loaded with the core function and supported scope, followed by the most important behavior about sourcing and metadata. Every clause earns its place; no filler, repetition, or schema duplication.
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 18 parameters, 100% schema coverage, and an output schema, the description doesn't need to explain parameter formats or return values. It covers scope, result provenance, and image-block behavior. A small gap is enumerating no explicit when-to-use-vs-alternative guidance, and it doesn't mention sort/completeness semantics in a way that tells an agent how to set those fields; but the description plus rich schema and annotations is largely complete for an AI agent to select and invoke it.
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 adds semantic value by grouping the parameters into search dimensions ('location, price, rooms, area, property type, and positive-evidence amenities') and mentioning explicit sort and completeness metadata, plus the 'complete' behavior of includePhotos and attachment of image blocks. It doesn't explain every parameter, but schema already covers those; the description adds contextual meaning above the schema.
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 phrase ('Search properties for sale') and identifies the resource ('supported Grande Région inventory'), with explicit dimensions (location, price, rooms, area, property type, amenities) and metadata about sourcing. It clearly distinguishes from siblings like search_rentals, get_listing, and get_market_context. No ambiguity about what the tool does.
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 states what the search covers (sale, Grande Région inventory) and gives context for what to use it for (search across supported inventory), but it does not explicitly name sibling exclusions such as 'use search_rentals for rentals' or 'use get_listing for individual listings'. It clearly implies when to use it versus other tools, but leaves explicit alternates to inference.
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 rental properties 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 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 monthly rent in EUR | |
| 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. |
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 | |
| listings | Yes | |
| countKind | No | |
| truncated | No | |
| nextCursor | No | |
| matchingCount | No | |
| returnedCount | No | |
| coverageNotice | No | |
| 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 indicate this is read-only, idempotent, and non-destructive. The description adds valuable behavioral context beyond those annotations: result provenance links, original agency listing identification, catalogue re-sighting timestamps, completeness metadata, and attached thumbnail image blocks.
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 focused sentences: the first states the search scope and filter dimensions, the second explains result provenance, metadata, and image output. Every clause carries meaningful information with no redundancy.
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 rich input schema, full schema coverage, existing output schema, and safety annotations, the description adds sufficient context about result behavior, provenance, and image handling. Nothing critical is missing for an agent 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%, so the schema already documents every parameter. The description adds some context by grouping filters into categories (location, price, rooms, area, property type, positive-evidence amenities), but it does not add individual parameter-level meaning beyond the schema.
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 ('Search') and resource ('rental properties across supported Grande Région inventory'), and lists concrete filter dimensions. It clearly distinguishes itself from the sibling search_for_sale tool by focusing on rentals.
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 conveys that this tool is for searching rental listings in the Grande Région, and the filter list implies its breadth. However, it does not explicitly call out alternatives such as get_listing for a single result or search_for_sale for purchases.
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. If the requested place is outside current coverage, it returns no listings plus a machine-readable coverageNotice instead of substituting unrelated homes.
| Name | Required | Description | Default |
|---|---|---|---|
| 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') | |
| 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 | |
| listings | Yes | |
| countKind | No | |
| truncated | No | |
| nextCursor | No | |
| matchingCount | No | |
| returnedCount | No | |
| coverageNotice | No | |
| 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 mark the operation as read-only and idempotent, but the description adds substantial non-obvious behavior: healthy runs return source-grounded match reasons and a 0-100 request-fit score, degraded runs omit ranking claims, every sourced result links to the original agency listing with re-sighting time, and out-of-coverage queries return a coverageNotice rather than unrelated homes. These details materially affect how an agent should interpret results and go well beyond what annotations or schema reveal.
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 but information-dense, front-loading the core purpose in the first sentence and then adding behavioral caveats in a logical order. Every sentence contributes: matching method, output guarantees, degradation behavior, and out-of-coverage handling. No filler or redundancy.
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 rich input schema and output schema, the description covers all essential invocation context: what inputs to pass, how the engine works, what the output represents, how degraded runs differ, and what happens when coverage is missing. An agent has enough context to select, invoke, and interpret results correctly without relying on undocumented assumptions.
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 input schema already documents all five parameters thoroughly, with 100% description coverage including detailed natural-language examples for query. The tool description reinforces that the query should be passed as prose but does not add new meaning about the parameters beyond what the schema provides. Baseline 3 is appropriate when the schema carries 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 identifies a specific verb ('search') and resource ('property search'), then goes further by distinguishing this as the natural-language 'vibe' search that matches on lifestyle, mood, proximity, and soft preferences via embeddings and LLM reasoning. This clearly differentiates it from sibling structured searches like search_rentals and search_for_sale without needing to inspect their schemas.
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 explicitly says to pass the user's request as prose, which tells an agent when this tool is appropriate: when the user expresses preferences in natural language rather than structured filters. It strongly implies this is the preferred tool for 'vibe' queries, but it does not explicitly name alternatives or state when to choose a structured search instead, so it stops just short of full routing guidance.
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.
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.-
- AlicenseAqualityCmaintenancePhilippine real estate data for AI agents — search verified listings, calculate transfer costs, and get accurate legal information via lupaph.com.655MIT
- 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
- FlicenseAqualityBmaintenanceProvides AI agents with real-time access to French real estate transaction data, price per square meter, and property estimates using official open DVF data, with no API key required.4-