VoidhashDocs
DevelopersHelp centerGuidesAPI reference
Dashboard
Essentials
API overview
Authentication
Event capture
Push device API
Webhooks
Webhook delivery
Webhook events
Projects & keys
Projects
API keys
Audit log
Customers & access
Persons
Products
Perks
Sandbox
Paywalls
Paywalls
Paywall locations
Components
Component registry
Assets
Experiments & flags
Experiments
Feature flags
Analytics & events
Analytics
Analytics alerts
Cohorts
Group types
Groups
Events
Ingest policy
VoidQL
Tracking domains
Ads
Ads
Ad accounts
Meta measurement
Payments & stores
Payment providers
Payment provider products
Purchase history imports
Payment sources
Webhooks & notifications
Webhooks
Push notifications
Push configurations
Automations
Organization & team
Organizations
Members
Invitations
Billing
Your account
Profile
Session
Notices
Connected apps
Terms of Service
Developer tools
Schema
SDK
Retrieve the person
Identify a person
Update the person's attributes
Sync a store transaction
Sign a promotional offer
Record a development purchase
Evaluate feature flags
Resolve a paywall
Retrieve the SDK schema
Register a push device
Refresh a push device
Unregister a push device

Sync a store transaction

Reports a store transaction from the device.

Voidhash verifies it with the store, records the purchase and grants its perks. One client address may send 300 a minute per project; past that the answer is 429 with a Retry-After header. Fails with Api/SdkTransactionRejectedError when the store can never accept the transaction as sent.

Guide: Install an SDK

POST
/api/v1/sdk/sync-transaction

Authorization

x-publishable-key<token>

A project publishable key, which ships inside apps. Send the end user's distinct id in x-distinct-id with it.

In: header

Header parameters

x-distinct-id*string

The distinct id of the end user the request acts for: the anonymous vh_anon_… id the SDK generated, or the id the app identified them with. At most 255 characters.

x-distinct-id-encoding?"percent"

percent when x-distinct-id holds the RFC 3986 percent-encoded UTF-8 form of an id that is not printable ASCII; leave it out when the header holds the id as is.

Value in

  • "percent"
x-publishable-key*string

The project's publishable key, vh_pk_…. A test key, vh_pk_test_…, works with store sandbox and test purchases.

x-client-bundle-id*string

The app's bundle id on iOS or package name on Android, which picks the project's store configuration for purchases and promotional offers. At most 255 characters.

Lengthlength <= 255
x-client-locale?string

The end user's most preferred locale, such as en-US.

x-client-version?string

The app's version, such as 2.4.1.

x-is-backgrounded?string

true when the app sent the request from the background, otherwise false.

x-is-debug-build?string

true when the app is a debug build, otherwise false. Only debug builds can make simulated development purchases.

x-nonce?string

A random id, new for every request, such as a lowercase UUID.

x-observer-mode?string

true when the SDK runs in observer mode: another billing integration owns purchases and the SDK only reports them. Otherwise false.

x-platform?string

The platform the app runs on, such as ios, android or web. Records where a new person signed up.

x-platform-brand?string

The device's manufacturer, such as Apple or Google.

x-platform-device?string

The device's model, such as iPhone15,2; in a browser, its navigator.platform.

x-platform-flavor?string

native in an app, browser in a web page.

x-platform-flavor-version?string

The version of the app hosting the SDK; native SDKs send the app's version, the web SDK leaves it out.

x-platform-version?string

The operating system's version, such as 17.4; in a browser, its user agent.

x-preferred-locales?string

The end user's preferred locales, most preferred first, separated by commas, such as en-US,de-DE.

x-sdk?string

The SDK making the request: ios, android, react-native or web. A native SDK driven by another reports the outer one, such as react-native.

x-sdk-version?string

The version of the SDK making the request, such as 1.4.0.

x-storefront?string

The app store storefront (country) the end user buys from, when the SDK knows it.

Request body

application/json

TypeScript definitions

Use the request body type in TypeScript.

An App Store transaction for the server to verify with Apple and record.

platform*"ios"

An App Store transaction.

Value in

  • "ios"
transactionId*string

StoreKit's transaction id, a decimal integer.

intent?|

Why the SDK reports the transaction: restore for a restore the end user asked for, which may share or move a purchase another user owns as the project's paid access sharing setting allows; sync (the default) for anything else, which records it for this user.

paywallContext?|

The paywall the purchase was made on, when the SDK started it from one.

Examples

curl -X POST "https://api.voidhash.com/api/v1/sdk/sync-transaction" \  -H "x-distinct-id: user_8231" \  -H "x-publishable-key: vh_pk_..." \  -H "x-client-bundle-id: com.example.app" \  -H "Content-Type: application/json" \  -d '{    "platform": "ios",    "transactionId": "2000000123456789",    "paywallContext": {      "showingId": "pw_loc_show_q2w8e4r6t1y9u3i7o5p0a2s4",      "placement": "onboarding-end",      "paywallId": "pw_r3t6y9u2i5o8p1a4s7d0f3g6"    }  }'
{  "accepted": true,  "pendingProductLink": false}
{  "_tag": "Api/SdkValidationError",  "message": "string"}
{  "_tag": "Api/AuthenticationError",  "cause": "string",  "message": "string"}
{  "_tag": "Api/SdkTransactionRejectedError",  "reason": "string"}
{  "_tag": "Api/SdkRateLimitedError",  "message": "string"}
{  "_tag": "Api/SdkServiceError",  "cause": "string"}

Response body

application/json

application/json

application/json

application/json

application/json

application/json

Errors

This operation adds no error codes of its own. It can fail with the errors every operation shares, such as unauthenticated; see Errors.

More in SDK

  • Retrieve the person GET
  • Identify a person POST
  • Update the person's attributes POST
  • Sign a promotional offer POST
  • Record a development purchase POST
  • Evaluate feature flags POST
  • Resolve a paywall POST
  • Retrieve the SDK schema GET
  • Register a push device POST
  • Refresh a push device POST
  • Unregister a push device POST

Something wrong or missing on this page? Tell us by email or on Discord.

PreviousUpdate the person's attributesNextSign a promotional offer

On this page

AuthorizationHeader parametersRequest bodyExamplesResponse bodyErrorsMore in SDK