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
| Item | De onde vem |
|---|---|
IntegradorId, senha e tenantId | E-mail automático de ativação da integração (ver Dados de acesso). |
| Códigos dos recursos liberados | Informados pela Fagron Tech na liberação de cada recurso. Os campos de cada recurso estão em Modelo de dados. |
| Cliente HTTP que siga redirecionamentos | Do 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 upsert | Do seu lado. Necessária para absorver reentregas sem duplicar registros (ver Deduplicação e idempotência). |
| Processo agendado e cofre de segredos | Do seu lado. Para consultar a API com regularidade e guardar as credenciais com segurança. |
Jornada de integração
- 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 · AutenticaçãoObtenha o token em
/api/authe envie-o, com otenantId, em todas as chamadas (Autenticação). - 3 · Carga inicialSolicite o reprocessamento do histórico em blocos de até 90 dias e consuma as partes até o fim (Reprocessamento).
- 4 · Regime contínuoColoque o laço incremental em operação, consultando cada recurso periodicamente (Laço de consumo).
- 5 · HomologaçãoValide os cenários do Checklist de homologação no ambiente STG.
- 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.
- Cliente → API
GETpróximo pacote. - API → Cliente
200com o pacote:{ sequencia, quantidadeItens, dados: [...] }— ou204se não há o que consumir. - Cliente → API
POSTconfirmação{ sequencia }. - API → Cliente
204— 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:
| Fluxo | Para quê | Seção |
|---|---|---|
| Incremental | Consumo contínuo do que muda no dia a dia. É o regime permanente da integração. | Fluxo incremental |
| Reprocessamento por período | Carga inicial e recomposição de um intervalo de datas já passado. Assíncrono, sob demanda. | Reprocessamento |
Introdução
Conceitos
| Termo | Significado |
|---|---|
| Recurso | Conjunto 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. |
| Pacote | Documento 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ência | Nú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. |
chaveProcessamento | Identificador de uma solicitação de reprocessamento por período. |
| Parte | Cada 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-mail | Descrição |
|---|---|
| Integração / Serviços | A integração ativada (Extração) e os serviços liberados para ela. |
IntegradorId | Identificador da sua integração. É o usuário na autenticação. |
| Senha | Senha da sua integração — não compartilhe nem versione. É a senha na autenticação. |
tenantId | GUID 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
| Recurso | URL |
|---|---|
| API | https://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.
Corpo (JSON)
| Campo | Tipo | Obrig. | Descrição |
|---|---|---|---|
usuario | string | Sim | O IntegradorId do e-mail de ativação. |
senha | string | Sim | A senha do e-mail de ativação. |
Exemplo 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
{
"data": {
"accessToken": "eyJhbGciOiJSUzI1NiIs...",
"tokenType": "Bearer",
"expiresIn": 108000,
"scope": "fate_integradores"
},
"success": true,
"errors": []
}
| Campo | Tipo | Descrição |
|---|---|---|
data.accessToken | string | Token de acesso (JWT). Envie no cabeçalho Authorization das demais chamadas. |
data.tokenType | string | Tipo do token: Bearer. |
data.expiresIn | int | Validade do token, em segundos. |
data.scope | string | Escopo concedido ao token. |
success | bool | Indica sucesso ou falha da autenticação. |
errors | array | Lista de erros em caso de falha. |
{
"success": false,
"errors": [
"Usuário ou senha inválidos"
]
}
Usando o token
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çalho | Valor |
|---|---|
Authorization | Bearer {accessToken} |
tenantId | GUID 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
Authorization: Bearer {accessToken}
tenantId: {guid}
Respostas
| HTTP | Situação | O que fazer |
|---|---|---|
| 200 | Há pacote a consumir. O corpo da resposta é o pacote (ver Formato do pacote). | Persistir os itens e confirmar. |
| 204 | Não há nada novo desde a sua última confirmação. | Aguardar o intervalo de consulta e tentar de novo. Não é erro. |
| 400 | Cabeçalho tenantId ausente ou não é um GUID. | Corrigir a chamada. |
| 401 | Token ausente, expirado ou inválido. | Renovar o token. |
| 403 | Sem permissão para consultar este recurso. | Acionar a Fagron Tech. |
| 404 | Código de recurso inexistente. | Conferir o código do recurso. |
| 5xx | Falha 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):
{
"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
Authorization: Bearer {accessToken}
tenantId: {guid}
Content-Type: application/json
{
"sequencia": 42
}
O valor de sequencia é o que veio no pacote recebido (ver Formato do pacote).
Respostas
| HTTP | Situação |
|---|---|
| 204 | Confirmação aceita — o próximo GET já traz o pacote seguinte. |
| 400 | Sequência ausente, zero ou negativa. |
| 401 | Token ausente, expirado ou inválido. |
| 403 | Sem permissão para confirmar neste recurso. |
| 404 | Código de recurso inexistente. |
| 409 | A 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. |
| 5xx | Falha 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:
{
"sequencia": 42,
"quantidadeItens": 100,
"dados": [ /* ... um objeto por item ... */ ]
}
| Campo | Tipo | Descrição |
|---|---|---|
sequencia | int | Número do pacote (ou da parte). É o valor que você envia na confirmação. |
quantidadeItens | int | Número de objetos em dados. |
dados | array | Array 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 comencoding="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
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.
# 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:
302para 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
Authorization: Bearer {accessToken}
tenantId: {guid}
Idempotency-Key: {chave-unica}
Content-Type: application/json
{
"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 com400, para que a janela nunca seja deslocada em silêncio. dataInicionão pode ser maior quedataFim.- 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 com409.
Respostas
{
"chaveProcessamento": "8f1d1b64-6b25-4a7a-9a5a-3c2e1b0a77d1",
"status": "aguardando"
}
| HTTP | Situação |
|---|---|
| 400 | Datas ausentes, com offset, ou período invertido; tenantId ausente ou malformado; cabeçalho Idempotency-Key ausente. |
| 401 403 | Token inválido, ou sem permissão no recurso. |
| 404 | Código de recurso inexistente. |
| 409 | Já 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. |
| 409 | Idempotency-Key já utilizada com um corpo diferente. |
| 422 | Perí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}
Authorization: Bearer {accessToken}
tenantId: {guid}
{
"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 }
]
}
| Campo | Descrição |
|---|---|
status | aguardando, processando, concluido, falhou ou cancelado. |
dataInicio / dataFim | Período solicitado. |
quantidadeItens | Total acumulado nas partes já geradas. Omitido enquanto nenhuma foi fechada. |
partes | Partes 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
status | Significado |
|---|---|
aguardando | Solicitação aceita, aguardando início do processamento. |
processando | Gerando partes. Novas partes aparecem conforme você confirma as anteriores. |
concluido | Não haverá mais partes. Pode ainda existir uma parte gerada e não confirmada. |
falhou | O processamento falhou. Acione o suporte e solicite novamente. |
cancelado | Cancelado 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
Authorization: Bearer {accessToken}
tenantId: {guid}
Respostas
| HTTP | Situação | O que fazer |
|---|---|---|
| 302 | Há parte a consumir. O Location traz o link temporário de download. | Seguir o redirecionamento e baixar o arquivo (ver Formato do pacote). |
| 202 | A 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. |
| 204 | O reprocessamento está concluido e não há mais partes a consumir. | Encerrar o consumo deste reprocessamento. |
| 400 | tenantId ausente ou malformado. | |
| 401 403 | Token inválido, ou sem permissão no recurso. | |
| 404 | chaveProcessamento inexistente, pertencente a outro recurso, ou código de recurso inexistente. | Conferir a chave e o recurso. |
| 409 | O 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
Authorization: Bearer {accessToken}
tenantId: {guid}
Content-Type: application/json
{
"sequencia": 2
}
Respostas
| HTTP | Situação |
|---|---|
| 204 | Confirmação aceita — dispara a geração da parte seguinte. Também é a resposta ao reenviar a confirmação de uma parte já confirmada (idempotente). |
| 400 | Sequência ausente, zero ou negativa. |
| 401 403 | Token inválido, ou sem permissão no recurso. |
| 404 | chaveProcessamento inexistente, pertencente a outro recurso, ou código de recurso inexistente. |
| 409 | Sequê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
Authorization: Bearer {accessToken}
tenantId: {guid}
Respostas
| HTTP | Situação |
|---|---|
| 204 | Cancelado — ou já estava cancelado (idempotente). |
| 401 403 | Token inválido, ou sem permissão no recurso. |
| 404 | chaveProcessamento inexistente. |
| 409 | Reprocessamento 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
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 recurso | Conteúdo |
|---|---|
itens-orcamentos-pedidos | Itens de orçamentos e pedidos, com valores, envolvidos, status e datas. |
gestao-pedidos | Itens de pedidos com canal de atendimento, valores, convênio, envolvidos e status do pedido, do item e financeiro. |
financeiro-despesas-receitas | Lançamentos financeiros de despesas e receitas, com datas, valores, plano de contas, dados bancários e status de pagamento. |
gestao-entregas | Entregas com romaneio, tipo, status, valores, região, entregador, cliente, destinatário e endereço de destino. |
orcamentos-vendas-produto | Itens 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. datetimesegue 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
Itens de orçamentos e pedidos, com valores, envolvidos, status e datas.
| Campo | Tipo | Descrição |
|---|---|---|
tipoItem | int | Tipo do item. |
tipoItemDescricao | string | Descrição do tipo de produto (ex.: Fórmula Manipulada). |
itemId | int | Identificador do item. |
pedidoId | int | Identificador interno do orçamento/pedido. |
numero | int | Número do pedido. |
serie | string | Série do item do pedido. |
canal | string | Nome do canal de atendimento. |
descricao | string | Descrição do nome do produto. |
formaFarmaceutica | string | Tipo de manipulação (forma farmacêutica). |
quantidade | int | Quantidade de potes. |
unidade | string | Tipo de unidade da fórmula. |
valorBruto | decimal | Preço bruto calculado. |
valorLiquido | decimal | Preço líquido final calculado. |
precoCusto | decimal | Preço de custo do item. |
fator | decimal | Fator de preço da fórmula. |
pedidoItemStatusId | int | ID do status do item do pedido. Valores em Valores de domínio (PedidoItemStatus). |
pedidoItemStatus | string | Status do item (Aprovado, Recusado, No carrinho). |
filialId | int | ID da filial. |
filial | string | Código e descrição da filial. |
empresa | string | Nome da empresa (definido no momento da migração). |
prescritor | string | Nome do prescritor. |
paciente | string | Nome do paciente. |
cliente | string | Nome do cliente. |
telefone | string | Telefone do cliente com DDD. |
usuarioInclusao | string | Nome do usuário que incluiu o item no pedido. |
usuarioAprovacao | string | Nome do usuário que aprovou o item do pedido. |
pedidoStatusFinanceiroId | int | Status financeiro do pedido. Valores em Valores de domínio (StatusFinanceiroPedido). |
pedidoStatusFinanceiro | string | Descrição textual de pedidoStatusFinanceiroId. |
cortesia | bool | Item em cortesia (sim ou não). |
deletado | bool | Item removido (sim ou não). |
dataOrcamento | datetime | Data da criação do orçamento. |
dataAprovacao | datetime | Data da aprovação do item do pedido. |
dataCriacaoPedido | datetime | Data da criação do pedido. |
Modelo de dados
Gestão de pedidos
Itens de pedidos com canal de atendimento, valores, convênio, envolvidos e status do pedido, do item e financeiro.
| Campo | Tipo | Descrição |
|---|---|---|
tipoItem | int | Tipo do item. |
itemId | int | Identificador do item. |
pedidoId | int | ID do pedido. |
numeroPedido | int | Número do pedido. |
dataOrcamento | datetime | Data da criação do orçamento. |
filialId | int | ID da filial. |
codigoFilial | int | Código de cadastro da filial. |
descricaoFilial | string | Descrição de cadastro da filial. |
filial | string | Código e descrição da filial. |
nomeFarmacia | string | Nome da empresa (definido no momento da migração). |
canalId | int | ID do canal de atendimento. |
canalAtendimento | string | Nome do canal de atendimento. |
dataAprovacao | datetime | Data da aprovação do item do pedido. |
dataNegocio | datetime | Data da última negociação de preço do item. |
seriePedido | int | Série do item. |
formaFarmaceutica | string | Tipo de manipulação (forma farmacêutica). |
produto | string | Descrição do nome do produto. |
quantidade | int | Quantidade de potes. |
cortesia | bool | Item em cortesia (sim ou não). |
precoBruto | decimal | Preço bruto calculado. |
precoCusto | decimal | Preço de custo do item. |
valorDesconto | decimal | Valor de desconto. |
valorAcrescimo | decimal | Valor de acréscimo (taxas). |
precoLiquido | decimal | Preço líquido final calculado. |
valorSubsidio | decimal | Valor de subsídio. |
origemAcrescimoDescontoId | int | ID da origem do desconto. Valores em Valores de domínio (OrigemAcrescimoDesconto). |
origemAcrescimoDesconto | string | Descrição textual de origemAcrescimoDescontoId. |
convenioId | int | ID do convênio vinculado. |
nomeConvenio | string | Nome do convênio. |
valorTotal | decimal | Valor total do item do pedido. |
taxaEntrega | decimal | Valor da taxa de entrega. |
clienteId | int | ID do cliente. |
cliente | string | Nome do cliente. |
telefone | string | Telefone do cliente com DDD. |
paciente | string | Nome do paciente. |
prescritorId | int | ID do prescritor. |
prescritor | string | Nome do prescritor. |
atendenteId | string (GUID) | ID do atendente (funcionário). |
atendente | string | Nome do atendente. |
usuarioCriacaoId | string (GUID) | ID do usuário de criação do pedido. |
nomeOrcamentista | string | Nome do orçamentista. |
usuarioAprovacaoId | string (GUID) | ID do usuário de aprovação do item. |
nomeAprovador | string | Nome do usuário aprovador. |
statusPedidoId | int | ID do status do pedido. Valores em Valores de domínio (StatusPedido). |
statusPedido | string | Descrição textual de statusPedidoId. |
statusFinanceiroId | int | ID do status financeiro do pedido. Valores em Valores de domínio (StatusFinanceiroPedido). |
statusFinanceiro | string | Descrição textual de statusFinanceiroId. |
pedidoItemStatusId | int | ID do status do item do pedido. Valores em Valores de domínio (PedidoItemStatus). |
pedidoItemStatus | string | Descrição textual de pedidoItemStatusId. |
deletado | bool | Item removido (sim ou não). |
vendaPdv | bool | Recebido no PDV (sim ou não). |
Modelo de dados
Despesas e receitas
Lançamentos financeiros de despesas e receitas, com datas, valores, plano de contas, dados bancários e status de pagamento.
| Campo | Tipo | Descrição |
|---|---|---|
tipoLancamento | int | Tipo do lançamento: 1 = despesa, 2 = receita. |
lancamentoId | int | ID do lançamento. |
filialId | int | ID da filial. |
codigoFilial | int | Código da filial. |
descricaoFilial | string | Nome da filial. |
nomeFarmacia | string | Nome da empresa (definido no momento da migração). |
numeroDocumento | string | Número do documento vinculado à receita ou à despesa. |
descricao | string | Descrição do lançamento no fluxo de caixa. |
dataCompetencia | datetime | Data da criação do registro no fluxo de caixa. |
dataVencimento | datetime | Data de vencimento do registro no fluxo de caixa. |
dataPagamento | datetime | Data do pagamento efetivo do registro no fluxo de caixa. |
valor | decimal | Valor original registrado. |
valorPago | decimal | Valor pago. |
valorJuros | decimal | Valor de juros. |
valorDesconto | decimal | Valor de desconto. |
valorTaxa | decimal | Valor de taxa. |
codigoUnificado | string | Código da conta de fluxo de caixa utilizada. |
descricaoPlanoConta | string | Nome da conta utilizada no fluxo de caixa. |
numeroBanco | int | Código do banco. |
nomeBanco | string | Nome do banco. |
agencia | string | Agência do banco. |
conta | string | Conta do banco. |
statusPagamentoId | int | Status de pagamento do lançamento. Valores em Valores de domínio (StatusPagamentoLancamento). |
statusPagamento | string | Descrição textual de statusPagamentoId. |
deletado | bool | Indica lançamento excluído. |
fornecedor | string | Fornecedor vinculado à despesa. |
numeroVenda | int | Número da venda que representa o registro no fluxo de caixa. |
cliente | string | Nome do cliente vinculado ao registro da venda. |
pagamentoTipoId | int | Forma de pagamento. Valores em Valores de domínio (TipoPagamento). |
pagamentoTipo | string | Descrição textual de pagamentoTipoId. |
tipoReceitaId | int | Tipo da receita. Valores em Valores de domínio (TipoReceita). |
tipoReceita | string | Descrição textual de tipoReceitaId. |
recebimentoId | int | Identificador do recebimento. |
recebimentoPagamentoParcelaId | int | Identificador da parcela do pagamento do recebimento. |
Modelo de dados
Gestão de entregas
Entregas com romaneio, tipo, status, valores, região, entregador, cliente, destinatário e endereço de destino.
| Campo | Tipo | Descrição |
|---|---|---|
entregaId | int | ID da entrega. |
pedidoId | int | ID do pedido. |
romaneio | int | Número do romaneio. |
pedido | int | Número do pedido. |
tipoId | int | ID do tipo de entrega. Valores em Valores de domínio (TipoEntrega). |
tipo | string | Descrição textual de tipoId. |
statusId | int | ID do status da entrega. Valores em Valores de domínio (StatusEntrega). |
status | string | Descrição textual de statusId. |
statusPagamentoId | int | ID do status do pagamento. |
pedidoStatusFinanceiroId | int | ID do status financeiro do pedido. Valores em Valores de domínio (StatusFinanceiroPedido). |
pedidoStatusFinanceiro | string | Descrição textual de pedidoStatusFinanceiroId. |
dataEntrega | datetime | Data da entrega. |
dataCriacaoPedido | datetime | Data da criação do pedido. |
valorTaxa | decimal | Valor da taxa de entrega. |
valorSubsidio | decimal | Valor de subsídio vinculado. |
valorRomaneio | decimal | Valor do romaneio de entrega. |
valorAPagar | decimal | Valor total a pagar. |
valorRomaneioLiquido | decimal | Valor líquido do romaneio. |
troco | decimal | Valor de troco. |
regiaoId | int | ID da região. |
regiao | string | Nome da região. |
entregadorId | int | ID do entregador. |
entregadorNome | string | Nome do entregador. |
horarioRegiaoId | int | ID do horário de entrega da região. |
clienteId | int | ID do cliente. |
cliente | string | Nome do cliente. |
email | string | E-mail do cliente. |
email2 | string | Segundo e-mail do cliente. |
emailPreferencial | string | E-mail definido como preferencial. |
ddi | string | Código DDI. |
ddd | string | Código DDD. |
telefone | string | Telefone. |
telefoneCompleto | string | Telefone completo com DDD. |
clienteDestinatarioId | int | ID do cliente de destino da entrega. |
clienteDestinatarioNome | string | Nome do cliente destinatário. |
pedidoFormulaPacienteDestinatarioNome | string | Nome do paciente da fórmula. |
pedidoProdutoPacienteDestinatarioNome | string | Nome do paciente vinculado ao produto. |
destinatarioNome | string | Nome do destinatário. |
tipoDestinatarioId | int | ID do tipo do destinatário. Valores em Valores de domínio (TipoDestinatario). |
tipoDestinatario | string | Descrição textual de tipoDestinatarioId. |
clienteEnderecoId | int | ID do endereço do cliente. |
enderecoDestino | string | Endereço padrão para entrega. |
observacao | string | Observação do endereço. |
entreguePara | string | Quem recebeu a entrega. |
filialId | int | ID da filial. |
filial | string | Código e descrição da filial. |
empresa | string | Nome da empresa (definido no momento da migração). |
Modelo de dados
Orçamentos e vendas por produto
Itens de orçamentos e vendas por produto, com grupo, setor, envolvidos, status, preços e dados do lote.
| Campo | Tipo | Descrição |
|---|---|---|
tipoItem | int | Tipo do item. |
itemId | int | Identificador do item. |
pedidoId | int | Identificador interno do orçamento/pedido. |
codigo | int | Código do produto no cadastro. |
produto | string | Nome do produto no cadastro. |
grupo | string | Grupo do produto. |
setor | string | Setor do grupo do produto. |
formaFarmaceutica | string | Tipo de manipulação (forma farmacêutica). |
serie | string | Série do item do pedido. |
pedido | int | Número do item no pedido. |
dataOrcamento | datetime | Data de criação do orçamento. |
dataAprovacao | datetime | Data de aprovação do item do pedido. |
filialId | int | ID da filial. |
filial | string | Código e descrição da filial. |
quantidade | decimal | Quantidade utilizada do produto no item do pedido. |
unidade | string | Unidade do item do pedido. |
cliente | string | Nome do cliente. |
prescritor | string | Nome do prescritor. |
aprovador | string | Nome do usuário aprovador. |
orcamentista | string | Nome do orçamentista. |
pedidoItemStatusId | int | ID do status do item (Aprovado, Recusado, No carrinho). Valores em Valores de domínio (PedidoItemStatus). |
pedidoItemStatus | string | Descrição textual de pedidoItemStatusId. |
statusFinanceiroId | int | Status financeiro do pedido. Valores em Valores de domínio (StatusFinanceiroPedido). |
statusFinanceiro | string | Descrição textual de statusFinanceiroId. |
origemAcrescimoDescontoId | int | ID da origem do desconto na negociação do item. Valores em Valores de domínio (OrigemAcrescimoDesconto). |
origemAcrescimoDesconto | string | Descrição textual de origemAcrescimoDescontoId. |
convenio | string | Nome do convênio, caso vinculado ao pedido na negociação. |
cortesia | bool | Item em cortesia (sim ou não). |
deletado | bool | Item removido (sim ou não). |
precoCompra | decimal | Preço de compra do grama ou da unidade do item. |
precoCusto | decimal | Preço de custo do grama ou da unidade do item. |
precoVenda | decimal | Preço de venda do grama ou da unidade do item. |
valorSubsidio | decimal | Valor calculado de subsídio. |
fator | decimal | Fator do cadastro de preço do produto. |
empresa | string | Nome da empresa (definido no momento da migração). |
numeroLote | string | Número do lote. |
codigoLote | int | Código do lote. |
fornecedor | string | Fornecedor. |
dataFabricacao | datetime | Data de fabricação do lote. |
dataValidade | datetime | Data 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.
| Id | Descrição |
|---|---|
1 | No carrinho |
2 | Recusado |
3 | Aprovado |
4 | Não definido |
StatusFinanceiroPedido
Status financeiro do pedido.
| Id | Descrição |
|---|---|
1 | Pendente |
2 | Pago |
3 | Parcialmente pago |
4 | Convênio |
5 | Convênio parcial |
6 | Parcialmente pago convênio |
OrigemAcrescimoDesconto
Origem do acréscimo ou desconto.
| Id | Descrição |
|---|---|
1 | Convênio |
2 | Cadastro prescritor |
3 | Cadastro cliente |
4 | Manual |
StatusPedido
Status do pedido.
| Id | Descrição |
|---|---|
1 | Aguardando Aprovação |
2 | Finalizado |
3 | Em Preparação |
4 | Processo Unificação |
5 | Disponível para Retirada |
6 | Entregue |
7 | Problemas |
8 | Aguardando Itens |
9 | Em Unificação |
10 | Em Rota |
11 | Cancelado |
12 | Disponivel Unificação |
13 | Em Preparação Não Unificável |
14 | Deletado |
TipoEntrega
Tipo da entrega.
| Id | Descrição |
|---|---|
1 | Balcão |
2 | Delivery |
3 | Orçamento |
StatusEntrega
Status da entrega.
| Id | Descrição |
|---|---|
1 | Aguardando Itens |
2 | Em Unificação |
3 | Disponível para Entrega |
4 | Em Rota |
5 | Entregue |
6 | Cancelado |
7 | Disponivel Unificação |
8 | Problemas |
9 | Em Preparação |
10 | Em Preparação Não Unificável |
11 | Recusado |
12 | Deletado |
13 | Separado |
15 | Aguardando Revisão |
TipoDestinatario
Tipo do destinatário da entrega.
| Id | Descrição |
|---|---|
1 | Cliente |
2 | Paciente |
StatusPagamentoLancamento
Status de pagamento do lançamento.
| Id | Descrição |
|---|---|
1 | Pago/Recebido |
2 | Pendente |
3 | Vencido |
TipoPagamento
Forma de pagamento.
| Id | Descrição |
|---|---|
1 | Dinheiro |
2 | Cheque |
3 | Cartão de crédito |
4 | Cartão de débito |
5 | Boleto |
6 | Transferência |
7 | Convênio |
8 | Delivery |
9 | Pix |
10 | Outros |
11 | Farmácia Popular |
12 | Epharma |
13 | Funcional Card |
14 | Pix TEF |
15 | Pix offline |
TipoReceita
Tipo da receita.
| Id | Descrição |
|---|---|
1 | Manual |
2 | Venda |
3 | Recebimento |
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
| HTTP | Significado | O que fazer |
|---|---|---|
| 400 | Request inválido (tenantId ausente/malformado, sequência inválida, período inválido, Idempotency-Key ausente). | Corrigir a chamada — não repetir sem ajuste. |
| 401 | Token ausente, expirado ou inválido. | Renovar o token e repetir. |
| 403 | Sem permissão no recurso para a filial (tenant) informada. | Verificar o tenantId e o recurso; acionar a Fagron Tech. |
| 404 | Código de recurso inexistente, ou chaveProcessamento inexistente ou de outro recurso. | Conferir a chave e o código do recurso. |
| 409 | Conflito 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. |
| 422 | Janela de reprocessamento maior que o limite. | Fatiar o período em blocos de até 90 dias. |
| 5xx | Falha 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-correlationiddevolvido na resposta da chamada.