madeonsol-x402 2.8.0 → 3.1.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/types.d.ts CHANGED
@@ -19,11 +19,65 @@ export interface KolTrade {
19
19
  tier: string;
20
20
  bonding_rate: number | null;
21
21
  };
22
+ /** Same as deployer.tier; present only when the deployer is known. */
23
+ deployer_tier?: string;
22
24
  traded_at: string;
25
+ /** Manual strategy tag, falling back to the auto tag. */
26
+ kol_strategy_tag?: string | null;
27
+ kol_auto_strategy_tag?: string | null;
28
+ kol_winrate_7d?: number | null;
29
+ kol_winrate_30d?: number | null;
30
+ kol_early_entry_pct_30d?: number | null;
31
+ kol_is_heating_up?: boolean;
32
+ kol_percentile_pnl_7d?: number | null;
33
+ kol_percentile_winrate_7d?: number | null;
34
+ token_image_url?: string | null;
35
+ /** Launchpad of origin; null for non-launchpad mints. */
36
+ launchpad?: "pumpfun" | "launchlab" | "bags" | null;
37
+ /** Token age in minutes (now − first seen); null when unknown. */
38
+ token_age_minutes?: number | null;
39
+ /** include=token only — the /token/{mint} snapshot (null past the 20-mint cap). */
40
+ token?: TokenSnapshot | null;
41
+ }
42
+ /** Free (BASIC) tier delay metadata — present only on delayed responses. */
43
+ export interface FreeTierDelayMeta {
44
+ /** e.g. "5m" */
45
+ delay?: string;
46
+ delay_seconds?: number;
47
+ /** The delayed cutoff the page was served at. */
48
+ as_of?: string;
49
+ delay_note?: string;
50
+ /** Pricing URL. */
51
+ upgrade?: string;
52
+ }
53
+ /** WebSocket channel that pushes the same rows. */
54
+ export interface StreamPointer {
55
+ channel: string;
56
+ url: string;
57
+ docs: string;
23
58
  }
24
- export interface KolFeedResponse {
59
+ export interface KolFeedResponse extends FreeTierDelayMeta {
25
60
  trades: KolTrade[];
26
61
  count: number;
62
+ /** Seconds since the newest returned row's traded_at; null on an empty page. */
63
+ data_age_seconds?: number | null;
64
+ /** Poll cursor — pass as `since` to fetch only newer rows. */
65
+ next_since?: string | null;
66
+ /** Echo of the `since` parameter. */
67
+ since?: string | null;
68
+ stream?: StreamPointer;
69
+ /** Present only when include= was honoured. */
70
+ included?: Array<"token">;
71
+ /** Present only when include=token hit the 20-distinct-mint cap. */
72
+ include_truncated?: {
73
+ token: string[];
74
+ note: string;
75
+ };
76
+ /** Present only when an unknown include= value was sent. */
77
+ include_errors?: Record<string, {
78
+ status: number;
79
+ error: string;
80
+ }>;
27
81
  /** LEGACY strict timestamp cursor (skips same-timestamp siblings) — prefer next_cursor. */
28
82
  next_before?: string | null;
29
83
  /** Pass as `cursor` for the next (older) page; null at the end. */
@@ -41,6 +95,10 @@ export interface KolFeedResponse {
41
95
  export type KolStrategy = "scalper" | "day_trader" | "swing_trader" | "hodler" | "mixed";
42
96
  export interface KolFeedParams {
43
97
  limit?: number;
98
+ /** Poll cursor — only trades strictly newer than this ISO time (feed back next_since). */
99
+ since?: string;
100
+ /** REST only: "token" embeds the /token/{mint} snapshot on each row (≤20 distinct mints per page). The x402 route rejects it before payment (400 param_not_supported_on_x402). */
101
+ include?: "token";
44
102
  /** LEGACY cursor — ISO 8601 timestamp; returns trades strictly older than this (skips same-timestamp rows). Prefer `cursor`. */
45
103
  before?: string;
46
104
  /** PREFERRED pagination: `next_cursor` from the previous page — opaque strict keyset (no skipped/repeated rows at shared timestamps). Cannot be combined with `before`. */
@@ -71,7 +129,19 @@ export interface KolCoordinationKol {
71
129
  /** v1.1 — true when sell_sol > buy_sol (net-flow-negative). */
72
130
  exited?: boolean;
73
131
  }
74
- export interface KolCoordinationToken {
132
+ /** Market-cap / volume deltas from mc-tracker history. The whole set is ABSENT (not null) when the token has no history yet. Window keys: 5m, 15m, 1h, 2h, 4h (sparse). */
133
+ export interface McDeltaFields {
134
+ /** % change of market cap over each window (12.4 = +12.4 %). */
135
+ mc_change_pct?: Record<string, number | null>;
136
+ /** Organic (non-MEV) USD volume over each window. */
137
+ volume_usd?: Record<string, number>;
138
+ /** Share of volume attributed to MEV over each window. */
139
+ mev_volume_pct?: Record<string, number | null>;
140
+ /** Seconds of mc-tracker history behind the deltas. */
141
+ history_age_seconds?: number;
142
+ }
143
+ /** The REST route (/api/v1) carries every field; the x402 route returns the base cluster (token, counts, flow, signal, kols name + wallet). */
144
+ export interface KolCoordinationToken extends McDeltaFields {
75
145
  token_mint: string;
76
146
  token_symbol: string;
77
147
  token_name: string;
@@ -81,6 +151,17 @@ export interface KolCoordinationToken {
81
151
  net_sol_flow: number;
82
152
  signal: "accumulating" | "distributing";
83
153
  kols: KolCoordinationKol[];
154
+ /** Mean 7d winrate across the cluster's KOLs. */
155
+ avg_winrate_7d?: number | null;
156
+ /** Avg early-entry percentile (lower = earlier). */
157
+ entry_rank_avg?: number | null;
158
+ /** Count of distinct strategy tags across the KOLs. */
159
+ unique_strategies?: number;
160
+ strategies?: string[];
161
+ first_buy_at?: string | null;
162
+ last_buy_at?: string | null;
163
+ /** Seconds between first and last KOL buy (full-period span). */
164
+ time_to_consensus_sec?: number | null;
84
165
  /** v1.1 — peak density window (busiest N-min slice). */
85
166
  peak_window_start?: string;
86
167
  peak_window_end?: string;
@@ -121,10 +202,12 @@ export interface KolCoordinationParams {
121
202
  limit?: number;
122
203
  /** PRO+: require cluster average winrate_7d >= N (0-100) */
123
204
  min_avg_winrate?: number;
124
- /** PRO+: require cluster to span >= N distinct strategies */
125
- unique_strategies?: number;
205
+ /** PRO+: require the cluster's KOLs to span distinct strategies. The route accepts true|false (a number is a 400). */
206
+ unique_strategies?: boolean;
126
207
  /** v1.1 — include major memecoins (WIF/BONK/POPCAT). Default false. */
127
208
  include_majors?: boolean;
209
+ /** REST only: "risk" embeds /tokens/{mint}/risk per cluster (at most 20 distinct mints). The x402 route rejects it before payment (400 param_not_supported_on_x402). */
210
+ include?: "risk";
128
211
  /** v1.1 — peak-density window in minutes (1-60). Default 15. */
129
212
  window_minutes?: number;
130
213
  /** v1.1 — minimum composite coordination score (0-100). */
@@ -268,6 +351,24 @@ export interface FirstTouchesResponse {
268
351
  scan_budget: number;
269
352
  };
270
353
  data_age_seconds: number | null;
354
+ /** Poll cursor — pass back as `since` for only-newer rows. */
355
+ next_since?: string | null;
356
+ /** Echo of the `since` parameter. */
357
+ since?: string | null;
358
+ /** WebSocket channel (kol:first_touches) that pushes the same rows. */
359
+ stream?: StreamPointer;
360
+ /** Present only when include= was honoured. */
361
+ included?: Array<"wallet">;
362
+ /** Present only when include=wallet hit its distinct-wallet cap. */
363
+ include_truncated?: {
364
+ wallet: string[];
365
+ note: string;
366
+ };
367
+ /** Present only when an include failed or was unknown. */
368
+ include_errors?: Record<string, {
369
+ status: number;
370
+ error: string;
371
+ }>;
271
372
  }
272
373
  export interface FirstTouchSubscriptionFilters {
273
374
  kol?: string;
@@ -316,12 +417,19 @@ export interface FirstTouchSubscriptionCreateResponse {
316
417
  webhook_secret: string | null;
317
418
  note?: string;
318
419
  }
420
+ /**
421
+ * One leaderboard row. The x402 route (MadeOnSolX402.kolLeaderboard) and the REST route
422
+ * (MadeOnSolREST.kolLeaderboard) share the canonical v1 names since 3.0.0; the score fields
423
+ * below are REST-only. (The x402 route still sends deprecated wallet_address / pnl_sol /
424
+ * total_buy_sol / total_sell_sol aliases until 2026-11-03; they are not typed.)
425
+ */
319
426
  export interface KolLeaderboardEntry {
320
- wallet_address: string;
427
+ wallet: string;
321
428
  name: string;
322
- pnl_sol: number;
323
- total_buy_sol: number;
324
- total_sell_sol: number;
429
+ /** Realized (cost-basis) PnL in SOL, 6 decimals. */
430
+ pnl: number;
431
+ /** Buy + sell volume in SOL, 6 decimals. */
432
+ volume: number;
325
433
  buy_count: number;
326
434
  sell_count: number;
327
435
  win_rate: number | null;
@@ -347,12 +455,19 @@ export interface KolLeaderboardResponse {
347
455
  universe?: LeaderboardUniverse;
348
456
  entry_mc_window_start?: string | null;
349
457
  entry_mc_complete?: boolean;
458
+ /** REST route only. `total` = KOLs left in the ranked universe after filters. */
459
+ pagination?: OffsetPagination & {
460
+ total: number;
461
+ };
350
462
  }
351
- export type KolLeaderboardSort = "pnl" | "winrate" | "profit_factor" | "roi" | "early_entry";
463
+ /** The REST route's sort enum. (Earlier types listed "roi" / "early_entry", which the route rejects with a 400.) */
464
+ export type KolLeaderboardSort = "pnl" | "winrate" | "volume" | "avg_roi" | "profit_factor" | "early_entry_pct" | "consistency";
352
465
  export interface KolLeaderboardParams {
353
466
  /** Time window. 90d/180d fill up over time as kol_trades retention (180 days) accumulates. */
354
467
  period?: "today" | "7d" | "30d" | "90d" | "180d";
355
468
  limit?: number;
469
+ /** REST only (0-10000). The x402 route rejects it before payment (400 param_not_supported_on_x402). */
470
+ offset?: number;
356
471
  /** PRO+: sort axis (default "pnl") */
357
472
  sort?: KolLeaderboardSort;
358
473
  /** PRO+: filter by auto-tagged strategy */
@@ -371,22 +486,30 @@ export interface DeployerAlert {
371
486
  priority: string;
372
487
  created_at: string;
373
488
  market_cap_at_alert: number | null;
489
+ /** v1.16 — deployer wallet SOL balance at the moment the alert fired. Null for historical rows. (An alert field; earlier types put it under `deployers`, where the route never sent it.) */
490
+ deployer_sol_balance?: number | null;
491
+ /** Launchpad of origin (e.g. pumpfun, launchlab, bags); null when unknown. */
492
+ launchpad?: string | null;
374
493
  deployers: {
375
494
  wallet_address: string;
376
495
  tier: string;
377
496
  total_tokens_deployed: number;
378
497
  total_bonded: number;
498
+ /** Tokens that bonded almost immediately after deploy. */
499
+ instant_bonds?: number;
379
500
  bonding_rate: number;
380
501
  recent_outcomes: unknown;
381
502
  recent_bond_rate: number;
503
+ /** Peak market cap (USD) of the deployer's best token. */
504
+ best_token_peak_mc?: number | null;
382
505
  /** v1.11.1 — fraction of the deployer's labeled tokens that ran (peak ≥60min after deploy) vs dumped. */
383
506
  runner_rate?: number | null;
507
+ /** Count of the deployer's labeled tokens that ran. */
508
+ runner_tokens?: number | null;
384
509
  /** v1.11.1 — count of labeled tokens behind runner_rate; confidence denominator, gate on ≥3. */
385
510
  labeled_tokens?: number | null;
386
511
  /** v1.11.1 — average minutes from deploy to bond across the deployer's bonded tokens. */
387
512
  avg_time_to_bond_minutes?: number | null;
388
- /** v1.16 — deployer wallet SOL balance at the moment the alert fired. Null for historical rows. */
389
- deployer_sol_balance?: number | null;
390
513
  };
391
514
  kol_buys: {
392
515
  count: number;
@@ -394,7 +517,9 @@ export interface DeployerAlert {
394
517
  kols: string[];
395
518
  } | null;
396
519
  }
397
- export interface DeployerAlertsResponse {
520
+ export interface DeployerAlertsResponse extends FreeTierDelayMeta {
521
+ /** Launch-pipeline scope disclosure (absent ≠ clean). */
522
+ coverage?: LaunchCoverage;
398
523
  alerts: DeployerAlert[];
399
524
  limit: number;
400
525
  offset: number;
@@ -413,8 +538,12 @@ export interface DeployerAlertsResponse {
413
538
  scan_truncated: boolean;
414
539
  scan_budget: number;
415
540
  };
541
+ /** Seconds since the newest returned alert's created_at; null on an empty page. */
542
+ data_age_seconds?: number | null;
416
543
  }
417
544
  export interface DeployerAlertsParams {
545
+ /** Only alerts for this token mint. */
546
+ token_mint?: string;
418
547
  since?: string;
419
548
  /** Opaque strict (created_at, id) cursor — `next_cursor` from the previous page. Preferred. Not combinable with before/offset. */
420
549
  cursor?: string;
@@ -431,13 +560,45 @@ export interface DeployerAlertsParams {
431
560
  /** Only alerts where at least N KOLs bought the token. */
432
561
  min_kol_buys?: number;
433
562
  }
434
- export type WebhookEvent = "kol:trade" | "kol:coordination" | "deployer:alert" | "deployer:bond";
563
+ /** v2.10: every event the registry accepts (src/lib/webhook-events.ts VALID_EVENTS); earlier types listed only the first four. */
564
+ export type WebhookEvent = "kol:trade" | "kol:coordination" | "deployer:alert" | "deployer:bond" | "wallet_tracker:event" | "sniper:deploy" | "rhc:kol_trade" | "token:surge" | "token:revival";
435
565
  export interface WebhookFilters {
436
566
  min_sol?: number;
437
567
  action?: "buy" | "sell";
438
568
  kol_name?: string;
439
569
  deployer_tier?: string[];
440
570
  min_kols?: number;
571
+ /** token:surge / token:revival only. */
572
+ kinds?: Array<"surge" | "revival">;
573
+ tiers?: Array<"early" | "strong" | "breakout">;
574
+ launchpads?: string[];
575
+ exclude_flags?: string[];
576
+ min_mc_usd?: number;
577
+ max_mc_usd?: number;
578
+ /** ULTRA/BUSINESS custom conditions (max 10). */
579
+ conditions?: WebhookCondition[];
580
+ }
581
+ export interface WebhookCondition {
582
+ field: string;
583
+ op: "eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "in" | "contains";
584
+ value: string | number | boolean | Array<string | number>;
585
+ }
586
+ /** `GET /webhooks` rows also carry the last-24 h delivery summary. */
587
+ export interface WebhookDeliverySummary {
588
+ total_24h: number;
589
+ success_24h: number;
590
+ failed_24h: number;
591
+ /** Percent, 100 when nothing was delivered. */
592
+ success_rate: number;
593
+ }
594
+ /** `PATCH /webhooks/{id}` returns the updated row (no created_at / delivery counters). */
595
+ export interface UpdatedWebhook {
596
+ id: number;
597
+ url: string;
598
+ events: WebhookEvent[];
599
+ filters: WebhookFilters;
600
+ is_active: boolean;
601
+ updated_at: string;
441
602
  }
442
603
  export interface Webhook {
443
604
  id: number;
@@ -500,6 +661,33 @@ export interface StreamToken {
500
661
  ws_url: string;
501
662
  /** DEX trade stream URL — only present for Ultra tier subscribers */
502
663
  dex_ws_url?: string;
664
+ /** Human-readable connect instructions. */
665
+ usage?: string;
666
+ subscribe_example?: {
667
+ type: "subscribe";
668
+ channels: string[];
669
+ };
670
+ /** The full registry of subscribable channel names. */
671
+ channels?: string[];
672
+ /** token:prices requires filters.mints (1..mint_cap). */
673
+ token_prices?: {
674
+ subscribe_example: Record<string, unknown>;
675
+ mint_cap: number | null;
676
+ note: string;
677
+ };
678
+ /** rhc:token_prices requires filters.addresses (1..address_cap, per connection across named subscriptions). */
679
+ rhc_token_prices?: {
680
+ subscribe_example: Record<string, unknown>;
681
+ address_cap: number | null;
682
+ coalesce_ms: number;
683
+ note: string;
684
+ };
685
+ /** Named subscriptions: several channel + filter sets on one socket. */
686
+ named_subscriptions?: {
687
+ subscribe_example: Record<string, unknown>;
688
+ max_per_connection: number | null;
689
+ note: string;
690
+ };
503
691
  }
504
692
  /** One live WebSocket session holding a connection slot. Returned by
505
693
  * GET /stream/sessions; its `id` can be passed to DELETE /stream/sessions/{id}
@@ -540,11 +728,15 @@ export interface KolPairsResponse {
540
728
  pairs: KolPair[];
541
729
  period: string;
542
730
  min_shared: number;
731
+ /** REST route only. */
732
+ pagination?: OffsetPagination;
543
733
  }
544
734
  export interface KolPairsParams {
545
735
  period?: "7d" | "30d";
546
736
  min_shared?: number;
547
737
  limit?: number;
738
+ /** REST only (0-10000). The x402 route rejects it before payment (400 param_not_supported_on_x402). */
739
+ offset?: number;
548
740
  }
549
741
  export interface KolTimingData {
550
742
  tokens_traded: number;
@@ -581,25 +773,52 @@ export interface HotToken {
581
773
  total_buy_sol: number;
582
774
  total_sell_sol: number;
583
775
  net_flow: number;
776
+ first_kol_buy_at?: string | null;
584
777
  first_kol_buy_age_minutes: number | null;
778
+ /** Last KOL buy in the period (REST). */
779
+ last_kol_buy_at?: string | null;
780
+ /** Seconds between first and last KOL buy (REST). */
781
+ time_to_consensus_sec?: number | null;
782
+ /** Mean 7d winrate of the buying KOLs (REST). */
783
+ avg_winrate_7d?: number | null;
784
+ /** Avg early-entry percentile of the buying KOLs (REST). */
785
+ entry_rank_avg?: number | null;
786
+ /** Count of distinct strategy tags among the buyers (REST). */
787
+ unique_strategies?: number;
788
+ strategies?: string[];
585
789
  kols?: {
586
790
  name: string;
587
791
  wallet?: string;
588
792
  }[];
589
793
  }
794
+ /** Offset page descriptor used by the ranked KOL / token lists. */
795
+ export interface OffsetPagination {
796
+ limit: number;
797
+ offset: number;
798
+ returned: number;
799
+ has_more: boolean;
800
+ }
590
801
  export interface KolHotTokensResponse {
591
802
  hot_tokens: HotToken[];
592
803
  period: string;
593
804
  min_kols: number;
805
+ /** REST only. */
806
+ pagination?: OffsetPagination;
807
+ /** Echo of min_avg_winrate, present only when it was set. */
808
+ min_avg_winrate?: number;
809
+ /** Echo (always true) of unique_strategies, present only when it was set. Distinct from the per-row integer. */
810
+ unique_strategies?: boolean;
594
811
  }
595
812
  export interface KolHotTokensParams {
596
813
  period?: "1h" | "6h";
597
814
  min_kols?: number;
598
815
  limit?: number;
816
+ /** REST only (0-10000): skip this many ranked tokens. The x402 route rejects it before payment (400 param_not_supported_on_x402). */
817
+ offset?: number;
599
818
  /** PRO+: require average winrate_7d of buying KOLs >= N (0-100) */
600
819
  min_avg_winrate?: number;
601
- /** PRO+: require >= N distinct strategies among buyers */
602
- unique_strategies?: number;
820
+ /** PRO+: require the buyers to span distinct strategies. The route accepts true|false (a number is a 400). */
821
+ unique_strategies?: boolean;
603
822
  }
604
823
  export interface TrajectoryData {
605
824
  current_streak: {
@@ -628,6 +847,13 @@ export interface TrajectoryData {
628
847
  total_tokens_analyzed: number;
629
848
  }
630
849
  export interface DeployerTrajectoryResponse {
850
+ /** Launch-pipeline scope disclosure (absent ≠ clean). */
851
+ coverage?: LaunchCoverage;
852
+ /** Present (false) only when the wallet is not a tracked deployer; `deployer` and `trajectory` are then null. */
853
+ is_deployer?: false;
854
+ /** Echo of the requested wallet — only on the is_deployer:false body. */
855
+ wallet?: string;
856
+ /** (The route never sent runner_rate / labeled_tokens / avg_time_to_bond_minutes here; use the deployer profile.) */
631
857
  deployer: {
632
858
  wallet_address: string;
633
859
  total_tokens_deployed: number;
@@ -635,14 +861,20 @@ export interface DeployerTrajectoryResponse {
635
861
  bonding_rate: number;
636
862
  recent_bond_rate: number;
637
863
  tier: string;
638
- /** v1.11.1 — fraction of the deployer's labeled tokens that ran (peak ≥60min after deploy) vs dumped. */
639
- runner_rate?: number | null;
640
- /** v1.11.1 — count of labeled tokens behind runner_rate; confidence denominator, gate on ≥3. */
641
- labeled_tokens?: number | null;
642
- /** v1.11.1 — average minutes from deploy to bond across the deployer's bonded tokens. */
643
- avg_time_to_bond_minutes?: number | null;
644
- };
645
- trajectory: TrajectoryData;
864
+ } | null;
865
+ trajectory: TrajectoryData | null;
866
+ /** Only with include=daily_snapshots: up to 90 daily rows, newest first. */
867
+ daily_snapshots?: DeployerTrajectorySnapshot[];
868
+ }
869
+ export interface DeployerTrajectorySnapshot {
870
+ snapshot_date: string;
871
+ tier: string | null;
872
+ total_tokens_deployed: number | null;
873
+ total_bonded: number | null;
874
+ bonding_rate: number | null;
875
+ recent_bond_rate: number | null;
876
+ avg_peak_mc: number | null;
877
+ best_token_peak_mc: number | null;
646
878
  }
647
879
  export interface DiscoveryEndpoint {
648
880
  path: string;
@@ -666,24 +898,35 @@ export interface DiscoveryResponse {
666
898
  }
667
899
  export interface KolEntryOrderEntry {
668
900
  rank: number;
669
- wallet_address: string;
901
+ /** The KOL wallet address (the route never sent `wallet_address`). */
902
+ wallet: string;
670
903
  kol_name: string | null;
671
- sol_amount: number;
672
- token_amount: number;
673
- traded_at: string;
904
+ kol_twitter: string | null;
905
+ sol_amount: number | null;
906
+ token_amount: number | null;
907
+ /** This KOL's first buy of the token (the route never sent `traded_at`). */
908
+ first_buy_at: string;
674
909
  seconds_after_first: number;
675
910
  tx_signature: string;
676
911
  strategy_tag?: KolStrategy | null;
912
+ auto_strategy_tag?: string | null;
677
913
  winrate_7d?: number | null;
678
914
  winrate_30d?: number | null;
679
915
  early_entry_pct_30d?: number | null;
680
916
  percentile_pnl_7d?: number | null;
917
+ percentile_winrate_7d?: number | null;
681
918
  }
682
- export interface KolEntryOrderResponse {
919
+ export interface KolEntryOrderResponse extends FreeTierDelayMeta {
683
920
  token_mint: string;
921
+ token_name: string | null;
922
+ token_symbol: string | null;
923
+ /** First KOL buy of the token. */
924
+ first_buy_at: string;
925
+ /** First buy of the LAST KOL to enter, over all KOL buyers (not just this page). */
926
+ last_buy_at: string;
927
+ /** Seconds between first_buy_at and last_buy_at. */
928
+ span_sec: number;
684
929
  entries: KolEntryOrderEntry[];
685
- /** @deprecated the route never returned `count` — use `returned` (entries.length) / `total_kol_buyers`. */
686
- count?: number;
687
930
  /** v1.24 — total_kol_buyers counts ALL first buyers (was capped by a 2,000-row read). */
688
931
  total_kol_buyers?: number;
689
932
  returned?: number;
@@ -700,31 +943,42 @@ export interface KolEntryOrderParams {
700
943
  /** Cap number of ranked entries (default 50) */
701
944
  limit?: number;
702
945
  }
946
+ /** One requested wallet. `found: false` (not an active KOL) carries only `wallet` + `found`. */
703
947
  export interface KolCompareProfile {
704
- wallet_address: string;
705
- name: string | null;
706
- twitter: string | null;
948
+ wallet: string;
949
+ found: boolean;
950
+ name?: string;
951
+ twitter_url?: string | null;
707
952
  strategy_tag?: KolStrategy | null;
953
+ auto_strategy_tag?: string | null;
708
954
  winrate_7d?: number | null;
709
955
  winrate_30d?: number | null;
710
- roi_30d?: number | null;
956
+ avg_roi_7d?: number | null;
957
+ avg_roi_30d?: number | null;
958
+ profit_factor_7d?: number | null;
711
959
  profit_factor_30d?: number | null;
712
- early_entry_pct_30d?: number | null;
713
- consistency_30d?: number | null;
714
960
  pnl_7d?: number | null;
715
961
  pnl_30d?: number | null;
962
+ early_entry_pct_30d?: number | null;
963
+ consistency_7d?: number | null;
964
+ median_hold_minutes_30d?: number | null;
965
+ closed_positions_7d?: number;
966
+ closed_positions_30d?: number;
967
+ is_heating_up?: boolean;
968
+ is_cold?: boolean;
716
969
  percentile_pnl_7d?: number | null;
970
+ percentile_winrate_7d?: number | null;
717
971
  percentile_pnl_30d?: number | null;
718
- is_cold?: boolean | null;
719
- is_heating_up?: boolean | null;
972
+ percentile_winrate_30d?: number | null;
973
+ percentile_early_entry_30d?: number | null;
720
974
  }
721
975
  export interface KolCompareOverlapToken {
722
976
  token_mint: string;
723
977
  token_symbol: string | null;
724
978
  token_name: string | null;
725
979
  wallets: string[];
726
- first_buy_at: string;
727
- last_buy_at: string;
980
+ /** Buys by the provided wallets on this token in the 30 d window. */
981
+ buy_count: number;
728
982
  }
729
983
  export interface KolCompareResponse {
730
984
  profiles: KolCompareProfile[];
@@ -738,39 +992,72 @@ export interface KolCompareResponse {
738
992
  has_more: boolean | null;
739
993
  complete: boolean;
740
994
  };
741
- count: number;
742
995
  }
743
996
  export interface KolCompareParams {
744
997
  /** 2-5 wallet addresses. BASIC=2, PRO=4, ULTRA=5. */
745
998
  wallets: string[];
746
999
  }
747
1000
  export type KolAlertType = "consensus_cluster" | "fresh_token_kol_buy" | "heating_up";
748
- export type KolAlertWindow = "5m" | "15m" | "1h" | "6h" | "24h";
1001
+ /** The route accepts 1h | 6h | 24h only (anything else is a 400). */
1002
+ export type KolAlertWindow = "1h" | "6h" | "24h";
749
1003
  export type KolAlertSeverity = "low" | "medium" | "high";
1004
+ /** One alert. The field set depends on `type` (each field's comment names the types that carry it). */
750
1005
  export interface KolAlert {
751
1006
  type: KolAlertType;
752
1007
  severity: KolAlertSeverity;
753
- detected_at: string;
754
- token_mint?: string | null;
1008
+ /** null for heating_up. */
1009
+ detected_at: string | null;
1010
+ /** consensus_cluster, fresh_token_kol_buy only. */
1011
+ token_mint?: string;
755
1012
  token_symbol?: string | null;
756
1013
  token_name?: string | null;
757
- wallet_address?: string | null;
1014
+ /** consensus_cluster only. */
1015
+ kol_count?: number;
1016
+ net_sol_flow?: number;
1017
+ signal?: "accumulating" | "distributing";
1018
+ time_to_consensus_sec?: number | null;
1019
+ first_buy_at?: string | null;
1020
+ market_cap_usd_at_first_buy?: number | null;
1021
+ /** consensus_cluster only — current MC. */
1022
+ market_cap_usd?: number | null;
1023
+ last_price_usd?: number | null;
1024
+ kols?: Array<{
1025
+ name: string;
1026
+ wallet: string;
1027
+ }>;
1028
+ /** fresh_token_kol_buy only. */
1029
+ token_age_minutes?: number;
1030
+ /** fresh_token_kol_buy, heating_up. */
758
1031
  kol_name?: string | null;
759
- details: Record<string, unknown>;
1032
+ /** fresh_token_kol_buy, heating_up — the KOL wallet address. */
1033
+ wallet?: string;
1034
+ /** fresh_token_kol_buy only. */
1035
+ kol_winrate_7d?: number | null;
1036
+ kol_percentile_pnl_7d?: number | null;
1037
+ sol_amount?: number;
1038
+ market_cap_usd_at_trade?: number | null;
1039
+ price_usd_at_trade?: number | null;
1040
+ /** heating_up only. */
1041
+ kol_twitter?: string | null;
1042
+ strategy_tag?: string | null;
1043
+ winrate_7d?: number | null;
1044
+ pnl_7d?: number | null;
1045
+ closed_positions_7d?: number;
1046
+ percentile_pnl_7d?: number | null;
760
1047
  }
761
1048
  export interface KolAlertsResponse {
762
1049
  alerts: KolAlert[];
763
1050
  count: number;
764
1051
  window: KolAlertWindow;
1052
+ /** The alert types that were evaluated. */
1053
+ types?: KolAlertType[];
765
1054
  }
766
1055
  export interface KolAlertsParams {
767
- /** Lookback window (default "15m") */
1056
+ /** Lookback window (default "6h") */
768
1057
  window?: KolAlertWindow;
769
1058
  /** Filter to specific alert types (default all) */
770
1059
  types?: KolAlertType[];
771
- /** Minimum severity to include */
772
- min_severity?: KolAlertSeverity;
773
- /** Cap number of alerts (default 50) */
1060
+ /** Cap number of alerts (1-100, default 30) */
774
1061
  limit?: number;
775
1062
  }
776
1063
  export type AlphaPeriod = "7d" | "30d" | "all";
@@ -780,6 +1067,10 @@ export interface AlphaLeaderboardParams {
780
1067
  min_tokens?: number;
781
1068
  sort?: AlphaSort;
782
1069
  exclude_bots?: "true" | "false";
1070
+ /** 1-100, default 100 (the per-tier page cap applies). */
1071
+ limit?: number;
1072
+ /** 0-10000. */
1073
+ offset?: number;
783
1074
  }
784
1075
  /** Field shape varies by tier — BASIC is the smallest subset, ULTRA the richest. */
785
1076
  export interface AlphaLeaderboardEntry {
@@ -807,6 +1098,8 @@ export interface AlphaLeaderboardEntry {
807
1098
  avg_entry_mc_usd?: number | null;
808
1099
  }
809
1100
  export interface AlphaLeaderboardResponse {
1101
+ /** Launch-pipeline scope disclosure (absent ≠ clean). */
1102
+ coverage?: LaunchCoverage;
810
1103
  leaderboard: AlphaLeaderboardEntry[];
811
1104
  total: number;
812
1105
  entry_mc_window_start?: string | null;
@@ -815,6 +1108,8 @@ export interface AlphaLeaderboardResponse {
815
1108
  sort: AlphaSort;
816
1109
  min_tokens: number;
817
1110
  exclude_bots: boolean;
1111
+ /** has_more = the page came back full (returned === limit). */
1112
+ pagination?: OffsetPagination;
818
1113
  }
819
1114
  export interface AlphaWalletSummary {
820
1115
  wallet: string;
@@ -849,6 +1144,8 @@ export interface AlphaWalletToken {
849
1144
  result: "win" | "loss" | "open";
850
1145
  }
851
1146
  export interface AlphaWalletResponse {
1147
+ /** Launch-pipeline scope disclosure (absent ≠ clean). */
1148
+ coverage?: LaunchCoverage;
852
1149
  summary: AlphaWalletSummary;
853
1150
  tokens: AlphaWalletToken[];
854
1151
  }
@@ -860,6 +1157,8 @@ export interface AlphaLinkedWallet {
860
1157
  similarity_score: number;
861
1158
  }
862
1159
  export interface AlphaLinkedResponse {
1160
+ /** Launch-pipeline scope disclosure (absent ≠ clean). */
1161
+ coverage?: LaunchCoverage;
863
1162
  wallet: string;
864
1163
  linked: AlphaLinkedWallet[];
865
1164
  }
@@ -873,6 +1172,14 @@ export interface CapTableBuyer {
873
1172
  wallet: string;
874
1173
  first_buy_sol: number;
875
1174
  first_buy_at: string;
1175
+ /** Realized PnL on this token from confirmed swaps; null when unknown. */
1176
+ realized_pnl_sol?: number | null;
1177
+ total_sol_bought?: number | null;
1178
+ total_sol_sold?: number | null;
1179
+ /** First confirmed sell; null = no sell seen. */
1180
+ first_sell_at?: string | null;
1181
+ /** first_sell_at == null (swap-ledger scoped: a plain transfer out still reads as holding). */
1182
+ still_holding?: boolean;
876
1183
  is_bundle: boolean;
877
1184
  is_kol: boolean;
878
1185
  kol_name: string | null;
@@ -888,6 +1195,12 @@ export interface CapTableSummary {
888
1195
  buyer_quality_score: number;
889
1196
  confidence: BuyerQualityConfidence;
890
1197
  signal: BuyerQualitySignal;
1198
+ /** REST route — confirmed-swap exit status of the full early-buyer cohort. */
1199
+ cohort_size?: number;
1200
+ still_holding?: number;
1201
+ sold?: number;
1202
+ /** 0-100, one decimal. */
1203
+ still_holding_pct?: number;
891
1204
  }
892
1205
  /** Trade-coverage honesty block (v1.23.4). The trade tape starts 2026-04-12
893
1206
  * (`history_start`, unix sec) and is launchpad-pipeline scoped (`scope`).
@@ -909,6 +1222,18 @@ export interface TradeCoverage {
909
1222
  eligibility_basis?: string | null;
910
1223
  /** v1.24 — always "not_verified": rows existing never proves a complete interval. */
911
1224
  completeness?: "not_verified";
1225
+ /** v2.10 — persistence size floor of the trade tape (server 2026-09-30). */
1226
+ size_floor?: TradeSizeFloor;
1227
+ }
1228
+ /**
1229
+ * v2.10 — the stored trade tape drops buys under `min_sol` SOL (under
1230
+ * `min_stable_usd` when paid in USDC/USDT); sells that RECEIVE SOL are kept at
1231
+ * any size. Live streams, prices, market caps and candles are not subject to it.
1232
+ */
1233
+ export interface TradeSizeFloor {
1234
+ min_sol: number;
1235
+ min_stable_usd: number;
1236
+ applies_to: string;
912
1237
  }
913
1238
  /** v1.24 — treat unknown future values as "unknown". */
914
1239
  export type TradeEligibility = "eligible" | "lapsed" | "excluded" | "unknown" | "admitted_previously" | "not_applicable";
@@ -925,6 +1250,23 @@ export interface TokenBuyerQualityResponse {
925
1250
  confidence: BuyerQualityConfidence;
926
1251
  signal: BuyerQualitySignal;
927
1252
  cached_at: string;
1253
+ /** Present only when breakdown.dump_cluster_count ≥ 1 and the daily signal-performance snapshot has a bucket for it (REST route). */
1254
+ signal_stats?: {
1255
+ dump_cluster_count: {
1256
+ value: number;
1257
+ /** "k>=1" | "k>=3" | "k>=5" */
1258
+ bucket: string;
1259
+ /** "dump" | "runner" */
1260
+ outcome: string;
1261
+ hit_rate: number;
1262
+ base_rate: number;
1263
+ lift: number;
1264
+ sample_n: number;
1265
+ window_days: number;
1266
+ as_of: string;
1267
+ summary: string;
1268
+ };
1269
+ };
928
1270
  /** Returned on all tiers. */
929
1271
  breakdown?: {
930
1272
  alpha_wallet_count: number;
@@ -1105,10 +1447,21 @@ export interface TokenBatchRiskError {
1105
1447
  /** One entry in the `tokens` array of POST /tokens/batch/risk — either a full
1106
1448
  * risk result (same shape as GET /tokens/{mint}/risk) or a per-mint error. */
1107
1449
  export type TokenBatchRiskResult = TokenRiskResponse | TokenBatchRiskError;
1450
+ /** GET /tokens/{mint}/risk (single mint). `resolved_from` is present when the caller passed a POOL address and the answer is for its token mint; batch entries never carry it. */
1451
+ export interface TokenRiskSingleResponse extends TokenRiskResponse {
1452
+ resolved_from?: {
1453
+ address: string;
1454
+ kind: "pool";
1455
+ dex: string;
1456
+ source: string;
1457
+ };
1458
+ }
1108
1459
  /** Response of POST /tokens/batch/risk — bulk risk scoring for 1–50 mints.
1109
1460
  * `tokens` preserves de-duplicated input order; `count` = number of unique
1110
1461
  * mints. Counts as 1 request against quota. */
1111
1462
  export interface TokenBatchRiskResponse {
1463
+ /** Launch-pipeline scope disclosure (absent ≠ clean). */
1464
+ coverage?: LaunchCoverage;
1112
1465
  tokens: TokenBatchRiskResult[];
1113
1466
  count: number;
1114
1467
  }
@@ -1160,6 +1513,15 @@ export interface CandlesResponse {
1160
1513
  /** True when ULTRA net-flow/liquidity fields are populated on each candle. */
1161
1514
  net_flow_included: boolean;
1162
1515
  candles: Candle[];
1516
+ /** true = the page budget ran out before `limit` candles or `from` was reached; covered_from is then the oldest instant actually searched. */
1517
+ truncated?: boolean;
1518
+ covered_from?: string;
1519
+ /** Oldest instant the caller's plan may read (PRO: 30 days); null = no plan floor. */
1520
+ history_floor?: string | null;
1521
+ /** true = `from` was moved forward to history_floor. */
1522
+ history_clamped?: boolean;
1523
+ /** true = the whole requested window is older than the plan floor (200 with no candles). */
1524
+ history_outside_plan?: boolean;
1163
1525
  }
1164
1526
  export type TokenFlowWindow = "1h" | "24h";
1165
1527
  export interface TokenFlowParams {
@@ -1173,6 +1535,8 @@ export interface TokenFlowParams {
1173
1535
  * leaving the pool). PRO/ULTRA only. KEYED (v1) — no x402 route.
1174
1536
  */
1175
1537
  export interface TokenFlowResponse {
1538
+ /** Trade-data coverage disclosure. */
1539
+ coverage?: TradeCoverage;
1176
1540
  mint: string;
1177
1541
  window: TokenFlowWindow;
1178
1542
  /** ISO 8601 lower bound of the window. */
@@ -1351,7 +1715,8 @@ export interface CopyTradeUpdateResponse {
1351
1715
  /** Explains the one-time `webhook_secret` when it is present. */
1352
1716
  note?: string;
1353
1717
  }
1354
- export interface CopyTradeSignal {
1718
+ /** REST rows also carry the McDeltaFields set when mc-tracker has history for the mint (absent otherwise). */
1719
+ export interface CopyTradeSignal extends McDeltaFields {
1355
1720
  id: number;
1356
1721
  subscription_id: number;
1357
1722
  fired_at: string;
@@ -1390,19 +1755,23 @@ export interface WalletTrackerEntry {
1390
1755
  label: string | null;
1391
1756
  added_at: string;
1392
1757
  }
1758
+ /**
1759
+ * v2.10 FIX: the route returns `wallets` + `count` (earlier type versions said
1760
+ * `watchlist`, which was always undefined at runtime).
1761
+ */
1393
1762
  export interface WalletTrackerListResponse {
1394
- watchlist: WalletTrackerEntry[];
1763
+ wallets: WalletTrackerEntry[];
1764
+ count: number;
1395
1765
  remaining: number;
1396
1766
  limit: number;
1397
1767
  }
1768
+ /** v2.10 FIX: `{ wallet }` (HTTP 201); earlier types said `added` / `watchlist` / `remaining`. */
1398
1769
  export interface WalletTrackerAddResponse {
1399
- added: boolean;
1400
- watchlist: WalletTrackerEntry;
1401
- remaining: number;
1770
+ wallet: WalletTrackerEntry;
1402
1771
  }
1772
+ /** v2.10 FIX: `{ wallet }`; earlier types said `updated` / `watchlist`. */
1403
1773
  export interface WalletTrackerUpdateResponse {
1404
- updated: boolean;
1405
- watchlist: WalletTrackerEntry;
1774
+ wallet: WalletTrackerEntry;
1406
1775
  }
1407
1776
  /**
1408
1777
  * The `action` filter and field. Swaps only: a swap is `buy` or `sell`.
@@ -1476,19 +1845,26 @@ export interface WalletTrackerSummaryParams {
1476
1845
  period?: "24h" | "7d" | "30d";
1477
1846
  wallet?: string;
1478
1847
  }
1848
+ /** One tracked wallet. (Earlier types declared a flat wallet / buy_count / sell_count / last_activity_at row the route never sent.) */
1479
1849
  export interface WalletTrackerSummaryStats {
1480
- wallet: string;
1850
+ wallet_address: string;
1481
1851
  label: string | null;
1482
- swap_count: number;
1483
- buy_count: number;
1484
- sell_count: number;
1485
- sol_bought: number;
1486
- sol_sold: number;
1487
- last_activity_at: string | null;
1852
+ added_at: string;
1853
+ stats: {
1854
+ swap_count: number;
1855
+ transfer_count: number;
1856
+ buys: number;
1857
+ sells: number;
1858
+ sol_bought: number;
1859
+ sol_sold: number;
1860
+ last_event_at: string | null;
1861
+ };
1488
1862
  }
1489
1863
  export interface WalletTrackerSummaryResponse {
1490
1864
  period: "24h" | "7d" | "30d";
1491
1865
  wallets: WalletTrackerSummaryStats[];
1866
+ /** Postgres interval for the period (e.g. "7 days"); absent when the tracker is empty. */
1867
+ interval?: string;
1492
1868
  }
1493
1869
  export interface WalletStandoutTrade {
1494
1870
  token_mint: string;
@@ -1601,7 +1977,24 @@ export interface ScoutLeaderboardParams {
1601
1977
  scout_tier?: ScoutTier;
1602
1978
  sort?: ScoutLeaderboardSort;
1603
1979
  }
1980
+ /**
1981
+ * GET /tokens/{mint}/kol-consensus. v2.10 FIX: the figures are nested under
1982
+ * `consensus` (that is what the route has always returned); earlier type
1983
+ * versions declared them at the top level, where they were always undefined.
1984
+ * With no KOL trades: `consensus: null`, `total_kol_buyers: 0`,
1985
+ * `total_kol_sellers: 0`, `complete: true`.
1986
+ */
1604
1987
  export interface KolConsensusResponse {
1988
+ mint: string;
1989
+ current_mc_usd?: number | null;
1990
+ current_price_usd?: number | null;
1991
+ consensus: KolConsensus | null;
1992
+ /** Only on the no-trades answer (then 0). */
1993
+ total_kol_buyers?: number;
1994
+ total_kol_sellers?: number;
1995
+ complete?: boolean;
1996
+ }
1997
+ export interface KolConsensus {
1605
1998
  total_kol_buyers: number;
1606
1999
  total_kol_sellers: number;
1607
2000
  /** Share of KOL buyers with ≥1 recorded sell (any size) — NOT a full position exit. */
@@ -1620,10 +2013,29 @@ export interface KolConsensusResponse {
1620
2013
  first_touch_wallet: string | null;
1621
2014
  first_touch_at: string | null;
1622
2015
  median_entry_mc_usd: number | null;
2016
+ /** Definition string for kol_exit_rate. */
2017
+ kol_exit_rate_definition?: string;
2018
+ total_trades?: number;
2019
+ /** ULTRA+ only. */
1623
2020
  buyers?: string[];
1624
2021
  exited?: string[];
1625
2022
  }
2023
+ /**
2024
+ * GET /tokens/{mint}/peak-history. v2.10 FIX: the figures are nested under
2025
+ * `peak_history` (null with `found: false` for an unknown mint); earlier type
2026
+ * versions declared them at the top level, where they were always undefined.
2027
+ */
1626
2028
  export interface PeakHistoryResponse {
2029
+ mint: string;
2030
+ found: boolean;
2031
+ token?: {
2032
+ name: string | null;
2033
+ symbol: string | null;
2034
+ image_url: string | null;
2035
+ };
2036
+ peak_history: PeakHistory | null;
2037
+ }
2038
+ export interface PeakHistory {
1627
2039
  peak_mc_usd: number | null;
1628
2040
  peak_mc_updated_at: string | null;
1629
2041
  current_mc_usd: number | null;
@@ -1638,6 +2050,7 @@ export interface PeakHistoryResponse {
1638
2050
  time_to_bond_minutes: number | null;
1639
2051
  deployed_at: string | null;
1640
2052
  bonded_at: string | null;
2053
+ mc_tracking_complete?: boolean | null;
1641
2054
  }
1642
2055
  export interface CoordinationHistoryParams {
1643
2056
  limit?: number;
@@ -1654,19 +2067,60 @@ export interface TokenSnapshot {
1654
2067
  mint?: string;
1655
2068
  symbol?: string | null;
1656
2069
  name?: string | null;
2070
+ /** Off-chain metadata from the token URI JSON; null until resolved. Deployer-controlled URL, passed through. */
2071
+ image_url?: string | null;
2072
+ socials?: {
2073
+ website: string | null;
2074
+ twitter: string | null;
2075
+ telegram: string | null;
2076
+ discord: string | null;
2077
+ };
2078
+ /** How many OTHER mints reuse this X handle / exact URL. null = unknown, not zero. */
2079
+ twitter_reuse?: {
2080
+ handle: string | null;
2081
+ mints_same_handle: number;
2082
+ mints_same_url: number;
2083
+ } | null;
2084
+ description?: string | null;
1657
2085
  price_usd: number | null;
1658
2086
  price_sol: number | null;
1659
- vwap_usd?: number | null;
2087
+ vwap_price_usd?: number | null;
2088
+ vwap_price_sol?: number | null;
1660
2089
  market_cap: number | null;
1661
2090
  fdv_usd: number | null;
1662
2091
  liquidity_usd: number | null;
1663
2092
  liquidity_to_mc_ratio: number | null;
1664
2093
  primary_dex: string | null;
2094
+ /** Launchpad of origin; null when unknown. */
2095
+ launchpad?: "pumpfun" | "launchlab" | "bags" | null;
1665
2096
  primary_pool_address: string | null;
1666
2097
  is_token_2022: boolean | null;
1667
2098
  transfer_fee_bps: number | null;
1668
- /** @deprecated never returned at this level — the route nests it as kol_activity.top_buyers. Kept optional for source compatibility. */
1669
- top_buyers?: TokenSnapshotTopBuyer[];
2099
+ mint_authority_revoked?: boolean | null;
2100
+ freeze_authority_revoked?: boolean | null;
2101
+ volume_24h_usd?: number | null;
2102
+ volume_24h_sol?: number | null;
2103
+ trades_24h?: number | null;
2104
+ first_seen_at?: string | null;
2105
+ age_seconds?: number | null;
2106
+ blacklist_category?: string | null;
2107
+ /** Total SOL the first-20 buyers deployed on their first buy. */
2108
+ launch_cohort_sol?: number | null;
2109
+ /** First-20 buyer cohort exit status from confirmed swaps; null when the cohort is unknown. */
2110
+ early_buyer_exit?: {
2111
+ cohort: number;
2112
+ still_holding: number;
2113
+ sold: number;
2114
+ still_holding_pct: number;
2115
+ } | null;
2116
+ /** Present only when history exists. Keys: 5m, 15m, 1h, 2h, 4h. */
2117
+ mc_change_pct?: Record<string, number | null> | null;
2118
+ /** Present only when history exists. Keys: 5m, 15m, 1h, 2h, 4h. */
2119
+ volume_usd?: Record<string, number> | null;
2120
+ /** Present only when history exists. Keys: 5m, 15m, 1h, 2h, 4h. */
2121
+ mev_volume_pct?: Record<string, number | null> | null;
2122
+ /** Present only when history exists. */
2123
+ history_age_seconds?: number | null;
1670
2124
  /** v1.24 — DEPRECATED meaning: a token-SUPPLY burn (mint supply decreased), never LP evidence. null = unknown (no mc-tracker observation). */
1671
2125
  burn_detected?: boolean | null;
1672
2126
  /** v1.24 — creator + reputation; resolved for unbonded launches too. null ⇒ read deployer_identity. */
@@ -1744,6 +2198,18 @@ export interface TokenSnapshotResponse {
1744
2198
  token: TokenSnapshot;
1745
2199
  /** v1.24 — response assembly time; NOT the observation time of any field. */
1746
2200
  as_of?: string;
2201
+ /** Present when include=buyer_quality — the /tokens/{mint}/buyer-quality body. */
2202
+ buyer_quality?: Record<string, unknown>;
2203
+ /** Present when include=deployer — the /deployer-hunter/{wallet} body. */
2204
+ deployer_profile?: Record<string, unknown>;
2205
+ /** Per-key errors for requested includes that failed (never fails the request). */
2206
+ include_errors?: Record<string, {
2207
+ status: number;
2208
+ error?: string;
2209
+ [k: string]: unknown;
2210
+ }> | null;
2211
+ /** Includes that were requested. */
2212
+ included?: string[] | null;
1747
2213
  }
1748
2214
  /** Valid signal names accepted by GET /signals/{name}/performance. */
1749
2215
  export type SignalName = "dump_cluster_count" | "runner_rate" | "recycled_early_buyer_count" | "coordination_count";
@@ -1754,28 +2220,36 @@ export interface SignalPerformanceBucket {
1754
2220
  base_rate: number | null;
1755
2221
  lift: number | null;
1756
2222
  sample_n: number | null;
1757
- window_days: number | null;
1758
- test_from: string | null;
1759
- test_to: string | null;
1760
2223
  }
1761
- /** One per-day reliability point, returned in `series` when history=true. */
1762
- export interface SignalPerformanceSeriesPoint {
1763
- date: string;
1764
- hit_rate: number | null;
1765
- base_rate: number | null;
1766
- lift: number | null;
1767
- sample_n: number | null;
2224
+ /** One past snapshot, returned in `history` when called with history=true (newest first, ≤ 90). */
2225
+ export interface SignalPerformanceHistoryPoint {
2226
+ /** computed_at of that snapshot. */
2227
+ as_of: string;
2228
+ buckets: {
2229
+ bucket: string;
2230
+ hit_rate: number | null;
2231
+ lift: number | null;
2232
+ sample_n: number | null;
2233
+ }[];
1768
2234
  }
1769
- /** Response of GET /signals/{name}/performance — the Signal Scorecard. */
2235
+ /** Response of GET /signals/{name}/performance — the Signal Scorecard.
2236
+ * Before the first computation the body is only `{ signal, buckets: [], note }`. */
1770
2237
  export interface SignalPerformanceResponse {
1771
2238
  signal: string;
1772
- metric_type: string;
1773
- outcome: string;
1774
- methodology: string;
1775
- as_of: string;
2239
+ metric_type?: string;
2240
+ outcome?: string;
2241
+ methodology?: string;
2242
+ as_of?: string;
2243
+ /** Evaluation window of the latest snapshot (the route never sent these per bucket). */
2244
+ window_days?: number | null;
2245
+ base_rate?: number | null;
2246
+ test_from?: string | null;
2247
+ test_to?: string | null;
1776
2248
  buckets: SignalPerformanceBucket[];
1777
- /** Per-day reliability series — only present when called with `history: true`. */
1778
- series?: SignalPerformanceSeriesPoint[];
2249
+ /** Per-snapshot history — only present when called with `history: true`. (Earlier types called it `series`; the route never sent that.) */
2250
+ history?: SignalPerformanceHistoryPoint[];
2251
+ /** Present only when no performance data has been computed yet. */
2252
+ note?: string;
1779
2253
  }
1780
2254
  /** One entry in the signals catalog returned by GET /signals. */
1781
2255
  export interface SignalsCatalogEntry {
@@ -1800,7 +2274,7 @@ export interface TokenResponseBody {
1800
2274
  launch_cohort_size?: number | null;
1801
2275
  [key: string]: unknown;
1802
2276
  }
1803
- export type ApiTier = "BASIC" | "PRO" | "ULTRA";
2277
+ export type ApiTier = "BASIC" | "PRO" | "ULTRA" | "BUSINESS" | "ENTERPRISE";
1804
2278
  export interface MeQuotaWindow {
1805
2279
  limit: number;
1806
2280
  used: number;
@@ -1869,7 +2343,6 @@ export interface TokensListParams {
1869
2343
  primary_dex?: TokenPrimaryDex;
1870
2344
  authority_revoked?: boolean;
1871
2345
  exclude_token2022?: boolean;
1872
- min_lp_burnt_pct?: number;
1873
2346
  /** Computed (post-filter): organic-volume floor in last 1h. */
1874
2347
  min_volume_1h_usd?: number;
1875
2348
  /** Computed (post-filter): MEV/bot volume ceiling as % of total. */
@@ -1982,6 +2455,8 @@ export interface AlmostBondedToken {
1982
2455
  mint: string;
1983
2456
  symbol: string | null;
1984
2457
  name: string | null;
2458
+ /** Launch venue: pump.fun curve or bonk/LetsBonk (Raydium LaunchLab). */
2459
+ launchpad?: "pumpfun" | "launchlab";
1985
2460
  /** Bonding-curve progress %, from on-chain real_token_reserves depletion. */
1986
2461
  progress_pct: number | null;
1987
2462
  /** Δprogress per minute; null until a 5m-ago snapshot exists. */
@@ -1998,6 +2473,8 @@ export interface AlmostBondedToken {
1998
2473
  age_minutes: number | null;
1999
2474
  }
2000
2475
  export interface AlmostBondedResponse {
2476
+ /** Launch-pipeline scope disclosure (absent ≠ clean). */
2477
+ coverage?: LaunchCoverage;
2001
2478
  tokens: AlmostBondedToken[];
2002
2479
  filters: Record<string, unknown>;
2003
2480
  returned: number;
@@ -2032,6 +2509,8 @@ export interface DumpClusterStats {
2032
2509
  as_of: string;
2033
2510
  }
2034
2511
  export interface WalletFlags {
2512
+ /** States that is_sniper / is_bundler / is_dumper come from the launchpad trade pipeline: false = not observed, not verified clean. */
2513
+ coverage_note?: string;
2035
2514
  is_kol: boolean;
2036
2515
  kol_name: string | null;
2037
2516
  is_alpha_tracked: boolean;
@@ -2070,6 +2549,8 @@ export interface WalletClassification {
2070
2549
  dump_cluster: DumpClusterStats | null;
2071
2550
  }
2072
2551
  export interface WalletBatchClassifyResponse {
2552
+ /** Launch-pipeline scope disclosure (absent ≠ clean). */
2553
+ coverage?: LaunchCoverage;
2073
2554
  wallets: WalletClassification[];
2074
2555
  count: number;
2075
2556
  as_of: string;
@@ -2115,6 +2596,8 @@ export interface WalletRecentTrade {
2115
2596
  tx_signature: string;
2116
2597
  }
2117
2598
  export interface WalletStatsResponse {
2599
+ /** Trade-data coverage disclosure. */
2600
+ coverage?: TradeCoverage;
2118
2601
  address: string;
2119
2602
  stats: WalletStats | null;
2120
2603
  flags: WalletFlags;
@@ -2124,6 +2607,19 @@ export interface WalletStatsResponse {
2124
2607
  recent_trades?: WalletRecentTrade[];
2125
2608
  /** Derived analytics: win rate, ROI, best/worst trade, biggest miss, verdict (v1.9+). */
2126
2609
  derived?: WalletDerivedStats;
2610
+ /**
2611
+ * v2.10 (server 2026-10-01) — present (`true`) only when the 90-day aggregation
2612
+ * failed: `stats: null` is then UNKNOWN, not an inactive wallet.
2613
+ */
2614
+ stats_unavailable?: boolean;
2615
+ /** v2.10 — present (`true`) only when one or more enrichment queries failed; see `degraded_fields`. */
2616
+ enrichment_unavailable?: boolean;
2617
+ /**
2618
+ * v2.10 — enrichment blocks whose query failed (e.g. a database timeout). Their
2619
+ * `null` / `[]` is UNKNOWN, not "no data"; retry later. `biggest_miss` refers
2620
+ * to `derived.biggest_miss`.
2621
+ */
2622
+ degraded_fields?: Array<"top_tokens" | "trading_style" | "deployer_breakdown" | "recent_trades" | "biggest_miss" | (string & {})>;
2127
2623
  }
2128
2624
  export interface WalletPnlSummary {
2129
2625
  realized_sol: number;
@@ -2188,12 +2684,15 @@ export interface WalletPnlResponse {
2188
2684
  pnl_curve: WalletPnlCurvePoint[];
2189
2685
  closed_positions: WalletClosedPosition[];
2190
2686
  open_positions: WalletOpenPosition[];
2687
+ /** partial / analyzed_trades / partial_reason are present only when the wallet exceeded the trade-analysis cap. (Earlier types declared `truncated_trades`, which the route never sent.) */
2191
2688
  notes: {
2192
2689
  cost_basis_observable_from: string;
2193
- truncated_trades?: number;
2194
2690
  trades_through?: string;
2195
2691
  trades_through_block_time?: number;
2196
2692
  trades_through_same_second?: number;
2693
+ partial?: true;
2694
+ analyzed_trades?: number;
2695
+ partial_reason?: string;
2197
2696
  };
2198
2697
  cache_hit?: boolean;
2199
2698
  computed_at?: string;
@@ -2243,6 +2742,8 @@ export interface Holding {
2243
2742
  transfer_delta: number | null;
2244
2743
  }
2245
2744
  export interface WalletHoldingsResponse {
2745
+ /** Trade-data coverage disclosure. */
2746
+ coverage?: TradeCoverage;
2246
2747
  address: string;
2247
2748
  sol_balance: number;
2248
2749
  holdings: Holding[];
@@ -2286,6 +2787,8 @@ export interface WalletTrade {
2286
2787
  traded_at: string;
2287
2788
  }
2288
2789
  export interface WalletTradesResponse {
2790
+ /** Trade-data coverage disclosure. */
2791
+ coverage?: TradeCoverage;
2289
2792
  address: string;
2290
2793
  trades: WalletTrade[];
2291
2794
  next_cursor: string | null;
@@ -2296,6 +2799,21 @@ export interface WalletTradesResponse {
2296
2799
  since: number;
2297
2800
  until: number;
2298
2801
  };
2802
+ /** Postgres / Parquet-archive split for this page. */
2803
+ history?: TradeHistoryMeta;
2804
+ }
2805
+ /** Where a trade page came from: rows at/after `postgres_from` are Postgres, older rows the Parquet archive (one ordering, one cursor). */
2806
+ export interface TradeHistoryMeta {
2807
+ /** Unix seconds. */
2808
+ postgres_from: number;
2809
+ archive_used: boolean;
2810
+ archive_months: string[];
2811
+ /** null = archive reader not configured. */
2812
+ archive_available: boolean | null;
2813
+ /** true = older history was requested but the archive did not answer — has_more:false is then NOT the end of the tape. */
2814
+ truncated: boolean;
2815
+ /** Present when the archive could not be reached or is not configured. */
2816
+ note?: string;
2299
2817
  }
2300
2818
  export interface TokenTradesParams {
2301
2819
  /** 1–500, default 100. */
@@ -2357,6 +2875,8 @@ export interface TokenTradesResponse {
2357
2875
  until: number;
2358
2876
  };
2359
2877
  coverage: TradeCoverage;
2878
+ /** Postgres / Parquet-archive split for this page. */
2879
+ history?: TradeHistoryMeta;
2360
2880
  }
2361
2881
  export interface TokenTopTradersParams {
2362
2882
  /** 1–25, default 25 (ULTRA keys may request up to 100 on the keyed route). */
@@ -2367,6 +2887,8 @@ export interface TokenTopTradersParams {
2367
2887
  window_days?: number;
2368
2888
  /** Minimum SOL bought to qualify (default 0.1). */
2369
2889
  min_bought_sol?: number;
2890
+ /** REST only: skip this many ranked traders (bounded by the tier's row cap). The x402 route rejects it before payment (400 param_not_supported_on_x402). */
2891
+ offset?: number;
2370
2892
  }
2371
2893
  /** One wallet in a top-traders response, enriched with our own reputation data
2372
2894
  * (KOL identity + alpha-wallet stats) so you can tell smart money from bots. */
@@ -2418,6 +2940,8 @@ export interface SniperRecentParams {
2418
2940
  min_bond_rate?: number;
2419
2941
  /** Max results, 1–200 (default 50). */
2420
2942
  limit?: number;
2943
+ /** REST only, ULTRA: narrow to your custom deployer watchlist. The x402 route rejects it before payment (400 param_not_supported_on_x402). */
2944
+ watchlist?: boolean;
2421
2945
  }
2422
2946
  /** One deshred-detected pump.fun deploy — surfaces ~500ms before on-chain
2423
2947
  * confirmation, so the payload carries no MC/logs/balances. */
@@ -2431,6 +2955,9 @@ export interface SniperDeploy {
2431
2955
  detected_at: string;
2432
2956
  detection_region: string;
2433
2957
  detection_confirmed: boolean;
2958
+ /** Deployer attribution: 'unverified' | 'confirmed' | 'corrected' (mig 313). */
2959
+ attribution_status?: string | null;
2960
+ attribution_checked_at?: string | null;
2434
2961
  deployer_tier: string | null;
2435
2962
  deployer_bond_rate: number | null;
2436
2963
  deployer_total_bonded: number | null;
@@ -2444,9 +2971,13 @@ export interface SniperDeploy {
2444
2971
  footprint?: SniperFootprint | null;
2445
2972
  }
2446
2973
  export interface SniperRecentResponse {
2974
+ /** Launch-pipeline scope disclosure (absent ≠ clean). */
2975
+ coverage?: LaunchCoverage;
2447
2976
  deploys: SniperDeploy[];
2448
2977
  count: number;
2449
2978
  data_age_seconds: number | null;
2979
+ /** Present (true) only when watchlist=true and your watchlist is empty. */
2980
+ watchlist_empty?: boolean;
2450
2981
  }
2451
2982
  /** One DEX pool a token trades in. `is_active` distinguishes live vs parked venues. */
2452
2983
  export interface TokenPool {
@@ -2479,6 +3010,13 @@ export interface TokenPoolsResponse {
2479
3010
  mint: string;
2480
3011
  pools: TokenPool[];
2481
3012
  summary: TokenPoolsSummary;
3013
+ /** The inventory is the deepest `max_pools` pools by liquidity; summary totals cover the returned pools. */
3014
+ universe?: {
3015
+ kind: "top_by_liquidity";
3016
+ max_pools: number;
3017
+ returned: number;
3018
+ truncated: boolean;
3019
+ };
2482
3020
  }
2483
3021
  export interface TokenDepthParams {
2484
3022
  /** SOL buy sizes to quote (max 8, each >0 and ≤10000). Default [0.5, 1, 5, 10]. Sent as a CSV `sizes` query param. */
@@ -2557,6 +3095,13 @@ export interface TokenDepthResponse {
2557
3095
  pools: TokenDepthPool[];
2558
3096
  unsupported_pools: TokenDepthUnsupportedPool[];
2559
3097
  note?: string;
3098
+ /** Only the deepest `max_pools` pools by stored liquidity are evaluated; pools past the cut are not listed. */
3099
+ universe?: {
3100
+ kind: "top_by_liquidity";
3101
+ max_pools: number;
3102
+ evaluated: number;
3103
+ truncated: boolean;
3104
+ };
2560
3105
  }
2561
3106
  /** Wallet-intelligence labels on a holder. Empty = unknown to us, NOT verified clean. */
2562
3107
  export type TokenHolderLabel = "deployer" | "kol" | "early_buyer" | "buyer" | "bundle" | "bot" | "dump_cluster";
@@ -2599,8 +3144,9 @@ export interface TokenHolderExcluded {
2599
3144
  export interface TokenHoldersConcentration {
2600
3145
  /**
2601
3146
  * EXACT distinct non-zero owners minus excluded pools/curves/burns, at `slot`
2602
- * (census). null ONLY when the provider refused the census for a mega-cap
2603
- * (see `source.census_fallback_reason`) — never estimated from trades.
3147
+ * (census). null ONLY when the census was not served: provider refusal for a mega-cap, a
3148
+ * timeout, or balances adding up to more than the mint supply (see
3149
+ * `source.census_fallback_reason`) — never estimated from trades.
2604
3150
  */
2605
3151
  holder_count: number | null;
2606
3152
  holder_count_source: "census" | null;
@@ -2664,7 +3210,13 @@ export interface TokenHoldersResponse {
2664
3210
  rpc_cap: number;
2665
3211
  commitment: string;
2666
3212
  scan_ms: number | null;
2667
- /** Set when the provider refused the census and the top-20 view was served instead. */
3213
+ /**
3214
+ * Set when the full census was not served and the top-20 view was served
3215
+ * instead: `census_exceeds_provider_limit` (provider refusal, mega-caps),
3216
+ * `census_timed_out`, `census_inconsistent_sum_exceeds_supply` (balances
3217
+ * summed past the mint supply; refused since 2026-10-02) or
3218
+ * `census_failed: <detail>`. `source.note` explains it in prose.
3219
+ */
2668
3220
  census_fallback_reason: string | null;
2669
3221
  note: string;
2670
3222
  };
@@ -2677,6 +3229,33 @@ export type TokenLockKind = "lock" | "vesting";
2677
3229
  export type TokenLockStatus = "active" | "completed" | "cancelled" | "closed";
2678
3230
  /** Kind of unlock event: `cliff`, periodic `period`, the `final` release, or a Bonfida `tranche`. */
2679
3231
  export type TokenUnlockEventKind = "cliff" | "period" | "final" | "tranche";
3232
+ /**
3233
+ * Who runs the lock contract, and how sure the server is (2026-10-02).
3234
+ * `verified` = a known provider deployment (Streamflow / Jupiter Lock / Bonfida,
3235
+ * identified by program id); `compatible` = only the instruction/event shape
3236
+ * matches a known provider (`compatible_with`), the operator is NOT identified;
3237
+ * `unverified` = unknown program. `id` / `website_url` are null unless verified.
3238
+ * `lock_url` is a per-lock page on the provider's site, set ONLY where its
3239
+ * format is proven — for the Solana providers it is always null (never guessed).
3240
+ */
3241
+ export interface TokenLockProvider {
3242
+ id: string | null;
3243
+ name: string | null;
3244
+ identity: "verified" | "compatible" | "unverified";
3245
+ compatible_with: string | null;
3246
+ website_url: string | null;
3247
+ lock_url: string | null;
3248
+ }
3249
+ /** Independent on-chain evidence on Solana Explorer (2026-10-02). */
3250
+ export interface TokenLockExplorer {
3251
+ lock_account_url: string | null;
3252
+ creation_tx_url: string | null;
3253
+ }
3254
+ /** One Bonfida vesting tranche (`TokenLock.schedule`). */
3255
+ export interface TokenLockTranche {
3256
+ release_at: string | null;
3257
+ amount_raw: string;
3258
+ }
2680
3259
  /** Mint facts joined to a lock row / unlock event. All null when unknown (`facts_resolved`). */
2681
3260
  export interface TokenLockToken {
2682
3261
  symbol: string | null;
@@ -2703,6 +3282,10 @@ export interface TokenLock {
2703
3282
  /** The contract account (Streamflow stream / Jupiter VestingEscrow / Bonfida vesting account). */
2704
3283
  lock_account: string;
2705
3284
  program: TokenLockProgram;
3285
+ /** 2026-10-02 — who runs the locker and how sure we are; see {@link TokenLockProvider}. */
3286
+ provider: TokenLockProvider;
3287
+ /** 2026-10-02 — Solana Explorer links for the lock account and the creation tx. */
3288
+ explorer: TokenLockExplorer;
2706
3289
  kind: TokenLockKind;
2707
3290
  status: TokenLockStatus;
2708
3291
  mint: string;
@@ -2714,6 +3297,9 @@ export interface TokenLock {
2714
3297
  amount_raw: string;
2715
3298
  amount: number | null;
2716
3299
  amount_usd: number | null;
3300
+ /** 2026-10-02 — the token price behind every `*_usd` field (null when unknown, stale or phantom). */
3301
+ price_usd: number | null;
3302
+ /** % of CURRENT supply; null when unknown or above 100.5 (supply changed since the deposit). */
2717
3303
  amount_pct_of_supply: number | null;
2718
3304
  /** Still locked right now (amount − unlocked-so-far); "0" unless active. */
2719
3305
  locked_raw: string;
@@ -2722,7 +3308,7 @@ export interface TokenLock {
2722
3308
  locked_pct_of_supply: number | null;
2723
3309
  unlocked_raw: string;
2724
3310
  unlocked: number | null;
2725
- /** Claimed so far. */
3311
+ /** Claimed so far, read from the contract's own state (Solana tracks withdrawals). */
2726
3312
  withdrawn_raw: string;
2727
3313
  withdrawn: number | null;
2728
3314
  /** Unlocked but not yet withdrawn. */
@@ -2732,6 +3318,10 @@ export interface TokenLock {
2732
3318
  cliff_at: string | null;
2733
3319
  /** Fully unlocked at; null = perpetual / no schedule. */
2734
3320
  end_at: string | null;
3321
+ /** 2026-10-02 — seconds until fully unlocked (>= 0); 0 once completed; null when perpetual or cancelled / closed. */
3322
+ seconds_until_end: number | null;
3323
+ /** 2026-10-02 — seconds until `next_unlock.at` (>= 0); null without a next unlock. */
3324
+ seconds_until_next_unlock: number | null;
2735
3325
  period_seconds: number | null;
2736
3326
  /** period < 1h (per-second stream, e.g. Streamflow payroll). */
2737
3327
  continuous: boolean;
@@ -2741,6 +3331,8 @@ export interface TokenLock {
2741
3331
  cliff_amount: number | null;
2742
3332
  perpetual: boolean;
2743
3333
  next_unlock: TokenLockNextUnlock | null;
3334
+ /** Bonfida vesting only: the tranche list (absent on other programs). */
3335
+ schedule?: TokenLockTranche[];
2744
3336
  /** The locker can cancel — funds are locked against the RECIPIENT, not the locker (a weaker promise). */
2745
3337
  cancelable_by_sender: boolean | null;
2746
3338
  cancelable_by_recipient: boolean | null;
@@ -2845,7 +3437,10 @@ export interface TokenFeedPagination {
2845
3437
  next_since: string | null;
2846
3438
  /** Pass as `before` to page back. */
2847
3439
  next_before: string | null;
2848
- /** v1.24 (locks feed) — pass as `cursor` to page back without skipping same-timestamp rows; null = end. */
3440
+ }
3441
+ /** The locks feed's pagination: adds the strict keyset cursor and the post-filter scan meta. (Earlier types put these on every feed; the fee-claims and surges routes never send them.) */
3442
+ export interface TokenLocksFeedPagination extends TokenFeedPagination {
3443
+ /** v1.24 — pass as `cursor` to page back without skipping same-timestamp rows; null = end. */
2849
3444
  next_cursor?: string | null;
2850
3445
  /** v1.24 — present when a post-filter (min_usd / min_pct_of_supply / status) was scanned. */
2851
3446
  post_filtered?: boolean;
@@ -2867,7 +3462,7 @@ export interface TokenFeedStreamPointer {
2867
3462
  /** GET /tokens/locks — newest lock / vesting contracts across all mints. PRO+, keyed only. */
2868
3463
  export interface TokenLocksFeedResponse {
2869
3464
  locks: TokenLockFeedEntry[];
2870
- pagination: TokenFeedPagination;
3465
+ pagination: TokenLocksFeedPagination;
2871
3466
  /** v1.24 — "mint_facts:<table>" when a per-mint enrichment read failed; those rows' usd/ui/pct are null (unknown) and min_usd / min_pct_of_supply could not be applied to them. */
2872
3467
  degraded_fields?: string[];
2873
3468
  /** Pointer to the `token:locks` WS channel (event `token:lock`). */
@@ -3328,8 +3923,10 @@ export interface KolScoreStateChangedEvent {
3328
3923
  }
3329
3924
  /** Any event payload on `wallet:scores` — narrow on the frame's `event`. */
3330
3925
  export type WalletScoreEvent = DeployerTierChangedEvent | KolScoreStateChangedEvent;
3331
- /** pump.fun fee event types (`creator_claim` is excluded from the feed unless requested via `type=`). */
3332
- export type TokenFeeEventType = "shares_created" | "shares_updated" | "shares_reset" | "distribution" | "social_pda_created" | "social_claim" | "creator_transferred" | "creator_claim";
3926
+ /** pump.fun fee event types (`creator_claim` and `holder_distribution` are excluded from the feed unless requested via `type=`). */
3927
+ export type TokenFeeEventType = "shares_created" | "shares_updated" | "shares_reset" | "distribution" | "social_pda_created" | "social_claim" | "creator_transferred" | "creator_claim"
3928
+ /** pump.fun DistributeFeeToHolders: creator fees airdropped pro-rata to holders (amount = total, payload.recipients = holder count). History from 2026-09-13. */
3929
+ | "holder_distribution";
3333
3930
  /** A shareholder on a SharingConfig: `{ address, share_bps }` (bps of the creator fee). */
3334
3931
  export interface TokenFeeShareEntry {
3335
3932
  address: string;
@@ -3757,7 +4354,6 @@ export interface TokenSurgesResponse {
3757
4354
  tiers: string[];
3758
4355
  };
3759
4356
  note: string;
3760
- meta?: Record<string, unknown>;
3761
4357
  }
3762
4358
  /** Frame delivered on the `token:surges` channel (events `token:surge` / `token:revival`) — the fire payload, no `outcome`. */
3763
4359
  export type TokenSurgeStreamEvent = TokenSurgeEvent;
@@ -3778,6 +4374,8 @@ export interface DeployerHistorySnapshot {
3778
4374
  * when it launched token X?" without look-ahead bias. PRO/ULTRA only.
3779
4375
  */
3780
4376
  export interface DeployerHistoryResponse {
4377
+ /** Launch-pipeline scope disclosure (absent ≠ clean). */
4378
+ coverage?: LaunchCoverage;
3781
4379
  is_deployer: boolean;
3782
4380
  wallet: string;
3783
4381
  snapshots: DeployerHistorySnapshot[];
@@ -3802,6 +4400,8 @@ export interface DeployerAsOfSnapshot {
3802
4400
  * and never a synthesized row (`as_of: false, snapshot: null` before its first
3803
4401
  * snapshot). PRO/ULTRA only. */
3804
4402
  export interface DeployerAsOfResponse {
4403
+ /** Launch-pipeline scope disclosure (absent ≠ clean). */
4404
+ coverage?: LaunchCoverage;
3805
4405
  is_deployer: boolean;
3806
4406
  wallet: string;
3807
4407
  requested_date: string;
@@ -3890,8 +4490,8 @@ export interface DeployerRewardsResponse {
3890
4490
  note: string;
3891
4491
  };
3892
4492
  }
3893
- /** Reputation grade. `unranked` = too few deploys to grade, not "bad". */
3894
- export type DeployerTier = "elite" | "good" | "rising" | "neutral" | "spammer" | "unranked";
4493
+ /** Reputation grade — the deployers.tier CHECK set (migration 031). `unranked` = too few deploys to grade, not "bad". (Earlier types listed "neutral" / "spammer", which are Robinhood Chain tiers and never appear here.) */
4494
+ export type DeployerTier = "elite" | "good" | "moderate" | "rising" | "cold" | "unranked";
3895
4495
  export interface DeployerTierCounts {
3896
4496
  elite: number;
3897
4497
  good: number;
@@ -3899,6 +4499,8 @@ export interface DeployerTierCounts {
3899
4499
  }
3900
4500
  /** Ecosystem-wide deployer stats. `GET /deployer-hunter/stats` */
3901
4501
  export interface DeployerStatsResponse {
4502
+ /** Launch-pipeline scope disclosure (absent ≠ clean). */
4503
+ coverage?: LaunchCoverage;
3902
4504
  tracked_count: number;
3903
4505
  signals_today: number;
3904
4506
  bonds_detected: number;
@@ -3912,10 +4514,10 @@ export interface DeployerStatsResponse {
3912
4514
  mc_at_alert_complete?: boolean;
3913
4515
  }
3914
4516
  export interface DeployerLeaderboardParams {
3915
- /** Restrict to one grade. */
3916
- tier?: DeployerTier;
3917
- /** Default `bonding_rate`. */
3918
- sort?: "bonding_rate" | "recent" | "total_bonded" | "last_deploy";
4517
+ /** Restrict to one grade (unranked is not accepted). */
4518
+ tier?: Exclude<DeployerTier, "unranked">;
4519
+ /** Default `bonding_rate`. The route's enum; earlier types listed "recent" / "last_deploy", which it rejects with a 400. */
4520
+ sort?: "bonding_rate" | "recent_bond_rate" | "total_bonded" | "last_deploy_at" | "post_bond_survival_rate";
3919
4521
  /** 1–100, default 20. */
3920
4522
  limit?: number;
3921
4523
  /** Default 0. */
@@ -3924,20 +4526,27 @@ export interface DeployerLeaderboardParams {
3924
4526
  export interface DeployerLeaderboardEntry {
3925
4527
  id: string;
3926
4528
  wallet_address: string;
3927
- tier: DeployerTier;
4529
+ /** The route excludes unranked deployers. */
4530
+ tier: Exclude<DeployerTier, "unranked">;
3928
4531
  /** Lifetime share of deploys that bonded. */
3929
4532
  bonding_rate: number;
3930
4533
  /** Rolling recent-window bond rate — diverges from lifetime when form changes. */
3931
4534
  recent_bond_rate: number;
3932
4535
  total_tokens_deployed: number;
3933
4536
  total_bonded: number;
4537
+ /** Tokens that bonded almost immediately after deploy. */
4538
+ instant_bonds?: number | null;
3934
4539
  last_deploy_at?: string | null;
3935
4540
  recent_outcomes?: string | null;
3936
4541
  avg_time_to_bond_minutes?: number | null;
3937
- /** Share of labeled tokens that ran (peak ≥60min after deploy) rather than dumped. */
4542
+ /** Share of labeled tokens that ran (peak ≥60min after deploy) rather than dumped. (This route does not send `labeled_tokens`.) */
3938
4543
  runner_rate?: number | null;
3939
- /** Confidence denominator for `runner_rate` — gate on ≥3. */
3940
- labeled_tokens?: number | null;
4544
+ /** Share of the deployer's bonded tokens that survived after bonding. */
4545
+ post_bond_survival_rate?: number | null;
4546
+ /** Share of the deployer's bonded tokens that did 2x after bonding. */
4547
+ post_bond_2x_rate?: number | null;
4548
+ /** Bonded tokens labeled for the two post-bond rates (confidence denominator). */
4549
+ post_bond_labeled_count?: number | null;
3941
4550
  best_token_peak_mc?: number | null;
3942
4551
  avg_peak_mc?: number | null;
3943
4552
  last_bond_at?: string | null;
@@ -3947,50 +4556,128 @@ export interface DeployerLeaderboardEntry {
3947
4556
  }
3948
4557
  /** `GET /deployer-hunter/leaderboard` — excludes unranked deployers. */
3949
4558
  export interface DeployerLeaderboardResponse {
4559
+ /** Launch-pipeline scope disclosure (absent ≠ clean). */
4560
+ coverage?: LaunchCoverage;
3950
4561
  deployers: DeployerLeaderboardEntry[];
3951
4562
  total: number;
3952
4563
  limit: number;
3953
4564
  offset: number;
3954
4565
  has_more: boolean;
3955
4566
  }
4567
+ /**
4568
+ * One row of `GET /deployer-hunter/{wallet}/tokens` (the `deployer_tokens` row).
4569
+ * Earlier type versions declared mint/name/symbol/bonded/peak_market_cap_usd,
4570
+ * which the route never returned.
4571
+ */
3956
4572
  export interface DeployerToken {
3957
- mint: string;
3958
- name: string | null;
3959
- symbol: string | null;
3960
- bonded: boolean;
4573
+ id: string;
4574
+ token_mint: string;
4575
+ token_name: string | null;
4576
+ token_symbol: string | null;
3961
4577
  deployed_at: string;
4578
+ /** null = not bonded. */
3962
4579
  bonded_at: string | null;
3963
- peak_market_cap_usd: number | null;
4580
+ time_to_bond_minutes: number | null;
4581
+ peak_market_cap: number | null;
4582
+ mc_at_bond: number | null;
4583
+ market_cap_at_alert: number | null;
4584
+ alerted_at: string | null;
4585
+ /** create → migrate within ~90 s (curve filled by a bundle). */
4586
+ instant_bond: boolean;
4587
+ }
4588
+ /** Launch-pipeline dataset scope disclosure (deployer-hunter, sniper, alpha, almost-bonded, batch classify/risk). Absent ≠ clean. */
4589
+ export interface LaunchCoverage {
4590
+ scope: string;
4591
+ note: string;
3964
4592
  }
3965
4593
  /** `GET /deployer-hunter/{wallet}` — unknown wallets return a profile, not a 404. */
4594
+ /**
4595
+ * `GET /deployer-hunter/{wallet}`. v2.10 FIX: the route has always returned the
4596
+ * deployer row under `deployer` (null with `is_deployer: false` for a wallet we
4597
+ * do not track); earlier type versions declared a flat shape whose fields were
4598
+ * always undefined at runtime.
4599
+ */
3966
4600
  export interface DeployerProfileResponse {
3967
- wallet: string;
3968
- tier: DeployerTier;
3969
- bonding_rate: number;
3970
- recent_bond_rate: number;
3971
- total_deployed: number;
4601
+ is_deployer: boolean;
4602
+ /** Only on the `is_deployer: false` answer. */
4603
+ wallet?: string;
4604
+ deployer: DeployerProfile | null;
4605
+ /** Aggregated from the live pump.fun API (not our DB); null when not a deployer. */
4606
+ pump_stats: {
4607
+ total: number;
4608
+ bonded: number;
4609
+ bondingRate: number;
4610
+ bestAthMc: number;
4611
+ avgAthMc: number;
4612
+ } | null;
4613
+ /** Raw pump.fun API token list (pump.fun-launched tokens only). */
4614
+ pump_tokens: Record<string, unknown>[];
4615
+ pump_error: string | null;
4616
+ /** Our own LaunchLab/bonk + bags tokens for this deployer. */
4617
+ launchpad_tokens: Record<string, unknown>[];
4618
+ /** Launchpad-pipeline scope disclosure. */
4619
+ coverage?: {
4620
+ scope: string;
4621
+ note: string;
4622
+ };
4623
+ /** PRO+ funding evidence (see the funding docs); absent below PRO. */
4624
+ funding?: Record<string, unknown>;
4625
+ /** PRO+ flat funding features, incl. `funding_to_first_deploy_seconds` (to `deployer.first_deploy_at`). */
4626
+ funding_features?: Record<string, unknown>;
4627
+ /** PRO+ capital relationships from high-signal sources (`launched_at` = `deployer.first_deploy_at`); absent below PRO. */
4628
+ capital_intelligence?: Record<string, unknown>;
4629
+ }
4630
+ /** The `deployers` row inside {@link DeployerProfileResponse}. */
4631
+ export interface DeployerProfile {
4632
+ id: string;
4633
+ wallet_address: string;
4634
+ total_tokens_deployed: number;
3972
4635
  total_bonded: number;
4636
+ instant_bonds: number | null;
4637
+ bonding_rate: number | null;
4638
+ recent_bond_rate: number | null;
4639
+ /** Solana deployer tiers (the `deployers.tier` column). */
4640
+ tier: "elite" | "good" | "moderate" | "rising" | "cold" | "unranked" | null;
4641
+ is_tracked: boolean;
4642
+ avg_time_to_bond_minutes: number | null;
4643
+ best_token_peak_mc: number | null;
4644
+ avg_peak_mc: number | null;
4645
+ recent_outcomes: Record<string, unknown> | null;
4646
+ /** Fraction of labeled tokens that ran (peak ≥ 60 min). Gate on `labeled_tokens` ≥ 3. */
4647
+ runner_rate: number | null;
4648
+ runner_tokens: number | null;
4649
+ labeled_tokens: number | null;
4650
+ post_bond_survival_rate: number | null;
4651
+ post_bond_2x_rate: number | null;
4652
+ post_bond_labeled_count: number | null;
4653
+ first_seen_at: string | null;
4654
+ /** Earliest deploy observed by MadeOnSol for this wallet — not proof of its first-ever on-chain launch. Only moves earlier. */
4655
+ first_deploy_at: string | null;
4656
+ /** Latest deploy observed by MadeOnSol for this wallet. Only moves later. */
3973
4657
  last_deploy_at: string | null;
3974
- first_seen: string | null;
3975
- runner_rate?: number | null;
3976
- /** Gate `runner_rate` on this being ≥3. */
3977
- labeled_tokens?: number | null;
3978
- avg_time_to_bond_minutes?: number | null;
3979
- tokens?: DeployerToken[] | null;
4658
+ last_bond_at: string | null;
4659
+ label: string | null;
3980
4660
  }
3981
4661
  export interface DeployerTokensParams {
3982
- /** 1–100, default 50. */
4662
+ /** 1–50, default 20. */
3983
4663
  limit?: number;
3984
- /** Default 0. */
4664
+ /** 0–10000, default 0. */
3985
4665
  offset?: number;
3986
- /** Default false. */
4666
+ /** true = only tokens that graduated (bonded_at set); total / has_more count the bonded set. */
3987
4667
  only_bonded?: boolean;
3988
4668
  }
3989
- /** `GET /deployer-hunter/{wallet}/tokens` */
4669
+ /** `GET /deployer-hunter/{wallet}/tokens` — newest bond first. */
3990
4670
  export interface DeployerTokensResponse {
4671
+ /** false (with wallet echoed and an empty page) when the wallet is not a tracked deployer. */
4672
+ is_deployer?: boolean;
4673
+ /** Only on the `is_deployer: false` answer. */
4674
+ wallet?: string;
3991
4675
  tokens: DeployerToken[];
3992
- count: number;
3993
4676
  total: number;
4677
+ limit: number;
4678
+ offset: number;
4679
+ has_more: boolean;
4680
+ coverage?: LaunchCoverage;
3994
4681
  }
3995
4682
  export interface DeployerAlertStatsParams {
3996
4683
  /** Lookback window, e.g. `24h`, `7d`, `30d`. */
@@ -4024,6 +4711,10 @@ export interface DeployerAlertStatsResponse {
4024
4711
  /** Keyed by tier name. */
4025
4712
  tiers: Record<string, DeployerTierStats>;
4026
4713
  period: string;
4714
+ /** Rows the aggregates were computed over. */
4715
+ sampled_rows?: number;
4716
+ /** true = the safety ceiling was reached; the aggregates are over a partial sample, not the population. */
4717
+ truncated?: boolean;
4027
4718
  }
4028
4719
  export interface BestTokensParams {
4029
4720
  /** Lookback window, default `7d`. */
@@ -4045,9 +4736,13 @@ export interface BestToken {
4045
4736
  deployer_wallet: string;
4046
4737
  deployer_tier: DeployerTier;
4047
4738
  alerted_at?: string | null;
4739
+ /** Launchpad of the alert (e.g. pumpfun, launchlab); null when unknown. */
4740
+ launchpad?: string | null;
4048
4741
  }
4049
4742
  /** `GET /deployer-hunter/best-tokens` — ranked (non-unranked) deployers only. */
4050
4743
  export interface BestTokensResponse {
4744
+ /** Launch-pipeline scope disclosure (absent ≠ clean). */
4745
+ coverage?: LaunchCoverage;
4051
4746
  tokens: BestToken[];
4052
4747
  period: string;
4053
4748
  limit: number;
@@ -4057,7 +4752,8 @@ export interface RecentBondsParams {
4057
4752
  limit?: number;
4058
4753
  /** Incremental-polling cursor — pass the previous `next_since`. */
4059
4754
  since?: string;
4060
- tier?: DeployerTier;
4755
+ /** unranked is not accepted (400). */
4756
+ tier?: Exclude<DeployerTier, "unranked">;
4061
4757
  /** Floor on peak market cap (USD). */
4062
4758
  peak_mc_min?: number;
4063
4759
  }
@@ -4085,10 +4781,25 @@ export interface RecentBond {
4085
4781
  time_to_bond_minutes?: number | null;
4086
4782
  peak_market_cap?: number | null;
4087
4783
  mc_at_bond?: number | null;
4088
- deployers: DeployerSummary;
4784
+ /** create → migrate within ~90 s (curve filled by a bundle). */
4785
+ instant_bond: boolean;
4786
+ /** The deployers columns this route selects (no runner / peak-MC stats — see DeployerSummary on other routes). */
4787
+ deployers: RecentBondDeployer;
4788
+ }
4789
+ export interface RecentBondDeployer {
4790
+ wallet_address: string;
4791
+ tier: DeployerTier | null;
4792
+ total_tokens_deployed?: number | null;
4793
+ total_bonded?: number | null;
4794
+ instant_bonds?: number | null;
4795
+ bonding_rate?: number | null;
4796
+ recent_outcomes?: string | null;
4797
+ recent_bond_rate?: number | null;
4089
4798
  }
4090
4799
  /** `GET /deployer-hunter/recent-bonds` — tokens from tracked deployers that graduated. */
4091
- export interface RecentBondsResponse {
4800
+ export interface RecentBondsResponse extends FreeTierDelayMeta {
4801
+ /** Launch-pipeline scope disclosure (absent ≠ clean). */
4802
+ coverage?: LaunchCoverage;
4092
4803
  tokens: RecentBond[];
4093
4804
  limit: number;
4094
4805
  /** Pass back as `since` to fetch only newer bonds. */