{
  "openapi": "3.1.0",
  "info": {
    "title": "Taskem Public API",
    "version": "1.0.0",
    "description": "API pública read-only do Taskem — gestão de tarefas e projetos para equipes. Expõe dados públicos (planos, FAQ, blog e informações do produto). Sem autenticação e sem escrita.\n\n## Rate limiting\nAs respostas trazem os headers RFC RateLimit (`RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset`, `RateLimit-Policy`). O limite padrão é 120 requisições por 60s por IP; ao exceder, a API responde 429 com `Retry-After`.\n\n## Versionamento e depreciação\nA versão fica no path (`/api/v1`). Mudanças incompatíveis criam uma nova versão (`/api/v2`) sem alterar a anterior. Depreciações são sinalizadas com os headers `Deprecation` e `Sunset` (RFC 8594), com no mínimo 90 dias de aviso, e documentadas em https://taskem.com.br/developers#versionamento.",
    "contact": {
      "name": "Suporte Taskem",
      "email": "contato@taskem.com.br",
      "url": "https://taskem.com.br/suporte"
    },
    "license": {
      "name": "Proprietary"
    }
  },
  "servers": [
    {
      "url": "https://taskem.com.br",
      "description": "Produção (v1)"
    }
  ],
  "paths": {
    "/api/v1": {
      "get": {
        "operationId": "getApiIndex",
        "summary": "Índice da API",
        "description": "Retorna metadados da API e a lista de endpoints disponíveis.",
        "responses": {
          "200": {
            "description": "Índice da API.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiIndex"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/plans": {
      "get": {
        "operationId": "listPlans",
        "summary": "Listar planos",
        "description": "Retorna os planos do Taskem (Free, Pro, Business) com preços em BRL e recursos. Aceita filtro opcional por id.",
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "required": false,
            "description": "Filtra por um plano específico.",
            "schema": {
              "type": "string",
              "enum": [
                "free",
                "pro",
                "business"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lista de planos.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Plan"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/faq": {
      "get": {
        "operationId": "listFaq",
        "summary": "Listar perguntas frequentes",
        "description": "Retorna as perguntas frequentes (FAQ) do produto. Aceita limite opcional.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Número máximo de itens a retornar.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lista de perguntas e respostas.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FaqItem"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/blog": {
      "get": {
        "operationId": "listBlogPosts",
        "summary": "Listar artigos do blog",
        "description": "Retorna os metadados dos artigos publicados no blog do Taskem. Aceita filtro por tag e limite.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Número máximo de artigos a retornar.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "tag",
            "in": "query",
            "required": false,
            "description": "Filtra artigos que contenham esta tag.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lista de artigos (metadados).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BlogPostMeta"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/blog/{slug}": {
      "get": {
        "operationId": "getBlogPost",
        "summary": "Obter artigo do blog",
        "description": "Retorna um artigo específico do blog pelo seu slug, incluindo conteúdo em HTML e Markdown.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Identificador do artigo (slug).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Artigo encontrado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BlogPost"
                }
              }
            }
          },
          "404": {
            "description": "Artigo não encontrado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ApiIndex": {
        "type": "object",
        "required": [
          "name",
          "version",
          "endpoints"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "documentation": {
            "type": "string",
            "format": "uri"
          },
          "openapi": {
            "type": "string",
            "format": "uri"
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "method",
                "path",
                "description"
              ],
              "properties": {
                "method": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "Plan": {
        "type": "object",
        "required": [
          "id",
          "name",
          "currency",
          "features"
        ],
        "properties": {
          "id": {
            "type": "string",
            "enum": [
              "free",
              "pro",
              "business"
            ]
          },
          "name": {
            "type": "string"
          },
          "price_monthly_brl": {
            "type": [
              "number",
              "null"
            ]
          },
          "price_yearly_brl": {
            "type": [
              "number",
              "null"
            ]
          },
          "currency": {
            "type": "string",
            "enum": [
              "BRL"
            ]
          },
          "free_trial_days": {
            "type": "integer"
          },
          "features": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "FaqItem": {
        "type": "object",
        "required": [
          "question",
          "answer"
        ],
        "properties": {
          "question": {
            "type": "string"
          },
          "answer": {
            "type": "string"
          }
        }
      },
      "BlogPostMeta": {
        "type": "object",
        "required": [
          "slug",
          "title",
          "description"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "date": {
            "type": "string"
          },
          "author": {
            "type": "string"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "reading_time_minutes": {
            "type": "integer"
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "BlogPost": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BlogPostMeta"
          },
          {
            "type": "object",
            "required": [
              "content_markdown",
              "content_html"
            ],
            "properties": {
              "content_markdown": {
                "type": "string"
              },
              "content_html": {
                "type": "string"
              }
            }
          }
        ]
      },
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message"
            ],
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "hint": {
                "type": "string"
              }
            }
          }
        }
      }
    }
  }
}