Every API here is available over the APIs.io API and to AI agents over MCP.
{
"openapi": "3.1.1",
"info": {
"title": "HOUSINGFAX agent API",
"summary": "Instant home report on a flat, house or building in Spain, for AI agents and developers.",
"description": "Public, unauthenticated API to explain HOUSINGFAX, check coverage, identify a building in Spain and request the report for a person, who accepts the consent text first. Every report is free: the full report with web view and PDF.\n\nThe report is a preliminary purchase due-diligence report built from public records, not a technical inspection, valuation or certificate. It never states that a building has aluminosis and never gives percentages. Unknown is not a negative: missing data is shown as \"no data\" with its reason.\n\nReports are private: the API returns a link with a token that must not be published. `POST /reports/purchase` stays in the contract for compatibility and answers 409 `NOT_FOR_SALE`.\n\nInputs are strict: an unknown or repeated parameter or field is rejected with 400 `INVALID_REQUEST`. Read operations (GET) can be called from any origin (CORS); POST operations are meant for servers and agents, not for browser pages on other sites.\n\nThe same operations are available as tools of the MCP server at https://housingfax.com/mcp.",
"version": "1.3.0",
"termsOfService": "https://housingfax.com/es-es/terminos",
"contact": {
"name": "HOUSINGFAX",
"email": "ldescals.ssp@gmail.com",
"url": "https://housingfax.com/es-es/contacto"
}
},
"externalDocs": {
"description": "HOUSINGFAX for agents and developers",
"url": "https://housingfax.com/es-es/api"
},
"servers": [
{
"url": "https://housingfax.com/api/agent/v1"
}
],
"security": [],
"x-service-info": {
"name": "HOUSINGFAX",
"contract": "agent-api-1.3.0",
"contact": {
"email": "ldescals.ssp@gmail.com",
"url": "https://housingfax.com/es-es/contacto"
},
"termsOfService": "https://housingfax.com/es-es/terminos",
"privacyPolicy": "https://housingfax.com/es-es/privacidad",
"documentation": {
"es": "https://housingfax.com/es-es/api",
"en": "https://housingfax.com/en-es/api",
"de": "https://housingfax.com/de-es/api",
"nl": "https://housingfax.com/nl-es/api",
"fr": "https://housingfax.com/fr-es/api"
},
"mcpServer": "https://housingfax.com/mcp",
"authentication": "none",
"coverage": "Spain only; Navarre not covered yet.",
"limits": {
"activeClients": {
"max": 40,
"idleSeconds": 120
},
"reportsInProgressPerClient": 3,
"capacity": "When the channel is serving its maximum of active clients, a new client gets 503 CHANNEL_AT_CAPACITY with Retry-After; clients already active go on.",
"rateLimited": "Per client and per IP address; 429 with Retry-After when exceeded.",
"queue": "Shared with the website, without priority."
},
"payments": "None: every report is free; POST /reports/purchase answers 409 NOT_FOR_SALE."
},
"paths": {
"/products": {
"get": {
"operationId": "getProducts",
"summary": "The report and its consent text",
"description": "The report HOUSINGFAX generates (`productMode: free`): a single product, the full report with web view and PDF, free of charge, with the building condition assessment when the building has an IEE/ITE record. Also the capacity limits of the channel, the consent text the person must accept before a report is requested and the Terms version.",
"x-mcp-tool": "get_products",
"parameters": [
{
"name": "language",
"in": "query",
"required": false,
"schema": {
"default": "es",
"type": "string",
"enum": [
"es",
"en",
"de",
"nl",
"fr"
]
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GetProductsOutput"
}
}
}
},
"400": {
"$ref": "#/components/responses/Error400"
},
"404": {
"$ref": "#/components/responses/Error404"
},
"409": {
"$ref": "#/components/responses/Error409"
},
"410": {
"$ref": "#/components/responses/Error410"
},
"422": {
"$ref": "#/components/responses/Error422"
},
"429": {
"$ref": "#/components/responses/Error429"
},
"500": {
"$ref": "#/components/responses/Error500"
},
"503": {
"$ref": "#/components/responses/Error503"
}
}
}
},
"/checks": {
"get": {
"operationId": "listChecks",
"summary": "The checks of the report",
"description": "Every check of the report, numbered, with the question it answers and whether its source is integrated. A check without data is shown as \"no data\" with its reason, never as a pass.",
"x-mcp-tool": "list_checks",
"parameters": [
{
"name": "language",
"in": "query",
"required": false,
"schema": {
"default": "es",
"type": "string",
"enum": [
"es",
"en",
"de",
"nl",
"fr"
]
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ListChecksOutput"
}
}
}
},
"400": {
"$ref": "#/components/responses/Error400"
},
"404": {
"$ref": "#/components/responses/Error404"
},
"409": {
"$ref": "#/components/responses/Error409"
},
"410": {
"$ref": "#/components/responses/Error410"
},
"422": {
"$ref": "#/components/responses/Error422"
},
"429": {
"$ref": "#/components/responses/Error429"
},
"500": {
"$ref": "#/components/responses/Error500"
},
"503": {
"$ref": "#/components/responses/Error503"
}
}
}
},
"/coverage": {
"get": {
"operationId": "checkCoverage",
"summary": "Coverage by province and municipality",
"description": "Whether a province or municipality of Spain is covered. Navarre is not covered yet (foral adapter pending), which never means \"no risk\". Without parameters, every province.",
"x-mcp-tool": "check_coverage",
"parameters": [
{
"name": "language",
"in": "query",
"required": false,
"schema": {
"default": "es",
"type": "string",
"enum": [
"es",
"en",
"de",
"nl",
"fr"
]
}
},
{
"name": "province",
"in": "query",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 80
}
},
{
"name": "municipality",
"in": "query",
"required": false,
"schema": {
"type": "string",
"minLength": 2,
"maxLength": 80
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CheckCoverageOutput"
}
}
}
},
"400": {
"$ref": "#/components/responses/Error400"
},
"404": {
"$ref": "#/components/responses/Error404"
},
"409": {
"$ref": "#/components/responses/Error409"
},
"410": {
"$ref": "#/components/responses/Error410"
},
"422": {
"$ref": "#/components/responses/Error422"
},
"429": {
"$ref": "#/components/responses/Error429"
},
"500": {
"$ref": "#/components/responses/Error500"
},
"503": {
"$ref": "#/components/responses/Error503"
}
}
}
},
"/address/search": {
"get": {
"operationId": "searchAddress",
"summary": "Search municipalities and streets",
"description": "Step 1 (`kind=municipality`): municipalities of a province. Step 2 (`kind=street`, with the codes of step 1): streets of a municipality. The codes feed `POST /buildings/resolve`.",
"x-mcp-tool": "search_address",
"parameters": [
{
"name": "kind",
"in": "query",
"required": true,
"schema": {
"type": "string",
"enum": [
"municipality",
"street"
]
}
},
{
"name": "language",
"in": "query",
"required": false,
"schema": {
"default": "es",
"type": "string",
"enum": [
"es",
"en",
"de",
"nl",
"fr"
]
}
},
{
"name": "provinceCode",
"in": "query",
"required": true,
"schema": {
"type": "string",
"pattern": "^\\d{2}$"
}
},
{
"name": "q",
"in": "query",
"required": true,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 80
}
},
{
"name": "municipalityDgcCode",
"in": "query",
"required": false,
"schema": {
"type": "string",
"pattern": "^\\d{1,3}$"
}
},
{
"name": "municipalityIneCode",
"in": "query",
"required": false,
"schema": {
"type": "string",
"pattern": "^\\d{3}$"
}
},
{
"name": "streetTypeCode",
"in": "query",
"required": false,
"schema": {
"type": "string",
"pattern": "^[A-Z0-9]{1,4}$"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SearchAddressOutput"
}
}
}
},
"400": {
"$ref": "#/components/responses/Error400"
},
"404": {
"$ref": "#/components/responses/Error404"
},
"409": {
"$ref": "#/components/responses/Error409"
},
"410": {
"$ref": "#/components/responses/Error410"
},
"422": {
"$ref": "#/components/responses/Error422"
},
"429": {
"$ref": "#/components/responses/Error429"
},
"500": {
"$ref": "#/components/responses/Error500"
},
"503": {
"$ref": "#/components/responses/Error503"
}
}
}
},
"/buildings/resolve": {
"post": {
"operationId": "resolveBuilding",
"summary": "Identify the building",
"description": "Identifies the building by cadastral reference or by the coded address from `/address/search`. When it is resolved, returns a `resolutionToken` (valid for 15 minutes) for `POST /reports/free` and whether the building has an IEE/ITE record, which decides whether the report includes the building condition assessment. No protected cadastral data.",
"x-mcp-tool": "resolve_building",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ResolveBuildingInput"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ResolveBuildingOutput"
}
}
}
},
"400": {
"$ref": "#/components/responses/Error400"
},
"404": {
"$ref": "#/components/responses/Error404"
},
"409": {
"$ref": "#/components/responses/Error409"
},
"410": {
"$ref": "#/components/responses/Error410"
},
"413": {
"$ref": "#/components/responses/ErrorBodyTooLarge"
},
"415": {
"$ref": "#/components/responses/ErrorUnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/Error422"
},
"429": {
"$ref": "#/components/responses/Error429"
},
"500": {
"$ref": "#/components/responses/Error500"
},
"503": {
"$ref": "#/components/responses/Error503"
}
}
}
},
"/reports/free": {
"post": {
"operationId": "createFreeReport",
"summary": "Request the report",
"description": "Queues the report for a resolved building, once the person has accepted the consent text of `GET /products`. Every report is free: it is the full report with web view and PDF, generated with real data. Returns a private `previewUrl` (token, not indexed) and a `statusToken` to follow it. Never publish the link.",
"x-mcp-tool": "create_free_report",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CreateFreeReportInput"
}
}
}
},
"responses": {
"202": {
"description": "Accepted: the report is queued.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CreateFreeReportOutput"
}
}
}
},
"400": {
"$ref": "#/components/responses/Error400"
},
"404": {
"$ref": "#/components/responses/Error404"
},
"409": {
"$ref": "#/components/responses/Error409"
},
"410": {
"$ref": "#/components/responses/Error410"
},
"413": {
"$ref": "#/components/responses/ErrorBodyTooLarge"
},
"415": {
"$ref": "#/components/responses/ErrorUnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/Error422"
},
"429": {
"$ref": "#/components/responses/Error429"
},
"500": {
"$ref": "#/components/responses/Error500"
},
"503": {
"$ref": "#/components/responses/Error503"
}
}
}
},
"/jobs/{jobId}": {
"get": {
"operationId": "getJobStatus",
"summary": "Status of a requested report",
"description": "Status of a report requested with `POST /reports/free` (`queued`, `in_progress` and `ready`; or `failed`, `expired`). Orders opened before the service became free keep their payment states (`awaiting_payment`, `payment_received`, `payment_expired`, `refunded`). When it is `ready`, returns the private link. The `statusToken` given when the report was created goes in `Authorization: Bearer <statusToken>`, never in the URL.",
"x-mcp-tool": "get_report_status",
"parameters": [
{
"name": "language",
"in": "query",
"required": false,
"schema": {
"default": "es",
"type": "string",
"enum": [
"es",
"en",
"de",
"nl",
"fr"
]
}
},
{
"name": "jobId",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^scr_[A-Za-z0-9_-]{22}$"
}
}
],
"security": [
{
"statusToken": []
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GetJobStatusOutput"
}
}
}
},
"400": {
"$ref": "#/components/responses/Error400"
},
"404": {
"$ref": "#/components/responses/Error404"
},
"409": {
"$ref": "#/components/responses/Error409"
},
"410": {
"$ref": "#/components/responses/Error410"
},
"422": {
"$ref": "#/components/responses/Error422"
},
"429": {
"$ref": "#/components/responses/Error429"
},
"500": {
"$ref": "#/components/responses/Error500"
},
"503": {
"$ref": "#/components/responses/Error503"
}
}
}
},
"/reports/purchase": {
"post": {
"operationId": "purchaseReport",
"summary": "Not available: every report is free",
"description": "Not available: every report is free; use `POST /reports/free` (MCP tool `create_free_report`). The operation stays in the contract for compatibility and answers 409 `NOT_FOR_SALE` without creating anything.",
"x-mcp-tool": "purchase_report",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PurchaseReportInput"
}
}
}
},
"responses": {
"201": {
"description": "Not returned while every report is free: the answer is 409 `NOT_FOR_SALE`.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PurchaseReportOutput"
}
}
}
},
"400": {
"$ref": "#/components/responses/Error400"
},
"404": {
"$ref": "#/components/responses/Error404"
},
"409": {
"$ref": "#/components/responses/Error409"
},
"410": {
"$ref": "#/components/responses/Error410"
},
"413": {
"$ref": "#/components/responses/ErrorBodyTooLarge"
},
"415": {
"$ref": "#/components/responses/ErrorUnsupportedMediaType"
},
"422": {
"$ref": "#/components/responses/Error422"
},
"429": {
"$ref": "#/components/responses/Error429"
},
"500": {
"$ref": "#/components/responses/Error500"
},
"503": {
"$ref": "#/components/responses/Error503"
}
}
}
}
},
"components": {
"schemas": {
"GetProductsOutput": {
"type": "object",
"properties": {
"contract": {
"type": "string",
"const": "agent-api-1.3.0"
},
"language": {
"type": "string",
"enum": [
"es",
"en",
"de",
"nl",
"fr"
]
},
"productMode": {
"type": "string",
"enum": [
"commercial",
"free"
]
},
"currency": {
"type": "string",
"const": "EUR"
},
"vatIncluded": {
"type": "boolean",
"const": true
},
"priceNote": {
"type": "string",
"minLength": 1,
"maxLength": 600
},
"products": {
"minItems": 1,
"maxItems": 3,
"type": "array",
"items": {
"type": "object",
"properties": {
"tier": {
"type": "string",
"enum": [
"free",
"simple",
"complete"
]
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 600
},
"priceCents": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"price": {
"type": "string",
"minLength": 1,
"maxLength": 600
},
"description": {
"type": "string",
"minLength": 1,
"maxLength": 600
},
"requiresBuildingConditionRecord": {
"type": "boolean"
},
"format": {
"type": "string",
"enum": [
"redacted_web_preview",
"web_and_pdf"
]
},
"emailRequired": {
"type": "boolean"
},
"orderChannel": {
"type": "string",
"enum": [
"agent_api",
"web"
]
}
},
"required": [
"tier",
"name",
"priceCents",
"price",
"description",
"requiresBuildingConditionRecord",
"format",
"emailRequired",
"orderChannel"
],
"additionalProperties": false
}
},
"upgrade": {
"anyOf": [
{
"type": "object",
"properties": {
"from": {
"type": "string",
"const": "simple"
},
"to": {
"type": "string",
"const": "complete"
},
"priceCents": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"price": {
"type": "string",
"minLength": 1,
"maxLength": 600
}
},
"required": [
"from",
"to",
"priceCents",
"price"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"freeReportLimits": {
"type": "object",
"properties": {
"perEmail": {
"type": "object",
"properties": {
"count": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"windowDays": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"required": [
"count",
"windowDays"
],
"additionalProperties": false
},
"note": {
"type": "string",
"minLength": 1,
"maxLength": 600
},
"agentChannelPerDay": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"required": [
"note"
],
"additionalProperties": false
},
"capacity": {
"type": "object",
"properties": {
"maxActiveClients": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"clientIdleSeconds": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"maxReportsInProgressPerClient": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"note": {
"type": "string",
"minLength": 1,
"maxLength": 600
}
},
"required": [
"maxActiveClients",
"clientIdleSeconds",
"maxReportsInProgressPerClient",
"note"
],
"additionalProperties": false
},
"consent": {
"type": "object",
"properties": {
"text": {
"type": "string",
"minLength": 1,
"maxLength": 2000
},
"statementSha256": {
"type": "string",
"pattern": "^[0-9a-f]{64}$"
},
"termsVersion": {
"type": "string",
"minLength": 1,
"maxLength": 16
},
"termsUrl": {
"type": "string",
"maxLength": 400,
"pattern": "^https:\\/\\/[^\\s]+$"
},
"agentContractingTermsUrl": {
"type": "string",
"maxLength": 400,
"pattern": "^https:\\/\\/[^\\s]+$"
},
"privacyUrl": {
"type": "string",
"maxLength": 400,
"pattern": "^https:\\/\\/[^\\s]+$"
}
},
"required": [
"text",
"statementSha256",
"termsVersion",
"termsUrl",
"privacyUrl"
],
"additionalProperties": false
},
"checksCount": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"pricingUrl": {
"type": "string",
"maxLength": 400,
"pattern": "^https:\\/\\/[^\\s]+$"
},
"orderUrl": {
"type": "string",
"maxLength": 400,
"pattern": "^https:\\/\\/[^\\s]+$"
},
"exampleReportUrl": {
"type": "string",
"maxLength": 400,
"pattern": "^https:\\/\\/[^\\s]+$"
},
"disclaimer": {
"type": "string",
"minLength": 1,
"maxLength": 600
}
},
"required": [
"contract",
"language",
"currency",
"vatIncluded",
"priceNote",
"products",
"consent",
"checksCount",
"pricingUrl",
"orderUrl",
"exampleReportUrl",
"disclaimer"
],
"additionalProperties": false
},
"ListChecksOutput": {
"type": "object",
"properties": {
"contract": {
"type": "string",
"const": "agent-api-1.3.0"
},
"language": {
"type": "string",
"enum": [
"es",
"en",
"de",
"nl",
"fr"
]
},
"count": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"checks": {
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"number": {
"type": "integer",
"minimum": 1,
"maximum": 99
},
"key": {
"type": "string",
"enum": [
"aluminosis",
"iee",
"risks_by_year",
"asbestos",
"cadastral_record",
"building_condition",
"energy_certificate",
"land_history",
"ground_motion",
"geology_and_drainage",
"flooding",
"seismic",
"radon",
"sun_hours",
"solar_potential",
"price_and_market",
"surroundings_and_noise",
"land_affections",
"land_classification",
"climate_and_light",
"wildfire",
"industrial_facilities",
"public_safety"
]
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 600
},
"question": {
"type": "string",
"minLength": 1,
"maxLength": 600
},
"integration": {
"type": "string",
"enum": [
"integrated",
"pending_integration"
]
},
"includedIn": {
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"enum": [
"free",
"simple",
"complete"
]
}
}
},
"required": [
"number",
"key",
"title",
"question",
"integration",
"includedIn"
],
"additionalProperties": false
}
},
"semaphore": {
"type": "object",
"properties": {
"ok": {
"type": "string",
"minLength": 1,
"maxLength": 600
},
"attention": {
"type": "string",
"minLength": 1,
"maxLength": 600
},
"no_data": {
"type": "string",
"minLength": 1,
"maxLength": 600
},
"not_included": {
"type": "string",
"minLength": 1,
"maxLength": 600
}
},
"required": [
"ok",
"attention",
"no_data",
"not_included"
],
# --- truncated at 32 KB (70 KB total) ---
# Full source: https://artifacts.apis.io/housingfax-com/openapi/_original/housingfax-com-api-openapi.json