cloonyx

Início / Documentação / API REST

API REST

Por enquanto a API só lê; criar, editar e publicar continuam pelo app. Todas as rotas ficam em https://cloonyx.com/api/v1, recebem e devolvem JSON e exigem a chave no cabeçalho Authorization. O CORS é aberto, então a API também pode ser chamada do navegador, mas nunca coloque a chave num site público.

Rotas

MétodoCaminhoPermissãoO que faz
GET/api/v1/documentsLerLista documentos de um tipo
GET/api/v1/documents/:type/:idLerLê um documento com o rascunho
GET/api/v1/leadsLerLista leads
GET/api/v1/templatesLerLista modelos
GET/api/v1/blocksLerCatálogo de etapas, blocos e camadas

O objeto documento

As rotas de documentos devolvem este objeto. content é sempre o rascunho atual. A versão no ar só muda com a publicação.

CampoTipoDescrição
idtextoIdentificador do documento.
typetextoquizzes, offers, pages ou funnels.
nametextoNome interno.
statustextodraft ou published.
slugtextoCaminho do endereço público.
archivedbooleanoSe está arquivado no app.
projectIdtextoProjeto ao qual pertence.
publishedbooleanoSe existe uma versão no ar.
publicUrltexto ou nullEndereço público quando publicado.
versionsCountnúmeroQuantas versões publicadas existem. Só na leitura completa.
lastPublishedAtdata ou nullÚltima publicação. Só na leitura completa.
hasLiveVersionbooleanoSe a versão no ar existe. Só na leitura completa.
contentobjetoO rascunho. Formato em Formato dos documentos. Só na leitura completa.

Listar documentos

GET/api/v1/documents?type=quizzes
ParâmetroObrigatórioDescrição
typesimquizzes, offers, pages ou funnels.
archivednãoMande true para incluir os arquivados.
Pedido
curl -H "Authorization: Bearer clx_SUA_CHAVE" \
  "https://cloonyx.com/api/v1/documents?type=quizzes"
Resposta 200
{
  "type": "quizzes",
  "documents": [
    {
      "id": "6ce30f25-0b16-4f9d-95dd-1289b8b8f2a0",
      "type": "quizzes",
      "name": "Diagnóstico de produtividade",
      "status": "published",
      "slug": "foco-90-33684f02",
      "archived": false,
      "projectId": "33684f02-79e9-4c55-9793-2790a91d1f6e",
      "published": true,
      "publicUrl": "https://cloonyx.com/q/foco-90-33684f02"
    }
  ]
}

Ler um documento

GET/api/v1/documents/:type/:id

Devolve o objeto documento completo, com content.

Pedido
curl -H "Authorization: Bearer clx_SUA_CHAVE" \
  "https://cloonyx.com/api/v1/documents/quizzes/6ce30f25-0b16-4f9d-95dd-1289b8b8f2a0"

Listar leads

GET/api/v1/leads

Os leads mais novos vêm primeiro. A API só lê leads: não existe rota para apagar.

ParâmetroDescrição
quizIdSó os leads deste quiz, oferta ou página.
sinceData ISO. Só os leads criados nela ou depois, como 2026-10-01T00:00:00Z.
limitTamanho da página, de 1 a 200. Padrão 50.
cursorO nextCursor da página anterior.
Pedido
curl -H "Authorization: Bearer clx_SUA_CHAVE" \
  "https://cloonyx.com/api/v1/leads?since=2026-10-01T00:00:00Z&limit=100"
Resposta 200
{
  "leads": [
    {
      "id": "ba95db57-c4c7-4367-810a-eeeac7fa470c",
      "projectId": "33684f02-79e9-4c55-9793-2790a91d1f6e",
      "quizId": "6ce30f25-0b16-4f9d-95dd-1289b8b8f2a0",
      "fields": {
        "name": "Mariana Costa",
        "email": "[email protected]",
        "phone": "11999990000"
      },
      "score": 6,
      "tags": [
        "consistencia"
      ],
      "answers": {},
      "source": "Quiz",
      "status": "new",
      "createdAt": "2026-10-21T18:14:27.275Z",
      "utm": {
        "utm_source": "google"
      }
    }
  ],
  "nextCursor": "7"
}

Quando nextCursor vem null, acabou. Para ler tudo:

JavaScript
const base = "https://cloonyx.com/api/v1/leads?limit=200";
const headers = { Authorization: "Bearer " + process.env.CLOONYX_KEY };
let cursor = null;
const todos = [];
do {
  const url = cursor ? base + "&cursor=" + cursor : base;
  const r = await fetch(url, { headers }).then((res) => res.json());
  todos.push(...r.leads);
  cursor = r.nextCursor;
} while (cursor);
Campo do leadDescrição
fieldsDados do formulário, como name, email e phone.
answersRespostas do quiz por etapa.
scorePontuação somada das respostas.
tagsMarcadores das opções escolhidas.
utmParâmetros UTM da visita.
statusnew, won ou lost, como na aba Leads do app.
sourceDe onde o lead veio.
createdAtData de criação.

Listar modelos

GET/api/v1/templates

Devolve os modelos da galeria e os modelos salvos na conta, com as variáveis que a aplicação aceita.

Resposta 200
{
  "variables": [
    {
      "key": "produto",
      "label": "Nome do produto",
      "kind": "text"
    },
    {
      "key": "checkoutUrl",
      "label": "URL de checkout",
      "kind": "url"
    },
    {
      "...": ""
    }
  ],
  "templates": [
    {
      "id": "galeria-quentes-02",
      "name": "Página de produto com kits",
      "description": "Página longa de produto físico para lojas que vendem em kits, com avaliações, bônus e dúvidas.",
      "format": "pagina-de-vendas",
      "niche": "ecommerce",
      "source": "gallery",
      "requires": [],
      "documents": [
        {
          "key": "pagina",
          "collection": "offers"
        }
      ]
    }
  ]
}

Catálogo de blocos

GET/api/v1/blocks

Sem parâmetro, devolve os tipos de etapa, de bloco de quiz e de camada de página, com exemplos de formato e as regras. Com ?type=, devolve os campos e os valores padrão daquele tipo.

Pedido
curl -H "Authorization: Bearer clx_SUA_CHAVE" "https://cloonyx.com/api/v1/blocks?type=heading"
Resposta 200
{
  "type": "heading",
  "kind": "block",
  "label": "Título",
  "description": "Título de destaque com nível semântico",
  "allowedIn": [
    "quiz",
    "offer",
    "page"
  ],
  "usableInQuiz": true,
  "usableInPage": true,
  "fields": [
    {
      "key": "text",
      "kind": "textarea",
      "label": "Conteúdo"
    },
    {
      "key": "href",
      "kind": "text",
      "label": "Link / checkout do elemento"
    }
  ],
  "defaults": {
    "text": "O plano que cabe na sua semana",
    "level": 2,
    "highlight": "",
    "size": null
  }
}

Exemplo completo

Lista as páginas publicadas e baixa todos os leads de um quiz desde o começo do mês.

JavaScript, Node 18 ou mais novo
const API = "https://cloonyx.com/api/v1";
const headers = { Authorization: "Bearer " + process.env.CLOONYX_KEY };

async function ler(caminho) {
  const res = await fetch(API + caminho, { headers });
  const corpo = await res.json();
  if (!res.ok) throw new Error(corpo.motivo + ": " + corpo.error);
  return corpo;
}

const { documents } = await ler("/documents?type=pages");
console.log("No ar:", documents.filter((d) => d.published).map((d) => d.publicUrl));

const leads = [];
let cursor = null;
do {
  const pagina = await ler("/leads?limit=200&since=2026-10-01T00:00:00Z" + (cursor ? "&cursor=" + cursor : ""));
  leads.push(...pagina.leads);
  cursor = pagina.nextCursor;
} while (cursor);
console.log(leads.length, "leads");