Skip to main content

Command Palette

Search for a command to run...

API

Origin Migration API

Origin Migration API は、GitHub と Origin ミラー間でリポジトリを移行する operator 向けです。これらのエンドポイントは、Origin App からではなく、Cursor ユーザーとして実行する移行スクリプトから呼び出してください。

origin auth login でサインインするか、origin api で Cursor API キーを渡してください。ユーザー認証済みの CLI リクエストを参照してください。

これらのエンドポイントは、Origin API の base URL である https://api.cursor.com/v1/origin と、同じエラーモデルを使用します。

Scopes

repository:mirror:write、repository:mirror:delete、repository:metadata:read は user policy scope です。移行 ミラーリポジトリ には Write (repository:mirror:write) が必要です。リポジトリミラーのデタッチ には Admin (repository:mirror:delete) が必要です。ミラー移行ジョブの取得 と 有効なミラー移行ジョブの取得 には repository:metadata:read が必要です。さらに、上流 の GitHub ソース側でも対象リポジトリの管理権限が必要です。

これらの scope は Origin App のインストール時に要求することはできません。Origin App からこれらのエンドポイントを呼び出すことはできません。

Endpoint リファレンス

Transition Repo Mirror

POST/v1/origin/repos/{ownerSlug}/{repoName}/mirror:transition
Scoperepository:mirror:writeAuthUser access token

ミラーリポジトリのミラー状態の遷移を開始し、それを追跡するジョブを返します。ジョブの実行中、リポジトリは遷移中のミラーステータスになります。ジョブが終了ステータスに達するまで、Get Active Mirror Transition Job または Get Mirror Transition Job をポーリングしてください。

遷移が想定する開始状態にないリポジトリ、またはすでに実行中の遷移ジョブがあるリポジトリでは、FailedPrecondition (HTTP 400) が返ります。呼び出し元はミラーの上流ソースでそのリポジトリを管理できる必要があり、そのアクセス権がない場合は 403 が返ります。

Path Parameters

ownerSlug string 必須

所有エンティティの一意の slug。

repoName string 必須

オーナーエンティティ内で一意のリポジトリ名。

Request Body

transition string 必須

開始するミラー状態の変更。指定できる値: initial_to_inbound (初回同期に失敗したミラーを再試行し、inbound に移行します) 。

Response Fields

repository object

遷移中のミラー状態を反映したリポジトリ。Get Repo と同じフィールドを持ちます。

job object

遷移を追跡するジョブで、Get Mirror Transition Job と同じフィールドを持ちます。終了ステータスに達するまでポーリングしてください。
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/mirror:transition' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "transition": "initial_to_inbound"}'

レスポンスの構造:

{  "repository": {    "id": "repo_01k2ja2000e0080000000000q4",    "name": "rocket",    "fullName": "acme/rocket",    "owner": {      "slug": "acme",      "id": "ns_01k2ja2000e0080000000000p3",      "type": "team"    },    "defaultBranch": "main",    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-02T15:00:00Z",    "pushedAt": "2026-08-02T14:45:00Z",    "cloneUrl": "https://origin.cursor.com/git/acme/rocket.git",    "mirror": {      "source": "github",      "sourceId": "R_kgDOAbc123",      "status": "inbound"    }  },  "job": {    "id": "rmt_01k2ja2000e0080000000000m3",    "transition": "initial_to_inbound",    "status": "running",    "phase": "initializing-mirror-fetch",    "attemptCount": 1,    "startedAt": "2026-08-02T15:00:00Z",    "createdAt": "2026-08-02T14:59:30Z",    "updatedAt": "2026-08-02T15:01:00Z"  }}

リポジトリミラーのデタッチ

DELETE/v1/origin/repos/{ownerSlug}/{repoName}/mirror
Scoperepository:mirror:deleteAuthUser access token

ミラーリポジトリを上流ソースから完全に切断します。リポジトリは現在のコンテンツを保持したまま native リポジトリとなり、双方向の同期が停止し、ミラーの deploy credential は削除されます。レスポンスボディは空です。

デタッチはこの API では元に戻せません。ミラーを持ったことがないリポジトリでは FailedPrecondition (HTTP 400) が返されます。すでにデタッチ済みのリポジトリに対しては、何も変更せずに成功します。

Path Parameters

ownerSlug string 必須

所有エンティティの一意な slug。

repoName string 必須

リポジトリ名。オーナーエンティティ内で一意です。

Response Fields

リクエストが成功した場合、レスポンスボディは返されません。

curl --request DELETE \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/mirror' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Response:

204 No Content

ミラー移行ジョブの取得

GET/v1/origin/repos/{ownerSlug}/{repoName}/mirror/transition-jobs/{jobId}
Scoperepository:metadata:readAuthUser access token

IDを指定して、mirror移行ジョブを1件返します。存在しないジョブIDの場合は 404 を返します。

パスパラメータ

ownerSlug string 必須

所有エンティティの一意のスラッグ。

repoName string 必須

リポジトリ名。オーナーエンティティ内で一意です。

jobId string 必須

遷移ジョブの識別子。job.id として返される値です。

レスポンスフィールド

id string

ジョブの一意の識別子です。

transition string

このジョブが実行するミラー方向の変更。指定可能な値: initial_to_inbound。

status string

ライフサイクルの状態。指定可能な値: queued、running、succeeded、failed_rolled_back、requires_attention、superseded。succeeded、failed_rolled_back、superseded は終了状態です。requires_attention の場合は、オペレーターによる介入が必要です。

phase string

表示およびデバッグ用の、status 内の進捗詳細。queued、starting、draining-writes、initializing-mirror-fetch、finalizing-mirror-fetch、finalizing-mirror-push、snapshotting-refs、verifying-integrity、reopening-inbound-mirror、committing-target-status、rolling-back、completed のいずれか。移行プロセスの改善に伴って新しいフェーズが追加される場合があるため、フェーズ名で判定せず、status をポーリングして完了を確認してください。

attemptCount integer

このジョブが試行された回数。

drainUntil string

進行中の移行の書き込みドレインウィンドウが終了する時刻の RFC 3339 タイムスタンプ。ドレインフェーズ以外では存在しません。

lastErrorCode string

ジョブが前回失敗した理由を示す安定したコード (InboundMirrorDrainTimeout、MirrorIntegrityMismatch など) 。ジョブが失敗していない間は含まれません。

lastErrorMessage string

lastErrorCode の人間が読める形式の詳細。ジョブが失敗していない場合は含まれません。

startedAt string

ジョブの実行が開始された日時の RFC 3339 タイムスタンプ。キュー待ちの間は含まれません。

completedAt string

jobが終了statusに達した日時のRFC 3339 timestamp。それまでは含まれません。

createdAt string

RFC 3339 形式のジョブ作成タイムスタンプ。

updatedAt string

RFC 3339 形式のジョブ更新タイムスタンプ。
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/mirror/transition-jobs/JOB_ID' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

レスポンスの構造:

{  "id": "rmt_01k2ja2000e0080000000000m3",  "transition": "initial_to_inbound",  "status": "succeeded",  "phase": "completed",  "attemptCount": 1,  "startedAt": "2026-08-02T15:00:00Z",  "completedAt": "2026-08-02T15:12:00Z",  "createdAt": "2026-08-02T14:59:30Z",  "updatedAt": "2026-08-02T15:12:00Z"}

有効なミラー移行ジョブの取得

GET/v1/origin/repos/{ownerSlug}/{repoName}/mirror/transition-jobs:active
Scoperepository:metadata:readAuthUser access token

リポジトリで現在有効なミラー移行ジョブと、直近の終了済みジョブを返します。どちらのフィールドも任意のため、一度も移行したことのないリポジトリでは空の object が返ります。移行の進行状況を追うには、この endpoint を poll してください。activeJob が消えた時点で、lastJob からどのように終了したかを確認できます。

Path Parameters

ownerSlug string 必須

所有エンティティの unique slug。

repoName string 必須

リポジトリ名。オーナーエンティティ内で一意です。

Response Fields

activeJob object

現在有効な移行ジョブ。ミラー移行ジョブの取得 と同じフィールドを持ちます。進行中の移行がない場合は含まれません。

lastJob object

終了ステータスに達した直近のジョブ。ミラー移行ジョブの取得 と同じフィールドを持ちます。リポジトリが一度も移行を完了していない場合は含まれません。
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/mirror/transition-jobs:active' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

レスポンスの構造:

{  "activeJob": {    "id": "rmt_01k2ja2000e0080000000000m4",    "transition": "initial_to_inbound",    "status": "running",    "phase": "initializing-mirror-fetch",    "attemptCount": 2,    "startedAt": "2026-08-02T15:00:00Z",    "createdAt": "2026-08-02T14:59:30Z",    "updatedAt": "2026-08-02T15:01:00Z"  },  "lastJob": {    "id": "rmt_01k2ja2000e0080000000000m3",    "transition": "initial_to_inbound",    "status": "failed-rolled-back",    "phase": "completed",    "attemptCount": 1,    "startedAt": "2026-08-01T10:00:00Z",    "completedAt": "2026-08-01T10:12:00Z",    "createdAt": "2026-08-01T09:59:30Z",    "updatedAt": "2026-08-01T10:12:00Z"  }}