Extração de Dados Fagron Tech · Documentação API
STG
Documentação para parceiros · Ambiente STG

API de Extração de Dados

A API de Extração de Dados é o canal oficial para levar os dados da sua filial (tenant) na plataforma phusion para dentro dos seus próprios sistemas — data warehouse, ferramentas de BI, ERP ou aplicações internas. Os registros são entregues em pacotes JSON sequenciais, e é a plataforma que controla o que já foi entregue: seu sistema só precisa perguntar se há algo novo, gravar e confirmar.

São dois fluxos complementares: o incremental, para o consumo contínuo do que muda no dia a dia, e o reprocessamento por período, para a carga inicial e a recomposição histórica. Esta documentação conduz a integração do primeiro acesso até a homologação.

Introdução

Sobre a API de Extração

A API de Extração de Dados disponibiliza, de forma padronizada e segura, os dados que a sua filial (tenant) gera na plataforma phusion. Ela foi desenhada para integrações sistema a sistema: um processo do seu lado consulta a API periodicamente, grava os registros recebidos na sua base e confirma o recebimento.

É uma API de consumo de dados: as únicas chamadas de escrita são as de controle da própria integração — confirmar um pacote, solicitar ou cancelar um reprocessamento.

Para quem é esta documentação

Para a equipe técnica do parceiro responsável por construir e operar a integração: desenvolvedores, engenheiros de dados e arquitetos. Os exemplos usam cURL e pseudocódigo, e podem ser reproduzidos em qualquer linguagem que tenha um cliente HTTP.

O que você consegue fazer

Manter sua base atualizada

Pelo fluxo incremental, tudo o que muda em um recurso chega em pacotes sequenciais, sem que você precise controlar datas, cursores ou paginação.

Fazer a carga inicial

Pelo reprocessamento por período, você solicita um intervalo de datas (até 90 dias por solicitação) e recebe o retrato atual dos itens daquele período, em partes.

Recompor o histórico

Para reconstruir um intervalo já passado, o mesmo reprocessamento pode ser solicitado novamente, sem interferir no consumo incremental.

Como a integração funciona, em resumo

Os dados são organizados em recursos (por exemplo, orcamentos-vendas-produto), liberados individualmente conforme o seu contrato. Cada recurso tem a sua própria fila de pacotes. O ciclo é sempre o mesmo: pedir o próximo pacote, gravar os itens, confirmar a sequência. Enquanto não houver confirmação, o mesmo pacote continua sendo devolvido — nenhum dado é pulado, e por isso a gravação do seu lado precisa ser feita por upsert.

O que você precisa ter

ItemDe onde vem
IntegradorId, senha e tenantIdE-mail automático de ativação da integração (ver Dados de acesso).
Códigos dos recursos liberadosInformados pela Fagron Tech na liberação de cada recurso. Os campos de cada recurso estão em Modelo de dados.
Cliente HTTP que siga redirecionamentosDo seu lado. O pacote é entregue por um redirecionamento para um endereço temporário (ver Próximo pacote).
Base de dados com gravação por upsertDo seu lado. Necessária para absorver reentregas sem duplicar registros (ver Deduplicação e idempotência).
Processo agendado e cofre de segredosDo seu lado. Para consultar a API com regularidade e guardar as credenciais com segurança.

Jornada de integração

  1. 1 · AcessoReceba as credenciais e os códigos dos recursos liberados (Dados de acesso) e mapeie os campos de cada recurso (Modelo de dados).
  2. 2 · AutenticaçãoObtenha o token em /api/auth e envie-o, com o tenantId, em todas as chamadas (Autenticação).
  3. 3 · Carga inicialSolicite o reprocessamento do histórico em blocos de até 90 dias e consuma as partes até o fim (Reprocessamento).
  4. 4 · Regime contínuoColoque o laço incremental em operação, consultando cada recurso periodicamente (Laço de consumo).
  5. 5 · HomologaçãoValide os cenários do Checklist de homologação no ambiente STG.
  6. 6 · ProduçãoTroque URLs e credenciais pelas de produção, compartilhadas pela nossa equipe em um segundo momento.

Esta documentação descreve o ambiente STG. Use-o para desenvolver e homologar; as URLs e credenciais de produção são diferentes.

Introdução

Visão geral

Os dados da sua filial (tenant) são disponibilizados em pacotes sequenciais, no formato JSON.

Você pergunta à API se há algo a consumir. Havendo, o próprio pacote vem na resposta, com os registros no campo dados. Depois de gravar esses registros, você confirma o pacote, e só então a plataforma libera o próximo.

  1. Cliente → APIGET próximo pacote.
  2. API → Cliente200 com o pacote: { sequencia, quantidadeItens, dados: [...] } — ou 204 se não há o que consumir.
  3. Cliente → APIPOST confirmação { sequencia }.
  4. API → Cliente204 — libera o próximo pacote.

Internamente, a entrega do pacote passa por um redirecionamento HTTP, transparente para o cliente HTTP configurado para seguir redirecionamentos (ver Próximo pacote).

Três características definem o modelo

Ponteiro na plataforma

Você não envia datas, cursores nem paginação no fluxo incremental. Sempre pergunta "tem algo novo?" e recebe o próximo pacote da fila.

Ao menos uma vez

Enquanto você não confirmar, o mesmo pacote continua sendo devolvido. Nenhum pacote é pulado, mas você precisa deduplicar do seu lado.

Versão atual do item

Cada pacote traz a versão atual de cada item, não o histórico. Um item alterado cinco vezes chega uma vez só, já com o valor final.

Dois fluxos

Os dois fluxos têm o mesmo formato de pacote e a mesma mecânica de confirmação:

FluxoPara quêSeção
IncrementalConsumo contínuo do que muda no dia a dia. É o regime permanente da integração.Fluxo incremental
Reprocessamento por períodoCarga inicial e recomposição de um intervalo de datas já passado. Assíncrono, sob demanda.Reprocessamento

Introdução

Conceitos

TermoSignificado
RecursoConjunto de dados que você consome, identificado por um código (ex.: orcamentos-vendas-produto). Cada recurso tem sua própria fila e seu próprio ponteiro.
PacoteDocumento JSON com um bloco de dados de um recurso, entregue no corpo da resposta. O volume de itens por pacote varia conforme o movimento do período.
SequênciaNúmero inteiro crescente que identifica o pacote dentro de um recurso (ou a parte dentro de um reprocessamento). Vem no próprio pacote, no campo sequencia, e é o valor usado na confirmação.
Confirmação (ACK)Chamada que marca o pacote como consumido e libera o próximo. Receber o pacote não confirma nada.
chaveProcessamentoIdentificador de uma solicitação de reprocessamento por período.
ParteCada arquivo de um reprocessamento. Um período grande é entregue em partes sequenciais.

Comece por aqui

Dados de acesso

Quando a integração é ativada, você recebe um e-mail automático da Fagron Tech ("Ativação de Integração concluída") com:

Item no e-mailDescrição
Integração / ServiçosA integração ativada (Extração) e os serviços liberados para ela.
IntegradorIdIdentificador da sua integração. É o usuário na autenticação.
SenhaSenha da sua integração — não compartilhe nem versione. É a senha na autenticação.
tenantIdGUID da sua filial (tenant), enviado no cabeçalho tenantId a cada chamada (ver Cabeçalhos obrigatórios).

Guarde o IntegradorId, a senha e o tenantId num cofre de segredos. Nunca os exponha em repositórios, no front-end ou em logs.

Ambientes e URLs

STG

RecursoURL
APIhttps://fate-mobypharma-integradores-api-stg.fagrontechnologies.com.br
Swagger/swagger/index.html

Produção

As credenciais e URLs de produção são diferentes do ambiente STG e serão compartilhadas em um segundo momento pela nossa equipe.

Comece por aqui

Autenticação

Troque o IntegradorId e a senha recebidos por e-mail por um token de acesso (JWT) e envie-o como Bearer no cabeçalho Authorization das demais chamadas.

POST /api/auth

Corpo (JSON)

CampoTipoObrig.Descrição
usuariostringSimO IntegradorId do e-mail de ativação.
senhastringSimA senha do e-mail de ativação.

Exemplo cURL

cURL
curl --location 'https://fate-mobypharma-integradores-api-stg.fagrontechnologies.com.br/api/auth' \
--header 'Content-Type: application/json' \
--data '{
  "usuario": "{{INTEGRADOR_ID}}",
  "senha": "{{SENHA}}"
}'

Respostas

200OK — token de acesso (JWT) gerado
JSON
{
  "data": {
    "accessToken": "eyJhbGciOiJSUzI1NiIs...",
    "tokenType": "Bearer",
    "expiresIn": 108000,
    "scope": "fate_integradores"
  },
  "success": true,
  "errors": []
}
CampoTipoDescrição
data.accessTokenstringToken de acesso (JWT). Envie no cabeçalho Authorization das demais chamadas.
data.tokenTypestringTipo do token: Bearer.
data.expiresInintValidade do token, em segundos.
data.scopestringEscopo concedido ao token.
successboolIndica sucesso ou falha da autenticação.
errorsarrayLista de erros em caso de falha.
400Bad Request — usuário ou senha inválidos
JSON
{
  "success": false,
  "errors": [
    "Usuário ou senha inválidos"
  ]
}

Usando o token

HTTP Header
Authorization: Bearer {{ACCESS_TOKEN}}

Reutilize o token até perto do vencimento (calculado a partir de expiresIn) e renove-o antes de expirar — não solicite um token por requisição. A API aplica limite de requisições, e o endpoint de autenticação tem um limite menor que os demais; os cabeçalhos x-ratelimit-limit e x-ratelimit-remaining da resposta mostram o limite e o saldo.

Comece por aqui

Cabeçalhos obrigatórios

Toda chamada à API de extração exige:

CabeçalhoValor
AuthorizationBearer {accessToken}
tenantIdGUID da sua filial (tenant), recebido no e-mail de ativação

A ausência ou o formato inválido do tenantId resulta em 400. Um token válido, mas sem permissão para o recurso, resulta em 403.

API · Fluxo incremental

Obter o próximo pacote

Caminhos relativos à URL base. {recurso} é o código do recurso (ex.: orcamentos-vendas-produto).

GET /api/extracao/{recurso}/alteracoes
HTTP
GET /api/extracao/{recurso}/alteracoes
Authorization: Bearer {accessToken}
tenantId: {guid}

Respostas

HTTPSituaçãoO que fazer
200Há pacote a consumir. O corpo da resposta é o pacote (ver Formato do pacote).Persistir os itens e confirmar.
204Não há nada novo desde a sua última confirmação.Aguardar o intervalo de consulta e tentar de novo. Não é erro.
400Cabeçalho tenantId ausente ou não é um GUID.Corrigir a chamada.
401Token ausente, expirado ou inválido.Renovar o token.
403Sem permissão para consultar este recurso.Acionar a Fagron Tech.
404Código de recurso inexistente.Conferir o código do recurso.
5xxFalha técnica temporária.Repetir com backoff; persistindo, acionar a Fagron Tech.

Exemplo de resposta

Exemplo de resposta 200 para o recurso orcamentos-vendas-produto (valores fictícios; um único item mostrado e parte dos campos omitida — a lista completa está em Modelo de dados):

JSON · 200
{
  "sequencia": 1,
  "quantidadeItens": 4850,
  "dados": [
    {
      "tipoItem": 1,
      "itemId": 1000001,
      "pedidoId": 500001,
      "codigo": 12345,
      "produto": "TALCO",
      "grupo": "Raw material",
      "setor": "SOLIDOS",
      "formaFarmaceutica": "Creme",
      "serie": "0",
      "pedido": 13,
      "dataOrcamento": "2022-10-06T19:19:00",
      "dataAprovacao": "2022-10-06T19:19:44",
      "filialId": 1001,
      "filial": "1 - MATRIZ",
      "quantidade": 0.00100,
      "unidade": "G",
      "cliente": "NOME DO CLIENTE",
      "prescritor": "Nome do Prescritor",
      "aprovador": "Nome do Aprovador",
      "orcamentista": "Nome do Orçamentista",
      "pedidoItemStatusId": 3,
      "statusFinanceiroId": 2,
      "origemAcrescimoDesconto": null,
      "convenio": null,
      "cortesia": false
    }
  ]
}

Configuração do cliente HTTP

O pacote é entregue por meio de um redirecionamento HTTP (302) para um endereço temporário e assinado da plataforma. Com o cliente configurado para seguir redirecionamentos, isso é transparente: a resposta final que a sua aplicação recebe é o 200 com o pacote.

  • Habilite o seguimento de redirecionamentos. É o padrão na maioria das bibliotecas HTTP; em curl, use a opção -L.
  • Não armazene nem reutilize o endereço do redirecionamento: ele expira em até 30 minutos. Em caso de falha ao receber o pacote, repita o GET.

O endereço de destino é autenticado pela própria assinatura da URL. Não repasse os cabeçalhos Authorization e tenantId no redirecionamento. A maioria dos clientes HTTP remove o Authorization automaticamente ao redirecionar para outro domínio; confirme esse comportamento no seu.

Chamada idempotente: repetir o GET antes de confirmar devolve sempre o mesmo pacote (a sequencia não muda).

API · Fluxo incremental

Confirmar o consumo

POST /api/extracao/{recurso}/alteracoes/confirmacoes
HTTP
POST /api/extracao/{recurso}/alteracoes/confirmacoes
Authorization: Bearer {accessToken}
tenantId: {guid}
Content-Type: application/json
JSON · Body
{
  "sequencia": 42
}
204No Content — confirmação aceita, sem corpo na resposta

O valor de sequencia é o que veio no pacote recebido (ver Formato do pacote).

Respostas

HTTPSituação
204Confirmação aceita — o próximo GET já traz o pacote seguinte.
400Sequência ausente, zero ou negativa.
401Token ausente, expirado ou inválido.
403Sem permissão para confirmar neste recurso.
404Código de recurso inexistente.
409A sequência enviada não é a do pacote pendente (fora de ordem, ou já confirmada e com um pacote seguinte já disponível) — ver abaixo.
5xxFalha técnica temporária.

Confirme somente depois de ter persistido o pacote com sucesso.

Confirmação repetida. Se você reenviar a confirmação de uma sequência já aceita (por exemplo, porque a resposta do primeiro POST se perdeu), a resposta é 204 enquanto não houver outro pacote pendente. Se o pacote seguinte já estiver disponível, a resposta é 409. Em ambos os casos a confirmação original continua válida: diante de um 409, refaça o GET — se ele trouxer uma sequencia maior que a que você confirmou, a confirmação anterior já havia sido aceita e basta seguir com o novo pacote.

API · Fluxo incremental

Formato do pacote

Vale para os dois fluxos. Documento JSON UTF-8 com BOM (application/json, sem compactação), com envelope fixo:

JSON
{
  "sequencia": 42,
  "quantidadeItens": 100,
  "dados": [ /* ... um objeto por item ... */ ]
}
CampoTipoDescrição
sequenciaintNúmero do pacote (ou da parte). É o valor que você envia na confirmação.
quantidadeItensintNúmero de objetos em dados.
dadosarrayArray de itens. O conjunto de campos varia conforme o recurso.

Regras do payload

  • O arquivo começa com o BOM do UTF-8 (bytes EF BB BF). Configure o parser para aceitá-lo (ex.: em Python, abrir o arquivo com encoding="utf-8-sig").
  • Nomes de campos em camelCase, exatamente como em Modelo de dados (ex.: itemId).
  • Campos nulos são entregues explicitamente como null — a chave está presente.
  • Datas e horas seguem o formato ISO 8601 sem indicação de fuso (2019-06-17T16:45:00), como gravadas na origem (UTC). A conversão para o fuso de exibição é do consumidor.
  • Valores monetários e quantidades são números decimais.
  • Não há marcador artificial de remoção. Itens cancelados, deletados ou em cortesia são entregues normalmente, sinalizados pelos próprios campos de negócio (ex.: deletado, cortesia, campos de status). A exclusão é comunicada pelo campo, nunca pela ausência da linha.

O envelope é estável; novos campos podem ser acrescentados aos itens ao longo do tempo. Trate campos desconhecidos de forma tolerante (não falhe o parse).

Integração incremental

Laço de consumo

Pseudocódigo
repetir:
    resposta = GET /api/extracao/{recurso}/alteracoes

    se resposta.status == 204:
        aguardar o intervalo de consulta  →  voltar ao início

    pacote = corpo da resposta (JSON)

    para cada item em pacote.dados:
        upsert(item)          # ver Deduplicação e idempotência

    commit da persistência    # só depois disso:

    POST /api/extracao/{recurso}/alteracoes/confirmacoes { sequencia: pacote.sequencia }

    voltar ao início imediatamente   # pode haver mais pacotes na fila

O upsert deve seguir as regras de deduplicação e idempotência.

Integração incremental

Exemplo com cURL

O exemplo usa variáveis de ambiente ($API_BASE, $INTEGRADOR_ID, $SENHA, $TENANT_ID) com os dados fornecidos pela Fagron Tech, e o jq para ler o JSON das respostas.

cURL
# 1. Obter o token com o IntegradorId e a senha do e-mail de ativação
TOKEN=$(curl -s -X POST "$API_BASE/api/auth" \
  -H "Content-Type: application/json" \
  -d "{\"usuario\": \"$INTEGRADOR_ID\", \"senha\": \"$SENHA\"}" | jq -r .data.accessToken)

# 2. Pedir o próximo pacote (-L segue o redirecionamento interno; -w mostra o
#    status final: 200 com o pacote, ou 204 se não há nada novo)
curl -sL -o pacote.json -w '%{http_code}\n' \
  -H "Authorization: Bearer $TOKEN" \
  -H "tenantId: $TENANT_ID" \
  "$API_BASE/api/extracao/orcamentos-vendas-produto/alteracoes"

# 3. Confirmar, usando a sequência que veio no pacote
SEQ=$(jq -r .sequencia pacote.json)
curl -s -X POST "$API_BASE/api/extracao/orcamentos-vendas-produto/alteracoes/confirmacoes" \
  -H "Authorization: Bearer $TOKEN" \
  -H "tenantId: $TENANT_ID" \
  -H "Content-Type: application/json" \
  -d "{\"sequencia\": $SEQ}"

Integração incremental

Frequência e ritmo

  • Sugestão inicial: consultar a cada 5 minutos por recurso.
  • Depois de confirmar um pacote, consulte de novo imediatamente: pode haver fila acumulada. Só volte ao intervalo normal quando receber 204.
  • Consuma um pacote por vez, em ordem de sequência. Não paralelize o consumo do mesmo recurso. Recursos diferentes são filas independentes e podem ser consumidos em paralelo.
  • Consuma com regularidade. Longos períodos sem consumo fazem a fila acumular e podem atrasar a disponibilização de novos pacotes.

Nada é perdido: ao retomar as chamadas, o acúmulo é entregue normalmente, em pacotes sequenciais, sem data de corte e sem necessidade de qualquer ação de reativação.

API · Reprocessamento

Reprocessamento por período

Fluxo assíncrono, filtrado por data de negócio, usado para a carga inicial do recurso e para recompor um intervalo já passado.

  • É um retrato do período (versão atual de cada item), não um delta.
  • O download segue o mesmo modelo do incremental: 302 para um link temporário, arquivo no formato do pacote e confirmação explícita da sequência.
  • O resultado é entregue em partes sequenciais, e é a confirmação de uma parte que libera a geração da parte seguinte. Sem confirmar, o reprocessamento não avança.
  • Um reprocessamento ativo por vez, por recurso. Para recompor janelas longas, solicite blocos sucessivos.
  • Janela máxima de 90 dias por solicitação, com as duas datas inclusivas.

O reprocessamento não interfere no fluxo incremental: a fila e o ponteiro do alteracoes seguem independentes e continuam sendo consumidos normalmente durante um reprocessamento.

API · Reprocessamento

Solicitar reprocessamento

POST /api/extracao/{recurso}/reprocessos
HTTP
POST /api/extracao/{recurso}/reprocessos
Authorization: Bearer {accessToken}
tenantId: {guid}
Idempotency-Key: {chave-unica}
Content-Type: application/json
JSON · Body
{
  "dataInicio": "2026-01-01",
  "dataFim": "2026-03-31"
}

Regras

  • As duas datas são obrigatórias e inclusivas, e devem ser enviadas como datas puras, no formato AAAA-MM-DD, sem hora e sem fuso. Um valor com offset é recusado com 400, para que a janela nunca seja deslocada em silêncio.
  • dataInicio não pode ser maior que dataFim.
  • O cabeçalho Idempotency-Key é obrigatório (sem ele, a resposta é 400). Gere um valor único por solicitação (ex.: um GUID). Reenviar a mesma chave com o mesmo corpo, dentro da janela de retenção, devolve a resposta original sem criar outro reprocessamento — útil quando a resposta se perde por timeout. Reutilizar a chave com um corpo diferente é recusado com 409.

Respostas

202Accepted — solicitação enfileirada
JSON
{
  "chaveProcessamento": "8f1d1b64-6b25-4a7a-9a5a-3c2e1b0a77d1",
  "status": "aguardando"
}
HTTPSituação
400Datas ausentes, com offset, ou período invertido; tenantId ausente ou malformado; cabeçalho Idempotency-Key ausente.
401 403Token inválido, ou sem permissão no recurso.
404Código de recurso inexistente.
409Já existe um reprocessamento ativo para este recurso. A mensagem de erro informa a chaveProcessamento do ativo, para você terminar de consumi-lo ou cancelá-lo.
409Idempotency-Key já utilizada com um corpo diferente.
422Período válido, porém maior que a janela máxima de 90 dias — fatie o intervalo.

API · Reprocessamento

Consultar o status

GET /api/extracao/{recurso}/reprocessos/{chaveProcessamento}
HTTP
GET /api/extracao/{recurso}/reprocessos/{chaveProcessamento}
Authorization: Bearer {accessToken}
tenantId: {guid}
200OK
JSON
{
  "status": "processando",
  "dataInicio": "2026-01-01T00:00:00",
  "dataFim": "2026-03-31T00:00:00",
  "quantidadeItens": 24000,
  "partes": [
    { "sequencia": 1, "quantidadeItens": 12000, "consumidoEm": "2026-04-02T13:20:41.807299Z" },
    { "sequencia": 2, "quantidadeItens": 12000 }
  ]
}
CampoDescrição
statusaguardando, processando, concluido, falhou ou cancelado.
dataInicio / dataFimPeríodo solicitado.
quantidadeItensTotal acumulado nas partes já geradas. Omitido enquanto nenhuma foi fechada.
partesPartes já geradas, com sua sequência, contagem de itens e a data em que você as confirmou (consumidoEm, em UTC com o sufixo Z; omitida enquanto a parte não for confirmada).

Significado de cada status

statusSignificado
aguardandoSolicitação aceita, aguardando início do processamento.
processandoGerando partes. Novas partes aparecem conforme você confirma as anteriores.
concluidoNão haverá mais partes. Pode ainda existir uma parte gerada e não confirmada.
falhouO processamento falhou. Acione o suporte e solicite novamente.
canceladoCancelado por você (ver Cancelar).

Esta consulta é de acompanhamento e não entrega arquivo: o download acontece em Próxima parte, uma parte por vez.

API · Reprocessamento

Obter a próxima parte

GET /api/extracao/{recurso}/reprocessos/{chaveProcessamento}/proximo-arquivo
HTTP
GET /api/extracao/{recurso}/reprocessos/{chaveProcessamento}/proximo-arquivo
Authorization: Bearer {accessToken}
tenantId: {guid}

Respostas

HTTPSituaçãoO que fazer
302Há parte a consumir. O Location traz o link temporário de download.Seguir o redirecionamento e baixar o arquivo (ver Formato do pacote).
202A próxima parte ainda está sendo gerada (status aguardando ou processando). Resposta sem corpo, com o cabeçalho Retry-After (em segundos).Aguardar o tempo indicado em Retry-After e repetir o GET.
204O reprocessamento está concluido e não há mais partes a consumir.Encerrar o consumo deste reprocessamento.
400tenantId ausente ou malformado.
401 403Token inválido, ou sem permissão no recurso.
404chaveProcessamento inexistente, pertencente a outro recurso, ou código de recurso inexistente.Conferir a chave e o recurso.
409O reprocessamento está falhou ou cancelado, ou o arquivo da parte pendente está indisponível.Consultar o status. Em caso de falha ou de arquivo indisponível, cancelar (se ainda não estiver cancelado) e solicitar novamente.

Valem as mesmas regras de redirecionamento do fluxo incremental: seguir o 302, não repassar Authorization/tenantId ao link e baixar imediatamente. Repetir o GET antes de confirmar devolve a mesma parte, com um link novo.

API · Reprocessamento

Confirmar uma parte

POST /api/extracao/{recurso}/reprocessos/{chaveProcessamento}/confirmacoes
HTTP
POST /api/extracao/{recurso}/reprocessos/{chaveProcessamento}/confirmacoes
Authorization: Bearer {accessToken}
tenantId: {guid}
Content-Type: application/json
JSON · Body
{
  "sequencia": 2
}

Respostas

HTTPSituação
204Confirmação aceita — dispara a geração da parte seguinte. Também é a resposta ao reenviar a confirmação de uma parte já confirmada (idempotente).
400Sequência ausente, zero ou negativa.
401 403Token inválido, ou sem permissão no recurso.
404chaveProcessamento inexistente, pertencente a outro recurso, ou código de recurso inexistente.
409Sequência que não corresponde a nenhuma parte gerada, ou reprocessamento já falhou/cancelado.

Como no fluxo incremental, confirme somente depois de ter baixado e persistido o arquivo. A sequencia é a que veio no arquivo.

API · Reprocessamento

Cancelar

POST /api/extracao/{recurso}/reprocessos/{chaveProcessamento}/cancelamento
HTTP
POST /api/extracao/{recurso}/reprocessos/{chaveProcessamento}/cancelamento
Authorization: Bearer {accessToken}
tenantId: {guid}

Respostas

HTTPSituação
204Cancelado — ou já estava cancelado (idempotente).
401 403Token inválido, ou sem permissão no recurso.
404chaveProcessamento inexistente.
409Reprocessamento já concluído ou já falhado — não há o que cancelar.

Cancelar libera o recurso para uma nova solicitação. As partes já baixadas e persistidas continuam válidas; o que se perde é a continuação do período.

API · Reprocessamento

Laço de consumo do reprocessamento

Pseudocódigo
resposta = POST /api/extracao/{recurso}/reprocessos { dataInicio, dataFim }
chave    = resposta.chaveProcessamento

repetir:
    parte = GET /api/extracao/{recurso}/reprocessos/{chave}/proximo-arquivo

    se parte.status == 302:                      # seguindo o redirecionamento
        arquivo = corpo do download (JSON)
        para cada item em arquivo.dados: upsert(item)
        commit da persistência
        POST /api/extracao/{recurso}/reprocessos/{chave}/confirmacoes { sequencia: arquivo.sequencia }
        voltar ao início imediatamente           # a confirmação libera a parte seguinte

    se parte.status == 202:                      # parte seguinte ainda em geração
        aguardar Retry-After segundos  →  voltar ao início

    se parte.status == 204:                      # concluido, sem mais partes
        fim

    se parte.status == 409:                      # falhou, cancelado ou arquivo indisponível
        estado = GET /api/extracao/{recurso}/reprocessos/{chave}
        tratar conforme estado.status  →  fim

O reprocessamento só está encerrado quando proximo-arquivo responde 204. Receber concluido na consulta de status não significa que não há mais nada para baixar: sempre drene as partes até o 204.

Modelo de dados

Recursos disponíveis

Cada recurso é liberado individualmente para o seu contrato. O código do recurso é o valor de {recurso} nos caminhos da API, e o conjunto de campos de dados é o mesmo nos fluxos incremental e de reprocessamento.

Código do recursoConteúdo
itens-orcamentos-pedidosItens de orçamentos e pedidos, com valores, envolvidos, status e datas.
gestao-pedidosItens de pedidos com canal de atendimento, valores, convênio, envolvidos e status do pedido, do item e financeiro.
financeiro-despesas-receitasLançamentos financeiros de despesas e receitas, com datas, valores, plano de contas, dados bancários e status de pagamento.
gestao-entregasEntregas com romaneio, tipo, status, valores, região, entregador, cliente, destinatário e endereço de destino.
orcamentos-vendas-produtoItens de orçamentos e vendas por produto, com grupo, setor, envolvidos, status, preços e dados do lote.

Como ler as tabelas de campos

  • Os campos estão na ordem em que aparecem em cada item de dados.
  • Todos os campos podem vir null; a chave sempre está presente.
  • datetime segue o formato ISO 8601 sem fuso (2019-06-17T16:45:00), conforme Formato do pacote.
  • Campos de domínio vêm em par: o identificador numérico (ex.: statusFinanceiroId) e a sua descrição textual em português (ex.: statusFinanceiro). Para regras de negócio, use o identificador; os valores possíveis estão em Valores de domínio.

Modelo de dados

Itens de orçamentos e pedidos

GET /api/extracao/itens-orcamentos-pedidos/alteracoes

Itens de orçamentos e pedidos, com valores, envolvidos, status e datas.

CampoTipoDescrição
tipoItemintTipo do item.
tipoItemDescricaostringDescrição do tipo de produto (ex.: Fórmula Manipulada).
itemIdintIdentificador do item.
pedidoIdintIdentificador interno do orçamento/pedido.
numerointNúmero do pedido.
seriestringSérie do item do pedido.
canalstringNome do canal de atendimento.
descricaostringDescrição do nome do produto.
formaFarmaceuticastringTipo de manipulação (forma farmacêutica).
quantidadeintQuantidade de potes.
unidadestringTipo de unidade da fórmula.
valorBrutodecimalPreço bruto calculado.
valorLiquidodecimalPreço líquido final calculado.
precoCustodecimalPreço de custo do item.
fatordecimalFator de preço da fórmula.
pedidoItemStatusIdintID do status do item do pedido. Valores em Valores de domínio (PedidoItemStatus).
pedidoItemStatusstringStatus do item (Aprovado, Recusado, No carrinho).
filialIdintID da filial.
filialstringCódigo e descrição da filial.
empresastringNome da empresa (definido no momento da migração).
prescritorstringNome do prescritor.
pacientestringNome do paciente.
clientestringNome do cliente.
telefonestringTelefone do cliente com DDD.
usuarioInclusaostringNome do usuário que incluiu o item no pedido.
usuarioAprovacaostringNome do usuário que aprovou o item do pedido.
pedidoStatusFinanceiroIdintStatus financeiro do pedido. Valores em Valores de domínio (StatusFinanceiroPedido).
pedidoStatusFinanceirostringDescrição textual de pedidoStatusFinanceiroId.
cortesiaboolItem em cortesia (sim ou não).
deletadoboolItem removido (sim ou não).
dataOrcamentodatetimeData da criação do orçamento.
dataAprovacaodatetimeData da aprovação do item do pedido.
dataCriacaoPedidodatetimeData da criação do pedido.

Modelo de dados

Gestão de pedidos

GET /api/extracao/gestao-pedidos/alteracoes

Itens de pedidos com canal de atendimento, valores, convênio, envolvidos e status do pedido, do item e financeiro.

CampoTipoDescrição
tipoItemintTipo do item.
itemIdintIdentificador do item.
pedidoIdintID do pedido.
numeroPedidointNúmero do pedido.
dataOrcamentodatetimeData da criação do orçamento.
filialIdintID da filial.
codigoFilialintCódigo de cadastro da filial.
descricaoFilialstringDescrição de cadastro da filial.
filialstringCódigo e descrição da filial.
nomeFarmaciastringNome da empresa (definido no momento da migração).
canalIdintID do canal de atendimento.
canalAtendimentostringNome do canal de atendimento.
dataAprovacaodatetimeData da aprovação do item do pedido.
dataNegociodatetimeData da última negociação de preço do item.
seriePedidointSérie do item.
formaFarmaceuticastringTipo de manipulação (forma farmacêutica).
produtostringDescrição do nome do produto.
quantidadeintQuantidade de potes.
cortesiaboolItem em cortesia (sim ou não).
precoBrutodecimalPreço bruto calculado.
precoCustodecimalPreço de custo do item.
valorDescontodecimalValor de desconto.
valorAcrescimodecimalValor de acréscimo (taxas).
precoLiquidodecimalPreço líquido final calculado.
valorSubsidiodecimalValor de subsídio.
origemAcrescimoDescontoIdintID da origem do desconto. Valores em Valores de domínio (OrigemAcrescimoDesconto).
origemAcrescimoDescontostringDescrição textual de origemAcrescimoDescontoId.
convenioIdintID do convênio vinculado.
nomeConveniostringNome do convênio.
valorTotaldecimalValor total do item do pedido.
taxaEntregadecimalValor da taxa de entrega.
clienteIdintID do cliente.
clientestringNome do cliente.
telefonestringTelefone do cliente com DDD.
pacientestringNome do paciente.
prescritorIdintID do prescritor.
prescritorstringNome do prescritor.
atendenteIdstring (GUID)ID do atendente (funcionário).
atendentestringNome do atendente.
usuarioCriacaoIdstring (GUID)ID do usuário de criação do pedido.
nomeOrcamentistastringNome do orçamentista.
usuarioAprovacaoIdstring (GUID)ID do usuário de aprovação do item.
nomeAprovadorstringNome do usuário aprovador.
statusPedidoIdintID do status do pedido. Valores em Valores de domínio (StatusPedido).
statusPedidostringDescrição textual de statusPedidoId.
statusFinanceiroIdintID do status financeiro do pedido. Valores em Valores de domínio (StatusFinanceiroPedido).
statusFinanceirostringDescrição textual de statusFinanceiroId.
pedidoItemStatusIdintID do status do item do pedido. Valores em Valores de domínio (PedidoItemStatus).
pedidoItemStatusstringDescrição textual de pedidoItemStatusId.
deletadoboolItem removido (sim ou não).
vendaPdvboolRecebido no PDV (sim ou não).

Modelo de dados

Despesas e receitas

GET /api/extracao/financeiro-despesas-receitas/alteracoes

Lançamentos financeiros de despesas e receitas, com datas, valores, plano de contas, dados bancários e status de pagamento.

CampoTipoDescrição
tipoLancamentointTipo do lançamento: 1 = despesa, 2 = receita.
lancamentoIdintID do lançamento.
filialIdintID da filial.
codigoFilialintCódigo da filial.
descricaoFilialstringNome da filial.
nomeFarmaciastringNome da empresa (definido no momento da migração).
numeroDocumentostringNúmero do documento vinculado à receita ou à despesa.
descricaostringDescrição do lançamento no fluxo de caixa.
dataCompetenciadatetimeData da criação do registro no fluxo de caixa.
dataVencimentodatetimeData de vencimento do registro no fluxo de caixa.
dataPagamentodatetimeData do pagamento efetivo do registro no fluxo de caixa.
valordecimalValor original registrado.
valorPagodecimalValor pago.
valorJurosdecimalValor de juros.
valorDescontodecimalValor de desconto.
valorTaxadecimalValor de taxa.
codigoUnificadostringCódigo da conta de fluxo de caixa utilizada.
descricaoPlanoContastringNome da conta utilizada no fluxo de caixa.
numeroBancointCódigo do banco.
nomeBancostringNome do banco.
agenciastringAgência do banco.
contastringConta do banco.
statusPagamentoIdintStatus de pagamento do lançamento. Valores em Valores de domínio (StatusPagamentoLancamento).
statusPagamentostringDescrição textual de statusPagamentoId.
deletadoboolIndica lançamento excluído.
fornecedorstringFornecedor vinculado à despesa.
numeroVendaintNúmero da venda que representa o registro no fluxo de caixa.
clientestringNome do cliente vinculado ao registro da venda.
pagamentoTipoIdintForma de pagamento. Valores em Valores de domínio (TipoPagamento).
pagamentoTipostringDescrição textual de pagamentoTipoId.
tipoReceitaIdintTipo da receita. Valores em Valores de domínio (TipoReceita).
tipoReceitastringDescrição textual de tipoReceitaId.
recebimentoIdintIdentificador do recebimento.
recebimentoPagamentoParcelaIdintIdentificador da parcela do pagamento do recebimento.

Modelo de dados

Gestão de entregas

GET /api/extracao/gestao-entregas/alteracoes

Entregas com romaneio, tipo, status, valores, região, entregador, cliente, destinatário e endereço de destino.

CampoTipoDescrição
entregaIdintID da entrega.
pedidoIdintID do pedido.
romaneiointNúmero do romaneio.
pedidointNúmero do pedido.
tipoIdintID do tipo de entrega. Valores em Valores de domínio (TipoEntrega).
tipostringDescrição textual de tipoId.
statusIdintID do status da entrega. Valores em Valores de domínio (StatusEntrega).
statusstringDescrição textual de statusId.
statusPagamentoIdintID do status do pagamento.
pedidoStatusFinanceiroIdintID do status financeiro do pedido. Valores em Valores de domínio (StatusFinanceiroPedido).
pedidoStatusFinanceirostringDescrição textual de pedidoStatusFinanceiroId.
dataEntregadatetimeData da entrega.
dataCriacaoPedidodatetimeData da criação do pedido.
valorTaxadecimalValor da taxa de entrega.
valorSubsidiodecimalValor de subsídio vinculado.
valorRomaneiodecimalValor do romaneio de entrega.
valorAPagardecimalValor total a pagar.
valorRomaneioLiquidodecimalValor líquido do romaneio.
trocodecimalValor de troco.
regiaoIdintID da região.
regiaostringNome da região.
entregadorIdintID do entregador.
entregadorNomestringNome do entregador.
horarioRegiaoIdintID do horário de entrega da região.
clienteIdintID do cliente.
clientestringNome do cliente.
emailstringE-mail do cliente.
email2stringSegundo e-mail do cliente.
emailPreferencialstringE-mail definido como preferencial.
ddistringCódigo DDI.
dddstringCódigo DDD.
telefonestringTelefone.
telefoneCompletostringTelefone completo com DDD.
clienteDestinatarioIdintID do cliente de destino da entrega.
clienteDestinatarioNomestringNome do cliente destinatário.
pedidoFormulaPacienteDestinatarioNomestringNome do paciente da fórmula.
pedidoProdutoPacienteDestinatarioNomestringNome do paciente vinculado ao produto.
destinatarioNomestringNome do destinatário.
tipoDestinatarioIdintID do tipo do destinatário. Valores em Valores de domínio (TipoDestinatario).
tipoDestinatariostringDescrição textual de tipoDestinatarioId.
clienteEnderecoIdintID do endereço do cliente.
enderecoDestinostringEndereço padrão para entrega.
observacaostringObservação do endereço.
entregueParastringQuem recebeu a entrega.
filialIdintID da filial.
filialstringCódigo e descrição da filial.
empresastringNome da empresa (definido no momento da migração).

Modelo de dados

Orçamentos e vendas por produto

GET /api/extracao/orcamentos-vendas-produto/alteracoes

Itens de orçamentos e vendas por produto, com grupo, setor, envolvidos, status, preços e dados do lote.

CampoTipoDescrição
tipoItemintTipo do item.
itemIdintIdentificador do item.
pedidoIdintIdentificador interno do orçamento/pedido.
codigointCódigo do produto no cadastro.
produtostringNome do produto no cadastro.
grupostringGrupo do produto.
setorstringSetor do grupo do produto.
formaFarmaceuticastringTipo de manipulação (forma farmacêutica).
seriestringSérie do item do pedido.
pedidointNúmero do item no pedido.
dataOrcamentodatetimeData de criação do orçamento.
dataAprovacaodatetimeData de aprovação do item do pedido.
filialIdintID da filial.
filialstringCódigo e descrição da filial.
quantidadedecimalQuantidade utilizada do produto no item do pedido.
unidadestringUnidade do item do pedido.
clientestringNome do cliente.
prescritorstringNome do prescritor.
aprovadorstringNome do usuário aprovador.
orcamentistastringNome do orçamentista.
pedidoItemStatusIdintID do status do item (Aprovado, Recusado, No carrinho). Valores em Valores de domínio (PedidoItemStatus).
pedidoItemStatusstringDescrição textual de pedidoItemStatusId.
statusFinanceiroIdintStatus financeiro do pedido. Valores em Valores de domínio (StatusFinanceiroPedido).
statusFinanceirostringDescrição textual de statusFinanceiroId.
origemAcrescimoDescontoIdintID da origem do desconto na negociação do item. Valores em Valores de domínio (OrigemAcrescimoDesconto).
origemAcrescimoDescontostringDescrição textual de origemAcrescimoDescontoId.
conveniostringNome do convênio, caso vinculado ao pedido na negociação.
cortesiaboolItem em cortesia (sim ou não).
deletadoboolItem removido (sim ou não).
precoCompradecimalPreço de compra do grama ou da unidade do item.
precoCustodecimalPreço de custo do grama ou da unidade do item.
precoVendadecimalPreço de venda do grama ou da unidade do item.
valorSubsidiodecimalValor calculado de subsídio.
fatordecimalFator do cadastro de preço do produto.
empresastringNome da empresa (definido no momento da migração).
numeroLotestringNúmero do lote.
codigoLoteintCódigo do lote.
fornecedorstringFornecedor.
dataFabricacaodatetimeData de fabricação do lote.
dataValidadedatetimeData de validade do lote.

Modelo de dados

Valores de domínio

Valores possíveis dos campos de domínio, com a descrição textual entregue no campo correspondente.

PedidoItemStatus

Status do item do pedido.

IdDescrição
1No carrinho
2Recusado
3Aprovado
4Não definido

StatusFinanceiroPedido

Status financeiro do pedido.

IdDescrição
1Pendente
2Pago
3Parcialmente pago
4Convênio
5Convênio parcial
6Parcialmente pago convênio

OrigemAcrescimoDesconto

Origem do acréscimo ou desconto.

IdDescrição
1Convênio
2Cadastro prescritor
3Cadastro cliente
4Manual

StatusPedido

Status do pedido.

IdDescrição
1Aguardando Aprovação
2Finalizado
3Em Preparação
4Processo Unificação
5Disponível para Retirada
6Entregue
7Problemas
8Aguardando Itens
9Em Unificação
10Em Rota
11Cancelado
12Disponivel Unificação
13Em Preparação Não Unificável
14Deletado

TipoEntrega

Tipo da entrega.

IdDescrição
1Balcão
2Delivery
3Orçamento

StatusEntrega

Status da entrega.

IdDescrição
1Aguardando Itens
2Em Unificação
3Disponível para Entrega
4Em Rota
5Entregue
6Cancelado
7Disponivel Unificação
8Problemas
9Em Preparação
10Em Preparação Não Unificável
11Recusado
12Deletado
13Separado
15Aguardando Revisão

TipoDestinatario

Tipo do destinatário da entrega.

IdDescrição
1Cliente
2Paciente

StatusPagamentoLancamento

Status de pagamento do lançamento.

IdDescrição
1Pago/Recebido
2Pendente
3Vencido

TipoPagamento

Forma de pagamento.

IdDescrição
1Dinheiro
2Cheque
3Cartão de crédito
4Cartão de débito
5Boleto
6Transferência
7Convênio
8Delivery
9Pix
10Outros
11Farmácia Popular
12Epharma
13Funcional Card
14Pix TEF
15Pix offline

TipoReceita

Tipo da receita.

IdDescrição
1Manual
2Venda
3Recebimento

Referência

Deduplicação e idempotência (obrigatório)

Como a entrega é at-least-once, o mesmo item pode chegar mais de uma vez — no reprocessamento de um pacote não confirmado, em pacotes distintos quando o registro sofre novas alterações, ou na sobreposição entre uma carga por período e o fluxo incremental.

  • Faça upsert pela chave natural do item do recurso (informada pela Fagron Tech).
  • Considere sempre a última versão recebida como a verdadeira.
  • Nunca trate a carga como insert-only.
  • Persista o pacote inteiro antes de confirmar. Se o seu processo cair entre o recebimento e a confirmação, basta repetir o GET: o mesmo pacote volta.

Referência

Erros e respostas HTTP

HTTPSignificadoO que fazer
400Request inválido (tenantId ausente/malformado, sequência inválida, período inválido, Idempotency-Key ausente).Corrigir a chamada — não repetir sem ajuste.
401Token ausente, expirado ou inválido.Renovar o token e repetir.
403Sem permissão no recurso para a filial (tenant) informada.Verificar o tenantId e o recurso; acionar a Fagron Tech.
404Código de recurso inexistente, ou chaveProcessamento inexistente ou de outro recurso.Conferir a chave e o código do recurso.
409Conflito de estado: sequência que não é a pendente, reprocessamento ativo, reprocessamento falhou/cancelado, transição inválida, arquivo indisponível, Idempotency-Key reutilizada com outro corpo.Não trate automaticamente como sucesso. Ver a seção do endpoint correspondente.
422Janela de reprocessamento maior que o limite.Fatiar o período em blocos de até 90 dias.
5xxFalha técnica temporária.Repetir com backoff exponencial. Os GET são seguros de repetir; a confirmação também (ver Confirmar o consumo e Confirmar uma parte).

Falha ao receber o pacote (erro de rede, resposta interrompida): não confirme. Refaça o GET: o mesmo pacote é devolvido.

Nunca pule para a sequência seguinte por conta própria: a fila só avança com a confirmação da sequência correta.

Referência

Checklist de homologação

Referência

Suporte

Dúvidas sobre contrato, campos, liberação de recursos ou incidentes de integração devem ser direcionadas ao canal de suporte acordado com a Fagron Tech, informando:

  • o recurso;
  • a sequência (ou a chaveProcessamento) envolvida;
  • o tenantId;
  • o horário aproximado da ocorrência;
  • quando disponível, o valor do cabeçalho fate-correlationid devolvido na resposta da chamada.