Server definition
- Hash
- sha256:3b91dbc14c49d2a1a739d13ac97b99cacfc237e3747aa6253f4115166211621d
- What it is
- What a remote MCP server returned when asked what it offers: 15 tools
The blob, as servednamed by its sha256
{
"instructions": "PropertyList is the data layer for Spanish and Portuguese property\nlistings. Use these tools to search the live MLS inventory.\n\nTypical flow for a buyer-style question:\n 1. If the user mentions a place name, call `autocomplete_location` to\n resolve it to an area id and confirm spelling.\n 2. Call `search_properties` with the resolved location plus any\n structured filters (beds, price, type).\n 3. Or, when the brief is vague or conditional, call\n `find_properties_by_description` and let the AI matcher translate\n it into one or more parallel searches. (API key required.)\n 4. For market context, call `area_market_summary` (median price,\n €/m², bedroom-band counts).\n 5. For a closing recommendation, call `list_agencies` to surface\n the top agencies in that area.\n 6. Call `get_property` for the full description of any reference\n the user wants to dig into.\n\nEvery property response includes `oracle_verified` and\n`oracle_attestation_url`. When `oracle_verified` is true, PropertyList\nOracle holds a content-hashed verified attestation for that listing's\nmunicipality and segment, sourced from the Spanish notarial register,\nand `oracle_attestation_url` resolves to public, reproducible proof\n(the figure, its provenance, the SHA-256 content hash, and on-chain\nstatus). `area_market_summary` carries the same under `oracle`.\nSpanish figures come from notarial data; figures outside Spain come\nfrom a national house price index and are not notary-backed.\nAttestations are anchored on-chain (Base) in weekly batches and are\nverifiable off-chain at any time. oracle_verified is true only for a notarial figure\nwith at least 10 recorded transactions behind it; an index-derived\nattestation still returns its URL, with oracle_verified false.\n",
"tools": [
{
"description": "Return aggregate market context for a Spanish area: number of active\nlistings, median price, mean price, median €/m², and the count\nbroken down by bedroom band. Filterable by property type and search\ntype (for-sale / for-rent / holiday-rentals). Use this before\nrecommending a price or commenting on whether a listing is good\nvalue.\n\nIf the place name is not one we hold, the response says so\n(error: location_not_found, location_match.matched: false) and\nreturns no figures. Figures are NEVER nationwide fallbacks.\n\nPrice figures follow the search type and are labelled with\nprice_unit: sale prices are totals, for-rent is per MONTH and\nholiday-rentals is per WEEK. median_price_per_sqm is reported for\nsales only.\n\nThe `oracle` block carries the attested transaction price for the\narea. Check `oracle.verified` before citing it as verified: it is\ntrue only for Spanish figures from the notarial register (Consejo\nGeneral del Notariado) with at least 10 recorded transactions\nbehind them. Outside Spain the figure comes from a national\nhouse-price index, carries no transaction count, and must never be\ndescribed as notary-backed - `oracle.source` names the real source\nand `oracle.note` says why it is not verified.\n\nTransactions are recorded per municipality, so a sub-area\n(Sotogrande, Puerto Banus, Nueva Andalucia, Orihuela Costa) is\nanswered with the figure for the municipality containing it, with\n`oracle.rolled_up_from_sub_area` true and `oracle.municipality` /\n`oracle.municipality_code` naming it. Quote it as the\nmunicipality's figure, never as the sub-area's own.\n",
"inputSchema": {
"properties": {
"location": {
"description": "Place name (city, suburb, or urbanisation). e.g. 'Marbella'.",
"type": "string"
},
"property_types": {
"description": "Optional comma-separated slugs: apartments, villas, penthouses, plots, townhouses.",
"type": "string"
},
"search_type": {
"default": "for-sale",
"enum": [
"for-sale",
"for-rent",
"holiday-rentals"
],
"type": "string"
}
},
"required": [
"location"
],
"type": "object"
},
"name": "area_market_summary",
"outputSchema": {
"properties": {
"by_bedroom_band": {
"type": "object"
},
"error": {
"type": [
"string",
"null"
]
},
"location": {
"type": "string"
},
"location_match": {
"properties": {
"exact": {
"type": "boolean"
},
"matched": {
"type": "boolean"
},
"matched_areas": {
"items": {
"type": "string"
},
"type": "array"
},
"matched_location": {
"type": [
"string",
"null"
]
},
"requested": {
"type": "string"
}
},
"type": [
"object",
"null"
]
},
"max_price": {
"type": [
"integer",
"null"
]
},
"mean_price": {
"type": [
"integer",
"null"
]
},
"median_price": {
"type": [
"integer",
"null"
]
},
"median_price_per_sqm": {
"type": [
"integer",
"null"
]
},
"min_price": {
"type": [
"integer",
"null"
]
},
"note": {
"type": [
"string",
"null"
]
},
"oracle": {
"properties": {
"attestation_url": {
"type": [
"string",
"null"
]
},
"minimum_verified_sample": {
"type": [
"integer",
"null"
]
},
"municipality": {
"type": [
"string",
"null"
]
},
"municipality_code": {
"type": [
"string",
"null"
]
},
"note": {
"type": [
"string",
"null"
]
},
"requested_area": {
"type": [
"string",
"null"
]
},
"rolled_up_from_sub_area": {
"type": "boolean"
},
"sample_size": {
"type": [
"integer",
"null"
]
},
"source": {
"type": [
"string",
"null"
]
},
"source_label": {
"type": [
"string",
"null"
]
},
"transaction_backed": {
"type": "boolean"
},
"verified": {
"type": "boolean"
},
"verified_price_per_sqm": {
"type": [
"integer",
"null"
]
}
},
"type": "object"
},
"price_basis": {
"type": "string"
},
"price_unit": {
"enum": [
"total",
"per_month",
"per_week"
],
"type": "string"
},
"property_types": {
"type": [
"string",
"null"
]
},
"search_type": {
"type": "string"
},
"total_listings": {
"type": "integer"
}
},
"required": [
"location",
"total_listings",
"oracle"
],
"type": "object"
}
},
{
"description": "Look up Spanish property areas (city, suburb, urbanisation) by\nfree-text name. Returns up to 10 matches with id, name, and the\nparent province/city. Use this to resolve place names before\ncalling search_properties, especially for common spellings like\n'Nueva Andalucia' (vs 'Nueva Andalucía') or 'Marbella old town'.\n",
"inputSchema": {
"properties": {
"provinces": {
"description": "Optional comma-separated province ids to scope the search.",
"type": "string"
},
"query": {
"description": "Free-text place name. 2+ characters.",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"name": "autocomplete_location",
"outputSchema": null
},
{
"description": "Add a new contact to YOUR agency's CRM. Use when the agent wants to\nsave a person (buyer, owner, enquirer). If a contact with the same\nemail already exists it is returned rather than duplicated. The contact\nis created unassigned and flagged as needing attention so it surfaces\nin the CRM. Requires an agency API key.\n",
"inputSchema": {
"properties": {
"company_name": {
"description": "Company name (for a business contact). Optional.",
"type": "string"
},
"email": {
"description": "Email address. Optional but recommended (used for de-duplication).",
"type": "string"
},
"name": {
"description": "Contact's first name (or full name).",
"type": "string"
},
"phone": {
"description": "Phone number. Optional.",
"type": "string"
},
"surname": {
"description": "Contact's surname. Optional.",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "create_contact",
"outputSchema": null
},
{
"description": "Start a new property listing in YOUR agency's CRM from a description.\nUse when the agent is describing a property they have taken on and\nwants it in the system.\n\nCreates a DRAFT. It is never published and never appears on the\nportal from here: the agent adds photographs and the energy rating\nin the CRM and publishes it themselves. The response includes a\ndirect link to the draft.\n\nLocation is resolved against the real area tree, so a town,\nsuburb or urbanisation name is enough. Requires an agency API key.\n",
"inputSchema": {
"properties": {
"bathrooms": {
"type": "integer"
},
"bedrooms": {
"type": "integer"
},
"build_sqm": {
"description": "Built area in square metres.",
"type": "integer"
},
"description": {
"description": "The property description, in the language the agent wrote it.",
"type": "string"
},
"headline": {
"description": "Short headline for the listing. Optional.",
"type": "string"
},
"language": {
"description": "Language the description is written in. Defaults to the agency language.",
"type": "string"
},
"location": {
"description": "Town, suburb or urbanisation, e.g. \"Nueva Andalucia\" or \"Menara Beach\".",
"type": "string"
},
"plot_sqm": {
"description": "Plot size in square metres.",
"type": "integer"
},
"price": {
"description": "Asking price in euros, or monthly rent for a rental.",
"type": "integer"
},
"property_type": {
"description": "apartment, villa, penthouse, townhouse, plot or commercial.",
"type": "string"
},
"search_type": {
"description": "Whether it is for sale or for long-term rent. Defaults to for-sale.",
"enum": [
"for-sale",
"for-rent"
],
"type": "string"
}
},
"required": [
"description"
],
"type": "object"
},
"name": "create_listing",
"outputSchema": null
},
{
"description": "Search YOUR agency's CRM contacts by name, company, email or phone.\nUse to look a person up before logging a note or to check if they're\nalready in the CRM. Requires an agency API key; only ever searches the\ncalling agency's own contacts.\n",
"inputSchema": {
"properties": {
"limit": {
"default": 20,
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"query": {
"description": "Name, company, email or phone fragment to search for.",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"name": "find_contacts",
"outputSchema": null
},
{
"description": "Match Spanish properties from a free-form description of what the\nuser wants. Best for vague, conditional, or lifestyle-heavy briefs\n(\"3-bed near a good international school, flexible on budget if\nthere's a sea view\"). The matcher translates the brief into one\nto three parallel structured searches across PropertyList's full\nMLS, then merges and ranks the results. Returns up to 9 listings\nwith match scores and an explanation of how the brief was\ninterpreted (and what couldn't be resolved).\n",
"inputSchema": {
"properties": {
"brief": {
"description": "Plain-English (or Spanish) description of what the user is looking for. 10-500 chars.",
"type": "string"
},
"language": {
"default": "en",
"enum": [
"en",
"es",
"de",
"fr",
"it",
"nl",
"pt",
"bg",
"el",
"da",
"sv",
"no",
"fi",
"pl",
"ru"
],
"type": "string"
}
},
"required": [
"brief"
],
"type": "object"
},
"name": "find_properties_by_description",
"outputSchema": {
"properties": {
"billed": {
"type": [
"boolean",
"null"
]
},
"error": {
"type": [
"string",
"null"
]
},
"interpretation": {
"type": [
"object",
"null"
]
},
"properties": {
"items": {
"properties": {
"bathrooms": {
"type": [
"integer",
"null"
]
},
"bedrooms": {
"type": [
"integer",
"null"
]
},
"id": {
"type": "integer"
},
"location": {
"type": "object"
},
"match_reason": {
"type": [
"string",
"null"
]
},
"oracle_attestation_url": {
"type": [
"string",
"null"
]
},
"oracle_verified": {
"type": "boolean"
},
"price": {
"type": [
"integer",
"null"
]
},
"reference": {
"type": "string"
},
"title": {
"type": "string"
}
},
"type": "object"
},
"type": "array"
},
"summary": {
"type": [
"string",
"null"
]
},
"unresolved": {
"type": "array"
}
},
"required": [
"properties"
],
"type": "object"
}
},
{
"description": "Fetch the full record for one PropertyList listing by its reference\ncode (the human-readable id like 'PLE-12345'). Use this once the\nuser has settled on a listing from search_properties or\nfind_properties_by_description and wants details or photos. To\ncontact the listing agency, use submit_enquiry - direct phone or\nemail details are not part of the payload.\n\nWorks without an API key up to a daily per-IP allowance of\ndistinct listings; an API key raises that allowance.\n\n`location.city` is whatever tier the listing was filed under and\nmay be a municipality OR a locality inside one. To place a listing\nadministratively use `location.municipality` (with its INE\nmunicipality_code); it is null, never guessed, when we cannot\nresolve it.\n\n`location.latitude` / `location.longitude` are present only when\nwe hold a real, publishable coordinate; the fields are absent\notherwise, and are never 0,0. `location.coordinates_precision`\nsays what the point is: exact or street is the property itself,\nlocality or administrative_area is an area centroid (accurate to\nthe town, not the building), unknown is a pin we hold no\nprecision record for.\n",
"inputSchema": {
"properties": {
"language": {
"default": "en",
"enum": [
"en",
"es",
"de",
"fr",
"it",
"nl",
"pt",
"bg",
"el",
"da",
"sv",
"no",
"fi",
"pl",
"ru"
],
"type": "string"
},
"reference": {
"description": "PropertyList reference, e.g. 'PLE-12345'.",
"type": "string"
}
},
"required": [
"reference"
],
"type": "object"
},
"name": "get_property",
"outputSchema": {
"properties": {
"property": {
"properties": {
"agency": {
"type": [
"object",
"null"
]
},
"bathrooms": {
"type": [
"integer",
"null"
]
},
"bedrooms": {
"type": [
"integer",
"null"
]
},
"build_sqm": {
"type": [
"integer",
"null"
]
},
"description": {
"type": [
"string",
"null"
]
},
"energy_kwh_m2": {
"description": "EPC energy consumption in kWh/m² per year.",
"type": [
"number",
"null"
]
},
"energy_rating": {
"type": [
"string",
"null"
]
},
"energy_status": {
"description": "EPC certificate status.",
"enum": [
"certified",
"in_progress",
"exempt",
null
],
"type": [
"string",
"null"
]
},
"features": {
"type": "array"
},
"features_language": {
"type": "string"
},
"id": {
"type": "integer"
},
"location": {
"type": "object"
},
"monthly_price": {
"type": [
"integer",
"null"
]
},
"oracle_attestation_url": {
"type": [
"string",
"null"
]
},
"oracle_verified": {
"type": "boolean"
},
"photos": {
"type": "array"
},
"plot_sqm": {
"type": [
"integer",
"null"
]
},
"price": {
"description": "Headline price for the listing's transaction type; read with price_period.",
"type": [
"integer",
"null"
]
},
"price_note": {
"type": [
"string",
"null"
]
},
"price_period": {
"description": "total = sale price, per_month = long-term rent, per_week = holiday rent.",
"enum": [
"total",
"per_month",
"per_week",
null
],
"type": [
"string",
"null"
]
},
"reference": {
"type": "string"
},
"sale_price": {
"type": [
"integer",
"null"
]
},
"title": {
"type": "string"
},
"weekly_price_from": {
"type": [
"integer",
"null"
]
}
},
"type": "object"
}
},
"required": [
"property"
],
"type": "object"
}
},
{
"description": "Find PropertyList agencies (estate agents) in a given Spanish area,\nranked by how many active listings they carry there. Returns up to\n10 agencies with name, location, listing count, and a public URL\nthe user can visit. Use this after a buyer has narrowed in on an\narea and wants to know which agencies dominate it.\n",
"inputSchema": {
"properties": {
"limit": {
"default": 10,
"maximum": 25,
"minimum": 1,
"type": "integer"
},
"location": {
"description": "Place name (city, suburb, or urbanisation). e.g. 'Estepona'.",
"type": "string"
}
},
"required": [
"location"
],
"type": "object"
},
"name": "list_agencies",
"outputSchema": null
},
{
"description": "Log a note against a contact or a listing in YOUR agency's CRM (e.g.\nrecord a call outcome or a viewing). Provide the note text plus a\ncontact_id (from find_contacts) and/or a property reference. The note\nappears on the contact/property timeline. Requires an agency API key.\n",
"inputSchema": {
"properties": {
"contact_id": {
"description": "Contact to attach the note to (from find_contacts). Optional if a property reference is given.",
"type": "integer"
},
"note": {
"description": "The note text to record.",
"type": "string"
},
"property_reference": {
"description": "Listing reference to attach the note to. Optional if a contact_id is given.",
"type": "string"
}
},
"required": [
"note"
],
"type": "object"
},
"name": "log_note",
"outputSchema": null
},
{
"description": "List recent enquiries (leads) for YOUR agency's CRM - newest first.\nUse when the agent asks what has just come in (e.g. \"what came in\ntoday?\").\n\nThis is the enquiry inbox: an enquiry that arrived from the portal,\na website or a microsite. Once an agent starts working a person\nthey live on a pipeline board instead - for those, use my_pipeline.\nAn agency that works everything off the boards can have a busy CRM\nand an empty inbox here, which is not the same as having no leads.\n\nRequires an agency API key; only ever returns the calling agency's\nown leads.\n",
"inputSchema": {
"properties": {
"limit": {
"default": 20,
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"property_reference": {
"description": "Only leads about this listing reference. Optional.",
"type": "string"
},
"since": {
"description": "ISO date/time - only leads created on or after this. Optional.",
"type": "string"
}
},
"type": "object"
},
"name": "my_leads",
"outputSchema": null
},
{
"description": "List YOUR agency's own property listings (newest first), optionally\nfiltered by status or a specific reference. Use for \"show my listings\"\n/ \"is reference X still online?\". Requires an agency API key; only ever\nreturns the calling agency's own properties.\n",
"inputSchema": {
"properties": {
"limit": {
"default": 20,
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"reference": {
"description": "A specific listing reference. Optional.",
"type": "string"
},
"status": {
"default": "online",
"description": "Listing status. Defaults to 'online'. 'draft' covers listings not yet published (new + in review); 'all' returns every status.",
"enum": [
"online",
"offline",
"sold",
"draft",
"all"
],
"type": "string"
}
},
"type": "object"
},
"name": "my_listings",
"outputSchema": null
},
{
"description": "List the cards on YOUR agency's CRM pipeline boards (Kanban), with\neach board's own stage names and card counts.\n\nBoards: lead, buyer, seller, tenant, nurture (each card is a\ncontact) and property (each card is a listing). Stage names are\nwhatever the agency renamed them to, so read them from the reply\nrather than assuming.\n\nCall with no pipeline for a summary of every board - use this to\nanswer \"what's in my pipeline?\" or \"how many buyers do I have?\".\nCall with a pipeline for that board's cards, newest activity first.\n\nThis is the board view. For enquiries that have just arrived and\nhave not been worked yet, use my_leads instead.\n\nReturns the WHOLE agency's boards, not one agent's cards - an API\nkey belongs to the agency, not to a person. Requires an agency API\nkey; only ever returns the calling agency's own data.\n",
"inputSchema": {
"properties": {
"limit": {
"default": 10,
"description": "Cards per stage. Counts are always the full stage total, whatever this is set to.",
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"pipeline": {
"description": "Which board. Omit for a summary of all of them.",
"enum": [
"lead",
"buyer",
"seller",
"tenant",
"nurture",
"property"
],
"type": "string"
},
"stage": {
"description": "Only cards in this stage. Match on the stage name as it reads on the board (case-insensitive); closed stages such as Won or Lost can be asked for by name. Optional.",
"type": "string"
}
},
"type": "object"
},
"name": "my_pipeline",
"outputSchema": null
},
{
"description": "Search PropertyList's full Spanish property MLS by structured filters.\nUse for queries that translate cleanly to fields: bedrooms, bathrooms,\nprice ceiling, property type, area name. For free-form briefs use\nfind_properties_by_description instead.\n\nReturns a paginated list with summary text plus structured JSON. Every\nproperty carries `oracle_verified` and `oracle_attestation_url` —\ntrue when PropertyList Oracle holds a verified attestation for the listing's municipality and segment.\n\nA `location` we do not hold returns zero results with\nerror: location_not_found and location_match.matched: false. It\nnever substitutes listings from other areas.\n\n`location.city` is whatever tier the listing was filed under and\nmay be a municipality OR a locality inside one. To place a listing\nadministratively use `location.municipality` (with its INE\nmunicipality_code); it is null, never guessed, when we cannot\nresolve it.\n\n`location.latitude` / `location.longitude` are present only when\nwe hold a real, publishable coordinate; the fields are absent\notherwise, and are never 0,0. `location.coordinates_precision`\nsays what the point is: exact or street is the property itself,\nlocality or administrative_area is an area centroid (accurate to\nthe town, not the building), unknown is a pin we hold no\nprecision record for.\n",
"inputSchema": {
"properties": {
"bathrooms_min": {
"maximum": 20,
"minimum": 0,
"type": "integer"
},
"bedrooms_max": {
"maximum": 20,
"minimum": 0,
"type": "integer"
},
"bedrooms_min": {
"maximum": 20,
"minimum": 0,
"type": "integer"
},
"language": {
"default": "en",
"description": "Preferred language for property titles and description excerpts.",
"enum": [
"en",
"es",
"de",
"fr",
"it",
"nl",
"pt",
"bg",
"el",
"da",
"sv",
"no",
"fi",
"pl",
"ru"
],
"type": "string"
},
"location": {
"description": "Free-text place name (city, suburb, or urbanisation). e.g. 'Marbella', 'Nueva Andalucia', 'Sotogrande'. Pre-resolved with autocomplete_location if you need to confirm match.",
"type": "string"
},
"page": {
"default": 1,
"minimum": 1,
"type": "integer"
},
"page_size": {
"default": 12,
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"price_max": {
"description": "Maximum price in euros (sale) or monthly euros (rent).",
"minimum": 0,
"type": "integer"
},
"price_min": {
"description": "Minimum price in euros (sale) or monthly euros (rent).",
"minimum": 0,
"type": "integer"
},
"property_types": {
"description": "Comma-separated slugs: apartments, villas, penthouses, plots, townhouses, commercial.",
"type": "string"
},
"search_type": {
"description": "Listing market. Defaults to 'for-sale'.",
"enum": [
"for-sale",
"for-rent",
"holiday-rentals"
],
"type": "string"
}
},
"type": "object"
},
"name": "search_properties",
"outputSchema": {
"properties": {
"error": {
"type": [
"string",
"null"
]
},
"limits": {
"type": [
"object",
"null"
]
},
"location_match": {
"properties": {
"exact": {
"type": "boolean"
},
"matched": {
"type": "boolean"
},
"matched_areas": {
"items": {
"type": "string"
},
"type": "array"
},
"matched_location": {
"type": [
"string",
"null"
]
},
"requested": {
"type": "string"
}
},
"type": [
"object",
"null"
]
},
"page": {
"type": "integer"
},
"page_size": {
"type": "integer"
},
"properties": {
"items": {
"properties": {
"agency_id": {
"type": [
"integer",
"null"
]
},
"bathrooms": {
"type": [
"integer",
"null"
]
},
"bedrooms": {
"type": [
"integer",
"null"
]
},
"build_sqm": {
"type": [
"integer",
"null"
]
},
"energy_rating": {
"type": [
"string",
"null"
]
},
"id": {
"type": "integer"
},
"location": {
"type": "object"
},
"monthly_price": {
"type": [
"integer",
"null"
]
},
"oracle_attestation_url": {
"type": [
"string",
"null"
]
},
"oracle_verified": {
"type": "boolean"
},
"plot_sqm": {
"type": [
"integer",
"null"
]
},
"price": {
"description": "Headline price for the listing's transaction type; read with price_period.",
"type": [
"integer",
"null"
]
},
"price_note": {
"type": [
"string",
"null"
]
},
"price_period": {
"description": "total = sale price, per_month = long-term rent, per_week = holiday rent.",
"enum": [
"total",
"per_month",
"per_week",
null
],
"type": [
"string",
"null"
]
},
"reference": {
"type": "string"
},
"sale_price": {
"type": [
"integer",
"null"
]
},
"search_type": {
"type": [
"string",
"null"
]
},
"title": {
"type": "string"
},
"url": {
"type": [
"string",
"null"
]
},
"weekly_price_from": {
"type": [
"integer",
"null"
]
}
},
"type": "object"
},
"type": "array"
},
"total": {
"type": "integer"
}
},
"required": [
"total",
"page",
"page_size",
"properties"
],
"type": "object"
}
},
{
"description": "Submit an enquiry (lead) about a specific listing on behalf of a prospective\nbuyer or tenant. Use this once the user has chosen a property and wants the\nagency to contact them. The listing agency receives the enquiry in their CRM\nand follows up directly.\n\nThis is the supported way to contact a listing agency - direct phone or\nemail details are not exposed by other tools. Works without an API key up\nto a small daily per-IP allowance; an API key removes that allowance.\nProvide the property\n`reference` (from search results) plus the enquirer's contact details.\nOnly submit with the person's clear intent and consent - this sends their\ndetails to a real estate agency.\n",
"inputSchema": {
"properties": {
"email": {
"description": "Enquirer's email address.",
"type": "string"
},
"language": {
"default": "en",
"description": "Preferred language for the agency to reply in.",
"enum": [
"en",
"es",
"de",
"fr",
"it",
"nl",
"pt",
"bg",
"el",
"da",
"sv",
"no",
"fi",
"pl",
"ru"
],
"type": "string"
},
"message": {
"description": "Optional message / what they want to know or arrange (e.g. a viewing).",
"type": "string"
},
"name": {
"description": "Enquirer's full name.",
"type": "string"
},
"phone": {
"description": "Enquirer's phone number (with country code where possible).",
"type": "string"
},
"reference": {
"description": "PropertyList listing reference the enquiry is about, e.g. 'PLE-12345'.",
"type": "string"
}
},
"required": [
"reference",
"name",
"email",
"phone"
],
"type": "object"
},
"name": "submit_enquiry",
"outputSchema": null
},
{
"description": "Get a valuation for a property or area from recorded market data, not\nasking prices. Returns the €/m² for the municipality and segment, an\nindicative valuation when you give a size (build_sqm) or a listing\nreference, and a content-hashed attestation URL the figure can be cited\nfrom.\n\nCheck `verified` before citing. It is true ONLY for Spanish figures\ndrawn from the notarial register (Consejo General del Notariado) with\nat least 10 recorded transactions behind them.\nElsewhere - Portugal and Cyprus especially - the figure comes from a\nnational house-price index and is an estimate: `transaction_backed` is\nfalse, `source_label` names the real source, and it must not be\ndescribed as notary-verified. `indicative_band_pct` widens as the\nevidence thins.\n\nTransactions are recorded per municipality, so a query for a\nsub-area (Sotogrande, Puerto Banus, Nueva Andalucia, Orihuela\nCosta) is answered with the containing municipality's attestation:\n`rolled_up_from_sub_area` is true, `location` and\n`municipality_code` name the municipality, `requested_area` is what\nyou asked for and `rollup_note` is the sentence to repeat. Never\nquote a rolled-up figure as the sub-area's own price.\n\nOnly two segment attestations exist per municipality, so a request for\npenthouse or townhouse resolves to the nearest attested segment.\n`property_type` is the segment actually used and\n`requested_property_type` is what you asked for; when they differ the\ntext says so. Also returns our proprietary network achieved-sale figure\nwhere available. If no attestation covers the area yet, it says so\nplainly (use area_market_summary for asking-price stats instead).\n",
"inputSchema": {
"properties": {
"build": {
"description": "Alias of build_sqm.",
"minimum": 1,
"type": "integer"
},
"build_size": {
"description": "Alias of build_sqm.",
"minimum": 1,
"type": "integer"
},
"build_sqm": {
"description": "Built size in m² to value. Optional.",
"minimum": 1,
"type": "integer"
},
"location": {
"description": "Municipality / city name, e.g. \"Marbella\". Ignored if a reference is given.",
"type": "string"
},
"property_type": {
"description": "Optional segment slug: apartment, villa, penthouse, townhouse, plot. Defaults to the municipality-wide figure.",
"type": "string"
},
"reference": {
"description": "Value a specific PropertyList listing by reference (uses its municipality, type and size). Optional.",
"type": "string"
}
},
"type": "object"
},
"name": "verified_valuation",
"outputSchema": {
"properties": {
"attestation_url": {
"type": [
"string",
"null"
]
},
"build_sqm": {
"type": [
"integer",
"null"
]
},
"content_hash": {
"type": [
"string",
"null"
]
},
"indicative_band_pct": {
"type": [
"integer",
"null"
]
},
"indicative_range": {
"type": "object"
},
"location": {
"type": [
"string",
"null"
]
},
"municipality_code": {
"type": [
"string",
"null"
]
},
"network": {
"type": [
"object",
"null"
]
},
"on_chain": {
"type": "boolean"
},
"period_end": {
"type": [
"string",
"null"
]
},
"property_type": {
"type": [
"string",
"null"
]
},
"requested_area": {
"type": [
"string",
"null"
]
},
"requested_property_type": {
"type": [
"string",
"null"
]
},
"rolled_up_from_sub_area": {
"type": "boolean"
},
"rollup_note": {
"type": [
"string",
"null"
]
},
"sample_size": {
"type": [
"integer",
"null"
]
},
"source": {
"type": [
"string",
"null"
]
},
"source_label": {
"type": [
"string",
"null"
]
},
"transaction_backed": {
"type": "boolean"
},
"valuation_estimate": {
"type": [
"integer",
"null"
]
},
"verified": {
"type": "boolean"
},
"verified_price_per_sqm": {
"type": [
"integer",
"null"
]
}
},
"required": [
"verified",
"location"
],
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:3b91dbc14c49d2a1a739d13ac97b99cacfc237e3747aa6253f4115166211621d | sha256sum