{
  "openapi": "3.1.0",
  "info": {
    "title": "ÁBATON public content API",
    "version": "1.0.0",
    "summary": "Read-only access to the projects, Journal articles and pages of abaton.es.",
    "description": "Public, read-only subset of the WordPress REST API of ÁBATON, an architecture, interior design and landscaping studio in Madrid. No authentication is needed for the GET operations listed here. Content exists in Spanish (lang=es, default) and English (lang=en). Project bodies are built with custom fields, so the `content` field may be empty: to read a project or article in full, request its `link` URL with the header `Accept: text/markdown`.",
    "contact": {
      "name": "ÁBATON",
      "url": "https://abaton.es/es/contacto/",
      "email": "info@abaton.es"
    }
  },
  "externalDocs": {
    "description": "WordPress REST API reference",
    "url": "https://developer.wordpress.org/rest-api/reference/"
  },
  "servers": [
    { "url": "https://abaton.es/wp-json/wp/v2" }
  ],
  "paths": {
    "/proyecto": {
      "get": {
        "operationId": "listProjects",
        "summary": "List architecture, interior design and landscaping projects",
        "parameters": [
          { "$ref": "#/components/parameters/lang" },
          { "$ref": "#/components/parameters/search" },
          { "$ref": "#/components/parameters/slug" },
          { "$ref": "#/components/parameters/per_page" },
          { "$ref": "#/components/parameters/page" },
          { "$ref": "#/components/parameters/fields" }
        ],
        "responses": { "200": { "$ref": "#/components/responses/ItemList" } }
      }
    },
    "/posts": {
      "get": {
        "operationId": "listJournalArticles",
        "summary": "List Journal articles (newest first)",
        "parameters": [
          { "$ref": "#/components/parameters/lang" },
          { "$ref": "#/components/parameters/search" },
          { "$ref": "#/components/parameters/slug" },
          { "$ref": "#/components/parameters/per_page" },
          { "$ref": "#/components/parameters/page" },
          { "$ref": "#/components/parameters/fields" },
          {
            "name": "categories",
            "in": "query",
            "description": "Comma-separated category IDs (see /categories).",
            "schema": { "type": "string" }
          }
        ],
        "responses": { "200": { "$ref": "#/components/responses/ItemList" } }
      }
    },
    "/pages": {
      "get": {
        "operationId": "listPages",
        "summary": "List institutional pages (services, studio, contact…)",
        "parameters": [
          { "$ref": "#/components/parameters/lang" },
          { "$ref": "#/components/parameters/search" },
          { "$ref": "#/components/parameters/slug" },
          { "$ref": "#/components/parameters/per_page" },
          { "$ref": "#/components/parameters/page" },
          { "$ref": "#/components/parameters/fields" }
        ],
        "responses": { "200": { "$ref": "#/components/responses/ItemList" } }
      }
    },
    "/search": {
      "get": {
        "operationId": "searchSite",
        "summary": "Full-text search across projects, articles and pages",
        "parameters": [
          { "$ref": "#/components/parameters/lang" },
          {
            "name": "search",
            "in": "query",
            "required": true,
            "description": "Search terms.",
            "schema": { "type": "string" }
          },
          {
            "name": "subtype",
            "in": "query",
            "description": "Restrict to one content type.",
            "schema": { "type": "string", "enum": ["proyecto", "post", "page"] }
          },
          { "$ref": "#/components/parameters/per_page" },
          { "$ref": "#/components/parameters/page" }
        ],
        "responses": {
          "200": {
            "description": "Search results.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "id": { "type": "integer" },
                      "title": { "type": "string" },
                      "url": { "type": "string", "format": "uri" },
                      "type": { "type": "string" },
                      "subtype": { "type": "string" }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/categories": {
      "get": {
        "operationId": "listCategories",
        "summary": "List Journal categories",
        "parameters": [
          { "$ref": "#/components/parameters/lang" },
          { "$ref": "#/components/parameters/per_page" }
        ],
        "responses": { "200": { "description": "Categories with id, name, slug and link." } }
      }
    }
  },
  "components": {
    "parameters": {
      "lang": {
        "name": "lang",
        "in": "query",
        "description": "Content language.",
        "schema": { "type": "string", "enum": ["es", "en"], "default": "es" }
      },
      "search": {
        "name": "search",
        "in": "query",
        "description": "Filter by search terms.",
        "schema": { "type": "string" }
      },
      "slug": {
        "name": "slug",
        "in": "query",
        "description": "Exact slug (last segment of the URL).",
        "schema": { "type": "string" }
      },
      "per_page": {
        "name": "per_page",
        "in": "query",
        "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 10 }
      },
      "page": {
        "name": "page",
        "in": "query",
        "schema": { "type": "integer", "minimum": 1, "default": 1 }
      },
      "fields": {
        "name": "_fields",
        "in": "query",
        "description": "Comma-separated list of fields to return, e.g. id,link,title,excerpt,date.",
        "schema": { "type": "string" }
      }
    },
    "responses": {
      "ItemList": {
        "description": "List of items. Total counts are in the X-WP-Total and X-WP-TotalPages headers.",
        "content": {
          "application/json": {
            "schema": {
              "type": "array",
              "items": { "$ref": "#/components/schemas/Item" }
            }
          }
        }
      }
    },
    "schemas": {
      "Item": {
        "type": "object",
        "properties": {
          "id": { "type": "integer" },
          "date": { "type": "string", "format": "date-time" },
          "modified": { "type": "string", "format": "date-time" },
          "slug": { "type": "string" },
          "link": { "type": "string", "format": "uri", "description": "Public URL; request it with Accept: text/markdown to read it in full." },
          "title": { "type": "object", "properties": { "rendered": { "type": "string" } } },
          "excerpt": { "type": "object", "properties": { "rendered": { "type": "string" } } },
          "content": { "type": "object", "properties": { "rendered": { "type": "string" } } }
        }
      }
    }
  }
}
