What's new
New SDK and platform features, newest first.
May 2026
Unity and Godot: recurring subscriptions (beta)
The Unity and Godot SDKs now support recurring subscriptions, mirroring the HTML5 subscription API. Call GetSubscriptions() / get_subscriptions() on startup to read the catalog and each subscription's current "active" / "inactive" entitlement, then call BeginSubscription(sku) / begin_subscription(sku) to open the checkout flow. Cancellation is handled via CancelSubscription(sku) / cancel_subscription(sku), which opens a platform confirmation dialog. This feature is in beta — the API may change without notice. Contact the Jest team before shipping subscriptions to production.
Responses include a signed JWT (SubscriptionSigned / subscription_signed, Signed / signed) for server-side entitlement verification — see the HTML5 subscriptions docs for verification examples.
See Unity subscriptions and Godot subscriptions. Subscriptions are configured in the Developer Console.
HTML5: recurring subscriptions (beta)
The HTML5 SDK now supports recurring subscriptions via JestSDK.payments.getSubscriptions() and JestSDK.payments.beginSubscription({ subscriptionSku }). This feature is in beta — the API may change without notice. Contact the Jest team before shipping a subscription to production. Subscriptions are configured per game in the Developer Console (under Manage Game > Subscriptions) and returned alongside the wallet's current "active" / "inactive" entitlement, so a single startup call tells your game both what's on offer and what the player already has. Like one-off purchases, every response is also returned as a signed JWT (signed / subscriptionSigned) for server-side verification.
const { subscriptions } = await JestSDK.payments.getSubscriptions();
for (const subscription of subscriptions) {
if (subscription.status === "active") {
unlockFeaturesFor(subscription.sku);
}
}
Referral notification templates in Unity and Godot SDKs
OpenDialogOptions.NotificationTemplates (Unity) and JestReferralOptions.notification_templates (Godot) let you attach notification templates to a referral campaign. When an invited player converts, the platform looks up the template with the highest MinConversionCount / min_conversion_count that the referrer has reached and sends a randomly selected variant from within it — so you can send a different message for a referrer's first conversion versus their fifth.
Each template variant takes a body, optional title, optional image_reference, and a cta_text. Templates are evaluated server-side at conversion time; no SDK call is needed on the referrer's side.
See Unity referrals and Godot referrals.
Unity and Godot: GetProfile() returns username and avatar URL
Unity (2.0.0) and Godot (1.5.0) expose JestSDK.Instance.Social.GetProfile(avatarSize) / JestSDK.social.get_profile(avatar_size) for player profile data, mirroring the HTML5 SDK's social.getProfile(). The method returns a typed Social.PlayerProfile (Unity) / JestPlayerProfile (Godot) object with both Username/username and AvatarUrl/avatar_url in one call. Avatar URLs are Cloudflare-proxied and available at five sizes (64, 128, 256, 512, or 1000 px). Returns null for guests and registered players who haven't set up a profile yet.
// Unity
Social.PlayerProfile profile = JestSDK.Instance.Social.GetProfile(128);
if (profile != null)
{
nameLabel.text = profile.Username;
// load profile.AvatarUrl with UnityWebRequestTexture
}
# Godot
var profile: JestPlayerProfile = JestSDK.social.get_profile(128)
if profile != null and not profile.avatar_url.is_empty():
# load profile.avatar_url
pass
GetPlayerAvatar() / get_player_avatar() is deprecated — migrate to GetProfile(). See Unity social and Godot social.
Add a hero video to your store listing
Game listings on the Explore page can now show a looping hero video instead of the static hero image. Upload a video showcase asset (MP4 or MOV) in your game's Image Library, then open the Overview tab, click Edit, and select it in the new Hero Video (Optional) field. The video auto-plays when the card scrolls into view and falls back to the hero image on any playback error. Library cards always use the hero image.
To remove a previously set video, click Clear next to the picker. Videos that are currently assigned as the hero video are protected from archiving.
See Manage games.
Social module — player profile and bot avatars
JestSDK.social is a new module for player-facing social data. social.getProfile() returns the current player's username and avatar URL; request the avatar at one of five sizes (64, 128, 256, 512, or 1000 px) to fit your UI and keep network use lean. Both fields may be null for guests and players who haven't set up a profile yet.
const url = JestSDK.social.getBotAvatar({ username: "bot", size: 128 });
const profile = JestSDK.social.getProfile({ avatarSize: 128 });
const username = profile?.username ?? "You";
const avatarUrl = profile?.avatarUrl ?? placeholderUrl;
See Social. Equivalent bot avatar helpers are also available in the Unity and Godot SDKs with the same size options and deterministic username-to-avatar mapping.
Notifications: assetReference, critical priority, and changed default
Three changes to scheduleNotification in the HTML5 SDK:
assetReferenceis now the preferred field for attaching a notification asset. Unlike the deprecatedimageReference, it accepts both images and videos from your asset library. Update existing calls to useassetReference;imageReferencestill works as a fallback but will be removed in a future release.'critical'is now a valid priority level alongside'low','medium', and'high'.- Default priority has changed from
'medium'to'low'. If your code omitspriorityand relied on the'medium'default, add an explicitpriority: 'medium'to preserve the previous behavior.
See the HTML5 notifications reference.
Register self-hosted game URLs as versions
You can now register an externally hosted URL as a game version instead of uploading a ZIP bundle. In the Versions tab, click Add Version and choose Add self-hosted URL, then enter your version number and the full URL where your game is served. The platform loads that URL verbatim in the iframe.
Self-hosted versions behave identically to bundled versions: you can activate them immediately on create, set them active later from the Versions tab, and preview them before going live. Versions list rows show a Self-hosted badge and display the registered URL on hover.
Game description capped at 110 characters
The game Description field now enforces a 110-character limit. The Developer Console returns a validation error if you submit a description longer than 110 characters when creating or updating a game.
Descriptions that were saved before this limit was introduced will be automatically truncated to 110 characters when displayed to players in the Explore section and on the game info popup. If your game's current description is longer than 110 characters, shorten it in the Developer Console to control exactly how it reads after truncation.
Store listing logo and hero image now use the asset library
The Logo and Hero image fields in the game edit form now draw from your asset library instead of accepting a direct file upload. Open the picker, select any approved showcase image with the matching crop — 1:1 for the logo, 16:9 for the hero — or upload a new showcase asset inline and it will be available to select once processing completes.
Showcase images auto-approve on upload, so there is no manual review wait before you can apply one to your store listing. Assets currently in use as a logo or hero are protected from archiving until you replace them.
See Manage games and Manage images.
Updated character limits on notification fields
Three character limits on scheduleNotification have changed:
ctaText— raised from 25 to 50 characters.title— new cap of 200 characters (previously unlimited).body— new cap of 2000 characters (previously unlimited).
The SDK enforces all three at call time and throws INVALID_ARGUMENTS when a value exceeds its limit. If you build notification content dynamically, check that title and body values stay within the new bounds. See the HTML5, Unity, and Godot notification references.
Simulator pre-loads real products and assets for existing games
When you open the Simulator for an existing game, it now automatically loads your real product catalog and asset library from the platform. Previously you had to register asset references and configure products by hand in the Config panel at the start of each session. For existing games that manual step is no longer needed — the checklist's asset-reference validation runs against your live library with no setup required. See Testing with the Simulator.
Run any build in the Simulator directly from the Versions tab
Each version in the Versions tab now has a Run in simulator button. Clicking it opens the Simulator with that build pre-loaded — no need to open the Simulator separately and re-select the game and version by hand. This is separate from the Self Review action: use it for quick test-drives where you don't need a recorded play-through. See Testing with the Simulator.
Submitting for review now routes through the Simulator
When you click Submit for review on a game's edit page, the console now routes you through a dedicated Simulator page instead of submitting immediately. Play through your game's must-have flows there, optionally record the session, and then confirm submission — the recording and any notes you add are attached to the version and visible to reviewers alongside the build.
The Simulator checklist is now organized into two tiers: Must-have (required to publish on Jest.com) and Highly recommended (required for Jest Games Fund applicants; strongly recommended for everyone). New must-have rules cover: no unhandled SDK errors, calling getPlayer() or getPlayerSigned(), checking for incomplete purchases on startup, and completing recovered purchases. A new recommended rule checks that each scheduled notification includes an imageReference or assetReference.
See Testing with the Simulator and Submit a game for review.
April 2026
Products and purchases now expose price and currency
PurchaseData and product objects returned by the SDK now include two new fields: price (the purchase amount as a decimal in the stated currency) and currency (ISO 4217 code, e.g. "USD"). Use these to display prices correctly rather than deriving them from credits.
The credits field is deprecated and will be removed in a future release. Migrate your price display logic to use price + currency:
// HTML5
const products = await JestSDK.payments.getProducts();
products.forEach((p) => {
displayPrice(p.price, p.currency); // e.g. 9.99, "USD"
});
See the HTML5, Unity, and Godot payments references for the updated field tables.
Unity SDK 1.7.0 and Godot SDK 1.3.0
Follow-ups to the custom registration overlay landing in the engine wrappers:
onClosecallback in overlay options — the UnityRegistrationOverlay.Options.OnCloseand GodotJestRegistrationOverlayOptions.on_closemirror the HTML5 SDK'sonCloseoption. Wires straight into the options object so you don't need a separatehandle.OnClose/handle.closedsubscription.- Convenience wrappers —
JestSDK.Instance.ShowRegistrationOverlay()(Unity) andJestSDK.show_registration_overlay()(Godot) are shorter paths to the same flow. Both forms remain supported. - Unity guard —
Show()(and the new wrapper) now throwInvalidOperationExceptionwhen the player is already registered, matching the HTML5 SDK.
See the Unity and Godot platform login guides for usage.
Unity SDK 1.6.0 and Godot SDK 1.2.0
The engine wrappers are caught up with the client SDK. Highlights:
- Notification
title— new optional title line shown above the body. - Notification
assetReference/asset_reference— preferred replacement forimageReference/image_reference. The old field is still honored but marked deprecated. criticalnotification priority — joinslow,medium,high.- Custom registration overlay —
JestSDK.Instance.RegistrationOverlay.Show()(Unity) andJestSDK.registration_overlay.show()(Godot) bring the game-rendered registration flow from the HTML5 SDK to both engine wrappers. See the Unity and Godot platform login guides for usage.
Full notes in the Unity CHANGELOG and Godot CHANGELOG.
Virality guide
A new guide covering how referrals, invites, and social hooks work together on Jest — written for teams thinking about how their game spreads rather than just which API to call. See Guides → Virality.
Launch checklist
A single checklist of everything we recommend you verify before submitting a game for review — SDK init, notifications, payments, assets, sandbox testing. Run it as a final pass before you go live. See Launch checklist.
Notifications now use a 3:2 aspect ratio
The notification image format has moved to 3:2. Upload at 3:2 directly or let the platform crop from the ratios you already have — see the notifications SDK guide.
Player profiles
Player profile data — username and avatarUrl — is accessible via JestSDK.social.getProfile(). Guests and players who haven't set up a profile return null. Request the avatar at 64, 128, 256, 512, or 1000 px to suit your UI. See Social.
Dynamic Open Graph image for notification link previews
When a notification link is unfurled (in SMS previews, share sheets, or social clients), the platform now generates a matching Open Graph image dynamically per notification rather than reusing one generic image — your notifications look right wherever the link gets shared. See the notifications SDK guide.
Spot sandbox purchases at a glance
In the developer console's transactions list, rows from sandbox users are now tinted and the player ID carries a tooltip calling it out. There's also a new Hide sandbox transactions filter so you can look at real revenue only. Useful when you're mid-QA and don't want test purchases crowding the view you'd show a stakeholder — see Sandbox users.
Build your own registration overlay
You can now replace Jest's default sign-up popup with a custom overlay rendered by your game — handy when you want the sign-up moment to feel native rather than like a modal. Your overlay is responsible for collecting input and calling back into the SDK to complete registration; the full reference covers the overlay hooks, the callback contract, and how to fall back to Jest's default UI. See Platform login.
Auto-generated image ratios for notification assets
Upload one image per notification and the platform now generates the other required aspect ratios for you. No more exporting 1:1, 16:9, and 3:2 copies by hand — upload your best frame and we'll crop and fit the rest. You can still upload each ratio manually if you want full control; see the notifications SDK guide.
Guests can purchase without signing up
Guest players now have their own wallet, so a purchase no longer requires a completed sign-up. The purchase attaches to the guest wallet, and if the guest later signs up, the wallet is merged into the registered account automatically.
If your game gates products behind isRegistered, you can drop that
check for paid products — the payment flow handles guests on its own.
See the Payments SDK guide for the updated flow.
Godot SDK documentation is live
If you're building with Godot, the SDK integration guide is now published alongside the HTML5 and Unity references. Covers player identity, notifications, entry payloads, referrals, payments, and the loading screen. Head to SDK → Godot to get started.
March 2026
Unity: compressed builds and new InitOptions
Two things for the Unity SDK this week:
- Compressed Unity builds are now supported end-to-end — you can ship smaller build artifacts without special handling in the host page.
InitOptionsis documented, including the newautoLoginRemindersflag that controls whether the SDK schedules abandonment reminders automatically.
See SDK → Unity3D for the updated init surface.
Opt out of auto-triggered login popups
Some games want to control exactly when the login prompt appears — for
example, after a first level ends rather than on load. The SDK now takes
an option to disable its automatic platform login popups, leaving you to
trigger sign-in manually via the usual SDK call. Set the flag at
init() time; see Platform login for the
exact option name and default.
Asset Library now handles video
The old Image Library has been renamed Asset Library and learned to store videos alongside images. Upload an MP4 in the same place you used to upload PNGs; downstream consumers pick the right asset by type. See Manage images for the updated upload flow.
Revenue share estimate on product purchase
The SDK's product-purchase view now surfaces an estimated revenue share alongside price, so you can show players (or yourself) what a given product nets at a glance. The number is an estimate — final attribution runs server-side. See the Payments SDK guide.
Financial reports on your game page
A new Financials tab on each game page lists transactions with stat cards up top (gross, net, by period) and date-range context on every row. The grouping and table design were reworked at the same time — same data, much easier to read. See Manage games.
In-app purchases are now generally available
The IAP feature flag has been removed — in-app purchases are on by default for every registered player. If you were waiting for a green light to ship IAP in your game, this is it. See the Payments SDK guide.
Notifications now carry a title
Notifications have a title property in addition to the body text, and
the field is wired through the whole pipeline — scheduling, rendering,
and analytics. Set it when composing a notification to give the preview
a distinct headline. See the
notifications SDK guide.
Keywords on games
You can now tag games with keywords from the developer console. Keywords feed discovery and categorization downstream — pick a handful that describe the game's core fantasy and genre. See Manage games.
Expose game transitioning to the SDK
Games can now observe transition events (when a player moves between games on the platform) through the SDK, so you can pause audio, persist state, or pre-fetch on incoming handoff. See the Player API reference for the event hooks.
getPlayerSigned works for guests
getPlayerSigned() no longer throws for guest players — it returns a
signed payload for whichever identity is available, guest or registered.
If you were branching on isRegistered before calling it, you can drop
that guard. See the Player API reference.
Categories on games
Games now have a category field alongside keywords. Pick one from the predefined list when you create or edit a game; it feeds the same discovery surfaces keywords do. See Manage games.