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.

POST/v1/players🔒 Auth required

Create a new player or update an existing one (upsert). Matched by workspaceId + playerId.

Request Body
ParameterTypeRequiredDescription
workspaceIdstringRequiredThe workspace this player belongs to.
playerIdstringRequiredYour system's unique player ID — this is the key used to match existing records.
displayNamestringOptionalPlayer's in-game display name or username. Shown to support agents in the ticket context panel.
emailstringOptionalPlayer's email address. Used for outbound support communications when the ticket channel is email.
metadataobjectOptionalArbitrary key-value pairs providing game-specific context (e.g. level, platform, region). Maximum 50 keys. Values must be strings.
Response
200
json
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.

GET/v1/players/:id🔒 Auth required

Returns a single player object by their Keme internal player ID.

Path Parameters
ParameterTypeRequiredDescription
idstringRequiredKeme's internal player ID (kpl_...).
Response
200
json
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.

GET/v1/players/lookup🔒 Auth required

Look up a player by your external player ID within a specific workspace.

Query Parameters
ParameterTypeRequiredDescription
workspaceIdstringRequiredThe workspace to search within.
playerIdstringRequiredYour external player ID — the same value you passed when creating the player.
Response
200
json
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.

GET/v1/players/:id/tickets🔒 Auth required

List all support tickets submitted by a player. Supports filtering by status and pagination.

Path Parameters
ParameterTypeRequiredDescription
idstringRequiredKeme's internal player ID (kpl_...).
Query Parameters
ParameterTypeRequiredDescription
statusstringOptionalFilter by ticket status. Accepted values: open, resolved, closed, all. Defaults to all.
limitintegerOptionalMaximum number of tickets to return per page. Defaults to 20, maximum 100.
offsetintegerOptionalNumber of tickets to skip before returning results. Defaults to 0.
Response
200
json
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.

Caution:This action is irreversible and triggers the GDPR deletion workflow. Once initiated, player profile data cannot be recovered. Ensure you have confirmed the erasure request from the player before calling this endpoint.
DELETE/v1/players/:id🔒 Auth required

Deletes player profile and anonymises their ticket history. Irreversible. Use for GDPR right-to-erasure requests.

Path Parameters
ParameterTypeRequiredDescription
idstringRequiredKeme'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.

FieldTypeDescription
idstringKeme's internal player ID. Prefixed kpl_.
playerIdstringYour system's external player ID.
workspaceIdstringThe workspace this player belongs to.
displayNamestring | nullIn-game display name or username.
emailstring | nullPlayer email address.
ticketCountintegerTotal number of tickets submitted by this player across all statuses.
metadataobjectKey-value pairs of game-specific context. Values are strings.
firstSeenAtstring (ISO 8601)Timestamp of the first time this player was upserted.
lastSeenAtstring (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.
Note:Upsert (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.
Last updated: June 15, 2026Edit this page