# O que é o formato OFX

> OFX é o formato que os sistemas contábeis leem para importar extrato sem digitação. O que existe dentro do arquivo, por que a versão 1.x não é XML e por que gravá-lo em UTF-8 quebra a acentuação na importação.

Publicado em 2026-07-19. Autoria: Equipe Convertou.

Se você já importou extrato num sistema contábil, provavelmente pediu um arquivo
OFX ao banco sem nunca ter aberto um. Ele é um arquivo de texto — dá para abrir
no Bloco de Notas — e o que está lá dentro explica boa parte dos problemas de
importação que aparecem no dia a dia: acentuação embaralhada, lançamento com o
sinal trocado, Pix sem o nome de quem pagou.

Vale a pena entender o formato, porque quase todo erro de importação é um erro
de detalhe do arquivo, não do sistema que o recebe.

## OFX quer dizer Open Financial Exchange

É um padrão aberto para troca de dados financeiros, criado nos anos 1990 por
Microsoft, Intuit e CheckFree — na época em que gerenciadores financeiros
pessoais como o Quicken e o Microsoft Money precisavam falar com bancos, e cada
banco falava um dialeto diferente. A primeira especificação é de 1997.

O objetivo era ter uma língua comum: um arquivo que o banco emite e qualquer
software financeiro consegue ler, sem acordo bilateral entre os dois. Quase três
décadas depois, é isso que o formato ainda faz — só que o consumidor mudou. No
Brasil, quem lê OFX hoje é o sistema contábil: Domínio, Conta Azul, Omie, Bling
e os demais esperam esse arquivo na tela de importação de extrato.

## Por que o seu sistema pede justamente ele

Porque o OFX descreve cada lançamento de forma estruturada — data, valor, se é
débito ou crédito, o histórico, o documento — em vez de desenhar uma tabela para
alguém ler. Um PDF de extrato é feito para o olho humano; um OFX é feito para o
software.

A diferença prática é a digitação. Com o OFX, o movimento do mês entra na
contabilidade em um clique. Sem ele, alguém transcreve linha por linha, e a
conciliação passa a depender de não ter havido erro de digitação em nenhuma
delas.

## O que existe dentro do arquivo

Um OFX tem duas partes: um cabeçalho de configuração e um corpo com os dados.

O cabeçalho são linhas simples de `CHAVE:VALOR`, antes de qualquer tag:

```
OFXHEADER:100
DATA:OFXSGML
VERSION:102
SECURITY:NONE
ENCODING:USASCII
CHARSET:1252
COMPRESSION:NONE
OLDFILEUID:NONE
NEWFILEUID:NONE
```

Três dessas linhas importam de verdade:

- **`VERSION:102`** — a versão do formato. `102` é o OFX 1.0.2, e é o que
  praticamente todo banco brasileiro emite.
- **`DATA:OFXSGML`** — declara que o corpo é SGML, não XML. É a linha que causa
  mais confusão, e a próxima seção é inteira sobre ela.
- **`CHARSET:1252`** — a codificação dos caracteres. É onde a acentuação se
  perde quando o arquivo é gravado errado.

Depois do cabeçalho vem o corpo, aberto por `<OFX>`. Dentro dele há o bloco de
identificação da instituição, o da conta, e a lista de lançamentos. Cada
lançamento é um `<STMTTRN>`:

```
<STMTTRN>
<TRNTYPE>DEBIT</TRNTYPE>
<DTPOSTED>20260302120000[-3:BRT]</DTPOSTED>
<TRNAMT>-1740.84</TRNAMT>
<FITID>202603021740840012</FITID>
<MEMO>PIX ENVIADO - FORNECEDOR EXEMPLO LTDA</MEMO>
</STMTTRN>
```

Campo por campo:

- **`TRNTYPE`** — `DEBIT` ou `CREDIT`, entre outros tipos previstos no padrão.
- **`DTPOSTED`** — a data, no formato `AAAAMMDD`, opcionalmente seguida de hora e
  fuso. Em extrato bancário só a data importa; a hora é ruído, e o fuso declarado
  varia tanto de um banco para outro que não dá para confiar nele.
- **`TRNAMT`** — o valor, com sinal. Negativo é saída.
- **`FITID`** — um identificador único do lançamento dentro daquela conta. É o
  que permite ao sistema perceber que você está importando de novo um período já
  importado, em vez de duplicar tudo.
- **`MEMO`** — o histórico.

E há dois campos opcionais que valem menção: `NAME`, com o nome do favorecido, e
`CHECKNUM`, com o número do documento.

No fim do extrato aparece o saldo, dentro de `<LEDGERBAL>`:

```
<LEDGERBAL>
<BALAMT>17290.55</BALAMT>
<DTASOF>20260331120000[-3:BRT]</DTASOF>
</LEDGERBAL>
```

## OFX 1.x não é XML — e isso tem consequência prática

Olhando o trecho acima, a impressão é de estar vendo XML. Não é.

O OFX 1.x é **SGML**, e a diferença que importa é uma só: as tags de valor não
são fechadas. Um arquivo emitido por banco costuma trazer:

```
<TRNAMT>-1740.84
<FITID>202603021740840012
```

Sem `</TRNAMT>`, sem `</FITID>`. O valor termina na quebra de linha. Só as tags
de agrupamento — `<STMTTRN>`, `<BANKTRANLIST>`, `<OFX>` — são fechadas.

Para um parser de XML isso é arquivo malformado, e a reação dele é rejeitar o
documento inteiro. É a origem de uma classe inteira de bugs em quem tenta ler
OFX com uma biblioteca de XML e conclui que "o arquivo do banco está corrompido".
Não está: está no formato que o padrão especifica.

O **OFX 2.x** é XML de verdade, com todas as tags fechadas e prólogo
`<?xml ... ?>`. Existe desde o início dos anos 2000 e é o que se usaria hoje se a
escolha fosse nova. Só que ela não é: os bancos brasileiros exportam quase sempre
1.0.2, e um leitor que só entenda 2.x não serve para praticamente nenhum extrato
emitido no país.

A saída, na prática, é ler o arquivo por varredura de tags em vez de por árvore
de documento. É menos elegante e funciona nas duas versões — que é exatamente o
que se precisa aqui.

## A codificação: Windows-1252, nunca UTF-8

Este é o detalhe que mais quebra importação no Brasil, e o mais fácil de errar.

O cabeçalho declara `CHARSET:1252`, ou seja: os bytes do arquivo estão em
**Windows-1252** (o "ANSI" do Windows). O Domínio lê o arquivo assumindo isso. Se
o OFX for gravado em UTF-8 — o padrão de qualquer ferramenta moderna — cada
caractere acentuado ocupa dois bytes, e o importador, lendo byte a byte como
cp1252, mostra dois caracteres no lugar de um.

O resultado aparece na tela de lançamentos: "TRANSFERÊNCIA" vira
"TRANSFERÃŠNCIA", cedilha vira `Ã§`, til vira `Ã£`. O arquivo importa — o que é
pior do que falhar —, e a contabilidade fica com o histórico ilegível em todos os
lançamentos que tinham acento. Ou seja, quase todos.

Há uma armadilha a mais para quem vai corrigir isso: **latin1 não é a mesma coisa
que Windows-1252**. Latin1 é o ISO-8859-1, e os dois divergem justamente na faixa
de bytes `0x80`–`0x9F`, onde o cp1252 coloca a pontuação tipográfica — travessão,
aspas curvas, símbolo do euro, bolinha de marcador. Gravar como latin1 converte
esses caracteres em caracteres de controle, e o estrago é mais discreto que o do
UTF-8, porque só aparece nos lançamentos que trazem um travessão no histórico.

Na leitura vale a regra inversa: um OFX que chegou do banco deve ser decodificado
como Windows-1252, a menos que o próprio cabeçalho declare UTF-8. Ler um arquivo
cp1252 como se fosse UTF-8 corrompe todo acento do histórico na direção
contrária.

## Onde o banco não segue o padrão

O padrão diz uma coisa; o arquivo que chega diz outra. Três divergências
conhecidas, todas encontradas em arquivos reais:

**Vírgula no lugar do ponto decimal.** A especificação manda ponto: `-1740.84`. O
Bradesco é o caso conhecido de banco que grava `1740,84`. Um leitor que aceite só
o ponto rejeita um arquivo que o próprio banco emitiu.

**`TRNTYPE` contradizendo o sinal.** Há arquivos com `<TRNTYPE>CREDIT` num
lançamento de valor negativo. Quando os dois discordam, o sinal do `TRNAMT` é a
fonte da verdade — ele é inequívoco, e o `TRNTYPE` é o campo que se erra ao
gerar.

**O nome do favorecido que some.** Muitos importadores, o Domínio inclusive,
exibem apenas o `MEMO` na tela de lançamentos e ignoram o `NAME`. Quando o banco
coloca o histórico genérico no `MEMO` ("PIX RECEBIDO - OUTRA IF") e o nome de
quem pagou só no `NAME`, o lançamento chega à contabilidade sem identificar a
contraparte. Por isso, ao gerar OFX, vale anexar o nome ao próprio memo em vez de
confiar que alguém vai ler o campo certo.

## OFX, OFC, CNAB: não são a mesma coisa

Três siglas que aparecem juntas na tela de exportação de alguns bancos e resolvem
problemas diferentes:

- **OFX** é o extrato para gerenciador financeiro e sistema contábil — o assunto
  deste texto.
- **OFC** é o formato anterior da Microsoft, que o OFX veio substituir. Alguns
  bancos ainda o oferecem ao lado do OFX; a Caixa é um deles.
- **CNAB** não é extrato. É o arquivo de retorno de cobrança e pagamento, com
  layout de posição fixa, e serve para conciliar títulos — não para importar o
  movimento da conta.

Escolher o arquivo errado na tela do banco é uma das causas mais banais de "a
importação não funciona".

## E quando o banco não entrega um OFX que sirva

Acontece mais do que se imagina, e nem sempre por ausência do recurso. O período
exportável é curto demais para o fechamento; o arquivo é recusado na importação
por um requisito do sistema contábil; a conta e a maquininha vêm em relatórios
separados e só um deles sai em OFX; a cooperativa não liberou a opção na tela.

Em todos esses casos o PDF costuma ser o documento mais completo que o banco
entrega. Quando ele imprime os saldos de abertura e fechamento, é possível
verificar se os créditos e débitos extraídos explicam aritmeticamente a variação
entre eles. Essa consistência detecta muitos erros de valor, mas não substitui a
revisão de datas e históricos.

É disso que trata a página sobre
[converter PDF para OFX](/pdf-para-ofx), e a lista de
[instituições reconhecidas](/bancos) mostra em quais delas o layout já é
identificado automaticamente.

Fonte canônica: https://convertou.com.br/blog/o-que-e-o-formato-ofx
