API Reference
This page is generated from the LinkOStar backend's live OpenAPI spec. Only endpoints intended for external integrators are shown; internal ops paths (/platform, /actuator) are deliberately hidden.
The spec is refreshed hourly. Right after a backend deploy there may be a brief lag.
Last synced:
Hub 등록 (Public)
Audience: Hub-agent (Pi)
hub-agent가 부팅 직후 claim 코드를 가지고 한 번 호출합니다. 인증 없이 접근 가능하지만 claim 코드 자체가 일회성 자격증명 역할을 합니다.
/v1/hubs/claimClaim hub instance
Register a hub to a usage unit using a claim code. **Process:** 1. Validates the claim code (expiration, revocation, usage limits) 2. Creates new hub_instance or updates existing one by device_instance_id 3. Checks if hub is blocked (rejects if blocked) 4. Generates access_token and refresh_token 5. Saves to hub_auth_token table 6. Records audit log **Security:** - No authentication required (public endpoint) - Claim code acts as authorization - Blocked hubs cannot claim **Rate Limiting:** None (one-time operation)
Parameters
No parameters
Request body
HubClaimRequestrequiredResponses
- 201Hub claimed successfully
ApiResponse - 400Invalid claim code (expired, revoked, or max uses reached)
- 409Conflict - Hub already belongs to different unit
- 423Hub is blocked/locked
Hub Bearer 보호 API (V1)
Audience: Hub-agent (Pi)
claim 직후 받은 access token으로 호출합니다. telemetry · 로그 업로드 · 토큰 갱신이 여기 들어갑니다. supplier BFF는 직접 부르지 않습니다.
/v1/hubs/{hubUuid}/certificatesSign hub CSR
Hub 가 device-local keypair 로 만든 PKCS#10 CSR 를 제출. LinkOStar 가 sign 후 client cert 를 돌려줌. cert 의 CN/SAN 은 backend 가 신뢰하는 hub_uuid 로 강제 — CSR 의 subject 는 무시.
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | — |
Request body
CertificateIssueRequestrequiredResponses
- 200OK
ApiResponseCertificateIssueResponse
/v1/hubs/{hubUuid}/desired-stateGet current DesiredState for this hub (poll)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseMapStringObject
/v1/hubs/{hubUuid}/device-queryResolve a scanned BLE asset to a device instance and activate it
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | — |
Request body
DeviceQueryRequestrequiredResponses
- 200OK
ApiResponseDeviceQueryResponse
/v1/hubs/{hubUuid}/jobs/{hubJobUuid}/eventsRecord job event
Record job event and update job status
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | Hub UUID |
| hubJobUuid | path | string<uuid> | required | Hub Job UUID |
Request body
HubJobEventRequestrequiredResponses
- 204No Content
/v1/hubs/{hubUuid}/logsRecord log
Record log entry from hub
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | Hub UUID |
Request body
JsonNoderequiredResponses
- 204No Content
/v1/hubs/{hubUuid}/telemetryRecord telemetry
Record telemetry data from hub
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | Hub UUID |
Request body
JsonNoderequiredResponses
- 204No Content
/v1/hubs/adaptersSnapshot inventory upsert + missing-row power-off
Idempotent: replays produce the same end-state. supplier_uuid / role 같은 운영자 지정 값은 보존 (덮어쓰지 않음).
Parameters
No parameters
Request body
PayloadrequiredResponses
- 200OK
ApiResponseResult
/v1/hubs/ca-bundleRoot CA PEM
Agent 가 trust store 에 박을 LinkOStar root CA 인증서.
Parameters
No parameters
Responses
- 200OK
/v1/hubs/refreshRefresh hub access token
Refresh hub access token using refresh token. **Process:** 1. Validates hub authentication (must be authenticated) 2. Checks if hub is blocked (rejects if blocked) 3. Verifies refresh token matches stored token 4. Checks if token is revoked 5. Generates new access_token (refresh token remains the same) 6. Updates hub_auth_token table 7. Records audit log **Security:** - Requires hub authentication (Bearer token) - Blocked hubs cannot refresh - Revoked tokens cannot be refreshed **Token Expiration:** - Access token: 24 hours (configurable) - Refresh token: 30 days (configurable)
Parameters
No parameters
Request body
HubRefreshRequestrequiredResponses
- 200Tokens refreshed successfully
ApiResponse - 401Hub authentication required or invalid refresh token
- 403Hub is blocked or token is revoked
/v1/hubs/scan-config현재 hub의 tenant 소속 device + identifier + protocol + HUB-layer route 묶음
Parameters
No parameters
Responses
- 200OK
ApiResponseScanConfigResponse
Tenant — Hubs
Audience: Supplier 콘솔 / BFF
특정 tenant 소속 hub의 조회·관리. X-API-Key 또는 sdx-oauth JWT + X-Tenant-UUID 헤더로 인증합니다.
/tenant/hubsList hubs
List all hubs for current unit with READ permission check
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| page | query | integer<int32> | optional | Page number (1-based) |
| size | query | integer<int32> | optional | Page size |
Responses
- 200OK
ApiResponseListHubSummaryResponse
/tenant/hubs/{hubUuid}Get hub detail
Get hub detail with READ permission check
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | Hub UUID |
Responses
- 200OK
ApiResponseHubDetailResponse
/tenant/hubs/{hubUuid}Update hub label
Tenant 측에서 hub_identifier 같은 운영 라벨을 수정. PATCH 의미 — null 필드는 그대로 둠.
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | Hub UUID |
Request body
HubUpdateRequestrequiredResponses
- 200OK
ApiResponseHubDetailResponse
/tenant/hubs/{hubUuid}/adapters이 hub가 가진 BlueZ adapter 전부
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseListAdapterView
/tenant/hubs/{hubUuid}/adapters/{address}adapter role / supplier 할당 변경
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | — |
| address | path | string | required | — |
Request body
UpdateRequestrequiredResponses
- 200OK
ApiResponseAdapterView
/tenant/hubs/{hubUuid}/appsParameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseListHubInstalledAppResponse
/tenant/hubs/{hubUuid}/installed-appsList apps scheduled / installed on this hub
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseListInstalledAppView
/tenant/hubs/{hubUuid}/jobsGet hub jobs
Get hub jobs with READ permission check
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | Hub UUID |
| page | query | integer<int32> | optional | Page number (1-based) |
| size | query | integer<int32> | optional | Page size |
Responses
- 200OK
ApiResponseListHubJobResponse
/tenant/hubs/{hubUuid}/jobs/app-installParameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | — |
Request body
AppInstallRequestrequiredResponses
- 201Created
ApiResponseUUID
/tenant/hubs/{hubUuid}/jobs/app-removeParameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | — |
| appUuid | query | string<uuid> | required | — |
Responses
- 201Created
ApiResponseUUID
/tenant/hubs/{hubUuid}/logsGet hub logs
Get hub logs with time range filter
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | Hub UUID |
| from | query | string<date-time> | optional | Start time (ISO 8601) |
| to | query | string<date-time> | optional | End time (ISO 8601) |
| page | query | integer<int32> | optional | Page number (1-based) |
| size | query | integer<int32> | optional | Page size |
Responses
- 200OK
ApiResponseListHubLogResponse
/tenant/hubs/{hubUuid}/setup-delegationsList setup delegations
List all setup delegations for a hub
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | Hub UUID |
Responses
- 200OK
ApiResponseListSetupDelegationResponse
/tenant/hubs/{hubUuid}/setup-delegationsCreate setup delegation
Delegate hub setup rights to another user
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | Hub UUID |
Request body
SetupDelegationRequestrequiredResponses
- 200OK
ApiResponseSetupDelegationResponse
/tenant/hubs/{hubUuid}/setup-delegations/{id}Revoke setup delegation
Revoke a setup delegation
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | Hub UUID |
| id | path | integer<int64> | required | Delegation ID |
Responses
- 200OK
ApiResponseVoid
/tenant/hubs/{hubUuid}/telemetryGet hub telemetry
Get hub telemetry with time range filter
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | Hub UUID |
| from | query | string<date-time> | optional | Start time (ISO 8601) |
| to | query | string<date-time> | optional | End time (ISO 8601) |
| page | query | integer<int32> | optional | Page number (1-based) |
| size | query | integer<int32> | optional | Page size |
Responses
- 200OK
ApiResponseListHubTelemetryResponse
/tenant/hubs/claim-codesList my claim codes
Newest first; status is derived (PENDING/USED/EXPIRED/REVOKED)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| page | query | integer<int32> | optional | — |
| size | query | integer<int32> | optional | — |
Responses
- 200OK
ApiResponseListClaimCodeListItem
/tenant/hubs/claim-codesGenerate claim code
Generate a new hub claim code for this tenant
Parameters
No parameters
Request body
ClaimCodeGenerateRequestrequiredResponses
- 200OK
ApiResponseClaimCodeResponse
/tenant/hubs/claim-codes/{claimCode}Hard-delete (unused) or soft-revoke (used) a claim code
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| claimCode | path | string | required | — |
Responses
- 204No Content
Tenant — Devices
Audience: Supplier 콘솔 / BFF
각 hub에 연결된 device 인스턴스 조회·관리. BLE 스캐너로 발견된 디바이스가 여기 들어옵니다.
/tenant/devicesList device instances (optionally filter by activationStatus)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| page | query | integer<int32> | optional | — |
| size | query | integer<int32> | optional | — |
| activationStatus | query | string | optional | — |
Responses
- 200OK
ApiResponseListDeviceInstanceResponse
/tenant/devicesRegister new device instance
Parameters
No parameters
Request body
CreateDeviceInstanceRequestrequiredResponses
- 200OK
ApiResponseDeviceInstanceResponse
/tenant/devices/{deviceInstanceId}Get device instance detail
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceInstanceId | path | integer<int64> | required | — |
Responses
- 200OK
ApiResponseDeviceInstanceResponse
/tenant/devices/{deviceInstanceId}Delete device instance
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceInstanceId | path | integer<int64> | required | — |
Responses
- 200OK
/tenant/devices/{deviceInstanceId}Update device instance
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceInstanceId | path | integer<int64> | required | — |
Request body
UpdateDeviceInstanceRequestrequiredResponses
- 200OK
ApiResponseDeviceInstanceResponse
/tenant/devices/{deviceInstanceId}/activateForce-activate device instance (manual override)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceInstanceId | path | integer<int64> | required | — |
Responses
- 200OK
ApiResponseDeviceInstanceResponse
/tenant/devices/{deviceInstanceId}/retireRetire device instance (terminal state)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceInstanceId | path | integer<int64> | required | — |
Responses
- 200OK
ApiResponseDeviceInstanceResponse
/tenant/devices/{deviceInstanceId}/sensor-dataQuery sensor timeseries (TODO: backed by ble_event for now — empty stub)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceInstanceId | path | integer<int64> | required | — |
| from | query | string<date-time> | optional | — |
| to | query | string<date-time> | optional | — |
| page | query | integer<int32> | optional | — |
| size | query | integer<int32> | optional | — |
Responses
- 200OK
ApiResponseListMapStringObject
/tenant/devices/{deviceInstanceId}/suspendSuspend device instance
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceInstanceId | path | integer<int64> | required | — |
Responses
- 200OK
ApiResponseDeviceInstanceResponse
Tenant — Supplier Bundles
Audience: Supplier 콘솔
출시 패키지(SupplierBundle) CRUD + DRAFT → PUBLISHED → ARCHIVED 상태머신. claim 시점에 자동으로 expand됩니다.
/tenant/supplier-bundlesList supplier bundles (optionally filter by status)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| status | query | string | optional | — |
| page | query | integer<int32> | optional | — |
| size | query | integer<int32> | optional | — |
Responses
- 200OK
ApiResponseListBundleResponse
/tenant/supplier-bundlesCreate bundle (DRAFT)
Parameters
No parameters
Request body
CreateBundleRequestrequiredResponses
- 200OK
ApiResponseBundleResponse
/tenant/supplier-bundles/{bundleUuid}Get bundle detail
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| bundleUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseBundleResponse
/tenant/supplier-bundles/{bundleUuid}Delete bundle (DRAFT only)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| bundleUuid | path | string<uuid> | required | — |
Responses
- 200OK
/tenant/supplier-bundles/{bundleUuid}Update bundle fields (DRAFT only)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| bundleUuid | path | string<uuid> | required | — |
Request body
UpdateBundleRequestrequiredResponses
- 200OK
ApiResponseBundleResponse
/tenant/supplier-bundles/{bundleUuid}/appsParameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| bundleUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseListObject
/tenant/supplier-bundles/{bundleUuid}/appsReplace apps list (full overwrite)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| bundleUuid | path | string<uuid> | required | — |
Request body
BundleAppRefRequestrequiredResponses
- 200OK
ApiResponseListObject
/tenant/supplier-bundles/{bundleUuid}/archiveArchive bundle (PUBLISHED → ARCHIVED)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| bundleUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseBundleResponse
/tenant/supplier-bundles/{bundleUuid}/devicesParameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| bundleUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseListObject
/tenant/supplier-bundles/{bundleUuid}/devicesReplace devices list (full overwrite)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| bundleUuid | path | string<uuid> | required | — |
Request body
BundleDeviceRefRequestrequiredResponses
- 200OK
ApiResponseListObject
/tenant/supplier-bundles/{bundleUuid}/pipelines번들에 포함된 파이프라인 uuid 목록
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| bundleUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseListUUID
/tenant/supplier-bundles/{bundleUuid}/pipelines번들 포함 파이프라인 목록 교체 (uuid 배열)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| bundleUuid | path | string<uuid> | required | — |
Request body
Responses
- 200OK
ApiResponseListUUID
/tenant/supplier-bundles/{bundleUuid}/publishPublish bundle (DRAFT → PUBLISHED)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| bundleUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseBundleResponse
Tenant — Hub Monitoring
Audience: Supplier 콘솔 / BFF
특정 hub의 telemetry·log·job 시계열 조회. 운영 대시보드의 heartbeat·그래프 데이터 소스.
/tenant/hub-monitoring/{hubUuid}/jobsGet hub jobs
Retrieve paginated list of jobs for a specific hub. Requires READ permission on the hub's unit.
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | Hub UUID |
| pageable | query | Pageable | required | — |
Responses
- 200Hub jobs retrieved successfully
ApiResponse - 403Insufficient permissions
ApiResponsePageHubJobResponse - 404Hub not found or access denied
ApiResponsePageHubJobResponse
/tenant/hub-monitoring/{hubUuid}/jobs/{jobUuid}Get hub job details
Retrieve detailed information about a specific job including desired and result JSON payloads
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | Hub UUID |
| jobUuid | path | string<uuid> | required | Job UUID |
Responses
- 200Job details retrieved successfully
ApiResponse - 404Hub or job not found
ApiResponseHubJobDetailResponse
/tenant/hub-monitoring/{hubUuid}/jobs/{jobUuid}/eventsGet hub job events
Retrieve time-ordered events for a specific job
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | Hub UUID |
| jobUuid | path | string<uuid> | required | Job UUID |
| pageable | query | Pageable | required | — |
Responses
- 200Job events retrieved successfully
ApiResponse - 404Hub or job not found
ApiResponsePageHubJobEventResponse
/tenant/hub-monitoring/{hubUuid}/logsGet hub logs
Retrieve log entries filtered by time range (latest first)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | Hub UUID |
| from | query | string<date-time> | optional | Start time (ISO 8601) |
| to | query | string<date-time> | optional | End time (ISO 8601) |
| pageable | query | Pageable | required | — |
Responses
- 200Logs retrieved successfully
ApiResponse - 404Hub not found or access denied
ApiResponsePageHubLogResponse
/tenant/hub-monitoring/{hubUuid}/telemetryGet hub telemetry
Retrieve telemetry data filtered by time range (latest first)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | Hub UUID |
| from | query | string<date-time> | optional | Start time (ISO 8601) |
| to | query | string<date-time> | optional | End time (ISO 8601) |
| pageable | query | Pageable | required | — |
Responses
- 200Telemetry data retrieved successfully
ApiResponse - 404Hub not found or access denied
ApiResponsePageHubTelemetryResponse
Tenant — Data Pipelines
Audience: Supplier 콘솔
telemetry 변환·외부 전달 규칙 정의 (예: 윈도 평균 → S3, MQTT 등).
/tenant/data-pipelinesParameters
No parameters
Responses
- 200OK
ApiResponseListPipelineConfigResponse
/tenant/data-pipelinesParameters
No parameters
Request body
CreatePipelineRequestrequiredResponses
- 201Created
ApiResponsePipelineConfigResponse
/tenant/data-pipelines/{pipelineUuid}Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| pipelineUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponsePipelineConfigResponse
/tenant/data-pipelines/{pipelineUuid}Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| pipelineUuid | path | string<uuid> | required | — |
Request body
UpdatePipelineRequestrequiredResponses
- 200OK
ApiResponsePipelineConfigResponse
/tenant/data-pipelines/{pipelineUuid}Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| pipelineUuid | path | string<uuid> | required | — |
Responses
- 204No Content
/tenant/data-pipelines/{pipelineUuid}/deliveriesParameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| pipelineUuid | path | string<uuid> | required | — |
| page | query | integer<int32> | optional | — |
| limit | query | integer<int32> | optional | — |
Responses
- 200OK
ApiResponseListMapStringObject
/tenant/data-pipelines/{pipelineUuid}/dlqParameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| pipelineUuid | path | string<uuid> | required | — |
| page | query | integer<int32> | optional | — |
| size | query | integer<int32> | optional | — |
Responses
- 200OK
ApiResponseListDlqMessageResponse
/tenant/data-pipelines/{pipelineUuid}/dlq/{dlqId}/retryParameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| pipelineUuid | path | string<uuid> | required | — |
| dlqId | path | integer<int64> | required | — |
Responses
- 200OK
ApiResponseVoid
/tenant/data-pipelines/{pipelineUuid}/test-runParameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| pipelineUuid | path | string<uuid> | required | — |
Request body
PipelineTestRequestrequiredResponses
- 200OK
ApiResponsePipelineTestResult
/tenant/data-pipelines/transpileParameters
No parameters
Request body
JsonNoderequiredResponses
- 200OK
ApiResponseObject
Tenant — Consent Settings
Audience: Supplier 콘솔
end-user 동의 화면 텍스트·정책 설정.
/tenant/consent-settingsGet consent settings
Get active consent settings for the current tenant (or pinned supplier)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| supplierUuid | query | string<uuid> | optional | Supplier UUID (defaults to current tenant) |
Responses
- 200OK
ApiResponseConsentSettingResponse
/tenant/consent-settingsCreate or update consent settings
Create or update consent settings for a supplier
Parameters
No parameters
Request body
ConsentSettingRequestrequiredResponses
- 200OK
ApiResponseConsentSettingResponse
Tenant — 기타
Audience: Supplier 콘솔 / BFF
위에 따로 분류되지 않은 /tenant 경로. agent-policies, notification-settings 등.
/tenant/action-definitionsList action definitions for current tenant (auto-resolved supplier)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| supplierUuid | query | string<uuid> | optional | — |
Responses
- 200OK
ApiResponseListActionDefinitionResponse
/tenant/action-definitionsCreate action definition
Create a new protocol action definition
Parameters
No parameters
Request body
ActionDefinitionCreateRequestrequiredResponses
- 201Created
ApiResponseActionDefinitionResponse
/tenant/action-definitions/{actionId}Get action definition
Get a single action definition by ID
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| actionId | path | string | required | — |
Responses
- 200OK
ApiResponseActionDefinitionResponse
/tenant/action-definitions/{actionId}Delete action definition
Delete an action definition
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| actionId | path | string | required | — |
Responses
- 200OK
ApiResponseVoid
/tenant/action-definitions/{actionId}Update action definition
Update an existing action definition
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| actionId | path | string | required | — |
Request body
ActionDefinitionUpdateRequestrequiredResponses
- 200OK
ApiResponseActionDefinitionResponse
/tenant/agent-releasesList agent releases (optionally filter by channel + active)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| channel | query | string | optional | — |
| activeOnly | query | boolean | optional | — |
| page | query | integer<int32> | optional | — |
| size | query | integer<int32> | optional | — |
Responses
- 200OK
ApiResponseListAgentReleaseResponse
/tenant/agent-releases/{releaseUuid}Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| releaseUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseAgentReleaseResponse
/tenant/agent-update-policiesList agent update policies belonging to current tenant
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| page | query | integer<int32> | optional | — |
| size | query | integer<int32> | optional | — |
Responses
- 200OK
ApiResponseListAgentUpdatePolicyResponse
/tenant/agent-update-policiesUpsert UNIT/HUB scoped policy (tenant_uuid auto-set on UNIT scope)
Parameters
No parameters
Request body
CreateAgentUpdatePolicyRequestrequiredResponses
- 200OK
ApiResponseAgentUpdatePolicyResponse
/tenant/agent-update-policies/{policyUuid}Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| policyUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseAgentUpdatePolicyResponse
/tenant/agent-update-policies/{policyUuid}Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| policyUuid | path | string<uuid> | required | — |
Responses
- 204No Content
/tenant/api-keysList API keys
List all active API keys. Key hashes are never exposed.
Parameters
No parameters
Responses
- 200OK
ApiResponseListApiKeyListResponse
/tenant/api-keysGenerate new API key
Creates a new API key. The raw key is returned ONCE and cannot be retrieved again.
Parameters
No parameters
Request body
ApiKeyCreateRequestrequiredResponses
- 201Created
ApiResponseApiKeyCreateResponse
/tenant/api-keys/{apiKeyId}Update API key
Update name, scopes, or rate limit of an existing API key.
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| apiKeyId | path | integer<int64> | required | — |
Request body
ApiKeyUpdateRequestrequiredResponses
- 200OK
ApiResponseApiKeyListResponse
/tenant/api-keys/{apiKeyId}Revoke API key
Deactivates an API key. The key can no longer be used for authentication.
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| apiKeyId | path | integer<int64> | required | — |
Responses
- 200OK
ApiResponseVoid
/tenant/appsParameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| page | query | integer<int32> | optional | — |
| size | query | integer<int32> | optional | — |
Responses
- 200OK
ApiResponseListAppResponse
/tenant/appsParameters
No parameters
Request body
AppCreateRequestrequiredResponses
- 201Created
ApiResponseAppResponse
/tenant/apps/{appUuid}Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| appUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseAppResponse
/tenant/apps/{appUuid}/releasesParameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| appUuid | path | string<uuid> | required | — |
| page | query | integer<int32> | optional | — |
| size | query | integer<int32> | optional | — |
Responses
- 200OK
ApiResponseListAppReleaseResponse
/tenant/apps/{appUuid}/releasesParameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| appUuid | path | string<uuid> | required | — |
Request body
AppReleaseCreateRequestrequiredResponses
- 201Created
ApiResponseAppReleaseResponse
/tenant/audit-logsGet tenant audit logs
Retrieve tenant-level audit logs with pagination
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| page | query | integer<int32> | optional | — |
| size | query | integer<int32> | optional | — |
Responses
- 200OK
PageAuditLogResponse
/tenant/billing/balanceGet billing balance
sdx-web pass-through. Returns currentCreditCents, activeSubscription, lastInvoice.
Parameters
No parameters
Responses
- 200OK
ApiResponseMapStringObject
/tenant/billing/charge-settings[DEPRECATED] auto-charge settings — sdx-web으로 이동
Parameters
No parameters
Responses
- 200OK
ApiResponseMapStringString
/tenant/billing/charge-settings[DEPRECATED] auto-charge settings — sdx-web으로 이동
Parameters
No parameters
Responses
- 200OK
ApiResponseMapStringString
/tenant/billing/entitlementGet current entitlement
sdx-web 구독 기반 entitlement (tier, limits, validUntil)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| tenantUuid | query | string<uuid> | optional | Unit UUID (생략 시 현재 컨텍스트 사용) |
Responses
- 200OK
ApiResponseEntitlementResponse
/tenant/billing/transactionsGet billing transactions
sdx-web pass-through. Cursor pagination by createdAt desc.
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| cursor | query | string | optional | ISO-8601 datetime; 생략 시 최신부터 |
| limit | query | integer<int32> | optional | 1-100, default 50 |
Responses
- 200OK
ApiResponseMapStringObject
/tenant/ble-query/deliveriesGet BLE deliveries
Retrieve paginated list of BLE deliveries filtered by unit scope and optional criteria
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| from | query | string<date-time> | optional | Start time (ISO 8601) |
| to | query | string<date-time> | optional | End time (ISO 8601) |
| status | query | string | optional | Filter by delivery status |
| pageable | query | Pageable | required | — |
Responses
- 200BLE deliveries retrieved successfully
ApiResponse
/tenant/ble-query/eventsGet BLE events
Retrieve paginated list of BLE events filtered by unit scope and optional criteria. Raw base64 data is excluded from list view.
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| from | query | string<date-time> | optional | Start time (ISO 8601) |
| to | query | string<date-time> | optional | End time (ISO 8601) |
| hubUuid | query | string<uuid> | optional | Filter by hub UUID |
| deviceInstanceId | query | integer<int64> | optional | Filter by device instance ID |
| processingStatus | query | string | optional | Filter by processing status |
| deliveryStatus | query | string | optional | Filter by delivery status |
| pageable | query | Pageable | required | — |
Responses
- 200BLE events retrieved successfully
ApiResponse - 403Insufficient permissions
ApiResponsePageBleEventResponse
/tenant/ble-query/events/{bleEventId}Get BLE event detail
Retrieve detailed information about a specific BLE event. Raw base64 data can be included with includeRaw=true parameter.
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| bleEventId | path | integer<int64> | required | BLE event ID |
| includeRaw | query | boolean | optional | Include raw base64 data |
Responses
- 200BLE event detail retrieved successfully
ApiResponse - 404Event not found or access denied
ApiResponseBleEventDetailResponse
/tenant/ble-query/events/{bleEventId}/runsGet BLE event processing runs
Retrieve all processing runs and their actions for a specific BLE event
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| bleEventId | path | integer<int64> | required | BLE event ID |
Responses
- 200Processing runs retrieved successfully
ApiResponse - 404Event not found or access denied
ApiResponseListBleProcessingRunResponse
/tenant/ble/eventsParameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| from | query | string<date-time> | optional | — |
| to | query | string<date-time> | optional | — |
| hubUuid | query | string<uuid> | optional | — |
| deviceInstanceId | query | integer<int64> | optional | — |
| processingStatus | query | string | optional | — |
| page | query | integer<int32> | optional | — |
| size | query | integer<int32> | optional | — |
Responses
- 200OK
ApiResponseListBleEventResponse
/tenant/ble/events/{bleEventId}Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| bleEventId | path | integer<int64> | required | — |
Responses
- 200OK
ApiResponseBleEventResponse
/tenant/ble/events/{bleEventId}/runsParameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| bleEventId | path | integer<int64> | required | — |
Responses
- 200OK
ApiResponseListBleProcessingRunResponse
/tenant/ble/routeParameters
No parameters
Responses
- 200OK
ApiResponseBleRouteConfigResponse
/tenant/ble/routeParameters
No parameters
Request body
BleRouteConfigRequestrequiredResponses
- 200OK
ApiResponseBleRouteConfigResponse
/tenant/consent-recordsList consent records
List all consent records for the current tenant (or pinned supplier)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| supplierUuid | query | string<uuid> | optional | Supplier UUID (defaults to current tenant) |
Responses
- 200OK
ApiResponseListConsentRecordResponse
/tenant/dashboard/summaryDashboard summary — hub/device/pipeline/DLQ counts + BLE throughput & webhook success
windowMinutes (default 60, clamped 1–1440) sizes the events / delivery / BLE-in-range window. Hub online is derived from telemetry within a fixed 10-minute window.
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| windowMinutes | query | integer<int32> | optional | — |
Responses
- 200OK
ApiResponseDashboardSummary
/tenant/device-catalogList device catalog entries (Device models)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| page | query | integer<int32> | optional | — |
| size | query | integer<int32> | optional | — |
Responses
- 200OK
ApiResponseListDeviceCatalogResponse
/tenant/device-catalogCreate device catalog entry (deviceUuid auto-issued)
Parameters
No parameters
Request body
CreateDeviceRequestrequiredResponses
- 200OK
ApiResponseDeviceCatalogResponse
/tenant/device-catalog/{deviceUuid}Get device catalog entry detail
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseDeviceCatalogResponse
/tenant/device-catalog/{deviceUuid}Delete device catalog entry (hard delete)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceUuid | path | string<uuid> | required | — |
Responses
- 200OK
/tenant/device-catalog/{deviceUuid}Update device catalog entry
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceUuid | path | string<uuid> | required | — |
Request body
UpdateDeviceRequestrequiredResponses
- 200OK
ApiResponseDeviceCatalogResponse
/tenant/device-catalog/{deviceUuid}/identifiersList identifier hints registered under a device
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseListDeviceMatchIdentifierResponse
/tenant/device-catalog/{deviceUuid}/identifiersAdd an identifier hint
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceUuid | path | string<uuid> | required | — |
Request body
CreateDeviceMatchIdentifierRequestrequiredResponses
- 200OK
ApiResponseDeviceMatchIdentifierResponse
/tenant/device-catalog/{deviceUuid}/identifiers/{id}Remove an identifier
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceUuid | path | string<uuid> | required | — |
| id | path | integer<int64> | required | — |
Responses
- 200OK
/tenant/device-catalog/{deviceUuid}/identifiers/{id}Update label/notes on an identifier
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceUuid | path | string<uuid> | required | — |
| id | path | integer<int64> | required | — |
Request body
UpdateDeviceMatchIdentifierRequestrequiredResponses
- 200OK
ApiResponseDeviceMatchIdentifierResponse
/tenant/device-protocolsList device protocols (optionally filter by deviceUuid)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceUuid | query | string<uuid> | optional | — |
| page | query | integer<int32> | optional | — |
| size | query | integer<int32> | optional | — |
Responses
- 200OK
ApiResponseListDeviceProtocolResponse
/tenant/device-protocolsCreate device protocol entry
Parameters
No parameters
Request body
CreateDeviceProtocolRequestrequiredResponses
- 200OK
ApiResponseDeviceProtocolResponse
/tenant/device-protocols/{deviceProtocolId}Get device protocol detail
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceProtocolId | path | integer<int64> | required | — |
Responses
- 200OK
ApiResponseDeviceProtocolResponse
/tenant/device-protocols/{deviceProtocolId}Delete device protocol entry
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceProtocolId | path | integer<int64> | required | — |
Responses
- 200OK
/tenant/device-protocols/{deviceProtocolId}Update device protocol entry
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceProtocolId | path | integer<int64> | required | — |
Request body
UpdateDeviceProtocolRequestrequiredResponses
- 200OK
ApiResponseDeviceProtocolResponse
/tenant/device-protocols/devices/{deviceUuid}Get device catalog header (Device entity)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseDeviceCatalogResponse
/tenant/device-ui-schemasList device UI schemas (optionally filter by deviceUuid)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceUuid | query | string<uuid> | optional | — |
| page | query | integer<int32> | optional | — |
| size | query | integer<int32> | optional | — |
Responses
- 200OK
ApiResponseListDeviceUiResponse
/tenant/device-ui-schemasCreate device UI schema
Parameters
No parameters
Request body
CreateDeviceUiRequestrequiredResponses
- 200OK
ApiResponseDeviceUiResponse
/tenant/device-ui-schemas/{deviceUiId}Get device UI schema detail
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceUiId | path | integer<int64> | required | — |
Responses
- 200OK
ApiResponseDeviceUiResponse
/tenant/device-ui-schemas/{deviceUiId}Delete device UI schema
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceUiId | path | integer<int64> | required | — |
Responses
- 200OK
/tenant/device-ui-schemas/{deviceUiId}Update device UI schema
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceUiId | path | integer<int64> | required | — |
Request body
UpdateDeviceUiRequestrequiredResponses
- 200OK
ApiResponseDeviceUiResponse
/tenant/device-versionsList device versions (optionally filter by deviceUuid)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceUuid | query | string<uuid> | optional | — |
| page | query | integer<int32> | optional | — |
| size | query | integer<int32> | optional | — |
Responses
- 200OK
ApiResponseListDeviceVersionResponse
/tenant/device-versionsCreate device version entry
Parameters
No parameters
Request body
CreateDeviceVersionRequestrequiredResponses
- 200OK
ApiResponseDeviceVersionResponse
/tenant/device-versions/{deviceVersionUuid}Get device version detail
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceVersionUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseDeviceVersionResponse
/tenant/device-versions/{deviceVersionUuid}Delete device version entry
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceVersionUuid | path | string<uuid> | required | — |
Responses
- 200OK
/tenant/device-versions/{deviceVersionUuid}Update device version entry
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceVersionUuid | path | string<uuid> | required | — |
Request body
UpdateDeviceVersionRequestrequiredResponses
- 200OK
ApiResponseDeviceVersionResponse
/tenant/downloads/asset-urlResolve a GH presigned S3 URL for a single asset (5-min TTL)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| category | query | string | required | — |
| assetId | query | integer<int64> | required | — |
Responses
- 200OK
ApiResponseAssetUrl
/tenant/downloads/manifestLatest release + filtered assets for installer / hub-os / hub-agent
Parameters
No parameters
Responses
- 200OK
ApiResponseDownloadManifest
/tenant/external-endpoints현재 tenant 의 외부 엔드포인트 목록
Parameters
No parameters
Responses
- 200OK
ApiResponseListMapStringObject
/tenant/external-endpoints외부 엔드포인트 등록
baseUrl host 로 domain 추출 + verify_token 발급. 등록 시점엔 domain_verified=false.
Parameters
No parameters
Request body
ExternalEndpointRequestrequiredResponses
- 200OK
ApiResponseMapStringObject
/tenant/external-endpoints/{id}외부 엔드포인트 단건 조회
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| id | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseMapStringObject
/tenant/external-endpoints/{id}외부 엔드포인트 수정
baseUrl 이 바뀌면 domain 재계산 + domain_verified 리셋(재인증 필요). authConfig 비면 기존 ciphertext 유지.
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| id | path | string<uuid> | required | — |
Request body
ExternalEndpointRequestrequiredResponses
- 200OK
ApiResponseMapStringObject
/tenant/external-endpoints/{id}외부 엔드포인트 삭제
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| id | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseMapStringString
/tenant/external-endpoints/{id}/verify도메인 소유 검증 실행
설정된 verify_method 로 DNS TXT / well-known 을 조회해 verify_token 게시 여부 확인. 성공 시 domain_verified=true.
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| id | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseMapStringObject
/tenant/manualsList device manuals (optionally filter by deviceUuid)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceUuid | query | string<uuid> | optional | — |
| page | query | integer<int32> | optional | — |
| size | query | integer<int32> | optional | — |
Responses
- 200OK
ApiResponseListDeviceManualResponse
/tenant/manualsCreate device manual
Parameters
No parameters
Request body
CreateDeviceManualRequestrequiredResponses
- 200OK
ApiResponseDeviceManualResponse
/tenant/manuals/{deviceManualId}Get device manual detail
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceManualId | path | integer<int64> | required | — |
Responses
- 200OK
ApiResponseDeviceManualResponse
/tenant/manuals/{deviceManualId}Delete device manual
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceManualId | path | integer<int64> | required | — |
Responses
- 200OK
/tenant/manuals/{deviceManualId}Update device manual
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceManualId | path | integer<int64> | required | — |
Request body
UpdateDeviceManualRequestrequiredResponses
- 200OK
ApiResponseDeviceManualResponse
/tenant/notification-settingsList notification settings for current user within tenant context
Parameters
No parameters
Responses
- 200OK
ApiResponseListNotificationSettingResponse
/tenant/notification-settingsUpsert a single notification setting (by type+channel)
Parameters
No parameters
Request body
UpsertNotificationSettingRequestrequiredResponses
- 200OK
ApiResponseNotificationSettingResponse
/tenant/notification-settings/bulkBulk upsert notification settings
Parameters
No parameters
Request body
UpsertNotificationSettingRequestrequiredResponses
- 200OK
ApiResponseListNotificationSettingResponse
/tenant/personasList active members + pending / historical invitations
Parameters
No parameters
Responses
- 200OK
ApiResponseTenantPersonasResponse
/tenant/personas/{personaUuid}Revoke a persona's access to this tenant
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| personaUuid | path | string<uuid> | required | — |
Responses
- 200OK
/tenant/personas/{personaUuid}Change role of a tenant persona
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| personaUuid | path | string<uuid> | required | — |
Request body
UpdatePersonaRoleRequestrequiredResponses
- 200OK
ApiResponseTenantMemberResponse
/tenant/personas/invitations/{invitationId}Mark an invitation REVOKED (unlike a member revoke, this is idempotent)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| invitationId | path | integer<int64> | required | — |
Responses
- 200OK
/tenant/personas/invitations/{invitationId}/resendRotate token + resend invitation email
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| invitationId | path | integer<int64> | required | — |
Responses
- 200OK
ApiResponseTenantInvitationResponse
/tenant/personas/inviteInvite by email (creates PENDING invitation) or grant by personaUuid
Parameters
No parameters
Request body
PersonaInviteRequestrequiredResponses
- 200OK
ApiResponseInviteResponse
/tenant/simulator/presetsParameters
No parameters
Responses
- 200OK
ApiResponseListSimulationPreset
/tenant/simulator/runParameters
No parameters
Request body
SimulationRequestrequiredResponses
- 200OK
ApiResponseSimulationResult
/tenant/simulator/streamParameters
No parameters
Request body
StreamSimulationRequestrequiredResponses
- 200OK
ApiResponseListSimulationResult
/tenant/stream/ble/eventsStream BLE events
Subscribe to real-time BLE events via Server-Sent Events (SSE). **SSE Protocol:** - Content-Type: text/event-stream - Event name: `ble_event` - Heartbeat: Every 20 seconds (comment: ping) - Connection timeout: 5 minutes **Last-Event-ID Support:** - Client can send `Last-Event-ID` header with ISO-8601 timestamp - Server will stream events after that timestamp - Event IDs are ISO-8601 timestamps (receivedAt) **Permission:** - Requires unit scope (events filtered by persona's unit) - Requires READ permission (permissionCode & 1 == 1) **Testing with curl:** ```bash curl -N -H "Authorization: Bearer YOUR_TOKEN" \ http://localhost:8080/tenant/stream/ble/events ``` **Testing with EventSource (JavaScript):** ```javascript const eventSource = new EventSource('/tenant/stream/ble/events', { headers: { Authorization: 'Bearer YOUR_TOKEN' } }); eventSource.addEventListener('ble_event', (event) => { const data = JSON.parse(event.data); console.log('BLE event:', data); }); eventSource.onerror = (error) => { console.error('SSE error:', error); }; ```
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| Authorization | header | string | required | — |
| Last-Event-ID | header | string | optional | Last event timestamp (ISO-8601) |
Responses
- 200SSE stream established
- 403Insufficient permissions
SseEmitter
/tenant/stream/hubs/{hubUuid}/jobsStream hub job events
Subscribe to real-time hub job events via Server-Sent Events (SSE). **SSE Protocol:** - Content-Type: text/event-stream - Event name: `hub_job_event` - Heartbeat: Every 20 seconds (comment: ping) - Connection timeout: 5 minutes **Last-Event-ID Support:** - Client can send `Last-Event-ID` header with ISO-8601 timestamp - Server will stream events after that timestamp - Event IDs are ISO-8601 timestamps (receivedAt) **Permission:** - Requires unit scope (persona's unit must match hub's unit) - Requires READ permission (permissionCode & 1 == 1) **Testing with curl:** ```bash curl -N -H "Authorization: Bearer YOUR_TOKEN" \ http://localhost:8080/tenant/stream/hubs/{hubUuid}/jobs ``` **Testing with EventSource (JavaScript):** ```javascript const eventSource = new EventSource('/tenant/stream/hubs/{hubUuid}/jobs', { headers: { Authorization: 'Bearer YOUR_TOKEN' } }); eventSource.addEventListener('hub_job_event', (event) => { const data = JSON.parse(event.data); console.log('Job event:', data); }); ```
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| Authorization | header | string | required | — |
| hubUuid | path | string<uuid> | required | Hub UUID |
| Last-Event-ID | header | string | optional | Last event timestamp (ISO-8601) |
Responses
- 200SSE stream established
- 403Insufficient permissions
SseEmitter - 404Hub not found or persona doesn't have access
SseEmitter
/tenant/stream/hubs/{hubUuid}/logsStream hub logs
Subscribe to real-time hub logs via Server-Sent Events (SSE). **SSE Protocol:** - Content-Type: text/event-stream - Event name: `hub_log` - Heartbeat: Every 20 seconds (comment: ping) - Connection timeout: 5 minutes **Last-Event-ID Support:** - Client can send `Last-Event-ID` header with ISO-8601 timestamp - Server will stream logs after that timestamp - Event IDs are ISO-8601 timestamps (receivedAt) **Permission:** - Requires unit scope (persona's unit must match hub's unit) - Requires READ permission (permissionCode & 1 == 1) **Testing with curl:** ```bash curl -N -H "Authorization: Bearer YOUR_TOKEN" \ http://localhost:8080/tenant/stream/hubs/{hubUuid}/logs ```
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| Authorization | header | string | required | — |
| hubUuid | path | string<uuid> | required | Hub UUID |
| Last-Event-ID | header | string | optional | Last event timestamp (ISO-8601) |
Responses
- 200SSE stream established
- 403Insufficient permissions
SseEmitter - 404Hub not found or persona doesn't have access
SseEmitter
/tenant/supplier-oauth-config현재 tenant의 OAuth config 조회 (없으면 404)
secret 값은 응답에 노출되지 않음. registrationSharedSecretSet 플래그로 존재 여부만.
Parameters
No parameters
Responses
- 200OK
ApiResponseMapStringObject
/tenant/supplier-oauth-configUPSERT — 즉시 등록 또는 (require-approval=true일 때) 승인 큐 적재
client_secret + registration_shared_secret은 plaintext로 받아 즉시 AES-GCM 암호화 저장. 응답에 secret 미노출.
Parameters
No parameters
Request body
SupplierOauthConfigRequestrequiredResponses
- 200OK
ApiResponseMapStringObject
/tenant/supplier-oauth-config현재 tenant의 OAuth config 삭제
Parameters
No parameters
Responses
- 200OK
ApiResponseMapStringString
/tenant/tenantsList my accessible tenants
Parameters
No parameters
Responses
- 200OK
ApiResponseListTenantResponse
/tenant/tenantsCreate a new tenant under my current sdx unit
Parameters
No parameters
Request body
CreateTenantRequestrequiredResponses
- 200OK
ApiResponseTenantResponse
/tenant/tenants/{tenantUuid}Soft-delete tenant (OWNER only)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| tenantUuid | path | string<uuid> | required | — |
Responses
- 200OK
/tenant/tenants/{tenantUuid}Update tenant name (ADMIN+)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| tenantUuid | path | string<uuid> | required | — |
Request body
CreateTenantRequestrequiredResponses
- 200OK
ApiResponseTenantResponse
/tenant/tenants/{tenantUuid}/membersList tenant members (any access)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| tenantUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseListTenantMemberResponse
/tenant/tenants/{tenantUuid}/membersGrant access (ADMIN+; OWNER for OWNER role)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| tenantUuid | path | string<uuid> | required | — |
Request body
GrantAccessRequestrequiredResponses
- 200OK
ApiResponseTenantMemberResponse
/tenant/tenants/{tenantUuid}/members/{targetPersonaUuid}Revoke access (ADMIN+; last OWNER protected)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| tenantUuid | path | string<uuid> | required | — |
| targetPersonaUuid | path | string<uuid> | required | — |
Responses
- 200OK
/tenant/tenants/{tenantUuid}/transferInitiate ownership transfer (current OWNER)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| tenantUuid | path | string<uuid> | required | — |
Request body
InitiateTransferRequestrequiredResponses
- 200OK
ApiResponseTenantTransferRequestResponse
/tenant/testTenant test endpoint
Test endpoint that requires JWT authentication
Parameters
No parameters
Responses
- 200OK
ApiResponseMapStringObject
/tenant/transfer-requests/{requestUuid}/accept이전 요청 승인 (받는 unit의 멤버 persona)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| requestUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseTenantTransferRequestResponse
/tenant/transfer-requests/{requestUuid}/cancel이전 요청 취소 (요청자 본인 또는 OWNER)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| requestUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseTenantTransferRequestResponse
/tenant/transfer-requests/{requestUuid}/reject이전 요청 거부 (받는 unit의 멤버 persona)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| requestUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseTenantTransferRequestResponse
/tenant/transfer-requests/incoming받은 PENDING 이전 요청 (현재 persona의 unit으로 향한)
Parameters
No parameters
Responses
- 200OK
ApiResponseListTenantTransferRequestResponse
/tenant/transfer-requests/outgoing보낸 PENDING 이전 요청 (현재 persona의 unit에서 발신)
Parameters
No parameters
Responses
- 200OK
ApiResponseListTenantTransferRequestResponse
/tenant/units/{tenantUuid}/testTest unit boundary enforcement
Test endpoint that verifies persona belongs to specified unit
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| tenantUuid | path | string<uuid> | required | Unit UUID to access |
Responses
- 200OK
ApiResponseMapStringObject
App API — End-user
Audience: 모바일 앱 (Flutter)
end-user 모바일 앱이 쓰는 endpoint. sdx-oauth JWT로 인증.
/app/action-definitionsList action definitions for a supplier
Returns all action definitions for the specified supplier
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| supplierUuid | query | string<uuid> | required | — |
Responses
- 200OK
ApiResponseListActionDefinitionResponse
/app/action-definitions/{actionId}Get action definition
Get a single action definition by ID
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| actionId | path | string | required | — |
Responses
- 200OK
ApiResponseActionDefinitionResponse
/app/bundle-catalogList PUBLISHED bundles
현재 사용자 기준 link 상태 함께 반환
Parameters
No parameters
Responses
- 200OK
ApiResponseListBundleCatalogResponse
/app/bundle-catalog/{bundleUuid}Get bundle catalog detail
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| bundleUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseBundleCatalogResponse
/app/consentList consent records
List all consent records for current user
Parameters
No parameters
Responses
- 200OK
ApiResponseListConsentRecordResponse
/app/consentGrant consent
Grant consent for a supplier and consent type
Parameters
No parameters
Request body
ConsentGrantRequestrequiredResponses
- 200OK
ApiResponseConsentRecordResponse
/app/consent/{consentId}Withdraw consent
Withdraw a previously granted consent
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| consentId | path | integer<int64> | required | Consent record ID |
Responses
- 200OK
ApiResponseVoid
/app/consent/{consentId}/retentionGet retention settings
Get retention settings for a consent record
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| consentId | path | integer<int64> | required | Consent record ID |
Responses
- 200OK
ApiResponseRetentionSettingResponse
/app/consent/{consentId}/retentionUpdate retention period
Update retention period for a consent record
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| consentId | path | integer<int64> | required | Consent record ID |
Request body
RetentionUpdateRequestrequiredResponses
- 200OK
ApiResponseRetentionSettingResponse
/app/device-ui/invokedevice_ui invoke 실행
hubUuid 소유권 검증 → supplier resolve → 인증된 external_endpoint 로 프록시 호출.
Parameters
No parameters
Request body
DeviceUiInvokeRequestrequiredResponses
- 200OK
ApiResponseMapStringObject
/app/device-ui/setup/{hubUuid}허브-device 의 device_ui setup 스키마 조회
device_ui 미저작 시 404 → 앱은 legacy step-runner 로 fallback.
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseMapStringObject
/app/devicesList user's devices
List all devices from units where user has a persona
Parameters
No parameters
Responses
- 200OK
ApiResponseListDeviceSummaryResponse
/app/devices/{deviceInstanceId}Get device detail
Get device detail by instance ID
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceInstanceId | path | integer<int64> | required | Device instance ID |
Responses
- 200OK
ApiResponseDeviceDetailResponse
/app/devices/{deviceInstanceId}/commandsSend control command
Send a control command to a device
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceInstanceId | path | integer<int64> | required | Device instance ID |
Request body
DeviceCommandRequestrequiredResponses
- 200OK
ApiResponseDeviceCommandResponse
/app/devices/{deviceInstanceId}/sensor-dataGet sensor data
Get sensor data for a device with optional time range
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| deviceInstanceId | path | integer<int64> | required | Device instance ID |
| from | query | string | optional | Start time (ISO 8601) |
| to | query | string | optional | End time (ISO 8601) |
Responses
- 200OK
ApiResponseObject
/app/hubsList hubs
List all hubs owned by current user
Parameters
No parameters
Responses
- 200OK
ApiResponseListAppHubSummaryResponse
/app/hubs/{hubUuid}Get hub detail
Get hub detail by UUID
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| hubUuid | path | string<uuid> | required | Hub UUID |
Responses
- 200OK
ApiResponseAppHubDetailResponse
/app/notificationsList notifications
List notifications for current user (paginated)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| page | query | integer<int32> | optional | Page number (1-based) |
| size | query | integer<int32> | optional | Page size |
Responses
- 200OK
ApiResponseListNotificationResponse
/app/notifications/{notificationId}/readMark as read
Mark a notification as read
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| notificationId | path | integer<int64> | required | Notification ID |
Responses
- 200OK
ApiResponseVoid
/app/profileGet profile
Get current user profile
Parameters
No parameters
Responses
- 200OK
ApiResponseUserProfileResponse
/app/profileUpdate profile
Update current user profile (nickname, etc.)
Parameters
No parameters
Request body
UserProfileUpdateRequestrequiredResponses
- 200OK
ApiResponseUserProfileResponse
/app/supplier-link/authorizeBegin OAuth authorize flow
state + PKCE INSERT 후 외부 브라우저로 열 authorize URL 반환. 사용자 계정 연결은 hub와 무관 — hub/device 단위 권한은 별도 모델로 처리.
Parameters
No parameters
Request body
AuthorizeRequestrequiredResponses
- 200OK
ApiResponseMapStringString
/app/supplier-linksList my active supplier links
supplier_uuid 쿼리 시 그 supplier의 active link만 (n:1로 여러 개 가능)
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| supplierUuid | query | string<uuid> | optional | — |
Responses
- 200OK
ApiResponseListSupplierLinkResponse
/app/supplier-links/{id}Revoke supplier link
supplier revoke_url 호출 + 로컬 soft-revoke
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| id | path | integer<int64> | required | — |
Responses
- 200OK
ApiResponseMapStringString
/app/supplier-links/{id}/access-tokenGet fresh access token
만료 5분 이내면 자동 refresh 후 반환. step.configJson.external_submit_url 호출 직전에 사용.
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| id | path | integer<int64> | required | — |
Responses
- 200OK
ApiResponseMapStringObject
/app/supplier-oauth-configs/{supplierUuid}Get consent preview (no secret)
supplier가 required로 등록되어 있으면 consent_text/scope/userinfo_url 반환
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
| supplierUuid | path | string<uuid> | required | — |
Responses
- 200OK
ApiResponseMapStringObject
See the Schemas section of Swagger UI for component schema details.
Unclassified endpoints (11)
These endpoints didn't match any group. If they're new, please extend the grouping rules in openapi.ts.
- post /webhook/supplier-permission/{supplierUuid}
- post /v1/ble/events
- post /v1/ble/events/windowed
- post /invitations/accept
- get /v1/test
- get /v1/apps/{appReleaseUuid}/manifest
- get /v1/agent/releases/latest
- get /public/invitations/{token}
- get /me/notifications
- get /installer/{filename}
- get /auth/supplier-link/callback