{"openapi":"3.1.0","info":{"title":"Nutrali Public API","version":"1.0.0","summary":"Consultório online para nutricionistas: página profissional, agendamento, planos alimentares e acompanhamento.","description":"Página profissional, agenda, leads, plano alimentar e CRM do consultório num só lugar. Implementação na hora e suporte humanizado. Menos WhatsApp, mais consulta marcada.\n\nEsta spec cobre apenas endpoints **públicos** (sem login).\nPainel e `/api/org/*` exigem sessão do nutricionista e não fazem parte desta superfície.\n\nVersionamento: v1 atual. Alias `/api/v1/public/*` ≡ `/api/public/*`.\nBreaking changes → `/api/v2` com aviso ≥ 90 dias; Deprecation + Sunset quando aplicável.\nRate limits: headers RateLimit-* e Retry-After em 429.\n\nDocs: https://nutrali.co/docs · Catalog: https://nutrali.co/.well-known/api-catalog\nllms.txt: https://nutrali.co/llms.txt","contact":{"name":"Nutrali","email":"contato@nutrali.com.br","url":"https://nutrali.co"},"license":{"name":"Proprietary","url":"https://nutrali.co/privacidade"}},"servers":[{"url":"https://nutrali.co","description":"Produção"},{"url":"https://nutrali.co/api/v1","description":"Produção (alias versionado)"},{"url":"http://localhost:3000","description":"Desenvolvimento local"}],"tags":[{"name":"public","description":"API pública sem autenticação (rate-limited onde aplicável)"},{"name":"meta","description":"Descoberta para agentes e SEO"}],"paths":{"/api/public/saas-plans":{"get":{"tags":["public"],"summary":"Listar planos SaaS públicos","description":"Retorna planos comerciais visíveis na landing (preços mensais/anuais e trial).","operationId":"listSaasPlans","responses":{"200":{"description":"Lista de planos","content":{"application/json":{"schema":{"type":"object","required":["plans"],"properties":{"plans":{"type":"array","items":{"$ref":"#/components/schemas/SaasPlan"}},"trialDays":{"type":"integer","example":30}}}}}},"400":{"description":"Pedido inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Serviço indisponível","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/public/u/{slug}":{"get":{"tags":["public"],"summary":"Obter página pública publicada","description":"Retorna o conteúdo publicado da landing do nutricionista/clínica. 404 se o slug não existir ou não estiver publicado.","operationId":"getPublicPage","parameters":[{"name":"slug","in":"path","required":true,"description":"Slug público da organização (página do nutricionista).","schema":{"type":"string","minLength":2,"maxLength":64,"example":"clinica-exemplo"}}],"responses":{"200":{"description":"Página publicada","content":{"application/json":{"schema":{"type":"object","required":["page"],"properties":{"page":{"$ref":"#/components/schemas/PublicPage"}}}}}},"400":{"description":"Pedido inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Serviço indisponível","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/public/u/{slug}/leads":{"post":{"tags":["public"],"summary":"Capturar lead da landing","description":"Registra interesse comercial na página pública. Rate-limited. Não cria prontuário clínico.","operationId":"createPublicLead","parameters":[{"name":"slug","in":"path","required":true,"description":"Slug público da organização (página do nutricionista).","schema":{"type":"string","minLength":2,"maxLength":64,"example":"clinica-exemplo"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadInput"}}}},"responses":{"200":{"description":"Lead aceito","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true}}}}}},"400":{"description":"Pedido inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Serviço indisponível","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/public/u/{slug}/slots":{"get":{"tags":["public"],"summary":"Listar horários disponíveis","description":"Locais e slots para agendamento público quando o plano da org permitir.","operationId":"listPublicSlots","parameters":[{"name":"slug","in":"path","required":true,"description":"Slug público da organização (página do nutricionista).","schema":{"type":"string","minLength":2,"maxLength":64,"example":"clinica-exemplo"}},{"name":"from","in":"query","required":false,"description":"Data inicial (ISO date)","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"Slots","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Pedido inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Serviço indisponível","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/public/u/{slug}/bookings":{"post":{"tags":["public"],"summary":"Solicitar agendamento público","description":"Cria pedido de consulta na agenda pública. Rate-limited. Pode exigir plano Pro+.","operationId":"createPublicBooking","parameters":[{"name":"slug","in":"path","required":true,"description":"Slug público da organização (página do nutricionista).","schema":{"type":"string","minLength":2,"maxLength":64,"example":"clinica-exemplo"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingInput"}}}},"responses":{"200":{"description":"Pedido criado","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Pedido inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Serviço indisponível","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/public/u/{slug}/anamnesis":{"post":{"tags":["public"],"summary":"Enviar anamnese pública","description":"Submete respostas de anamnese vinculadas a token/paciente autorizado. Rate-limited.","operationId":"submitPublicAnamnesis","parameters":[{"name":"slug","in":"path","required":true,"description":"Slug público da organização (página do nutricionista).","schema":{"type":"string","minLength":2,"maxLength":64,"example":"clinica-exemplo"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Respostas do formulário de anamnese"}}}},"responses":{"200":{"description":"Anamnese recebida","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}}}},"400":{"description":"Pedido inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Serviço indisponível","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/public/u/{slug}/challenges/{challengeSlug}/enroll":{"post":{"tags":["public"],"summary":"Inscrever em desafio público","description":"Inscrição em desafio publicado. Rate-limited.","operationId":"enrollPublicChallenge","parameters":[{"name":"slug","in":"path","required":true,"description":"Slug público da organização (página do nutricionista).","schema":{"type":"string","minLength":2,"maxLength":64,"example":"clinica-exemplo"}},{"name":"challengeSlug","in":"path","required":true,"schema":{"type":"string","minLength":2,"maxLength":64}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","email"],"properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"phone":{"type":"string"}}}}}},"responses":{"200":{"description":"Inscrição criada","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Pedido inválido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Serviço indisponível","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/push/vapid-public-key":{"get":{"tags":["public"],"summary":"Chave pública VAPID","description":"Chave pública para Web Push no portal do paciente. Não expõe a chave privada.","operationId":"getVapidPublicKey","responses":{"200":{"description":"Chave pública","content":{"application/json":{"schema":{"type":"object","required":["publicKey"],"properties":{"publicKey":{"type":"string"}}}}}},"503":{"description":"Push não configurado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/openapi.json":{"get":{"tags":["meta"],"summary":"Este documento OpenAPI","description":"Spec OpenAPI 3.1 da superfície pública Nutrali.","operationId":"getOpenApiDocument","responses":{"200":{"description":"OpenAPI 3.1 JSON","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/llms.txt":{"get":{"tags":["meta"],"summary":"Brief Markdown para LLMs","description":"Inclui seção When to use this e links de descoberta.","operationId":"getLlmsTxt","responses":{"200":{"description":"text/markdown","content":{"text/markdown":{"schema":{"type":"string"}}}}}}},"/llms-full.txt":{"get":{"tags":["meta"],"summary":"Brief longo para LLMs","description":"Descrição longa da Nutrali para LLMs: diferenciais, planos e regras do que não inventar.","operationId":"getLlmsFullTxt","responses":{"200":{"description":"text/markdown","content":{"text/markdown":{"schema":{"type":"string"}}}}}}},"/docs":{"get":{"tags":["meta"],"summary":"Documentação humana/agente da API pública","description":"Página HTML (ou Markdown com Accept: text/markdown) com endpoints públicos e limites de segurança.","operationId":"getDocsPage","responses":{"200":{"description":"HTML ou Markdown via Accept"}}}}},"components":{"schemas":{"ApiError":{"type":"object","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"object","required":["code","message"],"additionalProperties":false,"properties":{"code":{"type":"string","description":"Código estável para tratamento programático","examples":["not_found","rate_limited","neon_off"]},"message":{"type":"string","description":"Mensagem legível"},"hint":{"type":"string","description":"Como resolver ou onde buscar docs"}}}}},"SaasPlan":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"productPlan":{"type":"string"},"priceMonthly":{"type":["number","null"]},"priceAnnual":{"type":["number","null"]}},"additionalProperties":true},"PublicPage":{"type":"object","description":"Landing pública do nutricionista (campos publicados)","additionalProperties":true},"LeadInput":{"type":"object","required":["name","email"],"properties":{"name":{"type":"string","minLength":1,"maxLength":200},"email":{"type":"string","format":"email"},"phone":{"type":"string","maxLength":40},"message":{"type":"string","maxLength":2000}},"additionalProperties":false},"BookingInput":{"type":"object","required":["name","email","startsAt"],"properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"phone":{"type":"string"},"startsAt":{"type":"string","format":"date-time"},"locationId":{"type":"string"},"notes":{"type":"string"}},"additionalProperties":true}}}}