기기 만들기·연결
const url = 'https://dev.api.endueos.com/api/v1/stations/stn_01J9ZK3Q8M4XW7D2N5R6T0V1BC/devices';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"type":"virtual","kind":"linux","name":"research-box","size":"small","storage_gb":10,"start":true,"pin_to_dock":true}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://dev.api.endueos.com/api/v1/stations/stn_01J9ZK3Q8M4XW7D2N5R6T0V1BC/devices \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "type": "virtual", "kind": "linux", "name": "research-box", "size": "small", "storage_gb": 10, "start": true, "pin_to_dock": true }'Device 를 만든다.
type: actual — 기기를 등록한다. 에이전트 하나와 연결 토큰 하나가 함께 생기고 토큰(enrollment)은 이 응답에만 나온다. Dock 1단 끝에 붙는다.
type: virtual — VM·Storage·에이전트가 함께 생긴다. 사용자 JWT 로만 (API 키면 403 FORBIDDEN — 비용이 생긴다).
201 의 Device 는 compute_status 가 provisioning·starting·stopped(start: false) 중 하나다 — 에이전트가 붙으면 running 이 된다 (이벤트 device.status_changed).
컴퓨트 공급자에 닿지 못하면 failed(status_reason: compute_unavailable)로 만들어진다 — 다시 시작하거나 지운다.
402 INSUFFICIENT_CREDITS(계정 잔액 ≤ 0), 409 VIRTUAL_DEVICE_LIMIT_REACHED·VOLUME_QUOTA_EXCEEDED, 422 DEVICE_KIND_NOT_HOSTABLE.
공통 — 409 DEVICE_LIMIT_REACHED(OS max_resources)·OS_HALTED, 422 DEVICE_KIND_NOT_ALLOWED(OS allowed_kinds).
가이드 — 기기
파라미터
섹션 제목: “파라미터”경로 파라미터
섹션 제목: “경로 파라미터”예시
stn_01J9ZK3Q8M4XW7D2N5R6T0V1BC요청 본문필수
섹션 제목: “요청 본문필수”Actual Device 를 등록한다. 에이전트 하나와 연결 토큰 하나가 함께 생긴다.
object
20개까지. 키 1~63자, 값 255자까지.
object
Virtual Device 를 만든다 — VM·Storage·에이전트가 함께 생긴다. 사용자 JWT 로만 (비용이 생긴다).
object
리소스 종류 전부를 받는다 — 이 환경의 컴퓨트 공급자가 띄우지 못하는 kind 는 422 DEVICE_KIND_NOT_HOSTABLE 이다 (형식 오류 400 이 아니라).
mac 은 EC2 Mac 이라 크기와 상관없이 M2 Mac mini 한 대(8 vCPU·24 GiB)이고, 시작에 수 분에서 한 시간 넘게 걸릴 수 있다 (전용 호스트 정리).
기본 small.
영구 볼륨 크기 (GB). 0 이면 볼륨 없이 만든다. 없으면 kind 의 기본값 — linux 10, android 8(vultr 블록 스토리지는 10 GB 부터), chrome 1, mac 32, windows 32 (D: 드라이브).
만들자마자 시작한다. 기본 true.
Dock 1단 끝에 붙인다. 기본 true.
예시
{ "type": "virtual", "kind": "linux", "name": "research-box", "size": "small", "storage_gb": 10, "start": true, "pin_to_dock": true}201
섹션 제목: “201”비밀값이 든 응답 — 캐시하지 않는다.
object
object
OS 가 관리하는 기기. actual(사용자의 기기)과 virtual(플랫폼이 띄운 VM) 둘이다.
id 는 Resource 와 같은 res_ 다 — /resources/{resource_id} 는 같은 기기를 v0.1.0 의 Resource 모양으로 보여 준다.
object
Device 의 id — Resource 와 같은 res_ 다 (v0.1.0 이 이미 냈다).
object
등록 상태 (Resource 의 status 와 같다).
에이전트가 접속해 있고 핸드셰이크를 마쳤다. Resource 의 online 과 같은 규칙.
Actual 은 agent 하나, virtual 은 vm·storage(없을 수 있다)·agent.
Virtual Device 의 컴퓨트 한 대.
object
컴퓨트 공급자 — local(로컬 컨테이너)·fly·aws·vultr 등.
Virtual Device 의 영구 볼륨. VM 에 마운트되고, VM 이 멈춰도 남는다. Device 를 지우면 함께 지워진다.
object
vol_
에이전트가 알려 준 기기 정보. 끊겨도 지워지지 않는다.
object
Actual 일 때만 — 에이전트를 기기에 붙일 때 넣는 값. 이 응답에서만 볼 수 있다. virtual 은 OS 가 토큰을 관리하므로 없다.
object
osat_{agent_id}_{hex 64}. 이 응답에서만 볼 수 있다. 에이전트는 불투명한 문자열로 다룬다.
wss://{host}/api/v1/relay/socket
object
서버 처리 시간(ms).
예시
{ "data": { "device": { "device_id": "res_01J9ZK3Q8M4XW7D2N5R6T0V1BC", "station_id": "stn_01J9ZK3Q8M4XW7D2N5R6T0V1BC", "type": "actual", "kind": "chrome", "status": "pending", "compute_status": "provisioning", "size": "small", "workloads": [ { "type": "vm", "workload_id": "wkl_01J9ZK3Q8M4XW7D2N5R6T0V1BC", "status": "pending" } ] } }}응답 헤더
섹션 제목: “응답 헤더”400
섹션 제목: “400”요청 형식이 틀렸다 — VALIDATION_ERROR(details.errors[]) 또는 BAD_REQUEST. 본문은 오류 봉투.
401
섹션 제목: “401”인증이 없거나 무효다 — UNAUTHORIZED. 본문은 오류 봉투.
402
섹션 제목: “402”크레딧이 없다 — INSUFFICIENT_CREDITS (충전하면 다시 된다). 본문은 오류 봉투.
403
섹션 제목: “403”이 인증 수단으로는 못 하는 일이다 — FORBIDDEN (예: API 키로 클라우드 기기 만들기). 본문은 오류 봉투.
404
섹션 제목: “404”없거나 내 것이 아니다 — *_NOT_FOUND. 본문은 오류 봉투.
409
섹션 제목: “409”지금 상태와 충돌한다 — 코드는 위 설명을 본다. 본문은 오류 봉투.
422
섹션 제목: “422”형식은 맞지만 할 수 없다 — 코드는 위 설명을 본다. 본문은 오류 봉투.
429
섹션 제목: “429”한도를 넘었다 — Retry-After 초 뒤에 다시. 본문은 오류 봉투.
500
섹션 제목: “500”서버 오류 — INTERNAL_ERROR. 본문은 오류 봉투.
503
섹션 제목: “503”의존 서비스에 닿지 못했다 — 잠시 뒤 다시. 본문은 오류 봉투.