{
  "openapi": "3.1.0",
  "info": {
    "title": "API publica de Aplavo",
    "version": "1.0.0",
    "summary": "Catalogo comercial y blog de Aplavo. Solo lectura, sin autenticacion.",
    "description": "Sirve informacion publica del producto: planes, precios y articulos del blog. NO da acceso a datos de ningun cliente de Aplavo —resenas, empleadas, locales o suscripciones viven detras de sesion— y no escribe nada.",
    "contact": {
      "name": "Aplavo",
      "url": "https://aplavo.es"
    },
    "license": {
      "name": "Uso libre para consulta",
      "identifier": "CC-BY-4.0"
    }
  },
  "servers": [
    {
      "url": "https://aplavo.es",
      "description": "Produccion"
    }
  ],
  "paths": {
    "/api/publico/catalogo": {
      "get": {
        "operationId": "catalogo",
        "summary": "Planes y precios",
        "description": "Importes en centimos y sin IVA.",
        "responses": {
          "200": {
            "description": "Catalogo comercial",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "planes",
                    "moneda",
                    "ivaIncluido"
                  ],
                  "properties": {
                    "planes": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "id",
                          "nombre",
                          "precioMesCentimos"
                        ],
                        "properties": {
                          "id": {
                            "type": "string",
                            "examples": [
                              "esencial"
                            ]
                          },
                          "nombre": {
                            "type": "string"
                          },
                          "precioMesCentimos": {
                            "type": "integer",
                            "examples": [
                              4900
                            ]
                          },
                          "moneda": {
                            "type": "string",
                            "const": "EUR"
                          },
                          "localesIncluidos": {
                            "type": "integer"
                          },
                          "tarjetasIncluidas": {
                            "type": "integer"
                          },
                          "analisisConIa": {
                            "type": "boolean"
                          },
                          "resumen": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "localExtraMesCentimos": {
                      "type": "integer"
                    },
                    "tarjetaSueltaCentimos": {
                      "type": "integer"
                    },
                    "mesesGratisAlPagarUnAno": {
                      "type": "integer"
                    },
                    "localesDesdeLosQueSeHablaAMedida": {
                      "type": "integer"
                    },
                    "ivaIncluido": {
                      "type": "boolean",
                      "const": false
                    },
                    "moneda": {
                      "type": "string",
                      "const": "EUR"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/publico/blog": {
      "get": {
        "operationId": "listarArticulos",
        "summary": "Indice del blog",
        "parameters": [
          {
            "name": "limite",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Articulos publicados, sin el cuerpo",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "total": {
                      "type": "integer"
                    },
                    "entradas": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Entrada"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/publico/blog/{slug}": {
      "get": {
        "operationId": "leerArticulo",
        "summary": "Un articulo con su cuerpo en markdown",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "El articulo",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Entrada"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "contenidoMarkdown": {
                          "type": "string"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "No hay ninguna entrada publicada con ese slug"
          }
        }
      }
    },
    "/api/estado": {
      "get": {
        "operationId": "estado",
        "summary": "Estado operativo",
        "description": "Que proveedor esta activo y si las credenciales estan presentes. Nunca sus valores.",
        "responses": {
          "200": {
            "description": "Estado"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Entrada": {
        "type": "object",
        "required": [
          "slug",
          "titulo",
          "resumen",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "titulo": {
            "type": "string"
          },
          "resumen": {
            "type": "string"
          },
          "temas": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "publicadoEn": {
            "type": "string",
            "format": "date-time"
          },
          "actualizadoEn": {
            "type": "string",
            "format": "date-time"
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        }
      }
    }
  }
}