Pular para o conteúdo
AdigitalMAX AdigitalMAX API v1
Migrar

Vindo do Autentique

Se a sua integração já fala com o Autentique v2, o modelo de domínio que você construiu continua valendo inteiro: documento, signatários, ordem, prazo, lembrete, pastas, arquivos e eventos são os mesmos conceitos, com os mesmos comportamentos. O que muda é a forma de chamar. Esta página é a tabela de tradução, campo por campo, com franqueza sobre o que ainda não temos.

Não há integração entre as duas plataformas e nenhuma relação comercial entre elas. Os nomes de operação e de campo do Autentique citados aqui vêm da documentação pública deles e servem exclusivamente para orientar quem está migrando. Onde a documentação pública não foi conclusiva, está escrito que não foi, em vez de haver um palpite apresentado como fato.

A diferença de fundo: GraphQL contra REST

O Autentique expõe um endpoint único, POST /v2/graphql, e você descreve na consulta quais campos quer de volta. Aqui, cada recurso tem a sua rota, o verbo HTTP diz a intenção e a resposta traz o objeto inteiro. Isso tem três consequências práticas na migração, e nenhuma delas é grande:

Você para de escolher os campos. Onde havia uma query pedindo id name status signatures { email signed }, passa a haver um GET /v1/documentos/{documentoId} que devolve tudo. A resposta é maior e você descarta o que não usa, o que em rede de servidor não é problema mensurável.

Você para de tratar erro em corpo de sucesso. Em GraphQL, uma operação que falha ainda responde 200 com um arranjo errors; aqui o status HTTP é a verdade. O tratamento fica mais simples e o seu cliente HTTP passa a ser útil de novo.

Você ganha idempotência de verdade. O cabeçalho Idempotency-Key não tem equivalente no endpoint único, e é ele que impede um timeout de rede de virar contrato duplicado. Veja Idempotência.

O upload de arquivo, que no Autentique usa a especificação de multipart request do GraphQL com as partes operations, map e file, aqui é um multipart/form-data comum, com as partes dados e arquivo. Na prática, o seu código de upload fica mais curto.

Mutations

As sete mutations documentadas do Autentique v2 e o equivalente aqui.
Autentique v2 AdigitalMAX Observação
createDocument POST /v1/documentos Mesmos conceitos. document vira a parte dados, signers vira signatarios dentro dela, file vira a parte arquivo. A diferença de comportamento: aqui a criação nunca dispara. O documento nasce em RASCUNHO e enviar é uma segunda chamada, explícita.
updateDocument PATCH /v1/documentos/{documentoId} Semântica idêntica: altera o que o estado ainda permite.
deleteDocument DELETE /v1/documentos/{documentoId} Exclusão lógica com carência nos dois. Documento concluído não sai por aqui.
resendSignatures POST /v1/documentos/{documentoId}/reenviar Mesmo comportamento: reenvia a quem ainda não assinou, sem consumir envelope novo.
createFolder POST /v1/pastas Idêntico. FolderInput.name vira nome.
updateFolder PATCH /v1/pastas/{id} Idêntico.
deleteFolder DELETE /v1/pastas/{id} Nos dois, pasta com conteúdo não é apagada em cascata.

Estas operações não existem no Autentique e passam a existir para você:

Ganhos da migração.
AdigitalMAXPara quê
POST /v1/documentos/{documentoId}/enviarSepara criar de disparar. Permite validar o posicionamento antes de qualquer coisa chegar ao signatário.
POST /v1/documentos/{documentoId}/cancelarCancelamento explícito com motivo registrado na trilha, em vez de exclusão.
POST /v1/documentos/{documentoId}/moverMover entre pastas. A documentação pública do Autentique não expõe uma mutation equivalente.
GET /v1/documentos/{documentoId}/certificadoCertificado de conclusão e evidências, em JSON ou em PDF.
GET /v1/documentos/{documentoId}/auditoriaTrilha de auditoria completa como recurso próprio, paginada.
POST /v1/modelos/{id}/documentosModelos de documento com variáveis e papéis. Não confundir com emailTemplates, que é outra coisa.
GET /v1/validar/{codigo}Validação pública por código, arquivo ou QR Code, sem autenticação.
GET /v1/consumoMedição de consumo do período, para prever custo antes da fatura.
POST /v1/webhooksWebhook cadastrado por API. No Autentique a URL de callback é configurada pela tela.

Queries

As queries documentadas do Autentique v2 e o equivalente aqui.
Autentique v2AdigitalMAXObservação
me GET /v1/organizacao Não existe rota /me. A chave pertence a uma organização, e não a uma pessoa, então a identidade da credencial vem de /organizacao. É a chamada de teste de fumaça da integração.
organization GET /v1/organizacao Mesmo conceito.
organizations GET /v1/organizacoes Organizações das quais o usuário é membro. Com chave de API a lista tem sempre um item, porque a chave pertence a uma organização.
document(id) GET /v1/documentos/{documentoId} Mesmo conteúdo, sem precisar declarar os campos.
documents(limit, page) GET /v1/documentos?limite=&cursor= Muda a paginação. É a diferença que mais exige código novo; veja abaixo.
documentsByFolder(folder_id) GET /v1/documentos?pastaId= Vira um filtro da listagem, em vez de uma operação separada.
folders, folder(id) GET /v1/pastas, /v1/pastas/{id} Mesmo conceito. search vira busca.
emailTemplates GET /v1/modelos-email Mesmo conceito, mesmo uso: referenciado por modelo_email_id na criação, equivalente a email_template_id.

A paginação é a única mudança que exige reescrever lógica, e não só renomear. O Autentique pagina por limit e page, devolvendo total, data e has_more_pages. Aqui é cursor: limite e cursor, devolvendo itens, total e proximoCursor.

A troca não é gratuita e vale saber por quê: com página numerada, um documento criado entre a leitura da página 1 e a da página 2 empurra tudo para baixo, e um item some do percurso. Em uma conciliação de dez mil documentos, isso é um contrato que o seu sistema nunca viu. O cursor elimina a classe inteira desse problema. O custo é que você não consegue pular direto para a página 7; o total continua vindo, calculado sob o mesmo escopo dos itens. O laço correto está em Limites.

Campos do documento

DocumentInput do Autentique e o campo correspondente na parte dados.
AutentiqueAdigitalMAXSituação
nametituloMuda de nome. nome aqui é do signatário, não do documento.
sortableordenadoMesmo comportamento: assinatura em fila conforme a ordem.
refusablerecusavelIdêntico.
stop_on_rejectedpararSeRecusadoIdêntico.
reminder (DAILY, WEEKLY)lembrete (DIARIO, SEMANAL)Mesmos dois valores, mais NENHUM explícito.
qualifiednivelAssinatura: "ICP_BRASIL"Muda de forma. Onde havia um booleano, aqui há uma escala de quatro níveis. Veja abaixo.
deadline_atprazoEmData limite para assinar.
expiration_atexpiraEmMantidos separados. O contrato preserva a distinção entre prazo para assinar e expiração do documento, exatamente como no Autentique.
lifecycle_in/v1/lgpd/politicas-retencaoSai do documento. Retenção é política da organização, com rota própria, e não parâmetro por envio. Veja Limites.
email_template_idmodeloEmailIdSó muda de nome.
reply_toresponderParaContinua no documento. Só muda de nome.
footermarca da organizaçãoSai do documento. Vira configuração da organização, em PATCH /v1/organizacao, para não haver rodapé diferente a cada envio.
localeNão existe. A interface de assinatura é em português. Veja o que não existe.
sandboxa URL base e o prefixo da chaveMuda de lugar. Em vez de um campo por documento, o ambiente é o sufixo /sandbox na URL e o prefixo adx_test_ da chave. Isso torna impossível mandar um documento de teste com a chave de produção por engano.
folder_idpastaIdSó muda de nome.
nivelAssinaturaNovo. ELETRONICA, SEGURA, AVANCADA, ICP_BRASIL.
fatoresExigidosNovo. Lista de fatores exigidos de todo signatário. Informar dois valores é exigir dois fatores simultâneos.
envelopeIdNovo. Agrupa vários documentos em um único ato de envio.

Sobre qualified: no Autentique ele é um booleano que liga a assinatura qualificada. Aqui a mesma decisão virou uma escala, porque entre "clicou no link" e "certificado ICP-Brasil" existem dois degraus que a maioria dos contratos realmente usa. A tradução direta é qualified: true para nivelAssinatura: "ICP_BRASIL" e qualified: false para nivelAssinatura: "ELETRONICA"; mas se os seus signatários já recebem código por SMS hoje, o equivalente honesto é SEGURA. A tabela dos quatro está na visão geral.

Campos do signatário

SignerInput do Autentique e o campo correspondente.
AutentiqueAdigitalMAXSituação
emailemailIdêntico.
nametituloMuda de nome. nome aqui é do signatário, não do documento.
phonetelefoneAqui exigimos E.164 com +55.
cpfcpfIdêntico.
birthdaydataNascimentoAAAA-MM-DD nos dois.
actionfuncaoMuda de nome, e os valores também; veja a tabela de ações.
delivery_methodmetodoEntregaMuda de nome, e os valores perdem o prefixo.
lock_user_datatravarDadosIdêntico: impede o signatário de corrigir o próprio nome e documento na tela.
positions (x, y, z, element, page)campos no nível do documento (tipo, pagina, x, y, largura, altura, signatarioId)Muda de forma. É a segunda mudança que exige código novo; veja abaixo.
fatoresExigidosNovo. Reforça os fatores do documento para este signatário; nunca reduz. Inclui TOTP, e informar dois valores é exigir dois fatores simultâneos.
ordemNovo como campo explícito. No Autentique a ordem vem da posição no arranjo signers; aqui é um número, o que evita bug de reordenação silenciosa.

Sobre positions. A documentação pública do Autentique cita os nomes x, y, z, element e page, mas não publica a unidade nem o sistema de coordenadas, então não existe fórmula de conversão que possamos afirmar com honestidade. O que a nossa API usa está documentado sem ambiguidade: fração de 0 a 1, origem no canto superior esquerdo, largura e altura também em fração. Se você tem posições funcionando hoje, o caminho seguro é reposicionar uma vez, conferindo o PDF gerado no sandbox, e não converter no escuro. A conversão a partir de pontos PostScript está em Guias.

Ações do signatário e método de entrega

Os seis papéis são exatamente os mesmos, com o mesmo significado. Só o nome muda:

Ações. Um para um, sem lacuna dos dois lados.
Autentique actionAdigitalMAX funcaoSignifica
SIGNASSINARAssina o documento. É o padrão nos dois.
APPROVEAPROVARAprova sem assinar como parte.
RECOGNIZERECONHECERReconhece a firma.
ACKNOWLEDGEACUSAR_RECEBIMENTOAcusa recebimento, sem concordar com o conteúdo.
ENDORSEENDOSSAREndossa.
SIGN_AS_A_WITNESSTESTEMUNHARAssina como testemunha.
Método de entrega. Os quatro existem dos dois lados; aqui o prefixo cai.
AutentiqueAdigitalMAXObservação
DELIVERY_METHOD_EMAILEMAILPadrão nos dois.
DELIVERY_METHOD_LINKLINKNada é enviado; a URL vem no campo link do signatário e a entrega é sua.
DELIVERY_METHOD_WHATSAPPWHATSAPPExige telefone em E.164.
DELIVERY_METHOD_SMSSMSExige telefone. Consome medição própria; veja Limites.
Um tradutor pronto, para a migração incremental
// traduzir.mjs
// Converte um payload no formato do Autentique para o nosso. Serve para
// migrar sem reescrever de uma vez o codigo que monta o documento: voce
// mantem a sua estrutura atual e traduz na borda.
//
// O que ele NAO faz: converter positions. Nao ha formula publicada para
// isso, e chutar produziria campo no lugar errado em contrato real.

const ACAO = {
  SIGN: "ASSINAR",
  APPROVE: "APROVAR",
  RECOGNIZE: "RECONHECER",
  ACKNOWLEDGE: "ACUSAR_RECEBIMENTO",
  ENDORSE: "ENDOSSAR",
  SIGN_AS_A_WITNESS: "TESTEMUNHAR",
};

const ENTREGA = {
  DELIVERY_METHOD_EMAIL: "EMAIL",
  DELIVERY_METHOD_LINK: "LINK",
  DELIVERY_METHOD_WHATSAPP: "WHATSAPP",
  DELIVERY_METHOD_SMS: "SMS",
};

const LEMBRETE = { DAILY: "DIARIO", WEEKLY: "SEMANAL" };

export function traduzirDocumento(document, signers, opcoes = {}) {
  const dados = {
    nome: document.name,
    ordenado: document.sortable ?? false,
    recusavel: document.refusable ?? true,
    pararSeRecusado: document.stop_on_rejected ?? true,
    lembrete: LEMBRETE[document.reminder], // omitir desliga o lembrete
    // Os dois prazos continuam separados, como no Autentique.
    prazoEm: document.deadline_at ?? undefined,
    expiraEm: document.expiration_at ?? undefined,
    modeloEmailId: document.email_template_id ?? undefined,
    responderPara: document.reply_to ?? undefined,
    pastaId: opcoes.pastaId ?? undefined,
    // qualified era booleano; aqui e uma escala de quatro degraus.
    // ELETRONICA e o equivalente literal de qualified: false, mas
    // confira se o seu fluxo real nao e SEGURA.
    nivelAssinatura: document.qualified ? "ICP_BRASIL" : "ELETRONICA",
    // Dois valores aqui = dois fatores simultaneos.
    fatoresExigidos: opcoes.fatoresExigidos ?? ["EMAIL"],

    signatarios: signers.map((s, indice) => ({
      nome: s.name,
      email: s.email,
      telefone: s.phone ?? undefined,
      cpf: s.cpf ?? undefined,
      dataNascimento: s.birthday ?? undefined,
      funcao: ACAO[s.action] ?? "ASSINAR",
      metodoEntrega: ENTREGA[s.delivery_method] ?? "EMAIL",
      travarDados: s.lock_user_data ?? false,
      // No Autentique a ordem vem da posicao no arranjo. Aqui e explicita.
      ordem: indice + 1,
    })),

    // s.positions NAO e convertido: reposicione uma vez no sandbox.
    // Os campos ficam no NIVEL DO DOCUMENTO e apontam o dono por
    // signatarioId, que so existe depois de criar o rascunho.
    campos: [],
  };

  // Campos que saem do documento e viram configuracao da organizacao.
  const avisos = [];
  if (document.footer) avisos.push("footer agora e a marca da organizacao");
  if (document.lifecycle_in) avisos.push("lifecycle_in agora e /v1/lgpd/politicas-retencao");
  if (document.locale) avisos.push("locale nao existe: a interface de assinatura e em portugues");
  if (document.sandbox !== undefined) avisos.push("sandbox agora e a URL base mais o prefixo da chave");

  return { dados, avisos };
}

Arquivos

O objeto files do Autentique e as rotas de arquivo daqui.
AutentiqueAdigitalMAXObservação
files.originalGET /v1/documentos/{documentoId}/arquivo?tipo=ORIGINALMesmo conteúdo.
files.signedGET /v1/documentos/{documentoId}/arquivo?tipo=ASSINADOMesmo conteúdo.
files.padesGET /v1/documentos/{documentoId}/arquivo?tipo=PADESSó existe no nível ICP_BRASIL. >>> PENDENTE DE BACKEND <<<
GET /v1/documentos/{documentoId}/arquivo?tipo=CERTIFICADONovo. O certificado de conclusão como arquivo próprio.
GET /v1/documentos/{documentoId}/certificadoNovo. O certificado em JSON, com hashDocumento, para você conferir a integridade do que baixou.

A diferença de comportamento que importa: no Autentique, files traz URLs dentro da resposta da query. Aqui, a URL é pedida no momento do download, vale 15 minutos e é de uso único. Isso significa que você não pode guardar a URL em banco nem colocá-la em um href de página cacheada; em compensação, pode entregá-la ao navegador do seu usuário sem entregar a sua chave de API.

Webhooks

O Autentique publica dezessete eventos; nós publicamos nove. Não é redução de funcionalidade: é agrupamento. Os quatro eventos de biometria deles, por exemplo, viram informação dentro de signer.authenticated, no campo fatores_confirmados.

Equivalência de eventos.
AutentiqueAdigitalMAXObservação
document.createddocument.createdNome idêntico.
document.updatedNão publicamos evento de edição. Edição de rascunho é operação sua e você já sabe que a fez.
document.deletedIdem. A exclusão parte de você.
document.finisheddocument.completedMuda de nome, mesmo significado: o último signatário assinou. É o evento mais importante dos dois lados.
signature.createddentro de document.sentSignatário criado deixa de ser evento próprio.
signature.updated, signature.deletedOperações suas, sem evento próprio.
signature.vieweddocument.viewedMuda de nome. O signatário que abriu vem em dados.signatario.
signature.accepteddocument.signedMuda de nome. Dispara uma vez por signatário nos dois.
signature.rejecteddocument.refusedMuda de nome. O motivo vem no payload.
signature.delivery_failedestado FALHA_ENTREGA do signatárioVira estado consultável em vez de evento. Aparece na conciliação e no document.viewed que nunca chega.
signature.biometric_approved e as outras trêsdentro de signer.authenticatedAgrupados. fatores_confirmados diz o que foi cumprido, incluindo ou não a biometria.
member.created, member.deletedNão existem aqui. Veja o que não existe.
document.sentNovo. Marca o disparo, que aqui é separado da criação.
signer.authenticatedNovo. Traz os fatores que o signatário cumpriu, que é o que sustenta a prova.
document.expired, document.cancelledNovos. Fecham os desfechos que antes só apareciam em consulta.

A validação da assinatura do webhook é diferente e você vai escrever código novo para isso; ele está pronto, em quatro linguagens, em Webhooks.

O que não existe, de um lado e do outro

Esta seção existe para você não descobrir uma lacuna no meio da migração. Ela é a parte desta página que mais nos custa escrever e a que mais lhe serve.

O que o Autentique tem e nós não temos

RecursoSituação aqui
locale, interface de assinatura em outro idioma Não existe e não está planejado. A tela de assinatura é em português. Se você tem signatários no exterior, isto é um impedimento real e vale conversar antes de migrar.
CRUD de membros da organização por API Nós temos, e eles não expõem. /v1/organizacao/membros cobre listar, convidar, alterar papel e remover. A documentação pública do Autentique expõe apenas os eventos de webhook member.created e member.deleted.
Assinatura qualificada ICP-Brasil e PAdES Ainda não disponível. O enum ICP_BRASIL existe no contrato e hoje responde 422. Se a sua operação depende de assinatura qualificada hoje, este é o item que deve pesar na sua decisão, e não vamos prometer data. >>> PENDENTE DE BACKEND <<<
Biometria facial com prova de vida Especificada, não disponível. O fator BIOMETRIA_FACIAL está no contrato e ainda não está no ar. >>> PENDENTE DE BACKEND <<<
Três campos distintos de prazo Fundidos em um. Se você usa deadline_at e expiration_at com valores diferentes, e a diferença importa para o seu processo, o comportamento vai mudar.
Anexos exigidos do signatário Especificado, não disponível. Está no desenho e ainda não tem rota publicada. >>> PENDENTE DE BACKEND <<<
Endpoint GraphQL Previsto como fachada de compatibilidade, sem data. Veja abaixo.

O que nós temos e o Autentique não expõe

RecursoPor que importa
Níveis de assinatura em escalaEscolher entre quatro degraus, por documento, em vez de um booleano. Recibo interno não precisa do mesmo atrito que uma procuração.
TOTP e dois fatores simultâneosInformar dois valores em fatoresExigidos já é dupla verificação de verdade, sem booleano nenhum. E TOTP não tem custo por uso, ao contrário do SMS.
Certificado de conclusão como recursoEm JSON para o seu sistema indexar, e em PDF para anexar a um processo, sem precisar recompor a prova a partir de eventos soltos.
Validação pública por código, arquivo ou QR CodeSem autenticação, e a validação por arquivo detecta adulteração, que é o caso que realmente importa quando alguém contesta.
Modelos de documento com variáveisEnvio em uma chamada de JSON puro, sem subir o mesmo PDF de novo. Em volume, reduz o consumo de forma mensurável.
Idempotência por cabeçalhoRetentativa depois de timeout deixa de duplicar contrato.
EnvelopesVários documentos em um único ato de envio, com um link só para o signatário, contando um envelope na franquia.
Medição de consumo por APIPrever custo antes da fatura, e conseguir atribuí-lo a um cliente seu.
Trilha e certificado com fatores confirmadosA prova registra como a pessoa se autenticou, e não só que ela clicou.

Lado a lado: o mesmo envio nas duas APIs

# Autentique v2: endpoint unico, multipart request do GraphQL.
# As partes operations, map e file precisam ser montadas na mao.

mutation CriarDocumento($document: DocumentInput!, $signers: [SignerInput!]!, $file: Upload!) {
  createDocument(document: $document, signers: $signers, file: $file) {
    id
    name
    refusable
    sortable
    created_at
    signatures {
      public_id
      name
      email
      created_at
      action { name }
      link { short_link }
      user { id name email }
    }
  }
}

# variables:
# {
#   "document": {
#     "name": "Contrato de prestacao de servicos",
#     "sortable": true,
#     "refusable": true,
#     "stop_on_rejected": true,
#     "reminder": "WEEKLY",
#     "deadline_at": "2026-09-30",
#     "qualified": false
#   },
#   "signers": [
#     { "email": "maria@exemplo.com.br", "action": "SIGN",
#       "delivery_method": "DELIVERY_METHOD_EMAIL" }
#   ],
#   "file": null
# }

Roteiro de migração

Este roteiro assume que você não pode parar de enviar documentos durante a troca, que é o caso normal. Ele leva a integração dos dois lados no ar ao mesmo tempo, e o corte acontece quando você decidir, não quando o código exigir.

  1. Isole o cliente atual atrás de uma interface

    Se o seu código chama a API do Autentique espalhado por vários lugares, este é o primeiro trabalho e ele vale mesmo que você não migre. Uma interface com quatro ou cinco métodos, algo como enviarParaAssinatura, consultarEstado, baixarAssinado e cancelar, com uma implementação por plataforma. Nada mais do seu sistema precisa saber qual das duas está em uso.

  2. Escreva a segunda implementação contra o sandbox

    Use o tradutor pronto para converter o seu payload existente e reduzir o trabalho ao mínimo. Duas coisas exigem código novo de verdade, e não tradução: a paginação por cursor e o posicionamento de campos. Reserve tempo para as duas.

  3. Reposicione os campos, uma vez, olhando o PDF

    Não converta coordenadas no escuro. Envie um documento de teste para assina@teste.adigitalmax.com.br, baixe o PDF assinado e olhe. Cinco minutos aqui evitam um contrato com a assinatura em cima de uma cláusula.

  4. Monte o receptor de webhook novo, em paralelo

    Um endpoint separado, com o segredo novo e a validação HMAC. Não tente adaptar o receptor existente: os formatos e os nomes de evento são diferentes, e dois receptores independentes são mais simples de operar do que um com dois modos.

  5. Exerça os doze casos de aceitação

    A lista está em Sandbox. Os quatro primeiros são o caminho feliz; os oito seguintes são os que geram chamado depois. Recusa, expiração e falha de entrega são os que mais costumam faltar.

  6. Corte por fatia, e não de uma vez

    Uma chave de configuração escolhe a plataforma por tipo de documento ou por cliente. Comece pelo tipo de menor risco, deixe rodar uma semana, e vá subindo. Documento já enviado pelo Autentique continua lá até ser concluído; não há como movê-lo, e não precisa haver.

  7. Antes de desligar, baixe o acervo antigo

    Este é o passo que não tem volta. Percorra documents no Autentique e baixe, de cada documento concluído, o PDF assinado, o PAdES quando houver e o que a plataforma oferecer de relatório de auditoria. Guarde no seu armazenamento, com o identificador original. Depois de encerrar a conta, isso deixa de estar disponível, e um contrato de doze anos precisa da prova por doze anos.

  8. Mantenha as duas implementações por um trimestre

    Custa pouco, já que ambas ficam atrás da mesma interface, e transforma um problema inesperado em uma linha de configuração em vez de um plantão.

Um lembrete jurídico que não é técnico. Documentos assinados no Autentique continuam válidos e continuam sendo verificados pela plataforma deles. Migrar não migra prova: os documentos antigos permanecem verificáveis lá, e os novos aqui. Se o seu processo depende de um endereço único de verificação para todo o acervo, isso precisa ser resolvido no processo, e não na API.

Sobre uma fachada GraphQL

Uma fachada GraphQL compatível com a forma do Autentique v2 está prevista, com um objetivo declarado: permitir que quem já integrou com eles reaproveite as consultas praticamente como estão, mudando endpoint e credencial.

Não temos data e não vamos estimar uma. Ela depende de a API REST estar estável em produção primeiro, porque uma fachada sobre um contrato que ainda muda seria duas superfícies instáveis em vez de uma. Se a sua decisão de migrar depende dessa fachada, fale conosco antes de planejar prazo, em vez de contar com ela.

Enquanto isso, a recomendação honesta é migrar para REST. O trabalho é menor do que parece, porque o modelo de domínio é o mesmo e só a chamada muda, e você não fica esperando por algo sem data. As duas coisas que exigem código novo de verdade, paginação e posicionamento, teriam que ser feitas de qualquer forma: uma fachada de compatibilidade não reproduz o que ela não tem por baixo.