🎁 Get the FREE AI Skills Starter Guide β€” Subscribe β†’
BytesAgainBytesAgain
πŸ¦€ ClawHub

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...

Versionv1.0.4
Downloads16,081
Installs14
Stars⭐ 12
Comments3
TERMINAL
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

  • Access is scoped to apps, subscriptions, in-app purchases, and reviews within the connected Google Play account.
  • All write operations require explicit user approval. Before executing any create, update, or delete call, confirm the target resource and intended effect with the user.
  • 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 requests

    headers = {'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

  • Replace {packageName} with your app's package name (e.g., com.example.app)
  • The Google Play Developer API requires the app to be published on Google Play
  • Subscription management requires the app to have active subscriptions configured
  • Edits are transactional - create an edit, make changes, then commit
  • IMPORTANT: When using curl commands, use curl -g when URLs contain brackets (fields[], sort[], records[]) to disable glob parsing
  • IMPORTANT: When piping curl output to jq 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:

  • Correct: https://api.maton.ai/google-play/androidpublisher/v3/applications/{packageName}/inappproducts
  • Incorrect: https://api.maton.ai/androidpublisher/v3/applications/{packageName}/inappproducts
  • Resources

  • Android Publisher API Overview
  • In-App Products
  • Subscriptions
  • Purchases
  • Reviews
  • Edits
  • Maton Community
  • Maton Support
  • πŸ’‘ 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

  • Replace {packageName} with your app's package name (e.g., com.example.app)
  • The Google Play Developer API requires the app to be published on Google Play
  • Subscription management requires the app to have active subscriptions configured
  • Edits are transactional - create an edit, make changes, then commit
  • IMPORTANT: When using curl commands, use curl -g when URLs contain brackets (fields[], sort[], records[]) to disable glob parsing
  • IMPORTANT: When piping curl output to jq 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.