UniTV AutomationManual de uso Entrar no painel
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

  1. Receba um convite. O Super Admin gera um link individual para criar sua conta.
  2. Crie seu acesso. Informe nome, empresa, e-mail e uma senha com pelo menos 10 caracteres.
  3. Conecte o fornecedor. Cadastre o usuário e a senha usados no painel de revenda UniTV.
  4. Cadastre os vínculos. Relacione cada SN a um cliente ou pedido do seu sistema.
  5. 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.

  1. Clique em Salvar configuração.
  2. Clique em Carregar CAPTCHA.
  3. Digite os quatro números exibidos e clique em Conectar.
  4. 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

  1. Abra API & Webhooks.
  2. Escolha um nome, por exemplo n8n produção.
  3. 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.
  1. Adicione um node HTTP Request.
  2. Escolha Import cURL no menu do node.
  3. Cole o exemplo completo.
  4. Troque uta_COPIE_SEU_TOKEN_AQUI pelo token gerado no painel.
  5. 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.
🗄️ PostgreSQL + pagamentosBaixar workflow JSON
⚡ Redis + AI + PixBaixar workflow JSON
📋 Schema PostgreSQLBaixar SQL

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

  1. Crie uma credencial Header Auth chamada Automation Bearer: nome do header Authorization, valor Bearer uta_SEU_TOKEN.
  2. Crie uma credencial de header para a Uazapi: nome token, valor do token da sua instância.
  3. Para PostgreSQL, use o banco dedicado do workflow. Para Redis, use a credencial Redis do seu servidor e uma chave por telefone.
  4. 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

  1. Consulte o status do pedido usando o endpoint configurado pelo checkout.
  2. Se status=completed e purchase_type=NEW_ACCOUNT, chame POST action=criar_conta.
  3. Se for renovação, chame POST action=renovar.
  4. Somente depois da resposta de sucesso envie usuário e senha.
  5. 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

  1. Importe o workflow baixado.
  2. Configure as credenciais Automation, Uazapi, PostgreSQL/Redis e OpenAI, se usar o fluxo com IA.
  3. Ative o workflow e copie a URL de produção do Webhook para a Uazapi.
  4. Teste nesta ordem: ConsultarRenovarCONFIRMO → Pix → status pago.
  5. 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.

  1. Crie um workflow e adicione um node Manual Trigger.
  2. Depois dele, adicione um node HTTP Request.
  3. Na aba Parameters do HTTP Request, clique em Import cURL.
  4. Cole o comando abaixo, troque somente o token e confirme em Import.
  5. Clique em Execute step ou Test step.
  6. 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.

  1. Cadastre e mantenha ativo o vínculo da conta.
  2. Em Renovação automática, escolha a data de vencimento e o período: 1, 3 ou 6 meses, ou 1 ano.
  3. Marque Renovar automaticamente e salve.
  4. 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