{"openapi":"3.1.0","info":{"title":"F&A Works — API pública","version":"1.0.0","summary":"Serviços, cases e inscrição em novidades do estúdio F&A Works.","description":"API pública, somente leitura (exceto a inscrição em novidades), do estúdio F&A Works: prepara a marca de startups antes do pitch. Sem autenticação. Erros sempre em JSON com `code`, `message` e `hint`. Para ler qualquer página do site como Markdown, use `getPageMarkdown` ou envie `Accept: text/markdown`. Resumo para agentes: https://www.fsza.works/llms.txt","contact":{"name":"Felipe Arena","email":"felipe@fsza.works","url":"https://www.fsza.works/contact"}},"servers":[{"url":"https://www.fsza.works"}],"externalDocs":{"description":"Documentação para desenvolvedores e agentes","url":"https://www.fsza.works/developers"},"paths":{"/api/v1/services":{"get":{"operationId":"listServices","summary":"Lista os serviços do estúdio","description":"Retorna o catálogo de serviços da F&A Works (nome, descrição, entregáveis e prazo típico), agrupado pelo momento do ciclo de capital: pré-pitch, pós-rodada ou escala. Use para responder 'o que a F&A Works faz' ou 'quanto tempo leva'.","responses":{"200":{"description":"Lista de serviços.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceList"}}}},"429":{"description":"Limite de requisições excedido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/cases":{"get":{"operationId":"listCases","summary":"Lista os cases publicados","description":"Retorna os cases liberados para consulta pública, com setor, serviços entregues e link da página. Cases ainda em rascunho não aparecem. Filtre por serviço com o parâmetro `service`.","parameters":[{"name":"service","in":"query","required":false,"description":"Filtra por serviço entregue.","schema":{"type":"string","enum":["Identidade","Site","Narrativa & deck","Produto","Campanha"]}}],"responses":{"200":{"description":"Lista de cases.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseList"}}}},"400":{"description":"Valor inválido em `service`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requisições excedido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/markdown":{"get":{"operationId":"getPageMarkdown","summary":"Lê uma página do site como Markdown","description":"Converte uma página pública do site para Markdown. Equivale a pedir a própria URL com `Accept: text/markdown`. Caminhos inexistentes respondem 404 também em Markdown.","parameters":[{"name":"path","in":"query","required":true,"description":"Caminho da página, começando com `/`, por exemplo `/services`.","schema":{"type":"string","pattern":"^/.*","examples":["/","/services","/work/dietit"]}}],"responses":{"200":{"description":"Página em Markdown.","content":{"text/markdown":{"schema":{"type":"string"}}}},"400":{"description":"Caminho ausente ou inválido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Página inexistente (corpo em Markdown).","content":{"text/markdown":{"schema":{"type":"string"}}}}}}},"/api/subscribe":{"post":{"operationId":"subscribeToUpdates","summary":"Inscreve um e-mail nas novidades","description":"Registra o e-mail na lista de novidades da F&A Works. Use apenas com o consentimento explícito da pessoa dona do e-mail. Limite de 5 chamadas por minuto por IP.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeRequest"}}}},"responses":{"200":{"description":"Inscrição registrada.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":true}}}}}},"400":{"description":"JSON inválido ou e-mail ausente.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requisições excedido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Falha ao registrar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","hint","status","docs"],"properties":{"code":{"type":"string","description":"Código estável, em snake_case.","examples":["not_found","invalid_request","rate_limited"]},"message":{"type":"string","description":"O que aconteceu."},"hint":{"type":"string","description":"Como resolver."},"status":{"type":"integer","description":"Status HTTP."},"docs":{"type":"string","format":"uri","description":"Link desta especificação."}}}}},"Service":{"type":"object","required":["id","name","description","deliverables","timeline","stage","url"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"tagline":{"type":"string"},"description":{"type":"string"},"deliverables":{"type":"array","items":{"type":"string"}},"timeline":{"type":"string","description":"Prazo típico."},"stage":{"type":"string","enum":["pre-pitch","pos-rodada","escala"],"description":"Momento do ciclo de capital."},"url":{"type":"string","format":"uri"}}},"ServiceList":{"type":"object","required":["services"],"properties":{"services":{"type":"array","items":{"$ref":"#/components/schemas/Service"}}}},"Case":{"type":"object","required":["slug","name","sector","services","summary","url"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"sector":{"type":"string"},"services":{"type":"array","items":{"type":"string"}},"year":{"type":"string"},"summary":{"type":"string"},"url":{"type":"string","format":"uri"}}},"CaseList":{"type":"object","required":["cases"],"properties":{"cases":{"type":"array","items":{"$ref":"#/components/schemas/Case"}}}},"SubscribeRequest":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","maxLength":200},"name":{"type":"string","maxLength":200},"topic":{"type":"string","pattern":"^(geral|templates|template:[a-z0-9-]+)$","default":"geral"},"origin_path":{"type":"string","maxLength":200,"description":"Rota de onde veio a inscrição."}}}}}}