본문으로 건너뛰기

17. 엔드포인트 전체 목록

PlantPulse API의 REST 엔드포인트와 클라이언트 메서드 매핑입니다. 베이스 경로는 /api/v5 입니다.

인증: APIClient_V5.connect() 호출 시 자동으로 api_key가 발급·관리되므로, 사용자가 직접 호출해야 하는 인증 엔드포인트는 없습니다.

17.1 System​

HTTP엔드포인트메서드
GET/api/v5/pingclient.system().ping()

17.2 ID 발급​

메서드경로설명
POST/api/v5/domain-ids도메인 ID 를 미리 받습니다(클라이언트 메서드 없음) — ID 규칙

17.3 Site (6개)​

HTTP엔드포인트메서드
POST/api/v5/siteclient.site().create(req)
PUT/api/v5/site/{id}client.site().update(id, req)
DELETE/api/v5/site/{id}client.site().delete(id)
GET/api/v5/site/{id}client.site().get(id)
GET/api/v5/siteclient.site().list()
GET/api/v5/site/{id}/existsclient.site().exists(id)

17.4 OPC (10개)​

HTTP엔드포인트메서드
POST/api/v5/opcclient.opc().create(req)
PUT/api/v5/opc/{id}client.opc().update(id, req)
DELETE/api/v5/opc/{id}client.opc().delete(id)
GET/api/v5/opc/{id}client.opc().get(id)
GET/api/v5/opcclient.opc().list()
GET/api/v5/opc?site_id={id}client.opc().listBySite(siteId)
GET/api/v5/opc?opc_source_type={type}client.opc().listByType(sourceType)
GET/api/v5/opc/{id}/existsclient.opc().exists(id)
GET/api/v5/opc/countclient.opc().count()
GET/api/v5/opc/count?site_id={id}client.opc().countBySite(siteId)

17.5 Asset (6개)​

HTTP엔드포인트메서드
POST/api/v5/assetclient.asset().create(req)
PUT/api/v5/asset/{id}client.asset().update(id, req)
DELETE/api/v5/asset/{id}client.asset().delete(id)
GET/api/v5/asset/{id}client.asset().get(id)
GET/api/v5/assetclient.asset().list()
GET/api/v5/asset/{id}/existsclient.asset().exists(id)

관계 온톨로지 (4개)​

계층(부모–자식)과 별개의 방향성 관계입니다. 「이 설비가 멈추면 어디까지 영향을 받나」를 묻는 데 씁니다.

HTTP엔드포인트하는 일
POST/api/v5/assets/{asset_id}/relations관계 등록 — 본문 {site_id, to_entity_type, to_entity_id, relation_type, description?} → 201
GET/api/v5/assets/{asset_id}/relations?type=직접 관계 목록(들어오는 것 · 나가는 것)
DELETE/api/v5/relations/{relation_id}관계 삭제 → 204
GET/api/v5/ontology/graph/{entity_id}?relation=&direction=DOWN&depth=2그래프 탐색(BFS)
관계뜻방향
FEEDS공정 흐름자산 → 자산
DEPENDS_ON유틸리티 의존(전력 · 에어 · 냉각)자산 → 자산
PRODUCES생산 산출자산 → 제품
  • direction 은 UP · DOWN · BOTH(기본 DOWN), depth 는 1~5(기본 2)입니다.
  • 자기 자신을 가리키는 관계는 저장되지 않고, 같은 조합의 관계는 한 번만 등록됩니다.
  • 등록 · 삭제는 변경이라 ADMIN/API 역할과 감사 기록이 적용됩니다.
  • 같은 탐색을 AI 어시스턴트가 부르는 것이 MCP 의 trace_asset_relations 입니다.

QR 라벨​

HTTP엔드포인트하는 일
GET/api/v5/asset/qr/{token}라벨 토큰의 설비. 토큰이 아니거나 재발급된 옛 토큰이면 404

라벨에 담긴 주소는 GET /api/v5/asset/{id} 응답의 qr_payload 입니다. 이 호출은 토큰을 만들지 않으므로, 토큰이 아직 없거나 PP_UI_CONSOLE_URL 이 없으면 "" 입니다. 로그인 없는 공개 페이지는 V5 가 아니라 /qr/{token} 입니다 — QR 라벨과 공개 페이지.

17.6 Tag (23개)​

CRUD + 목록​

HTTP엔드포인트메서드
POST/api/v5/tagclient.tag().create(req)
PUT/api/v5/tag/{id}client.tag().update(id, req)
DELETE/api/v5/tag/{id}client.tag().delete(id)
GET/api/v5/tag/{id}client.tag().get(id)
GET/api/v5/tag/{id}/existsclient.tag().exists(id)
GET/api/v5/tagclient.tag().list()
GET/api/v5/tag?site_id={id}client.tag().listBySite(siteId)
GET/api/v5/tag?opc_id={id}client.tag().listByOpc(opcId)
GET/api/v5/tag?asset_id={id}client.tag().listByAsset(assetId)
GET/api/v5/tag/countclient.tag().count()
GET/api/v5/tag/count?site_id={id}client.tag().countBySite(siteId)
GET/api/v5/tag/count?opc_id={id}client.tag().countByOpc(opcId)
GET/api/v5/tag/count?asset_id={id}client.tag().countByAsset(assetId)

PATCH (10개 — 탭별 부분 수정)​

HTTP엔드포인트메서드
PATCH/api/v5/tag/{id}/basicpatchBasic(id, req)
PATCH/api/v5/tag/{id}/alarmpatchAlarm(id, req)
PATCH/api/v5/tag/{id}/metadatapatchMetadata(id, req)
PATCH/api/v5/tag/{id}/calculationpatchCalculation(id, req)
PATCH/api/v5/tag/{id}/samplingpatchSampling(id, req)
PATCH/api/v5/tag/{id}/aggregationpatchAggregation(id, req)
PATCH/api/v5/tag/{id}/aipatchAi(id, req)
PATCH/api/v5/tag/{id}/publishpatchPublish(id, req)
PATCH/api/v5/tag/{id}/attributepatchAttribute(id, req)
PATCH/api/v5/tag/{id}/linkpatchLink(id, req)

17.7 Alarm (3개)​

HTTP엔드포인트메서드
GET/api/v5/alarm/{seq}client.alarm().get(seq)
GET/api/v5/alarm?limit={n}client.alarm().list(limit)
GET/api/v5/alarm/performance?scope_type=&scope_id=알람 시스템 성능(클라이언트 메서드 없음)

/alarm/performance — scope_type 은 SITE · AREA · LINE, scope_id 는 사이트 ID 또는 에셋 ID 이고 둘 다 필수입니다. 기간은 days(1~31, 기본 7) 또는 from + to(둘이 함께, 31일까지)이고, from/to 가 days 보다 우선합니다. 알린 발생만 세고, 숨김 · 억제 중에 열린 것은 suppression 에 따로 나옵니다. 범위 · 기간이 틀리면 400 입니다. 같은 값을 MCP get_alarm_performance 가 돌려줍니다.

17.8 Order (11개)​

HTTP엔드포인트메서드
POST/api/v5/orderclient.order().create(req)
PUT/api/v5/order/{id}client.order().update(id, req)
DELETE/api/v5/order/{id}client.order().delete(id)
GET/api/v5/order/{id}client.order().get(id)
GET/api/v5/orderclient.order().list()
GET/api/v5/order/{id}/existsclient.order().exists(id)
POST/api/v5/order/{id}/startclient.order().start(id)
POST/api/v5/order/{id}/endclient.order().end(id)
POST/api/v5/order/{id}/pauseclient.order().pause(id)
POST/api/v5/order/{id}/resumeclient.order().resume(id)
POST/api/v5/order/{id}/abortclient.order().abort(id)

17.8.1 정비 오더​

설비 정비의 호출 · 수리 · 예방정비 작업입니다(ISA-95 maintenance work order). 생산 워크오더(/order)와 다른 객체이고, 클라이언트 메서드 없이 REST 로 부릅니다.

HTTP엔드포인트하는 일
GET/api/v5/maintenance-orders목록. 거르기 scope+scope_id(asset · line · area · site) · status_code · open · maintenance_kind_code · assignee_employee_id · failure_mode_code · maintainable_item_code · from/to · period_of · overdue · external_system · external_id. 쪽 page · limit(기본 50, 최대 500) · sort · order
GET/api/v5/asset/{asset_id}/maintenance-orders설비 하나의 목록
POST/api/v5/asset/{asset_id}/maintenance-orders정비 호출 추가
GET/api/v5/maintenance-orders/{maintenance_order_id}한 건
PATCH/api/v5/maintenance-orders/{maintenance_order_id}내용 고치기
POST/api/v5/maintenance-orders/{maintenance_order_id}/transition상태 옮기기(받음 · 시작 · 완료 · 취소). 본문 status_code · version, 취소는 cancel_reason_code
GET/api/v5/maintenance-orders/{maintenance_order_id}/revisions판 이력
GET/api/v5/maintenance-orders/summary범위 · 기간의 정비 요약
GET/api/v5/maintenance-orders/options넣을 수 있는 종류 · 상태 · 코드
GET/api/v5/maintenance-orders/board범위의 정비 현황판
GET/api/v5/maintenance-orders/changesCMMS 동기화용 변경 피드(커서)
GET · PUT/api/v5/maintenance-orders/by-external/{system}/{external_id}외부(CMMS) 번호로 찾기 · 멱등 쓰기
GET · PUT/api/v5/maintenance-orders/by-external?system=&external_id=같은 일. 번호에 / 가 있을 때
POST · GET/api/v5/maintenance-orders/{maintenance_order_id}/attachments사진 올리기 · 목록
GET/api/v5/maintenance-orders/{maintenance_order_id}/attachments/{maintenance_attachment_seq}/content사진 내용

정비 오더 칸​

칸 이름은 응답 · 요청 본문 · 목록 질의가 같습니다.

칸타입뜻
maintenance_order_id문자MAINTENANCE_ORDER_000001. 옛 행은 숫자 문자열("12")
maintenance_kind_code문자정비 종류(CORRECTIVE …)
status_code문자상태(REQUESTED · ACCEPTED · IN_PROGRESS · COMPLETED · CANCELLED)
cancel_reason_code문자취소 사유
failure_record_seq숫자연결된 고장 기록
maintenance_plan_id · maintenance_plan_name문자예방정비 계획. MAINTENANCE_PLAN_000001 또는 옛 숫자 문자열
failure_mode_code · failure_mechanism_code · failure_cause_code · maintainable_item_code문자ISO 14224 코드. 표시 이름은 _code 대신 _name
cause_code문자원인 사전 코드(알람과 같은 사전)
checklist_results[].maintenance_attachment_seq숫자점검 항목의 사진

CMMS 웹훅​

설정 키 PP_MAINTENANCE_WEBHOOK_URL 에 주소를 넣으면, 정비 오더의 상태가 바뀔 때마다 JSON 을 한 번 POST 합니다(호출 · 받음 · 시작 · 완료 · 취소). 내용만 고칠 때는 보내지 않고, 비워 두면 꺼집니다. 실패하면 진단 diagnostic.maintenance.webhook_failed 가 켜지고 다음 성공에 꺼지며, 다시 보내지는 않습니다.

키값
text설치 언어의 한 줄 문장
eventmaintenance.requested · maintenance.accepted · maintenance.in_progress · maintenance.completed · maintenance.cancelled
maintenance_order_id정비 오더 ID(문자)
asset_id · asset_name설비
maintenance_kind_code · status_code종류 · 상태
description · failure_mode_code설명 · 고장 모드
requested_by · accepted_by · assignee_employee_id사람
cancel_reason_code취소 사유
external_system · external_id · owner외부 번호와 주인
anomaly_found · checklist_results점검 이상 여부와 답(item_id · checked · value · maintenance_attachment_seq · out_of_range)
maintenance_plan_id · plan_due_at예방정비 계획
at · version그 상태가 된 시각(epoch ms) · 판

값을 모르는 키도 빠지지 않고 null 로 실립니다.

17.9 Calendar (6개)​

HTTP엔드포인트메서드
POST/api/v5/calendarclient.calendar().create(req)
PUT/api/v5/calendar/{id}client.calendar().update(id, req)
DELETE/api/v5/calendar/{id}client.calendar().delete(id)
GET/api/v5/calendar/{id}client.calendar().get(id)
GET/api/v5/calendarclient.calendar().list()
GET/api/v5/calendar/search?from={iso}&to={iso}client.calendar().search(from, to)

17.10 Customer (8개)​

HTTP엔드포인트메서드
POST/api/v5/customerclient.customer().create(req)
PUT/api/v5/customer/{id}client.customer().update(id, req)
DELETE/api/v5/customer/{id}client.customer().delete(id)
GET/api/v5/customer/{id}client.customer().get(id)
GET/api/v5/customerclient.customer().list()
GET/api/v5/customer?site_id={id}client.customer().listBySite(siteId)
GET/api/v5/customer/{id}/existsclient.customer().exists(id)
GET/api/v5/customer/countclient.customer().count()

17.11 Employee (7개)​

HTTP엔드포인트메서드
POST/api/v5/employeeclient.employee().create(req)
PUT/api/v5/employee/{id}client.employee().update(id, req)
DELETE/api/v5/employee/{id}client.employee().delete(id)
GET/api/v5/employee/{id}client.employee().get(id)
GET/api/v5/employeeclient.employee().list()
GET/api/v5/employee/{id}/existsclient.employee().exists(id)
GET/api/v5/employee/countclient.employee().count()

17.12 Product (7개)​

HTTP엔드포인트메서드
POST/api/v5/productclient.product().create(req)
PUT/api/v5/product/{id}client.product().update(id, req)
DELETE/api/v5/product/{id}client.product().delete(id)
GET/api/v5/product/{id}client.product().get(id)
GET/api/v5/productclient.product().list()
GET/api/v5/product/{id}/existsclient.product().exists(id)
GET/api/v5/product/countclient.product().count()

17.13 Path (2개)​

HTTP엔드포인트메서드
GET/api/v5/path/asset/{id}client.path().getByAsset(assetId)
GET/api/v5/path/tag/{id}client.path().getByTag(tagId)

17.14 Flow (3개)​

HTTP엔드포인트메서드
GET/api/v5/flow/{id}client.flow().get(flowId)
GET/api/v5/flowclient.flow().list()
GET/api/v5/flow/{id}/nodeclient.flow().listNodes(flowId)

17.15 통계​

아래 수는 plantpulse-api 클라이언트 메서드가 있는 경로만 셉니다.

도메인엔드포인트 수
System1
Site6
OPC10
Asset6
Tag23 (CRUD 5 + 목록 7 + 카운트 4 + PATCH 10)
Alarm2
Order11 (CRUD 6 + 라이프사이클 5)
Calendar6
Customer8
Employee7
Product7
Path2
Flow3
합계92 (+인증 1)

17.16 HTTP 메서드 분포​

HTTP개수용도
GET56조회 (단건/목록/존재 여부/카운트)
POST16등록 + Order 라이프사이클
PUT10전체 수정
PATCH10Tag 탭별 부분 수정
DELETE10삭제

17.17 목록을 끝까지 읽기 — 커서​

GET /api/v5/site · /product · /customer · /employee 는 커서로 이어 읽습니다. 쪽 크기 limit 은 기본 100, 상한 1000 이고(더 크면 1000 으로 줄입니다), 첫 호출에는 cursor 를 넣지 않습니다.

curl -H "X-API-Key: $TOKEN" "$BASE/api/v5/site?limit=500"
curl -H "X-API-Key: $TOKEN" "$BASE/api/v5/site?limit=500&cursor=<next_cursor>"
{
"data": [ ],
"meta": {
"status": "OK",
"pagination": { "limit": 500, "total": 1234 },
"cursor": { "next_cursor": "…", "has_more": true, "limit": 500 }
},
"errors": null
}
  • data 는 이 쪽의 행 배열입니다.
  • meta.pagination.total 은 같은 필터의 전체 건수입니다.
  • meta.cursor.has_more 가 false 가 될 때까지 next_cursor 를 그대로 다음 호출의 cursor 로 넘깁니다.
  • 커서는 그 목록과 필터에 묶입니다. 다른 목록의 커서나 site_id 를 바꾼 호출에 넣으면 422 E1002 입니다.
  • 고객 · 제품 · 직원은 ID 순서, 사이트는 이름 · ID 순서입니다. 읽는 동안 행이 수정돼도 빠지지 않습니다.

Java 클라이언트의 list() 는 cursor 를 넘기지 않으므로 첫 쪽만 돌려줍니다. 끝까지 읽으려면 REST 로 부르세요.

17.18 바뀌었을 때만 받기 — /tag/export 의 ETag​

GET /api/v5/tag/export 는 사이트 · 연결 · 플랜트 전체의 태그를 한 번에 냅니다. site_id · opc_id 로 거르고, include=config 면 행마다 설정이 실립니다(태그마다 설정을 부르지 않아도 됩니다). 응답은 data = {tags: [...], count: N} 입니다.

응답의 ETag 를 보관했다가 다음 읽기에 If-None-Match 로 돌려줍니다.

curl -i -H "X-API-Key: $TOKEN" "$BASE/api/v5/tag/export?site_id=SITE_000001&include=config"
# ETag: "<SHA-256>"

curl -i -H "X-API-Key: $TOKEN" -H 'If-None-Match: "<SHA-256>"' \
"$BASE/api/v5/tag/export?site_id=SITE_000001&include=config"
# 304 Not Modified — 본문 없음
  • ETag 는 내보내는 data 의 SHA-256 입니다. 이 응답에 보이는 것이 바뀌면 — 태그나 설정의 변경, 태그 추가 · 삭제, 연결이 다른 사이트로 옮겨 간 경우 — 누가 바꿨든 값이 달라집니다. 바뀌지 않았으면 재기동해도, 다른 노드에서 읽어도 같습니다.
  • 프록시가 붙인 약한 형식 W/"…" 과 * 도 받습니다.
  • 304 는 전송과 파싱을 아낄 뿐 읽기를 아끼지 않습니다. 서버는 값을 계산하려고 행을 전부 읽습니다. 데이터가 필요한 주기보다 자주 부르지 마세요.

KOPENS All rights reserved.