CLI

Rerent(https://rerent.ai)는 미사용 GPU 노드 시간을 노드·시간 단위로 사고파는 마켓플레이스예요. 공급자는 빈 GPU 서버를 등록해 시간을 팔고, 구매자는 필요한 시간 창만 사서 그 위에 컨테이너(인스턴스)를 띄우고, 남는 시간은 다시 팔아요. rerent 는 그 REST API(https://rerent.ai/docs/api) 전체를 다루는 의존성 없는 단일 파일 CLI(Node 20+)이고, 이 설명서는 CLI 자신이 rerent manual 로 출력해요 — 사이트 문서(/docs/cli)와 npm README 도 같은 명세에서 생성되므로 항상 코드와 같아요.

설치·인증

npm i -g rerent-cli            # 명령 이름은 rerent · 또는 npx rerent-cli …
curl -fsSL https://rerent.ai/cli/rerent.mjs -o /usr/local/bin/rerent && chmod +x /usr/local/bin/rerent   # npm 없이
rerent login --token rlt_…     # 설정 → API 토큰에서 발급 · ~/.rerent/config.json 에 저장 (RERENT_TOKEN / RERENT_URL 환경변수가 우선)
rerent whoami

규약 — 모든 명령에 공통

  • --json 을 붙이면 사람용 표 대신 API 응답 JSON 원본을 그대로 출력해요. 스크립트·에이전트는 이걸 쓰세요. 목록은 {object:"list", data:[…], has_more, cursor}, 오류는 종료 코드 1 + stderr 에 <HTTP> <code>: <message>.
  • 시각(--start --end --until --from): now · "in 3h"(m/h/d/w) · tomorrow(KST 0시) · ISO(2026-09-15T09:00:00+09:00) · epoch 초. 분 단위로 내림 정렬돼요. 기간(--duration --min-runtime): 30m 1h 12h 3d 2w. --end 가 있으면 --duration 대신 써요.
  • 금액은 노드·시간당 원(₩) 정수(30000 · ₩30,000 모두 됨). 노드 = SKU 가 정한 GPU 묶음(예 8× H100). GPU·시간당 값이 필요하면 SKU 의 gpus_per_node 로 나누세요.
  • 자원 지정은 ID(ordr_… inst_…)나 이름(풀·템플릿·이미지·배포·워크스페이스·SKU alias) 어느 쪽이든 돼요. 자원 경로 rerent:pool:<조직>:<워크스페이스>:<이름> 도 받아요.
  • 목록 필터: --tag k=v[,k2=v2](모두 만족) · --tag-key k · --workspace W · --pool P · --deployment D · --limit N — 명령이 지원하는 것만 적용돼요(각 명령의 사용법 참고).
  • 태그는 --tag k=v,k2=v2 로 생성 시 붙이고 set 으로 전부 교체해요(키 ≤128자 · 값 ≤256자 · 쉼표와 = 금지 · 자원당 50개).
  • 역할: 토큰의 역할이 곧 권한. admin 전부 · member 매수·인스턴스·조회(매도·토큰·클러스터 불가) · viewer 조회만(변경 명령은 403 read_only).
  • 멱등성: orders create 는 자동 Idempotency-Key. 재시도가 안전해요.

흔한 흐름(에이전트용)

  1. GPU 시간 사서 SSH 접속: rerent market → rerent availability --sku icn-1-h100 --duration 24h → rerent orders create --side buy --sku icn-1-h100 --start now --duration 12h --nodes 1 --max-rate 30000 --estimate(견적) → 같은 명령에서 --estimate 빼기 → rerent ssh-keys add --name laptop --file ~/.ssh/id_ed25519.pub → rerent instances create --pool default --image pytorch → rerent instances(ssh 명령 확인) 또는 rerent instances ssh <id>.
  2. 항상 N대 유지(자동 매수): rerent templates create --name train --image ghcr.io/me/train:latest --mode custom --command "python train.py" → rerent deployments create --pool default --sku icn-1-h100 --target 2 --max-rate 30000 --horizon 6 --template train → rerent deployments get <name> 으로 확보율·오류 확인. 끝낼 땐 deployments set <name> --target 0 또는 rm.
  3. 남는 시간 되팔기: rerent pool default(보유 스케줄) → rerent pools sellable default --sku icn-1-h100 → rerent orders create --side sell --pool default --sku icn-1-h100 --start "in 8h" --duration 4h --nodes 1 --min-rate 20000 --allow-standing --allow-partial → rerent realized.
  4. 내 GPU 서버 팔기(공급자): rerent clusters create --name lab --sku icn-1-h100 --nodes gpu1.lab.internal,gpu2.lab.internal --until "in 30d" --auto-sell --price 28000 --floor 18000 → 출력된 설치 명령을 각 서버에서 sudo bash → rerent clusters get <id>(온라인 확인) → rerent clusters assignments <id> · rerent credits payout ….
  5. 상태 변화 받기: rerent events --type instance.running,order.filled 폴링, 또는 rerent webhooks create --url https://my.app/hook --events instance.running 뒤 서명 검증(https://rerent.ai/docs/events).

CLI 에 없는 조합은 rerent api <METHOD> </v1/…> --data '{…}' 로 어떤 엔드포인트든 그대로 부를 수 있어요. 아래 표의 「API」열이 각 명령이 실제로 부르는 엔드포인트예요.

계정·인증·조직

토큰 하나가 조직 하나를 대표해요. 토큰 역할(admin·member·viewer)이 곧 CLI 의 권한이고, viewer 토큰은 조회(GET) 명령만 돼요.

명령하는 일API
rerent login --token rlt_… [--url https://rerent.ai]토큰을 ~/.rerent/config.json 에 저장(RERENT_TOKEN 환경변수로도 됨)—
rerent whoami조직 · 사용자 · 역할 · 잔액/홀드/가용 크레딧GET /v1/account
rerent tokens [list]API 토큰 목록(접두·역할·만료)GET /v1/tokens
rerent tokens create --name N [--role admin|member|viewer] [--expires-days 90]토큰 발급(값은 지금 한 번만 출력)POST /v1/tokens
rerent tokens rm <id>토큰 회수DELETE /v1/tokens/{id}
rerent members [list]조직 멤버와 역할GET /v1/members
rerent members set <userId> --role owner|admin|member|viewer멤버 역할 변경(소유자만)PATCH /v1/members/{userId}
rerent members rm <userId>멤버 제거DELETE /v1/members/{userId}
rerent invites create --email E [--role admin|member|viewer]초대 링크 발급(메일로도 전송)POST /v1/invites
rerent users [list]조직 사용자(members 와 같은 데이터 · resource_path 포함)GET /v1/users
rerent users get <id|email>사용자 한 명GET /v1/users/{id}
rerent ssh-keys [list]조직 SSH 공개키(돌고 있는 인스턴스에 즉시 반영)GET /v1/ssh-keys
rerent ssh-keys add --name N --file ~/.ssh/id_ed25519.pub공개키 등록(--key "ssh-ed25519 AAAA…" 로 직접도 됨)POST /v1/ssh-keys
rerent ssh-keys rm <id>공개키 삭제DELETE /v1/ssh-keys/{id}
rerent limits내 한도와 사용량(노드·시간 총량 · 개수 한도)GET /v1/limits

마켓 조회(공개 · 토큰 없이 가능)

가격은 「노드·시간당 원(₩)」이에요. 시각은 분 단위 epoch 초(60의 배수)로 맞춰져요.

명령하는 일API
rerent skus [--all]거래 중인 SKU(--all 이면 중단 포함)GET /v1/skus
rerent sku <id|alias>SKU 상세GET /v1/skus/{id}
rerent availability [--sku S] [--start now] [--duration 24h]살 수 있는 노드 수 스케줄(가격 무관) — SKU 하나 또는 전부GET /v1/skus/availability<br>GET /v1/skus/{id}/availability
rerent marketSKU 별 최저 매도 호가 · 가능 노드 · 24시간 체결GET /v1/orderbook/summary
rerent windows --sku S [--start now] [--duration 7d]열린 주문이 있는 시간 창과 최우선 매수/매도GET /v1/orderbook/windows
rerent quote --sku S --start <t> --duration <d>한 시간 창의 톱오브북(최고 매수·최저 매도·스프레드)GET /v1/orderbook/quote
rerent depth --sku S --start <t> --duration <d> [--depth 20]가격 레벨별 매도·매수 노드 수GET /v1/orderbook/depth
rerent fills [--sku S] [--start <t> --duration <d>] [--limit 50]체결 내역(익명 · 가격 발견용)GET /v1/orderbook/fills

사기·팔기 — 주문

주문은 「SKU × 시간 창 × 노드 수 × 지정가」예요. 매수는 --max-rate(상한), 매도는 --min-rate(하한). 즉시 체결 안 되는 나머지는 기본으로 취소되고, --allow-standing 을 주면 호가에 남아요. --estimate 는 체결 없이 견적만.

명령하는 일API
rerent orders create --side buy|sell --pool P --sku S --start <t> --duration <d> --nodes N --max-rate|--min-rate ₩ [--allow-standing] [--allow-partial] [--memo M] [--tag k=v] [--idempotency-key K] [--estimate]매수·매도 주문(또는 견적)POST /v1/orders<br>POST /v1/orders/estimate
rerent orders [list] [--side buy|sell] [--state standing|filled|…] [--pool P] [--deployment D] [--managed 0] [--tag k=v]내 주문(--managed 0 이면 자동 매수 주문 제외)GET /v1/orders
rerent orders get <id>주문 상세와 체결(fills)GET /v1/orders/{id}
rerent orders cancel <id>남은(미체결) 부분 취소 — 이미 체결된 시간은 그대로POST /v1/orders/{id}/cancel<br>DELETE /v1/orders/{id}/cancel
  • orders create — orders create 는 자동으로 Idempotency-Key 를 붙여서 네트워크 오류 뒤 같은 명령을 다시 실행해도 중복 주문이 나지 않아요(--idempotency-key 로 직접 지정 가능). 매수 주문이 한도를 넘으면 403 limit_exceeded 로 주문 없이 거절돼요.

내 컴퓨트 — 풀

산 시간은 풀에 쌓여요(기본 풀 default). 풀 단위로 인스턴스를 띄우고, 남는 시간은 풀에서 다시 팔아요. 풀 간 전송(transfers)으로 시간을 옮길 수도 있어요.

명령하는 일API
rerent pools [list] [--workspace W] [--tag k=v]풀 목록과 남은 노드·시간GET /v1/pools
rerent pools create --name N [--workspace W] [--tag k=v]풀 만들기POST /v1/pools
rerent pools set <id|name> [--name N] [--workspace W] [--tag k=v,…]이름 변경 · 워크스페이스 이동 · 태그 교체PATCH /v1/pools/{id}
rerent pools launch <id|name> --image I [--mode ssh|custom] [--command C] [--startup-script FILE] [--env K=V,…] [--ports 8000,8888] [--priority 1-4] | --off자동 시작 템플릿 — 이 풀에 시간이 배정되면 인스턴스가 자동으로 뜸(--off 로 해제)PATCH /v1/pools/{id}
rerent pools rm <id|name>풀 삭제(열린 주문·남은 할당이 없을 때만)DELETE /v1/pools/{id}
rerent pools sellable <id|name> --sku S이 풀에서 지금 팔 수 있는 시간 스케줄GET /v1/pools/{id}/sellable
rerent pools extend <id|name> --sku S --duration <d>|--end <t> --max-rate ₩ [--allow-standing] [--estimate]보유 스케줄의 끝을 같은 노드 수로 연장 매수POST /v1/pools/{id}/extend
rerent pool <id|name>풀 하나의 SKU 별 보유 스케줄GET /v1/pools/{id}
rerent transfers [list]풀 간 시간 전송 기록GET /v1/pools/transfers
rerent transfers create --from P --to P --sku S --start <t> --duration <d>|--end <t> --nodes N보유 시간을 다른 풀로 옮김POST /v1/pools/transfers
rerent transfers get <id>전송 하나GET /v1/pools/transfers/{id}
rerent realized실현 할인 — 산 값 대비 재판매로 회수한 금액 · 공급자 매출GET /v1/stats/realized

인스턴스 — 산 시간 위에서 컨테이너 돌리기

인스턴스는 풀에 배정된 노드 위에서 도는 컨테이너예요. 노드가 비어 있으면 1분 안에 시작하고, 배정이 없으면 「대기」로 남아 배정되는 순간 떠요. ssh 모드는 SSH 서버가 든 컨테이너(조직 SSH 키 자동 주입), custom 은 지정한 명령만 실행해요.

명령하는 일API
rerent nodes내게 배정된 노드(현재·예정) · 온라인 여부 · 그 위의 인스턴스와 ssh 명령GET /v1/nodes
rerent instances [list] [--all] [--pool P] [--deployment D] [--workspace W] [--tag k=v]내 인스턴스(--all 이면 종료된 것 포함)GET /v1/instances
rerent instances create --pool P [--sku S] [--template T] [--image I] [--mode ssh|custom] [--command C] [--startup-script FILE] [--env K=V,…] [--ports 8000,8888] [--priority 1-4|--level yield|normal|preferred|critical] [--allow-cidrs 1.2.3.0/24] [--tag k=v] [--count N] [--name NAME]인스턴스 생성(템플릿 + 덮어쓰기 가능 · --count 로 여러 개)POST /v1/instances
rerent instances get <id>인스턴스 상세(이미지·노드·배정·SSH)GET /v1/instances/{id}
rerent instances set <id> | --ids a,b,c [--name N] [--priority 1-4|--level L] [--tag k=v,…]이름·우선순위·태그 변경(--ids 로 여러 개 한 번에 · 전부 성공 아니면 전부 실패)PATCH /v1/instances/{id}<br>PATCH /v1/instances
rerent instances ssh <id>접속 정보(ssh 명령 · host · port · 허용 대역 · 등록 키)GET /v1/instances/{id}/ssh
rerent instances logs <id> [--tail 300]컨테이너 로그GET /v1/instances/{id}/logs
rerent instances exec <id> -- <cmd…>명령 한 번 실행(≤50초) · 출력 반환POST /v1/instances/{id}/exec
rerent instances replace <id>종료 + 같은 설정으로 새 인스턴스 대기열(이미지 재pull · 노드 교체)POST /v1/instances/{id}/replace
rerent instances rm <id>인스턴스 종료(산 시간은 남음 · 배포 관리면 1분 안에 다시 채워짐)DELETE /v1/instances/{id}
rerent instances presets공개 이미지 프리셋(pytorch·cuda 등)과 기본값GET /v1/instances/presets
rerent templates [list] [--workspace W] [--tag k=v]인스턴스 템플릿(재사용 설정 · 불변)GET /v1/instance-templates
rerent templates get <id|name>템플릿 하나(전체 설정 JSON)GET /v1/instance-templates/{id}
rerent templates create --name N --image I [--mode ssh|custom] [--command C] [--startup-script FILE] [--env K=V,…] [--ports 8000] [--priority 1-4] [--allow-cidrs 1.2.3.0/24,…] [--tag k=v] [--workspace W] [--description D]템플릿 만들기(--image 에 이미지 카탈로그 이름도 됨 · 응답에 env 는 값 없이 키만 env_keys)POST /v1/instance-templates
rerent templates set <id|name> [--tag k=v,…] [--description D]태그·설명만 변경(그 밖은 불변 → 새 이름으로 다시 만들기)PATCH /v1/instance-templates/{id}
rerent templates rm <id|name>삭제(배포·살아 있는 인스턴스가 쓰면 409)DELETE /v1/instance-templates/{id}
rerent images [list] [--workspace W] [--tag k=v] [--status active|revoked]이미지 카탈로그(내 것 + 공개 프리셋)GET /v1/images
rerent images get <id|name>이미지 하나(자격증명은 절대 안 나옴)GET /v1/images/{id}
rerent images create --name N --image-ref REF [--registry ghcr.io --username U --password P] [--tag k=v] [--workspace W] [--description D]이미지 등록(비공개 레지스트리 자격증명은 pull 에만 쓰이고 응답에 안 나옴 · 비밀번호는 RERENT_REGISTRY_PASSWORD 환경변수로도)POST /v1/images
rerent images set <id|name> [--tag k=v,…] [--description D] [--username U --password P | --no-auth]태그·설명·자격증명 교체PATCH /v1/images/{id}
rerent images revoke|reinstate <id|name>회수(새 인스턴스에 못 씀 · 돌던 것은 그대로) / 복구POST /v1/images/{id}/revoke<br>POST /v1/images/{id}/reinstate
rerent images rm <id|name>삭제(살아 있는 인스턴스·템플릿이 쓰면 409)DELETE /v1/images/{id}
  • instances create — 우선순위는 같은 풀에 노드가 모자랄 때 누가 먼저 노드를 받는지(4=critical 이 먼저). --allow-cidrs 는 SSH 접속을 허용할 IPv4 대역이고 컨테이너 sshd 규칙으로 실제 적용돼요(노출 포트에는 적용되지 않음).

자동 매수 · 배포(deployments)

배포는 「이 SKU 노드 N대를 항상 유지」하는 자동화예요. spot(기본)은 확보 기간(앞으로 H시간) 안의 빈 구간을 상한가 이하 매물에서 매 분 즉시 사고, 템플릿이 있으면 산 노드에 인스턴스를 목표 수만큼 유지해요. generic 은 매수 없이 이미 산 시간 위에서 인스턴스 수만 맞춰요(템플릿 필수). 풀×SKU 마다 배포는 하나.

명령하는 일API
rerent deployments [list] [--pool P] [--kind spot|generic] [--workspace W] [--tag k=v]배포 목록 · 인스턴스 현황 · 상태 메시지GET /v1/deployments
rerent deployments get <id|name>배포 상세(확보율 · 다음 빈 구간 · 쓴 돈 · 마지막 오류)GET /v1/deployments/{id}
rerent deployments create --pool P --sku S --target N [--kind spot|generic] [--max-rate ₩] [--horizon 6] [--min-runtime 60m] [--template T] [--name-template "w-{{nanoid(8)}}"] [--name NAME] [--tag k=v]배포 만들기(spot 은 --max-rate 필수 · generic 은 --template 필수)POST /v1/deployments
rerent deployments set <id|name> [--target N] [--enabled true|false] [--max-rate ₩] [--horizon H] [--min-runtime 60m] [--template T] [--name N] [--tag k=v,…]목표 수·정지/재개·상한가·템플릿 변경(정지는 대기 인스턴스만 내리고 도는 것은 유지)PATCH /v1/deployments/{id}
rerent deployments run <id|name>(spot) 지금 한 번 매수 시도 — 꺼져 있어도POST /v1/deployments/{id}/run
rerent deployments rm <id|name>배포 삭제(generic 은 관리 인스턴스 종료 · spot 은 도는 것은 두고 더 사지 않음)DELETE /v1/deployments/{id}
  • deployments create — --horizon 은 지금부터 몇 시간 앞까지 항상 확보해 둘지(1~168), --min-runtime 은 한 번에 사는 최소 길이(1분짜리 조각 매수 방지 · 시간 단위로 올림 1~24h → 응답 min_runtime_minutes/block_hours). 인스턴스 이름 템플릿은 {{nanoid(n)}} 이 필수.

워크스페이스

조직 안에서 풀·템플릿·이미지를 묶는 단위예요. 목록 명령의 --workspace W 필터가 이걸 써요. 자원 경로 rerent:pool:<조직>:<워크스페이스>:<이름> 을 id 자리에 써도 돼요.

명령하는 일API
rerent workspaces [list]워크스페이스와 안의 자원 수GET /v1/workspaces
rerent workspaces get <id|name>하나GET /v1/workspaces/{id}
rerent workspaces create --name N [--description D]만들기POST /v1/workspaces
rerent workspaces set <id|name> [--name N] [--description D]이름·설명 변경PATCH /v1/workspaces/{id}
rerent workspaces rm <id|name>삭제(풀·템플릿·이미지가 남아 있으면 409)DELETE /v1/workspaces/{id}

크레딧 — 충전·출금·원장

모든 매수는 선충전 크레딧(₩)에서 나가고, 매도 대금은 수수료를 뺀 순액이 크레딧으로 들어와요. 충전은 요청 뒤 운영자가 입금을 확인하면 반영돼요.

명령하는 일API
rerent credits ledger [--limit 100]원장(입출금·매수·매도·수수료 한 줄씩 · 잔액 추이)GET /v1/credits/ledger
rerent credits topups [list]충전 요청 목록(입금 계좌 안내 포함)GET /v1/credits/topups
rerent credits topup --amount ₩ [--memo M]충전 요청(최소 ₩10,000 · 입금 확인 뒤 반영)POST /v1/credits/topups
rerent credits payouts [list]출금 요청 목록GET /v1/credits/payouts
rerent credits payout --amount ₩ --bank "은행 계좌번호 예금주"출금 요청(소유자만 · 최소 ₩10,000)POST /v1/credits/payouts

이벤트 · 웹훅

조직에서 일어난 일(체결·인스턴스 상태·배포·노드·충전 등 18종)이 이벤트로 남고, 웹훅으로 내 서버에 POST 돼요(HMAC-SHA256 서명 · 5회 재시도). 폴링 대신 events 를, 실시간이 필요하면 웹훅을 쓰세요.

명령하는 일API
rerent events types이벤트 종류 카탈로그GET /v1/events
rerent events [--type T] [--object <id>] [--limit 50] [--after evt_…]활동 기록(최근순 · 커서)GET /v1/events
rerent webhooks [list]웹훅 목록 · 실패 수 · 마지막 응답GET /v1/webhooks
rerent webhooks get <id>하나(마지막 오류 포함)GET /v1/webhooks/{id}
rerent webhooks create --url https://… [--events order.filled,instance.running] [--description D]웹훅 등록(서명 비밀은 지금 한 번만 출력)POST /v1/webhooks
rerent webhooks set <id> [--url U] [--events a,b] [--enabled true|false] [--description D]주소·이벤트·켬/꺼짐 변경PATCH /v1/webhooks/{id}
rerent webhooks test <id>webhook.test 이벤트를 바로 보내고 결과 확인POST /v1/webhooks/{id}/test
rerent webhooks deliveries <id> [--limit 20]배달 기록(상태 · 시도 · 오류 · 다음 재시도)GET /v1/webhooks/{id}/deliveries
rerent webhooks rm <id>삭제DELETE /v1/webhooks/{id}

공급자 — 내 GPU 팔기(클러스터)

공급자는 클러스터(같은 SKU 의 노드 묶음)를 등록하고 각 노드에서 설치 명령 한 줄을 실행하면 끝이에요. 자동 매도(auto_sell)를 켜면 빈 시간을 정한 가격으로 계속 내놓고, 시간이 가까워질수록 하한가까지 내려가요.

명령하는 일API
rerent clusters [list]내 클러스터 · 온라인 노드 · 자동 매도 · 매출GET /v1/clusters
rerent clusters get <id>클러스터 상세(노드별 상태 · GPU · 설치 여부)GET /v1/clusters/{id}
rerent clusters create --name N --sku S --nodes host1,host2 [--from now] [--until "in 30d"] [--auto-sell --price ₩ --floor ₩ --keep-nodes 0] [--tag k=v]클러스터 등록 → 노드별 설치 명령(curl 한 줄 · 24시간 유효 · 지금 한 번만)POST /v1/clusters
rerent clusters set <id> [--name N] [--until <t>] [--auto-sell on|off] [--price ₩] [--floor ₩] [--keep-nodes N] [--tag k=v,…]이름 · 공급 종료 시각 · 자동 매도 켬/끔·가격 · 태그PATCH /v1/clusters/{id}
rerent clusters rm <id>클러스터 제거(팔린 시간에 인스턴스가 돌고 있으면 409)DELETE /v1/clusters/{id}
rerent clusters nodes add <id> --nodes host3,host4 | rm <id> <nodeId> | install <id> <nodeId>노드 추가(설치 명령 발급) · 제거 · 설치 명령 다시 받기(재설치·토큰 재발급)POST /v1/clusters/{id}/nodes<br>DELETE /v1/clusters/{id}/nodes/{nodeId}<br>POST /v1/clusters/{id}/nodes/{nodeId}/install
rerent clusters assignments <id>노드별 배정(누가 언제 쓰는지 · 구매자는 익명 꼬리표)GET /v1/clusters/{id}/assignments

그 밖에

명령하는 일API
rerent api <GET|POST|PATCH|DELETE> </v1/경로?쿼리> [--data '{"json":…}'] [--data-file body.json]REST 엔드포인트를 직접 호출(CLI 에 없는 조합이나 새 필드용 · 응답 JSON 그대로)전부
rerent manual [--section <group>]이 설명서 전체(마크다운) — 코딩 에이전트는 이걸 먼저 읽으세요—
rerent help [명령]짧은 도움말(명령을 주면 그 묶음의 설명서)—
rerent --versionCLI 버전—