# Playtesters — Full Documentation for AI Agents & Developers Playtesters (https://playtesters.dev) is a collaborative closed-testing network and developer SDK suite designed to help Android developers meet Google Play's mandatory requirement of 20 opted-in testers for 14 continuous days. --- ## 1. Architecture Overview - **Platform URL**: https://playtesters.dev - **Web Dashboard**: https://app.playtesters.dev - **Backend Ingest API**: https://api.playtesters.dev/v1 - **Domain for App Links / Deep Links**: https://playtesters.dev/invite/{code} Playtesters operates on a reciprocal model: developers test other apps within their 20-tester group to earn credits, and spend credits to open campaigns for their own apps. No per-tester fees or marketplace middleman. Real device verification is enforced through client-side SDKs that query the Google Play Install Referrer (`code=...&locale=...&playtesters=1`) upon first launch and report daily milestones back to the ingest endpoint with an API Key (`X-Api-Key`). --- ## 2. Official Client SDKs ### Flutter (`playtesters_sdk`) - **Package**: https://pub.dev/packages/playtesters_sdk - **Install**: `flutter pub add playtesters_sdk` - **Setup**: ```dart import 'package:flutter/material.dart'; import 'package:playtesters_sdk/playtesters_sdk.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await Playtesters.configure(apiKey: 'ak_your_app_key'); runApp(const MyApp()); } ``` - **Check Session & Bind Tester**: ```dart // Call once in first screen initState / build: await Playtesters.checkTestSession(context); ``` - **Log Milestone (Counts Test Day)**: ```dart await Playtesters.achieved({'screen': 'onboarding_done'}); ``` - **In-App Tester Status Badge (Optional)**: ```dart const PlaytestersBadge(); ``` --- ### React Native (`@playtesters/react-native-sdk`) - **Package**: https://www.npmjs.com/package/@playtesters/react-native-sdk - **Install**: ```bash npm install @playtesters/react-native-sdk @react-native-async-storage/async-storage react-native-device-info react-native-play-install-referrer ``` - **Setup**: ```tsx import React, { useEffect } from 'react'; import { configure, PlaytestersAutoCheck, PlaytestersBadge, achieved } from '@playtesters/react-native-sdk'; export default function App() { useEffect(() => { configure({ apiKey: 'ak_your_app_key' }); }, []); return ( <> ); } ``` - **Log Milestone**: ```tsx await achieved({ screen: 'completed_task' }); ``` --- ### Android Native Kotlin (`playtesters-sdk`) - **Repository**: https://jitpack.io/#alexcao194/playtesters_sdk - **Dependency**: ```kotlin // settings.gradle.kts repositories { mavenCentral() maven { url = uri("https://jitpack.io") } } // app/build.gradle.kts dependencies { implementation("com.github.alexcao194:playtesters_sdk:v0.1.0") } ``` - **Application.onCreate**: ```kotlin Playtesters.configure(context = this, apiKey = "ak_your_app_key") ``` - **MainActivity.onCreate**: ```kotlin Playtesters.checkTestSession(this) ``` - **Log Milestone**: ```kotlin Playtesters.achieved(context, JSONObject().put("screen", "home")) { response -> Log.d("Playtesters", "Credited today: ${response.credited}") } ``` --- ## 3. Ingest HTTP API Specification For custom or unsupported languages/frameworks, applications can communicate directly with the Ingest API: - **Base URL**: `https://api.playtesters.dev/v1` - **Authentication**: Header `X-Api-Key: ` ### Check App Config & Campaign Status `GET /ingest/config` - Response: `{"ok": true, "data": {"dialog_enabled": boolean}}` - Returns `true` if the app currently has an active testing campaign. ### Bind Tester Session `POST /ingest/bind` - Body: `{"code": "123456", "device_id": "unique-device-identifier"}` - Response: `{"ok": true, "data": {"tester_name": "alexcao"}}` ### Milestone Achievement (Counts 1 Test Day) `POST /ingest/achieved` - Body: ```json { "code": "123456", "data": {"screen": "checkout"}, "package": "com.example.app", "version_name": "1.0.0", "version_code": 1 } ``` - Response: `{"ok": true, "credited": true}` ### Pre-Launch Integration Verification Call `POST /ingest/achieved` with empty code `{"code": "", "data": {}}` during local development to confirm the API key and mark the app as verified on the Playtesters dashboard. --- ## 4. Deep Links & Android App Links - **Universal Invite URL**: `https://playtesters.dev/invite/{invite_code}` - **AssetLinks Manifest**: `https://playtesters.dev/.well-known/assetlinks.json` - **Apple App Site Association**: `https://playtesters.dev/.well-known/apple-app-site-association` - **Ad Verification File**: `https://playtesters.dev/app-ads.txt`