Skip to content

Migrate from Beta

Map connection-first beta routes and SDK wrappers to the account-first API.

The beta API exposed broker connections as the primary integration resource. The API makes the financial account and company grant the public resource. Existing beta routes remain available during the migration window, but new integrations should use sessions, Connect grants, account-scoped data reads, account-scoped trading, and webhook subscriptions.

Migration checklist

  1. Replace stored connectionId references with financial accountId references returned by account APIs.
  2. Create company-owned sessions from your backend.
  3. Open Connect through a portal link. Treat onSuccess as session/user linkage and account.grant.created through onEvent as durable grant creation.
  4. Wait for session or account sync readiness, then read balances, positions, transactions, and orders under /api/v1/accounts/{accountId}/....
  5. Add Idempotency-Key to order create/modify/cancel commands.
  6. Persist instrument.finaticInstrumentId from account-scoped reads as the opaque matching identity. Keep legacy symbol and flat identity fields for compatibility/display only.
  7. For placement, send the previously returned canonical value as finaticInstrumentId within the same authorized account/provider scope. Keep provider-native instrumentId separate when the broker requires it.
  8. Subscribe to webhook event types and route events by companyAccountId, accountId, and grantId.

Route mapping

Beta route familyCurrent API
POST /api/beta/session/initPOST /api/v1/sessions from a backend with X-API-Key.
POST /api/beta/session/startBrowser SDK initialization from a one-time token.
GET /api/beta/session/portalPOST /api/v1/sessions/{sessionId}/portal-links, then open Connect.
GET /api/beta/session/{sessionId}/userGET /api/v1/sessions/{sessionId}/user from the backend.
POST /api/beta/session/link-userPOST /api/v1/portal/{sessionId}/user-link.
GET /api/beta/portal/{token}GET /api/v1/portal/{token}.
POST /api/beta/portal/{sessionId}/completePOST /api/v1/portal/{sessionId}/complete.
GET /api/beta/brokersGET /api/v1/portal/{sessionId}/institutions.
POST /api/beta/brokers/connectPOST /api/v1/portal/{sessionId}/auth-attempts.
GET /api/beta/brokers/data/accountsGET /api/v1/accounts.
GET /api/beta/brokers/data/balancesGET /api/v1/accounts/{accountId}/balances.
GET /api/beta/brokers/data/positionsGET /api/v1/accounts/{accountId}/positions.
GET /api/beta/brokers/data/ordersGET /api/v1/accounts/{accountId}/orders.
GET /api/beta/brokers/data/orders/{orderId}/fillsGET /api/v1/accounts/{accountId}/orders/{orderId}/fills.
GET /api/beta/brokers/data/orders/{orderId}/eventsGET /api/v1/accounts/{accountId}/orders/{orderId}/events.
GET /api/beta/brokers/data/transactionsGET /api/v1/accounts/{accountId}/transactions.
POST /api/beta/brokers/ordersPOST /api/v1/accounts/{accountId}/orders.
PATCH /api/beta/brokers/orders/{orderId}PATCH /api/v1/accounts/{accountId}/orders/{orderId}.
DELETE /api/beta/brokers/orders/{orderId}DELETE /api/v1/accounts/{accountId}/orders/{orderId}.
GET /api/beta/brokers/connectionsGET /api/v1/accounts and GET /api/v1/account-grants.
Beta disconnect with connectionIdPOST /api/v1/users/{userId}/broker-connections/offboarding with { "accountId": "..." } and Idempotency-Key.

SDK mapping

Beta SDK patternSDK pattern
finatic.getBrokerConnections()finatic.v1.listAccounts() plus finatic.v1.listAccountGrants().
finatic.getAccounts({ connectionId })finatic.v1.listAccounts() then account-scoped methods.
finatic.getPositions({ connectionId, accountId })finatic.v1.listPositions({ accountId }).
finatic.getOrders({ connectionId, accountId })finatic.v1.listOrders({ accountId }).
finatic.placeOrder({ broker, accountNumber, order })`finatic.v1.createAccountOrder({ accountId, body,
idempotencyKey })`.
Server getToken() onlyServer session plus portal-link flow for new Connect sessions.
disconnectBroker({ connectionId })offboardBrokerConnection({ userId, accountId, idempotencyKey }) / offboard_broker_connection(user_id, account_id, idempotency_key=...).

The v1 replacement deliberately does not accept or return connectionId. Choose an account belonging to the broker connection you want to offboard. Revoke a single account grant when the broker connection should remain available, and use user-wide offboarding only when every broker connection for that user should be removed.

Instrument identity migration

The descriptor is additive, so existing symbol-only callers can migrate without removing compatibility fields in one release:

  1. Read instrument on fills, positions, position lots, and lot fills; read each order leg's instrument; and align an event's ordered affectedInstruments with affectedLegs.
  2. Store instrument.finaticInstrumentId as the opaque matching/P&L key. Continue showing legacy securityId, symbol, contractCode, or broker fields only as compatibility/display values.
  3. Treat futures with future.identityQuality: "EXACT" (for example MGCZ6 or MGCG7) as distinct contracts. Treat MGC with ROOT_ONLY as root-only, never as an exact contract.
  4. Do not infer missing month, expiration, exchange MIC, quality, or provenance, and do not reconstruct historical order/fill identity from current positions or lots.
  5. When placing an order, send finaticInstrumentId only if it came from the same authorized account/provider. Keep instrumentId as the separately named provider-native identifier. If both are sent, they must resolve to the same instrument or the request fails closed.

The Python generated model exposes finatic_instrument_id; JSON and raw wrapper dictionaries use the wire field finaticInstrumentId.

Webhook migration

Beta webhook event names such as account.orders.updated and connection.updated are replaced by current event names such as order.updated, account.sync.succeeded, and connection.reauth.required.

Use the catalog endpoint and this docs page as the source of truth for current event strings:

1curl https://api.finatic.dev/api/v1/webhooks/catalog 2

Current webhook payloads and headers are camelCase. Route by companyAccountId, financial accountId, and grantId, and verify HMAC signatures against the exact raw request body before parsing JSON.