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étodo | Caminho | Permissão | O que faz |
|---|---|---|---|
| GET | /api/v1/documents | Ler | Lista documentos de um tipo |
| GET | /api/v1/documents/:type/:id | Ler | Lê um documento com o rascunho |
| GET | /api/v1/leads | Ler | Lista leads |
| GET | /api/v1/templates | Ler | Lista modelos |
| GET | /api/v1/blocks | Ler | Catá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.
| Campo | Tipo | Descrição |
|---|---|---|
id | texto | Identificador do documento. |
type | texto | quizzes, offers, pages ou funnels. |
name | texto | Nome interno. |
status | texto | draft ou published. |
slug | texto | Caminho do endereço público. |
archived | booleano | Se está arquivado no app. |
projectId | texto | Projeto ao qual pertence. |
published | booleano | Se existe uma versão no ar. |
publicUrl | texto ou null | Endereço público quando publicado. |
versionsCount | número | Quantas versões publicadas existem. Só na leitura completa. |
lastPublishedAt | data ou null | Última publicação. Só na leitura completa. |
hasLiveVersion | booleano | Se a versão no ar existe. Só na leitura completa. |
content | objeto | O rascunho. Formato em Formato dos documentos. Só na leitura completa. |
Listar documentos
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
type | sim | quizzes, offers, pages ou funnels. |
archived | não | Mande true para incluir os arquivados. |
curl -H "Authorization: Bearer clx_SUA_CHAVE" \
"https://cloonyx.com/api/v1/documents?type=quizzes"{
"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
Devolve o objeto documento completo, com content.
curl -H "Authorization: Bearer clx_SUA_CHAVE" \
"https://cloonyx.com/api/v1/documents/quizzes/6ce30f25-0b16-4f9d-95dd-1289b8b8f2a0"Listar leads
Os leads mais novos vêm primeiro. A API só lê leads: não existe rota para apagar.
| Parâmetro | Descrição |
|---|---|
quizId | Só os leads deste quiz, oferta ou página. |
since | Data ISO. Só os leads criados nela ou depois, como 2026-10-01T00:00:00Z. |
limit | Tamanho da página, de 1 a 200. Padrão 50. |
cursor | O nextCursor da página anterior. |
curl -H "Authorization: Bearer clx_SUA_CHAVE" \
"https://cloonyx.com/api/v1/leads?since=2026-10-01T00:00:00Z&limit=100"{
"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:
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 lead | Descrição |
|---|---|
fields | Dados do formulário, como name, email e phone. |
answers | Respostas do quiz por etapa. |
score | Pontuação somada das respostas. |
tags | Marcadores das opções escolhidas. |
utm | Parâmetros UTM da visita. |
status | new, won ou lost, como na aba Leads do app. |
source | De onde o lead veio. |
createdAt | Data de criação. |
Listar modelos
Devolve os modelos da galeria e os modelos salvos na conta, com as variáveis que a aplicação aceita.
{
"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
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.
curl -H "Authorization: Bearer clx_SUA_CHAVE" "https://cloonyx.com/api/v1/blocks?type=heading"{
"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.
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");