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_idis 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"
}| Status | Code | Means |
|---|---|---|
| 400 | INVALID_REQUEST | A value is missing or not allowed; detail says which. |
| 400 | INVALID_PARAMETER | A query parameter has the wrong format. |
| 401 | AUTHENTICATION_REQUIRED | No access token. |
| 401 | INVALID_TOKEN | The token expired or was revoked: refresh it or sign in again. |
| 403 | INSUFFICIENT_SCOPE | The token lacks a scope: ask the user to reconnect granting it. |
| 403 | API_ACCESS_NOT_GRANTED | The user’s role no longer allows external apps. |
| 403 | API_PREVIEW_NOT_ENABLED | The API preview is not enabled for the organization. |
| 403 | FORBIDDEN | The user lacks the permission for this action. |
| 404 | NOT_FOUND | Not found, or not visible to this user or connection. |
| 409 | CONFLICT | Idempotency-Key reused for a different request, or still in progress. |
| 409 | FIELD_CONFLICT | Someone changed the same field meanwhile: read again and retry. |
| 429 | RATE_LIMITED | Over 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 | /projects | Projects the connection can reach |
| GET | /projects/{project} | Members, open milestones, systems |
| GET | /projects/{project}/members | Project members |
| GET | /projects/{project}/milestones | Open milestones |
| GET | /projects/{project}/systems | Systems |
| POST | /projects/{project}/systems | Add a system (bugs:manage) |
| GET | /projects/{project}/search | Documentation passages matching q |
Tasks
| GET | /projects/{project}/tasks | Tasks, newest first, with filters |
| POST | /projects/{project}/tasks | Create 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}/status | Status and progress |
| POST | /projects/{project}/tasks/{task}/comments | Comment |
Bugs
| GET | /projects/{project}/bugs | Bugs, newest first, with filters |
| POST | /projects/{project}/bugs | Report a bug |
| GET | /projects/{project}/bugs/{bug} | A bug |
| PATCH | /projects/{project}/bugs/{bug} | Change only the fields sent |
| PUT | /projects/{project}/bugs/{bug}/status | Status |
| POST | /projects/{project}/bugs/{bug}/tasks | Create 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}/decisions | Decisions, newest first, with filters |
| POST | /projects/{project}/decisions | Record a decision |
| GET | /projects/{project}/decisions/{decision} | A decision |
| PATCH | /projects/{project}/decisions/{decision} | Change only the fields sent |
| PUT | /projects/{project}/decisions/{decision}/status | Status |
| PUT | /projects/{project}/decisions/{decision}/bugs/{bug} | Link a bug |
Reference
| GET | /openapi.yaml | This API as OpenAPI 3.1, no token needed |
