Get GitHub Issues
Fetch paginated GitHub issues and pull requests with optional filters, from the last synced snapshot rather than live from GitHub. Ordered by most recently updated. Returns an empty page when no sync has run yet. Requires the `github:read` scope when called with an API key.
Your personal API key — vw_ followed by 64 hex characters. The same key is also accepted
as Authorization: Bearer vw_....
In: header
Query Parameters
Derived at sync time — closed items and items labelled done map to done; items
labelled in-progress, in progress, or active map to in-progress; everything else
is todo.
Value in
- "todo"
- "in-progress"
- "done"
all is equivalent to omitting the filter.
Value in
- "issue"
- "pull-request"
- "all"
Items per page. Values above 50 are rejected with 400.
1 <= value <= 50200 <= value01-based page index. An alternative to offset.
1 <= value1Alternative spelling of limit. Takes precedence over limit when both are sent.
1 <= value <= 50Response Body
application/json
application/json
curl -X GET "https://example.com/api/v1/github/issues"{ "success": true, "message": "GitHub issues fetched successfully", "data": { "items": [ { "id": "gh-123456", "number": 42, "title": "Add new feature", "status": "in-progress", "kind": "issue", "url": "https://github.com/owner/repo/issues/42", "labels": [ "enhancement" ], "createdAt": "2026-04-20T10:00:00.000Z", "updatedAt": "2026-04-25T10:00:00.000Z" } ], "total": 1, "limit": 20, "offset": 0, "page": 1, "pageSize": 20, "totalPages": 1, "hasMore": false, "pagination": { "mode": "offset", "nextOffset": null, "nextCursor": null } }}Get GitHub StatsGET
Fetch aggregated issue and pull-request statistics for the configured repository, as of the last sync. Served from the last synced snapshot, not live from GitHub — `syncedAt` tells you how fresh it is. Cached for 12 hours. This endpoint has no user session of its own: call it with an API key holding the `github:read` scope, or from a whitelisted first-party origin. A request with neither is rejected with `401`.
(Admin) Sync GitHubPOST
Manually triggers a GitHub sync. **Administrators only** — the caller's session email must match the configured `ADMIN_EMAIL`; an API key cannot reach this route. Incremental by default: only issues updated since the last sync are refetched. The run is guarded by a 10-minute Redis lock, so a concurrent attempt fails with `409` rather than double-syncing. The response is the updated sync record.