@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 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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gamecore-api/sdk",
3
- "version": "0.17.1",
3
+ "version": "0.19.0",
4
4
  "description": "TypeScript SDK for GameCore API — browser-safe, zero dependencies",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",