---
title: "Get GitHub sync status"
method: GET
path: "/api/repos/{owner}/{repo}/github/status"
tags: ["GitHub"]
---

# Get GitHub sync status

`GET /api/repos/{owner}/{repo}/github/status`

## Request

- Base URL: `https://git.cafe`
- URL: `https://git.cafe/api/repos/{owner}/{repo}/github/status`
- Auth: one of:
  - API key in cookie `gc-session`
  - HTTP bearer
  - HTTP basic
  - HTTP token

Returns bounded GitHub mirror, job, and authority health for a repository without provider secrets. Requires authenticated authority and enforces current resource policy.

## Path parameters

- `owner` string, required
- `repo` string, required

## Response `200`

Response for status 200

- object
  - `repoId` string, required
  - `mirror` object, nullable, required
    - `providerAuthority` string, required
    - `installationId` integer, nullable, required
    - `repositoryId` integer, nullable, required
    - `owner` string, required
    - `repository` string, required
    - `state` 'active' | 'importing' | 'paused' | 'error', required
    - `direction` 'pull' | 'push' | 'sync', required
    - `policy` 'manual' | 'gc2-leader' | 'github-leader', required
    - `conflictWinner` 'gitcafe' | 'github', required
    - `version` integer, required
    - `sourceRef` string, required
    - `targetRef` string, required
    - `syncPullRequests` boolean, required
    - `syncIssues` boolean, required
    - `lastPullAt` string, date-time, nullable, required
    - `lastPushAt` string, date-time, nullable, required
    - `lastDeliveryAt` string, date-time, nullable, required
    - `nextReconcileAt` string, date-time, nullable, required
    - `primaryConvergedAt` string, date-time, nullable, required
    - `oldestPendingPullAt` string, date-time, nullable, required
    - `nextMetadataReconcileAt` string, date-time, nullable, required
    - `nativePending` integer, required
    - `nativeBlocked` integer, required
    - `currentGenerationInventoryComplete` boolean, required
    - `currentGenerationCopyComplete` boolean, required
    - `metadataPending` integer, required
    - `metadataBlocked` integer, required
    - `metadataRepoBlocked` integer
    - `metadataCompletedScans` integer, required
    - `authorization` 'current' | 'refreshing' | 'stale', required
    - `renewalSuggested` boolean, required
    - `lastError` object, nullable, required
      - `code` string, required
      - `at` string, date-time, required
    - `phases` object[], required
      - `kind` 'pull' | 'metadata-scan' | 'pr-artifacts' | 'issue-import', required
      - `queued` integer, required
      - `running` integer, required
      - `succeeded` integer, required
      - `blocked` integer, required
      - `failed` integer, required
    - `importState` 'importing' | 'complete' | 'needs-attention', required
    - `importComplete` boolean, required
    - `importSubjectFailures` integer, required
  - `jobs` object[], required
    - `jobId` string, required
    - `state` 'queued' | 'running' | 'succeeded' | 'blocked' | 'failed', required
    - `providerState` 'unsent' | 'confirmed' | 'outcome_unknown' | 'blocked' | 'not_delivered' | 'null', nullable, required
    - `kind` string, required
    - `configGeneration` integer, required
    - `sourceRef` string, nullable, required
    - `targetRef` string, nullable, required
    - `createdAt` string, date-time, required
    - `errorCode` string, nullable, required
    - `superseded` boolean, required
  - `openEffects` object[], required
    - `jobId` string, required
    - `kind` string, required
    - `state` 'queued' | 'running' | 'succeeded' | 'blocked' | 'failed', required
    - `providerState` 'unsent' | 'confirmed' | 'outcome_unknown' | 'blocked' | 'not_delivered' | 'null', nullable, required
    - `errorCode` string, nullable, required
    - `attemptCount` integer, required
    - `effectStartedAt` string, date-time, nullable, required
    - `reconcilable` boolean, required
  - `pendingWritebacks` object[], required
    - `debtId` string, required
    - `intentAction` string, nullable, required
    - `pullNumber` integer, nullable, required
    - `reason` string, nullable, required
    - `nextAttemptAt` string, date-time, nullable, required
  - `bulk` object, nullable, required
    - `epochId` string, required
    - `purpose` 'bootstrap' | 'catch-up', required
    - `state` 'acquiring' | 'settling' | 'published' | 'superseded', required
    - `anchorAt` string, date-time, required
    - `baselinePublishedAt` string, date-time, nullable, required
    - `collections` object[], required
      - `collection` 'labels' | 'milestones' | 'issues' | 'pulls' | 'issue-comments' | 'review-comments' | 'reviews' | 'checks' | 'reactions', required
      - `pass` 'baseline' | 'hot' | 'delta', required
      - `state` 'pending' | 'running' | 'complete' | 'blocked' | 'deferred', required
      - `enumerated` integer, required
      - `published` integer, required
      - `enrichmentPending` integer, required
      - `blocked` integer, required
      - `watermarkAt` string, date-time, nullable, required
      - `lastError` object, nullable, required
        - `code` string, required
        - `reason` string, nullable, required

## Other responses

- `400`: The request is invalid.
- `401`: Authentication is required, or the supplied credential is invalid.
- `403`: The credential does not permit this operation. A `code`, when present, names the refusal.
- `404`: The resource does not exist or is not visible to the caller.
- `409`: The request conflicts with the current state. A `code`, when present, names the refusal; `retryable` says whether the same request can succeed later, and `operationId` names the operation in the way.
- `429`: A rate limit is exhausted. Wait Retry-After seconds; the value is a hint, so back off on a repeat 429.
- `503`: A required service is temporarily unavailable; retry later.

---

[API](https://skmtc.dev/gitcafe/apis/git-cafe-api.md) - [All operations](https://skmtc.dev/gitcafe/apis/git-cafe-api/llms.txt) - [OpenAPI document](https://skmtc.dev/gitcafe/apis/git-cafe-api/revisions/9fa233d2986d?raw)
