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/LICENSE +21 -21
- package/README.md +11 -1
- package/dist/index.d.ts +23 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -9
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +841 -130
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
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
|
-
|
|
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
|
|
125
|
-
unique_strategies?:
|
|
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
|
-
|
|
427
|
+
wallet: string;
|
|
321
428
|
name: string;
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
602
|
-
unique_strategies?:
|
|
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
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
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
|
|
901
|
+
/** The KOL wallet address (the route never sent `wallet_address`). */
|
|
902
|
+
wallet: string;
|
|
670
903
|
kol_name: string | null;
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
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
|
-
|
|
705
|
-
|
|
706
|
-
|
|
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
|
-
|
|
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
|
-
|
|
719
|
-
|
|
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
|
-
|
|
727
|
-
|
|
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
|
-
|
|
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
|
-
|
|
754
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 "
|
|
1056
|
+
/** Lookback window (default "6h") */
|
|
768
1057
|
window?: KolAlertWindow;
|
|
769
1058
|
/** Filter to specific alert types (default all) */
|
|
770
1059
|
types?: KolAlertType[];
|
|
771
|
-
/**
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1850
|
+
wallet_address: string;
|
|
1481
1851
|
label: string | null;
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1669
|
-
|
|
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
|
|
1762
|
-
export interface
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
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
|
|
1773
|
-
outcome
|
|
1774
|
-
methodology
|
|
1775
|
-
as_of
|
|
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-
|
|
1778
|
-
|
|
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
|
|
2603
|
-
*
|
|
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
|
-
/**
|
|
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
|
-
|
|
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:
|
|
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`
|
|
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" | "
|
|
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" | "
|
|
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
|
-
|
|
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
|
-
/**
|
|
3940
|
-
|
|
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
|
-
|
|
3958
|
-
|
|
3959
|
-
|
|
3960
|
-
|
|
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
|
-
|
|
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
|
-
|
|
3968
|
-
|
|
3969
|
-
|
|
3970
|
-
|
|
3971
|
-
|
|
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
|
-
|
|
3975
|
-
|
|
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–
|
|
4662
|
+
/** 1–50, default 20. */
|
|
3983
4663
|
limit?: number;
|
|
3984
|
-
/**
|
|
4664
|
+
/** 0–10000, default 0. */
|
|
3985
4665
|
offset?: number;
|
|
3986
|
-
/**
|
|
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
|
-
|
|
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
|
-
|
|
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. */
|