Documentação da chamada do HyperSync
Por Cesar Ramalho (abre em nova aba), HSB Consultoria · Atualizado em
Todo endpoint do HyperSync é chamado pela mesma rota, POST /api/v1/hypersync/execute, com o código do endpoint no campo id do corpo. A autenticação é o token Bearer do REST do próprio Protheus, e a empresa e a filial vão no header tenantId. O que muda de um tipo para outro é o resto do corpo e a resposta.
- O endpoint configurado já é o webservice de produção: sem fonte ADVPL, sem compilar, sem patch no RPO.
- O sandbox de cada endpoint gera o cURL e a collection do Postman com a chamada pronta.
- Entrada e saída usam os nomes de campo do Protheus: não há de-para.
Autenticação e headers
Quem integra pega um token no REST do próprio Protheus (o OAuth2 do Protheus, com usuário e senha do ERP) e manda em Authorization: Bearer. Validade e renovação do token seguem o REST do Protheus. Além do token, o usuário precisa estar na lista de autorizados do endpoint, definida no passo de autorização do configurador.
Toda chamada:
POST https://seu-backend/api/v1/hypersync/execute Authorization: Bearer <token do REST do Protheus> tenantId: 99,01 Content-Type: application/json
Headers:
- Authorization
- Bearer com o token do REST do próprio Protheus.
- tenantId
- Empresa e filial em que a chamada roda, separadas por vírgula (ex.: 99,01).
- Content-Type
- application/json: o corpo é sempre JSON.
A URL base é a do backend do HyperSync no ambiente de vocês; o cURL que o sandbox gera já traz a URL completa. Cada ambiente do Protheus (homologação, produção) tem os seus endpoints, sem cópia automática de um para o outro.
Rota única
Não existe URL por endpoint. Todos usam POST /api/v1/hypersync/execute, e o campo id do corpo diz qual endpoint executar. Antes de executar, a chamada volta 400 se faltar o id, se o endpoint não existir ou estiver inativo, ou se o usuário não estiver na lista de autorizados.
Query SQL
Saída: devolve o resultado da consulta do endpoint na própria chamada. O corpo diz quais campos voltam, como no GraphQL, e o filtro. A resposta traz os nomes de campo em minúsculas. A trava de SQL garante que o endpoint de consulta só lê: para gravar, os tipos são ExecAuto e RecLock.
Corpo:
{
"id": 41,
"data": {
"fields": ["A1_COD", "A1_NOME", "A1_EST"],
"params": "A1_EST = 'SP'",
"page": 1,
"pageSize": 50
}
}Resposta:
{
"result": [
{ "a1_cod": "000231", "a1_nome": "COMERCIAL ALVORADA LTDA", "a1_est": "SP" },
{ "a1_cod": "000117", "a1_nome": "DISTRIBUIDORA PAULISTA SA", "a1_est": "SP" }
]
}- id
- Código do endpoint.
- data.fields
- As colunas que devem voltar, entre as que a consulta do endpoint traz.
- data.params
- Filtro, como condição SQL. Só vale quando o endpoint permite parâmetros.
- data.page
- Página pedida.
- data.pageSize
- Registros por página. Sem paginação, volta tudo o que a consulta trouxer: o limite vem da própria consulta.
ExecAuto
Entrada: grava pela rotina automática padrão do Protheus, com as validações da própria rotina. Cabeçalho e itens vão na mesma chamada. Datas em AAAAMMDD. No pedido de venda, o C5_NUM fica de fora: a rotina numera.
Corpo (pedido de venda pela MATA410, simplificado):
{
"id": 42,
"function": "MATA410",
"action": 3,
"data": {
"cabec": {
"C5_CLIENTE": "000231",
"C5_LOJACLI": "01",
"C5_EMISSAO": "20261013",
"C5_CONDPAG": "001"
},
"itens": [
{ "C6_PRODUTO": "PA-00102", "C6_QTDVEN": 2, "C6_PRCVEN": 899.9, "C6_TES": "501" }
]
}
}Resposta quando grava:
{
"successMessage": "Registro incluído via execauto com sucesso!"
}Resposta quando a rotina recusa (FINA050 com natureza inválida, abreviada):
{
"errorMessage": "AJUDA:E2_NATUREZ\n...\nNatureza - E2_NATUREZ := DINHEIRO < -- Invalido\n...\nFalha na gravação automática do Titulo!"
}- id
- Código do endpoint.
- function
- A rotina automática: MATA410 (pedido de venda), FINA050 (títulos a pagar) e outras. Fica fora de data.
- action
- 3 inclui, 4 altera, 5 exclui. O endpoint define quais operações são permitidas. Fica fora de data.
- data.cabec
- Campos do cabeçalho, com os nomes do Protheus.
- data.itens
- Lista de itens, quando a rotina tem detalhe. Na MATA410, os itens da SC6, na mesma chamada do cabeçalho.
O passo a passo do pedido de venda está em Pedido de venda no Protheus por API (MATA410).
RecLock
Entrada: grava direto na tabela, sem passar pela rotina padrão, então as validações da rotina não rodam. Quando a regra da rotina importa, use ExecAuto. O sandbox do configurador traz este modelo de corpo, e o teste nele mostra o retorno.
Corpo de inclusão (operation 3):
{
"id": 43,
"table": "SA1",
"operation": 3,
"fields": {
"A1_COD": "000142",
"A1_LOJA": "01",
"A1_NOME": "CLIENTE EXEMPLO LTDA",
"A1_PESSOA": "J"
}
}Corpo de alteração (operation 4, com chave e índice):
{
"id": 43,
"table": "SA1",
"operation": 4,
"fields": { "A1_NOME": "CLIENTE EXEMPLO COMERCIO LTDA" },
"chave": " 00014201",
"indice": 1
}- id
- Código do endpoint.
- table
- A tabela que recebe o registro.
- operation
- 3 inclui, 4 altera, 5 exclui.
- fields
- Os campos gravados, com os nomes do Protheus.
- chave
- Obrigatória em 4 e 5. Os valores na sequência do índice, como no DbSeek: no índice 1 da SA1, filial, código e loja, cada um no tamanho do campo.
- indice
- Obrigatório em 4 e 5. O número do índice da tabela usado no DbSeek.
Customizado
O endpoint chama uma função ADVPL de vocês, para a regra de negócio que nenhuma rotina padrão cobre. A chamada usa a mesma rota, com o código do endpoint em id; o que mais vai no corpo e o que volta são definidos pela função. É o único tipo que envolve ADVPL. O endpoint continua no configurador, com autorização e auditoria como os outros.
Banco de Dados e Arquivo
Os dois são saída, sempre assíncronos, e rodam pelo Schedule do Protheus, na frequência que vocês configurarem. A origem é uma consulta SQL, e o destino é o banco ou o FTP de vocês. O resultado de cada execução fica na Auditoria.
Banco de Dados
Grava o resultado da consulta em SQL Server, PostgreSQL ou Oracle. Cria a tabela de destino se ela não existir e atualiza ou insere pela chave escolhida. O tipo Banco de Dados não tem sandbox.
O que o Schedule envia (o código do endpoint, e mais nada):
{ "id": "000045" }Resultado:
{
"result": "Registros atualizados: 0 | Registros inseridos: 3 | Erros: 0"
}Arquivo
Gera um arquivo CSV ou TXT com separador a partir da consulta e envia para o FTP. O HyperSync não gera CNAB nem outro layout bancário.
Corpo da execução:
{
"id": 44,
"data": {
"fields": ["C5_NUM", "C5_CLIENTE", "C5_EMISSAO", "C5_CONDPAG"],
"params": ""
},
"separator": ";",
"extension": "csv",
"header": true
}Resultado (caminho do arquivo gerado):
{
"result": "\\hypersync\\44\\20261013142207.csv"
}- data.fields / data.params
- Os mesmos da Query SQL: colunas e filtro da consulta.
- separator
- Separador: pipe, vírgula, ponto e vírgula ou tab.
- extension
- csv ou txt.
- header
- true para a primeira linha levar o nome das colunas.
Execução assíncrona
Na execução assíncrona, a chamada entra na fila e responde na hora com um ticket. O resultado sai depois em GET v1/hypersync/getresponse?ticket=<ticket> e fica na Auditoria. Ticket que não existe volta 404. Query SQL, ExecAuto, RecLock e Customizado podem ser síncronos ou assíncronos, escolha feita no passo 3 do configurador; Banco de Dados e Arquivo são sempre assíncronos.
Resposta da chamada:
{
"ticket": "3f6c1e9a-7b2d-4c58-9a41-0d2e8f5b6c17"
}Consulta do resultado:
GET v1/hypersync/getresponse?ticket=3f6c1e9a-7b2d-4c58-9a41-0d2e8f5b6c17
O serviço de filas do assíncrono só organiza a ordem de execução (o ticket), sem dado nenhum: a execução e os dados ficam no Protheus.
Webhook ao concluir
Opcional, para endpoint assíncrono. Quando a execução termina, o Protheus chama um conector de webhook cadastrado por vocês. É só o aviso de término: o HyperSync não dispara quando um dado muda no Protheus e não recebe webhook de outro sistema.
Configuração do aviso:
- Método
- POST, PUT ou PATCH.
- Quando
- Sempre, só no sucesso ou só no erro.
- Corpo
- Montado por vocês com as variáveis da execução, abaixo.
Variáveis da execução para montar o corpo:
- ticket
- O protocolo da execução, o mesmo que a chamada devolveu.
- status
- A situação da execução quando o aviso sai.
- endpoint
- O endpoint executado.
- empresa e filial
- As do header tenantId da chamada.
- quem chamou
- O usuário do Protheus que fez a chamada.
- duração
- Quanto a execução levou.
- retorno
- A saída da execução: o resultado ou a mensagem de erro.
Status e Auditoria
O motor grava só dois status de execução. Cada execução, síncrona ou assíncrona, fica registrada na Auditoria. O painel não tem botão de reprocessar.
Status:
- Pendente
- A execução entrou e ainda não terminou.
- Concluído
- A execução terminou. Se a rotina recusou a gravação, a mensagem de erro está no retorno.
O que a Auditoria registra de cada execução:
- Usuário do Protheus que chamou
- Empresa e filial
- Entrada na fila, início, fim e duração
- Status
- Entrada (o corpo recebido)
- Saída (o retorno)
Erros conhecidos
Tempo limite da chamada, tamanho máximo do corpo, número máximo de itens, nova tentativa e como evitar duplicidade: a HSB confirma para o ambiente de vocês.
Perguntas frequentes
Por que a consulta também é POST?+
Cada endpoint tem uma URL própria?+
Onde pego o token para chamar o HyperSync?+
Como digo em qual empresa e filial a chamada roda?+
O sandbox grava de verdade?+
Posso mandar os campos com outros nomes, como cliente em vez de C5_CLIENTE?+
Mais respostas, de produto a planos, em Perguntas frequentes sobre o HyperSync.
Veja a chamada pronta de um endpoint.
A demonstração monta o endpoint numa conversa, no visual do configurador, com a chamada que vai para quem integra. Nenhum Protheus real é acessado.