---
title: "List user's GitHub repos"
method: GET
path: "/github/repos"
tags: ["GitHub"]
---

# List user's GitHub repos

`GET /github/repos`

## Request

- Base URL: `https://api.apphandoff.com/api`
- URL: `https://api.apphandoff.com/api/github/repos`
- Auth: API key in cookie `sb-access-token`

Returns the user's GitHub repositories enriched with Lovable detection status.

**401** — Missing or invalid AppHandoff session (Bearer/cookie). Portals should treat as logout / re-login.

**403** with `code: GITHUB_AUTH` — GitHub token rejected (expired, revoked, or missing `repo` scope).
The AppHandoff session remains valid; prompt user to reconnect GitHub. Do **not** clear Supabase tokens.

## Response `200`

Repo list

- object
  - `repos` EnrichedRepo[], required
    - `id` integer, required
    - `full_name` string, required
    - `name` string
    - `private` boolean, required
    - `html_url` string, uri
    - `description` string, nullable
    - `language` string, nullable
    - `updated_at` string, date-time
    - `kind` 'frontend' | 'backend' | 'fullstack' | 'monorepo' | 'unknown', required: Lightweight hint at what this repo is, used to pre-select the role in the picker
    - `reason` string, required: Short human-readable reason for the kind (e.g. "Vite + React", "Express", "Turbo monorepo")
  - `total` integer, required

## Other responses

- `401`: Not authenticated
- `403`: GitHub token invalid, expired, or insufficient scope. AppHandoff JWT/session is still valid.

---

[API](https://skmtc.dev/apphandoff/apis/apphandoff-api.md) · [All operations](https://skmtc.dev/apphandoff/apis/apphandoff-api/llms.txt) · [OpenAPI document](https://skmtc.dev/apphandoff/apis/apphandoff-api/revisions/9f138fe46d56?raw)
