Bluestacks · AsyncAPI Specification
Bluestacks Payments Webhooks
Version
View Spec
View on GitHub
CompanyGamingCloud GamingAndroidMobilePaymentsIn-App PurchasesSubscriptionsDeveloper PlatformApp DistributionAdvertisingOAuthAsyncAPIWebhooksEvents
AsyncAPI Specification
generated: '2026-08-08'
method: searched
source: https://docs.now.gg/nowstudio/payments
docs:
- https://docs.now.gg/nowstudio/payments
- https://docs.now.gg/nowstudio/webshop
summary: >-
now.gg's event surface is entirely OUTBOUND and inverted: rather than the publisher
subscribing to now.gg events, the publisher IMPLEMENTS an endpoint to now.gg's
published specification and registers its URL in nowStudio. now.gg then calls it.
There are two such contracts — SubscriptionStatusCallback (subscription lifecycle)
and PaymentsProcessingCallback (webshop order completion) — and they share one
payload envelope and one credential.
direction: provider-calls-publisher
delivery:
transport: HTTPS
method: POST
content_type: application/json
registration: >-
Callback URL is configured per app in nowStudio under Payment Settings (separately
for Subscriptions and for Webshop).
authentication:
scheme: apiKey
header: Authorization
name: Webhook API Key
issued_by: now.gg
where: nowStudio > View Details > Webhook API Key (viewable and regenerable)
note: >-
now.gg presents this key TO the publisher's endpoint; the publisher verifies it
to authenticate the caller. It is a shared secret in a header, not a signature —
there is no HMAC body signature and no timestamp/replay protection documented.
acknowledgement:
expected_status: 200
expected_body: '{"success": true}'
failure_body: '{"success": false, "reason": "reason_for_failure"}'
detail: >-
now.gg waits for the publisher's response. Anything other than HTTP 200 with
success true is retried "for some time" — the retry count, backoff and total
window are not published.
ordering: undocumented
deduplication: undocumented
signature: none
webhooks:
- name: SubscriptionStatusCallback
implemented_by: publisher
purpose: Subscription lifecycle status updates.
docs: https://docs.now.gg/nowstudio/payments
method: POST
headers:
- name: Authorization
value: <Webhook API Key>
- name: Content-type
value: application/json
events:
- name: WEBSHOP_ITEM_PURCHASED
description: Sent when a Webshop item is purchased.
- name: SUBSCRIPTION_PURCHASED
description: Sent when a Subscription is purchased.
- name: SUBSCRIPTION_RENEWED
description: Sent when a Subscription is renewed.
- name: SUBSCRIPTION_CANCELLED
description: Sent when a Subscription is cancelled.
- name: SUBSCRIPTION_EXPIRED
description: Sent when a Subscription has expired.
payload:
notificationType:
type: string
description: The event name, one of the values enumerated above.
data:
orderId:
type: string
example: '1-202402110116343'
description: Order ID associated with the purchase order.
packageName:
type: string
example: gg.now.sample.app
productId:
type: string
example: SampleProduct
eventTime:
type: long
example: 1752895192000
description: Epoch timestamp of the order in milliseconds.
expiryTime:
type: long
example: 1707965194000
description: Epoch milliseconds when the subscription expires or renews.
amount:
type: float
example: 24.99
isTestOrder:
type: boolean
currency:
type: string
example: USD
paymentId:
type: string
example: '1234'
developerPayload:
type: string
example: '{UID: abc}'
description: Developer-specified supplemental information carried through the order.
testable: true
test_tool: nowStudio > Payments > Testing Webhook
- name: PaymentsProcessingCallback
implemented_by: publisher
purpose: Webshop order completion, so the publisher can grant the purchased product.
docs: https://docs.now.gg/nowstudio/webshop
method: POST
headers:
- name: Authorization
value: <Webhook API Key>
- name: Content-type
value: application/json
events:
- name: WEBSHOP_ITEM_PURCHASED
description: Sent when the user's payment is completed.
payload:
notificationType:
type: string
enum:
- WEBSHOP_ITEM_PURCHASED
data:
orderId:
type: string
example: '1-202402110116343'
packageName:
type: string
example: gg.now.sample.app
productId:
type: string
example: SampleProduct
eventTime:
type: long
example: 1707965194000
paymentId:
type: string
completion_rule: >-
now.gg marks the purchase order completed only after receiving HTTP 200 with
success true.
asyncapi_published: false
asyncapi_derived: bluestacks-payments-asyncapi.yml
gaps:
- No AsyncAPI, JSON Schema or Postman collection is published for either callback.
- No body signature (HMAC) and no timestamp — a leaked Webhook API Key is fully
replayable.
- Retry policy is described qualitatively ("for some time") with no numbers.
- WEBSHOP_ITEM_PURCHASED is documented on BOTH callbacks with different data fields
(the subscription variant adds amount, currency, isTestOrder, expiryTime and
developerPayload), and the docs do not say which one a webshop purchase actually
hits when both callbacks are configured.
- No event ID, no delivery ID, and no documented deduplication key.