DOCUMENTAÇÃO OFICIAL
Crie contas e automatize renovações UniTV com segurança
O UniTV Automation conecta sua conta de revendedor ao n8n, WhatsApp, CRM ou outro sistema. Cada administrador possui credenciais, clientes, tokens e histórico isolados.
1. Primeiros passos
- Receba um convite. O Super Admin gera um link individual para criar sua conta.
- Crie seu acesso. Informe nome, empresa, e-mail e uma senha com pelo menos 10 caracteres.
- Conecte o fornecedor. Cadastre o usuário e a senha usados no painel de revenda UniTV.
- Cadastre os vínculos. Relacione cada SN a um cliente ou pedido do seu sistema.
- Gere um token. Use o token Bearer para autorizar n8n, WhatsApp ou outra integração.
Importante: o link de convite expira em 7 dias e só pode ser usado uma vez.
2. Conectar a conta do fornecedor
No menu Início, preencha o usuário e a senha do fornecedor. O Device code é gerado automaticamente; normalmente não precisa ser informado.
- Clique em Salvar configuração.
- Clique em Carregar CAPTCHA.
- Digite os quatro números exibidos e clique em Conectar.
- Se o fornecedor solicitar confirmação, informe o código recebido por e-mail ou telefone.
A senha fica cifrada no servidor. O painel nunca mostra a senha salva novamente.
Se a sessão do fornecedor expirar, a API responderá AUTH_REQUIRED. Entre no painel e repita o CAPTCHA/OTP; seus vínculos e tokens continuam salvos.
3. Contas e vínculos
O vínculo informa qual conta UniTV pertence a cada cliente da sua automação. Para operações normais, ele continua sendo a forma recomendada. Se você administra contas apenas por SN, pode usar operacao_direta: true em renovar, alterar_senha, editar_conta ou simular; a API valida o SN no fornecedor e cria somente um registro técnico para auditoria, sem exigir cadastro manual de cliente.
Em Contas, localize o SN e preencha:
- Cliente: nome legível para o painel.
- Referência da automação: identificador estável do seu sistema, como número do pedido, telefone ou ID do cliente.
- Telefone e e-mail: dados opcionais para consulta.
- Ativo: precisa estar marcado para permitir operações.
Você poderá localizar o vínculo por referencia_externa, sn ou vinculo_id.
Operação direta por SN: informe conexao_id, o sn e operacao_direta: true. A operação ainda respeita a permissão de renovação, senha ou edição do administrador, a conexão selecionada, o saldo, a confirmação e a idempotência.
POST /api.php?action=renovar
{
"conexao_id": 12,
"sn": "abc123",
"periodo": "1m",
"operacao_direta": true,
"idempotency_key": "renovacao-direta-abc123-001",
"confirmar": true
}
4. Gerar um token da API
- Abra API & Webhooks.
- Escolha um nome, por exemplo n8n produção.
- Clique em Gerar token e copie imediatamente.
O token completo aparece uma única vez. Todas as chamadas devem enviar:
Authorization: Bearer uta_SEU_TOKEN
Content-Type: application/json
Não envie o token em mensagens, parâmetros da URL ou campos públicos. Se houver suspeita de vazamento, revogue-o e gere outro.
5. Configurar no n8n
Jeito mais rápido: copie um dos comandos cURL deste manual. No node HTTP Request do n8n, abra o menu do node, escolha Import cURL, cole o comando e confirme.
- Adicione um node HTTP Request.
- Escolha Import cURL no menu do node.
- Cole o exemplo completo.
- Troque
uta_COPIE_SEU_TOKEN_AQUI pelo token gerado no painel.
- Troque a referência e a chave de idempotência pelos campos do seu fluxo.
Exemplo pronto para importar — simulação sem consumir pontos:
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=simular' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"referencia_externa": "pedido-2026-000123",
"periodo": "1m",
"incluir_senha": false
}'
Depois da importação, o node ficará equivalente a:
MethodPOST
URLhttps://automation.tectonny.com.br/api.php?action=simular
AuthenticationNone — o Bearer será enviado no header
Send HeadersAtivado
AuthorizationBearer uta_SEU_TOKEN
Content-Typeapplication/json
Send BodyAtivado · JSON
Para receber dados de outro node, substitua os valores fixos por expressões do n8n:
{
"referencia_externa": "{{ $json.cliente_id }}",
"periodo": "{{ $json.periodo || '1m' }}",
"idempotency_key": "pagamento-{{ $json.pagamento_id }}",
"confirmar": true
}
No próximo node, você pode testar sucesso com {{ $json.ok === true }} e ler o resultado em {{ $json.data }}.
5.1. 🧩 Fluxo n8n completo: WhatsApp, API e Pix
Esta seção reproduz o fluxo usado na prática: recebe uma mensagem da Uazapi, identifica o telefone, consulta as contas, mostra menus, simula a operação, aguarda CONFIRMO, gera o Pix e só depois cria ou renova a conta.
Baixe um fluxo pronto: importe o JSON no n8n e substitua apenas as credenciais. Os arquivos não contêm tokens reais.
Mapa visual do fluxo
1Webhook Uazapimensagem recebida
→
2Normalizar entradatelefone, comando, SN e período
→
3Consultar contaspor telefone ou SN
→
4Menu / simulaçãocomprar ou renovar
→
5CONFIRMO → Pixsem executar antes do pagamento
→
6Pagamento concluídocria/renova e envia acesso
🗺️ Catálogo rápido de endpoints
FornecedorGET action=status, GET action=conexoes, GET action=contas e GET action=vinculos
ConsultaPOST action=simular e POST action=consultar_conta
CompraPOST action=simular_criacao e POST action=criar_conta
RenovaçãoPOST action=renovar
Dados da contaPOST action=alterar_senha e POST action=editar_conta
RevendasGET/POST action=revendas, criar_revenda, editar_revenda e recarregar_revenda
CódigosGET action=codigos, POST action=consultar_codigo, gerar_codigo e editar_codigo
WhatsAppPOST /send/menu, POST /send/request-payment, POST /send/text e webhook de mensagens da Uazapi
🔐 Credenciais no n8n
- Crie uma credencial Header Auth chamada
Automation Bearer: nome do header Authorization, valor Bearer uta_SEU_TOKEN.
- Crie uma credencial de header para a Uazapi: nome
token, valor do token da sua instância.
- Para PostgreSQL, use o banco dedicado do workflow. Para Redis, use a credencial Redis do seu servidor e uma chave por telefone.
- Nunca coloque token em um node Code, em URL ou em mensagem do WhatsApp.
🧭 Node 1 — entrada e normalização
Use um Webhook POST, por exemplo /webhook/unitvia. Em seguida, um node Code deve produzir pelo menos:
{
"phone": "5511999999999",
"text": "renovar",
"command": "renew",
"period": "",
"sn": "",
"sessionKey": "unitv:5511999999999"
}
Para mensagens da Uazapi, mantenha o número completo para envio e remova o prefixo 55 somente quando a API do fornecedor exigir telefone nacional.
📱 Node 2 — menus Uazapi
Use HTTP Request POST para https://tectonny.uazapi.com/send/menu. No body JSON:
{
"number": "5511999999999",
"type": "list",
"text": "Escolha uma opção:",
"footerText": "UniTV Automation",
"listButton": "Ver opções",
"choices": [
"Comprar conta|buy",
"Renovar conta|renew",
"Consultar conta|consult"
],
"readchat": true,
"delay": 500
}
Para períodos, troque as opções por 1 mês|1m, 3 meses|3m, 6 meses|6m e 1 ano|1y. Depois que o usuário escolher, não envie o menu novamente.
🔎 Node 3 — consultar conexão e conta
Primeiro consulte a conexão:
curl --request GET \
--url 'https://automation.tectonny.com.br/api.php?action=conexoes' \
--header 'Authorization: Bearer uta_SEU_TOKEN'
Depois consulte por telefone ou SN. Para consulta direta por SN:
curl --request GET \
--url 'https://automation.tectonny.com.br/api.php?action=contas&q=abc123&page=1&page_size=20' \
--header 'Authorization: Bearer uta_SEU_TOKEN'
Se o telefone tiver mais de uma conta, mostre uma lista com os SNs e salve a escolha na sessão antes de pedir o período.
🧪 Node 4 — simulação obrigatória
Renovação:
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=simular' \
--header 'Authorization: Bearer uta_SEU_TOKEN' \
--header 'Content-Type: application/json' \
--data-raw '{
"conexao_id": 12,
"sn": "abc123",
"periodo": "1m",
"operacao_direta": true,
"incluir_senha": false
}'
Compra de conta nova:
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=simular_criacao' \
--header 'Authorization: Bearer uta_SEU_TOKEN' \
--header 'Content-Type: application/json' \
--data-raw '{
"conexao_id": 12,
"cliente_nome": "Maria Silva",
"telefone": "5511999999999",
"periodo": "1m"
}'
Mostre somente conta, período e valor. Não mostre saldo, pontos ou créditos. Só avance quando o cliente responder exatamente CONFIRMO.
💳 Node 5 — Pix e confirmação
O n8n chama o checkout interno do projeto de pagamento. O pedido fica pendente até o Mercado Pago confirmar; a execução que gerou o Pix não deve ficar aguardando.
{
"mode": "renew",
"sn": "abc123",
"period": "1m"
}
Para compra, use mode: "new", customer_name, phone e period. Envie o código Pix completo em uma mensagem/botão separado. Nunca envie somente a chave Pix.
✅ Node 6 — após o pagamento
- Consulte o status do pedido usando o endpoint configurado pelo checkout.
- Se
status=completed e purchase_type=NEW_ACCOUNT, chame POST action=criar_conta.
- Se for renovação, chame
POST action=renovar.
- Somente depois da resposta de sucesso envie usuário e senha.
- Em
RETRY ou pendente, consulte novamente; não crie cobrança duplicada.
🗄️ PostgreSQL ou ⚡ Redis?
PostgreSQLRecomendado para pedidos, auditoria, status e relatórios. Importe o SQL desta página antes do workflow.
RedisRecomendado para sessão rápida e memória de conversa. Use a chave unitv:{telefone} e TTL; não armazene senhas.
Você pode usar os dois: Redis para estado temporário da conversa e PostgreSQL para idempotência, cobrança e histórico permanente.
🧰 Teste rápido no n8n
- Importe o workflow baixado.
- Configure as credenciais Automation, Uazapi, PostgreSQL/Redis e OpenAI, se usar o fluxo com IA.
- Ative o workflow e copie a URL de produção do Webhook para a Uazapi.
- Teste nesta ordem: Consultar → Renovar → CONFIRMO → Pix → status pago.
- Use o painel Executions do n8n para conferir qual branch foi executado. Um node não conectado não será executado.
Idempotência: derive a chave do ID do pedido, por exemplo renovacao-{{ $json.pagamento_id }}. Nunca reutilize a mesma chave para outra operação.
6. Operações disponíveis
Consultar conexão e saldo
curl --request GET \
--url 'https://automation.tectonny.com.br/api.php?action=status' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI'
Listar contas
curl --request GET \
--url 'https://automation.tectonny.com.br/api.php?action=contas&q=3safes&page=1&page_size=50' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI'
Listar vínculos ativos
curl --request GET \
--url 'https://automation.tectonny.com.br/api.php?action=vinculos&ativo=1&q=3safes' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI'
Consultar histórico de operações
curl --request GET \
--url 'https://automation.tectonny.com.br/api.php?action=operacoes&limit=50' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI'
Consultar histórico de criações
curl --request GET \
--url 'https://automation.tectonny.com.br/api.php?action=criacoes&limit=50' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI'
Simular criação de conta
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=simular_criacao' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"cliente_nome": "Maria Silva",
"referencia_externa": "pedido-nova-conta-123",
"telefone": "5511999999999",
"email": "maria@exemplo.com",
"periodo": "1m"
}'
A simulação informa custo, saldo e elegibilidade sem criar a conta e sem consumir pontos.
Criar nova conta
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=criar_conta' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"cliente_nome": "Maria Silva",
"referencia_externa": "pedido-nova-conta-123",
"telefone": "5511999999999",
"email": "maria@exemplo.com",
"observacoes": "Criada pelo n8n",
"periodo": "1m",
"idempotency_key": "criar-conta-pedido-123",
"confirmar": true
}'
Resposta da criação concluída:
{
"ok": true,
"data": {
"repetida": false,
"criacao": {
"id": 15,
"status": "SUCESSO",
"referencia_externa": "pedido-nova-conta-123",
"sn": "3safes"
},
"conta": {
"id": 5329999,
"sn": "3safes",
"senha": "Xy1234"
},
"vinculo": {
"id": 22,
"external_ref": "pedido-nova-conta-123",
"active": 1
}
}
}
Copie a senha nessa primeira resposta. Por segurança, ela não é gravada no histórico, não aparece em repetições da mesma chave e não é enviada em webhooks de saída. Se perder, use a operação de troca de senha.
Criar ou atualizar vínculo
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=vinculo' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"sn": "3safes",
"cliente_nome": "Maria Silva",
"referencia_externa": "pedido-2026-000123",
"telefone": "5511999999999",
"email": "maria@exemplo.com",
"ativo": true
}'
Resposta esperada: {"ok":true,"data":{"id":12}}. Use esse ID como vinculo_id ou continue operando pela referencia_externa.
Simular renovação
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=simular' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"referencia_externa": "pedido-2026-000123",
"periodo": "1m",
"incluir_senha": false
}'
Períodos aceitos: 1m, 3m, 6m e 1y. A simulação não consome pontos.
Exemplo de resposta da simulação:
{
"ok": true,
"data": {
"vinculo": {
"id": 12,
"sn": "3safes",
"customer_name": "Maria Silva",
"external_ref": "pedido-2026-000123",
"active": 1
},
"conta": {
"id": 5321292,
"sn": "3safes",
"expireTime": "2026-08-02 17:47:47",
"statusTitle": "Used",
"days": 19
},
"plano": {
"periodo": "1m",
"points": 1,
"saldo": 20,
"saldo_suficiente": true
},
"elegivel": true
}
}
Renovar
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=renovar' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"referencia_externa": "pedido-2026-000123",
"periodo": "1m",
"idempotency_key": "pagamento-98765",
"confirmar": true
}'
Resposta de renovação concluída:
{
"ok": true,
"data": {
"repetida": false,
"operacao": {
"id": 41,
"idempotency_key": "pagamento-98765",
"operation": "RENOVAR",
"origin": "API",
"sn": "3safes",
"status": "SUCESSO",
"completed_at": "2026-07-14 22:50:00"
}
}
}
Trocar senha da conta UniTV
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=alterar_senha' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"referencia_externa": "pedido-2026-000123",
"nova_senha": "Ab1234",
"idempotency_key": "senha-98765",
"confirmar": true
}'
A nova senha deve possuir exatamente 6 caracteres alfanuméricos, com pelo menos uma letra e um número. Senhas iniciais geradas pelo fornecedor podem ter outro formato, mas a troca manual segue essa regra.
A troca é processada de forma assíncrona pelo fornecedor e pode levar até 5 minutos. A resposta pode vir com status ENVIADO; depois aguarde e execute simular com incluir_senha=true. Quando a senha final conferir, o histórico muda para SUCESSO.
Editar dados da conta
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=editar_conta' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"referencia_externa": "pedido-2026-000123",
"nome": "Maria Silva",
"telefone": "5511999999999",
"email": "maria@exemplo.com",
"observacoes": "Atualizado pelo n8n",
"idempotency_key": "editar-98765",
"confirmar": true
}'
Suspender e reativar o acesso
A suspensão combina duas ações: troca a senha por uma senha temporária segura e usa o status do fornecedor para exibir a conta como suspensa. A senha original fica cifrada somente durante a suspensão.
Limite do aplicativo: uma TV que já esteja com a sessão aberta pode continuar funcionando até o aplicativo ser fechado. Ao abrir novamente, a senha temporária impede o login. O status visual sozinho não encerra uma sessão existente.
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=suspender_conta' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"conexao_id": 12,
"sn": "3safes",
"operacao_direta": true,
"idempotency_key": "suspender-3safes-001",
"confirmar": true
}'
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=reativar_conta' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"conexao_id": 12,
"sn": "3safes",
"operacao_direta": true,
"idempotency_key": "reativar-3safes-001",
"confirmar": true
}'
Na reativação, a API restaura a senha original e volta o status visual para ativo. Se alguém tiver alterado a senha diretamente no fornecedor durante a suspensão, a restauração automática é bloqueada para não sobrescrever essa mudança.
Use GET https://automation.tectonny.com.br/api.php?action=suspensoes para consultar o estado das suspensões. As senhas original e temporária nunca são retornadas por esse endpoint, pelos históricos ou pelos webhooks.
Idempotência: use uma chave única e permanente por pagamento ou ação. Se o n8n repetir a mesma requisição, não será criada outra conta nem haverá cobrança duplicada de renovação.
7. Criar revendas e adicionar créditos
O painel original chama essa área de Reseller Management. A API permite criar revendas filhas, consultar seus saldos, editar observações e transferir pontos da conta pai.
Atenção: adicionar créditos consome o saldo da sua conta UniTV. Remover créditos devolve pontos à conta pai somente se o fornecedor aceitar a operação. Sempre use uma chave de idempotência exclusiva.
Qual identificador usar? Nas operações de recarga e débito você pode informar user_name (o usuário/nome da revenda) ou reseller_id (o ID numérico da revenda no fornecedor). O ID não é o SN de uma conta de cliente. Para descobrir os dois valores, consulte primeiro GET action=revendas; o exemplo abaixo usa user_name para ficar mais legível.
Listar revendas e saldos
curl --request GET \
--url 'https://automation.tectonny.com.br/api.php?action=revendas&page=1&page_size=50' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI'
Usuários de uma revenda: o fornecedor não aceita reseller_id como filtro no endpoint de contas. GET action=contas lista as contas da conexão UniTV autenticada. Para consultar os usuários de uma revenda separadamente, conecte as credenciais dessa revenda como outra conexão e use GET action=contas&conexao_id=....
Consultar os pacotes disponíveis
curl --request GET \
--url 'https://automation.tectonny.com.br/api.php?action=revenda_pacotes' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI'
Use o campo id do pacote retornado como package_id. Normalmente o pacote UniTV principal é o 1.
Criar uma revenda
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=criar_revenda' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"user_name": "revenda_exemplo",
"password": "Senha123",
"status": 1,
"remark": "Revenda criada pelo n8n",
"idempotency_key": "criar-revenda-001",
"confirmar": true
}'
A senha deve ter de 8 a 16 caracteres, com letras e números. Ela não é armazenada no histórico da API.
Editar a observação
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=editar_revenda' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"user_name": "revenda_exemplo",
"remark": "Cliente antigo",
"idempotency_key": "editar-revenda-001",
"confirmar": true
}'
Adicionar créditos mensais
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=recarregar_revenda' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"user_name": "revenda_exemplo",
"package_id": 1,
"points": 10,
"points_year": 0,
"remark": "Crédito mensal",
"idempotency_key": "credito-revenda-001",
"confirmar": true
}'
Adicionar créditos anuais
Para saldo anual, mantenha points em zero e informe points_year:
{
"user_name": "revenda_exemplo",
"package_id": 1,
"points": 0,
"points_year": 2,
"idempotency_key": "credito-anual-001",
"confirmar": true
}
Debitar créditos
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=debitar_revenda' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"user_name": "revenda_exemplo",
"package_id": 1,
"points": 1,
"points_year": 0,
"remark": "Ajuste de saldo",
"idempotency_key": "debito-revenda-001",
"confirmar": true
}'
Ativar ou bloquear uma revenda
A operação alterna o status atual da revenda. Use a mesma ação novamente somente quando quiser fazer a próxima alteração.
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=alternar_status_revenda' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"reseller_id": 123,
"idempotency_key": "status-revenda-001",
"confirmar": true
}'
Consultar o histórico
curl --request GET \
--url 'https://automation.tectonny.com.br/api.php?action=operacoes_revendas&limit=50' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI'
Os eventos de saída usam os nomes reseller.criar_revenda.sucesso, reseller.recarregar_revenda.sucesso, reseller.debitar_revenda.sucesso e seus equivalentes de falha.
8. Códigos de ativação
O fornecedor permite gerar códigos de 1 mês ou 1 ano. O cliente resgata o código no aplicativo UniTV; a API permite acompanhar quando ele passa de DISPONÍVEL para UTILIZADO.
Atenção: gerar códigos consome pontos. Sempre simule o custo e use uma idempotency_key exclusiva.
Teste seguro no n8n: veja o JSON sem consumir pontos
Faça primeiro uma consulta de leitura. Ela não gera código, não altera o saldo e não modifica nenhuma conta.
- Crie um workflow e adicione um node Manual Trigger.
- Depois dele, adicione um node HTTP Request.
- Na aba Parameters do HTTP Request, clique em Import cURL.
- Cole o comando abaixo, troque somente o token e confirme em Import.
- Clique em Execute step ou Test step.
- No painel OUTPUT, à direita, selecione a visualização JSON.
curl --request GET \
--url 'https://automation.tectonny.com.br/api.php?action=codigos&status=1' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI'
Uma resposta HTTP 200 aparecerá no formato abaixo. Os valores são apenas ilustrativos e outros campos do fornecedor também podem aparecer:
{
"ok": true,
"data": {
"list": [
{
"id": 123,
"status": 1,
"tipo": 0,
"periodo": "1m",
"status_label": "DISPONÍVEL",
"utilizado": false,
"codigo_mascarado": "ABCD••••WXYZ",
"codigo": null
}
],
"total": 1
}
}
Nos próximos nodes do n8n, leia os campos com expressões como:
{{ $json.ok }}
{{ $json.data.total }}
{{ $json.data.list[0].status_label }}
{{ $json.data.list[0].codigo_mascarado }}
Para enxergar também o status HTTP, em Options → Response ative Include Response Headers and Status. Nesse modo o corpo ficará dentro de body e o código HTTP aparecerá em statusCode.
Segundo teste seguro: simular a geração
Importe este comando em outro HTTP Request. A simulação informa custo e saldo, mas não cria código:
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=simular_codigo' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"periodo": "1m",
"quantidade": 1
}'
{
"ok": true,
"data": {
"periodo": "1m",
"tipo": 0,
"quantidade": 1,
"package_id": 1,
"custo_unitario": 1,
"points": 1,
"saldo": 10,
"saldo_suficiente": true
}
}
Testes que não consomem pontos: codigos, consultar_codigo e simular_codigo. Só use gerar_codigo quando realmente quiser criar o código.
Listar códigos sem mostrar o valor completo
curl --request GET \
--url 'https://automation.tectonny.com.br/api.php?action=codigos&status=1' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI'
Listar códigos completos para entrega
curl --request GET \
--url 'https://automation.tectonny.com.br/api.php?action=codigos&status=1&incluir_codigo=1' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI'
Simular geração sem consumir pontos
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=simular_codigo' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"periodo": "1m",
"quantidade": 1
}'
Gerar código
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=gerar_codigo' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"periodo": "1m",
"quantidade": 1,
"idempotency_key": "pedido-codigo-2026-000123",
"confirmar": true
}'
Associar dados do cliente
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=editar_codigo' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"codigo": "CODIGO_EXEMPLO_1234",
"nome": "Cliente Exemplo",
"telefone": "5511999999999",
"email": "cliente@exemplo.com",
"idempotency_key": "editar-codigo-pedido-000123",
"confirmar": true
}'
Acompanhar um código
curl --request POST \
--url 'https://automation.tectonny.com.br/api.php?action=consultar_codigo' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"codigo": "CODIGO_EXEMPLO_1234",
"incluir_codigo": false
}'
Todos esses comandos podem ser colados diretamente em Import cURL no node HTTP Request do n8n. O código completo não é salvo no histórico e não é enviado em webhooks de saída.
9. Exemplo inicial em PHP
Este exemplo mostra o começo de uma integração própria: criar.php chama a API pelo servidor e conta.php apresenta o SN e a senha uma única vez.
Não publique o exemplo sem adaptar a confirmação de pagamento. O campo pagamento_confirmado precisa vir do seu banco ou gateway. Nunca aceite essa confirmação enviada pelo navegador.
Arquivo criar.php
Configure o token como variável de ambiente UNITV_API_TOKEN. Não coloque o token no HTML, JavaScript ou repositório público.
<?php
declare(strict_types=1);
session_start();
$apiToken = getenv('UNITV_API_TOKEN');
if (!$apiToken) {
exit('Configure a variável UNITV_API_TOKEN no servidor.');
}
// Carregue estes dados do seu banco, nunca diretamente do navegador.
$pedido = [
'id' => 'pedido-12345',
'cliente_nome' => 'Maria Silva',
'telefone' => '5511999999999',
'email' => 'maria@exemplo.com',
'periodo' => '1m',
'pagamento_confirmado' => false, // Troque pelo resultado real do seu gateway/banco.
];
if (!$pedido['pagamento_confirmado']) {
http_response_code(403);
exit('Pagamento ainda não confirmado.');
}
$payload = [
'cliente_nome' => $pedido['cliente_nome'],
'referencia_externa' => $pedido['id'],
'telefone' => $pedido['telefone'],
'email' => $pedido['email'],
'periodo' => $pedido['periodo'],
'idempotency_key' => 'criar-conta-' . $pedido['id'],
'confirmar' => true,
];
$ch = curl_init(
'https://automation.tectonny.com.br/api.php?action=criar_conta'
);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_TIMEOUT => 60,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiToken,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode($payload),
]);
$body = curl_exec($ch);
$httpCode = (int) curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
$curlError = curl_error($ch);
curl_close($ch);
if ($body === false || $curlError !== '') {
throw new RuntimeException('Falha de conexão: ' . $curlError);
}
$resposta = json_decode($body, true);
if ($httpCode !== 200 || empty($resposta['ok'])) {
$mensagem = $resposta['message'] ?? 'A criação da conta falhou.';
throw new RuntimeException($mensagem);
}
$conta = $resposta['data']['conta'] ?? null;
if (!$conta || empty($conta['sn']) || empty($conta['senha'])) {
throw new RuntimeException('A conta foi processada, mas o acesso não retornou.');
}
// A senha passa para a próxima página sem aparecer na URL.
$_SESSION['unitv_conta_uma_vez'] = [
'cliente' => $pedido['cliente_nome'],
'sn' => $conta['sn'],
'senha' => $conta['senha'],
];
header('Location: conta.php');
exit;
Arquivo conta.php
A senha não vai pela URL. Ela fica temporariamente na sessão e é removida assim que a página é aberta.
<?php
declare(strict_types=1);
session_start();
header('Cache-Control: no-store, private');
header('Pragma: no-cache');
$conta = $_SESSION['unitv_conta_uma_vez'] ?? null;
unset($_SESSION['unitv_conta_uma_vez']); // Exibe somente uma vez.
if (!$conta) {
http_response_code(404);
exit('Nenhuma conta nova disponível.');
}
function h(string $valor): string
{
return htmlspecialchars($valor, ENT_QUOTES, 'UTF-8');
}
?>
<!doctype html>
<html lang="pt-br">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Sua conta UniTV</title>
</head>
<body>
<h1>Conta criada com sucesso</h1>
<p>Cliente: <?= h($conta['cliente']) ?></p>
<p>SN: <strong><?= h($conta['sn']) ?></strong></p>
<p>Senha: <strong><?= h($conta['senha']) ?></strong></p>
<p>Guarde esses dados. A senha não aparecerá novamente.</p>
</body>
</html>
Próximos passos para cada projeto: consultar o pedido no banco, validar o pagamento, autenticar o cliente, personalizar o HTML e definir como recuperar o acesso caso a página seja fechada. Se a senha for perdida, utilize a troca de senha da API.
10. Webhooks
Webhook de entrada
É uma alternativa à URL com ?action=. Este cURL também pode ser importado diretamente no HTTP Request do n8n:
curl --request POST \
--url 'https://automation.tectonny.com.br/webhook.php' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"operacao": "renovar",
"referencia_externa": "pedido-2026-000123",
"periodo": "1m",
"idempotency_key": "pagamento-98765",
"confirmar": true
}'
O header Authorization continua obrigatório. O retorno possui o mesmo formato da API.
Também é possível criar uma conta pelo webhook de entrada:
curl --request POST \
--url 'https://automation.tectonny.com.br/webhook.php' \
--header 'Authorization: Bearer uta_COPIE_SEU_TOKEN_AQUI' \
--header 'Content-Type: application/json' \
--data-raw '{
"operacao": "criar_conta",
"cliente_nome": "Maria Silva",
"referencia_externa": "pedido-nova-conta-123",
"periodo": "1m",
"idempotency_key": "criar-conta-pedido-123",
"confirmar": true
}'
Webhooks de saída
Cadastre uma URL HTTPS pública para receber o resultado das operações. O sistema envia a assinatura no header X-Unitv-Signature, calculada com HMAC SHA-256 e o segredo cadastrado.
Exemplo real do JSON recebido pelo seu webhook:
{
"event": "operation.renovar.sucesso",
"created_at": "2026-07-14T22:50:00-03:00",
"data": {
"id": 41,
"idempotency_key": "pagamento-98765",
"operation": "RENOVAR",
"origin": "API",
"sn": "3safes",
"status": "SUCESSO",
"completed_at": "2026-07-14 22:50:00"
}
}
Headers enviados:
Content-Type: application/json
X-Unitv-Event: operation.renovar.sucesso
X-Unitv-Signature: sha256=ASSINATURA_HMAC
Valide a assinatura antes de aceitar o evento e responda com HTTP 2xx.
Eventos de criação: account.creation.sucesso, account.creation.enviado e account.creation.falha. O JSON do webhook de saída nunca contém a senha da conta.
11. Várias contas UniTV na mesma operação
Um administrador pode conectar mais de uma conta de revendedor UniTV. Cada conexão recebe um conexao_id e mantém credenciais, sessão, saldo e histórico separados.
GET https://automation.tectonny.com.br/api.php?action=conexoes
Authorization: Bearer uta_SEU_TOKEN
Use o connection_id retornado como conexao_id na consulta ou operação. Se não informar, a API utiliza a conexão padrão.
Para cadastrar outra conta pela API, use POST action=salvar_conexao com nova_conexao=true. Se o nome não for informado, o sistema cria um nome automático. Para excluir, use POST action=excluir_conexao com confirmar=true; conexões com vínculos ativos precisam ser desvinculadas antes. Nunca coloque credenciais reais em exemplos públicos.
curl -X POST 'https://automation.tectonny.com.br/api.php?action=renovar' \
-H 'Authorization: Bearer uta_SEU_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"conexao_id": 2,
"referencia_externa": "cliente-123",
"periodo": "1m",
"idempotency_key": "renovacao-cliente-123-conexao-2",
"confirmar": true
}'
Os vínculos locais passam a registrar qual conexão originou o SN. A mesma chave de idempotência continua protegida, mas operações explicitamente direcionadas a outra conexão recebem escopo próprio.
Importante: o fallback automático entre conexões só deve ocorrer quando o fornecedor confirmar saldo insuficiente. Timeout ou erro de autenticação não deve trocar de painel, evitando uma renovação duplicada.
{
"conexao_id": 1,
"fallback_conexoes": [2, 3],
"referencia_externa": "cliente-123",
"periodo": "1m",
"idempotency_key": "renovacao-cliente-123-fallback",
"confirmar": true
}
O fallback é opcional. Sem fallback_conexoes, apenas a conexão escolhida é utilizada.
No site renovar.tectonny.com.br, o Super Admin pode configurar o mesmo comportamento em Painéis UniTV usados pelo site: informe o ID principal e, opcionalmente, os IDs de fallback separados por vírgula. O site preserva o conexao_id da conta localizada ao criar o vínculo e concluir a renovação.
12. Plano PRO e renovação automática
O Super Admin pode alternar cada administrador entre STARTER e PRO. Somente o PRO apresenta, na página Contas, os controles de vencimento e renovação automática.
- Cadastre e mantenha ativo o vínculo da conta.
- Em Renovação automática, escolha a data de vencimento e o período: 1, 3 ou 6 meses, ou 1 ano.
- Marque Renovar automaticamente e salve.
- Mantenha o fornecedor conectado e saldo suficiente. A operação aparecerá no Histórico com origem
AUTO_PRO.
O sistema verifica vencimentos a cada cinco minutos, impede processamento duplicado e atualiza a próxima data depois da confirmação do fornecedor. Em caso de falha, mostra o motivo no painel e aguarda seis horas para uma nova tentativa. Ao voltar para STARTER, as configurações ficam guardadas, mas não são executadas.
12.1. Limites e limpeza administrativa
No menu Super Admin, a área Padrões dos planos define o limite mensal e as permissões padrão de STARTER e PRO. O padrão inicial é 100 operações para STARTER e 1.000 para PRO, mas os valores podem ser alterados.
Marque Aplicar também aos administradores atuais somente quando quiser sobrescrever as políticas individuais daquele plano.
A área Limpar logs e históricos pode remover logs da API, históricos de operações e entregas de webhook. Contas, vínculos, tokens, credenciais e a auditoria do Super Admin são preservados. A confirmação exige digitar APAGAR.
13. Erros comuns
401 UNAUTHORIZEDToken ausente, incorreto ou revogado.
404 LINK_NOT_FOUNDA referência, SN ou vínculo não está cadastrado e ativo.
422 CONFIRMATION_REQUIREDEnvie "confirmar": true nas operações que alteram dados ou consomem pontos.
429 MONTHLY_LIMIT_REACHEDO limite mensal definido pelo Super Admin foi atingido.
503 AUTH_REQUIREDA sessão do fornecedor expirou; reconecte pelo painel.
502 HTTP_ERRORO fornecedor ficou indisponível ou mudou o endereço; informe o Super Admin.
14. Segurança e boas práticas
- Sempre execute simular_criacao antes de criar e simular antes de renovar.
- Guarde tokens e segredos nas credenciais do n8n, nunca diretamente em nodes compartilhados.
- Use uma
idempotency_key derivada do pagamento ou pedido.
- Revogue tokens de integrações desativadas.
- Não registre senhas de clientes em logs, planilhas ou mensagens.
- Consulte o menu Histórico para auditar cada operação.
Acessar o UniTV Automation