> For the complete documentation index, see [llms.txt](https://docs.roboflow.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.roboflow.com/deployment/ko/self-hosted/enterprise/deployment-manager.md).

# Deployment Manager

## 소개

Roboflow Deployment Manager를 사용하면 엣지 장치에서 컴퓨터 비전 모델을 쉽게 설정, 배포, 관리할 수 있습니다. 모델을 학습하고 워크플로를 구축한 후에는 배포를 확장하기 위한 올인원 솔루션을 제공합니다.

Deployment Manager를 다음 용도로 사용할 수 있습니다:

1. 다음을 사용해 새 장치를 설정합니다: [Roboflow Inference 서버](/deployment/ko/self-hosted/self-hosted.md).
2. 배포에서 사용할 카메라 스트림을 구성합니다.
3. 배포 [워크플로](https://docs.roboflow.com/workflows) 엣지에서.
4. 배포된 엣지 장치의 로그, 스트림 상태 및 원격 측정을 모니터링합니다.

{% hint style="warning" %}
Deployment Manager는 Enterprise 고객에게만 제공됩니다. [Roboflow 영업팀에 문의하세요](https://roboflow.com/sales) 이 기능에 대해 더 알아보고 대규모로 배포를 관리하는 데 어떻게 사용할 수 있는지 알아보려면
{% endhint %}

<figure><img src="/files/bdd4b674e52ef8691d56754acee014a19e2d033d" alt=""><figcaption></figcaption></figure>

### 주요 요구 사항:

Deployment Manager는 Roboflow가 지원하는 하드웨어용으로 구축되었습니다:

* 지원됨: Roboflow를 통해 구매한 하드웨어
* 지원되지 않음(자기 책임하에 사용): NVIDIA Jetson, NVIDIA GPU가 장착된 Debian 기반 Linux를 실행하는 x86 머신
* 아직 지원되지 않음: Mac 또는 Windows 기반 시스템

설정과 지속적인 운영을 위해 장치가 인터넷에 연결되어 있어야 하며, 원격 관리 및 모니터링을 위해 Roboflow에 지속적으로 접근할 수 있어야 합니다.

## 가이드

### 설정하기

다음을 따르세요 [설정하기](/deployment/ko/self-hosted/enterprise/deployment-manager/setting-up.md) 장치를 온라인 상태로 만들고 Workflows를 실행하려면 가이드를 순서대로 따르세요.

| 가이드                                                                                                            | 설명                                      |
| -------------------------------------------------------------------------------------------------------------- | --------------------------------------- |
| [하드웨어 요구 사항](/deployment/ko/self-hosted/enterprise/deployment-manager/setting-up/hardware-requirements.md)     | 지원되는 하드웨어, 카메라, 네트워크 및 아웃바운드 트래픽 요구 사항. |
| [장치 추가](/deployment/ko/self-hosted/enterprise/deployment-manager/setting-up/add-a-device.md)                   | 새 엣지 장치를 프로비저닝하고 계정에 등록합니다.             |
| [스트림 추가](/deployment/ko/self-hosted/enterprise/deployment-manager/setting-up/add-a-stream.md)                  | 워크플로가 실행되는 카메라 스트림을 구성합니다.              |
| [디바이스 경고 설정](/deployment/ko/self-hosted/enterprise/deployment-manager/setting-up/set-up-device-alerts.md)      | 연결, 디스크 및 FPS 문제에 대한 이메일 알림을 활성화합니다.    |
| [유지 관리 창 설정](/deployment/ko/self-hosted/enterprise/deployment-manager/setting-up/setup-maintenance-windows.md) | 배포에 영향을 주는 변경 사항이 적용될 시간을 예약합니다.        |

### 변경하기

다음 [변경하기](/deployment/ko/self-hosted/enterprise/deployment-manager/making-changes.md) 가이드에서는 설정 후 장치와 스트림을 업데이트, 재구성, 제거하는 방법을 다룹니다.

| 가이드                                                                                                                                 | 설명                                         |
| ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ |
| [장치 구성 업데이트](/deployment/ko/self-hosted/enterprise/deployment-manager/making-changes/update-device-configuration.md)                | 장치 설정, 서비스 버전 및 추가 서비스를 관리합니다.             |
| [기기 네트워크 구성](/deployment/ko/self-hosted/enterprise/deployment-manager/making-changes/configure-device-network.md)                   | 클라우드에서 IP 주소, 게이트웨이, DNS 및 호스트 이름을 설정합니다.  |
| [AI1 카메라 설정 구성](/deployment/ko/self-hosted/enterprise/deployment-manager/making-changes/configure-ai1-camera-settings.md)           | 노출, 게인, 초점 및 기타 AI1 카메라 설정을 실시간으로 조정합니다.   |
| [카메라에 정적 IP 설정](/deployment/ko/self-hosted/enterprise/deployment-manager/making-changes/set-camera-static-ip.md)                    | GigE Basler 또는 Lucid 카메라에 영구 정적 IP를 할당합니다. |
| [PoE 포트 소프트 재설정](/deployment/ko/self-hosted/enterprise/deployment-manager/making-changes/soft-reset-poe-port.md)                    | 멈춘 카메라 링크를 복구하기 위해 PoE 포트를 전원 순환합니다.       |
| [스트림 일시 중지 및 재개](/deployment/ko/self-hosted/enterprise/deployment-manager/making-changes/stop-a-stream.md)                          | 실행 중인 스트림을 잠시 일시 중지했다가 나중에 다시 시작합니다.       |
| [스트림 트리거](/deployment/ko/self-hosted/enterprise/deployment-manager/making-changes/trigger-a-stream.md)                              | 트리거된 스트림에 대해 필요할 때 Workflow를 실행합니다.        |
| [스트림 종료](/deployment/ko/self-hosted/enterprise/deployment-manager/making-changes/delete-a-stream.md)                                | 스트림과 해당 구성을 영구적으로 제거합니다.                   |
| [Deployment Manager 다시 배포](/deployment/ko/self-hosted/enterprise/deployment-manager/making-changes/redeploy-deployment-manager.md)  | 장애 후 장치의 구성을 복구합니다.                        |
| [장치 삭제](/deployment/ko/self-hosted/enterprise/deployment-manager/making-changes/delete-a-device.md)                                 | 더 이상 사용하지 않는 장치를 영구적으로 제거합니다.              |
| [Deployment Manager용 API 키](/deployment/ko/self-hosted/enterprise/deployment-manager/making-changes/api-keys-for-device-manager.md) | 장치 API 키가 생성, 범위 지정, 폐기되는 방식.              |

### 모니터링

다음 [모니터링](/deployment/ko/self-hosted/enterprise/deployment-manager/monitoring.md) 가이드에서는 스트림 상태, 로그, 리소스 및 Event Store 상태를 확인하는 방법을 보여줍니다.

| 가이드                                                                                                                 | 설명                                         |
| ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ |
| [스트림 보기](/deployment/ko/self-hosted/enterprise/deployment-manager/monitoring/view-a-stream.md)                      | 스트림의 상태, 최신 프레임 및 Workflow 세부 정보를 봅니다.     |
| [장치 로그 보기](/deployment/ko/self-hosted/enterprise/deployment-manager/monitoring/view-device-logs.md)                 | Roboflow 서비스의 로그를 검색, 필터링 및 다운로드합니다.       |
| [리소스 모니터 보기](/deployment/ko/self-hosted/enterprise/deployment-manager/monitoring/view-the-resource-monitor.md)      | 디스크, 메모리, CPU, GPU 및 서비스 컨테이너 상태를 모니터링합니다. |
| [Event Store 상태 보기](/deployment/ko/self-hosted/enterprise/deployment-manager/monitoring/view-event-store-status.md) | Event Store 사용량, 백업 진행 상황 및 기록을 모니터링합니다.   |

## HTTP API

Deployment Manager API를 사용하면 Roboflow Deployment Manager(RFDM) 장치를 프로그래밍 방식으로 모니터링하고 관리할 수 있습니다.

모든 엔드포인트는 다음 아래에 마운트됩니다: `/:workspace/devices/v2` 공개 API 호스트(`https://api.roboflow.com`). 읽기 엔드포인트에는 [범위가 지정된 API 키](https://docs.roboflow.com/reference/authentication/authentication/scoped-api-keys) 가 필요하며 `device:read` 범위가 필요하며 생성 엔드포인트는 `device:update`. 워크스페이스 API 키에 명시적인 범위 목록이 없으면 모든 범위가 암묵적으로 부여됩니다(기존 동작); 명시적인 `범위` 배열이 있는 키에는 관련 범위가 포함되어야 합니다.

Deployment Manager API를 사용하면 다음을 수행할 수 있습니다:

* [장치 목록 및 조회](#list-and-get-devices)
* [장치 생성](#create-a-device)
* [장치 구성](#device-config)
* [장치 스트림](#device-streams)
* [장치 로그 및 원격 측정](#device-logs-and-telemetry)
* [장치 이벤트](#device-events)

### 인증

모든 엔드포인트는 다음 중 하나를 통해 워크스페이스 API 키를 허용합니다:

* 쿼리 문자열: `?api_key=YOUR_API_KEY`
* 헤더: `Authorization: Bearer YOUR_API_KEY`

#### 장치 범위 API 키

특정 장치에 대해 발급된 API 키(예: 설치 중 RFDM에서 생성됨)는 해당 장치로 범위가 좁혀집니다. 이 키는 다음과 같은 경로만 호출할 수 있습니다: `:deviceId` path 매개변수가 키에 연결된 장치와 일치하는 경우입니다. 그들은 **403** 워크스페이스 전체 목록 및 생성 엔드포인트에서, 그리고 일치하지 않는 모든 `:deviceId` 경로에서 404를 받게 됩니다.

### 워크스페이스 간 격리

워크스페이스 API 키는 소속 워크스페이스에 속한 장치만 읽거나 수정할 수 있습니다. 다른 워크스페이스가 소유한 장치 ID에 대한 요청은 **404**를 반환하며, ID가 다른 면에서는 유효하더라도 마찬가지입니다.

### 오류

| 상태  | 의미                                                                                                                                       |
| --- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| 400 | 잘못된 쿼리 매개변수(알 수 없는 `time_period`, 잘못된 커서 또는 날짜, 잘못된 `direction`등) 또는 잘못된 요청 본문.                                                          |
| 401 | 누락되었거나 잘못된 API 키.                                                                                                                        |
| 403 | 다른 장치를 대상으로 하는 장치 범위 API 키, 워크스페이스 전체 목록/생성 경로, 복제 중 다른 워크스페이스의 소스 장치, 또는 거부된 기능 제한 요청(예: AI1 생성 또는 `offline_mode` 가 워크스페이스에서 활성화되지 않음). |
| 404 | 장치, 스트림, 구성 또는 소스 장치를 찾을 수 없습니다. 다른 워크스페이스가 소유한 장치 ID에 대한 읽기 요청도 404를 반환합니다.                                                             |
| 429 | 속도 제한을 초과했습니다. 로그는 IP당 분당 5회, 전역적으로 분당 50회로 제한되며, 원격 측정 읽기는 장치당 분당 60회, 10초 동안 10회 버스트로 제한됩니다.                                           |

오류 응답은 두 가지 형태 중 하나를 사용합니다:

* 핸들러 수준 오류(일반적으로 핸들러 자체에서 발생하는 400, 403, 404, 429)는 `{ "error": "<message>" }`.
* 인증 및 워크스페이스 검증 실패(일반적으로 401)는 구조화된 `error` 객체를 반환합니다: `{ "error": { "message": "...", "status": 401, "type": "OAuthException", "hint": "..." } }`.

로그 속도 제한기는 트리거될 때 추가로 일반 문자열 본문(JSON 아님)을 반환합니다. **429**.

### 장치 목록 및 조회

#### 장치 목록

워크스페이스에 등록된 모든 장치를 나열합니다. 장치 범위 API 키는 이 엔드포인트를 호출할 수 없으며 **403**.

**필수 스코프:** `device:read`

{% openapi src="/files/2437125e937284e42b7518a072987c51583eb28b" path="/{workspace}/devices/v2" method="get" %}
[deployment-manager.yaml](https://1826078061-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-0f39f7ff406338249e5d84d81b74fd17121abe81%2Fdeployment-manager.yaml?alt=media)
{% endopenapi %}

**예시 요청**

```bash
curl "https://api.roboflow.com/{workspace}/devices/v2?api_key=$ROBOFLOW_API_KEY"
```

**예시 응답**

```json
{
  "data": [
    {
      "id": "abc123",
      "name": "factory-floor-cam-1",
      "status": "online",
      "last_heartbeat": "2026-04-28T12:00:00.000Z",
      "platform": "Linux",
      "platform_release": "5.10.104-tegra",
      "platform_version": "#1 SMP PREEMPT ...",
      "architecture": "aarch64",
      "hostname": "jetson-01",
      "rfdm_version": "1.2.3",
      "type": "jetson",
      "hardware": {
        "processor": "aarch64",
        "gpu": null,
        "total_memory_mb": null,
        "total_disk_space_mb": 124426534912
      },
      "tags": ["production", "line-3"],
      "created_at": "2026-01-15T08:30:00.000Z"
    }
  ]
}
```

다음 `상태` 필드는 `온라인` 최근 5분 이내에 하트비트가 수신되었으면, `오프라인` 더 오래되었으면, 또는 `알 수 없음` 하트비트가 한 번도 기록되지 않았으면. 새로 프로비저닝된 장치는 첫 하트비트가 오기 전에도 목록에 나타나며, 그때까지는 `상태` 은 `알 수 없음` 이고 모니터링에서 파생된 대부분의 필드는 `null`.

{% hint style="warning" %}
`hardware.total_disk_space_mb` 는 장치가 보고한 원시 값입니다. 하지만 `_mb` 접미사가 있음에도 RFDM이 보고한 장치는 현재 이 값을 바이트 단위로 반환합니다(예: `124426534912` 약 124GB 디스크의 경우). 단위는 장치가 정의한 것으로 취급하세요.
{% endhint %}

#### 장치 조회

id로 단일 장치를 가져옵니다. 장치가 존재하지 않거나 다른 워크스페이스에 속해 있으면 **404** 를 반환합니다.

**필수 스코프:** `device:read`

{% openapi src="/files/2437125e937284e42b7518a072987c51583eb28b" path="/{workspace}/devices/v2/{deviceId}" method="get" %}
[deployment-manager.yaml](https://1826078061-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-0f39f7ff406338249e5d84d81b74fd17121abe81%2Fdeployment-manager.yaml?alt=media)
{% endopenapi %}

**예시 요청**

```bash
curl "https://api.roboflow.com/{workspace}/devices/v2/{deviceId}?api_key=$ROBOFLOW_API_KEY"
```

응답 본문은 목록 엔드포인트의 단일 항목과 일치합니다(data 배열로 감싸지지 않음). `data` 배열).

### 장치 생성

워크스페이스에 새 장치를 생성하고 설치에 필요한 식별자를 반환합니다. 장치 범위 API 키는 이 엔드포인트를 호출할 수 없으며 **403**.

**필수 스코프:** `device:update`

{% openapi src="/files/2437125e937284e42b7518a072987c51583eb28b" path="/{workspace}/devices/v2" method="post" %}
[deployment-manager.yaml](https://1826078061-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-0f39f7ff406338249e5d84d81b74fd17121abe81%2Fdeployment-manager.yaml?alt=media)
{% endopenapi %}

**예시 요청**

```bash
curl -X POST "https://api.roboflow.com/{workspace}/devices/v2?api_key=$ROBOFLOW_API_KEY" \\
  -H "Content-Type: application/json" \\
  -d '{"device_name": "factory-floor-cam-2", "device_type": "edge"}'
```

**예시 응답**

```json
{
  "deviceId": "abc456",
  "installId": "inst_xyz789"
}
```

반환된 `installId` 를 사용해 Roboflow Deployment Manager 설치 프로그램으로 장치를 부트스트랩합니다.

#### AI1 장치에 대한 참고 사항

* 설정 `device_type` 를 `"ai1"` 로 설정하려면 워크스페이스에서 `deviceAio` 기능이 활성화되어 있어야 하며, 그렇지 않으면 요청은 **403**.
* `offline_mode` 는 `roboflowLiteMode`가 있는 워크스페이스의 AI1 장치에서만 유효합니다. 다른 조합은 **400** 또는 **403**.
* 기존 장치를 복제하지 않고 `workflow_id`를 지정하지 않는 AI1 장치의 경우, 슬러그화된 `device_name` 에는 최소 하나의 영숫자 문자가 포함되어야 하며, 그렇지 않으면 요청은 **400**.
* AI1 + 오프라인 모드가 적용되면 응답에는 또한 `offlineProvisioningQrPayload` 필드가 포함되어 오프라인 프로비저닝용 QR 페이로드를 인코딩합니다.

#### 복제에 대한 참고 사항

다음일 때 `sourceDeviceId` 가 제공되면 새 장치는 소스 장치 구성의 복사본으로 생성됩니다. 소스 장치는 요청과 동일한 워크스페이스에 속해야 하며, 그렇지 않으면 요청은 **403**. 존재하지 않는 `sourceDeviceId` 는 **404**.

### 장치 구성

#### 워크스페이스 기본 구성 가져오기

워크스페이스 수준의 기본 장치 구성을 반환합니다. 이는 워크스페이스의 구성 패치(있는 경우)가 병합된 기본 구성입니다. 새 장치를 프로비저닝할 때 템플릿으로 사용하여 `POST /:workspace/devices/v2`.

**필수 스코프:** `device:read`

{% hint style="info" %}
를 호출하세요. 이것은 워크스페이스 전체 엔드포인트입니다. 장치 범위 API 키는 **403** 경로에 `:deviceId` 가 없으므로
{% endhint %}

**예시 요청**

```bash
curl "https://api.roboflow.com/{workspace}/devices/v2/default-config?api_key=$ROBOFLOW_API_KEY"
```

**예시 응답**

```json
{
  "config": {
    "version": "1.0.0",
    "config": {
      "inference": { "confidence": 0.7, "threshold": 0.3 },
      "device_type": "edge"
    },
    "services": {}
  },
  "patch": {
    "config": {
      "inference": { "confidence": 0.7 }
    }
  }
}
```

* `config` -- 병합된 결과(기본값 + 워크스페이스 패치).
* `patch` -- 워크스페이스에 저장된 패치입니다. 워크스페이스에 사용자 지정 패치가 없으면 빈 객체입니다. `{}` 변경 패치가 없습니다.

#### 구성 가져오기

장치의 현재 런타임 구성을 반환합니다. 응답 형식은 Roboflow Deployment Manager(RFDM) 구성 사양을 따릅니다.

**필수 스코프:** `device:read`

{% openapi src="/files/2437125e937284e42b7518a072987c51583eb28b" path="/{workspace}/devices/v2/{deviceId}/config" method="get" %}
[deployment-manager.yaml](https://1826078061-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-0f39f7ff406338249e5d84d81b74fd17121abe81%2Fdeployment-manager.yaml?alt=media)
{% endopenapi %}

**예시 요청**

```bash
curl "https://api.roboflow.com/{workspace}/devices/v2/{deviceId}/config?api_key=$ROBOFLOW_API_KEY"
```

응답은 전체 구성 문서이며 다음 최상위 필드를 포함합니다(이에 국한되지 않음):

* `device_id`, `device_name`
* `workspace_id`
* `version`, `last_updated`, `last_updated_at`, `created_at`
* `config` (장치의 런타임 구성 트리, 포함 `device_type`, `stream`그리고 `offline_mode`)
* `services` (포함된 서비스별 컨테이너 정의, 예: `image`, `volumes`그리고 `environment_variables`)
* `environment_variables` (서비스별 항목 외에 최상위 환경 변수, `services`)
* `production_mode`, `last_automatic_update`, `updated`, `updated_by`, `$schema`, `id`

RFDM이 기록한 추가 필드도 나타날 수 있습니다. 응답 형식을 개방형으로 취급하고 필요한 필드만 의존하세요.

반환합니다 **404** 장치가 존재하지 않거나 워크스페이스에 속하지 않거나, 구성 정보가 저장되어 있지 않으면

{% hint style="warning" %}
응답에는 작성된 전체 구성이 포함됩니다. 서비스별 `environment_variables` 및 구성에 포함된 모든 통합 자격 증명은 마스킹되지 않은 상태로 반환됩니다. 응답 본문은 민감한 정보로 취급하고 일반 텍스트로 기록하지 마세요.
{% endhint %}

#### 구성 기록

장치의 이전 구성 개정을 최신 순으로 나열합니다.

**필수 스코프:** `device:read`

{% openapi src="/files/2437125e937284e42b7518a072987c51583eb28b" path="/{workspace}/devices/v2/{deviceId}/config/history" method="get" %}
[deployment-manager.yaml](https://1826078061-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-0f39f7ff406338249e5d84d81b74fd17121abe81%2Fdeployment-manager.yaml?alt=media)
{% endopenapi %}

**예시 요청**

```bash
curl "https://api.roboflow.com/{workspace}/devices/v2/{deviceId}/config/history?api_key=$ROBOFLOW_API_KEY&limit=10"
```

**예시 응답**

```json
{
  "data": [
    {
      "revision_id": "rev_abc",
      "created_at": "2026-04-20T14:30:00.000Z",
      "created_by": "user_123"
    }
  ],
  "pagination": {
    "next_cursor": "...",
    "has_more": true,
    "limit": 10
  }
}
```

잘못된 `커서` 는 **400** 가 `{"error": "Invalid cursor format"}`.

### 장치 스트림

#### 스트림 목록

장치에 구성된 모든 스트림을 나열합니다.

**필수 스코프:** `device:read`

{% openapi src="/files/2437125e937284e42b7518a072987c51583eb28b" path="/{workspace}/devices/v2/{deviceId}/streams" method="get" %}
[deployment-manager.yaml](https://1826078061-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-0f39f7ff406338249e5d84d81b74fd17121abe81%2Fdeployment-manager.yaml?alt=media)
{% endopenapi %}

**예시 요청**

```bash
curl "https://api.roboflow.com/{workspace}/devices/v2/{deviceId}/streams?api_key=$ROBOFLOW_API_KEY"
```

**예시 응답**

```json
{
  "data": [
    {
      "id": "stream_abc",
      "name": "entrance-cam",
      "status": "running",
      "pipeline_id": "pipe_123",
      "workflow_id": "wf_456",
      "source": "rtsp://192.168.1.100:554/live",
      "started_at": "2026-04-28T10:00:00.000Z",
      "last_event_at": "2026-04-28T12:30:00.000Z",
      "camera_fps": 29.97,
      "inference_fps": 12.4,
      "sharpness": 0.82,
      "error": null
    }
  ]
}
```

**소스 정제**

다음 `source` 필드는 반환되기 전에 항상 정제기를 거칩니다:

* 소스가 URL인 경우 `userinfo` (`scheme://user:pass@host/...`가 제거됩니다. 예를 들어, `rtsp://admin:password@192.168.1.100:554/live` 는 다음과 같이 됩니다 `rtsp://192.168.1.100:554/live`.
* 소스가 객체인 경우, 이름을 소문자로 했을 때 다음과 같은 키는 `password`, `passwd`, `secret`, `api_key`, `apikey`, `auth`, `authorization`, `token`, 또는 `access_token` 는 응답에서 제거됩니다. 다른 모든 키는 유지됩니다.
* 배열과 중첩 객체는 재귀적으로 정제됩니다.

#### 스트림 조회

단일 스트림을 가져옵니다. 반환합니다 **404** 스트림이 장치에 존재하지 않거나, 장치가 존재하지 않거나 워크스페이스에 속하지 않으면

**필수 스코프:** `device:read`

{% openapi src="/files/2437125e937284e42b7518a072987c51583eb28b" path="/{workspace}/devices/v2/{deviceId}/streams/{streamId}" method="get" %}
[deployment-manager.yaml](https://1826078061-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-0f39f7ff406338249e5d84d81b74fd17121abe81%2Fdeployment-manager.yaml?alt=media)
{% endopenapi %}

**예시 요청**

```bash
curl "https://api.roboflow.com/{workspace}/devices/v2/{deviceId}/streams/{streamId}?api_key=$ROBOFLOW_API_KEY"
```

응답 본문은 목록 엔드포인트의 단일 항목과 일치합니다(data 배열로 감싸지지 않음). `data` 배열).

### 장치 로그 및 원격 측정

#### 로그

페이지가 매겨진 장치 로그를 반환합니다.

**필수 스코프:** `device:read`

{% openapi src="/files/2437125e937284e42b7518a072987c51583eb28b" path="/{workspace}/devices/v2/{deviceId}/logs" method="get" %}
[deployment-manager.yaml](https://1826078061-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-0f39f7ff406338249e5d84d81b74fd17121abe81%2Fdeployment-manager.yaml?alt=media)
{% endopenapi %}

**예시 요청**

**속도 제한:** 워크스페이스당 분당 120회 요청입니다. 로그 읽기와 로그 수집은 별도의 속도 제한 버킷을 사용하므로 로그 폴링이 수집 할당량에 영향을 주지 않습니다(반대도 마찬가지).

```bash
curl "https://api.roboflow.com/{workspace}/devices/v2/{deviceId}/logs?api_key=$ROBOFLOW_API_KEY&limit=50"
```

**예시 응답**

```json
{
  "data": [
    {
      "timestamp": "2026-04-28T12:01:00.000Z",
      "service": "inference",
      "severity": "INFO",
      "message": "Model loaded successfully"
    }
  ],
  "pagination": {
    "next_cursor": "2026-04-28T12:01:00.000Z",
    "has_more": true,
    "limit": 50
  }
}
```

**속도 제한**

이 엔드포인트는 다음으로 요청 속도가 제한됩니다 **IP 주소당 분당 5개 요청** 및 **전역적으로 분당 50개 요청**. 초과 요청은 반환됩니다 **429**.

#### 원격 측정

장치에 대한 집계된 하드웨어 메트릭(CPU, 메모리, 디스크, GPU)과 스트림별 FPS를 고정된 시간 창 기준으로 반환합니다.

**필수 스코프:** `device:read`

{% openapi src="/files/2437125e937284e42b7518a072987c51583eb28b" path="/{workspace}/devices/v2/{deviceId}/telemetry" method="get" %}
[deployment-manager.yaml](https://1826078061-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-0f39f7ff406338249e5d84d81b74fd17121abe81%2Fdeployment-manager.yaml?alt=media)
{% endopenapi %}

**예시 요청**

```bash
curl "https://api.roboflow.com/{workspace}/devices/v2/{deviceId}/telemetry?api_key=$ROBOFLOW_API_KEY&time_period=24h"
```

버킷 크기는 시간 기간별로 고정됩니다:

| `time_period` | `버킷 간격` | `채우기 간격(초)` |
| ------------- | ------- | ----------- |
| `1h`          | `2분`    | 120         |
| `24h`         | `30분`   | 1800        |
| `7d`          | `4시간`   | 14400       |
| `14d`         | `8시간`   | 28800       |

**예시 응답**

```json
{
  "time_period": "24h",
  "bucket_interval": "30 MINUTE",
  "fill_interval_seconds": 1800,
  "buckets": [
    {
      "bucket_start": "2026-04-28T00:00:00.000Z",
      "cpu_pct": 42.5,
      "used_memory_mb": 3200,
      "total_memory_mb": 7860,
      "used_disk_space_mb": 15000,
      "total_disk_space_mb": 29000,
      "gpu_pct": 78.2
    }
  ]
}
```

요청된 창에서 텔레메트리를 받지 못한 버킷도 각 메트릭 필드가 null로 설정된 상태로 여전히 반환됩니다 `null`.

**속도 제한**

이 엔드포인트는 장치별로 다음과 같이 요청 속도가 제한됩니다 **분당 60개 요청** 추가로 **10초당 10개 요청** 버스트 제한기. 초과 요청은 반환됩니다 **429**. 동일한 장치별 텔레메트리 할당량은 해당 장치의 텔레메트리 수집 경로와 공유되므로, 악의적인 읽기 요청은 같은 장치의 수집에 영향을 줄 수 있습니다.

### 장치 이벤트

장치 및 스트림의 수명 주기 이벤트를 반환합니다(예: 장치 부팅, 스트림 시작 및 중지, 오류, 구성 변경).

**필수 스코프:** `device:read`

{% openapi src="/files/2437125e937284e42b7518a072987c51583eb28b" path="/{workspace}/devices/v2/{deviceId}/events" method="get" %}
[deployment-manager.yaml](https://1826078061-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-0f39f7ff406338249e5d84d81b74fd17121abe81%2Fdeployment-manager.yaml?alt=media)
{% endopenapi %}

**예시 요청**

```bash
curl "https://api.roboflow.com/{workspace}/devices/v2/{deviceId}/events?api_key=$ROBOFLOW_API_KEY&limit=50"
```

**예시 응답**

```json
{
  "data": [
    {
      "id": "evt_abc123",
      "event": "device.boot",
      "entity_type": "device",
      "entity_id": "abc123",
      "event_description": "장치가 시작되었습니다",
      "error_code": null,
      "metadata": { "source": "boot-loop" },
      "device_timestamp": "2026-04-28 10:00:00",
      "server_timestamp": "2026-04-28 10:00:01",
      "event_end_timestamp": null
    }
  ],
  "pagination": {
    "next_cursor": "...",
    "prev_cursor": "...",
    "has_more": true,
    "limit": 50
  }
}
```

다음 `device_timestamp`, `server_timestamp`그리고 `event_end_timestamp` 필드는 다음 형식으로 표시됩니다 `YYYY-MM-DD HH:MM:SS[.SSS]` UTC 기준입니다. 이 API의 다른 타임스탬프처럼 ISO-8601로 정규화되지 않습니다.

`event_end_timestamp` 또한 에포크 0 문자열로 반환될 수 있습니다 `"1970-01-01 00:00:00.000"` (대신 `null`) 이벤트에 기록된 종료 타임스탬프가 없을 때.
