API and MCP: your AI agents can work with us

Your AI agents (ChatGPT, Claude, Claude Code, Cursor…) can order a test, follow your campaigns and read your reports through a REST API or an MCP server, with a personal API key. You always make the payment yourself.

The journey in 3 steps

  1. 1. You log in once and generate the key

    Sign in with Google on playtesterhub.com, then open your dashboard > "Your AI agents" > "Generate my key in one click". The MCP configuration is ready to copy.

  2. 2. Your agent orders, you pay the link

    The agent creates the order (plan, app name, package or opt-in link) and gets a Stripe payment link. You open it and pay: nothing is charged before that.

  3. 3. Your agent follows the test and reads the reports

    The campaign shows up in your dashboard and for the agent. Once the tester group is added in Play Console, the agent confirms access, then follows progress and reads the reports.

Connect ChatGPT / Claude in one click

No key to copy: ChatGPT, Claude.ai and Claude Desktop connect through OAuth. Paste the server address, sign in with Google on PlayTesterHub and click "Allow".

Address to paste

https://playtesterhub.com/api/mcp

ChatGPT

  1. Settings > Apps & Connectors > Advanced settings: turn on developer mode (depending on your plan).
  2. Create an app (connector): name PlayTesterHub, the MCP server URL above, OAuth authentication.
  3. Sign in with Google on PlayTesterHub, then click "Allow".

Claude.ai and Claude Desktop

  1. Settings > Connectors > "Add custom connector".
  2. Name PlayTesterHub, the URL above, then "Add" and "Connect".
  3. Sign in with Google on PlayTesterHub, then click "Allow". The connector is also available in Claude Desktop.

Labels may vary with the app version. The access grants the same rights as an API key; remove it at any time in "My dashboard" > "Your AI agents" > "Connected applications".

What your agents can read

  • Your campaigns, their status and progress (test day out of 14).
  • The message from our team shown at the top of the campaign.
  • The reports included in your plan: a full recap every 3 days and the final report (Premium, Premium+), daily per-device reports (Premium+: 12 a day, 168 over the test).
  • Each report has readable text (body) and structured data (data, as JSON).

1. Create an API key

  1. Log in and open your dashboard, "Your AI agents" section.
  2. Create a key and copy it: it is shown only once. We only keep a fingerprint of it.
  3. Revoke it at any time from the same section.
Open my dashboard

2. REST API

Base: https://playtesterhub.com/api/v1 — JSON responses, header Authorization: Bearer <your key>.

GET /api/v1/campaigns
Your campaigns, with status, plan, progress, message and report counts.
GET /api/v1/campaigns/{id}
One campaign.
GET /api/v1/campaigns/{id}/reports
A campaign's reports, latest test day first.
GET /api/v1/reports/{id}
One report.
GET /api/v1/campaigns/{id}/devices
State of the 12 devices: model (brand only, e.g. Samsung), app installed, opened today, last action (only what our team recorded).
GET /api/v1/campaigns/{id}/tips
Our tips to improve the app (all plans), newest first.
POST /api/v1/campaigns/{id}/updates
You published a new version in your closed test: we install it on your test's 12 devices. { version_label?, notes? }; test running, one pending request at a time. GET to follow progress (X/12).
GET /api/v1/messages
Your conversation with our team (same as the site's chat bubble), oldest first; optional since and limit.
POST /api/v1/messages
Messages our team: { body, campaign_id? } (max 4000 characters).
GET /api/v1/notifications
Your notifications: team reply, step change, tip, report, phones; unread=true for unread only.
POST /api/v1/notifications/read
Marks notifications as read: { ids: [...] } or { all: true }.
POST /api/v1/orders
Creates an order and returns the Stripe payment link (checkout_url) to hand to the human.
GET /api/v1/orders/{id}
Order status (pending_payment, paid, expired), payment link while still open, and campaign_id once paid.
GET /api/v1/orders
Your orders.
POST /api/v1/campaigns/{id}/confirm-access
Confirms the tester group was added to the closed test (awaiting_access step).
POST /api/v1/campaigns/{id}/promo-codes
Paid app: sends your 12 Google Play promo codes (one per phone; Play Console › Monetize › Promotions › Create promotion › Promo code, free). { app_pricing?: free|paid, codes?: [...], replace? }: codes are added to those already sent, replace=true replaces the unused ones. GET to read your codes back (received, used, remaining). Visible to you and our team only.
GET /api/v1/me
Checks the key (account email).

Report filters: kind=final|daily|recap, scope=campaign|device, device=1-12, day=1-14, since=<ISO 8601 date>, limit (1-200, default 50), offset.

Example

curl -s https://playtesterhub.com/api/v1/campaigns \
  -H "Authorization: Bearer pth_..."

curl -s "https://playtesterhub.com/api/v1/campaigns/42/reports?scope=device&day=3" \
  -H "Authorization: Bearer pth_..."

Ordering through an agent

POST /api/v1/orders (or the create_order MCP tool), JSON body:

  • offer: standard (€15), premium (€25) or premium_plus (€40), at the prices shown on the site.
  • app_name: the app's name.
  • package_name (e.g. com.example.app) or play_link: closed test opt-in link https://play.google.com/apps/testing/<package> (the store link with ?id= is accepted too).
  • locale: fr or en (payment page language), optional.
  • app_pricing: free or paid (the app's price on Google Play), optional. Paid app: then send 12 promo codes (promo-codes / submit_promo_codes).
  • accept_cgv and waive_withdrawal: true, only after the human agreed.

Consent comes from you: your agent must ask you to accept the terms of sale and the immediate start of the service before sending accept_cgv and waive_withdrawal. The Stripe payment page reminds you of it. At most 5 unpaid orders per 24 hours.

curl -s -X POST https://playtesterhub.com/api/v1/orders \
  -H "Authorization: Bearer pth_..." -H "Content-Type: application/json" \
  -d '{"offer":"premium","app_name":"My App","package_name":"com.example.myapp",
       "locale":"en","accept_cgv":true,"waive_withdrawal":true}'

# 201 → { "order": { "id": 51, "status": "pending_payment", "checkout_url": "https://checkout.stripe.com/...", ... },
#         "next_steps": [...] }

curl -s -X POST https://playtesterhub.com/api/v1/campaigns/42/confirm-access \
  -H "Authorization: Bearer pth_..."

Once the link is paid, the campaign shows up like any other (status awaiting_access) with the tester group address (tester_group_email). Add it as testers of your closed test (France selected), then the agent calls confirm-access: our team checks access and starts the test in under 8 hours after that confirmation, even at night or on weekends.

3. MCP server

URL: https://playtesterhub.com/api/mcp (streamable HTTP), same API key in the Authorization header. Available tools:

  • create_order — creates an order and returns the payment link you pay
  • get_order — order status (paid or not, campaign created)
  • list_orders — your orders
  • confirm_access — confirms the tester group was added to the closed test
  • list_campaigns — lists your campaigns
  • get_campaign — one campaign (status, progress, message)
  • list_reports — a campaign's reports, with the same filters as the API
  • get_report — one full report
  • list_devices — state of the campaign's 12 phones
  • list_tips — our tips for the campaign
  • request_update — rolls out your new version to your 12 testers
  • submit_promo_codes — paid app: sends your 12 Google Play promo codes (and the free | paid pricing)
  • list_messages — your conversation with our team
  • send_message — messages our team (optionally about a campaign)
  • list_notifications — your notifications (unread or all)
  • mark_notifications_read — marks notifications as read

Setup

Claude Code

claude mcp add --transport http playtesterhub https://playtesterhub.com/api/mcp \
  --header "Authorization: Bearer pth_..."

Claude Desktop (via mcp-remote, requires Node.js)

{
  "mcpServers": {
    "playtesterhub": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://playtesterhub.com/api/mcp",
               "--header", "Authorization:${PTH_AUTH}"],
      "env": { "PTH_AUTH": "Bearer pth_..." }
    }
  }
}

Cursor (~/.cursor/mcp.json)

{
  "mcpServers": {
    "playtesterhub": {
      "url": "https://playtesterhub.com/api/mcp",
      "headers": { "Authorization": "Bearer pth_..." }
    }
  }
}

Replace pth_… with your key. Don't commit it to a code repository.

Report format

A per-device report gives the device number in your test (1 to 12), its brand and the test day. The content of data depends on the report; treat it as free-form JSON.

{
  "id": 1234,
  "campaign_id": 42,
  "kind": "daily",
  "scope": "device",
  "device": { "slot": 3, "model": "Google Pixel" },
  "test_day": 3,
  "body": "Cold start 1.8 s, no crash. ...",
  "data": { "...": "..." },
  "source": "agent",
  "created_at": "2026-10-14T18:00:00.000Z",
  "updated_at": "2026-10-14T18:00:00.000Z"
}

Good to know

  • An agent can create an order but never pay it: only the Stripe link, opened by you, triggers a payment.
  • Apart from orders, access confirmation, new versions, promo codes and messages, the API and MCP server are read-only.
  • A key only gives access to your own account's campaigns (same email address).
  • Up to 10 active keys per account.
  • OAuth connection (ChatGPT, Claude): access token valid for 1 hour, renewed automatically by the app; revocable from your dashboard.