madeonsol-x402 2.7.0 → 3.0.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/README.md +10 -2
- package/dist/index.d.ts +37 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -13
- package/dist/index.js.map +1 -1
- package/dist/solana-payment.d.ts +8 -2
- package/dist/solana-payment.d.ts.map +1 -1
- package/dist/solana-payment.js +18 -3
- package/dist/solana-payment.js.map +1 -1
- package/dist/types.d.ts +839 -132
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/x402-recovery.d.ts +104 -0
- package/dist/x402-recovery.d.ts.map +1 -0
- package/dist/x402-recovery.js +379 -0
- package/dist/x402-recovery.js.map +1 -0
- package/package.json +2 -2
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
|
+
/** "token" embeds the /token/{mint} snapshot on each row (≤20 distinct mints per page). */
|
|
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 ignores it. */
|
|
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 ignores it. */
|
|
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 ignores it. */
|
|
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 ignores it. */
|
|
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 ignores it. */
|
|
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 ignores it. */
|
|
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. */
|
|
@@ -2539,8 +3077,10 @@ export interface TokenDepthUnsupportedPool extends TokenDepthPoolBase {
|
|
|
2539
3077
|
/**
|
|
2540
3078
|
* v1.22 — Per-pool price-impact / slippage for a token: "how much SOL to move
|
|
2541
3079
|
* price N%" and impact per buy size, per pool (GET /tokens/{mint}/depth).
|
|
2542
|
-
* Impact is per-pool, NOT router-optimal.
|
|
2543
|
-
*
|
|
3080
|
+
* Impact is per-pool, NOT router-optimal. `found: false` = no pool with
|
|
3081
|
+
* sufficient authoritative data for depth: tracked pools that lack it are
|
|
3082
|
+
* listed in `unsupported_pools` with a `reason`; with no tracked pool at all
|
|
3083
|
+
* both arrays are empty. PRO/ULTRA only.
|
|
2544
3084
|
*/
|
|
2545
3085
|
export interface TokenDepthResponse {
|
|
2546
3086
|
mint: string;
|
|
@@ -2555,6 +3095,13 @@ export interface TokenDepthResponse {
|
|
|
2555
3095
|
pools: TokenDepthPool[];
|
|
2556
3096
|
unsupported_pools: TokenDepthUnsupportedPool[];
|
|
2557
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
|
+
};
|
|
2558
3105
|
}
|
|
2559
3106
|
/** Wallet-intelligence labels on a holder. Empty = unknown to us, NOT verified clean. */
|
|
2560
3107
|
export type TokenHolderLabel = "deployer" | "kol" | "early_buyer" | "buyer" | "bundle" | "bot" | "dump_cluster";
|
|
@@ -2597,8 +3144,9 @@ export interface TokenHolderExcluded {
|
|
|
2597
3144
|
export interface TokenHoldersConcentration {
|
|
2598
3145
|
/**
|
|
2599
3146
|
* EXACT distinct non-zero owners minus excluded pools/curves/burns, at `slot`
|
|
2600
|
-
* (census). null ONLY when the
|
|
2601
|
-
*
|
|
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.
|
|
2602
3150
|
*/
|
|
2603
3151
|
holder_count: number | null;
|
|
2604
3152
|
holder_count_source: "census" | null;
|
|
@@ -2662,7 +3210,13 @@ export interface TokenHoldersResponse {
|
|
|
2662
3210
|
rpc_cap: number;
|
|
2663
3211
|
commitment: string;
|
|
2664
3212
|
scan_ms: number | null;
|
|
2665
|
-
/**
|
|
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
|
+
*/
|
|
2666
3220
|
census_fallback_reason: string | null;
|
|
2667
3221
|
note: string;
|
|
2668
3222
|
};
|
|
@@ -2675,6 +3229,33 @@ export type TokenLockKind = "lock" | "vesting";
|
|
|
2675
3229
|
export type TokenLockStatus = "active" | "completed" | "cancelled" | "closed";
|
|
2676
3230
|
/** Kind of unlock event: `cliff`, periodic `period`, the `final` release, or a Bonfida `tranche`. */
|
|
2677
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
|
+
}
|
|
2678
3259
|
/** Mint facts joined to a lock row / unlock event. All null when unknown (`facts_resolved`). */
|
|
2679
3260
|
export interface TokenLockToken {
|
|
2680
3261
|
symbol: string | null;
|
|
@@ -2701,6 +3282,10 @@ export interface TokenLock {
|
|
|
2701
3282
|
/** The contract account (Streamflow stream / Jupiter VestingEscrow / Bonfida vesting account). */
|
|
2702
3283
|
lock_account: string;
|
|
2703
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;
|
|
2704
3289
|
kind: TokenLockKind;
|
|
2705
3290
|
status: TokenLockStatus;
|
|
2706
3291
|
mint: string;
|
|
@@ -2712,6 +3297,9 @@ export interface TokenLock {
|
|
|
2712
3297
|
amount_raw: string;
|
|
2713
3298
|
amount: number | null;
|
|
2714
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). */
|
|
2715
3303
|
amount_pct_of_supply: number | null;
|
|
2716
3304
|
/** Still locked right now (amount − unlocked-so-far); "0" unless active. */
|
|
2717
3305
|
locked_raw: string;
|
|
@@ -2720,7 +3308,7 @@ export interface TokenLock {
|
|
|
2720
3308
|
locked_pct_of_supply: number | null;
|
|
2721
3309
|
unlocked_raw: string;
|
|
2722
3310
|
unlocked: number | null;
|
|
2723
|
-
/** Claimed so far. */
|
|
3311
|
+
/** Claimed so far, read from the contract's own state (Solana tracks withdrawals). */
|
|
2724
3312
|
withdrawn_raw: string;
|
|
2725
3313
|
withdrawn: number | null;
|
|
2726
3314
|
/** Unlocked but not yet withdrawn. */
|
|
@@ -2730,6 +3318,10 @@ export interface TokenLock {
|
|
|
2730
3318
|
cliff_at: string | null;
|
|
2731
3319
|
/** Fully unlocked at; null = perpetual / no schedule. */
|
|
2732
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;
|
|
2733
3325
|
period_seconds: number | null;
|
|
2734
3326
|
/** period < 1h (per-second stream, e.g. Streamflow payroll). */
|
|
2735
3327
|
continuous: boolean;
|
|
@@ -2739,6 +3331,8 @@ export interface TokenLock {
|
|
|
2739
3331
|
cliff_amount: number | null;
|
|
2740
3332
|
perpetual: boolean;
|
|
2741
3333
|
next_unlock: TokenLockNextUnlock | null;
|
|
3334
|
+
/** Bonfida vesting only: the tranche list (absent on other programs). */
|
|
3335
|
+
schedule?: TokenLockTranche[];
|
|
2742
3336
|
/** The locker can cancel — funds are locked against the RECIPIENT, not the locker (a weaker promise). */
|
|
2743
3337
|
cancelable_by_sender: boolean | null;
|
|
2744
3338
|
cancelable_by_recipient: boolean | null;
|
|
@@ -2843,7 +3437,10 @@ export interface TokenFeedPagination {
|
|
|
2843
3437
|
next_since: string | null;
|
|
2844
3438
|
/** Pass as `before` to page back. */
|
|
2845
3439
|
next_before: string | null;
|
|
2846
|
-
|
|
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. */
|
|
2847
3444
|
next_cursor?: string | null;
|
|
2848
3445
|
/** v1.24 — present when a post-filter (min_usd / min_pct_of_supply / status) was scanned. */
|
|
2849
3446
|
post_filtered?: boolean;
|
|
@@ -2865,7 +3462,7 @@ export interface TokenFeedStreamPointer {
|
|
|
2865
3462
|
/** GET /tokens/locks — newest lock / vesting contracts across all mints. PRO+, keyed only. */
|
|
2866
3463
|
export interface TokenLocksFeedResponse {
|
|
2867
3464
|
locks: TokenLockFeedEntry[];
|
|
2868
|
-
pagination:
|
|
3465
|
+
pagination: TokenLocksFeedPagination;
|
|
2869
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. */
|
|
2870
3467
|
degraded_fields?: string[];
|
|
2871
3468
|
/** Pointer to the `token:locks` WS channel (event `token:lock`). */
|
|
@@ -3326,8 +3923,10 @@ export interface KolScoreStateChangedEvent {
|
|
|
3326
3923
|
}
|
|
3327
3924
|
/** Any event payload on `wallet:scores` — narrow on the frame's `event`. */
|
|
3328
3925
|
export type WalletScoreEvent = DeployerTierChangedEvent | KolScoreStateChangedEvent;
|
|
3329
|
-
/** pump.fun fee event types (`creator_claim`
|
|
3330
|
-
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";
|
|
3331
3930
|
/** A shareholder on a SharingConfig: `{ address, share_bps }` (bps of the creator fee). */
|
|
3332
3931
|
export interface TokenFeeShareEntry {
|
|
3333
3932
|
address: string;
|
|
@@ -3755,7 +4354,6 @@ export interface TokenSurgesResponse {
|
|
|
3755
4354
|
tiers: string[];
|
|
3756
4355
|
};
|
|
3757
4356
|
note: string;
|
|
3758
|
-
meta?: Record<string, unknown>;
|
|
3759
4357
|
}
|
|
3760
4358
|
/** Frame delivered on the `token:surges` channel (events `token:surge` / `token:revival`) — the fire payload, no `outcome`. */
|
|
3761
4359
|
export type TokenSurgeStreamEvent = TokenSurgeEvent;
|
|
@@ -3776,6 +4374,8 @@ export interface DeployerHistorySnapshot {
|
|
|
3776
4374
|
* when it launched token X?" without look-ahead bias. PRO/ULTRA only.
|
|
3777
4375
|
*/
|
|
3778
4376
|
export interface DeployerHistoryResponse {
|
|
4377
|
+
/** Launch-pipeline scope disclosure (absent ≠ clean). */
|
|
4378
|
+
coverage?: LaunchCoverage;
|
|
3779
4379
|
is_deployer: boolean;
|
|
3780
4380
|
wallet: string;
|
|
3781
4381
|
snapshots: DeployerHistorySnapshot[];
|
|
@@ -3800,6 +4400,8 @@ export interface DeployerAsOfSnapshot {
|
|
|
3800
4400
|
* and never a synthesized row (`as_of: false, snapshot: null` before its first
|
|
3801
4401
|
* snapshot). PRO/ULTRA only. */
|
|
3802
4402
|
export interface DeployerAsOfResponse {
|
|
4403
|
+
/** Launch-pipeline scope disclosure (absent ≠ clean). */
|
|
4404
|
+
coverage?: LaunchCoverage;
|
|
3803
4405
|
is_deployer: boolean;
|
|
3804
4406
|
wallet: string;
|
|
3805
4407
|
requested_date: string;
|
|
@@ -3888,8 +4490,8 @@ export interface DeployerRewardsResponse {
|
|
|
3888
4490
|
note: string;
|
|
3889
4491
|
};
|
|
3890
4492
|
}
|
|
3891
|
-
/** Reputation grade. `unranked` = too few deploys to grade, not "bad". */
|
|
3892
|
-
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";
|
|
3893
4495
|
export interface DeployerTierCounts {
|
|
3894
4496
|
elite: number;
|
|
3895
4497
|
good: number;
|
|
@@ -3897,6 +4499,8 @@ export interface DeployerTierCounts {
|
|
|
3897
4499
|
}
|
|
3898
4500
|
/** Ecosystem-wide deployer stats. `GET /deployer-hunter/stats` */
|
|
3899
4501
|
export interface DeployerStatsResponse {
|
|
4502
|
+
/** Launch-pipeline scope disclosure (absent ≠ clean). */
|
|
4503
|
+
coverage?: LaunchCoverage;
|
|
3900
4504
|
tracked_count: number;
|
|
3901
4505
|
signals_today: number;
|
|
3902
4506
|
bonds_detected: number;
|
|
@@ -3910,10 +4514,10 @@ export interface DeployerStatsResponse {
|
|
|
3910
4514
|
mc_at_alert_complete?: boolean;
|
|
3911
4515
|
}
|
|
3912
4516
|
export interface DeployerLeaderboardParams {
|
|
3913
|
-
/** Restrict to one grade. */
|
|
3914
|
-
tier?: DeployerTier
|
|
3915
|
-
/** Default `bonding_rate`. */
|
|
3916
|
-
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";
|
|
3917
4521
|
/** 1–100, default 20. */
|
|
3918
4522
|
limit?: number;
|
|
3919
4523
|
/** Default 0. */
|
|
@@ -3922,20 +4526,27 @@ export interface DeployerLeaderboardParams {
|
|
|
3922
4526
|
export interface DeployerLeaderboardEntry {
|
|
3923
4527
|
id: string;
|
|
3924
4528
|
wallet_address: string;
|
|
3925
|
-
|
|
4529
|
+
/** The route excludes unranked deployers. */
|
|
4530
|
+
tier: Exclude<DeployerTier, "unranked">;
|
|
3926
4531
|
/** Lifetime share of deploys that bonded. */
|
|
3927
4532
|
bonding_rate: number;
|
|
3928
4533
|
/** Rolling recent-window bond rate — diverges from lifetime when form changes. */
|
|
3929
4534
|
recent_bond_rate: number;
|
|
3930
4535
|
total_tokens_deployed: number;
|
|
3931
4536
|
total_bonded: number;
|
|
4537
|
+
/** Tokens that bonded almost immediately after deploy. */
|
|
4538
|
+
instant_bonds?: number | null;
|
|
3932
4539
|
last_deploy_at?: string | null;
|
|
3933
4540
|
recent_outcomes?: string | null;
|
|
3934
4541
|
avg_time_to_bond_minutes?: number | null;
|
|
3935
|
-
/** 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`.) */
|
|
3936
4543
|
runner_rate?: number | null;
|
|
3937
|
-
/**
|
|
3938
|
-
|
|
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;
|
|
3939
4550
|
best_token_peak_mc?: number | null;
|
|
3940
4551
|
avg_peak_mc?: number | null;
|
|
3941
4552
|
last_bond_at?: string | null;
|
|
@@ -3945,50 +4556,122 @@ export interface DeployerLeaderboardEntry {
|
|
|
3945
4556
|
}
|
|
3946
4557
|
/** `GET /deployer-hunter/leaderboard` — excludes unranked deployers. */
|
|
3947
4558
|
export interface DeployerLeaderboardResponse {
|
|
4559
|
+
/** Launch-pipeline scope disclosure (absent ≠ clean). */
|
|
4560
|
+
coverage?: LaunchCoverage;
|
|
3948
4561
|
deployers: DeployerLeaderboardEntry[];
|
|
3949
4562
|
total: number;
|
|
3950
4563
|
limit: number;
|
|
3951
4564
|
offset: number;
|
|
3952
4565
|
has_more: boolean;
|
|
3953
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
|
+
*/
|
|
3954
4572
|
export interface DeployerToken {
|
|
3955
|
-
|
|
3956
|
-
|
|
3957
|
-
|
|
3958
|
-
|
|
4573
|
+
id: string;
|
|
4574
|
+
token_mint: string;
|
|
4575
|
+
token_name: string | null;
|
|
4576
|
+
token_symbol: string | null;
|
|
3959
4577
|
deployed_at: string;
|
|
4578
|
+
/** null = not bonded. */
|
|
3960
4579
|
bonded_at: string | null;
|
|
3961
|
-
|
|
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;
|
|
3962
4592
|
}
|
|
3963
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
|
+
*/
|
|
3964
4600
|
export interface DeployerProfileResponse {
|
|
3965
|
-
|
|
3966
|
-
|
|
3967
|
-
|
|
3968
|
-
|
|
3969
|
-
|
|
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
|
+
funding_features?: Record<string, unknown>;
|
|
4626
|
+
}
|
|
4627
|
+
/** The `deployers` row inside {@link DeployerProfileResponse}. */
|
|
4628
|
+
export interface DeployerProfile {
|
|
4629
|
+
id: string;
|
|
4630
|
+
wallet_address: string;
|
|
4631
|
+
total_tokens_deployed: number;
|
|
3970
4632
|
total_bonded: number;
|
|
4633
|
+
instant_bonds: number | null;
|
|
4634
|
+
bonding_rate: number | null;
|
|
4635
|
+
recent_bond_rate: number | null;
|
|
4636
|
+
/** Solana deployer tiers (the `deployers.tier` column). */
|
|
4637
|
+
tier: "elite" | "good" | "moderate" | "rising" | "cold" | "unranked" | null;
|
|
4638
|
+
is_tracked: boolean;
|
|
4639
|
+
avg_time_to_bond_minutes: number | null;
|
|
4640
|
+
best_token_peak_mc: number | null;
|
|
4641
|
+
avg_peak_mc: number | null;
|
|
4642
|
+
recent_outcomes: Record<string, unknown> | null;
|
|
4643
|
+
/** Fraction of labeled tokens that ran (peak ≥ 60 min). Gate on `labeled_tokens` ≥ 3. */
|
|
4644
|
+
runner_rate: number | null;
|
|
4645
|
+
runner_tokens: number | null;
|
|
4646
|
+
labeled_tokens: number | null;
|
|
4647
|
+
post_bond_survival_rate: number | null;
|
|
4648
|
+
post_bond_2x_rate: number | null;
|
|
4649
|
+
post_bond_labeled_count: number | null;
|
|
4650
|
+
first_seen_at: string | null;
|
|
3971
4651
|
last_deploy_at: string | null;
|
|
3972
|
-
|
|
3973
|
-
|
|
3974
|
-
/** Gate `runner_rate` on this being ≥3. */
|
|
3975
|
-
labeled_tokens?: number | null;
|
|
3976
|
-
avg_time_to_bond_minutes?: number | null;
|
|
3977
|
-
tokens?: DeployerToken[] | null;
|
|
4652
|
+
last_bond_at: string | null;
|
|
4653
|
+
label: string | null;
|
|
3978
4654
|
}
|
|
3979
4655
|
export interface DeployerTokensParams {
|
|
3980
|
-
/** 1–
|
|
4656
|
+
/** 1–50, default 20. */
|
|
3981
4657
|
limit?: number;
|
|
3982
|
-
/**
|
|
4658
|
+
/** 0–10000, default 0. */
|
|
3983
4659
|
offset?: number;
|
|
3984
|
-
/**
|
|
4660
|
+
/** Documented, but NOT applied by the route today (rows are not filtered). */
|
|
3985
4661
|
only_bonded?: boolean;
|
|
3986
4662
|
}
|
|
3987
|
-
/** `GET /deployer-hunter/{wallet}/tokens` */
|
|
4663
|
+
/** `GET /deployer-hunter/{wallet}/tokens` — newest bond first. */
|
|
3988
4664
|
export interface DeployerTokensResponse {
|
|
4665
|
+
/** false (with wallet echoed and an empty page) when the wallet is not a tracked deployer. */
|
|
4666
|
+
is_deployer?: boolean;
|
|
4667
|
+
/** Only on the `is_deployer: false` answer. */
|
|
4668
|
+
wallet?: string;
|
|
3989
4669
|
tokens: DeployerToken[];
|
|
3990
|
-
count: number;
|
|
3991
4670
|
total: number;
|
|
4671
|
+
limit: number;
|
|
4672
|
+
offset: number;
|
|
4673
|
+
has_more: boolean;
|
|
4674
|
+
coverage?: LaunchCoverage;
|
|
3992
4675
|
}
|
|
3993
4676
|
export interface DeployerAlertStatsParams {
|
|
3994
4677
|
/** Lookback window, e.g. `24h`, `7d`, `30d`. */
|
|
@@ -4022,6 +4705,10 @@ export interface DeployerAlertStatsResponse {
|
|
|
4022
4705
|
/** Keyed by tier name. */
|
|
4023
4706
|
tiers: Record<string, DeployerTierStats>;
|
|
4024
4707
|
period: string;
|
|
4708
|
+
/** Rows the aggregates were computed over. */
|
|
4709
|
+
sampled_rows?: number;
|
|
4710
|
+
/** true = the safety ceiling was reached; the aggregates are over a partial sample, not the population. */
|
|
4711
|
+
truncated?: boolean;
|
|
4025
4712
|
}
|
|
4026
4713
|
export interface BestTokensParams {
|
|
4027
4714
|
/** Lookback window, default `7d`. */
|
|
@@ -4043,9 +4730,13 @@ export interface BestToken {
|
|
|
4043
4730
|
deployer_wallet: string;
|
|
4044
4731
|
deployer_tier: DeployerTier;
|
|
4045
4732
|
alerted_at?: string | null;
|
|
4733
|
+
/** Launchpad of the alert (e.g. pumpfun, launchlab); null when unknown. */
|
|
4734
|
+
launchpad?: string | null;
|
|
4046
4735
|
}
|
|
4047
4736
|
/** `GET /deployer-hunter/best-tokens` — ranked (non-unranked) deployers only. */
|
|
4048
4737
|
export interface BestTokensResponse {
|
|
4738
|
+
/** Launch-pipeline scope disclosure (absent ≠ clean). */
|
|
4739
|
+
coverage?: LaunchCoverage;
|
|
4049
4740
|
tokens: BestToken[];
|
|
4050
4741
|
period: string;
|
|
4051
4742
|
limit: number;
|
|
@@ -4055,7 +4746,8 @@ export interface RecentBondsParams {
|
|
|
4055
4746
|
limit?: number;
|
|
4056
4747
|
/** Incremental-polling cursor — pass the previous `next_since`. */
|
|
4057
4748
|
since?: string;
|
|
4058
|
-
|
|
4749
|
+
/** unranked is not accepted (400). */
|
|
4750
|
+
tier?: Exclude<DeployerTier, "unranked">;
|
|
4059
4751
|
/** Floor on peak market cap (USD). */
|
|
4060
4752
|
peak_mc_min?: number;
|
|
4061
4753
|
}
|
|
@@ -4083,10 +4775,25 @@ export interface RecentBond {
|
|
|
4083
4775
|
time_to_bond_minutes?: number | null;
|
|
4084
4776
|
peak_market_cap?: number | null;
|
|
4085
4777
|
mc_at_bond?: number | null;
|
|
4086
|
-
|
|
4778
|
+
/** create → migrate within ~90 s (curve filled by a bundle). */
|
|
4779
|
+
instant_bond: boolean;
|
|
4780
|
+
/** The deployers columns this route selects (no runner / peak-MC stats — see DeployerSummary on other routes). */
|
|
4781
|
+
deployers: RecentBondDeployer;
|
|
4782
|
+
}
|
|
4783
|
+
export interface RecentBondDeployer {
|
|
4784
|
+
wallet_address: string;
|
|
4785
|
+
tier: DeployerTier | null;
|
|
4786
|
+
total_tokens_deployed?: number | null;
|
|
4787
|
+
total_bonded?: number | null;
|
|
4788
|
+
instant_bonds?: number | null;
|
|
4789
|
+
bonding_rate?: number | null;
|
|
4790
|
+
recent_outcomes?: string | null;
|
|
4791
|
+
recent_bond_rate?: number | null;
|
|
4087
4792
|
}
|
|
4088
4793
|
/** `GET /deployer-hunter/recent-bonds` — tokens from tracked deployers that graduated. */
|
|
4089
|
-
export interface RecentBondsResponse {
|
|
4794
|
+
export interface RecentBondsResponse extends FreeTierDelayMeta {
|
|
4795
|
+
/** Launch-pipeline scope disclosure (absent ≠ clean). */
|
|
4796
|
+
coverage?: LaunchCoverage;
|
|
4090
4797
|
tokens: RecentBond[];
|
|
4091
4798
|
limit: number;
|
|
4092
4799
|
/** Pass back as `since` to fetch only newer bonds. */
|