LinkO'Star

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 코드 자체가 일회성 자격증명 역할을 합니다.

post/v1/hubs/claim

Claim 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

application/jsonHubClaimRequestrequired

Responses

  • 201Hub claimed successfullyApiResponse
  • 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는 직접 부르지 않습니다.

post/v1/hubs/{hubUuid}/certificates

Sign hub CSR

Hub 가 device-local keypair 로 만든 PKCS#10 CSR 를 제출. LinkOStar 가 sign 후 client cert 를 돌려줌. cert 의 CN/SAN 은 backend 가 신뢰하는 hub_uuid 로 강제 — CSR 의 subject 는 무시.

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>required

Request body

application/jsonCertificateIssueRequestrequired

Responses

  • 200OKApiResponseCertificateIssueResponse
get/v1/hubs/{hubUuid}/desired-state

Get current DesiredState for this hub (poll)

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>required

Responses

  • 200OKApiResponseMapStringObject
post/v1/hubs/{hubUuid}/device-query

Resolve a scanned BLE asset to a device instance and activate it

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>required

Request body

application/jsonDeviceQueryRequestrequired

Responses

  • 200OKApiResponseDeviceQueryResponse
post/v1/hubs/{hubUuid}/jobs/{hubJobUuid}/events

Record job event

Record job event and update job status

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>requiredHub UUID
hubJobUuidpathstring<uuid>requiredHub Job UUID

Request body

application/jsonHubJobEventRequestrequired

Responses

  • 204No Content
post/v1/hubs/{hubUuid}/logs

Record log

Record log entry from hub

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>requiredHub UUID

Request body

application/jsonJsonNoderequired

Responses

  • 204No Content
post/v1/hubs/{hubUuid}/telemetry

Record telemetry

Record telemetry data from hub

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>requiredHub UUID

Request body

application/jsonJsonNoderequired

Responses

  • 204No Content
post/v1/hubs/adapters

Snapshot inventory upsert + missing-row power-off

Idempotent: replays produce the same end-state. supplier_uuid / role 같은 운영자 지정 값은 보존 (덮어쓰지 않음).

Parameters

No parameters

Request body

application/jsonPayloadrequired

Responses

  • 200OKApiResponseResult
get/v1/hubs/ca-bundle

Root CA PEM

Agent 가 trust store 에 박을 LinkOStar root CA 인증서.

Parameters

No parameters

Responses

  • 200OK
post/v1/hubs/refresh

Refresh 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

application/jsonHubRefreshRequestrequired

Responses

  • 200Tokens refreshed successfullyApiResponse
  • 401Hub authentication required or invalid refresh token
  • 403Hub is blocked or token is revoked
get/v1/hubs/scan-config

현재 hub의 tenant 소속 device + identifier + protocol + HUB-layer route 묶음

Parameters

No parameters

Responses

  • 200OKApiResponseScanConfigResponse

Tenant — Hubs

Audience: Supplier 콘솔 / BFF

특정 tenant 소속 hub의 조회·관리. X-API-Key 또는 sdx-oauth JWT + X-Tenant-UUID 헤더로 인증합니다.

get/tenant/hubs

List hubs

List all hubs for current unit with READ permission check

Parameters

NameInTypeDescription
pagequeryinteger<int32>optionalPage number (1-based)
sizequeryinteger<int32>optionalPage size

Responses

  • 200OKApiResponseListHubSummaryResponse
get/tenant/hubs/{hubUuid}

Get hub detail

Get hub detail with READ permission check

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>requiredHub UUID

Responses

  • 200OKApiResponseHubDetailResponse
patch/tenant/hubs/{hubUuid}

Update hub label

Tenant 측에서 hub_identifier 같은 운영 라벨을 수정. PATCH 의미 — null 필드는 그대로 둠.

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>requiredHub UUID

Request body

application/jsonHubUpdateRequestrequired

Responses

  • 200OKApiResponseHubDetailResponse
get/tenant/hubs/{hubUuid}/adapters

이 hub가 가진 BlueZ adapter 전부

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>required

Responses

  • 200OKApiResponseListAdapterView
patch/tenant/hubs/{hubUuid}/adapters/{address}

adapter role / supplier 할당 변경

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>required
addresspathstringrequired

Request body

application/jsonUpdateRequestrequired

Responses

  • 200OKApiResponseAdapterView
get/tenant/hubs/{hubUuid}/apps

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>required

Responses

  • 200OKApiResponseListHubInstalledAppResponse
get/tenant/hubs/{hubUuid}/installed-apps

List apps scheduled / installed on this hub

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>required

Responses

  • 200OKApiResponseListInstalledAppView
get/tenant/hubs/{hubUuid}/jobs

Get hub jobs

Get hub jobs with READ permission check

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>requiredHub UUID
pagequeryinteger<int32>optionalPage number (1-based)
sizequeryinteger<int32>optionalPage size

Responses

  • 200OKApiResponseListHubJobResponse
post/tenant/hubs/{hubUuid}/jobs/app-install

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>required

Request body

application/jsonAppInstallRequestrequired

Responses

  • 201CreatedApiResponseUUID
post/tenant/hubs/{hubUuid}/jobs/app-remove

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>required
appUuidquerystring<uuid>required

Responses

  • 201CreatedApiResponseUUID
get/tenant/hubs/{hubUuid}/logs

Get hub logs

Get hub logs with time range filter

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>requiredHub UUID
fromquerystring<date-time>optionalStart time (ISO 8601)
toquerystring<date-time>optionalEnd time (ISO 8601)
pagequeryinteger<int32>optionalPage number (1-based)
sizequeryinteger<int32>optionalPage size

Responses

  • 200OKApiResponseListHubLogResponse
get/tenant/hubs/{hubUuid}/setup-delegations

List setup delegations

List all setup delegations for a hub

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>requiredHub UUID

Responses

  • 200OKApiResponseListSetupDelegationResponse
post/tenant/hubs/{hubUuid}/setup-delegations

Create setup delegation

Delegate hub setup rights to another user

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>requiredHub UUID

Request body

application/jsonSetupDelegationRequestrequired

Responses

  • 200OKApiResponseSetupDelegationResponse
delete/tenant/hubs/{hubUuid}/setup-delegations/{id}

Revoke setup delegation

Revoke a setup delegation

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>requiredHub UUID
idpathinteger<int64>requiredDelegation ID

Responses

  • 200OKApiResponseVoid
get/tenant/hubs/{hubUuid}/telemetry

Get hub telemetry

Get hub telemetry with time range filter

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>requiredHub UUID
fromquerystring<date-time>optionalStart time (ISO 8601)
toquerystring<date-time>optionalEnd time (ISO 8601)
pagequeryinteger<int32>optionalPage number (1-based)
sizequeryinteger<int32>optionalPage size

Responses

  • 200OKApiResponseListHubTelemetryResponse
get/tenant/hubs/claim-codes

List my claim codes

Newest first; status is derived (PENDING/USED/EXPIRED/REVOKED)

Parameters

NameInTypeDescription
pagequeryinteger<int32>optional
sizequeryinteger<int32>optional

Responses

  • 200OKApiResponseListClaimCodeListItem
post/tenant/hubs/claim-codes

Generate claim code

Generate a new hub claim code for this tenant

Parameters

No parameters

Request body

application/jsonClaimCodeGenerateRequestrequired

Responses

  • 200OKApiResponseClaimCodeResponse
delete/tenant/hubs/claim-codes/{claimCode}

Hard-delete (unused) or soft-revoke (used) a claim code

Parameters

NameInTypeDescription
claimCodepathstringrequired

Responses

  • 204No Content

Tenant — Devices

Audience: Supplier 콘솔 / BFF

각 hub에 연결된 device 인스턴스 조회·관리. BLE 스캐너로 발견된 디바이스가 여기 들어옵니다.

get/tenant/devices

List device instances (optionally filter by activationStatus)

Parameters

NameInTypeDescription
pagequeryinteger<int32>optional
sizequeryinteger<int32>optional
activationStatusquerystringoptional

Responses

  • 200OKApiResponseListDeviceInstanceResponse
post/tenant/devices

Register new device instance

Parameters

No parameters

Request body

application/jsonCreateDeviceInstanceRequestrequired

Responses

  • 200OKApiResponseDeviceInstanceResponse
get/tenant/devices/{deviceInstanceId}

Get device instance detail

Parameters

NameInTypeDescription
deviceInstanceIdpathinteger<int64>required

Responses

  • 200OKApiResponseDeviceInstanceResponse
delete/tenant/devices/{deviceInstanceId}

Delete device instance

Parameters

NameInTypeDescription
deviceInstanceIdpathinteger<int64>required

Responses

  • 200OK
patch/tenant/devices/{deviceInstanceId}

Update device instance

Parameters

NameInTypeDescription
deviceInstanceIdpathinteger<int64>required

Request body

application/jsonUpdateDeviceInstanceRequestrequired

Responses

  • 200OKApiResponseDeviceInstanceResponse
post/tenant/devices/{deviceInstanceId}/activate

Force-activate device instance (manual override)

Parameters

NameInTypeDescription
deviceInstanceIdpathinteger<int64>required

Responses

  • 200OKApiResponseDeviceInstanceResponse
post/tenant/devices/{deviceInstanceId}/retire

Retire device instance (terminal state)

Parameters

NameInTypeDescription
deviceInstanceIdpathinteger<int64>required

Responses

  • 200OKApiResponseDeviceInstanceResponse
get/tenant/devices/{deviceInstanceId}/sensor-data

Query sensor timeseries (TODO: backed by ble_event for now — empty stub)

Parameters

NameInTypeDescription
deviceInstanceIdpathinteger<int64>required
fromquerystring<date-time>optional
toquerystring<date-time>optional
pagequeryinteger<int32>optional
sizequeryinteger<int32>optional

Responses

  • 200OKApiResponseListMapStringObject
post/tenant/devices/{deviceInstanceId}/suspend

Suspend device instance

Parameters

NameInTypeDescription
deviceInstanceIdpathinteger<int64>required

Responses

  • 200OKApiResponseDeviceInstanceResponse

Tenant — Supplier Bundles

Audience: Supplier 콘솔

출시 패키지(SupplierBundle) CRUD + DRAFT → PUBLISHED → ARCHIVED 상태머신. claim 시점에 자동으로 expand됩니다.

get/tenant/supplier-bundles

List supplier bundles (optionally filter by status)

Parameters

NameInTypeDescription
statusquerystringoptional
pagequeryinteger<int32>optional
sizequeryinteger<int32>optional

Responses

  • 200OKApiResponseListBundleResponse
post/tenant/supplier-bundles

Create bundle (DRAFT)

Parameters

No parameters

Request body

application/jsonCreateBundleRequestrequired

Responses

  • 200OKApiResponseBundleResponse
get/tenant/supplier-bundles/{bundleUuid}

Get bundle detail

Parameters

NameInTypeDescription
bundleUuidpathstring<uuid>required

Responses

  • 200OKApiResponseBundleResponse
delete/tenant/supplier-bundles/{bundleUuid}

Delete bundle (DRAFT only)

Parameters

NameInTypeDescription
bundleUuidpathstring<uuid>required

Responses

  • 200OK
patch/tenant/supplier-bundles/{bundleUuid}

Update bundle fields (DRAFT only)

Parameters

NameInTypeDescription
bundleUuidpathstring<uuid>required

Request body

application/jsonUpdateBundleRequestrequired

Responses

  • 200OKApiResponseBundleResponse
get/tenant/supplier-bundles/{bundleUuid}/apps

Parameters

NameInTypeDescription
bundleUuidpathstring<uuid>required

Responses

  • 200OKApiResponseListObject
put/tenant/supplier-bundles/{bundleUuid}/apps

Replace apps list (full overwrite)

Parameters

NameInTypeDescription
bundleUuidpathstring<uuid>required

Request body

application/jsonBundleAppRefRequestrequired

Responses

  • 200OKApiResponseListObject
post/tenant/supplier-bundles/{bundleUuid}/archive

Archive bundle (PUBLISHED → ARCHIVED)

Parameters

NameInTypeDescription
bundleUuidpathstring<uuid>required

Responses

  • 200OKApiResponseBundleResponse
get/tenant/supplier-bundles/{bundleUuid}/devices

Parameters

NameInTypeDescription
bundleUuidpathstring<uuid>required

Responses

  • 200OKApiResponseListObject
put/tenant/supplier-bundles/{bundleUuid}/devices

Replace devices list (full overwrite)

Parameters

NameInTypeDescription
bundleUuidpathstring<uuid>required

Request body

application/jsonBundleDeviceRefRequestrequired

Responses

  • 200OKApiResponseListObject
get/tenant/supplier-bundles/{bundleUuid}/pipelines

번들에 포함된 파이프라인 uuid 목록

Parameters

NameInTypeDescription
bundleUuidpathstring<uuid>required

Responses

  • 200OKApiResponseListUUID
put/tenant/supplier-bundles/{bundleUuid}/pipelines

번들 포함 파이프라인 목록 교체 (uuid 배열)

Parameters

NameInTypeDescription
bundleUuidpathstring<uuid>required

Request body

application/jsonrequired

Responses

  • 200OKApiResponseListUUID
post/tenant/supplier-bundles/{bundleUuid}/publish

Publish bundle (DRAFT → PUBLISHED)

Parameters

NameInTypeDescription
bundleUuidpathstring<uuid>required

Responses

  • 200OKApiResponseBundleResponse

Tenant — Hub Monitoring

Audience: Supplier 콘솔 / BFF

특정 hub의 telemetry·log·job 시계열 조회. 운영 대시보드의 heartbeat·그래프 데이터 소스.

get/tenant/hub-monitoring/{hubUuid}/jobs

Get hub jobs

Retrieve paginated list of jobs for a specific hub. Requires READ permission on the hub's unit.

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>requiredHub UUID
pageablequeryPageablerequired

Responses

  • 200Hub jobs retrieved successfullyApiResponse
  • 403Insufficient permissionsApiResponsePageHubJobResponse
  • 404Hub not found or access deniedApiResponsePageHubJobResponse
get/tenant/hub-monitoring/{hubUuid}/jobs/{jobUuid}

Get hub job details

Retrieve detailed information about a specific job including desired and result JSON payloads

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>requiredHub UUID
jobUuidpathstring<uuid>requiredJob UUID

Responses

  • 200Job details retrieved successfullyApiResponse
  • 404Hub or job not foundApiResponseHubJobDetailResponse
get/tenant/hub-monitoring/{hubUuid}/jobs/{jobUuid}/events

Get hub job events

Retrieve time-ordered events for a specific job

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>requiredHub UUID
jobUuidpathstring<uuid>requiredJob UUID
pageablequeryPageablerequired

Responses

  • 200Job events retrieved successfullyApiResponse
  • 404Hub or job not foundApiResponsePageHubJobEventResponse
get/tenant/hub-monitoring/{hubUuid}/logs

Get hub logs

Retrieve log entries filtered by time range (latest first)

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>requiredHub UUID
fromquerystring<date-time>optionalStart time (ISO 8601)
toquerystring<date-time>optionalEnd time (ISO 8601)
pageablequeryPageablerequired

Responses

  • 200Logs retrieved successfullyApiResponse
  • 404Hub not found or access deniedApiResponsePageHubLogResponse
get/tenant/hub-monitoring/{hubUuid}/telemetry

Get hub telemetry

Retrieve telemetry data filtered by time range (latest first)

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>requiredHub UUID
fromquerystring<date-time>optionalStart time (ISO 8601)
toquerystring<date-time>optionalEnd time (ISO 8601)
pageablequeryPageablerequired

Responses

  • 200Telemetry data retrieved successfullyApiResponse
  • 404Hub not found or access deniedApiResponsePageHubTelemetryResponse

Tenant — Data Pipelines

Audience: Supplier 콘솔

telemetry 변환·외부 전달 규칙 정의 (예: 윈도 평균 → S3, MQTT 등).

get/tenant/data-pipelines

Parameters

No parameters

Responses

  • 200OKApiResponseListPipelineConfigResponse
post/tenant/data-pipelines

Parameters

No parameters

Request body

application/jsonCreatePipelineRequestrequired

Responses

  • 201CreatedApiResponsePipelineConfigResponse
get/tenant/data-pipelines/{pipelineUuid}

Parameters

NameInTypeDescription
pipelineUuidpathstring<uuid>required

Responses

  • 200OKApiResponsePipelineConfigResponse
put/tenant/data-pipelines/{pipelineUuid}

Parameters

NameInTypeDescription
pipelineUuidpathstring<uuid>required

Request body

application/jsonUpdatePipelineRequestrequired

Responses

  • 200OKApiResponsePipelineConfigResponse
delete/tenant/data-pipelines/{pipelineUuid}

Parameters

NameInTypeDescription
pipelineUuidpathstring<uuid>required

Responses

  • 204No Content
get/tenant/data-pipelines/{pipelineUuid}/deliveries

Parameters

NameInTypeDescription
pipelineUuidpathstring<uuid>required
pagequeryinteger<int32>optional
limitqueryinteger<int32>optional

Responses

  • 200OKApiResponseListMapStringObject
get/tenant/data-pipelines/{pipelineUuid}/dlq

Parameters

NameInTypeDescription
pipelineUuidpathstring<uuid>required
pagequeryinteger<int32>optional
sizequeryinteger<int32>optional

Responses

  • 200OKApiResponseListDlqMessageResponse
post/tenant/data-pipelines/{pipelineUuid}/dlq/{dlqId}/retry

Parameters

NameInTypeDescription
pipelineUuidpathstring<uuid>required
dlqIdpathinteger<int64>required

Responses

  • 200OKApiResponseVoid
post/tenant/data-pipelines/{pipelineUuid}/test-run

Parameters

NameInTypeDescription
pipelineUuidpathstring<uuid>required

Request body

application/jsonPipelineTestRequestrequired

Responses

  • 200OKApiResponsePipelineTestResult
post/tenant/data-pipelines/transpile

Parameters

No parameters

Request body

application/jsonJsonNoderequired

Responses

  • 200OKApiResponseObject

Tenant — 기타

Audience: Supplier 콘솔 / BFF

위에 따로 분류되지 않은 /tenant 경로. agent-policies, notification-settings 등.

get/tenant/action-definitions

List action definitions for current tenant (auto-resolved supplier)

Parameters

NameInTypeDescription
supplierUuidquerystring<uuid>optional

Responses

  • 200OKApiResponseListActionDefinitionResponse
post/tenant/action-definitions

Create action definition

Create a new protocol action definition

Parameters

No parameters

Request body

application/jsonActionDefinitionCreateRequestrequired

Responses

  • 201CreatedApiResponseActionDefinitionResponse
get/tenant/action-definitions/{actionId}

Get action definition

Get a single action definition by ID

Parameters

NameInTypeDescription
actionIdpathstringrequired

Responses

  • 200OKApiResponseActionDefinitionResponse
delete/tenant/action-definitions/{actionId}

Delete action definition

Delete an action definition

Parameters

NameInTypeDescription
actionIdpathstringrequired

Responses

  • 200OKApiResponseVoid
patch/tenant/action-definitions/{actionId}

Update action definition

Update an existing action definition

Parameters

NameInTypeDescription
actionIdpathstringrequired

Request body

application/jsonActionDefinitionUpdateRequestrequired

Responses

  • 200OKApiResponseActionDefinitionResponse
get/tenant/agent-releases

List agent releases (optionally filter by channel + active)

Parameters

NameInTypeDescription
channelquerystringoptional
activeOnlyquerybooleanoptional
pagequeryinteger<int32>optional
sizequeryinteger<int32>optional

Responses

  • 200OKApiResponseListAgentReleaseResponse
get/tenant/agent-releases/{releaseUuid}

Parameters

NameInTypeDescription
releaseUuidpathstring<uuid>required

Responses

  • 200OKApiResponseAgentReleaseResponse
get/tenant/agent-update-policies

List agent update policies belonging to current tenant

Parameters

NameInTypeDescription
pagequeryinteger<int32>optional
sizequeryinteger<int32>optional

Responses

  • 200OKApiResponseListAgentUpdatePolicyResponse
put/tenant/agent-update-policies

Upsert UNIT/HUB scoped policy (tenant_uuid auto-set on UNIT scope)

Parameters

No parameters

Request body

application/jsonCreateAgentUpdatePolicyRequestrequired

Responses

  • 200OKApiResponseAgentUpdatePolicyResponse
get/tenant/agent-update-policies/{policyUuid}

Parameters

NameInTypeDescription
policyUuidpathstring<uuid>required

Responses

  • 200OKApiResponseAgentUpdatePolicyResponse
delete/tenant/agent-update-policies/{policyUuid}

Parameters

NameInTypeDescription
policyUuidpathstring<uuid>required

Responses

  • 204No Content
get/tenant/api-keys

List API keys

List all active API keys. Key hashes are never exposed.

Parameters

No parameters

Responses

  • 200OKApiResponseListApiKeyListResponse
post/tenant/api-keys

Generate new API key

Creates a new API key. The raw key is returned ONCE and cannot be retrieved again.

Parameters

No parameters

Request body

application/jsonApiKeyCreateRequestrequired

Responses

  • 201CreatedApiResponseApiKeyCreateResponse
put/tenant/api-keys/{apiKeyId}

Update API key

Update name, scopes, or rate limit of an existing API key.

Parameters

NameInTypeDescription
apiKeyIdpathinteger<int64>required

Request body

application/jsonApiKeyUpdateRequestrequired

Responses

  • 200OKApiResponseApiKeyListResponse
delete/tenant/api-keys/{apiKeyId}

Revoke API key

Deactivates an API key. The key can no longer be used for authentication.

Parameters

NameInTypeDescription
apiKeyIdpathinteger<int64>required

Responses

  • 200OKApiResponseVoid
get/tenant/apps

Parameters

NameInTypeDescription
pagequeryinteger<int32>optional
sizequeryinteger<int32>optional

Responses

  • 200OKApiResponseListAppResponse
post/tenant/apps

Parameters

No parameters

Request body

application/jsonAppCreateRequestrequired

Responses

  • 201CreatedApiResponseAppResponse
get/tenant/apps/{appUuid}

Parameters

NameInTypeDescription
appUuidpathstring<uuid>required

Responses

  • 200OKApiResponseAppResponse
get/tenant/apps/{appUuid}/releases

Parameters

NameInTypeDescription
appUuidpathstring<uuid>required
pagequeryinteger<int32>optional
sizequeryinteger<int32>optional

Responses

  • 200OKApiResponseListAppReleaseResponse
post/tenant/apps/{appUuid}/releases

Parameters

NameInTypeDescription
appUuidpathstring<uuid>required

Request body

application/jsonAppReleaseCreateRequestrequired

Responses

  • 201CreatedApiResponseAppReleaseResponse
get/tenant/audit-logs

Get tenant audit logs

Retrieve tenant-level audit logs with pagination

Parameters

NameInTypeDescription
pagequeryinteger<int32>optional
sizequeryinteger<int32>optional

Responses

  • 200OKPageAuditLogResponse
get/tenant/billing/balance

Get billing balance

sdx-web pass-through. Returns currentCreditCents, activeSubscription, lastInvoice.

Parameters

No parameters

Responses

  • 200OKApiResponseMapStringObject
get/tenant/billing/charge-settings

[DEPRECATED] auto-charge settings — sdx-web으로 이동

Parameters

No parameters

Responses

  • 200OKApiResponseMapStringString
put/tenant/billing/charge-settings

[DEPRECATED] auto-charge settings — sdx-web으로 이동

Parameters

No parameters

Responses

  • 200OKApiResponseMapStringString
get/tenant/billing/entitlement

Get current entitlement

sdx-web 구독 기반 entitlement (tier, limits, validUntil)

Parameters

NameInTypeDescription
tenantUuidquerystring<uuid>optionalUnit UUID (생략 시 현재 컨텍스트 사용)

Responses

  • 200OKApiResponseEntitlementResponse
get/tenant/billing/transactions

Get billing transactions

sdx-web pass-through. Cursor pagination by createdAt desc.

Parameters

NameInTypeDescription
cursorquerystringoptionalISO-8601 datetime; 생략 시 최신부터
limitqueryinteger<int32>optional1-100, default 50

Responses

  • 200OKApiResponseMapStringObject
get/tenant/ble-query/deliveries

Get BLE deliveries

Retrieve paginated list of BLE deliveries filtered by unit scope and optional criteria

Parameters

NameInTypeDescription
fromquerystring<date-time>optionalStart time (ISO 8601)
toquerystring<date-time>optionalEnd time (ISO 8601)
statusquerystringoptionalFilter by delivery status
pageablequeryPageablerequired

Responses

  • 200BLE deliveries retrieved successfullyApiResponse
get/tenant/ble-query/events

Get BLE events

Retrieve paginated list of BLE events filtered by unit scope and optional criteria. Raw base64 data is excluded from list view.

Parameters

NameInTypeDescription
fromquerystring<date-time>optionalStart time (ISO 8601)
toquerystring<date-time>optionalEnd time (ISO 8601)
hubUuidquerystring<uuid>optionalFilter by hub UUID
deviceInstanceIdqueryinteger<int64>optionalFilter by device instance ID
processingStatusquerystringoptionalFilter by processing status
deliveryStatusquerystringoptionalFilter by delivery status
pageablequeryPageablerequired

Responses

  • 200BLE events retrieved successfullyApiResponse
  • 403Insufficient permissionsApiResponsePageBleEventResponse
get/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

NameInTypeDescription
bleEventIdpathinteger<int64>requiredBLE event ID
includeRawquerybooleanoptionalInclude raw base64 data

Responses

  • 200BLE event detail retrieved successfullyApiResponse
  • 404Event not found or access deniedApiResponseBleEventDetailResponse
get/tenant/ble-query/events/{bleEventId}/runs

Get BLE event processing runs

Retrieve all processing runs and their actions for a specific BLE event

Parameters

NameInTypeDescription
bleEventIdpathinteger<int64>requiredBLE event ID

Responses

  • 200Processing runs retrieved successfullyApiResponse
  • 404Event not found or access deniedApiResponseListBleProcessingRunResponse
get/tenant/ble/events

Parameters

NameInTypeDescription
fromquerystring<date-time>optional
toquerystring<date-time>optional
hubUuidquerystring<uuid>optional
deviceInstanceIdqueryinteger<int64>optional
processingStatusquerystringoptional
pagequeryinteger<int32>optional
sizequeryinteger<int32>optional

Responses

  • 200OKApiResponseListBleEventResponse
get/tenant/ble/events/{bleEventId}

Parameters

NameInTypeDescription
bleEventIdpathinteger<int64>required

Responses

  • 200OKApiResponseBleEventResponse
get/tenant/ble/events/{bleEventId}/runs

Parameters

NameInTypeDescription
bleEventIdpathinteger<int64>required

Responses

  • 200OKApiResponseListBleProcessingRunResponse
get/tenant/ble/route

Parameters

No parameters

Responses

  • 200OKApiResponseBleRouteConfigResponse
put/tenant/ble/route

Parameters

No parameters

Request body

application/jsonBleRouteConfigRequestrequired

Responses

  • 200OKApiResponseBleRouteConfigResponse
get/tenant/consent-records

List consent records

List all consent records for the current tenant (or pinned supplier)

Parameters

NameInTypeDescription
supplierUuidquerystring<uuid>optionalSupplier UUID (defaults to current tenant)

Responses

  • 200OKApiResponseListConsentRecordResponse
get/tenant/dashboard/summary

Dashboard 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

NameInTypeDescription
windowMinutesqueryinteger<int32>optional

Responses

  • 200OKApiResponseDashboardSummary
get/tenant/device-catalog

List device catalog entries (Device models)

Parameters

NameInTypeDescription
pagequeryinteger<int32>optional
sizequeryinteger<int32>optional

Responses

  • 200OKApiResponseListDeviceCatalogResponse
post/tenant/device-catalog

Create device catalog entry (deviceUuid auto-issued)

Parameters

No parameters

Request body

application/jsonCreateDeviceRequestrequired

Responses

  • 200OKApiResponseDeviceCatalogResponse
get/tenant/device-catalog/{deviceUuid}

Get device catalog entry detail

Parameters

NameInTypeDescription
deviceUuidpathstring<uuid>required

Responses

  • 200OKApiResponseDeviceCatalogResponse
delete/tenant/device-catalog/{deviceUuid}

Delete device catalog entry (hard delete)

Parameters

NameInTypeDescription
deviceUuidpathstring<uuid>required

Responses

  • 200OK
patch/tenant/device-catalog/{deviceUuid}

Update device catalog entry

Parameters

NameInTypeDescription
deviceUuidpathstring<uuid>required

Request body

application/jsonUpdateDeviceRequestrequired

Responses

  • 200OKApiResponseDeviceCatalogResponse
get/tenant/device-catalog/{deviceUuid}/identifiers

List identifier hints registered under a device

Parameters

NameInTypeDescription
deviceUuidpathstring<uuid>required

Responses

  • 200OKApiResponseListDeviceMatchIdentifierResponse
post/tenant/device-catalog/{deviceUuid}/identifiers

Add an identifier hint

Parameters

NameInTypeDescription
deviceUuidpathstring<uuid>required

Request body

application/jsonCreateDeviceMatchIdentifierRequestrequired

Responses

  • 200OKApiResponseDeviceMatchIdentifierResponse
delete/tenant/device-catalog/{deviceUuid}/identifiers/{id}

Remove an identifier

Parameters

NameInTypeDescription
deviceUuidpathstring<uuid>required
idpathinteger<int64>required

Responses

  • 200OK
patch/tenant/device-catalog/{deviceUuid}/identifiers/{id}

Update label/notes on an identifier

Parameters

NameInTypeDescription
deviceUuidpathstring<uuid>required
idpathinteger<int64>required

Request body

application/jsonUpdateDeviceMatchIdentifierRequestrequired

Responses

  • 200OKApiResponseDeviceMatchIdentifierResponse
get/tenant/device-protocols

List device protocols (optionally filter by deviceUuid)

Parameters

NameInTypeDescription
deviceUuidquerystring<uuid>optional
pagequeryinteger<int32>optional
sizequeryinteger<int32>optional

Responses

  • 200OKApiResponseListDeviceProtocolResponse
post/tenant/device-protocols

Create device protocol entry

Parameters

No parameters

Request body

application/jsonCreateDeviceProtocolRequestrequired

Responses

  • 200OKApiResponseDeviceProtocolResponse
get/tenant/device-protocols/{deviceProtocolId}

Get device protocol detail

Parameters

NameInTypeDescription
deviceProtocolIdpathinteger<int64>required

Responses

  • 200OKApiResponseDeviceProtocolResponse
delete/tenant/device-protocols/{deviceProtocolId}

Delete device protocol entry

Parameters

NameInTypeDescription
deviceProtocolIdpathinteger<int64>required

Responses

  • 200OK
patch/tenant/device-protocols/{deviceProtocolId}

Update device protocol entry

Parameters

NameInTypeDescription
deviceProtocolIdpathinteger<int64>required

Request body

application/jsonUpdateDeviceProtocolRequestrequired

Responses

  • 200OKApiResponseDeviceProtocolResponse
get/tenant/device-protocols/devices/{deviceUuid}

Get device catalog header (Device entity)

Parameters

NameInTypeDescription
deviceUuidpathstring<uuid>required

Responses

  • 200OKApiResponseDeviceCatalogResponse
get/tenant/device-ui-schemas

List device UI schemas (optionally filter by deviceUuid)

Parameters

NameInTypeDescription
deviceUuidquerystring<uuid>optional
pagequeryinteger<int32>optional
sizequeryinteger<int32>optional

Responses

  • 200OKApiResponseListDeviceUiResponse
post/tenant/device-ui-schemas

Create device UI schema

Parameters

No parameters

Request body

application/jsonCreateDeviceUiRequestrequired

Responses

  • 200OKApiResponseDeviceUiResponse
get/tenant/device-ui-schemas/{deviceUiId}

Get device UI schema detail

Parameters

NameInTypeDescription
deviceUiIdpathinteger<int64>required

Responses

  • 200OKApiResponseDeviceUiResponse
delete/tenant/device-ui-schemas/{deviceUiId}

Delete device UI schema

Parameters

NameInTypeDescription
deviceUiIdpathinteger<int64>required

Responses

  • 200OK
patch/tenant/device-ui-schemas/{deviceUiId}

Update device UI schema

Parameters

NameInTypeDescription
deviceUiIdpathinteger<int64>required

Request body

application/jsonUpdateDeviceUiRequestrequired

Responses

  • 200OKApiResponseDeviceUiResponse
get/tenant/device-versions

List device versions (optionally filter by deviceUuid)

Parameters

NameInTypeDescription
deviceUuidquerystring<uuid>optional
pagequeryinteger<int32>optional
sizequeryinteger<int32>optional

Responses

  • 200OKApiResponseListDeviceVersionResponse
post/tenant/device-versions

Create device version entry

Parameters

No parameters

Request body

application/jsonCreateDeviceVersionRequestrequired

Responses

  • 200OKApiResponseDeviceVersionResponse
get/tenant/device-versions/{deviceVersionUuid}

Get device version detail

Parameters

NameInTypeDescription
deviceVersionUuidpathstring<uuid>required

Responses

  • 200OKApiResponseDeviceVersionResponse
delete/tenant/device-versions/{deviceVersionUuid}

Delete device version entry

Parameters

NameInTypeDescription
deviceVersionUuidpathstring<uuid>required

Responses

  • 200OK
patch/tenant/device-versions/{deviceVersionUuid}

Update device version entry

Parameters

NameInTypeDescription
deviceVersionUuidpathstring<uuid>required

Request body

application/jsonUpdateDeviceVersionRequestrequired

Responses

  • 200OKApiResponseDeviceVersionResponse
get/tenant/downloads/asset-url

Resolve a GH presigned S3 URL for a single asset (5-min TTL)

Parameters

NameInTypeDescription
categoryquerystringrequired
assetIdqueryinteger<int64>required

Responses

  • 200OKApiResponseAssetUrl
get/tenant/downloads/manifest

Latest release + filtered assets for installer / hub-os / hub-agent

Parameters

No parameters

Responses

  • 200OKApiResponseDownloadManifest
get/tenant/external-endpoints

현재 tenant 의 외부 엔드포인트 목록

Parameters

No parameters

Responses

  • 200OKApiResponseListMapStringObject
post/tenant/external-endpoints

외부 엔드포인트 등록

baseUrl host 로 domain 추출 + verify_token 발급. 등록 시점엔 domain_verified=false.

Parameters

No parameters

Request body

application/jsonExternalEndpointRequestrequired

Responses

  • 200OKApiResponseMapStringObject
get/tenant/external-endpoints/{id}

외부 엔드포인트 단건 조회

Parameters

NameInTypeDescription
idpathstring<uuid>required

Responses

  • 200OKApiResponseMapStringObject
put/tenant/external-endpoints/{id}

외부 엔드포인트 수정

baseUrl 이 바뀌면 domain 재계산 + domain_verified 리셋(재인증 필요). authConfig 비면 기존 ciphertext 유지.

Parameters

NameInTypeDescription
idpathstring<uuid>required

Request body

application/jsonExternalEndpointRequestrequired

Responses

  • 200OKApiResponseMapStringObject
delete/tenant/external-endpoints/{id}

외부 엔드포인트 삭제

Parameters

NameInTypeDescription
idpathstring<uuid>required

Responses

  • 200OKApiResponseMapStringString
post/tenant/external-endpoints/{id}/verify

도메인 소유 검증 실행

설정된 verify_method 로 DNS TXT / well-known 을 조회해 verify_token 게시 여부 확인. 성공 시 domain_verified=true.

Parameters

NameInTypeDescription
idpathstring<uuid>required

Responses

  • 200OKApiResponseMapStringObject
get/tenant/manuals

List device manuals (optionally filter by deviceUuid)

Parameters

NameInTypeDescription
deviceUuidquerystring<uuid>optional
pagequeryinteger<int32>optional
sizequeryinteger<int32>optional

Responses

  • 200OKApiResponseListDeviceManualResponse
post/tenant/manuals

Create device manual

Parameters

No parameters

Request body

application/jsonCreateDeviceManualRequestrequired

Responses

  • 200OKApiResponseDeviceManualResponse
get/tenant/manuals/{deviceManualId}

Get device manual detail

Parameters

NameInTypeDescription
deviceManualIdpathinteger<int64>required

Responses

  • 200OKApiResponseDeviceManualResponse
delete/tenant/manuals/{deviceManualId}

Delete device manual

Parameters

NameInTypeDescription
deviceManualIdpathinteger<int64>required

Responses

  • 200OK
patch/tenant/manuals/{deviceManualId}

Update device manual

Parameters

NameInTypeDescription
deviceManualIdpathinteger<int64>required

Request body

application/jsonUpdateDeviceManualRequestrequired

Responses

  • 200OKApiResponseDeviceManualResponse
get/tenant/notification-settings

List notification settings for current user within tenant context

Parameters

No parameters

Responses

  • 200OKApiResponseListNotificationSettingResponse
put/tenant/notification-settings

Upsert a single notification setting (by type+channel)

Parameters

No parameters

Request body

application/jsonUpsertNotificationSettingRequestrequired

Responses

  • 200OKApiResponseNotificationSettingResponse
post/tenant/notification-settings/bulk

Bulk upsert notification settings

Parameters

No parameters

Request body

application/jsonUpsertNotificationSettingRequestrequired

Responses

  • 200OKApiResponseListNotificationSettingResponse
get/tenant/personas

List active members + pending / historical invitations

Parameters

No parameters

Responses

  • 200OKApiResponseTenantPersonasResponse
delete/tenant/personas/{personaUuid}

Revoke a persona's access to this tenant

Parameters

NameInTypeDescription
personaUuidpathstring<uuid>required

Responses

  • 200OK
patch/tenant/personas/{personaUuid}

Change role of a tenant persona

Parameters

NameInTypeDescription
personaUuidpathstring<uuid>required

Request body

application/jsonUpdatePersonaRoleRequestrequired

Responses

  • 200OKApiResponseTenantMemberResponse
delete/tenant/personas/invitations/{invitationId}

Mark an invitation REVOKED (unlike a member revoke, this is idempotent)

Parameters

NameInTypeDescription
invitationIdpathinteger<int64>required

Responses

  • 200OK
post/tenant/personas/invitations/{invitationId}/resend

Rotate token + resend invitation email

Parameters

NameInTypeDescription
invitationIdpathinteger<int64>required

Responses

  • 200OKApiResponseTenantInvitationResponse
post/tenant/personas/invite

Invite by email (creates PENDING invitation) or grant by personaUuid

Parameters

No parameters

Request body

application/jsonPersonaInviteRequestrequired

Responses

  • 200OKApiResponseInviteResponse
get/tenant/simulator/presets

Parameters

No parameters

Responses

  • 200OKApiResponseListSimulationPreset
post/tenant/simulator/run

Parameters

No parameters

Request body

application/jsonSimulationRequestrequired

Responses

  • 200OKApiResponseSimulationResult
post/tenant/simulator/stream

Parameters

No parameters

Request body

application/jsonStreamSimulationRequestrequired

Responses

  • 200OKApiResponseListSimulationResult
get/tenant/stream/ble/events

Stream 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

NameInTypeDescription
Authorizationheaderstringrequired
Last-Event-IDheaderstringoptionalLast event timestamp (ISO-8601)

Responses

  • 200SSE stream established
  • 403Insufficient permissionsSseEmitter
get/tenant/stream/hubs/{hubUuid}/jobs

Stream 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

NameInTypeDescription
Authorizationheaderstringrequired
hubUuidpathstring<uuid>requiredHub UUID
Last-Event-IDheaderstringoptionalLast event timestamp (ISO-8601)

Responses

  • 200SSE stream established
  • 403Insufficient permissionsSseEmitter
  • 404Hub not found or persona doesn't have accessSseEmitter
get/tenant/stream/hubs/{hubUuid}/logs

Stream 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

NameInTypeDescription
Authorizationheaderstringrequired
hubUuidpathstring<uuid>requiredHub UUID
Last-Event-IDheaderstringoptionalLast event timestamp (ISO-8601)

Responses

  • 200SSE stream established
  • 403Insufficient permissionsSseEmitter
  • 404Hub not found or persona doesn't have accessSseEmitter
get/tenant/supplier-oauth-config

현재 tenant의 OAuth config 조회 (없으면 404)

secret 값은 응답에 노출되지 않음. registrationSharedSecretSet 플래그로 존재 여부만.

Parameters

No parameters

Responses

  • 200OKApiResponseMapStringObject
put/tenant/supplier-oauth-config

UPSERT — 즉시 등록 또는 (require-approval=true일 때) 승인 큐 적재

client_secret + registration_shared_secret은 plaintext로 받아 즉시 AES-GCM 암호화 저장. 응답에 secret 미노출.

Parameters

No parameters

Request body

application/jsonSupplierOauthConfigRequestrequired

Responses

  • 200OKApiResponseMapStringObject
delete/tenant/supplier-oauth-config

현재 tenant의 OAuth config 삭제

Parameters

No parameters

Responses

  • 200OKApiResponseMapStringString
get/tenant/tenants

List my accessible tenants

Parameters

No parameters

Responses

  • 200OKApiResponseListTenantResponse
post/tenant/tenants

Create a new tenant under my current sdx unit

Parameters

No parameters

Request body

application/jsonCreateTenantRequestrequired

Responses

  • 200OKApiResponseTenantResponse
delete/tenant/tenants/{tenantUuid}

Soft-delete tenant (OWNER only)

Parameters

NameInTypeDescription
tenantUuidpathstring<uuid>required

Responses

  • 200OK
patch/tenant/tenants/{tenantUuid}

Update tenant name (ADMIN+)

Parameters

NameInTypeDescription
tenantUuidpathstring<uuid>required

Request body

application/jsonCreateTenantRequestrequired

Responses

  • 200OKApiResponseTenantResponse
get/tenant/tenants/{tenantUuid}/members

List tenant members (any access)

Parameters

NameInTypeDescription
tenantUuidpathstring<uuid>required

Responses

  • 200OKApiResponseListTenantMemberResponse
post/tenant/tenants/{tenantUuid}/members

Grant access (ADMIN+; OWNER for OWNER role)

Parameters

NameInTypeDescription
tenantUuidpathstring<uuid>required

Request body

application/jsonGrantAccessRequestrequired

Responses

  • 200OKApiResponseTenantMemberResponse
delete/tenant/tenants/{tenantUuid}/members/{targetPersonaUuid}

Revoke access (ADMIN+; last OWNER protected)

Parameters

NameInTypeDescription
tenantUuidpathstring<uuid>required
targetPersonaUuidpathstring<uuid>required

Responses

  • 200OK
post/tenant/tenants/{tenantUuid}/transfer

Initiate ownership transfer (current OWNER)

Parameters

NameInTypeDescription
tenantUuidpathstring<uuid>required

Request body

application/jsonInitiateTransferRequestrequired

Responses

  • 200OKApiResponseTenantTransferRequestResponse
get/tenant/test

Tenant test endpoint

Test endpoint that requires JWT authentication

Parameters

No parameters

Responses

  • 200OKApiResponseMapStringObject
post/tenant/transfer-requests/{requestUuid}/accept

이전 요청 승인 (받는 unit의 멤버 persona)

Parameters

NameInTypeDescription
requestUuidpathstring<uuid>required

Responses

  • 200OKApiResponseTenantTransferRequestResponse
post/tenant/transfer-requests/{requestUuid}/cancel

이전 요청 취소 (요청자 본인 또는 OWNER)

Parameters

NameInTypeDescription
requestUuidpathstring<uuid>required

Responses

  • 200OKApiResponseTenantTransferRequestResponse
post/tenant/transfer-requests/{requestUuid}/reject

이전 요청 거부 (받는 unit의 멤버 persona)

Parameters

NameInTypeDescription
requestUuidpathstring<uuid>required

Responses

  • 200OKApiResponseTenantTransferRequestResponse
get/tenant/transfer-requests/incoming

받은 PENDING 이전 요청 (현재 persona의 unit으로 향한)

Parameters

No parameters

Responses

  • 200OKApiResponseListTenantTransferRequestResponse
get/tenant/transfer-requests/outgoing

보낸 PENDING 이전 요청 (현재 persona의 unit에서 발신)

Parameters

No parameters

Responses

  • 200OKApiResponseListTenantTransferRequestResponse
get/tenant/units/{tenantUuid}/test

Test unit boundary enforcement

Test endpoint that verifies persona belongs to specified unit

Parameters

NameInTypeDescription
tenantUuidpathstring<uuid>requiredUnit UUID to access

Responses

  • 200OKApiResponseMapStringObject

App API — End-user

Audience: 모바일 앱 (Flutter)

end-user 모바일 앱이 쓰는 endpoint. sdx-oauth JWT로 인증.

get/app/action-definitions

List action definitions for a supplier

Returns all action definitions for the specified supplier

Parameters

NameInTypeDescription
supplierUuidquerystring<uuid>required

Responses

  • 200OKApiResponseListActionDefinitionResponse
get/app/action-definitions/{actionId}

Get action definition

Get a single action definition by ID

Parameters

NameInTypeDescription
actionIdpathstringrequired

Responses

  • 200OKApiResponseActionDefinitionResponse
get/app/bundle-catalog

List PUBLISHED bundles

현재 사용자 기준 link 상태 함께 반환

Parameters

No parameters

Responses

  • 200OKApiResponseListBundleCatalogResponse
get/app/bundle-catalog/{bundleUuid}

Get bundle catalog detail

Parameters

NameInTypeDescription
bundleUuidpathstring<uuid>required

Responses

  • 200OKApiResponseBundleCatalogResponse
get/app/consent

List consent records

List all consent records for current user

Parameters

No parameters

Responses

  • 200OKApiResponseListConsentRecordResponse
post/app/consent

Grant consent

Grant consent for a supplier and consent type

Parameters

No parameters

Request body

application/jsonConsentGrantRequestrequired

Responses

  • 200OKApiResponseConsentRecordResponse
delete/app/consent/{consentId}

Withdraw consent

Withdraw a previously granted consent

Parameters

NameInTypeDescription
consentIdpathinteger<int64>requiredConsent record ID

Responses

  • 200OKApiResponseVoid
get/app/consent/{consentId}/retention

Get retention settings

Get retention settings for a consent record

Parameters

NameInTypeDescription
consentIdpathinteger<int64>requiredConsent record ID

Responses

  • 200OKApiResponseRetentionSettingResponse
put/app/consent/{consentId}/retention

Update retention period

Update retention period for a consent record

Parameters

NameInTypeDescription
consentIdpathinteger<int64>requiredConsent record ID

Request body

application/jsonRetentionUpdateRequestrequired

Responses

  • 200OKApiResponseRetentionSettingResponse
post/app/device-ui/invoke

device_ui invoke 실행

hubUuid 소유권 검증 → supplier resolve → 인증된 external_endpoint 로 프록시 호출.

Parameters

No parameters

Request body

application/jsonDeviceUiInvokeRequestrequired

Responses

  • 200OKApiResponseMapStringObject
get/app/device-ui/setup/{hubUuid}

허브-device 의 device_ui setup 스키마 조회

device_ui 미저작 시 404 → 앱은 legacy step-runner 로 fallback.

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>required

Responses

  • 200OKApiResponseMapStringObject
get/app/devices

List user's devices

List all devices from units where user has a persona

Parameters

No parameters

Responses

  • 200OKApiResponseListDeviceSummaryResponse
get/app/devices/{deviceInstanceId}

Get device detail

Get device detail by instance ID

Parameters

NameInTypeDescription
deviceInstanceIdpathinteger<int64>requiredDevice instance ID

Responses

  • 200OKApiResponseDeviceDetailResponse
post/app/devices/{deviceInstanceId}/commands

Send control command

Send a control command to a device

Parameters

NameInTypeDescription
deviceInstanceIdpathinteger<int64>requiredDevice instance ID

Request body

application/jsonDeviceCommandRequestrequired

Responses

  • 200OKApiResponseDeviceCommandResponse
get/app/devices/{deviceInstanceId}/sensor-data

Get sensor data

Get sensor data for a device with optional time range

Parameters

NameInTypeDescription
deviceInstanceIdpathinteger<int64>requiredDevice instance ID
fromquerystringoptionalStart time (ISO 8601)
toquerystringoptionalEnd time (ISO 8601)

Responses

  • 200OKApiResponseObject
get/app/hubs

List hubs

List all hubs owned by current user

Parameters

No parameters

Responses

  • 200OKApiResponseListAppHubSummaryResponse
get/app/hubs/{hubUuid}

Get hub detail

Get hub detail by UUID

Parameters

NameInTypeDescription
hubUuidpathstring<uuid>requiredHub UUID

Responses

  • 200OKApiResponseAppHubDetailResponse
get/app/notifications

List notifications

List notifications for current user (paginated)

Parameters

NameInTypeDescription
pagequeryinteger<int32>optionalPage number (1-based)
sizequeryinteger<int32>optionalPage size

Responses

  • 200OKApiResponseListNotificationResponse
put/app/notifications/{notificationId}/read

Mark as read

Mark a notification as read

Parameters

NameInTypeDescription
notificationIdpathinteger<int64>requiredNotification ID

Responses

  • 200OKApiResponseVoid
get/app/profile

Get profile

Get current user profile

Parameters

No parameters

Responses

  • 200OKApiResponseUserProfileResponse
put/app/profile

Update profile

Update current user profile (nickname, etc.)

Parameters

No parameters

Request body

application/jsonUserProfileUpdateRequestrequired

Responses

  • 200OKApiResponseUserProfileResponse
post/app/supplier-link/authorize

Begin OAuth authorize flow

state + PKCE INSERT 후 외부 브라우저로 열 authorize URL 반환. 사용자 계정 연결은 hub와 무관 — hub/device 단위 권한은 별도 모델로 처리.

Parameters

No parameters

Request body

application/jsonAuthorizeRequestrequired

Responses

  • 200OKApiResponseMapStringString
get/app/supplier-links

List my active supplier links

supplier_uuid 쿼리 시 그 supplier의 active link만 (n:1로 여러 개 가능)

Parameters

NameInTypeDescription
supplierUuidquerystring<uuid>optional

Responses

  • 200OKApiResponseListSupplierLinkResponse
delete/app/supplier-links/{id}

Revoke supplier link

supplier revoke_url 호출 + 로컬 soft-revoke

Parameters

NameInTypeDescription
idpathinteger<int64>required

Responses

  • 200OKApiResponseMapStringString
get/app/supplier-links/{id}/access-token

Get fresh access token

만료 5분 이내면 자동 refresh 후 반환. step.configJson.external_submit_url 호출 직전에 사용.

Parameters

NameInTypeDescription
idpathinteger<int64>required

Responses

  • 200OKApiResponseMapStringObject
get/app/supplier-oauth-configs/{supplierUuid}

Get consent preview (no secret)

supplier가 required로 등록되어 있으면 consent_text/scope/userinfo_url 반환

Parameters

NameInTypeDescription
supplierUuidpathstring<uuid>required

Responses

  • 200OKApiResponseMapStringObject

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