---
title: Google Play
nav: Google Play
description: The Android Publisher endpoints used, the scope and permissions required, and the limits of what the provider can do.
group: integrations
order: 1
status: shipped
updated: 2026-09-21
---

Google Play is the only store supported today. The adapter targets the Android Publisher v3 API.

## Authentication

A service-account JSON key, exchanged for an access token on the single scope:

```
https://www.googleapis.com/auth/androidpublisher
```

The token is minted inside the credential vault, and authenticated requests execute there. The key never reaches the application runtime.

## Endpoints used

| Operation                   | Method and path                                                               |
| --------------------------- | ----------------------------------------------------------------------------- |
| List subscriptions          | `GET applications/{package}/subscriptions`                                    |
| List one-time products      | `GET applications/{package}/oneTimeProducts`                                  |
| List subscription offers    | `GET applications/{package}/subscriptions/{id}/basePlans/{id}/offers`         |
| List purchase-option offers | `GET applications/{package}/oneTimeProducts/{id}/purchaseOptions/{id}/offers` |
| Convert regional prices     | `POST applications/{package}/pricing:convertRegionPrices`                     |

The vault allows exactly these shapes and nothing else. A request that does not match one is refused before it leaves the boundary, with _"Google operation is not allowed."_ Query parameters are restricted to `pageSize` and `pageToken`.

Price conversion is a **read**. It asks Google what a price would convert to; it sets nothing.

## Permissions

One OAuth scope covers every call above, so scope is never the cause of a permission failure. What differs is the **Play Console permission** granted to the service account.

This distinction produces the most common support question:

> Imported, but Google's store baseline could not be read for 2 plan(s): The caller does not have permission

A read-only grant — _View app information and download bulk reports_ — is enough to list subscriptions and one-time products. It is **not** enough to call the monetization pricing endpoint. So the catalogue imports correctly and only the baseline column comes back empty.

The fix is in Play Console under **Users and permissions**: grant the service account the monetization permission on the affected apps, wait a few minutes for propagation, then re-sync. Confirm the exact permission name against your console, as Google has renamed these.

To check independently, call `pricing:convertRegionPrices` directly with the same service account. Google's full error body sometimes distinguishes _"The caller does not have permission"_ (a permission grant) from _"This developer account does not own the application"_ (the wrong account entirely); Paywall Parity only relays the summary message.

## Capabilities

| Capability                | Supported  |
| ------------------------- | ---------- |
| Regional price conversion | Yes        |
| Regional price publishing | Yes, gated |
| Read-back verification    | Yes        |

## Retries and failures

`429` and `5xx` are retried up to three times with exponential backoff. `4xx` responses other than `429` are not retried — they will not succeed on a second attempt.

Response bodies are truncated and parsed for `error.message` before surfacing. Unstructured provider bodies are never returned to the client.

## Limits to know about

- **Subscription price changes apply to new customers.** Existing subscribers are governed by Google's own policy and consent rules. Deployments say this explicitly rather than leaving it implied.
- **Conversion is anchored on the US price.** A plan not sold in the United States has no baseline.
- **Region versions matter.** Each conversion response carries a region version, stored with the baseline. Baselines from different region versions are not directly comparable.
- **Live minimum, maximum, and billable-unit validation is not implemented.** Rounding uses the market registry's increments, not Google's live constraints, so a rounded price is not yet guaranteed to be a valid store price point.
