{
  "openapi": "3.1.0",
  "info": {
    "title": "Unefesta Public Feeds API",
    "description": "Feeds públicos do marketplace Unefesta para descoberta, indexação e agentes de IA. Sem autenticação. Caso típico: listar serviços disponíveis por cidade e data — ex. GET /ai-feed/service?city=campinas&category=audiovisual&sub_category=fotografos-filmagem&date=2026-10-10. Documentação humana em https://www.unefesta.com.br/developers.",
    "version": "1.0.0",
    "contact": {
      "name": "Unefesta",
      "url": "https://www.unefesta.com.br"
    }
  },
  "servers": [
    {
      "url": "https://api.unefesta.com.br/api",
      "description": "API de produção"
    }
  ],
  "tags": [
    {
      "name": "public-feed",
      "description": "Catálogo público para descoberta ampla e indexação"
    },
    {
      "name": "ai-feed",
      "description": "Feed orientado a agentes, com disponibilidade por data"
    }
  ],
  "paths": {
    "/public-feed": {
      "get": {
        "tags": ["public-feed"],
        "summary": "Listar itens do catálogo público",
        "operationId": "getPublicFeed",
        "parameters": [
          { "$ref": "#/components/parameters/page" },
          { "$ref": "#/components/parameters/pageSize" },
          { "$ref": "#/components/parameters/city" },
          { "$ref": "#/components/parameters/category" },
          { "$ref": "#/components/parameters/subCategory" },
          { "$ref": "#/components/parameters/date" }
        ],
        "responses": {
          "200": {
            "description": "Página de itens do catálogo",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/FeedResponse" }
              }
            }
          }
        }
      }
    },
    "/public-feed/{adType}": {
      "get": {
        "tags": ["public-feed"],
        "summary": "Listar itens filtrados por tipo (sale, rent ou service)",
        "operationId": "getPublicFeedByType",
        "parameters": [
          { "$ref": "#/components/parameters/adType" },
          { "$ref": "#/components/parameters/page" },
          { "$ref": "#/components/parameters/pageSize" },
          { "$ref": "#/components/parameters/city" },
          { "$ref": "#/components/parameters/category" },
          { "$ref": "#/components/parameters/subCategory" },
          { "$ref": "#/components/parameters/date" }
        ],
        "responses": {
          "200": {
            "description": "Página de itens do catálogo",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/FeedResponse" }
              }
            }
          }
        }
      }
    },
    "/ai-feed": {
      "get": {
        "tags": ["ai-feed"],
        "summary": "Listar itens com disponibilidade para agentes",
        "operationId": "getAiFeed",
        "parameters": [
          { "$ref": "#/components/parameters/page" },
          { "$ref": "#/components/parameters/pageSize" },
          { "$ref": "#/components/parameters/city" },
          { "$ref": "#/components/parameters/category" },
          { "$ref": "#/components/parameters/subCategory" },
          { "$ref": "#/components/parameters/date" }
        ],
        "responses": {
          "200": {
            "description": "Página de itens com disponibilidade",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/FeedResponse" }
              }
            }
          }
        }
      }
    },
    "/ai-feed/{adType}": {
      "get": {
        "tags": ["ai-feed"],
        "summary": "Listar itens de IA filtrados por tipo",
        "operationId": "getAiFeedByType",
        "parameters": [
          { "$ref": "#/components/parameters/adType" },
          { "$ref": "#/components/parameters/page" },
          { "$ref": "#/components/parameters/pageSize" },
          { "$ref": "#/components/parameters/city" },
          { "$ref": "#/components/parameters/category" },
          { "$ref": "#/components/parameters/subCategory" },
          { "$ref": "#/components/parameters/date" }
        ],
        "responses": {
          "200": {
            "description": "Página de itens com disponibilidade",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/FeedResponse" }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "parameters": {
      "page": {
        "name": "page",
        "in": "query",
        "schema": { "type": "integer", "minimum": 1, "default": 1 },
        "description": "Número da página (1-based)"
      },
      "pageSize": {
        "name": "pageSize",
        "in": "query",
        "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 20 },
        "description": "Itens por página (máximo 100)"
      },
      "city": {
        "name": "city",
        "in": "query",
        "schema": { "type": "string" },
        "description": "Filtro por cidade (aceita também o alias legado `cidade`)"
      },
      "category": {
        "name": "category",
        "in": "query",
        "schema": { "type": "string" },
        "description": "Filtro por categoria (aceita também o alias legado `categoria`)"
      },
      "subCategory": {
        "name": "sub_category",
        "in": "query",
        "schema": { "type": "string" },
        "description": "Filtro por subcategoria (aceita também o alias legado `subcategoria`)"
      },
      "date": {
        "name": "date",
        "in": "query",
        "schema": { "type": "string", "format": "date" },
        "description": "Data de interesse no formato YYYY-MM-DD (aceita também o alias legado `data`). No ai-feed influencia a disponibilidade retornada."
      },
      "adType": {
        "name": "adType",
        "in": "path",
        "required": true,
        "schema": { "type": "string", "enum": ["sale", "rent", "service"] },
        "description": "Tipo de anúncio: venda, locação ou serviço"
      }
    },
    "schemas": {
      "FeedItem": {
        "type": "object",
        "required": ["id", "title", "price", "currency", "url"],
        "properties": {
          "id": { "type": "string" },
          "title": { "type": "string" },
          "description": { "type": "string" },
          "category": { "type": "string" },
          "sub_category": { "type": "string" },
          "price": { "type": "number" },
          "currency": { "type": "string", "const": "BRL" },
          "location": {
            "type": "object",
            "properties": {
              "city": { "type": "string" },
              "state": { "type": "string" },
              "country": { "type": "string", "const": "BR" }
            }
          },
          "provider": {
            "type": "object",
            "properties": {
              "name": { "type": "string" },
              "slug": { "type": "string" }
            }
          },
          "availability": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "date": { "type": "string", "format": "date" },
                "available": { "type": "boolean" },
                "price": { "type": "number" }
              }
            }
          },
          "rating": { "type": "number" },
          "review_count": { "type": "integer" },
          "images": {
            "type": "array",
            "items": { "type": "string", "format": "uri" }
          },
          "url": { "type": "string", "format": "uri" }
        }
      },
      "FeedResponse": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/FeedItem" }
          },
          "meta": {
            "type": "object",
            "properties": {
              "page": { "type": "integer" },
              "pageSize": { "type": "integer" },
              "pageCount": { "type": "integer" },
              "total": { "type": "integer" },
              "endpoint": { "type": "string" },
              "generatedAt": { "type": "string", "format": "date-time" }
            }
          }
        }
      }
    }
  }
}
