{"openapi":"3.1.0","info":{"title":"LeadCraft API","version":"1.0.0","description":"API REST da LeadCraft. Autentique com uma chave de API pessoal (`Authorization: Bearer lc_live_...`), criada em Configurações → Chaves de API. Todas as respostas são JSON; erros seguem `{ error: { code, message, details? } }`. Limites: 60 requisições/min por chave."},"servers":[{"url":"https://leadcraft.studio/api/v1"}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"lc_live_…"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}}},"Site":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"status":{"type":"string","enum":["DRAFT","PUBLISHED","ARCHIVED"]},"hosting":{"type":"string","enum":["LEADCRAFT","EXTERNAL"],"description":"EXTERNAL: site montado no Build e publicado fora; aqui só recebe o formulário."},"niche":{"type":["string","null"]},"objective":{"type":["string","null"]},"customDomain":{"type":["string","null"]},"domainVerified":{"type":"boolean"},"url":{"type":"string","description":"Endereço público. Vazio num site do Build sem endereço informado."},"externalUrl":{"type":["string","null"]},"leadEndpoint":{"type":"string","description":"Endereço do formulário (POST público)."},"leadsToCrm":{"type":"boolean","description":"Cada contato do formulário também vira oportunidade no CRM."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"publishedAt":{"type":["string","null"],"format":"date-time"},"leads":{"type":"integer"},"views":{"type":"integer"}}},"GenerateInput":{"type":"object","required":["businessName","niche","objective"],"properties":{"businessName":{"type":"string","maxLength":80},"niche":{"type":"string","maxLength":120},"objective":{"type":"string","enum":["leads","sales","booking","whatsapp","brand"]},"audience":{"type":"string"},"differentials":{"type":"string"},"tone":{"type":"string","enum":["premium","friendly","bold","minimal","tech"]},"mode":{"type":"string","enum":["dark","light"]},"accent":{"type":"string","example":"#00ff66"},"city":{"type":"string"},"whatsapp":{"type":"string"},"includePricing":{"type":"boolean"}}},"Lead":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"phone":{"type":["string","null"]},"message":{"type":["string","null"]},"source":{"type":["string","null"]},"status":{"type":"string","enum":["NEW","CONTACTED","QUALIFIED","WON","LOST"]},"createdAt":{"type":"string","format":"date-time"}}},"PublicLead":{"type":"object","required":["name","email"],"properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"phone":{"type":"string"},"message":{"type":"string"},"source":{"type":"string"}}}},"responses":{"Unauthorized":{"description":"Sem autenticação válida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Recurso não encontrado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Validation":{"description":"Dados inválidos (422).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"RateLimited":{"description":"Limite de requisições excedido (429). Veja o header Retry-After."}}},"paths":{"/auth/me":{"get":{"summary":"Conta atual","tags":["Conta"],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Usuário, assinatura e totais."},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/dashboard":{"get":{"summary":"Visão geral (KPIs, série diária, últimos leads)","tags":["Conta"],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Totais de 30 dias, série por dia e sites."}}}},"/sites":{"get":{"summary":"Listar sites","tags":["Sites"],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Lista de sites.","content":{"application/json":{"schema":{"type":"object","properties":{"sites":{"type":"array","items":{"$ref":"#/components/schemas/Site"}}}}}}}}},"post":{"summary":"Gerar um site novo com IA","tags":["Sites"],"security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateInput"}}}},"responses":{"201":{"description":"Site criado como rascunho, com o SiteSpec."},"422":{"$ref":"#/components/responses/Validation"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/sites/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"ID do site"}],"get":{"summary":"Detalhes e SiteSpec","tags":["Sites"],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Site e spec."},"404":{"$ref":"#/components/responses/NotFound"}}},"patch":{"summary":"Atualizar nome, endereço, spec ou o envio ao CRM","description":"Site do Build (hosting EXTERNAL) aceita só name, externalUrl, leadsToCrm e active (false pausa o formulário).","tags":["Sites"],"security":[{"apiKey":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"},"spec":{"type":"object"},"leadsToCrm":{"type":"boolean"},"externalUrl":{"type":"string"},"active":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Site atualizado (republicado se estava publicado)."},"409":{"description":"Endereço em uso."}}},"delete":{"summary":"Excluir site","tags":["Sites"],"security":[{"apiKey":[]}],"responses":{"204":{"description":"Excluído."}}}},"/sites/{id}/refine":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"ID do site"}],"post":{"summary":"Refinar com instrução em linguagem natural","tags":["Sites"],"security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instruction"],"properties":{"instruction":{"type":"string","maxLength":1000}}}}}},"responses":{"200":{"description":"Spec atualizado."}}}},"/sites/{id}/publish":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"ID do site"}],"post":{"summary":"Publicar ou despublicar","tags":["Sites"],"security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["publish","unpublish"]}}}}}},"responses":{"200":{"description":"Novo status."}}}},"/sites/{id}/export":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"ID do site"}],"get":{"summary":"Baixar index.html autocontido","tags":["Sites"],"security":[{"apiKey":[]}],"responses":{"200":{"description":"HTML.","content":{"text/html":{}}}}}},"/sites/{id}/metrics":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"ID do site"},{"name":"days","in":"query","schema":{"type":"integer","default":30,"maximum":90}}],"get":{"summary":"Métricas do site","tags":["Sites"],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Acessos, leads, conversão, eventos, origens e série diária."}}}},"/sites/{id}/domain":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"ID do site"}],"put":{"summary":"Definir domínio próprio (devolve TXT de verificação)","tags":["Domínios"],"security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string"}}}}}},"responses":{"200":{"description":"Registro DNS a criar."},"403":{"description":"Plano sem domínio próprio."}}},"post":{"summary":"Verificar DNS","tags":["Domínios"],"security":[{"apiKey":[]}],"responses":{"200":{"description":"verified: true/false."}}},"delete":{"summary":"Remover domínio","tags":["Domínios"],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Removido."}}}},"/sites/{id}/leads":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"ID do site"}],"get":{"summary":"Leads de um site","tags":["Leads"],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Lista paginada."}}}},"/leads":{"get":{"summary":"Leads de todos os sites","tags":["Leads"],"security":[{"apiKey":[]}],"parameters":[{"name":"siteId","in":"query","schema":{"type":"string"}},{"name":"status","in":"query","schema":{"type":"string","enum":["NEW","CONTACTED","QUALIFIED","WON","LOST"]}},{"name":"q","in":"query","schema":{"type":"string"},"description":"Busca por nome, e-mail ou telefone"},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","default":25,"maximum":200}},{"name":"format","in":"query","schema":{"type":"string","enum":["json","csv"]}}],"responses":{"200":{"description":"Lista paginada (ou CSV).","content":{"application/json":{"schema":{"type":"object","properties":{"leads":{"type":"array","items":{"$ref":"#/components/schemas/Lead"}},"total":{"type":"integer"}}}}}}}}},"/leads/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"ID do lead"}],"patch":{"summary":"Atualizar status","tags":["Leads"],"security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NEW","CONTACTED","QUALIFIED","WON","LOST"]}}}}}},"responses":{"200":{"description":"Lead."}}},"delete":{"summary":"Excluir lead","tags":["Leads"],"security":[{"apiKey":[]}],"responses":{"204":{"description":"Excluído."}}}},"/leads/{id}/crm":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"ID do lead"}],"post":{"summary":"Levar o lead ao CRM","description":"Cria a oportunidade na primeira etapa (origem Site). Se o lead já tem card, devolve o mesmo.","tags":["Leads"],"security":[{"apiKey":[]}],"responses":{"200":{"description":"O lead já estava no CRM."},"201":{"description":"Oportunidade criada: { deal: { id, created } }."},"404":{"$ref":"#/components/responses/NotFound"}}}},"/public/sites/{slug}/leads":{"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Endereço público do site"}],"post":{"summary":"Enviar um lead (público, usado pelo formulário do site)","tags":["Público"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicLead"}}}},"description":"Aceita sites publicados na LeadCraft e sites do Build (exceto com o formulário pausado). CORS aberto.","responses":{"201":{"description":"Lead recebido."},"404":{"description":"Site não publicado ou formulário pausado."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/public/sites/{slug}/events":{"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Endereço público do site"}],"post":{"summary":"Evento de comportamento (cta_click, form_start, scroll_75)","tags":["Público"],"responses":{"204":{"description":"Sempre 204."}}}}}}