{
    "openapi": "3.1.0",
    "info": {
        "title": "Cambra de la Propietat Urbana de Badalona API",
        "description": "Public REST API for the Cambra de la Propietat Urbana de Badalona. Provides access to services, news, practical information, and property listings. Designed for AI agent integration.",
        "version": "1.0.0",
        "contact": {
            "name": "Cambra de la Propietat Urbana de Badalona",
            "url": "https://cambrabadalona.com",
            "email": "cambra@cambrabadalona.com"
        },
        "license": {
            "name": "Open Data",
            "url": "https://cambrabadalona.com"
        },
        "x-logo": {
            "url": "https://cambrabadalona.com/wp-content/themes/cambra-starter/assets/images/logo.png"
        }
    },
    "servers": [
        {
            "url": "https://cambrabadalona.com/wp-json/cambra/v1",
            "description": "Production API"
        }
    ],
    "tags": [
        {
            "name": "Info",
            "description": "Site and API metadata"
        },
        {
            "name": "Services",
            "description": "Cambra services offered to property owners"
        },
        {
            "name": "News",
            "description": "News, events and announcements"
        },
        {
            "name": "PracticalInfo",
            "description": "Legal and practical guides for property owners"
        },
        {
            "name": "Properties",
            "description": "Property listings on the Bolsa Inmobiliaria"
        },
        {
            "name": "Search",
            "description": "Full-text search across all content"
        }
    ],
    "paths": {
        "/info": {
            "get": {
                "operationId": "getInfo",
                "summary": "Get site and API information",
                "tags": [
                    "Info"
                ],
                "responses": {
                    "200": {
                        "description": "Successful response",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SiteInfo"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/services": {
            "get": {
                "operationId": "listServices",
                "summary": "List all services",
                "description": "Returns a paginated list of services offered by Cambra de la Propietat Urbana de Badalona.",
                "tags": [
                    "Services"
                ],
                "parameters": [
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page",
                        "schema": {
                            "type": "integer",
                            "default": 20,
                            "minimum": 1,
                            "maximum": 100
                        }
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page number",
                        "schema": {
                            "type": "integer",
                            "default": 1,
                            "minimum": 1
                        }
                    },
                    {
                        "name": "search",
                        "in": "query",
                        "required": false,
                        "description": "Filter by text",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "lang",
                        "in": "query",
                        "required": false,
                        "description": "Language code (ca/es)",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "ca",
                                "es"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Paginated list of services",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/PostList"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/BadRequest"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerError"
                    }
                }
            }
        },
        "/services/{id}": {
            "get": {
                "operationId": "getService",
                "summary": "Get a single service by ID",
                "tags": [
                    "Services"
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "The service",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Post"
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    }
                }
            }
        },
        "/news": {
            "get": {
                "operationId": "listNews",
                "summary": "List news articles",
                "tags": [
                    "News"
                ],
                "parameters": [
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page",
                        "schema": {
                            "type": "integer",
                            "default": 20,
                            "minimum": 1,
                            "maximum": 100
                        }
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page number",
                        "schema": {
                            "type": "integer",
                            "default": 1,
                            "minimum": 1
                        }
                    },
                    {
                        "name": "search",
                        "in": "query",
                        "required": false,
                        "description": "Filter by text",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "lang",
                        "in": "query",
                        "required": false,
                        "description": "Language code (ca/es)",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "ca",
                                "es"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Paginated list of news articles",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/PostList"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/BadRequest"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerError"
                    }
                }
            }
        },
        "/news/{id}": {
            "get": {
                "operationId": "getNewsItem",
                "summary": "Get a single news article",
                "tags": [
                    "News"
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "The article",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Post"
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    }
                }
            }
        },
        "/practical-info": {
            "get": {
                "operationId": "listPracticalInfo",
                "summary": "List practical information guides",
                "description": "Returns legal and practical guides for urban property owners in Badalona.",
                "tags": [
                    "PracticalInfo"
                ],
                "parameters": [
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page",
                        "schema": {
                            "type": "integer",
                            "default": 20,
                            "minimum": 1,
                            "maximum": 100
                        }
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page number",
                        "schema": {
                            "type": "integer",
                            "default": 1,
                            "minimum": 1
                        }
                    },
                    {
                        "name": "search",
                        "in": "query",
                        "required": false,
                        "description": "Filter by text",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "lang",
                        "in": "query",
                        "required": false,
                        "description": "Language code (ca/es)",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "ca",
                                "es"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Paginated list",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/PostList"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/BadRequest"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerError"
                    }
                }
            }
        },
        "/practical-info/{id}": {
            "get": {
                "operationId": "getPracticalInfoItem",
                "summary": "Get a single practical info guide",
                "tags": [
                    "PracticalInfo"
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "The guide",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Post"
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    }
                }
            }
        },
        "/properties": {
            "get": {
                "operationId": "listProperties",
                "summary": "List property listings",
                "description": "Returns listings from the Bolsa Inmobiliaria de Badalona. Includes sale and rental properties.",
                "tags": [
                    "Properties"
                ],
                "parameters": [
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page",
                        "schema": {
                            "type": "integer",
                            "default": 20,
                            "minimum": 1,
                            "maximum": 100
                        }
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page number",
                        "schema": {
                            "type": "integer",
                            "default": 1,
                            "minimum": 1
                        }
                    },
                    {
                        "name": "search",
                        "in": "query",
                        "required": false,
                        "description": "Filter by text",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "lang",
                        "in": "query",
                        "required": false,
                        "description": "Language code (ca/es)",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "ca",
                                "es"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Paginated list of properties",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/PropertyList"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/BadRequest"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerError"
                    }
                }
            }
        },
        "/properties/{id}": {
            "get": {
                "operationId": "getProperty",
                "summary": "Get a single property listing",
                "tags": [
                    "Properties"
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "The property",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Property"
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    }
                }
            }
        },
        "/search": {
            "get": {
                "operationId": "search",
                "summary": "Full-text search",
                "description": "Searches across all public content: services, news, practical info, and properties.",
                "tags": [
                    "Search"
                ],
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "required": true,
                        "description": "Search query",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Results per page (max 50)",
                        "schema": {
                            "type": "integer",
                            "default": 10
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Search results",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/PostList"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/BadRequest"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerError"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "Post": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "title": {
                        "type": "string"
                    },
                    "excerpt": {
                        "type": "string"
                    },
                    "content": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string",
                        "format": "uri"
                    },
                    "date": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "modified": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "thumbnail": {
                        "type": "string",
                        "format": "uri",
                        "nullable": true
                    },
                    "type": {
                        "type": "string"
                    }
                }
            },
            "PostList": {
                "type": "object",
                "properties": {
                    "items": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Post"
                        }
                    },
                    "total": {
                        "type": "integer"
                    },
                    "totalPages": {
                        "type": "integer"
                    }
                }
            },
            "PropertyMeta": {
                "type": "object",
                "properties": {
                    "price": {
                        "type": "string",
                        "nullable": true
                    },
                    "area_m2": {
                        "type": "string",
                        "nullable": true
                    },
                    "rooms": {
                        "type": "string",
                        "nullable": true
                    },
                    "bathrooms": {
                        "type": "string",
                        "nullable": true
                    },
                    "type": {
                        "type": "string",
                        "nullable": true
                    },
                    "operation": {
                        "type": "string",
                        "nullable": true,
                        "enum": [
                            "venda",
                            "lloguer",
                            null
                        ]
                    },
                    "location": {
                        "type": "string",
                        "nullable": true
                    }
                }
            },
            "Property": {
                "allOf": [
                    {
                        "$ref": "#/components/schemas/Post"
                    },
                    {
                        "type": "object",
                        "properties": {
                            "meta": {
                                "$ref": "#/components/schemas/PropertyMeta"
                            }
                        }
                    }
                ]
            },
            "PropertyList": {
                "type": "object",
                "properties": {
                    "items": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Property"
                        }
                    },
                    "total": {
                        "type": "integer"
                    },
                    "totalPages": {
                        "type": "integer"
                    }
                }
            },
            "SiteInfo": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string"
                    },
                    "description": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string",
                        "format": "uri"
                    },
                    "api": {
                        "type": "object",
                        "properties": {
                            "version": {
                                "type": "string"
                            },
                            "base": {
                                "type": "string",
                                "format": "uri"
                            },
                            "openapi": {
                                "type": "string",
                                "format": "uri"
                            },
                            "mcp": {
                                "type": "string",
                                "format": "uri"
                            }
                        }
                    }
                }
            },
            "Error": {
                "type": "object",
                "required": [
                    "error",
                    "status"
                ],
                "properties": {
                    "error": {
                        "type": "string",
                        "description": "Human-readable error message."
                    },
                    "code": {
                        "type": "string",
                        "description": "Machine-readable error code.",
                        "enum": [
                            "bad_request",
                            "not_found",
                            "rate_limited",
                            "server_error",
                            "api_error"
                        ]
                    },
                    "status": {
                        "type": "integer",
                        "description": "HTTP status code."
                    },
                    "docs": {
                        "type": "string",
                        "format": "uri",
                        "description": "Link to developer documentation."
                    }
                }
            }
        },
        "responses": {
            "BadRequest": {
                "description": "Invalid parameter or malformed request.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        }
                    }
                }
            },
            "NotFound": {
                "description": "Resource not found or not published.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        }
                    }
                }
            },
            "RateLimited": {
                "description": "Too many requests. Wait 60 seconds and retry.",
                "headers": {
                    "Retry-After": {
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Seconds until the rate limit resets."
                    },
                    "X-RateLimit-Limit": {
                        "schema": {
                            "type": "integer"
                        }
                    },
                    "X-RateLimit-Remaining": {
                        "schema": {
                            "type": "integer"
                        }
                    }
                },
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        }
                    }
                }
            },
            "ServerError": {
                "description": "Internal server error. Retry after a delay.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        }
                    }
                }
            }
        }
    },
    "x-mcp-server": "https://cambrabadalona.com/mcp",
    "x-mcp-server-card": "https://cambrabadalona.com/.well-known/mcp/server-card.json",
    "x-agent-card": "https://cambrabadalona.com/.well-known/agent-card.json",
    "x-ai-plugin": "https://cambrabadalona.com/.well-known/ai-plugin.json",
    "x-agent-mode": "https://cambrabadalona.com/?mode=agent",
    "x-rate-limit-limit": 60,
    "x-rate-limit-window": "60s"
}