Google Play
by @byungkyu
Google Play Developer API (Android Publisher) integration with managed OAuth. Manage apps, subscriptions, in-app purchases, and reviews. Use this skill when...
clawhub install google-playπ About This Skill
name: google-play description: | Google Play Developer API (Android Publisher) integration with managed OAuth. Manage apps, subscriptions, in-app purchases, and reviews. Use this skill when users want to interact with Google Play Console programmatically. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). compatibility: Requires network access and valid Maton API key metadata: author: maton version: "1.0" clawdbot: emoji: π§ requires: env: - MATON_API_KEY
Google Play
Access the Google Play Developer API (Android Publisher) with managed OAuth authentication. Manage app listings, subscriptions, in-app purchases, reviews, and more.
Quick Start
# List in-app products
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/google-play/androidpublisher/v3/applications/{packageName}/inappproducts')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Base URL
https://api.maton.ai/google-play/{native-api-path}
Maton proxies requests to androidpublisher.googleapis.com and automatically injects your OAuth token.
Authentication
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Getting Your API Key
1. Sign in or create an account at maton.ai 2. Go to maton.ai/settings 3. Copy your API key
Connection Management
Manage your Google OAuth connections at https://api.maton.ai.
List Connections
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=google-play&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Create Connection
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'google-play'}).encode()
req = urllib.request.Request('https://api.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Get Connection
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "{connection_id}",
"status": "ACTIVE",
"creation_time": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "google-play",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
Delete Connection
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Specifying Connection
If you have multiple Google Play connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/google-play/androidpublisher/v3/applications/{packageName}/inappproducts')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always include this header to ensure requests go to the intended account.
Security & Permissions
API Reference
In-App Products
#### List In-App Products
GET /google-play/androidpublisher/v3/applications/{packageName}/inappproducts
#### Get In-App Product
GET /google-play/androidpublisher/v3/applications/{packageName}/inappproducts/{sku}
#### Create In-App Product
POST /google-play/androidpublisher/v3/applications/{packageName}/inappproducts
Content-Type: application/json{
"packageName": "com.example.app",
"sku": "premium_upgrade",
"status": "active",
"purchaseType": "managedUser",
"defaultPrice": {
"priceMicros": "990000",
"currency": "USD"
},
"listings": {
"en-US": {
"title": "Premium Upgrade",
"description": "Unlock all premium features"
}
}
}
#### Update In-App Product
PUT /google-play/androidpublisher/v3/applications/{packageName}/inappproducts/{sku}
Content-Type: application/json{
"packageName": "com.example.app",
"sku": "premium_upgrade",
"status": "active",
"purchaseType": "managedUser",
"defaultPrice": {
"priceMicros": "1990000",
"currency": "USD"
}
}
#### Delete In-App Product
DELETE /google-play/androidpublisher/v3/applications/{packageName}/inappproducts/{sku}
Subscriptions
#### List Subscriptions
GET /google-play/androidpublisher/v3/applications/{packageName}/subscriptions
#### Get Subscription
GET /google-play/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}
#### Create Subscription
POST /google-play/androidpublisher/v3/applications/{packageName}/subscriptions
Content-Type: application/json{
"productId": "monthly_premium",
"basePlans": [
{
"basePlanId": "p1m",
"autoRenewingBasePlanType": {
"billingPeriodDuration": "P1M"
}
}
],
"listings": [
{
"languageCode": "en-US",
"title": "Premium Monthly"
}
]
}
Purchases
#### Get Purchase (one-time product)
GET /google-play/androidpublisher/v3/applications/{packageName}/purchases/products/{productId}/tokens/{token}
#### Acknowledge Purchase
POST /google-play/androidpublisher/v3/applications/{packageName}/purchases/products/{productId}/tokens/{token}:acknowledge
Content-Type: application/json{
"developerPayload": "optional payload"
}
#### Get Subscription Purchase
GET /google-play/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}
#### Cancel Subscription
POST /google-play/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:cancel
#### Refund Subscription
POST /google-play/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:refund
Reviews
#### List Reviews
GET /google-play/androidpublisher/v3/applications/{packageName}/reviews
#### Get Review
GET /google-play/androidpublisher/v3/applications/{packageName}/reviews/{reviewId}
#### Reply to Review
POST /google-play/androidpublisher/v3/applications/{packageName}/reviews/{reviewId}:reply
Content-Type: application/json{
"replyText": "Thank you for your feedback!"
}
Edits (App Updates)
#### Create Edit
POST /google-play/androidpublisher/v3/applications/{packageName}/edits
#### Get Edit
GET /google-play/androidpublisher/v3/applications/{packageName}/edits/{editId}
#### Commit Edit
POST /google-play/androidpublisher/v3/applications/{packageName}/edits/{editId}:commit
#### Delete Edit
DELETE /google-play/androidpublisher/v3/applications/{packageName}/edits/{editId}
Code Examples
JavaScript
// List in-app products
const packageName = 'com.example.app';
const response = await fetch(
https://api.maton.ai/google-play/androidpublisher/v3/applications/${packageName}/inappproducts,
{
headers: {
'Authorization': Bearer ${process.env.MATON_API_KEY}
}
}
);const products = await response.json();
console.log(products);
Python
import os
import requestsheaders = {'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
package_name = 'com.example.app'
List in-app products
response = requests.get(
f'https://api.maton.ai/google-play/androidpublisher/v3/applications/{package_name}/inappproducts',
headers=headers
)
products = response.json()
print(products)
Notes
{packageName} with your app's package name (e.g., com.example.app)curl -g when URLs contain brackets (fields[], sort[], records[]) to disable glob parsingjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments. You may get "Invalid API key" errors when piping.Error Handling
| Status | Meaning | |--------|---------| | 400 | Missing Google Play connection | | 401 | Invalid or missing Maton API key | | 404 | Package not found or no access | | 429 | Rate limited (10 req/sec per account) | | 4xx/5xx | Passthrough error from Google Play API |
Troubleshooting: API Key Issues
1. Check that the MATON_API_KEY environment variable is set:
echo $MATON_API_KEY
2. Verify the API key is valid by listing connections:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Troubleshooting: Invalid App Name
1. Ensure your URL path starts with google-play. For example:
https://api.maton.ai/google-play/androidpublisher/v3/applications/{packageName}/inappproductshttps://api.maton.ai/androidpublisher/v3/applications/{packageName}/inappproductsResources
π‘ Examples
# List in-app products
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/google-play/androidpublisher/v3/applications/{packageName}/inappproducts')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
π Tips & Best Practices
{packageName} with your app's package name (e.g., com.example.app)curl -g when URLs contain brackets (fields[], sort[], records[]) to disable glob parsingjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments. You may get "Invalid API key" errors when piping.