Skip to content
Docs · Reference

Godot SDK reference

The Godot monetization SDK reference. Every PowerUp method, static helper and signal by area, plus the storefront, offer button and disclosure classes.

Updated

This is the Godot monetization SDK reference for PowerUp 0.2.0: every public method, static helper, signal and property of the PowerUp autoload, and the public functions of the three classes that ship with it. The SDK is plain GDScript for Godot 4, with no GDExtension or native module. The addon lives in addons/powerup/, and enabling it registers the PowerUp autoload. For a first integration, read getting started before this page.

The autoload has 70 methods, 10 static helpers and 16 signals. The classes add PowerUpStorefront (1 method, 2 signals), PowerUpOfferButton (1 method, 1 signal) and PowerUpDisclosure (91 static functions). Functions whose names start with an underscore are private and left out.

How calls work

Every method that talks to the server is a coroutine that returns a Dictionary with ok, except three older ones listed under entitlements. On success the data sits under a named key (storefront, home, claim…). On failure the result carries error (a message for you, not the player), code (what to branch on) and, when they apply, status, details, retry_after and idempotency_key. The error reference lists every code.

var res: Dictionary = await PowerUp.claim_quest(quest.key)
if res.ok:
	_show_reward(PowerUpDisclosure.reward_text(res.claim.reward))
else:
	match res.code:
		"not_completed":
			pass  # the button should not have been enabled
		_:
			push_warning("%s (%s)" % [res.error, res.code])

Three more rules hold across the whole SDK:

  • Calls that spend or grant take an idempotency_key. Leave it empty and the SDK makes one, then returns it in the result. Pass the same key to retry the same player action, and the server answers with its stored reply instead of acting twice.
  • Player calls need a token. Without one they fail at once with player_token_required, before any request. See players and accounts.
  • Time comes from the server. Every answer carries the server's time, and the SDK keeps it against Godot's monotonic clock. Count down with seconds_until(), never the device clock.

Setup

MethodReturnsWhat it does
initialize(key: String, player: String, options: Dictionary = {})voidSets the publishable key, the player's client id and the options below. baseUrl is required: there is no default host.
is_initialized()boolWhether the key, client id and base URL are all set.
set_transport(transport: Callable)voidSends every request to your function instead of over HTTP, for tests and demos. Callable() goes back to HTTP.

The options for initialize():

OptionDefaultMeaning
baseUrlnoneThe API base URL, from the console under Integrations → SDK.
jurisdiction""Sent with storefront requests when set.
verbosefalseLogs each failure as a warning.
platformdetectedweb, ios, android or desktop. A web export in a phone browser is web.
clientthe SDK's name and versionA label for your build, such as "mygame/1.0.0".
appVersionthe project's application/config/versionYour build's version. Items with version rules are matched against it; without one, only items every version has are listed.
playerToken""A saved token, same as set_player_token().
draftConfigfalseServe the unpublished draft instead of the published config. Test keys only.

Identity and account

MethodReturnsWhat it does
register_player(client_id: String, display_name: String = "")DictionaryRegisters this install and gets its player token, handed out once. {ok, status, player, token_issued}.
set_player_token(token: String)voidUses a token saved earlier. An empty string clears it.
fetch_me()DictionaryThe player as the server sees them: {ok, me} with the player, wallet, perks and subscription.
set_birth_year(birth_year: int, idempotency_key: String = "")DictionaryAnswers the age prompt, once per player. {ok, age}.
create_transfer_code()DictionaryAn 8-character code that moves the account, valid 15 minutes, single use. {ok, status, transfer_code}.
redeem_transfer_code(code: String, merge: bool = true, confirmed: bool = false)DictionaryMoves this install onto the code's account, merging its own account in once the player has confirmed the preview.
redeem_recovery_code(code: String, merge: bool = true, confirmed: bool = false)DictionaryThe same for a 16-character recovery code, which is spent when it works.
redeem_code(code: String, merge: bool = true, confirmed: bool = false)DictionaryOne entry field for both kinds of code, told apart by length.
create_recovery_code(idempotency_key: String = "")DictionaryA long-lived recovery code, shown once. Replaces the previous one. {ok, status, recovery_code, idempotency_key}.
fetch_recovery_code_status()DictionaryWhether a recovery code is active, when it was made and when one was last used. Never the code.
delete_account(idempotency_key: String = "")DictionaryDeletes the account and lists every subscription still billing. {ok, deletion, idempotency_key}.

The flows behind these are on players and accounts.

Store and collection

MethodReturnsWhat it does
fetch_storefront()DictionaryEvery live offer for this player, with its disclosures resolved and any reason it can't be bought. {ok, storefront}. Fires storefront_loaded or storefront_failed.
fetch_catalog(category: String = "all")DictionaryThe item collection: what's owned and how, how to get the rest, coin prices and version support. {ok, catalog}.
buy_item(item_key: String, expected_price: int, idempotency_key: String = "")DictionaryBuys an item with coins at the price the player saw. A different price is refused, never charged. {ok, bought}.
claim_free_offer(offer_key: String, idempotency_key: String = "")DictionaryClaims a free offer. Too soon answers cooldown, too often today daily_cap. {ok, claim}.

How to build a store screen on these is on the storefront.

Lobby and progression

MethodReturnsWhat it does
fetch_home()DictionaryEverything the lobby needs in one call: wallet, perks, pass, events, quests, news, badges, club, vault and recent runs. Fires home_loaded, badges_changed and wallet_changed.
fetch_progress()DictionaryOnline progress totals from match reports: XP overall and per item, and best records. Levels are yours to compute.
badges_seen(surface: String)DictionaryClears a lobby badge. Call it when that screen opens.
badge_count(surface: String)intA surface's badge count as last seen, already capped by the server.
fetch_passes()DictionaryThe current pass with every tier (the starter pass until it's finished, then the live season), plus the star bank.
claim_pass(pass_key: String, tier: int = 0, track: String = "", idempotency_key: String = "")DictionaryClaims one tier and track, or everything claimable when both are left empty.
last_chance_seen(pass_key: String)DictionaryRecords that the last-chance prompt was shown. It isn't offered again for 24 hours.
fetch_quests()DictionaryStarter, daily, weekly, season and event quests, with what's claimable.
claim_quest(quest_key: String, period_key: String = "", idempotency_key: String = "")DictionaryClaims a completed quest.
fetch_events()DictionaryLive events, and past ones still in their replay window.
claim_event_level(event_key: String, level: int, idempotency_key: String = "")DictionaryClaims a completed event level.
collect_vault(idempotency_key: String = "")DictionaryMoves the Premium coin vault into the wallet.

News and clubs

MethodReturnsWhat it does
fetch_news()DictionaryThe news inbox this player is shown, pinned items first.
read_news(news_key: String, idempotency_key: String = "")DictionaryMarks an item read and grants its gift, once however often it's read.
list_clubs(query: String = "", limit: int = 20)DictionarySearches clubs by name, and returns the create price and the preset descriptions.
create_club(club_name: String, badge_icon: int = 0, badge_color: int = 0, description_idx: int = 0, join_policy: String = "open", idempotency_key: String = "")DictionaryCreates a club for its coin price and joins it as owner.
get_club(club_id: String)DictionaryOne club, its members and this week's standing.
join_club(club_id: String, idempotency_key: String = "")DictionaryJoins a club.
leave_club(idempotency_key: String = "")DictionaryLeaves the player's club. The rejoin cooldown starts.
remove_club_member(club_id: String, member_id: String, idempotency_key: String = "")DictionaryThe owner removes a member.
fetch_club_tournament(limit: int = 50)DictionaryThis week's club tournament: standings, the player's club and the reward brackets.
report_club(club_id: String, reason: String = "name", idempotency_key: String = "")DictionaryReports a club for its name or another reason.

Match tickets and boosts

MethodReturnsWhat it does
request_match_ticket(request: Dictionary, idempotency_key: String = "")DictionaryA signed ticket for the next online match, for your game server. Gives up after 2.5 seconds, so a slow server never holds a player at the Play button.
authorize_boost(kind: String, source: String, options: Dictionary = {}, idempotency_key: String = "")DictionaryA Start Big or Revive token, paid by a free use, a charge, an ad or coins.
use_cube_offline(count: int = 1, run_id: String = "", idempotency_key: String = "")DictionaryPays for 1 to 10 Boost Cubes in an offline run.
void_cube_offline(use_id: String, reason: String = "", idempotency_key: String = "")DictionaryRefunds an offline cube that couldn't start, within 60 seconds of the use.
void_cube_offline_by_key(use_idempotency_key: String, reason: String = "", idempotency_key: String = "")DictionaryThe same, for a use whose answer never arrived, named by the key it was sent with.

Ads

MethodReturnsWhat it does
fetch_ads_config()DictionaryThe ads this player may see now, the privacy flags to give your ad SDK, and the interstitial pacing to enforce.
create_ad_session(placement_key: String, context: Dictionary = {}, idempotency_key: String = "")DictionaryOpens a session before a rewarded ad. Every check runs here, before the ad is shown.
complete_ad_session(session_id: String, provider: String, reward_earned: bool = true, idempotency_key: String = "")DictionaryReports the ad shown. The session comes back granted with its reward, pending while the network verifies, or rejected.
poll_ad_session(session_id: String)DictionaryA session's state while server-side verification is pending.
report_impressions(events: Array)DictionaryReports up to 50 interstitial and banner impressions, so the server can audit the pacing.

Payments

MethodReturnsWhat it does
start_checkout(sku_key: String, ui_mode: String = "popup", return_origin: String = "", idempotency_key: String = "")DictionaryWeb and desktop: creates a Stripe Checkout. Call it when the product sheet opens, not on Pay.
open_checkout(checkout: Dictionary, same_tab: bool = false)boolOpens that checkout. Call it synchronously inside the Pay button's handler, or the browser blocks the popup.
open_url(url: String)boolOpens a link outside the game, such as a subscription's manage page, inside a tap.
checkout_status(checkout_id: String)DictionaryA checkout's state. Poll it while the player pays. Fires checkout_completed once.
create_purchase_intent(sku_key: String, idempotency_key: String = "")DictionaryiOS and Android: runs the purchase checks before the store sheet opens and returns the ids to hand the store.
submit_receipt(provider: String, payload: Dictionary, idempotency_key: String = "")DictionarySettles an App Store or Google Play transaction, and says whether to finish it now.
restore(provider: String, payload: Variant, idempotency_key: String = "")DictionaryRestore Purchases: brings durable items and subscriptions back to this account. Up to 50 at a time.
fetch_subscription()DictionaryThe subscription granting perks now, or null, with where to manage it.
subscription_portal(return_origin: String = "")DictionaryStripe only: a fresh billing-portal link, the web subscriber's way to cancel.
purchase(sku_key: String, idempotency_key: String = "")DictionaryA test purchase. Test keys only: real money goes through the methods above.

The order these run in, per platform, is on payments.

Entitlements, evidence and guards

MethodReturnsWhat it does
fetch_entitlements()ArrayEverything the player owns, and refills the local cache. Returns [] on failure.
fetch_player()DictionaryThe player record with wallets and recent purchases. Returns {} on failure.
record_evidence(action: String, subject: String)voidLogs a disclosure your own UI rendered. Fire and forget: it never blocks play.
is_entitled(item: String)boolA local lookup in the entitlement cache, by item key.
entitlements()DictionaryA copy of the cache, keyed by item key.
spend_limit_notice()StringThe monthly spend cap line from the last storefront, or empty.
age_gated()boolWhether the last storefront was withheld for the player's age. Render the store read-only then.

Server clock

MethodReturnsWhat it does
server_now_unix()floatNow on the server's clock, in unix seconds. Before the first answer it's the device clock.
has_server_clock()boolWhether a server time has been seen yet.
seconds_until(iso: Variant)intWhole seconds until a server end time. 0 once passed, -1 when there's no time to count to. Draw no countdown for -1.

Static helpers

These are static and need no instance, so they work in tests and tool scripts too.

FunctionReturnsWhat it does
detect_platform()Stringweb, android, ios, or desktop for everything else.
new_idempotency_key()StringA random UUID. Make one per player action and reuse it when retrying that action.
normalize_transfer_code(raw: String)StringThe 8 characters the server reads from a typed transfer code, or "".
normalize_recovery_code(raw: String)StringThe 16 characters the server reads from a typed recovery code, or "".
code_kind(raw: String)String"transfer", "recovery" or "", by the typed code's length.
checkout_return_id()StringWeb: the checkout id a same-tab checkout came back with, removed from the address bar. "" elsewhere.
page_origin()StringWeb: this page's origin. "" elsewhere.
checkout_poll_delay(attempt: int)floatSeconds to wait before poll number attempt: 3, 3, 5 and 8, then every 10.
iso_to_unix(iso: String)floatAn ISO-8601 time to unix seconds, keeping milliseconds and time zone offsets.
unix_to_iso(unix: float)StringUnix seconds to an ISO-8601 UTC time.

Signals

SignalFires when
storefront_loaded(storefront: Dictionary)fetch_storefront() answered.
storefront_failed(reason: String)fetch_storefront() failed.
purchase_completed(result: Dictionary)A test purchase() succeeded.
purchase_failed(reason: String)A test purchase() failed.
entitlements_loaded(entitlements: Array)fetch_entitlements() answered.
player_loaded(player: Dictionary)fetch_player() answered.
evidence_recorded(action: String)record_evidence() sent an entry.
request_failed(endpoint: String, reason: String)Any request didn't succeed: network failures and server errors alike.
player_token_issued(token: String)A new token arrived, from register_player() or a redeemed code. Save it.
wallet_changed(wallet: Dictionary)A call moved the wallet: a coin buy, a claim, a checkout, a reward.
home_loaded(home: Dictionary)fetch_home() answered.
badges_changed(badges: Array)The lobby badges changed: fetch_home(), badges_seen(), or a switch of account.
checkout_completed(result: Dictionary)checkout_status() saw a checkout complete. Once per checkout.
receipt_verified(result: Dictionary)submit_receipt() settled a store transaction.
player_adopted(external_id: String, token: String)A redeemed code moved this install onto another account. Save both as the new identity.
account_deleted(result: Dictionary)delete_account() answered. Forget the saved token.

Properties and constants

The autoload's public properties: api_key, player_id, jurisdiction, base_url, verbose, platform, client, app_version, player_token and draft_config (set by initialize() and the identity calls), and the last answer of each read, kept so a screen can redraw without another request: last_storefront, last_catalog, last_home, last_progress, last_ads_config, last_news, last_clubs and badges.

It also has 28 constants. The ones a game reads most:

ConstantValue
SDK_VERSION"0.2.0"
REQUEST_TIMEOUT_SECONDS15.0, the ceiling on any request
TICKET_TIMEOUT_SECONDS2.5, when request_match_ticket() gives up
BADGE_SURFACESquests, pass, events, news, store, collection, clubs
RUN_MODESunranked, ranked, party, event
BOOST_KINDS / BOOST_SOURCESstart_big, revive / premium_free, inventory, ad, coins
AD_PROVIDERS / AD_FORMATSnone, test, admob, h5 / rewarded, interstitial, banner
CHECKOUT_UI_MODESpopup, redirect
STORE_PROVIDERSapple, google
MAX_RESTORE50 purchases per restore() call
TRANSFER_CODE_LENGTH / RECOVERY_CODE_LENGTH8 / 16
CLUB_NAME_MIN / CLUB_NAME_MAX3 / 20 characters

PowerUpStorefront

A ready-made store screen: a VBoxContainer that fetches the storefront, builds a PowerUpOfferButton per offer in a grid, and shows the monthly spend cap line when it applies.

MemberKindWhat it does
load_offers()method, voidFetches and renders the offers. Safe to call again: the grid is rebuilt, not appended to.
columnsexport, int = 3Columns in the offer grid.
show_spend_limitexport, bool = trueWhether to show the spend cap line.
offer_purchased(result: Dictionary)signalA purchase from the grid succeeded. The grid reloads.
offer_failed(reason: String)signalA purchase from the grid was declined.

Its buy button calls purchase(), which works with test keys only. Use it to prototype a store; for real money, wire your own buttons to the flow on payments.

PowerUpOfferButton

A Button that draws one offer through the disclosure guards. It won't show a value badge the server didn't verify, won't run a countdown for an offer with no end time, and disables itself for an offer with no price, with missing subscription terms, or past its end, showing the reason on the card.

MemberKindWhat it does
configure(new_offer: Dictionary)method, voidSets the offer (one entry of the storefront's offers) and redraws.
offerproperty, DictionaryThe offer it shows.
offer_pressed(offer: Dictionary)signalThe player tapped a buyable offer.

PowerUpDisclosure

Pure static functions that turn server answers into the words a player reads, and refuse to draw what the rules don't allow. They take Dictionaries exactly as the SDK returns them, so they're easy to unit test without a scene tree. There are 91 of them, plus 30 constants such as BLOCKING (the text for each reason an offer can't be bought), TRANSFER_CODE_WARNING and RECOVERY_CODE_NOTICE.

Offers, prices and subscriptions

FunctionReturnsWhat it does
can_render_badge(offer: Dictionary)boolWhether a value badge may show: only when the server verified it against a real baseline offer.
badge_text(offer: Dictionary)StringThe badge, such as "1.15× value", or "" when it may not show.
badge_text_for(offer: Dictionary, ratio: float = 0.0)Stringbadge_text(), hidden when the store's own price ratio is more than 2% off the server's.
can_render_countdown(offer: Dictionary)boolWhether the offer has a real end time to count down to.
seconds_remaining(offer: Dictionary, now_unix: int = 0)intSeconds until the offer ends, or -1.
display_price(offer: Dictionary, localized: String = "")StringThe price as the player pays it. A store's localized price wins. "" when the card may not show one.
price_line(offer: Dictionary)StringSame as display_price(offer).
coins_granted(offer: Dictionary)intThe coins a purchase grants.
coins_line(offer: Dictionary)String"1,200 coins", or "".
usd_line(offer: Dictionary)StringThe coins' real-money value at the disclosed rate, or "".
currency_line(offer: Dictionary)StringThe coin amount with its real-money value beside it.
bonus_line(offer: Dictionary)StringA Premium coin bonus on its own line. It never feeds the value badge.
period_label(subscription: Dictionary)StringThe billing period as a word, such as "month".
subscription_complete(offer: Dictionary, localized: String = "")boolWhether a subscription carries every term its card must show.
subscription_lines(offer: Dictionary, localized: String = "")Array[String]Price per period, renewal, how to cancel and any trial, or [] when a term is missing.
perk_lines(offer: Dictionary)Array[String]The perks a subscription card lists.
blocking_text(reason: Variant)StringWhat a card says instead of a buy button for the server's reason.
blocking_short(reason: Variant)StringThe same, short enough for a button.
blocking_reason(offer: Dictionary, localized: String = "")StringWhy this offer can't be bought now, or "".
is_purchasable(offer: Dictionary, localized: String = "")boolWhether blocking_reason() is empty.
terms_line(offer: Dictionary)StringRenewal and cancel terms, for older subscription answers.
direct_purchase_notice(offer: Dictionary, rail: Variant = "", sandbox: bool = false)StringA "currency only" line when real-money offers exist but none can be paid on this device.
age_gated(storefront: Dictionary)boolWhether the store was withheld for the player's age.
spend_limit_notice(storefront: Dictionary)StringThe monthly spend cap line, or "".

Rewards, items and progression

FunctionReturnsWhat it does
reward_text(reward: Variant)StringA reward as a chip: "50 coins", "5 ★" or an item name.
unlock_line(route: Variant, names: Dictionary = {})StringHow to get an item, as one line, such as "Buy for 900 coins".
unlock_short(route: Variant)StringThe same, card-sized.
sub_status_line(sub: Variant)StringA subscription's state: "Renews Oct 31" or "Ends Oct 31".
known_metric(metric: Variant)boolWhether metric_text() can describe a quest goal.
metric_text(metric: Variant, target: Variant, filters: Variant = {}, species_names: Dictionary = {})StringA quest or event goal as a sentence, such as "Get 7 kills in one game".
countdown_allowed(ends_at: Variant, server_now: Variant)boolWhether a countdown may be drawn: a real end, still ahead on the server clock.
date_text(iso: Variant)StringA time as "Oct 23, 2026, 08:21 UTC".
pass_close_rule(pass_out: Variant)StringWhat happens to unclaimed rewards when the pass ends.
reward_line(reward: Variant, bank_cap: int = -1)StringA reward, saying so when its stars wait in the star bank.
star_bank_notice(star_bank_cap: Variant)StringThe star bank line for a player with no current pass.
premium_locked_notice(entry: Variant)StringA premium reward reached without premium, shown the moment it's earned.
premium_locked_lines(entries: Variant)Array[String]premium_locked_notice() for each entry.
last_chance_allowed(pass_out: Variant, localized: String = "")boolWhether the end-of-season prompt may be drawn at all.
last_chance_lines(pass_out: Variant, localized: String = "")Array[String]Every line of that prompt, ending with the promise that declining keeps everything earned.
quest_text(quest: Variant, species_names: Dictionary = {})StringA quest as the sentence the player reads. A quest without text is never drawn.
event_level_text(level: Variant, species_names: Dictionary = {})StringAn event level as a sentence.
progress_text(entry: Variant)StringProgress such as "3 / 5", never past the target.
auto_granted_line(entry: Variant)StringA quest reward added automatically at a reset.
event_gate_text(event: Variant)StringWhat a gated event's button says before the tap.

Boosts and ads

FunctionReturnsWhat it does
boost_name(kind: Variant)String"Start Big", "Revive" or "Boost Cube".
boost_mode_allowed(boost: Variant, mode: String)boolWhether a boost's chip may show in this mode. Ranked is off by default.
boost_price_line(boost: Variant, kind: String)StringThe coin price, shown before the tap.
boost_source_lines(boost: Variant, balance: int = -1)Array[String]Every way to pay for a boost now, in order: free use, charge, ad, coins.
boost_blocked_text(boost: Variant)StringWhy coins and ads are closed for this boost.
boost_refusal_text(code: Variant)StringA refused boost's code in the player's words.
ticket_start_big_notice(ticket: Variant)StringA refused Start Big on a match ticket, saying nothing was charged.
cube_offer_line(cube: Variant, effect: String)StringA Boost Cube offer with its effect and price, before paying.
in_play_line(wallet: Variant)StringCoins held for open matches, such as "30 coins in play".
ad_reward_text(placement: Variant, run_coins: int = 0)StringWhat a rewarded ad gives, named before the ad.
ad_reward_prompt(placement: Variant, run_coins: int = 0)StringThe Watch button's words, with the reward in them.
ad_unavailable_text(placement: Variant)StringWhy a rewarded ad isn't offered now.
interstitial_due(ads: Variant, state: Dictionary)boolWhether an interstitial may show now, by the pacing the server sent.

Subscriptions, receipts and store prices

FunctionReturnsWhat it does
cancel_line(offer_or_rail: Variant)StringWhere to cancel a subscription.
manage_line(sub: Variant)StringWhere this subscriber manages and cancels: the billing page, the App Store or Google Play.
manage_button_text(sub: Variant)StringThe Manage button's words, or "".
manage_url(sub: Variant)StringThe store's subscriptions page, or "". Stripe links come from subscription_portal().
manage_elsewhere_line(sub: Variant, platform: String)StringFor a store subscription seen on another platform: where it's managed.
receipt_line(receipt: Variant)StringWhat the player reads after submit_receipt().
restore_summary(restore: Variant)String"Restored 2 purchases." or "Nothing to restore."
restore_skipped_lines(restore: Variant)Array[String]Why each skipped purchase didn't come back.
checkout_line(status: Variant)StringThe line a waiting checkout sheet shows.
store_price(offer: Dictionary, store_prices: Dictionary)StringThe store's localized price for an offer sold in a store sheet.
store_amount(offer: Dictionary, store_prices: Dictionary)floatThe store's amount, in its currency's units.
localized_prices(offers: Array, store_prices: Dictionary)DictionaryEvery store-sold offer's localized price, by offer key.
store_has_product(offer: Dictionary, store_prices: Dictionary)boolWhether the store returned this offer's product. Hide it when not.
store_ratio(offer: Dictionary, offers: Array, store_prices: Dictionary)floatThe value ratio the store's own prices give.
store_badge_text(offer: Dictionary, offers: Array, store_prices: Dictionary)Stringbadge_text_for() with that ratio.

News, clubs and accounts

FunctionReturnsWhat it does
news_cta_text(item: Variant)StringA news item's button words, or "" for none.
news_gift_line(gift: Variant)StringWhat a news read granted.
club_create_price_line(clubs: Variant, balance: int = -1)StringThe create button with its price, before the tap.
club_refusal_text(code: Variant, details: Variant = {})StringA refused club call in the player's words.
club_rejoin_line(clubs: Variant)StringWhen a player who left may join a club again.
club_last_week_line(club: Variant)StringLast week's tournament result, for the lobby.
bracket_line(bracket: Variant)StringOne tournament reward bracket.
transfer_code_display(raw: Variant)StringA typed transfer code in the shape it's shown, for the entry field.
transfer_code_complete(raw: Variant)boolWhether a whole transfer code has been typed.
account_code_display(raw: Variant)StringOne field for either kind of code, in groups of four.
account_code_kind(raw: Variant)String"transfer", "recovery" or "" for what the field holds.
recovery_status_line(status: Variant, saved_created_at: Variant = null)StringThe recovery code line for Settings.
transfer_expiry_line(seconds_left: int)StringUnder a shown transfer code: how long it lasts.
transfer_refusal_text(code: Variant, details: Variant = {})StringA refused redeem in the player's words.
transfer_preview_lines(details: Variant)Array[String]The merge preview to show before the player confirms, with the warning.
transfer_done_text(merged: Variant)StringWhat came along after a transfer.
delete_billing_lines(deletion: Variant)Array[String]After a deletion: one line per subscription still billing, with where to cancel.
coins_text(n: int)String"1 coin" or "1,240 coins".
thousands(n: int)String1240 as "1,240".

Questions

Which PowerUp calls do I need to await?

Every method that talks to the server is a coroutine, so await it to get its Dictionary. The ones that answer straight away are initialize, is_initialized, set_transport, set_player_token, badge_count, open_checkout, open_url, record_evidence (fire and forget), is_entitled, entitlements, spend_limit_notice, age_gated, the three clock methods and the static helpers.

Can I run the SDK without a server, for tests or a demo build?

Yes. set_transport() sends every request to a function of yours instead of over HTTP, and the addon ships a folder of recorded answers from buggs.io's demo game that you can serve from it.

Where do I get the addon?

It isn't public yet. There's no public repository or Asset Library listing. Studios get the addon and their keys with early access, and the API base URL and keys are in the console under Integrations → SDK.

See it running on a real game.

We’ll walk you through the console with buggs.io’s setup.