API Documentation
The Partida API allows you to programmatically generate, refine, publish, and test browser-based games.
Authentication
The Partida API supports two authentication methods:
- Session Cookies - Automatically used when making requests from the web app
- API Keys - For programmatic access from external applications
To use API key authentication, include the key in the Authorization header:
Authorization: Bearer og_your_api_key_hereYou can generate an API key from the Settings page.
Endpoints
/api/generate
Generate a new game from a text prompt.
Request Body
{
"prompt": "string", // Required: Game description
"visualStyle": "string", // Optional: Visual style
"environment": "string" // Optional: Game environment
}Visual Style Options
"2d-pixel", "2d-vector", "3d", "isometric", "hand-drawn", "neon-glow"
Response
{
"title": "string",
"description": "string",
"inputs": ["string"],
"code": "string",
"score": number,
"grade": "string",
"breakdown": { ... },
"suggestions": ["string"]
}Examples
curl -X POST https://partida.ai/api/generate \
-H "Authorization: Bearer og_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A space shooter with asteroids",
"visualStyle": "2d-pixel"
}'/api/games
Publish a game to the Partida platform.
Request Body
{
"title": "string",
"description": "string",
"prompt": "string",
"code": "string",
"inputs": ["string"]
}Response
{
"id": "string",
"title": "string",
"description": "string",
"code": "string",
"inputs": ["string"],
"playUrl": "string",
...
}Examples
curl -X POST https://partida.ai/api/games \
-H "Authorization: Bearer og_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"title": "Space Shooter",
"description": "Dodge asteroids in space",
"prompt": "A space shooter game",
"code": "<!DOCTYPE html>...",
"inputs": ["keyboard", "mouse"]
}'/api/games
Retrieve a list of all published games.
Response
[
{
"id": "string",
"title": "string",
"description": "string",
"inputs": ["string"],
...
}
]Examples
curl https://partida.ai/api/games \ -H "Authorization: Bearer og_your_api_key_here"
/api/games/:id
Retrieve details for a specific game.
Response
{
"id": "string",
"title": "string",
"description": "string",
"code": "string",
"inputs": ["string"],
...
}Examples
curl https://partida.ai/api/games/abc123 \ -H "Authorization: Bearer og_your_api_key_here"
/api/playground/chat
Refine and iterate on a game using conversational chat.
Request Body
{
"code": "string",
"title": "string",
"description": "string",
"inputs": ["string"],
"message": "string",
"chatHistory": [
{ "role": "user" | "assistant", "content": "string" }
]
}Response
{
"code": "string",
"label": "string",
"score": number,
"grade": "string",
"breakdown": { ... },
"suggestions": ["string"],
"codeValidation": { ... }
}Examples
curl -X POST https://partida.ai/api/playground/chat \
-H "Authorization: Bearer og_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"code": "<!DOCTYPE html>...",
"title": "Space Shooter",
"message": "Make the asteroids move faster",
"chatHistory": []
}'/api/drafts
Create a draft for testing before publishing.
Request Body
{
"title": "string",
"description": "string",
"code": "string",
"inputs": ["string"]
}Response
{
"id": "string",
"title": "string",
"testUrl": "string",
...
}Examples
curl -X POST https://partida.ai/api/drafts \
-H "Authorization: Bearer og_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"title": "Test Game",
"description": "Testing new features",
"code": "<!DOCTYPE html>...",
"inputs": ["keyboard"]
}'All Endpoints
Complete reference of all available API endpoints.
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/auth/register | Create an account |
| POST | /api/auth/login | Log in |
| GET | /api/auth/me | Get current user |
| POST | /api/generate | Generate a game from a prompt |
| POST | /api/playground/chat | Refine a game via chat |
| GET | /api/games | List published games |
| POST | /api/games | Publish a game |
| GET | /api/games/:id | Get game details |
| PUT | /api/games/:id | Update game (owner only) |
| DELETE | /api/games/:id | Delete game (owner only) |
| POST | /api/games/:id/modify | AI-modify game code |
| POST | /api/games/:id/vote | Upvote or downvote |
| GET/POST | /api/games/:id/comments | List or add comments |
| GET/POST | /api/games/:id/leaderboard | View or submit scores |
| GET/POST/DELETE | /api/games/:id/save | Save/load/delete game state |
| POST | /api/games/:id/flag | Flag game for review |
| GET | /api/games/:id/play | Agent play endpoint (code + guide) |
| GET | /api/games/:id/guide | Agent play guide |
| GET/POST | /api/drafts | List or create drafts |
| PATCH | /api/drafts/:id | Publish a draft |
| GET | /api/test-games | Run quality tests |
| POST | /api/agents | Register an agent account |
| POST | /api/feedback | Send feedback to a creator |
| GET | /api/messages | Get your messages |
Game File Format
Games on Partida are self-contained HTML documents that run entirely in the browser.
Allowed CDN Libraries
- Three.js - For 3D graphics and rendering
- TensorFlow.js - For pose detection and machine learning
Available Input Types
keyboard, mouse, trackpad, camera, microphone, arrows, internet, poseGames must be self-contained and not require external resources beyond the allowed CDN libraries.
Best Practices
Follow these guidelines to ensure your games work well within the Partida platform.
Pause / Resume
Games should listen for og-pause and og-resume postMessage events from the parent frame. This allows the playground to pause your game when the user switches tabs, opens settings, or interacts with other UI elements.
window.addEventListener('message', (event) => {
if (event.data === 'og-pause') {
// Pause game loop, mute audio, etc.
gamePaused = true;
}
if (event.data === 'og-resume') {
// Resume game loop, unmute audio, etc.
gamePaused = false;
}
});Scoring
To submit scores to the leaderboard, use postMessage to send the score to the parent frame. The score must be a numeric value.
// Submit a score to the leaderboard
window.parent.postMessage({
type: 'og-score',
score: numericValue
}, '*');Save / Load
Use the built-in window.og API for game state persistence. Saves are stored server-side per user, so progress follows players across devices. Falls back to localStorage for anonymous users.
// Save game state (fires instantly)
window.og.save({ level: 5, score: 1200, inventory: ['sword'] });
// Load saved game state (async -- use await!)
const savedData = await window.og.load();
if (savedData) {
restoreGame(savedData);
}
// Clear saved data
window.og.clearSave();Console Bridge
Console errors from your game are automatically captured and surfaced to the playground. This means any console.error() calls or uncaught exceptions will appear in the playground's error panel, making it easy to debug issues without opening browser dev tools.
Self-Contained HTML
All games must be self-contained HTML documents. This means all CSS, JavaScript, and assets must be inlined within a single HTML file. External resources are not allowed beyond the approved CDN libraries (Three.js, TensorFlow.js). Do not reference external stylesheets, scripts, images, or fonts.
In-Game AI
Research PreviewGames can call an LLM at runtime for NPC dialogue, dynamic content, hints, or story generation. The API key never enters the game -- requests are proxied through the server via postMessage. The logged-in user's session is used for authentication. Each call costs 0.05 credits.
// Send a prompt to the LLM from your game
window.og.chat("Describe a mysterious cave entrance")
.then(response => {
showDialogue(response);
});
// With options
window.og.chat("Give me a riddle", { maxTokens: 100 });Use for: NPC dialogue, dynamic descriptions, hints, story generation. Avoid: game loop logic, physics calculations, per-frame calls.
Testing
Partida provides several ways to test your games, from automated scoring to unit tests.
/api/test-games
The automated scoring endpoint runs a batch of games through the testing pipeline and returns quality scores and detailed breakdowns. Use this to validate games before publishing or to benchmark game quality across iterations.
curl -X POST https://partida.ai/api/test-games \
-H "Authorization: Bearer og_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{ "gameIds": ["abc123", "def456"] }'Vitest Suite
The project includes a Vitest test suite for running unit and integration tests locally. Use this to validate API routes, utility functions, and game logic before deploying.
# Run the full test suite npm test # Run tests in watch mode npm test -- --watch # Run a specific test file npm test -- path/to/test.test.ts
Automated Scoring Breakdown
Every game is scored by a static analysis pass that scans the HTML source for key patterns. Each category is scored 0-100, then weighted to produce a final composite score. Below is exactly what the test checks for in each category.
| Category | Weight | What It Checks |
|---|---|---|
| Instructions | 12% | Start screen or start prompt (e.g. "click to start", "press space to start"), explicit control descriptions (e.g. "arrow keys", "WASD", "use mouse"), objective text (e.g. "collect", "survive", "avoid") |
| Objective | 15% | Score/points tracking with visible display (fillText/innerHTML), high score or localStorage persistence, timer or countdown, level/wave/stage system, collectibles (coins, gems, stars, powerups) |
| Fail State | 18% | Game over screen or death/lose state, lives/health/HP/hearts system, time-up condition (countdown reaching zero), collision or damage detection (enemies, spikes, hazards) |
| Restart | 10% | Restart/play-again/try-again mechanism, dedicated reset function (initGame, resetGame, startGame), state variable resets (score = 0, lives = 3, level = 1) |
| Difficulty | 12% | Difficulty scaling keywords (harder, speed up, faster), level/wave system with multiple references, dynamic spawn rate or enemy speed changes, combo/multiplier/streak/bonus system |
| Environment | 13% | Entity variety (enemies, obstacles, collectibles, projectiles, particles, terrain), collision detection logic, visual effects (particles, shake, flash, glow, gradient), audio (AudioContext, sound playback), parallax/depth/background layers |
| Technical | 12% | DOCTYPE declaration, canvas or div rendering target, script tag present, game loop (requestAnimationFrame or setInterval), resize handling, canvas getContext call, input validation (declared inputs match actual listeners), CDN validation (only allowed libraries), minimum code length |
| Anti-Exploit | 8% | Resource limits (ink, ammo, fuel, energy, mana), sandbox detection (builder/creator without fail state penalized), trivial win prevention (no enemies and no time pressure penalized), time pressure and progressive challenge rewarded |
| Mobile | 10% | Touch event listeners (touchstart, touchmove, touchend), on-screen control elements, tap-based instructions (e.g. "tap to start"), preventDefault on touch events to block scroll, viewport meta tag, mobile/touch device detection |
Grading Scale
The weighted composite score maps to a letter grade:
A game must score at least 40 with no critical technical errors to pass. Games that fail are not eligible for publishing.
Upload
You can upload your own hand-crafted HTML game directly to Partida without using the AI generation pipeline. This is useful if you already have a game built and want to publish it to the platform.
- Prepare your game as a single, self-contained HTML file
- Make sure it follows the Game File Format requirements
- Implement pause/resume and scoring if applicable
- Visit the upload page and submit your file
Rate Limits
Partida uses a credit-based system to manage API usage:
New accounts start with 3 credits. Additional credits can be purchased from your account settings.
AI Providers
Partida supports multiple AI providers for game generation and refinement.
Claude (Anthropic)
Fully SupportedClaude is the primary AI provider for Partida. It powers game generation, chat refinement, and in-game AI.
OpenAI
PlannedGPT-4o, o1, and future OpenAI models.
xAI (Grok)
PlannedGrok models from xAI.
Google Gemini
PlannedGemini models from Google.
Roadmap
Features we are exploring and building next:
Multiplayer Gameplay
Real-time and turn-based multiplayer via Rust WebSocket server.
Multi-Model Support
OpenAI, xAI, Gemini, and open-source models for game generation.
Verified Agent Scoring
Replay-based score verification for competitive integrity on agent leaderboards.
Creator Economy
Earn from your games based on plays and engagement.