Playerok APIplayerok.com ↗
Access Playerok game marketplace data: in-game items, accounts, donations, and services. Filter by game, category, sort, and paginate with 5 endpoints.
What is the Playerok API?
The Playerok API provides structured access to the playerok.com gaming marketplace through 5 endpoints covering product listings, game search, category browsing, and featured items. The list_items endpoint lets you filter the marketplace by game or category, returning price, seller rating, and pagination cursors. You can also fetch detailed product data via get_item, discover games with search_games, and surface promoted listings using get_top_items.
curl -X GET 'https://api.parse.bot/scraper/4688010c-bf13-44a2-bef6-4db5e643b286/list_items' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace playerok-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
Playerok.com Gaming Marketplace API Client
Parse API integration for extracting product listings, game details, categories,
and featured items from playerok.com - a Russian gaming marketplace.
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Optional, Dict, Any, List
class ParseClient:
"""Client for interacting with the Playerok.com Gaming Marketplace API via Parse."""
def __init__(self, api_key: Optional[str] = None):
"""
Initialize the Parse API client.
Args:
api_key: API key for Parse. If not provided, reads from PARSE_API_KEY env var.
"""
self.base_url = "https://api.parse.bot"
self.scraper_id = "4688010c-bf13-44a2-bef6-4db5e643b286"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError("API key not provided. Set PARSE_API_KEY environment variable or pass it as argument.")
def _call(self, endpoint: str, method: str = "POST", **params) -> Dict[str, Any]:
"""
Make a request to the Parse API.
Args:
endpoint: The endpoint name (e.g., 'list_items')
method: HTTP method ('GET' or 'POST')
**params: Parameters to pass to the endpoint
Returns:
Response data as dictionary
Raises:
requests.RequestException: If the API request fails
"""
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
headers = {
"X-API-Key": self.api_key,
"Content-Type": "application/json"
}
if method.upper() == "GET":
response = requests.get(url, headers=headers, params=params, timeout=30)
elif method.upper() == "POST":
response = requests.post(url, headers=headers, json=params, timeout=30)
else:
raise ValueError(f"Unsupported HTTP method: {method}")
response.raise_for_status()
return response.json()
def search_games(self, query: Optional[str] = None, game_type: Optional[str] = None, limit: int = 24) -> Dict[str, Any]:
"""
Search for games by name or list games by type.
Args:
query: Search query to filter games by name (e.g., 'Genshin')
game_type: Filter by game type: GAME, MOBILE_GAME, or APPLICATION
limit: Number of games to return (max 50)
Returns:
Dictionary containing games list and total count
"""
params = {"limit": min(limit, 50)}
if query:
params["query"] = query
if game_type:
params["game_type"] = game_type
return self._call("search_games", method="GET", **params)
def list_categories(self, limit: int = 24) -> Dict[str, Any]:
"""
List all marketplace categories.
Args:
limit: Number of categories to return (max 50)
Returns:
Dictionary containing categories list and total count
"""
return self._call("list_categories", method="GET", limit=min(limit, 50))
def list_items(
self,
game_id: Optional[str] = None,
game_category_id: Optional[str] = None,
game_slug: Optional[str] = None,
category_slug: Optional[str] = None,
limit: int = 24,
cursor: Optional[str] = None,
sort_field: Optional[str] = None,
sort_direction: str = "ASC"
) -> Dict[str, Any]:
"""
List products/items with filtering by game, category, sorting, and pagination.
Args:
game_id: Game UUID to filter by
game_category_id: Game category UUID to filter by
game_slug: Game slug to filter by (e.g., 'genshin-impact')
category_slug: Category slug to filter by (e.g., 'coins')
limit: Number of items per page (max 50)
cursor: Pagination cursor from page_info.end_cursor
sort_field: Sort field (e.g., 'price', 'createdAt')
sort_direction: Sort direction: ASC or DESC
Returns:
Dictionary containing products list, total count, and pagination info
"""
params = {"limit": min(limit, 50), "sort_direction": sort_direction}
if game_id:
params["game_id"] = game_id
if game_category_id:
params["game_category_id"] = game_category_id
if game_slug:
params["game_slug"] = game_slug
if category_slug:
params["category_slug"] = category_slug
if cursor:
params["cursor"] = cursor
if sort_field:
params["sort_field"] = sort_field
return self._call("list_items", method="GET", **params)
def get_item(self, slug: str) -> Dict[str, Any]:
"""
Get detailed information about a single product by its slug.
Args:
slug: Product slug
Returns:
Dictionary containing detailed product information
"""
return self._call("get_item", method="GET", slug=slug)
def get_top_items(self, limit: int = 16) -> Dict[str, Any]:
"""
Get featured/top products from the marketplace homepage.
Args:
limit: Number of top items to return (max 50)
Returns:
Dictionary containing top products list and total count
"""
return self._call("get_top_items", method="GET", limit=min(limit, 50))
def main():
"""Practical workflow example: Search for Genshin Impact items and display details."""
# Initialize client
client = ParseClient()
print("=" * 60)
print("PLAYEROK GAMING MARKETPLACE API - PRACTICAL EXAMPLE")
print("=" * 60)
# Step 1: Search for Genshin Impact game
print("\n1. Searching for 'Genshin Impact' game...")
games_response = client.search_games(query="Genshin")
games = games_response.get("games", [])
if not games:
print("No games found for 'Genshin'")
return
genshin = games[0]
print(f" Found: {genshin['name']} (ID: {genshin['id']})")
print(f" Game type: {genshin['type']}")
print(f" Categories available: {len(genshin.get('categories', []))}")
# Step 2: List categories for reference
print("\n2. Available marketplace categories:")
categories_response = client.list_categories(limit=10)
categories = categories_response.get("categories", [])
for cat in categories[:5]:
print(f" - {cat['name']} ({cat['slug']})")
# Step 3: List items for Genshin Impact, sorted by price
print(f"\n3. Fetching Genshin Impact items (sorted by price, ascending)...")
items_response = client.list_items(
game_id=genshin['id'],
limit=5,
sort_field="price",
sort_direction="ASC"
)
products = items_response.get("products", [])
total_count = items_response.get("total_count", 0)
page_info = items_response.get("page_info", {})
print(f" Total items in marketplace: {total_count}")
print(f" Showing: {len(products)} items")
print(f" Has next page: {page_info.get('has_next_page', False)}")
# Step 4: Display item details and get full info for first item
if products:
print("\n4. Featured items from Genshin Impact:")
first_item = products[0]
for i, item in enumerate(products[:3], 1):
seller = item.get("seller", {})
price = item.get("price", "N/A")
category = item.get("category", {})
print(f"\n Item {i}: {item['name']}")
print(f" Price: {price}₽ (Original: {item.get('raw_price', 'N/A')}₽)")
print(f" Seller: {seller.get('username')} (Rating: {seller.get('rating')}, Reviews: {seller.get('testimonial_count')})")
print(f" Category: {category.get('name')}")
print(f" Status: {item.get('status')}")
print(f" Priority: {item.get('priority')}")
# Step 5: Get detailed information about the first item
print(f"\n5. Getting detailed information for first item...")
try:
detailed_item = client.get_item(first_item['slug'])
print(f" Product ID: {detailed_item.get('id')}")
print(f" Full description preview: {detailed_item.get('description', 'N/A')[:100]}...")
attributes = detailed_item.get("attributes", {})
if attributes:
print(f" Attributes: {attributes}")
obtaining_type = detailed_item.get("obtaining_type", {})
if obtaining_type:
print(f" Delivery method: {obtaining_type.get('name')}")
print(f" Description: {obtaining_type.get('description')}")
images = detailed_item.get("images", [])
if images:
print(f" Number of images: {len(images)}")
print(f" First image URL: {images[0].get('url', 'N/A')[:50]}...")
except Exception as e:
print(f" Error getting item details: {e}")
# Step 6: Get top featured items from marketplace
print("\n6. Fetching top featured items from marketplace...")
top_response = client.get_top_items(limit=5)
top_items = top_response.get("products", [])
print(f" Top items count: {len(top_items)}")
if top_items:
for i, item in enumerate(top_items[:3], 1):
game = item.get("game", {})
seller = item.get("seller", {})
print(f"\n Top {i}: {item['name']}")
print(f" Game: {game.get('name')}")
print(f" Price: {item.get('price')}₽")
print(f" Seller: {seller.get('username')} (Rating: {seller.get('rating')})")
print("\n" + "=" * 60)
print("Example workflow completed successfully!")
print("=" * 60)
if __name__ == "__main__":
main()List products/items with filtering by game, category, sorting, and cursor-based pagination. Supports filtering by game_id/game_category_id directly, or by game_slug/category_slug (auto-resolved).
| Param | Type | Description |
|---|---|---|
| limit | integer | Number of items per page (max 50) |
| cursor | string | Pagination cursor from page_info.end_cursor of previous response |
| game_id | string | Game UUID to filter by (e.g., '1ecc48ce-4f17-6e23-6b8a-fa42990d44fb' for Genshin Impact). Use search_games to find IDs. |
| game_slug | string | Game slug to filter by (e.g., 'genshin-impact'). Will be auto-resolved to game_id. Prefer game_id for efficiency. |
| sort_field | string | Sort field (e.g., 'price', 'createdAt') |
| category_slug | string | Category slug to filter by (e.g., 'coins'). Used with game_slug for auto-resolution. |
| sort_direction | string | Sort direction: ASC or DESC |
| game_category_id | string | Game category UUID to filter by (e.g., '1ecc48ce-52cb-6260-00d0-cfdb37fa1032' for Crystals). Use search_games to find category IDs. |
{
"type": "object",
"fields": {
"products": "array of product objects",
"page_info": "object with has_next_page, end_cursor, has_previous_page, start_cursor",
"total_count": "integer - total matching items"
},
"sample": {
"products": [
{
"id": "1f112eb6-9925-6bd0-1bc2-4a33df1ce682",
"game": {
"name": "Genshin Impact"
},
"name": "💎 ЗА ПЕРВОЕ ПОПОЛНЕНИЕ x2 🔥 980+980 Кристаллов по UID",
"slug": "4a33df1ce682-za-pervoe-popolnenie-x2-980-980-kristallov-po-uid",
"price": 1149,
"seller": {
"id": "...",
"rating": 4.9,
"username": "RobloxAccMarket",
"is_online": false,
"testimonial_count": 735
},
"status": "APPROVED",
"category": {
"name": "Кристаллы",
"slug": null
},
"priority": "PREMIUM",
"image_url": "https://i.playerok.com/...",
"raw_price": 2499,
"created_at": "2026-02-26T08:17:05.000Z",
"deals_count": null,
"seller_type": "USER",
"views_count": null,
"approval_date": "2026-02-26T08:18:02.658Z",
"fee_multiplier": 0.1
}
],
"page_info": {
"end_cursor": "YXJyYXljb25uZWN0aW9uOjI=",
"start_cursor": "YXJyYXljb25uZWN0aW9uOjA=",
"has_next_page": true,
"has_previous_page": false
},
"total_count": 551
}
}About the Playerok API
Browsing and Filtering Marketplace Listings
The list_items endpoint returns a paginated array of products alongside a page_info object containing has_next_page, end_cursor, has_previous_page, and start_cursor. Pass a game_id (UUID) or game_slug (e.g., genshin-impact) to scope results to a specific title. You can further narrow by game_category_id or category_slug (e.g., coins), and control order with sort_field (e.g., price, createdAt) and sort_direction (ASC or DESC). The endpoint accepts up to 50 results per page via the limit parameter. Passing a game_slug or category_slug instead of their UUID equivalents incurs an auto-resolution step; use the UUID forms when you already have them.
Single Product and Game Details
get_item accepts a product slug and returns the full detail record: UUID, name, price, raw_price (original pre-discount figure), status, images array with each image's id and url, a seller object with username, rating, and testimonial_count, and nested game and category objects. To look up which game UUIDs and category UUIDs are available for use in list_items, use search_games, which accepts a free-text query, an optional game_type filter (GAME, MOBILE_GAME, or APPLICATION), and a limit. Its response contains a games array and a total_count.
Categories and Featured Products
list_categories returns all top-level marketplace categories (examples include Донат, Аккаунты, Предметы, and Ключи) as an array with a total_count. These category slugs feed directly into the category_slug parameter of list_items. get_top_items returns a products array of homepage-promoted listings across all games, useful for surfacing high-visibility inventory without specifying any game filter.
The Playerok API is a managed, monitored endpoint for playerok.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when playerok.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official playerok.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor price trends for in-game items on Playerok by polling
list_itemswithsort_field=pricefor a specificgame_id. - Build a game-specific deal finder that filters
list_itemsbycategory_slugand sorts ascending by price to surface the cheapest listings. - Aggregate seller reputation data by reading the
ratingandtestimonial_countfields fromget_itemresponses across multiple products. - Display featured marketplace inventory on a gaming portal using
get_top_itemsto pull the current set of promoted listings. - Resolve available game UUIDs and their associated category IDs with
search_gamesbefore constructing filteredlist_itemsqueries. - Track listing status changes over time by periodically calling
get_itemfor a set of known product slugs and comparing thestatusfield. - Enumerate all available marketplace categories via
list_categoriesto build a dynamic navigation or filter UI.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Playerok have an official public developer API?+
How does pagination work in `list_items`?+
page_info object with has_next_page and end_cursor. Pass end_cursor as the cursor parameter in the next request to advance through results. To walk backwards, use has_previous_page and start_cursor. Each page returns at most 50 items.What is the difference between `price` and `raw_price` in `get_item`?+
price reflects the current listed price, while raw_price holds the original price before any discount or promotion. When the two values differ, the listing has a reduced price relative to its initial posting.Does the API return seller transaction history or individual testimonial text?+
rating and testimonial_count on the seller object, but individual review text and transaction histories are not included in any endpoint response. You can fork this API on Parse and revise it to add an endpoint targeting seller-level detail pages.Can I filter `list_items` by price range?+
list_items supports sorting by price via sort_field and sort_direction, but there are no min_price or max_price filter parameters. You can fork this API on Parse and revise it to add price-range filtering if the underlying data supports it.