@gamecore-api/sdk 0.17.1 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +134 -1
- package/dist/index.js +23 -2
- package/dist/types.d.ts +193 -0
- package/package.json +1 -1
package/dist/client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Announcement, AnnouncementBar, CartItem, CatalogSection, Category, CategoryInfo, CheckoutRequest, CheckoutResponse, CompleteWithBalanceResult, Conversation, ConversationDetail, CouponResult, ExchangeRates, Favorite, Game, GameDetail, GiftCard, LegalDocument, LevelStatus, Notification, Order, PagedGamesResponse, PlatformInfo, PaginatedResponse, PaymentInfo, PaymentMethod, Product, ProductFilters, ReferralCommission, ReferralLink, ReferralPerformance, ReferralStats, Review, ReviewCreateResult, ReviewStats, SearchResult, SiteConfig, SiteStats, SiteUIConfig, TelegramAuthResponse, TelegramBotLoginOptions, TelegramInitResponse, TelegramWidgetRenderOptions, TelegramWidgetUser, TopupMethod, TopupResponse, TopupStatus, Transaction, User, UserBalance, WebPushSubscriptionInput } from "./types";
|
|
1
|
+
import type { Announcement, AnnouncementBar, CartItem, CashbackPreview, CatalogSection, Category, CategoryInfo, CheckoutRequest, CheckoutResponse, CompleteWithBalanceResult, Conversation, ConversationDetail, CouponResult, DailyBonusClaimResult, DailyBonusStatus, ExchangeRates, Favorite, Game, GameDetail, GiftCard, LegalDocument, LevelStatus, Notification, Order, PagedGamesResponse, PlatformInfo, PaginatedResponse, PaymentInfo, PaymentMethod, Product, ProductFilters, PublicCoupon, Quest, QuestCompleteResult, ReferralCommission, ReferralLink, ReferralPerformance, ReferralStats, Review, ReviewCreateResult, ReviewProof, ReviewStats, ScreenshotsResponse, SearchResult, SiteConfig, SiteStats, SiteUIConfig, SystemRequirementsResponse, TelegramAuthResponse, TelegramBotLoginOptions, TelegramInitResponse, TelegramWidgetRenderOptions, TelegramWidgetUser, TopupMethod, TopupResponse, TopupStatus, Transaction, User, UserBalance, WebPushSubscriptionInput } from "./types";
|
|
2
2
|
export interface GameCoreOptions {
|
|
3
3
|
/** Site API key (gc_live_xxx or gc_test_xxx) */
|
|
4
4
|
apiKey: string;
|
|
@@ -39,6 +39,17 @@ export declare class GameCoreClient {
|
|
|
39
39
|
getTranslations: (locale?: string) => Promise<Record<string, string>>;
|
|
40
40
|
/** Get site UI config (header, footer, nav, trust pills) */
|
|
41
41
|
getUIConfig: () => Promise<SiteUIConfig>;
|
|
42
|
+
/**
|
|
43
|
+
* Per-site allowlist of partner origins permitted to iframe the
|
|
44
|
+
* storefront's checkout/widget pages. Wave 5 #58, available
|
|
45
|
+
* since gamecore-api 2026-05-01.
|
|
46
|
+
*
|
|
47
|
+
* Storefronts feed this list into their own
|
|
48
|
+
* `Content-Security-Policy: frame-ancestors` directive — this
|
|
49
|
+
* SDK call only fetches the data, it does not set the header
|
|
50
|
+
* itself (the storefront's edge / Next.js middleware does).
|
|
51
|
+
*/
|
|
52
|
+
getEmbedAllowlist: () => Promise<string[]>;
|
|
42
53
|
/** Get cookie consent config */
|
|
43
54
|
getCookieConsent: () => Promise<{
|
|
44
55
|
enabled: boolean;
|
|
@@ -106,6 +117,25 @@ export declare class GameCoreClient {
|
|
|
106
117
|
initTelegram: () => Promise<TelegramInitResponse>;
|
|
107
118
|
/** Poll Telegram auth status until authenticated or expired */
|
|
108
119
|
pollTelegramStatus: (token: string, intervalMs?: number) => Promise<User>;
|
|
120
|
+
/**
|
|
121
|
+
* Read the storefront's Telegram OpenID Connect config. Returns
|
|
122
|
+
* { enabled: false, clientId: null } when the tenant hasn't set
|
|
123
|
+
* up Web Login in BotFather (the SPA should fall back to the
|
|
124
|
+
* deep-link flow). When enabled, hand `clientId` to telegram-
|
|
125
|
+
* login.js to render the native consent card.
|
|
126
|
+
*/
|
|
127
|
+
getTelegramOidcConfig: () => Promise<{
|
|
128
|
+
enabled: boolean;
|
|
129
|
+
clientId: string | null;
|
|
130
|
+
}>;
|
|
131
|
+
/**
|
|
132
|
+
* Submit the RS256 id_token returned by telegram-login.js for
|
|
133
|
+
* server-side JWKS verification. On success the backend sets an
|
|
134
|
+
* auth cookie and returns the authenticated user, exactly like
|
|
135
|
+
* the Mini App / Widget verifiers. Optional `ref` threads a
|
|
136
|
+
* referral code through user creation on first login.
|
|
137
|
+
*/
|
|
138
|
+
telegramOidc: (idToken: string, ref?: string) => Promise<TelegramAuthResponse>;
|
|
109
139
|
/**
|
|
110
140
|
* Verify Telegram Mini App initData and issue a session cookie.
|
|
111
141
|
* Call this when your storefront is opened inside Telegram via the
|
|
@@ -343,6 +373,26 @@ export declare class GameCoreClient {
|
|
|
343
373
|
* server-side.
|
|
344
374
|
*/
|
|
345
375
|
getRecommendations: (gameSlug: string, limit?: number) => Promise<Game[]>;
|
|
376
|
+
/**
|
|
377
|
+
* Steam-sourced PC system requirements for a canonical game.
|
|
378
|
+
* Designed for `/games/<slug>/system-requirements` SEO landings.
|
|
379
|
+
* Returns `{ hasData: false }` for non-Steam games (and for
|
|
380
|
+
* Steam games Steam didn't return data for) so the frontend
|
|
381
|
+
* can branch without try/catch.
|
|
382
|
+
*
|
|
383
|
+
* Cached 7 days server-side; the very first request for a game
|
|
384
|
+
* fetches synchronously, subsequent stale reads serve cached
|
|
385
|
+
* data and refresh in the background. Available since
|
|
386
|
+
* gamecore-api 2026-05-01 (Wave 5 #50).
|
|
387
|
+
*/
|
|
388
|
+
getGameSystemRequirements: (gameSlug: string) => Promise<SystemRequirementsResponse>;
|
|
389
|
+
/**
|
|
390
|
+
* Steam-sourced screenshot gallery + trailers for a canonical
|
|
391
|
+
* game. Same `hasData` semantics as
|
|
392
|
+
* `getGameSystemRequirements`. Available since gamecore-api
|
|
393
|
+
* 2026-05-01 (Wave 5 #50).
|
|
394
|
+
*/
|
|
395
|
+
getGameScreenshots: (gameSlug: string) => Promise<ScreenshotsResponse>;
|
|
346
396
|
/** Get categories for a game with product counts and delivery metadata */
|
|
347
397
|
getCategories: (gameSlug: string) => Promise<Category[]>;
|
|
348
398
|
/** Get products for a game with optional filters */
|
|
@@ -437,6 +487,29 @@ export declare class GameCoreClient {
|
|
|
437
487
|
remove: (id: number) => Promise<void>;
|
|
438
488
|
/** Clear all cart items */
|
|
439
489
|
clear: () => Promise<void>;
|
|
490
|
+
/**
|
|
491
|
+
* Cashback preview for the current cart (Wave 5 #51, available
|
|
492
|
+
* since gamecore-api 2026-05-01). Returns the credit the
|
|
493
|
+
* authenticated user would receive after the cart is paid for,
|
|
494
|
+
* given the user's current loyalty level + per-site cashback
|
|
495
|
+
* rate.
|
|
496
|
+
*
|
|
497
|
+
* **Requires authentication** — the endpoint sits behind the
|
|
498
|
+
* same auth gate as the rest of `/cart/*`; calling it without
|
|
499
|
+
* a session throws `GameCoreError(401, 'UNAUTHORIZED')`. Show
|
|
500
|
+
* a "Войдите, чтобы получать кэшбэк" hint on the storefront
|
|
501
|
+
* and skip the request for anonymous users instead of
|
|
502
|
+
* catching the 401.
|
|
503
|
+
*
|
|
504
|
+
* For tenants that have not configured cashback rates the
|
|
505
|
+
* response is `totalAmount: 0` with a UX hint in
|
|
506
|
+
* `rateExplanation` rather than an error.
|
|
507
|
+
*
|
|
508
|
+
* Storefronts: call this near the checkout button to render a
|
|
509
|
+
* "+N бонусов" trigger. Cheap (1 SQL aggregate); call freely
|
|
510
|
+
* after add/remove without caching.
|
|
511
|
+
*/
|
|
512
|
+
getCashbackPreview: () => Promise<CashbackPreview>;
|
|
440
513
|
};
|
|
441
514
|
checkout: {
|
|
442
515
|
/**
|
|
@@ -519,6 +592,51 @@ export declare class GameCoreClient {
|
|
|
519
592
|
markRead: (id: number) => Promise<void>;
|
|
520
593
|
/** Mark all notifications as read */
|
|
521
594
|
markAllRead: () => Promise<void>;
|
|
595
|
+
/**
|
|
596
|
+
* Submit a screenshot of a review the user posted on a third-
|
|
597
|
+
* party platform (T-Bank, Otzyvru, Google Play, …). Lands in
|
|
598
|
+
* the moderator queue; once approved, the user gets a fixed
|
|
599
|
+
* payout to their balance.
|
|
600
|
+
*
|
|
601
|
+
* Available since gamecore-api 2026-05-01 (Wave 5 #56).
|
|
602
|
+
*/
|
|
603
|
+
submitReviewProof: (input: {
|
|
604
|
+
platform: string;
|
|
605
|
+
screenshotUrl: string;
|
|
606
|
+
reviewUrl?: string;
|
|
607
|
+
userNote?: string;
|
|
608
|
+
}) => Promise<ReviewProof>;
|
|
609
|
+
/** List the current user's review-proof submissions, newest first. */
|
|
610
|
+
getReviewProofs: () => Promise<ReviewProof[]>;
|
|
611
|
+
/**
|
|
612
|
+
* Daily-bonus status: whether the user can claim, current
|
|
613
|
+
* streak, projected reward, and `nextAvailableAt` cooldown
|
|
614
|
+
* timestamp. Available since gamecore-api 2026-05-01
|
|
615
|
+
* (Wave 5 #49).
|
|
616
|
+
*/
|
|
617
|
+
getDailyBonus: () => Promise<DailyBonusStatus>;
|
|
618
|
+
/**
|
|
619
|
+
* Claim the daily bonus. Atomic — concurrent claims race on a
|
|
620
|
+
* CAS check and only one wins; the loser sees a
|
|
621
|
+
* `cooldown_active` error. Reward formula:
|
|
622
|
+
* `base(10₽) * min(1 + streak*0.1, 3.0) * (0.5 + Math.random())`.
|
|
623
|
+
*/
|
|
624
|
+
claimDailyBonus: () => Promise<DailyBonusClaimResult>;
|
|
625
|
+
/**
|
|
626
|
+
* Quest catalog with the caller's progress folded in. Pass
|
|
627
|
+
* filters to narrow by `type` (daily/weekly/one_time) or
|
|
628
|
+
* lifecycle `status`.
|
|
629
|
+
*/
|
|
630
|
+
getQuests: (filter?: {
|
|
631
|
+
type?: "daily" | "weekly" | "one_time";
|
|
632
|
+
status?: "available" | "in_progress" | "completed" | "claimed";
|
|
633
|
+
}) => Promise<Quest[]>;
|
|
634
|
+
/**
|
|
635
|
+
* Claim a quest reward. Eligibility is rechecked server-side
|
|
636
|
+
* before crediting. Idempotent — a second claim returns
|
|
637
|
+
* `alreadyClaimed: true` with rewardAmount=0.
|
|
638
|
+
*/
|
|
639
|
+
completeQuest: (questCode: string) => Promise<QuestCompleteResult>;
|
|
522
640
|
/** Delete user account */
|
|
523
641
|
deleteAccount: () => Promise<void>;
|
|
524
642
|
/** Export user data (GDPR) */
|
|
@@ -614,6 +732,21 @@ export declare class GameCoreClient {
|
|
|
614
732
|
validate: (code: string, gameId?: string) => Promise<CouponResult>;
|
|
615
733
|
/** Get user's currently active coupon */
|
|
616
734
|
getActive: () => Promise<CouponResult | null>;
|
|
735
|
+
/**
|
|
736
|
+
* Public listing of active coupons applicable to a specific
|
|
737
|
+
* game. Designed for programmatic-SEO landings such as
|
|
738
|
+
* `/promocode/<gameSlug>`. Works without authentication; the
|
|
739
|
+
* api-key still has to be present so the response is scoped to
|
|
740
|
+
* the calling site.
|
|
741
|
+
*
|
|
742
|
+
* Each row carries either a code (when `isPublic === true` and
|
|
743
|
+
* the operator chose to expose it) or a hidden offer
|
|
744
|
+
* (`code: null, isPublic: false`) for cases where the storefront
|
|
745
|
+
* wants to advertise the discount without leaking the code.
|
|
746
|
+
*
|
|
747
|
+
* Available since gamecore-api 2026-05-01 (Wave 5 #54).
|
|
748
|
+
*/
|
|
749
|
+
getActiveForGame: (gameSlug: string) => Promise<PublicCoupon[]>;
|
|
617
750
|
};
|
|
618
751
|
referrals: {
|
|
619
752
|
/** Get referral dashboard stats */
|
package/dist/index.js
CHANGED
|
@@ -81,6 +81,7 @@ class GameCoreClient {
|
|
|
81
81
|
getThemeConfig: () => this.request("GET", "/site/theme"),
|
|
82
82
|
getTranslations: (locale = "ru") => this.request("GET", `/site/translations?locale=${locale}`),
|
|
83
83
|
getUIConfig: () => this.request("GET", "/site/ui-config"),
|
|
84
|
+
getEmbedAllowlist: () => this.request("GET", "/site/embed-allowlist"),
|
|
84
85
|
getCookieConsent: () => this.request("GET", "/site/cookie-consent"),
|
|
85
86
|
getCatalogSections: () => this.request("GET", "/site/catalog-sections"),
|
|
86
87
|
getBanners: () => this.request("GET", "/site/banners"),
|
|
@@ -107,6 +108,8 @@ class GameCoreClient {
|
|
|
107
108
|
}
|
|
108
109
|
}, intervalMs);
|
|
109
110
|
}),
|
|
111
|
+
getTelegramOidcConfig: () => this.request("GET", "/auth/telegram/oidc/config"),
|
|
112
|
+
telegramOidc: (idToken, ref) => this.request("POST", "/auth/telegram/oidc/callback", { idToken, ref }, { rawResponse: true }),
|
|
110
113
|
verifyMiniApp: (initData, ref) => this.request("POST", "/auth/telegram/miniapp", { initData, ref }, { rawResponse: true }),
|
|
111
114
|
verifyTelegramWidget: (data, ref) => this.request("POST", "/auth/telegram/widget", { ...data, ref }, { rawResponse: true }),
|
|
112
115
|
renderTelegramWidget: async (opts) => {
|
|
@@ -254,6 +257,8 @@ class GameCoreClient {
|
|
|
254
257
|
return this.request("GET", `/catalog/games/${slug}${qs}`);
|
|
255
258
|
},
|
|
256
259
|
getRecommendations: (gameSlug, limit = 8) => this.request("GET", `/catalog/games/${gameSlug}/recommendations?limit=${limit}`),
|
|
260
|
+
getGameSystemRequirements: (gameSlug) => this.request("GET", `/catalog/games/${gameSlug}/system-requirements`),
|
|
261
|
+
getGameScreenshots: (gameSlug) => this.request("GET", `/catalog/games/${gameSlug}/screenshots`),
|
|
257
262
|
getCategories: (gameSlug) => this.request("GET", `/catalog/games/${gameSlug}/categories`),
|
|
258
263
|
getProducts: (gameSlug, filters) => {
|
|
259
264
|
const qs = new URLSearchParams;
|
|
@@ -290,7 +295,8 @@ class GameCoreClient {
|
|
|
290
295
|
sync: (items) => this.request("POST", "/cart/sync", { items }),
|
|
291
296
|
merge: (items) => this.request("POST", "/cart/merge", { items }),
|
|
292
297
|
remove: (id) => this.request("DELETE", `/cart/${id}`),
|
|
293
|
-
clear: () => this.request("DELETE", "/cart")
|
|
298
|
+
clear: () => this.request("DELETE", "/cart"),
|
|
299
|
+
getCashbackPreview: () => this.request("GET", "/cart/cashback-preview")
|
|
294
300
|
};
|
|
295
301
|
checkout = {
|
|
296
302
|
create: (data, idempotencyKey) => this.request("POST", "/checkout", data, {
|
|
@@ -329,6 +335,20 @@ class GameCoreClient {
|
|
|
329
335
|
getUnreadCount: () => this.request("GET", "/profile/notifications/unread-count"),
|
|
330
336
|
markRead: (id) => this.request("POST", `/profile/notifications/${id}/read`),
|
|
331
337
|
markAllRead: () => this.request("POST", "/profile/notifications/read-all"),
|
|
338
|
+
submitReviewProof: (input) => this.request("POST", "/profile/review-proofs", input),
|
|
339
|
+
getReviewProofs: () => this.request("GET", "/profile/review-proofs"),
|
|
340
|
+
getDailyBonus: () => this.request("GET", "/profile/daily-bonus"),
|
|
341
|
+
claimDailyBonus: () => this.request("POST", "/profile/daily-bonus/claim"),
|
|
342
|
+
getQuests: (filter) => {
|
|
343
|
+
const qs = new URLSearchParams;
|
|
344
|
+
if (filter?.type)
|
|
345
|
+
qs.set("type", filter.type);
|
|
346
|
+
if (filter?.status)
|
|
347
|
+
qs.set("status", filter.status);
|
|
348
|
+
const q = qs.toString();
|
|
349
|
+
return this.request("GET", `/profile/quests${q ? `?${q}` : ""}`);
|
|
350
|
+
},
|
|
351
|
+
completeQuest: (questCode) => this.request("POST", `/profile/quests/${encodeURIComponent(questCode)}/complete`),
|
|
332
352
|
deleteAccount: () => this.request("POST", "/profile/delete-account"),
|
|
333
353
|
exportData: () => this.request("GET", "/profile/export"),
|
|
334
354
|
getSettings: () => this.request("GET", "/profile/settings"),
|
|
@@ -368,7 +388,8 @@ class GameCoreClient {
|
|
|
368
388
|
apply: (code) => this.request("POST", "/coupons/apply", { code }),
|
|
369
389
|
remove: () => this.request("DELETE", "/coupons/active"),
|
|
370
390
|
validate: (code, gameId) => this.request("POST", "/coupons/validate", { code, gameId }),
|
|
371
|
-
getActive: () => this.request("GET", "/profile/active-coupon")
|
|
391
|
+
getActive: () => this.request("GET", "/profile/active-coupon"),
|
|
392
|
+
getActiveForGame: (gameSlug) => this.request("GET", `/coupons/active?game=${encodeURIComponent(gameSlug)}`)
|
|
372
393
|
};
|
|
373
394
|
referrals = {
|
|
374
395
|
getStats: () => this.request("GET", "/referral/stats"),
|
package/dist/types.d.ts
CHANGED
|
@@ -377,6 +377,23 @@ export interface Product {
|
|
|
377
377
|
deliveryDataSchema: unknown[];
|
|
378
378
|
region?: string;
|
|
379
379
|
platform?: string;
|
|
380
|
+
/**
|
|
381
|
+
* Per-SKU variant metadata for the multi-SKU product picker.
|
|
382
|
+
* Available since gamecore-api 2026-05-01 (Wave 5 #52). All four
|
|
383
|
+
* fields are nullable — products without an operator-configured
|
|
384
|
+
* variant grouping leave them at `null` and the storefront falls
|
|
385
|
+
* back to single-SKU rendering.
|
|
386
|
+
*
|
|
387
|
+
* `riskTier` drives the badge ("Безопасно" / "Нужен логин" /
|
|
388
|
+
* "Полный доступ"); `warningMessage` is short copy under the
|
|
389
|
+
* variant tabs; `variantGroup` is an opaque key shared by SKUs
|
|
390
|
+
* that should be folded into one radio-group; `variantLabel` is
|
|
391
|
+
* the short tab title within that group.
|
|
392
|
+
*/
|
|
393
|
+
riskTier?: "safe" | "moderate" | "requires_credentials" | null;
|
|
394
|
+
warningMessage?: string | null;
|
|
395
|
+
variantGroup?: string | null;
|
|
396
|
+
variantLabel?: string | null;
|
|
380
397
|
}
|
|
381
398
|
export interface ProductFilters {
|
|
382
399
|
deliveryType?: string;
|
|
@@ -422,6 +439,81 @@ export interface CartItem {
|
|
|
422
439
|
*/
|
|
423
440
|
productIcon?: string | null;
|
|
424
441
|
}
|
|
442
|
+
/**
|
|
443
|
+
* Per-cart cashback preview surfaced by `gc.cart.getCashbackPreview()`.
|
|
444
|
+
* `totalAmount` is the credit (in site balance units) the
|
|
445
|
+
* authenticated user would receive after the cart is paid for at the
|
|
446
|
+
* current state.
|
|
447
|
+
*
|
|
448
|
+
* The endpoint requires authentication — `gc.cart.getCashbackPreview()`
|
|
449
|
+
* throws `GameCoreError(401)` for anonymous callers. Storefronts
|
|
450
|
+
* should skip the request when the user is not signed in instead of
|
|
451
|
+
* relying on a graceful empty response. For tenants whose cashback
|
|
452
|
+
* rates are not configured the API returns `totalAmount: 0` with a
|
|
453
|
+
* UX hint in `rateExplanation`.
|
|
454
|
+
*
|
|
455
|
+
* Available since gamecore-api 2026-05-01 (Wave 5 #51).
|
|
456
|
+
*/
|
|
457
|
+
export interface CashbackPreview {
|
|
458
|
+
totalAmount: number;
|
|
459
|
+
currency: "balance";
|
|
460
|
+
breakdown: Array<{
|
|
461
|
+
source: "level_base";
|
|
462
|
+
amount: number;
|
|
463
|
+
label: string;
|
|
464
|
+
}>;
|
|
465
|
+
rateExplanation: string;
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* One block of Steam-sourced PC requirements (minimum or recommended).
|
|
469
|
+
* Available since gamecore-api 2026-05-01 (Wave 5 #50).
|
|
470
|
+
*/
|
|
471
|
+
export interface SystemRequirementsBlock {
|
|
472
|
+
os?: string;
|
|
473
|
+
processor?: string;
|
|
474
|
+
memory?: string;
|
|
475
|
+
graphics?: string;
|
|
476
|
+
directX?: string;
|
|
477
|
+
storage?: string;
|
|
478
|
+
soundCard?: string;
|
|
479
|
+
additional?: string;
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Response from `gc.catalog.getGameSystemRequirements()`. `hasData`
|
|
483
|
+
* is false for non-Steam games and Steam games where Steam couldn't
|
|
484
|
+
* supply requirements — frontends should branch on this rather than
|
|
485
|
+
* treating an empty `minimum`/`recommended` as an error.
|
|
486
|
+
*/
|
|
487
|
+
export interface SystemRequirementsResponse {
|
|
488
|
+
hasData: boolean;
|
|
489
|
+
minimum: SystemRequirementsBlock;
|
|
490
|
+
recommended: SystemRequirementsBlock;
|
|
491
|
+
source: "steam";
|
|
492
|
+
fetchedAt: string;
|
|
493
|
+
}
|
|
494
|
+
export interface SteamScreenshot {
|
|
495
|
+
thumbnailUrl: string;
|
|
496
|
+
fullUrl: string;
|
|
497
|
+
order: number;
|
|
498
|
+
}
|
|
499
|
+
export interface SteamMovie {
|
|
500
|
+
thumbnailUrl: string;
|
|
501
|
+
webmUrl?: string;
|
|
502
|
+
mp4Url?: string;
|
|
503
|
+
title: string;
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* Response from `gc.catalog.getGameScreenshots()`. `hasData` mirrors
|
|
507
|
+
* the system-requirements semantics: false when no screenshots OR
|
|
508
|
+
* movies are available.
|
|
509
|
+
*/
|
|
510
|
+
export interface ScreenshotsResponse {
|
|
511
|
+
hasData: boolean;
|
|
512
|
+
screenshots: SteamScreenshot[];
|
|
513
|
+
movies: SteamMovie[];
|
|
514
|
+
source: "steam";
|
|
515
|
+
fetchedAt: string;
|
|
516
|
+
}
|
|
425
517
|
export interface CheckoutRequest {
|
|
426
518
|
email?: string;
|
|
427
519
|
items: Array<{
|
|
@@ -831,6 +923,107 @@ export interface CouponResult {
|
|
|
831
923
|
gameId?: number | null;
|
|
832
924
|
bonusAmount?: number;
|
|
833
925
|
}
|
|
926
|
+
/**
|
|
927
|
+
* Public-facing coupon entry returned by `gc.coupons.getActiveForGame()`.
|
|
928
|
+
* Designed for SEO landings (`/promocode/<gameSlug>`). `code` is `null`
|
|
929
|
+
* when the operator chose to advertise the offer without exposing the
|
|
930
|
+
* code itself (`isPublic === false`); the storefront still renders the
|
|
931
|
+
* card with `description`, validity window, and discount details.
|
|
932
|
+
*
|
|
933
|
+
* Available since gamecore-api 2026-05-01 (Wave 5 #54).
|
|
934
|
+
*/
|
|
935
|
+
export interface PublicCoupon {
|
|
936
|
+
code: string | null;
|
|
937
|
+
isPublic: boolean;
|
|
938
|
+
type: "bonus_balance" | "markup_discount";
|
|
939
|
+
value: number;
|
|
940
|
+
gameId: string | null;
|
|
941
|
+
description: string | null;
|
|
942
|
+
validFrom: string | null;
|
|
943
|
+
validUntil: string | null;
|
|
944
|
+
usagesLeft: number | null;
|
|
945
|
+
oneTimePerUser: boolean;
|
|
946
|
+
}
|
|
947
|
+
/**
|
|
948
|
+
* Daily-bonus claim status returned by `gc.profile.getDailyBonus()`.
|
|
949
|
+
* `available` is true when the cooldown has elapsed; `nextRewardAmount`
|
|
950
|
+
* is a preview of what the user would get on the next claim using
|
|
951
|
+
* the current streak. Available since gamecore-api 2026-05-01
|
|
952
|
+
* (Wave 5 #49).
|
|
953
|
+
*/
|
|
954
|
+
export interface DailyBonusStatus {
|
|
955
|
+
available: boolean;
|
|
956
|
+
currentStreak: number;
|
|
957
|
+
longestStreak: number;
|
|
958
|
+
nextRewardAmount: number;
|
|
959
|
+
nextAvailableAt: string | null;
|
|
960
|
+
streakMultiplier: number;
|
|
961
|
+
lastClaimedAt: string | null;
|
|
962
|
+
totalClaimedAmount: number;
|
|
963
|
+
}
|
|
964
|
+
export interface DailyBonusClaimResult {
|
|
965
|
+
claimedAmount: number;
|
|
966
|
+
newStreak: number;
|
|
967
|
+
newBalance: number;
|
|
968
|
+
nextAvailableAt: string;
|
|
969
|
+
}
|
|
970
|
+
/**
|
|
971
|
+
* Quest catalog entry returned by `gc.profile.getQuests()`.
|
|
972
|
+
* Status lifecycle:
|
|
973
|
+
* available → in_progress → completed → claimed
|
|
974
|
+
* `verificationMode` describes how the quest is checked:
|
|
975
|
+
* * `auto` — backend computes progress from order/event tables.
|
|
976
|
+
* * `trust` — storefront sends a click signal (TG/VK subscribe).
|
|
977
|
+
* * `manual` — admin moderates (e.g. tied to review-proof #56).
|
|
978
|
+
*
|
|
979
|
+
* Available since gamecore-api 2026-05-01 (Wave 5 #49).
|
|
980
|
+
*/
|
|
981
|
+
export interface Quest {
|
|
982
|
+
id: number;
|
|
983
|
+
code: string;
|
|
984
|
+
type: "daily" | "weekly" | "one_time";
|
|
985
|
+
category: string | null;
|
|
986
|
+
titleRu: string;
|
|
987
|
+
titleEn: string | null;
|
|
988
|
+
descriptionRu: string | null;
|
|
989
|
+
descriptionEn: string | null;
|
|
990
|
+
rewardAmount: number;
|
|
991
|
+
rewardCurrency: string;
|
|
992
|
+
verificationMode: "auto" | "trust" | "manual";
|
|
993
|
+
iconUrl: string | null;
|
|
994
|
+
status: "available" | "in_progress" | "completed" | "claimed";
|
|
995
|
+
progressCurrent: number;
|
|
996
|
+
progressRequired: number;
|
|
997
|
+
expiresAt: string | null;
|
|
998
|
+
}
|
|
999
|
+
export interface QuestCompleteResult {
|
|
1000
|
+
rewardAmount: number;
|
|
1001
|
+
newBalance: number;
|
|
1002
|
+
alreadyClaimed: boolean;
|
|
1003
|
+
}
|
|
1004
|
+
/**
|
|
1005
|
+
* Review-proof submission row returned by `gc.profile.getReviewProofs()`
|
|
1006
|
+
* and surfaced to admins via `gc.admin.reviewProofs.list()`. Available
|
|
1007
|
+
* since gamecore-api 2026-05-01 (Wave 5 #56).
|
|
1008
|
+
*
|
|
1009
|
+
* Status flow: pending → approved (gets `payoutAmount`) or rejected
|
|
1010
|
+
* (gets `moderatorNote`). Already-resolved rows cannot transition again.
|
|
1011
|
+
*/
|
|
1012
|
+
export interface ReviewProof {
|
|
1013
|
+
id: number;
|
|
1014
|
+
siteId: number;
|
|
1015
|
+
userId: number;
|
|
1016
|
+
platform: string;
|
|
1017
|
+
screenshotUrl: string;
|
|
1018
|
+
reviewUrl: string | null;
|
|
1019
|
+
userNote: string | null;
|
|
1020
|
+
status: "pending" | "approved" | "rejected";
|
|
1021
|
+
payoutAmount: number | null;
|
|
1022
|
+
moderatorNote: string | null;
|
|
1023
|
+
reviewedByUserId: number | null;
|
|
1024
|
+
reviewedAt: string | null;
|
|
1025
|
+
createdAt: string;
|
|
1026
|
+
}
|
|
834
1027
|
export interface ReferralStats {
|
|
835
1028
|
totalReferrals: number;
|
|
836
1029
|
lifetimeEarnings: number;
|