API da LeadCraft

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.

Base: https://leadcraft.studio/api/v1

Autenticação

Crie uma chave em Configurações → Chaves de API e envie no header Authorization. A chave inteira só aparece na criação; guarde-a num cofre de segredos.

curl https://leadcraft.studio/api/v1/sites \
  -H "Authorization: Bearer lc_live_SEU_TOKEN"
curl -X POST https://leadcraft.studio/api/v1/sites \
  -H "Authorization: Bearer lc_live_SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"businessName":"Sorria Curitiba","niche":"Clínica odontológica","objective":"booking","city":"Curitiba"}'

Erros e limites

  • Erros vêm como { error: { code, message, details? } }. Validações usam o status 422 e trazem os campos em details.
  • Limite por chave: 60 requisições por minuto. Acima disso a API responde 429 com o header Retry-After.
  • Geração e refino contam para a cota diária do plano (10 no Grátis, 100 no Pro, 500 no Agência).

Conta

get/auth/me

Conta atual

  • 200 Usuário, assinatura e totais.
  • 401
get/dashboard

Visão geral (KPIs, série diária, últimos leads)

  • 200 Totais de 30 dias, série por dia e sites.

Sites

get/sites

Listar sites

  • 200 Lista de sites.
post/sites

Gerar um site novo com IA

Corpo da requisição (JSON Schema)
{
  "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"
    }
  }
}
  • 201 Site criado como rascunho, com o SiteSpec.
  • 422
  • 429
get/sites/{id}

Detalhes e SiteSpec

ParâmetroOndeTipoDescrição
id*pathstringID do site
  • 200 Site e spec.
  • 404
patch/sites/{id}

Atualizar nome, endereço, spec ou o envio ao CRM

ParâmetroOndeTipoDescrição
id*pathstringID do site
Corpo da requisição (JSON Schema)
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "slug": {
      "type": "string"
    },
    "spec": {
      "type": "object"
    },
    "leadsToCrm": {
      "type": "boolean"
    },
    "externalUrl": {
      "type": "string"
    },
    "active": {
      "type": "boolean"
    }
  }
}
  • 200 Site atualizado (republicado se estava publicado).
  • 409 Endereço em uso.
delete/sites/{id}

Excluir site

ParâmetroOndeTipoDescrição
id*pathstringID do site
  • 204 Excluído.
post/sites/{id}/refine

Refinar com instrução em linguagem natural

ParâmetroOndeTipoDescrição
id*pathstringID do site
Corpo da requisição (JSON Schema)
{
  "type": "object",
  "required": [
    "instruction"
  ],
  "properties": {
    "instruction": {
      "type": "string",
      "maxLength": 1000
    }
  }
}
  • 200 Spec atualizado.
post/sites/{id}/publish

Publicar ou despublicar

ParâmetroOndeTipoDescrição
id*pathstringID do site
Corpo da requisição (JSON Schema)
{
  "type": "object",
  "required": [
    "action"
  ],
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "publish",
        "unpublish"
      ]
    }
  }
}
  • 200 Novo status.
get/sites/{id}/export

Baixar index.html autocontido

ParâmetroOndeTipoDescrição
id*pathstringID do site
  • 200 HTML.
get/sites/{id}/metrics

Métricas do site

ParâmetroOndeTipoDescrição
id*pathstringID do site
daysqueryinteger (padrão 30)
  • 200 Acessos, leads, conversão, eventos, origens e série diária.

Domínios

put/sites/{id}/domain

Definir domínio próprio (devolve TXT de verificação)

ParâmetroOndeTipoDescrição
id*pathstringID do site
Corpo da requisição (JSON Schema)
{
  "type": "object",
  "required": [
    "domain"
  ],
  "properties": {
    "domain": {
      "type": "string"
    }
  }
}
  • 200 Registro DNS a criar.
  • 403 Plano sem domínio próprio.
post/sites/{id}/domain

Verificar DNS

ParâmetroOndeTipoDescrição
id*pathstringID do site
  • 200 verified: true/false.
delete/sites/{id}/domain

Remover domínio

ParâmetroOndeTipoDescrição
id*pathstringID do site
  • 200 Removido.

Leads

get/sites/{id}/leads

Leads de um site

ParâmetroOndeTipoDescrição
id*pathstringID do site
  • 200 Lista paginada.
get/leads

Leads de todos os sites

ParâmetroOndeTipoDescrição
siteIdquerystring
statusqueryNEW | CONTACTED | QUALIFIED | WON | LOST
qquerystringBusca por nome, e-mail ou telefone
pagequeryinteger (padrão 1)
pageSizequeryinteger (padrão 25)
formatqueryjson | csv
  • 200 Lista paginada (ou CSV).
patch/leads/{id}

Atualizar status

ParâmetroOndeTipoDescrição
id*pathstringID do lead
Corpo da requisição (JSON Schema)
{
  "type": "object",
  "required": [
    "status"
  ],
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "NEW",
        "CONTACTED",
        "QUALIFIED",
        "WON",
        "LOST"
      ]
    }
  }
}
  • 200 Lead.
delete/leads/{id}

Excluir lead

ParâmetroOndeTipoDescrição
id*pathstringID do lead
  • 204 Excluído.
post/leads/{id}/crm

Levar o lead ao CRM

ParâmetroOndeTipoDescrição
id*pathstringID do lead
  • 200 O lead já estava no CRM.
  • 201 Oportunidade criada: { deal: { id, created } }.
  • 404

Público

post/public/sites/{slug}/leads

Enviar um lead (público, usado pelo formulário do site)

ParâmetroOndeTipoDescrição
slug*pathstringEndereço público do site
Corpo da requisição (JSON Schema)
{
  "type": "object",
  "required": [
    "name",
    "email"
  ],
  "properties": {
    "name": {
      "type": "string"
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "phone": {
      "type": "string"
    },
    "message": {
      "type": "string"
    },
    "source": {
      "type": "string"
    }
  }
}
  • 201 Lead recebido.
  • 404 Site não publicado ou formulário pausado.
  • 429
post/public/sites/{slug}/events

Evento de comportamento (cta_click, form_start, scroll_75)

ParâmetroOndeTipoDescrição
slug*pathstringEndereço público do site
  • 204 Sempre 204.