Pular para o conteúdo principal

Guia de TED

Este guia explica como enviar e receber TED (Transferência Eletrônica Disponível) através da CorpX API. TED é uma modalidade de transferência interbancária do BACEN que opera em janela específica e é assíncrona por design — diferente do PIX (instantâneo) e da transferência interna (mesmo banco).

Visão Geral

TED é uma transferência entre bancos diferentes processada pelo SPB (Sistema de Pagamentos Brasileiro), com janela de envio em dias úteis (06:30–17:00) e liquidação no mesmo dia útil quando enviada dentro da janela.

CaracterísticaPIXTEDInternal Transfer
Janela24/7Dias úteis 06:30–17:0024/7
LiquidaçãoInstantânea (menos de 10s)~30min após envioInstantânea
BancosQualquer (rede PIX)Qualquer (rede SPB)Mesmo banco
CustoVariávelVariável (maior que PIX)Tipicamente zero
Limite mínimoR$ 0,01R$ 0,01R$ 0,01
Limite máximoConfigurávelSem teto BACENConfigurável

Quando usar TED em vez de PIX?

  • Valores muito altos acima do limite PIX configurado para a conta
  • Compatibilidade com sistemas legados que ainda exigem TED
  • Contraparte que aceita apenas TED (ex.: alguns convênios públicos)
  • Boleto interbancário ou folha de pagamento corporativa em alguns ERPs

Para o dia-a-dia (pagamentos rápidos, menores que R$ 1MM, dentro/fora de horário comercial), PIX é sempre preferível — instantâneo, 24/7, tipicamente mais barato.

Banco liquidante MT Bank (para receber TED)

Quando alguém quiser enviar TED para você, instrua a contraparte a usar os dados abaixo:

CampoValor
BancoMT Instituição de Pagamentos S.A.
Código Compe681
ISPB50871921
Tipo de contaConta de pagamento (informe à contraparte)
Agência(a sua agência na MT)
Número da conta(o seu número de conta na MT)
CPF/CNPJ do titular(o documento titular da conta)

O código 681 é o que a contraparte vai digitar no campo "Banco" do app/internet banking dela. Não confunda com o ISPB (8 dígitos) — bancos pedem o 3 dígitos do código Compe.

Quando uma TED chega na sua conta, você recebe o webhook ted.in.received (ver Webhooks).

Janela e tempos

A TED segue a janela do BACEN — fora dela, a transação fica agendada para o próximo dia útil.

JanelaComportamento
Dias úteis, 06:30–17:00TED enviada dentro da janela liquida no mesmo dia útil (~30min após envio bem-sucedido)
Dias úteis, 17:00–17:30Janela interbancária direta — não vale para clientes via PSP/MT (rejeitada)
Após 17:30 em dia útilAgendada para D+1 útil. Status fica PROCESSING no nosso lado até liquidar
Fim de semana / feriado nacionalAgendada para o próximo dia útil. Polling defensivo continua até 48h

Polling defensivo do servidor

Para garantir que nenhuma TED fique "presa" mesmo se o webhook do liquidante falhar, o TEDOut.Workflow faz polling no extrato MT a cada 1 minuto por até 48 horas. Se nesse período a TED não aparece como liquidada, é marcada como FAILED (timeout). Você sempre tem o estado final consistente via GET /v1/accounts/{accountId}/transfers/ted/{tedId} ou via webhook ted.out.failed.

Custos e limites

  • TED OUT (enviar): tarifa fixa por operação — consulte no Backoffice → Extrato com filtro operation=FEE (GET /v1/accounts/{accountId}/statement?operation=FEE)
  • TED IN (receber): tarifa de recepção quando aplicável
  • Mínimo: R$ 0,01
  • Máximo: sem teto BACEN; CorpX permite até o limite operacional da conta (configurável via Policies)

Tarifas exatas variam por contrato — consulte o seu acordo comercial.

1. Enviar TED

Endpoint: POST /v1/accounts/{accountId}/ted/out

curl -X POST "https://tenant.api.corpx.com/v1/accounts/{accountId}/ted/out" \
-H "Authorization: Bearer {token}" \
-H "X-Tenant-Id: tenant-suaempresa" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: ted-001" \
-d '{
"value": 5000.00,
"bankCode": "001",
"branch": "1234",
"account": "56789",
"accountType": "CHECKING",
"taxNumber": "12345678900",
"holderName": "JOAO DA SILVA",
"description": "Pagamento de fornecedor NF 12345",
"identifier": "fornecedor-acme-2026-05"
}'

Campos

CampoTipoObrigatórioDescrição
valuenumberSimValor em reais (positivo, máx. 2 casas decimais)
bankCodestringSimCódigo Compe do banco destino (3 dígitos, ex.: 001 Banco do Brasil, 237 Bradesco, 341 Itaú). Aceita também ISPB de 8 dígitos.
branchstringSimAgência destino (só dígitos)
accountstringSimConta destino (só dígitos, sem o dígito verificador final)
accountTypestringNãoCHECKING (default), SAVINGS, PAYMENT ou SALARY
taxNumberstringSimCPF (11 dígitos) ou CNPJ (14 dígitos) do titular destinatário
holderNamestringSimNome completo do titular destinatário
descriptionstringNãoMensagem livre (ex.: número da NF)
identifierstringNãoIdentificador do integrador para correlação. Gerado automaticamente se omitido

Resposta (202 Accepted)

{
"tedId": "ted-fornecedor-acme-2026-05",
"workflowId": "ted-out-ted-fornecedor-acme-2026-05",
"runId": "019e1234-...",
"idempotencyKey": "ted-001",
"identifier": "fornecedor-acme-2026-05",
"status": "PROCESSING",
"amount": 5000.00,
"destination": {
"bankCode": "001",
"branch": "1234",
"account": "56789",
"accountType": "CHECKING",
"taxNumber": "12345678900",
"holderName": "JOAO DA SILVA"
},
"description": "Pagamento de fornecedor NF 12345",
"info": "TED é assíncrona — status final converge via webhook ou polling defensivo (48h max)."
}

O tedId é único da CorpX (ted-{identifier}) e é a chave para consultar status e correlacionar com webhooks.

2. Consultar status

Endpoint: GET /v1/accounts/{accountId}/transfers/ted/{tedId}

curl "https://tenant.api.corpx.com/v1/accounts/{accountId}/transfers/ted/ted-fornecedor-acme-2026-05" \
-H "Authorization: Bearer {token}" \
-H "X-Tenant-Id: tenant-suaempresa"

Resposta (200)

{
"tedId": "ted-fornecedor-acme-2026-05",
"accountId": "773107de-...",
"status": "COMPLETED",
"amount": 5000.00,
"identifier": "fornecedor-acme-2026-05",
"description": "Pagamento de fornecedor NF 12345",
"partnerId": "fornecedor-acme-2026-05",
"createdAt": "2026-05-23T09:00:00Z",
"updatedAt": "2026-05-23T09:32:15Z"
}

Estados

StatusSignificado
PROCESSINGTED aceita pelo liquidante; aguardando liquidação BACEN
COMPLETEDTED liquidada no banco destino (terminal)
FAILEDTED rejeitada, expirada ou timeout 48h (terminal)

Webhooks TED

A forma recomendada de acompanhar TEDs é assinando os webhooks — você é notificado em tempo real sem precisar fazer polling.

Eventos disponíveis

EventoQuando
ted.out.requestedImediatamente após o POST ser aceito (status PROCESSING)
ted.out.confirmedLiquidação confirmada pelo liquidante (terminal — sucesso)
ted.out.failedLiquidação rejeitada/expirada ou timeout 48h (terminal — falha)
ted.in.receivedTED recebida na sua conta (originada por terceiro)
ted.paymentDEPRECATED — alias de ted.out.confirmed. Será removido em v3.0

Payload ted.out.requested

{
"eventType": "ted.out.requested",
"eventId": "ted-fornecedor-acme-2026-05-requested",
"data": {
"tedId": "ted-fornecedor-acme-2026-05",
"tenantId": "tenant-suaempresa",
"accountId": "773107de-...",
"partnerId": "",
"amount": 5000.00,
"destination": {
"bankCode": "001",
"branch": "1234",
"account": "56789",
"accountType": "CHECKING",
"taxNumber": "12345678900",
"holderName": "JOAO DA SILVA"
},
"description": "Pagamento de fornecedor NF 12345"
}
}

Payload ted.out.confirmed

{
"eventType": "ted.out.confirmed",
"eventId": "ted-fornecedor-acme-2026-05-confirmed",
"data": {
"tedId": "ted-fornecedor-acme-2026-05",
"tenantId": "tenant-suaempresa",
"accountId": "773107de-...",
"partnerId": "fornecedor-acme-2026-05",
"amount": 5000.00,
"destination": { ... },
"description": "Pagamento de fornecedor NF 12345"
}
}

Payload ted.out.failed

{
"eventType": "ted.out.failed",
"eventId": "ted-fornecedor-acme-2026-05-failed",
"data": {
"tedId": "ted-fornecedor-acme-2026-05",
"tenantId": "tenant-suaempresa",
"accountId": "773107de-...",
"partnerId": "fornecedor-acme-2026-05",
"amount": 5000.00,
"destination": { ... },
"description": "Pagamento de fornecedor NF 12345",
"errorReason": "invalid_bank_code",
"error": "invalid_bank_code"
}
}

Payload ted.in.received

{
"eventType": "ted.in.received",
"eventId": "ted-in-abc123def",
"data": {
"transactionId": "abc123def",
"identifier": "TED-MT-9876",
"partnerTxId": "abc123def",
"accountId": "773107de-...",
"tenantId": "tenant-suaempresa",
"amount": 1200.00,
"description": "Pagamento recebido",
"receivedAt": "2026-05-23T14:15:22Z",
"payer": {
"name": "EMPRESA XYZ LTDA",
"document": "98765432000110",
"bankCode": "237",
"bankIspb": "60746948",
"branch": "0001",
"account": "123456",
"accountNumber": "123456"
}
}
}

Dedup

Cada webhook tem eventId único e determinístico. Use o eventId na sua base para dedup em caso de re-entrega (acontece em retries do nosso dispatcher quando seu endpoint demora a responder 2xx).

Erros comuns

Código HTTPerrorCodeQuando
400invalid_bank_codebankCode não é Compe (3 dígitos) nem ISPB (8 dígitos) válido
400invalid_tax_numbertaxNumber não tem 11 (CPF) nem 14 (CNPJ) dígitos
400invalid_account_typeaccountType fora de CHECKING|SAVINGS|PAYMENT|SALARY
400invalid_identifieridentifier com caracteres não-ASCII ou tamanho inválido
400missing_fieldsvalue, branch, account, holderName ou taxNumber ausente
403forbiddenUsuário não tem role no tenant da conta
503temporal_unavailableOrquestrador interno indisponível (raro; aguarde e tente novamente)
503partner_unavailableBanco liquidante indisponível
404not_foundtedId não encontrado no GET de status

Erros no workflow (status final FAILED)

errorReasonQuando
insufficient_fundsSaldo insuficiente na conta de origem
invalid_bank_codeBanco destino não existe no SPB
outside_banking_hoursTentativa de TED fora da janela aceita pelo banco liquidante
bank_unreachableErro transitório no banco destino
limit_exceededLimite operacional atingido
timeout aguardando confirmação do parceiro (>48h)Polling defensivo expirou sem liquidação

Reconciliação

A CorpX faz polling defensivo a cada minuto por até 48h após enviar uma TED, mesmo que o webhook do liquidante chegue normalmente. Isso garante que estado interno e estado real do banco estejam sempre alinhados.

Para reconciliar do seu lado:

  • Tempo real: assine os webhooks ted.out.{requested,confirmed,failed} e ted.in.received
  • Lookup pontual: GET /v1/accounts/{accountId}/transfers/ted/{tedId}
  • Extrato: GET /v1/accounts/{accountId}/statement (TEDs aparecem com operation=TED)
  • Timeline detalhada: GET /v1/accounts/{accountId}/transactions/timeline?tedId={tedId}

Deprecação de ted.payment

O evento ted.payment (catálogo legado v1) é mantido como alias de ted.out.confirmed para compatibilidade. Ambos são disparados juntos no mesmo terminal.

  • Novos integradores: assinem ted.out.confirmed (mais descritivo, alinhado com boleto.paid, pix.out.completed)
  • Integradores legados: podem continuar com ted.payment até a v3.0 (data a ser anunciada)
  • Migração: desassinar ted.payment + assinar ted.out.confirmed — payloads são idênticos