Gameheim

Developers

REST API reference

The operations of Gameheim’s AI tools, for your own scripts and integrations. The API is a preview: the contract may still change, with notice.

Access

The preview is enabled per organization: ask for it from the contact page. Every response carries Gameheim-Api-Stability: preview. The user who connects needs the External apps (MCP & API) permission.

Base URL:

https://api.gameheim.com/api/v1

The full contract as OpenAPI 3.1, readable in any OpenAPI viewer: openapi.yaml.

Authentication

  • OAuth 2.1, authorization code with PKCE (S256). Clients are public: no client secret.
  • Register your app with a Client ID Metadata Document (your client_id is an https URL) or with dynamic client registration.
  • Ask for the resource https://api.gameheim.com/api/v1. A token issued for the MCP server is refused here, and the other way round.
  • The server metadata is published at https://api.gameheim.com/.well-known/oauth-authorization-server/api.
  • Access tokens last one hour; refresh tokens rotate at every use, and a refresh token used twice closes the connection.

Conventions

Addressing

A project is its code (SKY) or its id. Tasks, bugs and decisions are their key (SKY-12, SKY-BUG-5, SKY-DEC-3) or their id. Keys change when a project’s code changes; ids never do, so store ids. Texts are Markdown.

Pagination

Lists return items and, when there is more, nextCursor: pass it back as cursor. limit goes up to 100.

Partial updates

PATCH changes only the fields sent; an empty string clears a text. If someone changed the same field since you read it, the answer is 409 FIELD_CONFLICT: read again and retry.

Idempotent creations

Send an Idempotency-Key with every creation and reuse it when you retry: the object is created once, and the retry gets the same answer. The same key with a different request is refused. Keys are remembered for 24 hours.

curl -X POST https://api.gameheim.com/api/v1/projects/SKY/tasks \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 7f9c2d1e-build-4312" \
  -d '{"title": "Fix the save crash", "priority": "HIGH"}'

Limits

Per connection: 60 reads and 20 writes a minute, 200 creations a day, announced in RateLimit-Policy. Over a limit the answer is 429 with Retry-After.

No deletion

Nothing can be deleted through the API. The only DELETE removes the link between a bug and a task.

Errors

Errors are RFC 9457 problem details with a stable code to branch on.

HTTP/1.1 404
Content-Type: application/problem+json

{
  "type": "about:blank",
  "title": "Not Found",
  "status": 404,
  "detail": "Task not found",
  "code": "NOT_FOUND"
}
StatusCodeMeans
400INVALID_REQUESTA value is missing or not allowed; detail says which.
400INVALID_PARAMETERA query parameter has the wrong format.
401AUTHENTICATION_REQUIREDNo access token.
401INVALID_TOKENThe token expired or was revoked: refresh it or sign in again.
403INSUFFICIENT_SCOPEThe token lacks a scope: ask the user to reconnect granting it.
403API_ACCESS_NOT_GRANTEDThe user’s role no longer allows external apps.
403API_PREVIEW_NOT_ENABLEDThe API preview is not enabled for the organization.
403FORBIDDENThe user lacks the permission for this action.
404NOT_FOUNDNot found, or not visible to this user or connection.
409CONFLICTIdempotency-Key reused for a different request, or still in progress.
409FIELD_CONFLICTSomeone changed the same field meanwhile: read again and retry.
429RATE_LIMITEDOver the connection’s limit: wait Retry-After seconds.

Endpoints

Paths are relative to the base URL. Parameters, bodies and responses are in the OpenAPI document.

Projects

GET/projectsProjects the connection can reach
GET/projects/{project}Members, open milestones, systems
GET/projects/{project}/membersProject members
GET/projects/{project}/milestonesOpen milestones
GET/projects/{project}/systemsSystems
POST/projects/{project}/systemsAdd a system (bugs:manage)
GET/projects/{project}/searchDocumentation passages matching q

Tasks

GET/projects/{project}/tasksTasks, newest first, with filters
POST/projects/{project}/tasksCreate a task
GET/projects/{project}/tasks/{task}A task with its latest comments
PATCH/projects/{project}/tasks/{task}Change only the fields sent
PUT/projects/{project}/tasks/{task}/statusStatus and progress
POST/projects/{project}/tasks/{task}/commentsComment

Bugs

GET/projects/{project}/bugsBugs, newest first, with filters
POST/projects/{project}/bugsReport a bug
GET/projects/{project}/bugs/{bug}A bug
PATCH/projects/{project}/bugs/{bug}Change only the fields sent
PUT/projects/{project}/bugs/{bug}/statusStatus
POST/projects/{project}/bugs/{bug}/tasksCreate the task that fixes it
PUT/projects/{project}/bugs/{bug}/tasks/{task}Link a task
DELETE/projects/{project}/bugs/{bug}/tasks/{task}Remove the link (nothing is deleted)

Decisions

GET/projects/{project}/decisionsDecisions, newest first, with filters
POST/projects/{project}/decisionsRecord a decision
GET/projects/{project}/decisions/{decision}A decision
PATCH/projects/{project}/decisions/{decision}Change only the fields sent
PUT/projects/{project}/decisions/{decision}/statusStatus
PUT/projects/{project}/decisions/{decision}/bugs/{bug}Link a bug

Reference

GET/openapi.yamlThis API as OpenAPI 3.1, no token needed