v2.0 — New CorpX platform
v2.0 — New CorpX platform
v2 is a full rewrite of the platform on faster, more predictable infrastructure, with direct integration to the new settlement bank. Mostly backward compatible with v1.
Everything you need to migrate in one place:
- Quick migration guide (2 min)
- Full reference (endpoint-by-endpoint audit)
Auth
- New base URL:
https://tenant.api.corpx.com/v1(washttps://api.corpxapi.com/v1) - New Token URL:
https://auth.api.corpx.com/oauth2/token - New
client_id+client_secretper integrator (delivered via secure channel) - Scopes:
api/full→api2/read api2/write Idempotency-Keyis now optional (auto-generated if missing)X-Tenant-Idis required on all/v1/*requests (exceptGET /v1/meand health); must match the account tenant whenaccountIdis in the path
Statement consolidated into a single endpoint
GET /v1/accounts/{accountId}/statementis now always live — queries the settlement bank in real time (no local cache).- Derived endpoints that used to read from the same cache
(
/pix/transactions,/pix/payments,/paymentsalias) are also live now. - The previous v1 API and backoffice remain online in read-only mode for 30 days after cutover for historical lookup.
/transactions/real-statement,/transactions/legacy-statementand/payments/{id}/legacydo not exist on v2 — use/statement(current data) or the v1 read-only API (history).
Deprecated endpoints (still work until 2026-11-21)
4 paths that existed on v1 and weren’t kept in the canonical v2 shape come back as deprecated aliases. They keep responding normally, but attach 3 warning headers to the response:
These headers follow RFC 8594 (Deprecation) and RFC 9745 (Sunset). Planned sunset: 2026-11-21 — after that date they start returning 410 Gone. They no longer appear in the OpenAPI or the Postman collection.
GET /v1/accounts/{id}/pix/payments/{paymentId}→ use/pix/payments/lookup?identifier=GET /v1/accounts/{id}/payments/{paymentId}(alias without/pix/) → use/pix/payments/lookup?identifier=GET /v1/accounts/{id}/pix/qr-code(no/lookup) → use/pix/qr-code/lookup?identifier=POST /v1/accounts/{id}/pix/out/qrcode(no hyphen) → use/pix/out/qr-code
Removed endpoints (return 404 on v2)
GET /v1/accounts/{id}/pix/qr-codes(paginated list) → look one QR up at a time with/pix/qr-code/lookup?identifier=, or use/pix/qr-codes/statsfor aggregatesPOST /v1/webhooks/replay→ no replacementGET /v1/integrator/webhooks→ useGET /v1/webhooksGET /v1/integrator/webhooks/{id}/deliveries→ no replacement (it got one since:GET /v1/webhooks/{subscriptionId}/deliveries, with detail and individual retry)POST /v1/integrator/events/replay+/batch→ no replacementPOST .../pix/med/{medId}/send+/response→ use/decide+/answer
GET /v1/health still exists on v2 (and now has an additional
GET /health alias for external health checks).
New endpoints
GET /v1/me(debug for the authenticatedclient_id)GET /v1/transactions/{id}/timeline(noaccountIdin the path)GET /v1/accounts/{id}/pix/out/bigpix/{batchId}(aggregated BigPix batch status)GET /health(alias for/v1/healthwithout the prefix)- Boleto family (
POST .../boleto/preview|pay,GET .../boleto/payments/{id}) — was 503 on v1, now active
Behavior changes (same path, new shape or semantics)
- Statement and derived endpoints: cache → live; no derived
tariff_ref;X-Source: liveheader; max window per query 31 days. - Internal transfer
by-bank-account: accepts optionalholderDocument+holderName(non-breaking). - Locked balance
unlock: v2 only validateslockId; extra fields are ignored (non-breaking). feefield on the transaction object removed temporarily — manual reconciliation viaidentifier=fee-{slug}-{operationReferenceId}in the statement. Returns with no payload change in a future release.
MED and webhooks temporarily suspended
/v1/accounts/{id}/pix/med/*endpoints return HTTP 503 during the migration. Open disputes follow BACEN’s natural lifecycle — only the API integration is paused.- Suspended webhooks:
fee.*,pix.med.*,edi.*. Subscriptions to these events can stay active — once they’re back they resume automatically. Fees still show up in the statement as separate lines (withidentifier=fee-{slug}-{ref}).
Compat (no change to your code)
- BigPix (
POST .../pix/out/bigpixand.../bank-account/bigpix): body stays single ({amount, key, ...}); chunking remains server-side, same as v1. - PIX out variants (
/pix/out/async,/bank-account/async,/bank-account/bigpix): preserved. /v1/accounts/{accountId}/transfers/internal(all 3 modes): path and body preserved./v1/accounts/{id}/pix/qr-code/staticbody:valuestays as on v1./v1/accounts/{id}/pix/out/qr-code/decode: path preserved./v1/accounts/{id}/pix/keys(GET + POST + DELETE): kept./v1/accounts/{id}/pix/key/{pixKey}(DICT lookup): kept.
Support
Contact: api@corpx.com during the tenant cutover — reply within 1h in business hours.
v2.9.0 — Counterparty document on statement
v2.9.0 — Counterparty document on statement
Statement items (GET /v1/accounts/{accountId}/statement) now include
the counterparty document (CPF/CNPJ) in addition to the name:
recipientName: counterparty name (already existed).recipientDocument: new field — CPF (11 digits) or CNPJ (14 digits), unmasked (digits-only).counterParty: new object aggregating{ name, document }. Omitted when both fields are empty.
For transactions with direction: "IN", the counterparty is the
payer; for direction: "OUT", the recipient. All fields are
backward-compatible — integrators that don’t need the document don’t
have to change anything.