TED Guide
This guide explains how to send and receive TED (Transferência Eletrônica Disponível) through the CorpX API. TED is a BACEN interbank transfer that operates in a specific window and is asynchronous by design — unlike PIX (instant) and internal transfers (same bank).
Overview
TED is an interbank transfer processed by the SPB (Brazilian Payment System), with a send window on business days (06:30–17:00) and same-day settlement when sent within the window.
When to use TED instead of PIX?
- Very large amounts above the PIX limit configured for the account
- Legacy systems that still require TED
- Counterparty that only accepts TED (e.g. some public agreements)
- Interbank boletos or corporate payroll in some ERPs
For day-to-day (quick payments, less than R$ 1MM, in/out of business hours), PIX is always preferable — instant, 24/7, typically cheaper.
Settlement bank MT Bank (to receive TED)
When someone wants to send a TED to you, instruct the counterparty to use these details:
Code 681 is what the counterparty enters in the “Bank” field of their app/internet banking. Don’t confuse it with the ISPB (8 digits) — banks ask for the 3-digit Compe code.
When a TED arrives in your account, you receive the ted.in.received webhook (see Webhooks).
Window and timing
TED follows the BACEN window — outside it, the transaction is scheduled for the next business day.
Server-side defensive polling
To ensure no TED gets “stuck” even if the settlement bank’s webhook fails, the TEDOut.Workflow polls the MT statement every 1 minute for up to 48 hours. If the TED doesn’t appear as settled in that period, it’s marked FAILED (timeout). You always get the final consistent state via GET /v1/accounts/{accountId}/ted/{tedId} or via the ted.out.failed webhook.
Costs and limits
- TED OUT (send): fixed fee per operation — see Backoffice → Statement with
operation=FEEfilter (GET /v1/accounts/{accountId}/statement?operation=FEE) - TED IN (receive): receiving fee when applicable
- Min: R$ 0.01
- Max: no BACEN cap; CorpX allows up to the account’s operational limit (configurable via Policies)
Exact fees vary by contract — check your commercial agreement.
1. Send a TED
Endpoint: POST /v1/accounts/{accountId}/ted/out
Fields
Response (202 Accepted)
The tedId is CorpX-unique (ted-{identifier}) and is the key to query status and correlate with webhooks.
2. Query status
Endpoint: GET /v1/accounts/{accountId}/ted/{tedId}
The previous path GET /v1/accounts/{accountId}/transfers/ted/{tedId} still works for backward
compatibility but is deprecated since v2.22.0 and will be removed in a future major. Migrate
to /ted/{tedId} when you can.
Example request:
Response (200)
States
TED Webhooks
The recommended way to track TEDs is to subscribe to webhooks — you’re notified in real time without polling.
Available events
All events use the canonical webhook envelope (id, type, occurredAt,
schemaVersion, environment, tenantId, accountId, data) — the same
one used by PIX, boleto and internal transfers. See
Webhooks.
Payload ted.out.requested
Payload ted.out.confirmed
Payload ted.out.failed
(The API returns partner reasons in Portuguese; the example above means “destination bank does not exist in the SPB”.)
Payload ted.in.received
Dedup
Every webhook has a unique deterministic id (e.g. ted-{tedId}-confirmed). Use the id in your store to dedupe in case of re-delivery (happens on retries of our dispatcher when your endpoint takes long to respond 2xx). The legacy ted.payment alias reuses the same payload with its own id (ted-{tedId}-payment) — tell them apart by type so you don’t drop the canonical event.
Common errors
Workflow errors (final FAILED status)
Reconciliation
CorpX runs defensive polling every minute for up to 48h after sending a TED, even when the settlement bank’s webhook arrives normally. This guarantees that internal state and bank’s real state are always aligned.
To reconcile on your side:
- Real time: subscribe to webhooks
ted.out.{requested,confirmed,failed}andted.in.received - Point lookup:
GET /v1/accounts/{accountId}/ted/{tedId} - Statement:
GET /v1/accounts/{accountId}/statement(TEDs appear withoperation=TED) - Detailed timeline:
GET /v1/accounts/{accountId}/transactions/timeline?identifier={identifier}— the route accepts exactly one ofidentifier(yours, the same one sent on creation) orendToEndId. There is notedIdfilter on this route: sending?tedId=returns400 invalid_query
ted.payment deprecation
The ted.payment event (v1 legacy catalog) is kept as an alias for ted.out.confirmed for compatibility. Both are dispatched together on the same terminal.
- New integrators: subscribe to
ted.out.confirmed(more descriptive, aligned withboleto.paid,pix.out.completed) - Legacy integrators: can keep
ted.paymentuntil v3.0 (date TBA) - Migration: unsubscribe
ted.payment+ subscribeted.out.confirmed— payloads are identical