Manage one-time products using the modern Google Play monetization API.
gpc one-time-products <subcommand> [options]This is the newer replacement for the legacy in-app products API (gpc iap). Use this for new products.
Product Commands
gpc otp list
List all one-time products.
gpc otp list
gpc otp list --sort productId2
gpc otp get <product-id>
Get details of a specific product.
gpc otp get premium_upgradegpc otp create --file <path>
Create a new one-time product from a JSON file.
gpc otp create --file product.jsongpc otp update <product-id> --file <path>
Update an existing product. The updateMask is automatically derived from the provided fields, and regionsVersion defaults to 2022/02.
gpc otp update premium_upgrade --file updated.jsonSpecify an explicit update mask to limit which fields are updated, or a newer regional pricing version:
gpc otp update premium_upgrade --file updated.json --update-mask listings
gpc otp update premium_upgrade --file updated.json --regions-version 2025/012
gpc otp delete <product-id>
Delete a one-time product. Requires confirmation.
gpc otp delete premium_upgrade
gpc otp delete premium_upgrade --yes # Skip confirmation2
Offer Commands
gpc otp offers list <product-id>
List all offers for a product.
gpc otp offers list premium_upgradegpc otp offers get <product-id> <offer-id>
Get details of a specific offer.
gpc otp offers get premium_upgrade launch_discount --purchase-option buy_oncegpc otp offers create <product-id> --file <path>
Create a new offer for a product.
gpc otp offers create premium_upgrade --file offer.json --purchase-option buy_oncegpc otp offers update <product-id> <offer-id> --file <path>
Update an existing offer. The updateMask is automatically derived, and regionsVersion defaults to 2022/02 (override with --regions-version).
gpc otp offers update premium_upgrade launch_discount --file offer-update.json --purchase-option buy_once
gpc otp offers update premium_upgrade launch_discount --file offer-update.json --update-mask pricingPhases
gpc otp offers update premium_upgrade launch_discount --file offer-update.json --regions-version 2025/012
3
gpc otp offers delete <product-id> <offer-id>
Delete an offer. Requires confirmation.
--purchase-option is required for single-offer commands
Google Play only serves batch endpoints for one-time product offers, so offers get, offers create, offers update, and offers delete are sent as single-item batch requests and need a concrete purchase option ID. Omitting --purchase-option on those four commands fails immediately as a missing-option error, before any API call. The - wildcard works only with offers list; run that first if you do not know which purchase option an offer belongs to.
Offer Creation Payload
When creating an offer with gpc otp offers create, the JSON file describes pricing phases, eligibility criteria, and regional overrides.
{
"offerId": "launch_discount",
"pricingPhases": {
"pricingPhases": [
{
"recurrenceMode": "NON_RECURRING",
"billingPeriod": "",
"price": {
"currencyCode": "USD",
"units": "0",
"nanos": 990000000
}
}
]
},
"targeting": {
"acquisitionRule": {
"scope": {
"anySubscriptionInApp": true
}
}
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Regional Pricing in Offers
Override prices per region by adding regionalConfigs to the offer payload. Each entry maps a region code to a price override:
{
"offerId": "regional_promo",
"regionalConfigs": {
"US": {
"newSubscriberAvailability": true,
"price": { "currencyCode": "USD", "units": "4", "nanos": 990000000 }
},
"GB": {
"newSubscriberAvailability": true,
"price": { "currencyCode": "GBP", "units": "3", "nanos": 990000000 }
},
"JP": {
"newSubscriberAvailability": true,
"price": { "currencyCode": "JPY", "units": "700", "nanos": 0 }
},
"IN": {
"newSubscriberAvailability": true,
"price": { "currencyCode": "INR", "units": "349", "nanos": 0 }
},
"BR": {
"newSubscriberAvailability": true,
"price": { "currencyCode": "BRL", "units": "24", "nanos": 990000000 }
}
},
"pricingPhases": {
"pricingPhases": [
{
"recurrenceMode": "NON_RECURRING",
"billingPeriod": "",
"price": { "currencyCode": "USD", "units": "4", "nanos": 990000000 }
}
]
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Use gpc pricing convert to generate region prices from a single base price, then merge the output into your offer JSON.
gpc otp offers cancel <product-id> <offer-id>
Permanently cancel an offer. Unlike deactivate (which is reversible), cancel is permanent and cannot be undone.
gpc otp offers cancel premium_upgrade launch_discountgpc otp offers batch-get <product-id> --file <path>
Batch get multiple offers (max 100).
gpc otp offers batch-get premium_upgrade --file offer-ids.jsongpc otp offers batch-update <product-id> --file <path>
Batch create or update multiple offers (max 100).
gpc otp offers batch-update premium_upgrade --file updates.json --dry-rungpc otp offers batch-update-states <product-id> --file <path>
Batch activate, deactivate, or cancel multiple offers.
gpc otp offers batch-update-states premium_upgrade --file states.jsongpc otp offers batch-delete <product-id> --file <path>
Batch delete multiple offers.
gpc otp offers batch-delete premium_upgrade --file delete-ids.jsonPurchase Option Batch Commands
gpc otp purchase-options batch-delete <product-id> --file <path>
Batch delete purchase options across one or multiple products.
gpc otp purchase-options batch-delete premium_upgrade --file delete-requests.jsongpc otp purchase-options batch-update-states <product-id> --file <path>
Batch activate or deactivate purchase options.
gpc otp purchase-options batch-update-states premium_upgrade --file state-requests.jsongpc otp diff <product-id> --file <path>
Compare a local JSON file against the remote one-time product state. Shows field-level differences.
gpc otp diff premium_upgrade --file product.jsonOutput shows each field that differs between local and remote. Use --output json for structured diff output.
Options
| Option | Type | Description |
|---|---|---|
--file | string | Path to JSON file |
--update-mask | string | Comma-separated field mask (for update commands) |
--regions-version | string | Regional pricing version (create/update commands, default 2022/02) |
--purchase-option | string | Purchase option ID. Required on offers get/create/update/delete; defaults to "-" (all) on offers list |
--sort | string | Sort field for list output |
--output | string | Output format |
--app | string | App package name |
Related
- purchase-options -- Purchase option management for one-time products
- iap -- Legacy in-app products API
- subscriptions -- Subscription management
- purchases -- Purchase verification and management
- pricing -- Regional price conversion
