Players
Players are the end-users of your game or application who submit support tickets. Players are identified by a unique ID from your system. Keme stores profile data to provide context to support agents — including display name, email, metadata, ticket history, and activity timestamps.
All player endpoints are scoped to a workspace. The workspaceId field is required whenever it cannot be inferred from the authenticated API key. Player objects returned by the API use Keme's internal id (prefixed kpl_) in addition to your own playerId.
Create or Update Player
Upserts a player record. If a player with the given playerId and workspaceId already exists, their profile is updated in place. Otherwise a new player record is created. Call this endpoint when a player first authenticates in your game, or whenever their profile data changes.
/v1/players🔒 Auth requiredCreate a new player or update an existing one (upsert). Matched by workspaceId + playerId.
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspaceId | string | Required | The workspace this player belongs to. |
| playerId | string | Required | Your system's unique player ID — this is the key used to match existing records. |
| displayName | string | Optional | Player's in-game display name or username. Shown to support agents in the ticket context panel. |
| string | Optional | Player's email address. Used for outbound support communications when the ticket channel is email. | |
| metadata | object | Optional | Arbitrary key-value pairs providing game-specific context (e.g. level, platform, region). Maximum 50 keys. Values must be strings. |
1{2 "id": "kpl_xxxx",3 "playerId": "player_12345",4 "workspaceId": "ws_xxxx",5 "displayName": "GamerTag_XYZ",6 "email": "player@example.com",7 "ticketCount": 3,8 "metadata": {9 "level": "42"10 },11 "firstSeenAt": "2025-01-15T08: 32: 00Z",12 "lastSeenAt": "2026-06-15T14: 07: 22Z"13}
Get Player
Retrieve a player record by their Keme-assigned internal ID (kpl_...). Use this endpoint when you have the Keme ID from a previous API response or webhook payload. To look up by your own external player ID, use the GET /v1/players/lookup endpoint instead.
/v1/players/:id🔒 Auth requiredReturns a single player object by their Keme internal player ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Required | Keme's internal player ID (kpl_...). |
1{2 "id": "kpl_xxxx",3 "playerId": "player_12345",4 "workspaceId": "ws_xxxx",5 "displayName": "GamerTag_XYZ",6 "email": "player@example.com",7 "ticketCount": 3,8 "metadata": {9 "level": "42",10 "platform": "PC",11 "region": "EU"12 },13 "firstSeenAt": "2025-01-15T08: 32: 00Z",14 "lastSeenAt": "2026-06-15T14: 07: 22Z"15}
Lookup Player by External ID
Find a player using your own external playerId rather than Keme's internal ID. This is the most common retrieval pattern — you pass the player ID from your game backend and receive the full Keme player object including their Keme ID, ticket count, and metadata.
/v1/players/lookup🔒 Auth requiredLook up a player by your external player ID within a specific workspace.
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspaceId | string | Required | The workspace to search within. |
| playerId | string | Required | Your external player ID — the same value you passed when creating the player. |
1{2 "id": "kpl_xxxx",3 "playerId": "player_12345",4 "workspaceId": "ws_xxxx",5 "displayName": "GamerTag_XYZ",6 "email": "player@example.com",7 "ticketCount": 3,8 "metadata": {9 "level": "42"10 },11 "firstSeenAt": "2025-01-15T08: 32: 00Z",12 "lastSeenAt": "2026-06-15T14: 07: 22Z"13}
List Player Tickets
Returns the paginated list of support tickets associated with a specific player. Results are ordered by creation date descending (most recent first). Use the status filter to narrow the response to tickets in a particular state.
/v1/players/:id/tickets🔒 Auth requiredList all support tickets submitted by a player. Supports filtering by status and pagination.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Required | Keme's internal player ID (kpl_...). |
| Parameter | Type | Required | Description |
|---|---|---|---|
| status | string | Optional | Filter by ticket status. Accepted values: open, resolved, closed, all. Defaults to all. |
| limit | integer | Optional | Maximum number of tickets to return per page. Defaults to 20, maximum 100. |
| offset | integer | Optional | Number of tickets to skip before returning results. Defaults to 0. |
1{2 "total": 5,3 "data": [4 {5 "id": "tkt_xxxx",6 "title": "Items disappeared from inventory after server rollback",7 "status": "open",8 "createdAt": "2026-06-14T10: 22: 00Z"9 },10 {11 "id": "tkt_yyyy",12 "title": "Unable to complete Season 3 battle pass quest",13 "status": "resolved",14 "createdAt": "2026-05-30T08: 15: 00Z"15 }16 ]17}
Delete Player (GDPR Erasure)
Permanently deletes a player's profile and anonymises all associated ticket history. This endpoint fulfils GDPR Article 17 right-to-erasure requests. Personal data — including display name, email address, and metadata — is purged from Keme's systems. Tickets are retained in anonymised form for operational integrity but can no longer be linked back to the player.
/v1/players/:id🔒 Auth requiredDeletes player profile and anonymises their ticket history. Irreversible. Use for GDPR right-to-erasure requests.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Required | Keme's internal player ID (kpl_...) of the player to erase. |
Player Object Reference
The following fields are present on every player object returned by the API.
| Field | Type | Description |
|---|---|---|
| id | string | Keme's internal player ID. Prefixed kpl_. |
| playerId | string | Your system's external player ID. |
| workspaceId | string | The workspace this player belongs to. |
| displayName | string | null | In-game display name or username. |
| string | null | Player email address. | |
| ticketCount | integer | Total number of tickets submitted by this player across all statuses. |
| metadata | object | Key-value pairs of game-specific context. Values are strings. |
| firstSeenAt | string (ISO 8601) | Timestamp of the first time this player was upserted. |
| lastSeenAt | string (ISO 8601) | Timestamp of the most recent upsert or ticket creation. |
Error Codes
The Players API returns standard HTTP status codes. Common error responses are listed below.
- 400 Bad Request — Missing required fields (workspaceId or playerId), invalid metadata structure, or metadata exceeds 50 keys.
- 401 Unauthorized — Missing or invalid API key. Include your key in the Authorization: Bearer <key> header.
- 403 Forbidden — The authenticated API key does not have access to the specified workspace.
- 404 Not Found — No player found with the given id or playerId + workspaceId combination.
- 429 Too Many Requests — Rate limit exceeded. Retry after the duration specified in the Retry-After response header.
POST /v1/players) always returns 200 regardless of whether a player was created or updated. Check the firstSeenAt and lastSeenAt timestamps to determine which occurred.