@anpdgovbr/sip-client é um cliente TypeScript para o webservice SOAP do SIP.
Ele é agnóstico de aplicação: não lê .env, não conhece framework, banco,
cache, auditoria, autorização, UI ou regras de produto.
Use este pacote quando uma aplicação precisa consultar ou sincronizar dados do sistema cadastrado no SIP:
Para permissões do SEI, o fluxo esperado é consultar o SIP com o IdSistema do
SEI cadastrado no SIP:
aplicação consumidora -> SIP SOAP -> permissões do sistema SEI no SIP
Isso não é integração direta com o SEI. Integrações diretas com operações do SEI
(geração de processos, inclusão de documentos, envio e outras operações) pertencem
ao @anpdgovbr/sei-client. Veja sei-client.md.
A aplicação consumidora deve ser cadastrada como sistema próprio no SIP e deve receber uma chave de acesso própria.
Para consultas de acesso, libere apenas os serviços necessários:
Não libere serviços de replicação para integrações somente leitura.
A aplicação consumidora decide como carregar configuração. Um padrão simples é:
SIP_ACCESS_KEY=chave-gerada-no-sip-para-a-aplicacao
SIP_SYSTEM_ID=100000100
SIP_SOAP_ENDPOINT=https://sei.exemplo.gov.br/sip/ws/SipWS.php
SIP_REQUEST_TIMEOUT_MS=30000
SIP_ACCESS_KEY deve existir apenas em contexto server-side. Não use variáveis
públicas de frontend para chave de acesso.
import { createSipClient } from "@anpdgovbr/sip-client"
const sip = createSipClient({
endpointUrl: process.env.SIP_SOAP_ENDPOINT!,
accessKey: process.env.SIP_ACCESS_KEY!,
systemId: process.env.SIP_SYSTEM_ID!,
requestTimeoutMs: Number(process.env.SIP_REQUEST_TIMEOUT_MS ?? 30_000),
})
const usuario = await sip.consultas.buscarUsuarioPorSigla("usuario.exemplo")
const permissoes = usuario ? await sip.consultas.listarPermissoes({ idUsuario: usuario.id }) : []
Também há um helper composto:
const result = await sip.consultas.buscarUsuarioComPermissoesPorSigla("usuario.exemplo")
if (result) {
console.log(result.usuario.id)
console.log(result.permissoes)
}
Consultas:
sip.consultas.listarOrgaos({ todos })sip.consultas.listarUnidades({ idUsuario, idUnidade })sip.consultas.buscarUsuarios({ siglaUsuario, idUsuario, idUnidade, recurso, perfil })sip.consultas.buscarUsuarioPorSigla(siglaUsuario)sip.consultas.buscarUsuariosSemPermissao({ siglaUsuario, idUsuario })sip.consultas.carregarUsuario({ tipoServidorAutenticacao, idOrgaoUsuario, siglaUsuario })sip.consultas.pesquisarUsuario({ tipoServidorAutenticacao, idOrgao, sigla })sip.consultas.listarPerfis({ idUsuario, idUnidade, filtroRecursosMenus })sip.consultas.listarRecursos({ perfis, recursos })sip.consultas.listarPermissoes({ idUsuario, idUnidade, idPerfil })sip.consultas.buscarUsuarioComPermissoesPorSigla(siglaUsuario)Replicação:
sip.replicacao.replicarUsuarios(usuarios)sip.replicacao.replicarPermissoes(permissoes)sip.replicacao.validarReplicacao(idReplicacao)Os métodos de consulta na raiz do cliente continuam disponíveis como atalhos de
compatibilidade. Código novo deve preferir consultas e replicacao.
O mapa detalhado entre API pública, WSDL e SipWS.php fica em
sip-contrato-wsdl.md.
O pacote não entrega XML SOAP nem arrays posicionais do PHP para consumidores.
Ele normaliza os retornos do SIP para DTOs TypeScript, preservando os campos do
contrato InfraSip::$WS_*.
SipUnidade inclui a hierarquia retornada por carregarUnidades:
type SipUnidade = {
id: string
idOrgao: string | null
sigla: string
descricao: string
ativo: boolean
subunidades: string[]
unidadesSuperiores: string[]
idOrigem: string | null
}
SipPerfil inclui grupos, recursos e menus quando carregarPerfis retorna
esses blocos, especialmente com filtroRecursosMenus igual a R, M ou T:
type SipPerfil = {
id: string
nome: string
descricao: string | null
ativo: boolean
grupos: SipGrupoPerfil[]
recursos: SipRecurso[]
menus: SipMenu[]
}
Arrays opcionais ausentes no SOAP são normalizados como [], não como null.
listarPermissao não aceita filtro por sigla de usuário no WSDL. O fluxo em
duas etapas é obrigatório:
const usuario = await sip.consultas.buscarUsuarioPorSigla("usuario.exemplo")
if (!usuario) {
return null
}
return sip.consultas.listarPermissoes({ idUsuario: usuario.id })
const perfis = await sip.consultas.listarPerfis({
idUsuario: "100000103",
idUnidade: "110000075",
})
Replicação no SIP significa escrita/sincronização. Use apenas quando o serviço correspondente estiver liberado no SIP e quando a aplicação consumidora tiver fluxo administrativo, autorização e auditoria próprios.
Replicar usuário:
const ok = await sip.replicacao.replicarUsuarios([
{
operacao: "C",
idOrigem: "ad:usuario.exemplo",
idOrgao: "0",
sigla: "usuario.exemplo",
nome: "Usuario Exemplo",
cpf: "00000000000",
email: "usuario.exemplo@example.gov.br",
},
])
Replicar permissão:
const ok = await sip.replicacao.replicarPermissoes([
{
operacao: "A",
idUsuario: "100000103",
idUnidade: "110000075",
idPerfil: "100000940",
dataInicial: "07/07/2026",
sinSubunidades: false,
},
])
idSistema é opcional em replicarPermissoes; se omitido, a lib usa
config.systemId.
Estas capacidades existem no WSDL ou no ecossistema SIP/SEI, mas não fazem
parte do escopo inicial do @anpdgovbr/sip-client:
Cache, auditoria, autorização e telas são responsabilidades da aplicação consumidora.
/sip/controlador_ws.php?servico=sip, mas as chamadas
SOAP são enviadas para /sip/ws/SipWS.php.ArrayOfUsuarios e
ArrayOfPermissoes.dd/mm/aaaa.SinSubunidades e outros sinalizadores S/N são convertidos para boolean.SipSoapError, preservando operação, status
HTTP e mensagem de fault.replicarUsuarios, replicarPermissoes,
validarReplicacao) estão marcadas como Experimental na referência de
API (TypeDoc): têm serialização e testes unitários, mas ainda não foram
validadas de ponta a ponta contra um ambiente SIP real. Valide em
homologação antes de usar em produção.