@0xinsider/sdk 0.36.0 → 0.38.0

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/dist/schema.d.ts CHANGED
@@ -51,6 +51,23 @@ export type AgentRegistration = {
51
51
  auth_guide_url: string;
52
52
  };
53
53
  };
54
+ /** A computed count with its truth state; the same envelope as AnalyticNumber. */
55
+ export type AnalyticInteger = {
56
+ state: "computed" | "known_zero" | "not_computed" | "not_applicable" | "stale" | "unavailable" | "insufficient_data";
57
+ source: "provider" | "insert_time" | "cache" | "computed";
58
+ value?: number;
59
+ freshness_at?: string;
60
+ };
61
+ /** A computed number with its truth state. value is present when state is computed or known_zero and may be present when stale; any other state says why there is no number, never a stand-in zero. */
62
+ export type AnalyticNumber = {
63
+ /** computed: a measured value. known_zero: a measured zero. stale: a value past its freshness window. not_computed: an input is unknown. not_applicable: the measure does not apply. unavailable: the source could not be read. insufficient_data: too few observations. */
64
+ state: "computed" | "known_zero" | "not_computed" | "not_applicable" | "stale" | "unavailable" | "insufficient_data";
65
+ /** Where the value came from, for diagnostics: cache is a stored aggregate, computed a request-time aggregate. Decide on state, not source. */
66
+ source: "provider" | "insert_time" | "cache" | "computed";
67
+ value?: number;
68
+ /** When the stored inputs behind the value were written or last confirmed (cache), or the request time (computed). */
69
+ freshness_at?: string;
70
+ };
54
71
  export type ApiDiscovery = {
55
72
  /** Canonical API origin for public V1 requests. */
56
73
  api_base_url: string;
@@ -1330,10 +1347,12 @@ export type GameHoldersItem = {
1330
1347
  market: MarketHoldersMarket;
1331
1348
  scan: MarketHoldersScan;
1332
1349
  totals: MarketHoldersTotals;
1333
- /** When this roster was computed. A cached roster is at most 60 seconds old. */
1350
+ /** When this roster was computed. A fresh cached roster is at most 60 seconds old; a stale one at most 15 minutes. */
1334
1351
  computed_at: string;
1335
- /** true when the roster came from the 60-second roster cache. */
1352
+ /** true when the roster came from the cache. */
1336
1353
  cached: boolean;
1354
+ /** true when the market had no fresh roster at the batch deadline and this is the last roster published for it, up to 15 minutes old (read computed_at). The fresh one is still computing, so a read a few seconds later normally gets it; a market refused over the account's cold-read share is served the same way. */
1355
+ stale: boolean;
1337
1356
  };
1338
1357
  /** One Polymarket market linked to this game. */
1339
1358
  export type GameMarket = {
@@ -1895,6 +1914,21 @@ export type LeaderboardPriceEdge = {
1895
1914
  /** Why the leaderboard does not rank a ranked edge. record_incomplete: the wallet's stored sports and esports record shows more profit than Polymarket reports for it, so some losing markets are likely missing. Omitted when nothing holds the edge, and always omitted unless status is ranked. */
1896
1915
  hold?: "record_incomplete";
1897
1916
  };
1917
+ /** The whole board's totals, the counts the 0xinsider leaderboard page shows (#32737), read with the ranking snapshot the page is served at. Sent on every page of a request with no category and no strategy, whatever its sort, dir and activity, which order or split the same wallets. Omitted on a category or strategy page, which lists a subset these totals do not describe, and while the ranking has no totals for the served generation. */
1918
+ export type LeaderboardSummary = {
1919
+ /** Ranked wallets on the board: the wallets the unfiltered list pages through. */
1920
+ ranked_total: number;
1921
+ /** Ranked wallets by grade. Every ranked wallet is graded S, A or B, so the three sum to ranked_total. */
1922
+ by_grade: {
1923
+ S: number;
1924
+ A: number;
1925
+ B: number;
1926
+ };
1927
+ /** Ranked wallets whose last trade was 30 days or less before as_of: the wallets activity=active lists. ranked_total minus active_30d is the activity=inactive count. */
1928
+ active_30d: number;
1929
+ /** When the totals were counted, UTC. They are recounted about once a minute while the ranking is current. */
1930
+ as_of: string;
1931
+ };
1898
1932
  /** One side's score line inside a `live_sports_updated` pulse. */
1899
1933
  export type LiveSportsScoreEntry = {
1900
1934
  /** Team name, ordered for the league (away first where the league reads that way). */
@@ -2630,6 +2664,13 @@ export type PickOfTheDayArchive = {
2630
2664
  /** One entry per product day that has a published pick included in the archive, newest first, in the same order as picks. Each carries that day's net units, accumulated in the same backend pass and behind the same visibility gate as hit_rate.unit_score, so both cover the same population of picks. Re-adding the day totals reproduces hit_rate.unit_score to display precision rather than bit-for-bit, since that re-associates the floating-point sum. */
2631
2665
  days: PickOfTheDayArchiveDay[];
2632
2666
  hit_rate: PickOfTheDayHitRate;
2667
+ page?: {
2668
+ has_more: boolean;
2669
+ limit: number;
2670
+ next_cursor: string | null;
2671
+ returned: number;
2672
+ total: number;
2673
+ };
2633
2674
  };
2634
2675
  export type PickOfTheDayArchiveDay = {
2635
2676
  /** The product day (YYYY-MM-DD). */
@@ -2725,6 +2766,67 @@ export type PickOfTheDayArchiveEntry = {
2725
2766
  */
2726
2767
  supersedes_pick_id: string | null;
2727
2768
  };
2769
+ /** The archive with `view=summary`: `hit_rate` without its daily `series`, one short row per pick, and `page`. Page with `limit` and `cursor`; `view=full` returns every field of a row. */
2770
+ export type PickOfTheDayArchiveSummary = {
2771
+ hit_rate: {
2772
+ clv_applicable: number;
2773
+ clv_avg_display?: string;
2774
+ clv_avg_pct?: number;
2775
+ clv_avg_pp?: number;
2776
+ clv_avg_pp_display?: string;
2777
+ clv_beats_close: number;
2778
+ clv_coverage_display?: string;
2779
+ clv_coverage_explanation?: string;
2780
+ clv_coverage_pct?: number;
2781
+ clv_eligible: number;
2782
+ clv_measured: number;
2783
+ clv_not_applicable: number;
2784
+ clv_pending: number;
2785
+ clv_state: string;
2786
+ clv_ties: number;
2787
+ clv_total: number;
2788
+ clv_unavailable: number;
2789
+ decided: number;
2790
+ losses: number;
2791
+ net_profit_display: string;
2792
+ net_profit_usd: number;
2793
+ pct: number;
2794
+ pending: number;
2795
+ roi_display: string;
2796
+ roi_pct: number;
2797
+ stake_usd: number;
2798
+ staked_usd: number;
2799
+ unit_score?: number;
2800
+ unit_score_display?: string;
2801
+ void: number;
2802
+ win_rate_display: string;
2803
+ wins: number;
2804
+ };
2805
+ page: {
2806
+ has_more: boolean;
2807
+ limit: number;
2808
+ next_cursor: string | null;
2809
+ returned: number;
2810
+ total: number;
2811
+ };
2812
+ picks: {
2813
+ backed_price?: number;
2814
+ backed_side_locked?: boolean;
2815
+ clv_pct?: number;
2816
+ display_category?: string;
2817
+ is_free_selection: boolean;
2818
+ matchup?: string;
2819
+ outcome: string;
2820
+ pick_date: string;
2821
+ pick_id: string;
2822
+ pick_outcome_label?: string;
2823
+ publication_order: number;
2824
+ required_tier?: string;
2825
+ top_grade?: string;
2826
+ unit_score?: number;
2827
+ }[];
2828
+ view: string;
2829
+ };
2728
2830
  /** Select using the entry commitment_version, never implicit payload shape. All historic v1 hashes remain unchanged. */
2729
2831
  export type PickOfTheDayCommitmentPayload = PickOfTheDayCommitmentPayloadV1 | PickOfTheDayCommitmentPayloadV2;
2730
2832
  /** The frozen identity of the pick, exactly as the hash was taken over it. Served byte for byte as it was hashed -- keys sorted by UTF-8 byte value, no insignificant whitespace -- so a verifier concatenates and hashes with nothing to reconstruct. Property order below is the wire order. The outcome is deliberately NOT part of it: surviving a corrected outcome unchanged is the case the commitment exists for. Worked example: {"backed_price":"0.545000","condition_id":"0xabc","kickoff":"2026-09-20T23:05:00Z","pick_date":"2026-09-20","pick_outcome_index":1,"pick_outcome_label":"Lakers","pick_rank":1,"platform":"polymarket"} with the nonce 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f hashes to 44d18fa5e2aa3a2bf3c971dcc9317c8ccbdfd5480a4773b6d8ffd5fbeeea84dc. */
@@ -3397,6 +3499,446 @@ export type PickOfTheDayStats = {
3397
3499
  pick_rank: number;
3398
3500
  }[];
3399
3501
  };
3502
+ /** The stats with `view=summary` or `sections`: only the named sections, listed in `sections`. `view=summary` names every section except `series`, `days`, `categories`, `months` and `voids`. */
3503
+ export type PickOfTheDayStatsSections = {
3504
+ categories?: {
3505
+ canonical_category?: string;
3506
+ clv_avg_display?: string;
3507
+ clv_avg_pct?: number;
3508
+ clv_avg_pp?: number;
3509
+ clv_avg_pp_display?: string;
3510
+ clv_measured: number;
3511
+ edge_display?: string;
3512
+ edge_pp?: number;
3513
+ key: string;
3514
+ label: string;
3515
+ losses: number;
3516
+ net_profit_display?: string;
3517
+ net_profit_usd?: number;
3518
+ pending: number;
3519
+ picks: number;
3520
+ priced_decided: number;
3521
+ priced_in_display?: string;
3522
+ priced_in_pct?: number;
3523
+ roi_display?: string;
3524
+ roi_pct?: number;
3525
+ settled: number;
3526
+ small_sample: boolean;
3527
+ staked_usd: number;
3528
+ unit_score?: number;
3529
+ unit_score_display?: string;
3530
+ void: number;
3531
+ win_rate_display?: string;
3532
+ win_rate_pct?: number;
3533
+ wins: number;
3534
+ }[];
3535
+ days?: ({
3536
+ date: string;
3537
+ losses: number;
3538
+ net_profit_display?: string;
3539
+ net_profit_usd?: number;
3540
+ pending: number;
3541
+ picks: number;
3542
+ sweep?: "win" | "loss";
3543
+ unit_score?: number;
3544
+ unit_score_display?: string;
3545
+ void: number;
3546
+ wins: number;
3547
+ })[];
3548
+ hit_rate?: {
3549
+ clv_applicable: number;
3550
+ clv_avg_display?: string;
3551
+ clv_avg_pct?: number;
3552
+ clv_avg_pp?: number;
3553
+ clv_avg_pp_display?: string;
3554
+ clv_beats_close: number;
3555
+ clv_coverage_display?: string;
3556
+ clv_coverage_explanation?: string;
3557
+ clv_coverage_pct?: number;
3558
+ clv_eligible: number;
3559
+ clv_measured: number;
3560
+ clv_not_applicable: number;
3561
+ clv_pending: number;
3562
+ clv_state: string;
3563
+ clv_ties: number;
3564
+ clv_total: number;
3565
+ clv_unavailable: number;
3566
+ decided: number;
3567
+ losses: number;
3568
+ net_profit_display: string;
3569
+ net_profit_usd: number;
3570
+ pct: number;
3571
+ pending: number;
3572
+ roi_display: string;
3573
+ roi_pct: number;
3574
+ stake_usd: number;
3575
+ staked_usd: number;
3576
+ unit_score?: number;
3577
+ unit_score_display?: string;
3578
+ void: number;
3579
+ win_rate_display: string;
3580
+ wins: number;
3581
+ };
3582
+ market_expectations?: {
3583
+ as_of_date: string;
3584
+ price_basis: string;
3585
+ timezone: string;
3586
+ windows: ({
3587
+ clv_avg_display: string | null;
3588
+ clv_avg_pct: number | null;
3589
+ clv_avg_pp: number | null;
3590
+ clv_avg_pp_display: string | null;
3591
+ clv_measured: number;
3592
+ clv_missing: number;
3593
+ expected_wins: number | null;
3594
+ expected_wins_display: string | null;
3595
+ from_date: string | null;
3596
+ key: string;
3597
+ label: string;
3598
+ numeric_unavailable: boolean;
3599
+ priced_decided: number;
3600
+ through_date: string;
3601
+ units: number | null;
3602
+ units_display: string | null;
3603
+ units_z: number | null;
3604
+ units_z_display: string | null;
3605
+ unpriced_decided: number;
3606
+ wins: number;
3607
+ wins_z: number | null;
3608
+ wins_z_display: string | null;
3609
+ })[];
3610
+ };
3611
+ market_types?: {
3612
+ canonical_category?: string;
3613
+ clv_avg_display?: string;
3614
+ clv_avg_pct?: number;
3615
+ clv_avg_pp?: number;
3616
+ clv_avg_pp_display?: string;
3617
+ clv_measured: number;
3618
+ edge_display?: string;
3619
+ edge_pp?: number;
3620
+ key: string;
3621
+ label: string;
3622
+ losses: number;
3623
+ net_profit_display?: string;
3624
+ net_profit_usd?: number;
3625
+ pending: number;
3626
+ picks: number;
3627
+ priced_decided: number;
3628
+ priced_in_display?: string;
3629
+ priced_in_pct?: number;
3630
+ roi_display?: string;
3631
+ roi_pct?: number;
3632
+ settled: number;
3633
+ small_sample: boolean;
3634
+ staked_usd: number;
3635
+ unit_score?: number;
3636
+ unit_score_display?: string;
3637
+ void: number;
3638
+ win_rate_display?: string;
3639
+ win_rate_pct?: number;
3640
+ wins: number;
3641
+ }[];
3642
+ months?: {
3643
+ canonical_category?: string;
3644
+ clv_avg_display?: string;
3645
+ clv_avg_pct?: number;
3646
+ clv_avg_pp?: number;
3647
+ clv_avg_pp_display?: string;
3648
+ clv_measured: number;
3649
+ edge_display?: string;
3650
+ edge_pp?: number;
3651
+ key: string;
3652
+ label: string;
3653
+ losses: number;
3654
+ net_profit_display?: string;
3655
+ net_profit_usd?: number;
3656
+ pending: number;
3657
+ picks: number;
3658
+ priced_decided: number;
3659
+ priced_in_display?: string;
3660
+ priced_in_pct?: number;
3661
+ roi_display?: string;
3662
+ roi_pct?: number;
3663
+ settled: number;
3664
+ small_sample: boolean;
3665
+ staked_usd: number;
3666
+ unit_score?: number;
3667
+ unit_score_display?: string;
3668
+ void: number;
3669
+ win_rate_display?: string;
3670
+ win_rate_pct?: number;
3671
+ wins: number;
3672
+ }[];
3673
+ outcome_stats?: {
3674
+ concentration: {
3675
+ positive_wins: number;
3676
+ remaining_valued_decided: number;
3677
+ removed_wins: number;
3678
+ roi_without_top_wins_display: string | null;
3679
+ roi_without_top_wins_pct: number | null;
3680
+ target_wins: number;
3681
+ top_wins_share_display: string | null;
3682
+ top_wins_share_pct: number | null;
3683
+ valued_decided: number;
3684
+ };
3685
+ drawdown: {
3686
+ completed_days: number;
3687
+ current_days_below_peak: number | null;
3688
+ current_drawdown_display: string | null;
3689
+ current_drawdown_units: number | null;
3690
+ days_below_peak: number | null;
3691
+ excluded_days: number;
3692
+ from_date: string | null;
3693
+ longest_days_below_peak: number | null;
3694
+ longest_recovery_days: number | null;
3695
+ max_drawdown_display: string | null;
3696
+ max_drawdown_units: number | null;
3697
+ peak_date: string | null;
3698
+ peak_net_profit_usd: number | null;
3699
+ through_date: string | null;
3700
+ };
3701
+ profit_factor: {
3702
+ display: string | null;
3703
+ gross_loss_usd: number | null;
3704
+ gross_profit_usd: number | null;
3705
+ state: "empty" | "measured" | "no_losses" | "numeric_unavailable";
3706
+ value: number | null;
3707
+ valued_decided: number;
3708
+ };
3709
+ rolling: ({
3710
+ from_date: string | null;
3711
+ losses: number;
3712
+ roi_display: string | null;
3713
+ roi_pct: number | null;
3714
+ through_date: string | null;
3715
+ units: number | null;
3716
+ units_display: string | null;
3717
+ valued_decided: number;
3718
+ win_rate_display: string | null;
3719
+ win_rate_pct: number | null;
3720
+ window_size: number;
3721
+ wins: number;
3722
+ })[];
3723
+ };
3724
+ price_bands?: {
3725
+ canonical_category?: string;
3726
+ clv_avg_display?: string;
3727
+ clv_avg_pct?: number;
3728
+ clv_avg_pp?: number;
3729
+ clv_avg_pp_display?: string;
3730
+ clv_measured: number;
3731
+ edge_display?: string;
3732
+ edge_pp?: number;
3733
+ key: string;
3734
+ label: string;
3735
+ losses: number;
3736
+ net_profit_display?: string;
3737
+ net_profit_usd?: number;
3738
+ pending: number;
3739
+ picks: number;
3740
+ priced_decided: number;
3741
+ priced_in_display?: string;
3742
+ priced_in_pct?: number;
3743
+ roi_display?: string;
3744
+ roi_pct?: number;
3745
+ settled: number;
3746
+ small_sample: boolean;
3747
+ staked_usd: number;
3748
+ unit_score?: number;
3749
+ unit_score_display?: string;
3750
+ void: number;
3751
+ win_rate_display?: string;
3752
+ win_rate_pct?: number;
3753
+ wins: number;
3754
+ }[];
3755
+ records?: {
3756
+ best_day?: {
3757
+ date: string;
3758
+ date_display: string;
3759
+ losses: number;
3760
+ net_profit_display: string;
3761
+ net_profit_usd: number;
3762
+ picks: number;
3763
+ wins: number;
3764
+ };
3765
+ biggest_win?: {
3766
+ category: string;
3767
+ date: string;
3768
+ date_display: string;
3769
+ matchup: string;
3770
+ net_profit_display: string;
3771
+ net_profit_usd: number;
3772
+ };
3773
+ longest_losing_day_streak?: {
3774
+ days: number;
3775
+ end_date: string;
3776
+ net_profit_display: string;
3777
+ net_profit_usd: number;
3778
+ range_display: string;
3779
+ start_date: string;
3780
+ };
3781
+ longest_winning_day_streak?: {
3782
+ days: number;
3783
+ end_date: string;
3784
+ net_profit_display: string;
3785
+ net_profit_usd: number;
3786
+ range_display: string;
3787
+ start_date: string;
3788
+ };
3789
+ sweeps: {
3790
+ clean_sweeps: number;
3791
+ latest_clean_sweep?: {
3792
+ date: string;
3793
+ date_display: string;
3794
+ losses: number;
3795
+ wins: number;
3796
+ };
3797
+ latest_wipeout?: {
3798
+ date: string;
3799
+ date_display: string;
3800
+ losses: number;
3801
+ wins: number;
3802
+ };
3803
+ min_decided: number;
3804
+ wipeouts: number;
3805
+ };
3806
+ winning_days?: {
3807
+ flat: number;
3808
+ losing: number;
3809
+ settled: number;
3810
+ winning: number;
3811
+ winning_pct: number;
3812
+ winning_pct_display: string;
3813
+ };
3814
+ worst_day?: {
3815
+ date: string;
3816
+ date_display: string;
3817
+ losses: number;
3818
+ net_profit_display: string;
3819
+ net_profit_usd: number;
3820
+ picks: number;
3821
+ wins: number;
3822
+ };
3823
+ };
3824
+ sections: string[];
3825
+ series?: {
3826
+ date: string;
3827
+ hit_rate_pct: number;
3828
+ net_profit_usd: number;
3829
+ }[];
3830
+ sports?: {
3831
+ canonical_category?: string;
3832
+ clv_avg_display?: string;
3833
+ clv_avg_pct?: number;
3834
+ clv_avg_pp?: number;
3835
+ clv_avg_pp_display?: string;
3836
+ clv_measured: number;
3837
+ edge_display?: string;
3838
+ edge_pp?: number;
3839
+ key: string;
3840
+ label: string;
3841
+ losses: number;
3842
+ net_profit_display?: string;
3843
+ net_profit_usd?: number;
3844
+ pending: number;
3845
+ picks: number;
3846
+ priced_decided: number;
3847
+ priced_in_display?: string;
3848
+ priced_in_pct?: number;
3849
+ roi_display?: string;
3850
+ roi_pct?: number;
3851
+ settled: number;
3852
+ small_sample: boolean;
3853
+ staked_usd: number;
3854
+ unit_score?: number;
3855
+ unit_score_display?: string;
3856
+ void: number;
3857
+ win_rate_display?: string;
3858
+ win_rate_pct?: number;
3859
+ wins: number;
3860
+ }[];
3861
+ streaks?: {
3862
+ current?: number;
3863
+ current_day?: number;
3864
+ current_day_display?: string;
3865
+ current_display?: string;
3866
+ longest_loss: number;
3867
+ longest_win: number;
3868
+ };
3869
+ tiers?: {
3870
+ canonical_category?: string;
3871
+ clv_avg_display?: string;
3872
+ clv_avg_pct?: number;
3873
+ clv_avg_pp?: number;
3874
+ clv_avg_pp_display?: string;
3875
+ clv_measured: number;
3876
+ edge_display?: string;
3877
+ edge_pp?: number;
3878
+ key: string;
3879
+ label: string;
3880
+ losses: number;
3881
+ net_profit_display?: string;
3882
+ net_profit_usd?: number;
3883
+ pending: number;
3884
+ picks: number;
3885
+ priced_decided: number;
3886
+ priced_in_display?: string;
3887
+ priced_in_pct?: number;
3888
+ roi_display?: string;
3889
+ roi_pct?: number;
3890
+ settled: number;
3891
+ small_sample: boolean;
3892
+ staked_usd: number;
3893
+ unit_score?: number;
3894
+ unit_score_display?: string;
3895
+ void: number;
3896
+ win_rate_display?: string;
3897
+ win_rate_pct?: number;
3898
+ wins: number;
3899
+ }[];
3900
+ total_sides?: {
3901
+ canonical_category?: string;
3902
+ clv_avg_display?: string;
3903
+ clv_avg_pct?: number;
3904
+ clv_avg_pp?: number;
3905
+ clv_avg_pp_display?: string;
3906
+ clv_measured: number;
3907
+ edge_display?: string;
3908
+ edge_pp?: number;
3909
+ key: string;
3910
+ label: string;
3911
+ losses: number;
3912
+ net_profit_display?: string;
3913
+ net_profit_usd?: number;
3914
+ pending: number;
3915
+ picks: number;
3916
+ priced_decided: number;
3917
+ priced_in_display?: string;
3918
+ priced_in_pct?: number;
3919
+ roi_display?: string;
3920
+ roi_pct?: number;
3921
+ settled: number;
3922
+ small_sample: boolean;
3923
+ staked_usd: number;
3924
+ unit_score?: number;
3925
+ unit_score_display?: string;
3926
+ void: number;
3927
+ win_rate_display?: string;
3928
+ win_rate_pct?: number;
3929
+ wins: number;
3930
+ }[];
3931
+ view: string;
3932
+ voids?: {
3933
+ backed_price?: number;
3934
+ backed_side?: string;
3935
+ category?: string;
3936
+ matchup?: string;
3937
+ pick_date: string;
3938
+ pick_id: string;
3939
+ pick_rank: number;
3940
+ }[];
3941
+ };
3400
3942
  /** A settled uncommitted pick's market, side and price. The same eight fields as PickOfTheDayCommitmentPayload, in the same key order, so a settled pick's side and price sit under payload whatever the entry's state. It is NOT a commitment: no hash was taken over it before the game, and it proves nothing about when the pick was made. */
3401
3943
  export type PickOfTheDayUncommittedPayload = {
3402
3944
  /** Frozen pre-game price of the backed side, 0..1, as the plain decimal text of the stored NUMERIC at full stored precision, trailing zeros included -- rendered exactly as the commitment payload renders it. */
@@ -4226,6 +4768,18 @@ export type Trader = {
4226
4768
  /** Current evidence for observed and known categories (expand=categories or expand[]=categories). Omitted unless expanded. Includes insufficient, stale, unknown and degraded rows; absence of a category is not proof of skill. The global grade is unchanged. Sports and esports only (#28827): a category outside them is omitted, as on GET /api/v1/trader/{address}/categories. */
4227
4769
  category_records?: CategorySkillV2[];
4228
4770
  category_skill_model?: CategorySkillModelReadiness;
4771
+ /** Edge over the price paid: the profile's Edge badge and the leaderboard's Edge measure (#32622). Present on every read of a wallet with at least one settled sports or esports market of $20 or more at a known entry price; omitted for a wallet with none, where there is nothing to measure. */
4772
+ price_edge?: TraderPriceEdge;
4773
+ /** The profile's strategy measures over the wallet's sports and esports markets: P&L and win rate by UTC hour, hold-time and first-trade-hour bands, position sizes with category concentration, and entry-price buckets (#32622). Present only when expand=breakdowns or expand[]=breakdowns is requested, on GET /api/v1/trader/{address} only: POST /api/v1/traders/batch refuses the expand. Computed on the read from the wallet's whole sports and esports history, so a large wallet can take seconds; a read that cannot finish answers 503 with Retry-After. */
4774
+ breakdowns?: TraderBreakdowns;
4775
+ };
4776
+ /** The profile's strategy measures (expand=breakdowns, #32622), the same figures as the wallet profile's Insights and Performance breakdown cards. Every figure counts the wallet's sports and esports markets only, from the same read the profile makes. */
4777
+ export type TraderBreakdowns = {
4778
+ hourly_performance: TraderHourlyPerformance;
4779
+ time_breakdowns: TraderTimeBreakdowns;
4780
+ /** Position sizes and category concentration. null when the wallet has no sports or esports position with trades, or its stored markets carry no freshness clock yet. */
4781
+ risk_metrics: TraderRiskMetrics | null;
4782
+ entry_price_analysis: TraderEntryPriceAnalysis;
4229
4783
  };
4230
4784
  export type TraderCategoryRecord = {
4231
4785
  /** Canonical category bucket, for example Soccer, Esports, Tennis. Esports is one bucket, and the Esports record carries its per-game records in games. */
@@ -4297,6 +4851,56 @@ export type TraderContext = {
4297
4851
  /** Human-readable statement of the point-in-time snapshot semantics (data_as_of is the open-position clock -- the latest /positions snapshot, else the last completed sync; the snapshot advances only open positions, so resolved counts and win rate can include settled markets recorded after the last full sync; native realized P&L follows its accounting snapshot -- not a live feed; re-fetch for fresher data). */
4298
4852
  freshness_note: string;
4299
4853
  };
4854
+ /** Results by the entry price the wallet paid for the side it held, over its settled sports and esports positions with a held entry price. coverage counts the settled positions the buckets leave out, and why. */
4855
+ export type TraderEntryPriceAnalysis = {
4856
+ /** One bucket per price band that has a market, in bucket_order. */
4857
+ buckets: TraderEntryPriceBucket[];
4858
+ /** The bucket with the highest win rate among buckets of at least 3 markets. null when no bucket has 3. */
4859
+ best_bucket: string | null;
4860
+ /** The bucket with the lowest win rate among buckets of at least 3 markets. null when no bucket has 3. */
4861
+ worst_bucket: string | null;
4862
+ /** What the buckets cover (since 2026-11-03, #32671). */
4863
+ coverage: TraderEntryPriceCoverage;
4864
+ };
4865
+ /** One entry-price band. Each measure is an analytic value: read state before value. */
4866
+ export type TraderEntryPriceBucket = {
4867
+ /** The band: $0.00-$0.19 (any price below $0.20, sub-cent fills included), $0.20-$0.39, $0.40-$0.59, $0.60-$0.79 or $0.80-$0.99. Until 2026-11-03 the first band was $0.01-$0.19 and sub-cent fills had no bucket (#32671). */
4868
+ bucket: string;
4869
+ /** Display position, 0 first, from the lowest price up. */
4870
+ bucket_order: number;
4871
+ /** Markets in the band. */
4872
+ markets: AnalyticInteger;
4873
+ /** Of those, the markets that made money. */
4874
+ wins: AnalyticInteger;
4875
+ /** wins over decided markets (a nonzero P&L), as a percentage 0-100. */
4876
+ win_rate: AnalyticNumber;
4877
+ /** Realized P&L of the band's markets, USD. */
4878
+ total_pnl: AnalyticNumber;
4879
+ /** Mean realized P&L of a market in the band, USD. */
4880
+ avg_pnl: AnalyticNumber;
4881
+ };
4882
+ /** The settled sports and esports positions the entry-price section reads. The buckets' markets plus every unbucketed row's are settled_markets, and their realized P&L sums to settled_pnl. settled_pnl adds up the wallet's per-market realized P&L, so it differs from pnl.in_scope.realized_pnl, which is Polymarket's published sports and esports P&L with a share of the wallet's rebates. */
4883
+ export type TraderEntryPriceCoverage = {
4884
+ /** Settled sports and esports positions: bucketed_markets plus every unbucketed row's markets. */
4885
+ settled_markets: number;
4886
+ /** Realized P&L of those positions, USD. */
4887
+ settled_pnl: number;
4888
+ /** Positions in a bucket: the sum of buckets[].markets. */
4889
+ bucketed_markets: number;
4890
+ /** Realized P&L of the bucketed positions, USD: the sum of buckets[].total_pnl. */
4891
+ bucketed_pnl: number;
4892
+ /** The settled positions the buckets leave out: one row for each reason that has a position, ordered by reason. Empty when the buckets hold every settled position. */
4893
+ unbucketed: TraderEntryPriceUnbucketed[];
4894
+ };
4895
+ /** Settled positions with no entry-price bucket, for one reason. */
4896
+ export type TraderEntryPriceUnbucketed = {
4897
+ /** two_sided: both outcomes bought at a price, a hedged book with no single side. held_side_unpriced: one outcome has a recorded price, but the wallet's remaining shares are on the other. no_entry_price: no outcome has a recorded entry price. freshness_unknown: a bucket whose rows carry no freshness clock yet. */
4898
+ reason: "two_sided" | "held_side_unpriced" | "no_entry_price" | "freshness_unknown";
4899
+ /** Positions left out for this reason. */
4900
+ markets: number;
4901
+ /** Their realized P&L, USD. */
4902
+ total_pnl: number;
4903
+ };
4300
4904
  export type TraderEsportsGameRecord = {
4301
4905
  /** The game, by the same name every holder chip carries in category_win_rate_game: LoL, CS2, Dota 2, Valorant, Call of Duty, Honor of Kings, Mobile Legends: Bang Bang, Overwatch, Rainbow Six Siege, Rocket League or StarCraft II. Match a chip to this row by string equality. */
4302
4906
  game: string;
@@ -4470,6 +5074,36 @@ export type TraderGradeAt = {
4470
5074
  source_observed_by: string | null;
4471
5075
  } | null;
4472
5076
  };
5077
+ /** P&L and win rate by the UTC hour of the wallet's first trade in each settled sports or esports market. */
5078
+ export type TraderHourlyPerformance = {
5079
+ /** One entry per UTC hour that has a settled market; an hour with none is absent. */
5080
+ entries: ({
5081
+ /** UTC hour of the first trade, 0-23. */
5082
+ hour: number;
5083
+ /** Settled markets first traded in this hour. */
5084
+ markets: number;
5085
+ /** Of those, the markets that made money at settlement. */
5086
+ wins: number;
5087
+ /** wins over the decided markets (settled with a nonzero P&L), as a percentage 0-100. 0 when no market of the hour is decided: read it with wins and markets. */
5088
+ win_rate: number;
5089
+ /** Realized P&L of those markets, USD. */
5090
+ total_pnl: number;
5091
+ /** total_pnl over markets, USD. */
5092
+ avg_pnl: number;
5093
+ })[];
5094
+ /** The hour with the highest win_rate. null when no entry exists. */
5095
+ best_hour: number | null;
5096
+ /** best_hour's win_rate, percentage 0-100. null exactly when best_hour is. */
5097
+ best_win_rate: number | null;
5098
+ /** The hour with the lowest win_rate. null when no entry exists. */
5099
+ worst_hour: number | null;
5100
+ /** worst_hour's win_rate, percentage 0-100. null exactly when worst_hour is. */
5101
+ worst_win_rate: number | null;
5102
+ /** best_win_rate minus worst_win_rate, percentage points. null when either is null. */
5103
+ spread_pp: number | null;
5104
+ /** true when at least 12 hours have markets and every one of them has the same P&L sign, so the hour-to-hour spread says little about timing. */
5105
+ is_approximate: boolean;
5106
+ };
4473
5107
  /** A trader's sports and esports daily P&L object. `id`, `freshness_at`, `series_status` and `realized` are always present. The five sections -- `entries`, `stats`, `monthly`, `year_totals`, `drawdown` -- are present unless the request's `sections` parameter excluded them, so a request that sends no `sections` always carries all five. An excluded section is absent from the object, never null and never an empty array. While `series_status` is `pending` the sections are empty and never mean zero. */
4474
5108
  export type TraderPnl = {
4475
5109
  /** Prefixed trader ID (`trd_...`). */
@@ -4623,6 +5257,40 @@ export type TraderPnlInScope = {
4623
5257
  /** When the record behind these figures was computed. */
4624
5258
  as_of: string;
4625
5259
  };
5260
+ /** Edge over the price paid (#32270, #32622): how often the side a wallet bought won, minus the average price it paid, over its settled sports and esports markets of $20 or more at a known entry price. Probabilities throughout: edge 0.012 is 1.2 percentage points. The same figures as LeaderboardPriceEdge, plus the shrunk edge the profile badge and the leaderboard show. No hold: a hold is a fact of a leaderboard row, not of the wallet. */
5261
+ export type TraderPriceEdge = {
5262
+ /** Settled sports and esports markets of $20 or more at a known entry price that the edge is measured over. */
5263
+ markets: number;
5264
+ /** Share of those markets whose bought side won, 0-1. */
5265
+ hit_rate: number;
5266
+ /** Mean entry price paid, 0-1. */
5267
+ avg_price: number;
5268
+ /** hit_rate minus avg_price, full precision, before any shrink. */
5269
+ edge: number;
5270
+ /** Whether the edge ranks. ranked: at least 30 such markets, and the share of the decided ones that made money at settlement within 10 points of the win rate over the same markets. too_few_markets: fewer than 30. sample_mismatch: that share is more than 10 points away, so these markets do not describe the wallet's record. */
5271
+ status: "ranked" | "too_few_markets" | "sample_mismatch";
5272
+ /** The edge the profile badge shows and the leaderboard ranks: edge pulled toward field_average by how short the record is. A short record moves most of the way to the average; a long one keeps nearly all of its own edge. Present only when status is ranked. */
5273
+ shrunk_edge?: number;
5274
+ /** The mean edge of every ranked wallet that traded in the last 180 days, the value shrunk_edge is pulled toward. Present only with shrunk_edge. */
5275
+ field_average?: number;
5276
+ };
5277
+ /** Position sizes over the wallet's sports and esports positions with trades, and how concentrated its volume is across categories. Each measure is an analytic value: read state before value. The four size measures are not_computed while any position's cost is unknown; the counts are always measured. */
5278
+ export type TraderRiskMetrics = {
5279
+ /** Mean cost basis of a position, USD. */
5280
+ avg_position_size: AnalyticNumber;
5281
+ /** Median cost basis of a position, USD. */
5282
+ median_position_size: AnalyticNumber;
5283
+ /** Largest cost basis of a position, USD. */
5284
+ max_position_size: AnalyticNumber;
5285
+ /** Population standard deviation of the cost basis, USD. */
5286
+ position_size_stddev: AnalyticNumber;
5287
+ /** Sports and esports positions with trades. */
5288
+ total_positions: number;
5289
+ /** Positions whose cost is more than twice the mean. */
5290
+ large_position_count: number;
5291
+ /** Herfindahl index of the wallet's volume across sports and esports categories: each category's share of the volume, squared and summed. 1.0 is a single category; lower is more spread. not_computed while any category's cost is unknown, and no value without volume. */
5292
+ concentration: AnalyticNumber;
5293
+ };
4626
5294
  /** Lossless counterparts for trader statistics. The object is present exactly when stats.total_volume is. */
4627
5295
  export type TraderStatsExact = {
4628
5296
  /** stats.total_volume as an exact decimal: the sports and esports USD volume, the sum of every stored trade day's `trader_trade_daily_rollups.in_scope_volume_total` (#29830). Polymarket's full-history wallet-wide user volume before 2026-10-27. */
@@ -4635,6 +5303,30 @@ export type TraderSyncedData = {
4635
5303
  /** Proxy wallet address. */
4636
5304
  wallet: string;
4637
5305
  };
5306
+ /** One band of a time breakdown. */
5307
+ export type TraderTimeBreakdownBand = {
5308
+ /** The band's label. */
5309
+ category_value: string;
5310
+ /** Markets with a realized P&L in the band. */
5311
+ n_markets: number;
5312
+ /** Resolved markets that made money over resolved markets with a nonzero P&L, 0-1. null when none is decided. */
5313
+ win_rate: number | null;
5314
+ /** total_pnl over n_markets, USD. */
5315
+ expectancy: number | null;
5316
+ /** Gross profit over gross loss. null when the band has no loss. */
5317
+ profit_factor: number | null;
5318
+ /** Realized P&L of the band's markets, USD. */
5319
+ total_pnl: number | null;
5320
+ };
5321
+ /** The hold-time and first-trade-hour bands of the profile's Performance breakdown card, over the wallet's sports and esports markets with a realized P&L. */
5322
+ export type TraderTimeBreakdowns = {
5323
+ /** One row per band of time from the wallet's first to its last trade in a market: < 1h, 1h – 1d, 1 – 3d, 3 – 7d, 1 – 4w, > 4w. A band with no market is absent. */
5324
+ by_duration: TraderTimeBreakdownBand[];
5325
+ /** One row per four-hour UTC band of the wallet's first trade in a market: 00-03, 04-07, 08-11, 12-15, 16-19, 20-23. A band with no market is absent. */
5326
+ by_hour_bucket: TraderTimeBreakdownBand[];
5327
+ /** One-line summaries keyed by breakdown (by_duration, by_hour_bucket), from bands of at least 5 markets with a known P&L. A key is present only when there is a summary. */
5328
+ insights: Record<string, string>;
5329
+ };
4638
5330
  /** Field-level trust metadata returned only when GET /api/v1/trader/{address} includes expand=trust. */
4639
5331
  export type TraderTrust = {
4640
5332
  /** Since 2026-10-27 always not_computed: pnl.total is retired and never sent (#29830). The key stays so the object keeps its shape. */
@@ -5254,11 +5946,64 @@ export interface OperationData {
5254
5946
  getMarketTopHolders: MarketTopHolders;
5255
5947
  getMarketWalletsInOut: MarketWalletsInOut;
5256
5948
  getMonthlyReportSnapshot: ReportSnapshot;
5257
- getPickOfTheDay: PickOfTheDay | PickOfTheDayNoEntitledPicks;
5258
- getPickOfTheDayArchive: PickOfTheDayArchive;
5949
+ getPickOfTheDay: PickOfTheDay | PickOfTheDayNoEntitledPicks | {
5950
+ disclaimer?: string;
5951
+ locked_picks?: {
5952
+ pick_rank: number;
5953
+ required_tier: string;
5954
+ }[];
5955
+ pick_count: number;
5956
+ pick_date: string;
5957
+ picks: {
5958
+ backed_price?: number;
5959
+ category?: string;
5960
+ clv_pct?: number;
5961
+ clv_status?: string;
5962
+ display_category?: string;
5963
+ event_slug?: string;
5964
+ game_ended?: boolean;
5965
+ game_started?: boolean;
5966
+ holder_count?: number;
5967
+ is_free_selection: boolean;
5968
+ matchup?: string;
5969
+ outcome?: string;
5970
+ pick_id: string;
5971
+ pick_outcome_label?: string;
5972
+ polymarket_url?: string;
5973
+ publication_order: number;
5974
+ release_at?: string;
5975
+ return_usd?: number;
5976
+ stake_usd?: number;
5977
+ token_id?: string;
5978
+ top_grade?: string;
5979
+ unit_score?: number;
5980
+ }[];
5981
+ proof_pending_picks?: ({
5982
+ is_free_selection: boolean;
5983
+ kickoff?: string;
5984
+ pick_id: string;
5985
+ pick_rank: number;
5986
+ publication_order: number;
5987
+ release_at: string;
5988
+ retry_at: string;
5989
+ supersedes_pick_id: string | null;
5990
+ })[];
5991
+ scheduled_picks?: ({
5992
+ is_free_selection: boolean;
5993
+ kickoff: string;
5994
+ pick_id: string;
5995
+ pick_rank: number;
5996
+ publication_order: number;
5997
+ release_at: string;
5998
+ supersedes_pick_id: string | null;
5999
+ })[];
6000
+ state: string;
6001
+ view: string;
6002
+ };
6003
+ getPickOfTheDayArchive: PickOfTheDayArchive | PickOfTheDayArchiveSummary;
5259
6004
  getPickOfTheDayLedger: PickOfTheDayLedger;
5260
6005
  getPickOfTheDayLedgerEntry: PickOfTheDayLedgerEntry;
5261
- getPickOfTheDayStats: PickOfTheDayStats;
6006
+ getPickOfTheDayStats: PickOfTheDayStats | PickOfTheDayStatsSections;
5262
6007
  getPlatforms: Platforms;
5263
6008
  getPositionTimeline: PositionTimelineEvent[];
5264
6009
  getPositionTimelineById: PositionTimelineEvent[];
@@ -5601,7 +6346,7 @@ export interface OperationQuery {
5601
6346
  createWebhookVerificationAttempt: Record<string, never>;
5602
6347
  deleteWebhook: Record<string, never>;
5603
6348
  exploreMarkets: {
5604
- /** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Facet values are returned as the canonical bucket. Sports and esports only (#27411): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
6349
+ /** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Facet values are returned as the canonical bucket. Sports and esports only (#27411): a category outside them returns 400 bad_request with param category and names the accepted buckets. The word sports, in any casing, matches every sport but Esports, the provider's catch-all Sports category (cycling, lacrosse) included: use esports for Esports alone, or omit category for both (#32657). The Sports facet counts that catch-all category alone. */
5605
6350
  category?: string;
5606
6351
  /** Filter by market status. A market is closed once Polymarket has closed trading or it has resolved, and active otherwise; all returns both. */
5607
6352
  status?: "active" | "closed" | "all";
@@ -5638,7 +6383,7 @@ export interface OperationQuery {
5638
6383
  getEdgeHunter: {
5639
6384
  /** Response mode. board preserves the full quoted board; signals exposes ranked records and category evidence; observations exposes cohort measurements and accountable funnel evidence. Defaults to board. */
5640
6385
  view?: "board" | "signals" | "observations";
5641
- /** Legacy canonical bucket alias, now accepted in every view. Provider aliases canonicalize: NFL reaches Football and EPL reaches Soccer. Use leagues for a league-specific selection. An unmappable non-sport category returns an empty result and echoes category non_sport. Combines with other selection axes using AND. */
6386
+ /** Legacy canonical bucket alias, now accepted in every view. Provider aliases canonicalize: NFL reaches Football and EPL reaches Soccer. Use leagues for a league-specific selection. The word sports, in any casing, reads as kind=sports, every sport but Esports, as category=sports does on every other route (#32720): the response echoes kind sports beside category sports, and with kind=esports it returns 400 with param category. Any other unmappable non-sport category returns an empty result and echoes category non_sport. Combines with other selection axes using AND. */
5642
6387
  category?: string;
5643
6388
  /** Required for view=observations; wider_holder, in_play or emerging_pile. Rejected for board and signals. wider_holder covers pregame markets that view=signals does not list at its widest selection (horizon_hours=48, min_grade=B, no selector), so until kickoff a market is read in one view or the other. A market view=signals lists leaves wider_holder as primary_slate_candidate, and is a wider_holder candidate again in the first refresh after view=signals stops listing it; signals_as_of names the view=signals snapshot each refresh read. Each refresh evaluates at most 8 markets per sport and cohort, wider_holder by soonest kickoff (most graded holders first among equal kickoffs) and in_play by most graded holders, so a market among a sport's 8 soonest stays evaluated until its game starts. wider_holder also evaluates up to 8 more markets per sport that kick off within 24 hours, most graded holders first, so the most-held markets appear up to a day before kickoff. Each of these keeps its place in later refreshes until its game starts while its holder page still shows a card or could not be read, so a more-held market waits for a free place instead of displacing it. Each row's admitted_by names its place, most_held or soonest_kickoff. The rest count in coverage.capacity_limited_markets. Emerging pile is a wider-holder projection with sharp_pct in [0.75,0.85), complete holder scans and future kickoff, not an independent population or arrival history. */
5644
6389
  cohort?: "wider_holder" | "in_play" | "emerging_pile";
@@ -5744,11 +6489,29 @@ export interface OperationQuery {
5744
6489
  getPickOfTheDay: {
5745
6490
  /** A product day (America/New_York) in YYYY-MM-DD format, on or before today. Omit it, or send today, for the current read. A past day with no published pick returns 404 not_found with error.param=date; a date after today, or a value that is not a date, returns 400 bad_request with error.param=date. */
5746
6491
  date?: string;
6492
+ /** full (default) is the whole recorded set: every pick with its holders, lead backer, sports context, thesis and entry_authorization, and the top-level copy of the first pick. summary returns pick_date, pick_count, the disclaimer once, and each entitled pick's identity, side, price, result, return and grade (pick_id, publication_order, is_free_selection, matchup, category, display_category, event_slug, polymarket_url, token_id, pick_outcome_label, outcome, backed_price, stake_usd, return_usd, unit_score, top_grade, holder_count, clv_status, clv_pct, release_at, game_started, game_ended), with the same scheduled_picks, proof_pending_picks and locked_picks. The locked-only state=none body is the same in both views. Any other value returns 400 bad_request with error.param=view. */
6493
+ view?: "full" | "summary";
6494
+ /** One entitled published pick of the day, by its stable decimal-string pick_id. The body carries that pick once, as picks[0], beside state, pick_date and pick_count=1. It leaves out the top-level copy of the first pick that a set read without pick_id repeats, and scheduled_picks, proof_pending_picks and locked_picks. Pair it with date for a past day's pick. A pick_id that is not among the day's entitled published picks returns 404 not_found with error.param=pick_id; one whose holder proof is not readable yet returns 503 read_model_warming with Retry-After; a value that is not a positive canonical decimal returns 400 bad_request with error.param=pick_id. */
6495
+ pick_id?: string;
6496
+ };
6497
+ getPickOfTheDayArchive: {
6498
+ /** full (default) is every row with every field, plus days and hit_rate with its per-pick series. summary returns view, hit_rate without series, one page of short rows (pick_id, pick_date, publication_order, is_free_selection, matchup, display_category, pick_outcome_label, outcome, top_grade, backed_price, unit_score, clv_pct, backed_side_locked, required_tier) and page; it always pages, 50 rows unless limit says otherwise. Any other value returns 400 bad_request with error.param=view. */
6499
+ view?: "full" | "summary";
6500
+ /** Rows per page of picks, 1 to 200, default 50. An integer outside that range is clamped into it, like every list limit, and X-Effective-Query reports the limit applied; a value that is not an integer returns 400 invalid_query. On view=full, sending limit or cursor pages picks and adds page, while days and hit_rate still describe the whole record; with neither, the response is the whole record. */
6501
+ limit?: number;
6502
+ /** The page.next_cursor of the previous page: the rows after it, newest first. A cursor is a position in the record, so a pick published while you page does not shift later pages. A value this route did not return returns 400 bad_request with error.param=cursor. */
6503
+ cursor?: string;
5747
6504
  };
5748
- getPickOfTheDayArchive: Record<string, never>;
5749
6505
  getPickOfTheDayLedger: Record<string, never>;
5750
6506
  getPickOfTheDayLedgerEntry: Record<string, never>;
5751
- getPickOfTheDayStats: Record<string, never>;
6507
+ getPickOfTheDayStats: {
6508
+ /** full (default) is every section. summary returns view, sections and every section except the five that grow with the record: series, days, categories, months and voids. In summary and sections bodies hit_rate carries no series; series is its own top-level section. Ignored when sections is sent. Any other value returns 400 bad_request with error.param=view. */
6509
+ view?: "full" | "summary";
6510
+ /** Exactly the sections to return, in the body's order whatever the request order. Repeatable and comma-separated: hit_rate, series, market_expectations, outcome_stats, days, categories, sports, tiers, months, price_bands, market_types, total_sides, streaks, records, voids. The body names them in sections and carries view=sections. An unrecognized name returns 400 bad_request with error.param=sections rather than being ignored. */
6511
+ sections?: ("hit_rate" | "series" | "market_expectations" | "outcome_stats" | "days" | "categories" | "sports" | "tiers" | "months" | "price_bands" | "market_types" | "total_sides" | "streaks" | "records" | "voids")[];
6512
+ /** Backward-compatible bracket alias for sections, for clients that emit array keys. Repeatable and comma-separated, with the same names. */
6513
+ "sections[]"?: ("hit_rate" | "series" | "market_expectations" | "outcome_stats" | "days" | "categories" | "sports" | "tiers" | "months" | "price_bands" | "market_types" | "total_sides" | "streaks" | "records" | "voids")[];
6514
+ };
5752
6515
  getPlatforms: Record<string, never>;
5753
6516
  getPositionTimeline: {
5754
6517
  /** Market condition_id. One timeline per (trader, market). */
@@ -5804,15 +6567,15 @@ export interface OperationQuery {
5804
6567
  };
5805
6568
  getSuspiciousTrade: Record<string, never>;
5806
6569
  getTrader: {
5807
- /** Backward-compatible alias for expand. Repeatable: strategy, categories, trust. quant_metrics is accepted and returns nothing since 2026-10-27. */
5808
- "expand[]"?: ("strategy" | "categories" | "quant_metrics" | "trust")[];
5809
- /** Include heavy fields and trust metadata. Repeatable: strategy, categories, trust. quant_metrics is accepted and returns nothing since 2026-10-27. */
5810
- expand?: ("strategy" | "categories" | "quant_metrics" | "trust")[];
6570
+ /** Backward-compatible alias for expand. Repeatable: strategy, categories, trust, breakdowns. quant_metrics is accepted and returns nothing since 2026-10-27. */
6571
+ "expand[]"?: ("strategy" | "categories" | "quant_metrics" | "trust" | "breakdowns")[];
6572
+ /** Include heavy fields and trust metadata. Repeatable: strategy, categories, trust, breakdowns. breakdowns adds the profile's strategy measures (Trader.breakdowns), computed on the read, and is served on this route only. quant_metrics is accepted and returns nothing since 2026-10-27. */
6573
+ expand?: ("strategy" | "categories" | "quant_metrics" | "trust" | "breakdowns")[];
5811
6574
  /** Opt into a whole-response freshness ceiling in seconds. The server returns 200 only when data_quality.status is fresh or stale and data_quality.as_of is no older than this value; otherwise it returns 409 with error.reason=freshness_ceiling_unsatisfied. No refresh or alternate read is attempted. */
5812
6575
  max_age_s?: number;
5813
6576
  };
5814
6577
  getTraderCategoryRecords: {
5815
- /** Filter to one canonical category, matched through the same rollup every other category surface uses: soccer, EPL and champions league all reach Soccer, every esports label folds into Esports, and football is AMERICAN football and reaches Football. A filter that reaches Esports returns the Esports record with all of its games; a game is not a filter of its own, so ask for esports and read games. A sports or esports category the wallet has no record in answers 200 with an empty records array, never 404. Sports and esports only (#27311): a category outside them, or a value that reaches no category, returns 400 bad_request with param category and names the accepted buckets. */
6578
+ /** Filter to one canonical category, matched through the same rollup every other category surface uses: soccer, EPL and champions league all reach Soccer, every esports label folds into Esports, and football is AMERICAN football and reaches Football. A filter that reaches Esports returns the Esports record with all of its games; a game is not a filter of its own, so ask for esports and read games. A sports or esports category the wallet has no record in answers 200 with an empty records array, never 404. Sports and esports only (#27311): a category outside them, or a value that reaches no category, returns 400 bad_request with param category and names the accepted buckets. The word sports, in any casing, matches every sport but Esports, the provider's catch-all Sports category (cycling, lacrosse) included: use esports for Esports alone, or omit category for both (#32657). */
5816
6579
  category?: string;
5817
6580
  };
5818
6581
  getTraderContext: Record<string, never>;
@@ -5933,7 +6696,7 @@ export interface OperationQuery {
5933
6696
  cursor?: string;
5934
6697
  /** Minimum position value in USD. Raises the feed's own floor of 50,000 USD; a smaller value does not lower it. */
5935
6698
  min_size?: number;
5936
- /** One RFC 4180 CSV record of exact current provider-backed market_canonical.category values. Legacy unquoted lists such as NBA,WNBA remain valid; values containing commas, quotes, or newlines are CSV-quoted. Matching is case-insensitive. Malformed quoted input fails closed as one unknown exact category. A value outside sports and esports returns 400 bad_request with param=category (#27305), as on GET /api/v1/markets/explore. */
6699
+ /** One RFC 4180 CSV record of exact current provider-backed market_canonical.category values. Legacy unquoted lists such as NBA,WNBA remain valid; values containing commas, quotes, or newlines are CSV-quoted. Matching is case-insensitive. Malformed quoted input fails closed as one unknown exact category. A value outside sports and esports returns 400 bad_request with param=category (#27305), as on GET /api/v1/markets/explore. The word sports, in any casing, names every sport and returns 400 bad_request with param category, because this filter takes one category: omit category for every sports and esports market, or name one sport (#32657). */
5937
6700
  category?: string;
5938
6701
  /** Minimum trader grade. Matched against the trader.grade each row returns, the wallet's current grade, so every row listed shows a grade at or above this floor. */
5939
6702
  min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
@@ -5967,7 +6730,7 @@ export interface OperationQuery {
5967
6730
  condition_id?: string;
5968
6731
  /** Trader wallet address, timestamp-suffixed wallet alias, username, or trd_-prefixed trader ID, resolved against the traders table. Unknown traders return an empty list. */
5969
6732
  trader?: string;
5970
- /** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27430): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
6733
+ /** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27430): a category outside them returns 400 bad_request with param category and names the accepted buckets. The word sports, in any casing, matches every sport but Esports, the provider's catch-all Sports category (cycling, lacrosse) included: use esports for Esports alone, or omit category for both (#32657). */
5971
6734
  category?: string;
5972
6735
  /** Minimum trader grade as of today (trader.grade), not at trade time. On a historical window it selects wallets by a grade they may have earned after the trade; for a point-in-time rule filter on trader.grade_at_trade instead. A means S or A, B means S, A or B. */
5973
6736
  min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
@@ -5993,7 +6756,7 @@ export interface OperationQuery {
5993
6756
  cursor?: string;
5994
6757
  /** Minimum trade size in USD. */
5995
6758
  min_size?: number;
5996
- /** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27430): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
6759
+ /** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27430): a category outside them returns 400 bad_request with param category and names the accepted buckets. The word sports, in any casing, matches every sport but Esports, the provider's catch-all Sports category (cycling, lacrosse) included: use esports for Esports alone, or omit category for both (#32657). */
5997
6760
  category?: string;
5998
6761
  /** Minimum trader grade. */
5999
6762
  min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
@@ -6015,7 +6778,7 @@ export interface OperationQuery {
6015
6778
  limit?: number;
6016
6779
  /** Opaque lbv1_ pagination cursor from a prior response. It binds the finite score/address boundary to the committed leaderboard generation and the effective category/strategy filters, and on a sorted page to its sort, dir and activity. A cursor from another sort or dir is a 400 bad_request on cursor; one from another activity, category, strategy or generation is cursor_expired. Legacy, malformed, non-finite, and unsupported-version cursors are rejected. */
6017
6780
  cursor?: string;
6018
- /** Filter by category: a sport or esports bucket. Values are matched to canonical category buckets: league values fold into their sport (NBA and NCAAB into Basketball, NFL into Football). Mapped buckets are case-insensitive; passthrough buckets (Cricket, Sports) match case-sensitively against the provider-native bucket key, so use exact casing. Sports and esports only (#27306): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
6781
+ /** Filter by category: a sport or esports bucket, matched case-insensitively. League values fold into their sport (NBA and NCAAB into Basketball, NFL into Football). Sports and esports only (#27306): a category outside them returns 400 bad_request with param category and names the accepted buckets. The word sports, in any casing, matches every sport but Esports, the provider's catch-all Sports category (cycling, lacrosse) included: use esports for Esports alone, or omit category for both (#32657). */
6019
6782
  category?: string;
6020
6783
  /** Filter by observed trading style. Current styles: two_sided, category_focused, high_activity, diversified, mixed, unclassified. Current styles count the wallet's sports and esports markets only. The ten archetype keys retired on 2026-10-01 (accumulator, algo_trader, arbitrageur, directional, event_driven, market_maker, momentum, scalper, speculator, swing_trader) are still accepted and match no wallet. Style describes recorded behavior; grade measures performance. */
6021
6784
  strategy?: "category_focused" | "diversified" | "high_activity" | "mixed" | "two_sided" | "unclassified";
@@ -6036,7 +6799,7 @@ export interface OperationQuery {
6036
6799
  consistency?: "live" | "snapshot";
6037
6800
  /** Minimum current position value in USD. Defaults to 100 when omitted, or to 0 when wallet is present; send 0 to include every reconciled position. */
6038
6801
  min_size?: number;
6039
- /** Exact match against provider-backed market_canonical.category. Sports and esports only (#27311): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
6802
+ /** Exact match against provider-backed market_canonical.category. Sports and esports only (#27311): a category outside them returns 400 bad_request with param category and names the accepted buckets. The word sports, in any casing, names every sport and returns 400 bad_request with param category, because this filter takes one category: omit category for every sports and esports market, or name one sport (#32657). */
6040
6803
  category?: string;
6041
6804
  /** Scope to one market. Accepts the raw provider condition_id or the mkt_-prefixed market id emitted by V1 responses. Combine with min_size=0 for every reconciled position in that market; an unknown id or a resolved market returns []. A market outside sports and esports returns 404 not_found with error.reason=market_out_of_scope (#27311). Without condition_id the board and wallet reads list sports and esports markets only. */
6042
6805
  condition_id?: string;
@@ -6056,7 +6819,7 @@ export interface OperationQuery {
6056
6819
  limit?: number;
6057
6820
  /** Opaque cursor from previous response's next_cursor. Encodes the first-page as_of timestamp, normalized effective filters, ranking and aggregate collection revisions, plus the last row's absolute net flow and condition_id. A changed filter or collection returns cursor_expired; request the first page again. */
6058
6821
  cursor?: string;
6059
- /** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27306): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
6822
+ /** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27306): a category outside them returns 400 bad_request with param category and names the accepted buckets. The word sports, in any casing, matches every sport but Esports, the provider's catch-all Sports category (cycling, lacrosse) included: use esports for Esports alone, or omit category for both (#32657). */
6060
6823
  category?: string;
6061
6824
  /** Filter by source platform. all is a request-side no-op. */
6062
6825
  platform?: "polymarket" | "all";
@@ -6076,7 +6839,7 @@ export interface OperationQuery {
6076
6839
  limit?: number;
6077
6840
  /** Opaque cursor from previous response's next_cursor. Encodes the first-page as_of timestamp, normalized effective filters, ranking and aggregate collection revisions, plus the last row's absolute net flow and condition_id. A changed filter or collection returns cursor_expired; request the first page again. */
6078
6841
  cursor?: string;
6079
- /** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27306): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
6842
+ /** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27306): a category outside them returns 400 bad_request with param category and names the accepted buckets. The word sports, in any casing, matches every sport but Esports, the provider's catch-all Sports category (cycling, lacrosse) included: use esports for Esports alone, or omit category for both (#32657). */
6080
6843
  category?: string;
6081
6844
  /** Filter by source platform. all is a request-side no-op. */
6082
6845
  platform?: "polymarket" | "all";
@@ -6144,7 +6907,7 @@ export interface OperationQuery {
6144
6907
  condition_id?: string;
6145
6908
  /** Trader wallet address, timestamp-suffixed wallet alias, or username resolved against the traders table. Unknown traders return an empty list. */
6146
6909
  trader?: string;
6147
- /** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27430): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
6910
+ /** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27430): a category outside them returns 400 bad_request with param category and names the accepted buckets. The word sports, in any casing, matches every sport but Esports, the provider's catch-all Sports category (cycling, lacrosse) included: use esports for Esports alone, or omit category for both (#32657). */
6148
6911
  category?: string;
6149
6912
  /** Minimum trader grade. */
6150
6913
  min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
@@ -6170,7 +6933,7 @@ export interface OperationQuery {
6170
6933
  cursor?: string;
6171
6934
  /** Minimum trade size in USD. */
6172
6935
  min_size?: number;
6173
- /** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27430): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
6936
+ /** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27430): a category outside them returns 400 bad_request with param category and names the accepted buckets. The word sports, in any casing, matches every sport but Esports, the provider's catch-all Sports category (cycling, lacrosse) included: use esports for Esports alone, or omit category for both (#32657). */
6174
6937
  category?: string;
6175
6938
  /** Minimum trader grade as of today (trader.grade). A means S or A, B means S, A or B. */
6176
6939
  min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
@@ -6207,7 +6970,7 @@ export interface OperationQuery {
6207
6970
  cursor?: string;
6208
6971
  /** Filter by market status. A market is closed once Polymarket has closed trading or it has resolved, and active otherwise; all returns both. */
6209
6972
  status?: "active" | "closed" | "all";
6210
- /** Filter by category. Sports and esports only (#27411): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
6973
+ /** Filter by category. Sports and esports only (#27411): a category outside them returns 400 bad_request with param category and names the accepted buckets. The word sports, in any casing, names every sport and returns 400 bad_request with param category, because this filter takes one category: omit category for every sports and esports market, or name one sport (#32657). */
6211
6974
  category?: string;
6212
6975
  };
6213
6976
  submitTraderExport: {
@@ -6500,7 +7263,7 @@ export interface OperationBody {
6500
7263
  batchGetTraders: {
6501
7264
  /** Trader identities to resolve in input order. */
6502
7265
  traders: string[];
6503
- /** Shared expand flags applied to every trader item. */
7266
+ /** Shared expand flags applied to every trader item. breakdowns is refused with 400 (param expand): it computes on the read per wallet, so GET /api/v1/trader/{address} serves it one wallet at a time. */
6504
7267
  expand?: ("strategy" | "categories" | "quant_metrics" | "trust")[];
6505
7268
  };
6506
7269
  cancelTraderExport: never;
@@ -7026,6 +7789,7 @@ export interface OperationResponse {
7026
7789
  /** Total matching rows when the read model exposes a count; the key is absent when it does not. */
7027
7790
  total?: number;
7028
7791
  meta: ResponseMeta;
7792
+ summary?: LeaderboardSummary;
7029
7793
  };
7030
7794
  listLeaderboardLeagues: {
7031
7795
  object: "leaderboard_leagues";