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

Record a development purchase

Records a simulated purchase from a debug build in development mode, at the product's development price, as a test purchase.

Use the test publishable key.

Guide: Install an SDK

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
  • Sync a store transaction POST
  • Sign a promotional offer 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.

PreviousSign a promotional offerNextEvaluate feature flags

On this page

AuthorizationHeader parametersRequest bodyExamplesResponse bodyErrorsMore in SDK
POST
/api/v1/sdk/development/purchase

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.

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.

Value in

  • "true"
  • "false"
x-is-debug-build*string

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

Value in

  • "true"
  • "false"
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.

Value in

  • "true"
  • "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.

Value in

  • "native"
  • "browser"
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.

Value in

  • "react-native"
  • "web"
  • "ios"
  • "android"
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.

devTransactionId*string

An id the SDK gives the simulated purchase; sending the same id again records it only once.

productSlug*string

The slug of the product bought.

purchaseDate*|

When the purchase was made, in milliseconds since the Unix epoch.

quantity?||

How many units were bought, a positive whole number; more than 1 only for consumable products. Defaults to 1.

Examples

curl -X POST "https://api.voidhash.com/api/v1/sdk/development/purchase" \  -H "x-distinct-id: user_8231" \  -H "x-publishable-key: vh_pk_..." \  -H "x-client-bundle-id: com.example.app" \  -H "x-is-backgrounded: true" \  -H "x-is-debug-build: true" \  -H "x-observer-mode: true" \  -H "x-platform: ios" \  -H "x-platform-flavor: native" \  -H "x-sdk: react-native" \  -H "x-sdk-version: 0.0.1-alpha.1" \  -H "Content-Type: application/json" \  -d '{    "devTransactionId": "5B1F0E7A-3C2D-4F8B-9A6E-1D4C7B2E9F03",    "productSlug": "pro_monthly",    "purchaseDate": 1773137700000  }'
{  "accepted": true,  "warning": null}
{  "_tag": "Api/SdkValidationError",  "message": "string"}
{  "_tag": "Api/AuthenticationError",  "cause": "string",  "message": "string"}
{  "_tag": "Api/SdkServiceError",  "cause": "string"}

Response body

application/json

application/json

application/json

application/json