@finatic/client 0.0.140 → 0.0.142

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -356,6 +356,73 @@ if (ordersPage.hasPrevious) {
356
356
  // No manual session management required
357
357
  ```
358
358
 
359
+ ## Order and Position Detail Data
360
+
361
+ ### Getting Order Fills
362
+
363
+ Order fills represent individual execution fills for an order:
364
+
365
+ ```typescript
366
+ // Get fills for a specific order
367
+ const fills = await finatic.getOrderFills('order-123', {
368
+ connection_id: 'connection-456',
369
+ limit: 50,
370
+ offset: 0,
371
+ });
372
+ ```
373
+
374
+ ### Getting Order Events
375
+
376
+ Order events represent lifecycle events for an order:
377
+
378
+ ```typescript
379
+ // Get events for a specific order
380
+ const events = await finatic.getOrderEvents('order-123', {
381
+ connection_id: 'connection-456',
382
+ limit: 100,
383
+ });
384
+ ```
385
+
386
+ ### Getting Order Groups
387
+
388
+ Order groups contain multiple related orders:
389
+
390
+ ```typescript
391
+ // Get order groups with filters
392
+ const groups = await finatic.getOrderGroups({
393
+ broker_id: 'robinhood',
394
+ connection_id: 'connection-456',
395
+ created_after: '2024-01-01T00:00:00Z',
396
+ limit: 50,
397
+ });
398
+ ```
399
+
400
+ ### Getting Position Lots (Tax Lots)
401
+
402
+ Position lots are used for tax reporting and track when positions were opened/closed:
403
+
404
+ ```typescript
405
+ // Get position lots for tax reporting
406
+ const lots = await finatic.getPositionLots({
407
+ broker_id: 'robinhood',
408
+ account_id: '123456789',
409
+ symbol: 'AAPL',
410
+ limit: 100,
411
+ });
412
+ ```
413
+
414
+ ### Getting Position Lot Fills
415
+
416
+ Position lot fills show the execution details for each lot:
417
+
418
+ ```typescript
419
+ // Get fills for a specific position lot
420
+ const lotFills = await finatic.getPositionLotFills('lot-123', {
421
+ connection_id: 'connection-456',
422
+ limit: 50,
423
+ });
424
+ ```
425
+
359
426
  ## Type Definitions
360
427
 
361
428
  The SDK includes comprehensive TypeScript definitions for all data structures:
@@ -368,6 +435,11 @@ The SDK includes comprehensive TypeScript definitions for all data structures:
368
435
  - `BrokerConnection`: Connection information
369
436
  - `OrderResponse`: Order operation responses
370
437
  - `PaginatedResult`: Paginated data responses
438
+ - `OrderFill`: Order fill information
439
+ - `OrderEvent`: Order event information
440
+ - `OrderGroup`: Order group information
441
+ - `PositionLot`: Position lot (tax lot) information
442
+ - `PositionLotFill`: Position lot fill information
371
443
 
372
444
  ## Error Types
373
445
 
package/dist/index.d.ts CHANGED
@@ -473,6 +473,122 @@ interface DisconnectCompanyResponse {
473
473
  message: string;
474
474
  status_code: number;
475
475
  }
476
+ interface OrderFill {
477
+ id: string;
478
+ order_id: string;
479
+ leg_id: string | null;
480
+ price: number;
481
+ quantity: number;
482
+ executed_at: string;
483
+ execution_id: string | null;
484
+ trade_id: string | null;
485
+ venue: string | null;
486
+ commission_fee: number | null;
487
+ created_at: string;
488
+ updated_at: string;
489
+ }
490
+ interface OrderEvent {
491
+ id: string;
492
+ order_id: string;
493
+ order_group_id: string | null;
494
+ event_type: string | null;
495
+ event_time: string;
496
+ event_id: string | null;
497
+ order_status: string | null;
498
+ inferred: boolean;
499
+ confidence: number | null;
500
+ reason_code: string | null;
501
+ recorded_at: string | null;
502
+ }
503
+ interface OrderLeg {
504
+ id: string;
505
+ order_id: string;
506
+ leg_index: number;
507
+ asset_type: string;
508
+ broker_provided_symbol: string | null;
509
+ quantity: number;
510
+ filled_quantity: number | null;
511
+ avg_fill_price: number | null;
512
+ created_at: string | null;
513
+ updated_at: string | null;
514
+ }
515
+ interface OrderGroupOrder extends BrokerDataOrder {
516
+ legs: OrderLeg[];
517
+ }
518
+ interface OrderGroup {
519
+ id: string;
520
+ user_broker_connection_id: string | null;
521
+ created_at: string;
522
+ updated_at: string;
523
+ orders: OrderGroupOrder[];
524
+ }
525
+ interface PositionLot {
526
+ id: string;
527
+ position_id: string | null;
528
+ user_broker_connection_id: string;
529
+ broker_provided_account_id: string;
530
+ instrument_key: string;
531
+ asset_type: string | null;
532
+ side: 'long' | 'short' | null;
533
+ open_quantity: number;
534
+ closed_quantity: number;
535
+ remaining_quantity: number;
536
+ open_price: number;
537
+ close_price_avg: number | null;
538
+ cost_basis: number;
539
+ cost_basis_w_commission: number;
540
+ realized_pl: number;
541
+ realized_pl_w_commission: number;
542
+ lot_opened_at: string;
543
+ lot_closed_at: string | null;
544
+ position_group_id: string | null;
545
+ created_at: string;
546
+ updated_at: string;
547
+ position_lot_fills?: PositionLotFill[];
548
+ }
549
+ interface PositionLotFill {
550
+ id: string;
551
+ lot_id: string;
552
+ order_fill_id: string;
553
+ fill_price: number;
554
+ fill_quantity: number;
555
+ executed_at: string;
556
+ commission_share: number | null;
557
+ created_at: string;
558
+ updated_at: string;
559
+ }
560
+ interface OrderFillsFilter {
561
+ connection_id?: string;
562
+ limit?: number;
563
+ offset?: number;
564
+ }
565
+ interface OrderEventsFilter {
566
+ connection_id?: string;
567
+ limit?: number;
568
+ offset?: number;
569
+ }
570
+ interface OrderGroupsFilter {
571
+ broker_id?: string;
572
+ connection_id?: string;
573
+ limit?: number;
574
+ offset?: number;
575
+ created_after?: string;
576
+ created_before?: string;
577
+ }
578
+ interface PositionLotsFilter {
579
+ broker_id?: string;
580
+ connection_id?: string;
581
+ account_id?: string;
582
+ symbol?: string;
583
+ position_id?: string;
584
+ limit?: number;
585
+ offset?: number;
586
+ }
587
+ interface PositionLotFillsFilter {
588
+ connection_id?: string;
589
+ limit?: number;
590
+ offset?: number;
591
+ }
476
592
 
477
593
  /**
478
594
  * Order-related types
@@ -1011,6 +1127,8 @@ declare class ApiClient {
1011
1127
  private tradingContext;
1012
1128
  private companyId;
1013
1129
  private csrfToken;
1130
+ private readonly logger;
1131
+ private buildLoggerExtra;
1014
1132
  constructor(baseUrl: string, deviceInfo?: DeviceInfo$1);
1015
1133
  /**
1016
1134
  * Set session context (session ID, company ID, CSRF token)
@@ -1192,6 +1310,74 @@ declare class ApiClient {
1192
1310
  * @returns Promise with disconnect response
1193
1311
  */
1194
1312
  disconnectCompany(connectionId: string): Promise<DisconnectCompanyResponse>;
1313
+ /**
1314
+ * Get order fills for a specific order
1315
+ * @param orderId - The order ID
1316
+ * @param filter - Optional filter parameters
1317
+ * @returns Promise with order fills response
1318
+ */
1319
+ getOrderFills(orderId: string, filter?: OrderFillsFilter): Promise<{
1320
+ _id: string;
1321
+ response_data: OrderFill[];
1322
+ message: string;
1323
+ status_code: number;
1324
+ warnings: null;
1325
+ errors: null;
1326
+ }>;
1327
+ /**
1328
+ * Get order events for a specific order
1329
+ * @param orderId - The order ID
1330
+ * @param filter - Optional filter parameters
1331
+ * @returns Promise with order events response
1332
+ */
1333
+ getOrderEvents(orderId: string, filter?: OrderEventsFilter): Promise<{
1334
+ _id: string;
1335
+ response_data: OrderEvent[];
1336
+ message: string;
1337
+ status_code: number;
1338
+ warnings: null;
1339
+ errors: null;
1340
+ }>;
1341
+ /**
1342
+ * Get order groups
1343
+ * @param filter - Optional filter parameters
1344
+ * @returns Promise with order groups response
1345
+ */
1346
+ getOrderGroups(filter?: OrderGroupsFilter): Promise<{
1347
+ _id: string;
1348
+ response_data: OrderGroup[];
1349
+ message: string;
1350
+ status_code: number;
1351
+ warnings: null;
1352
+ errors: null;
1353
+ }>;
1354
+ /**
1355
+ * Get position lots (tax lots for positions)
1356
+ * @param filter - Optional filter parameters
1357
+ * @returns Promise with position lots response
1358
+ */
1359
+ getPositionLots(filter?: PositionLotsFilter): Promise<{
1360
+ _id: string;
1361
+ response_data: PositionLot[];
1362
+ message: string;
1363
+ status_code: number;
1364
+ warnings: null;
1365
+ errors: null;
1366
+ }>;
1367
+ /**
1368
+ * Get position lot fills for a specific lot
1369
+ * @param lotId - The position lot ID
1370
+ * @param filter - Optional filter parameters
1371
+ * @returns Promise with position lot fills response
1372
+ */
1373
+ getPositionLotFills(lotId: string, filter?: PositionLotFillsFilter): Promise<{
1374
+ _id: string;
1375
+ response_data: PositionLotFill[];
1376
+ message: string;
1377
+ status_code: number;
1378
+ warnings: null;
1379
+ errors: null;
1380
+ }>;
1195
1381
  }
1196
1382
 
1197
1383
  type EventCallback = (...args: any[]) => void;
@@ -1230,6 +1416,8 @@ declare class FinaticConnect extends EventEmitter {
1230
1416
  private readonly SESSION_VALIDATION_TIMEOUT;
1231
1417
  private readonly SESSION_REFRESH_BUFFER_HOURS;
1232
1418
  private sessionStartTime;
1419
+ private readonly logger;
1420
+ private buildLoggerExtra;
1233
1421
  constructor(options: FinaticConnectOptions, deviceInfo?: DeviceInfo);
1234
1422
  private linkUserToSession;
1235
1423
  /**
@@ -1496,6 +1684,39 @@ declare class FinaticConnect extends EventEmitter {
1496
1684
  * @throws AuthenticationError if user is not authenticated
1497
1685
  */
1498
1686
  disconnectCompany(connectionId: string): Promise<DisconnectCompanyResponse>;
1687
+ /**
1688
+ * Get order fills for a specific order
1689
+ * @param orderId - The order ID
1690
+ * @param filter - Optional filter parameters
1691
+ * @returns Promise with order fills response
1692
+ */
1693
+ getOrderFills(orderId: string, filter?: OrderFillsFilter): Promise<OrderFill[]>;
1694
+ /**
1695
+ * Get order events for a specific order
1696
+ * @param orderId - The order ID
1697
+ * @param filter - Optional filter parameters
1698
+ * @returns Promise with order events response
1699
+ */
1700
+ getOrderEvents(orderId: string, filter?: OrderEventsFilter): Promise<OrderEvent[]>;
1701
+ /**
1702
+ * Get order groups
1703
+ * @param filter - Optional filter parameters
1704
+ * @returns Promise with order groups response
1705
+ */
1706
+ getOrderGroups(filter?: OrderGroupsFilter): Promise<OrderGroup[]>;
1707
+ /**
1708
+ * Get position lots (tax lots for positions)
1709
+ * @param filter - Optional filter parameters
1710
+ * @returns Promise with position lots response
1711
+ */
1712
+ getPositionLots(filter?: PositionLotsFilter): Promise<PositionLot[]>;
1713
+ /**
1714
+ * Get position lot fills for a specific lot
1715
+ * @param lotId - The position lot ID
1716
+ * @param filter - Optional filter parameters
1717
+ * @returns Promise with position lot fills response
1718
+ */
1719
+ getPositionLotFills(lotId: string, filter?: PositionLotFillsFilter): Promise<PositionLotFill[]>;
1499
1720
  }
1500
1721
 
1501
1722
  /**
@@ -1532,7 +1753,40 @@ declare function validateCustomTheme(theme: PortalThemeConfig): boolean;
1532
1753
  */
1533
1754
  declare function createCustomThemeFromPreset(preset: string, modifications: Partial<PortalThemeConfig>): PortalThemeConfig | null;
1534
1755
 
1756
+ type LogLevel = 'silent' | 'error' | 'warn' | 'info' | 'debug';
1757
+ interface LoggerMetadata {
1758
+ [key: string]: unknown;
1759
+ }
1760
+ interface LoggerExtra {
1761
+ metadata?: LoggerMetadata;
1762
+ module?: string;
1763
+ function?: string;
1764
+ event?: string;
1765
+ duration_ms?: number;
1766
+ error?: unknown;
1767
+ [key: string]: unknown;
1768
+ }
1769
+ interface LoggerOptions {
1770
+ name: string;
1771
+ level?: LogLevel;
1772
+ defaultMetadata?: LoggerMetadata;
1773
+ }
1774
+ interface Logger {
1775
+ getLevel: () => LogLevel;
1776
+ setLevel: (level: LogLevel) => void;
1777
+ debug: (message: string, extra?: LoggerExtra) => void;
1778
+ info: (message: string, extra?: LoggerExtra) => void;
1779
+ warn: (message: string, extra?: LoggerExtra) => void;
1780
+ error: (message: string, extra?: LoggerExtra) => void;
1781
+ exception: (message: string, error: unknown, extra?: LoggerExtra) => void;
1782
+ }
1783
+ type LogVerbosity = 0 | 1 | 2 | 3;
1784
+
1785
+ declare const setupLogger: (nameOrOptions: string | LoggerOptions, level?: LogLevel, defaultMetadata?: LoggerMetadata) => Logger;
1786
+ declare const buildLoggerExtra: (metadata: LoggerMetadata) => LoggerExtra;
1787
+ declare const logStartEnd: (logger: Logger) => <Args extends unknown[], ReturnType>(fn: (...args: Args) => ReturnType | Promise<ReturnType>) => (...args: Args) => Promise<ReturnType>;
1788
+
1535
1789
  declare const portalThemePresets: Record<string, PortalThemeConfig>;
1536
1790
 
1537
- export { ApiClient, ApiError, AuthenticationError, AuthorizationError, BaseError, CompanyAccessError, EventEmitter, FinaticConnect, NetworkError, OrderError, OrderValidationError, PaginatedResult, RateLimitError, SecurityError, SessionError, TokenError, TradingNotEnabledError, appendThemeToURL, createCustomThemeFromPreset, generatePortalThemeURL, getThemePreset, portalThemePresets, validateCustomTheme };
1538
- export type { AccountsFilter, ApiConfig, ApiResponse, BalancesFilter, BrokerAccount, BrokerBalance, BrokerConnection, BrokerDataAccount, BrokerDataOptions, BrokerDataOrder, BrokerDataPosition, BrokerExtras$1 as BrokerExtras, BrokerInfo, BrokerOrder, BrokerOrderParams, BrokerPosition, CryptoOrderOptions, DeviceInfo$1 as DeviceInfo, FilteredAccountsResponse, FilteredBalancesResponse, FilteredOrdersResponse, FilteredPositionsResponse, FinaticConnectOptions, FinaticUserToken, Holding, OptionsOrder, OptionsOrderOptions, Order, OrderNotFoundError, OrderResponse, OrdersFilter, OtpRequestResponse, OtpVerifyResponse, PerformanceMetrics, PortalMessage, PortalProps, PortalResponse, PortalTheme, PortalThemeConfig, PortalThemePreset, PortalUrlResponse, Portfolio, PortfolioSnapshot, PositionsFilter, RefreshTokenRequest, RefreshTokenResponse, RequestHeaders, SessionAuthenticateResponse, SessionInitResponse, SessionResponse, SessionStatus, SessionValidationResponse, TokenInfo, TradeAccessDeniedError, TradingContext, UserToken, ValidationError };
1791
+ export { ApiClient, ApiError, AuthenticationError, AuthorizationError, BaseError, CompanyAccessError, EventEmitter, FinaticConnect, NetworkError, OrderError, OrderValidationError, PaginatedResult, RateLimitError, SecurityError, SessionError, TokenError, TradingNotEnabledError, appendThemeToURL, buildLoggerExtra, createCustomThemeFromPreset, generatePortalThemeURL, getThemePreset, logStartEnd, portalThemePresets, setupLogger, validateCustomTheme };
1792
+ export type { AccountsFilter, ApiConfig, ApiResponse, BalancesFilter, BrokerAccount, BrokerBalance, BrokerConnection, BrokerDataAccount, BrokerDataOptions, BrokerDataOrder, BrokerDataPosition, BrokerExtras$1 as BrokerExtras, BrokerInfo, BrokerOrder, BrokerOrderParams, BrokerPosition, CryptoOrderOptions, DeviceInfo$1 as DeviceInfo, FilteredAccountsResponse, FilteredBalancesResponse, FilteredOrdersResponse, FilteredPositionsResponse, FinaticConnectOptions, FinaticUserToken, Holding, LogLevel, LogVerbosity, Logger, LoggerExtra, LoggerMetadata, LoggerOptions, OptionsOrder, OptionsOrderOptions, Order, OrderEvent, OrderEventsFilter, OrderFill, OrderFillsFilter, OrderGroup, OrderGroupOrder, OrderGroupsFilter, OrderLeg, OrderNotFoundError, OrderResponse, OrdersFilter, OtpRequestResponse, OtpVerifyResponse, PerformanceMetrics, PortalMessage, PortalProps, PortalResponse, PortalTheme, PortalThemeConfig, PortalThemePreset, PortalUrlResponse, Portfolio, PortfolioSnapshot, PositionLot, PositionLotFill, PositionLotFillsFilter, PositionLotsFilter, PositionsFilter, RefreshTokenRequest, RefreshTokenResponse, RequestHeaders, SessionAuthenticateResponse, SessionInitResponse, SessionResponse, SessionStatus, SessionValidationResponse, TokenInfo, TradeAccessDeniedError, TradingContext, UserToken, ValidationError };