CSMS 연동 문서
CSMS Integration
외부 API(B2B) 연동 가이드
파트너 시스템용 · v1
본 문서는 파트너/CPO 시스템이 server-to-server로 CSMS 데이터를 조회하는 외부 API의 연동 규격을 정의합니다. 모든 API는 조회 전용(GET)이며, 발급받은 API 키에 매핑된 CPO 소유 자원으로 응답이 자동 스코프됩니다.

개요

항목값
Base URLhttps://external-api.oasis-arca.com
프로토콜HTTPS (TLS 1.2 이상)
형식요청 쿼리 파라미터 / 응답 application/json (UTF-8)
메서드전 엔드포인트 GET (조회 전용)
시각 표현ISO-8601. lastHeartbeat 등 instant 필드는 UTC(Z) 표기, zone 없는 local date-time 은 KST(Asia/Seoul) 기준

빠른 시작

curl "https://external-api.oasis-arca.com/api/v1/ext/stations" \
  -H "x-api-key: <발급받은 API 키>"

응답의 null 값 필드는 생략될 수 있습니다. 파서는 필드 부재를 허용하도록 구현하십시오.

목록 API(stations · chargers · transactions)는 공통으로 page(0-base, 기본 0) / size(기본 50, 최대 200) 페이지네이션을 지원하며, 응답에 items와 함께 page/size/totalElements/totalPages 메타가 포함됩니다.

인증 (API 키)

모든 요청에 발급받은 API 키를 x-api-key 헤더로 전달합니다. 키는 CPO(사업자) 단위로 CSMS 운영팀이 발급합니다.

x-api-key: <발급받은 API 키>
API 키는 서버 측에만 보관하십시오. 모바일 앱·웹 프론트엔드 등 클라이언트 코드에 포함하면 안 됩니다. 키가 유출된 경우 운영팀에 즉시 재발급을 요청하십시오.
  • 키 누락·무효 → 403 (게이트웨이 단)
  • 운영팀에서 차단된 키 → 403 (백엔드 단)
  • 다른 CPO 소유 자원은 목록에서 제외되고, 상세 조회 시 404로 응답합니다.

사용량 제한

항목기본 플랜
초당 요청 수10 rps (burst 20)
일일 쿼터100,000 요청/일
초과 시429 Too Many Requests — 재시도 시 지수 백오프 권장

플랜 상향이 필요하면 운영팀에 문의하십시오.

오류 응답

오류는 발생 지점에 따라 두 가지 형태로 반환됩니다.

게이트웨이 단 (키 검증·사용량 제한)

{ "message": "Forbidden" }

백엔드 단 (파라미터·대상 검증)

{ "error": "조회 기간은 최대 92일까지 가능합니다." }
상태 코드발생 지점의미
400백엔드잘못된 파라미터 (기간 92일 초과, size 범위 초과 등)
403게이트웨이API 키 누락 · 무효
403백엔드차단(비활성)된 키
404백엔드대상 없음 (다른 CPO 소유 자원 포함)
429게이트웨이사용량 제한 초과
5xx-서버 오류 — 지수 백오프 후 재시도

변경 정책

  • URL은 /api/v1/ext/로 고정됩니다.
  • 하위 호환을 깨지 않는 변경(응답 필드 추가, enum 값 추가 등)은 예고 없이 이루어질 수 있습니다. 파서는 알 수 없는 필드·enum 값을 무시하도록 구현하십시오.
  • 호환이 깨지는 변경이 필요한 경우 별도 공지 후 진행합니다.

충전소 목록

GET/api/v1/ext/stations

키에 매핑된 CPO가 소유한 충전소 목록을 이름 오름차순으로 반환합니다 (페이지네이션).

쿼리 파라미터

파라미터타입기본값설명
pagenumber00부터 시작하는 페이지 번호
sizenumber50페이지 크기 (최대 200)

요청 예시

curl "https://external-api.oasis-arca.com/api/v1/ext/stations?page=0&size=50" -H "x-api-key: <API 키>"

응답 200

{
  "items": [
    {
      "id": 103,
      "sid": "100001",
      "name": "OO빌딩 충전소",
      "address": "경기 과천시 과천대로7나길 60",
      "detailAddress": "C동 505호",
      "postalCode": "13840",
      "latitude": 37.432265,
      "longitude": 126.994741,
      "createdAt": "2026-06-15T05:16:07.760511",
      "chargerCount": 4,
      "chargerCountsByPower": [
        { "maxPowerKw": 7, "count": 3 },
        { "maxPowerKw": 100, "count": 1 }
      ]
    }
  ],
  "page": 0,
  "size": 50,
  "totalElements": 1,
  "totalPages": 1
}
필드타입설명
idnumber충전소 ID
sidstring?환경부 충전소 ID(SID) — CPO별 6자리
namestring충전소명
addressstring주소
detailAddressstring?상세 주소
postalCodestring?우편번호
latitude / longitudenumber위도 / 경도 (WGS84)
createdAtstring등록 시각 (ISO-8601, KST(Asia/Seoul) 기준 local date-time)
chargerCountnumber충전기 수 (v1.15.0) — 충전소 상세 chargers 개수와 같은 값(삭제된 충전기 제외). 충전기가 없으면 0
chargerCountsByPowerarraykW별 충전기 수 (v1.15.0) — { maxPowerKw, count } 목록. kW 오름차순, 모델 미지정 충전기 묶음(maxPowerKw 생략)은 맨 뒤. count 합 = chargerCount. 충전기가 없으면 빈 배열
chargerCountsByPower[].maxPowerKwnumber?충전기 용량(kW) — 충전기 응답의 maxPowerKw와 같은 값(충전기 모델의 최대 출력)

충전소 상세 (소속 충전기 포함)

GET/api/v1/ext/stations/{stationId}

충전소 단건을 조회합니다. 목록 항목의 필드에 더해 해당 충전소 소속 충전기 목록(chargers, ID 오름차순)이 포함되며, 각 충전기의 스키마는 충전기 목록·상태의 항목과 동일합니다(커넥터 상태 포함). 존재하지 않거나 다른 CPO 소유인 경우 404.

요청 예시

curl "https://external-api.oasis-arca.com/api/v1/ext/stations/103" -H "x-api-key: <API 키>"

응답 200

{
  "id": 103,
  "sid": "100001",
  "name": "OO빌딩 충전소",
  "address": "경기 과천시 과천대로7나길 60",
  "detailAddress": "C동 505호",
  "postalCode": "13840",
  "latitude": 37.432265,
  "longitude": 126.994741,
  "createdAt": "2026-06-15T05:16:07.760511",
  "chargerCount": 1,
  "chargerCountsByPower": [{ "maxPowerKw": 7, "count": 1 }],
  "chargers": [
    {
      "id": 3004,
      "stationId": 103,
      "identity": "CP-0001",
      "maxPowerKw": 7,
      "manufacturer": "바이온에버",
      "modelName": "BSS007K-V11-J",
      "online": true,
      "status": "Available",
      "operative": true,
      "ocppVersion": "1.6",
      "currentFirmwareVersion": "A00.00.01",
      "lastHeartbeat": "2026-07-10T06:00:53.706155Z",
      "kepcoContract": {
        "voltageType": "LOW",
        "planOption": "OPTION_1",
        "demandChargeEnabled": false,
        "contractDemandKw": 150.00
      },
      "connectors": [
        { "connectorId": 1, "status": "Charging", "operative": true, "connectorType": "CCS1", "lastStatusTime": "2026-07-10T06:02:55.678207Z" }
      ]
    }
  ]
}

충전기 목록·상태

GET/api/v1/ext/chargers

CPO 소유 충전기 목록을 ID 오름차순으로 반환합니다 (페이지네이션). 각 충전기에 커넥터별 실시간 상태가 포함됩니다.

쿼리 파라미터

파라미터타입기본값설명
pagenumber00부터 시작하는 페이지 번호
sizenumber50페이지 크기 (최대 200)

요청 예시

curl "https://external-api.oasis-arca.com/api/v1/ext/chargers?page=0&size=50" -H "x-api-key: <API 키>"

응답 200

{
  "items": [
    {
      "id": 3004,
      "stationId": 103,
      "identity": "CP-0001",
      "maxPowerKw": 7,
      "manufacturer": "바이온에버",
      "modelName": "BSS007K-V11-J",
      "online": true,
      "status": "Available",
      "operative": true,
      "ocppVersion": "1.6",
      "currentFirmwareVersion": "A00.00.01",
      "lastHeartbeat": "2026-07-10T06:00:53.706155Z",
      "kepcoContract": {
        "voltageType": "LOW",
        "planOption": "OPTION_1",
        "demandChargeEnabled": false,
        "contractDemandKw": 150.00
      },
      "connectors": [
        { "connectorId": 1, "status": "Charging", "operative": true, "connectorType": "CCS1", "lastStatusTime": "2026-07-10T06:02:55.678207Z" }
      ]
    }
  ],
  "page": 0,
  "size": 50,
  "totalElements": 1,
  "totalPages": 1
}
필드타입설명
idnumber충전기 ID
stationIdnumber?소속 충전소 ID
identitystring?OCPP 충전기 식별자
maxPowerKwnumber?충전기 용량(kW) — 충전기 모델의 최대 출력. 모델 미지정 충전기는 null
manufacturerstring?제조사 — 충전기 모델 기준. 모델 미지정 충전기는 null
modelNamestring?모델명 — 충전기 모델 기준. 모델 미지정 충전기는 null
onlineboolean실시간 접속 여부
statusstring충전기 가용 상태(OCPP 실측) — Available / Unavailable / Faulted
operativeboolean운영자 사용중지 여부 — false면 CSMS 운영자가 중지한 충전기. status(실측)와 별개 축이며, 커넥터에도 connectors[].operative로 동일하게 제공
ocppVersionstring예: 1.6
currentFirmwareVersionstring?현재 펌웨어 버전
lastHeartbeatstring?마지막 heartbeat 시각 (UTC)
kepcoContract.voltageTypestring한전 요금표 전압 구분 — LOW(저압) / HIGH(고압)
kepcoContract.planOptionstring한전 요금표 선택 구분(선택Ⅰ~Ⅳ) — OPTION_1 ~ OPTION_4
kepcoContract.demandChargeEnabledboolean기본요금(수요전력 요금) 반영 여부
kepcoContract.contractDemandKwnumber?한전 계약전력(kW)
connectors[].statusstringOCPP 1.6 ChargePointStatus — Available, Preparing, Charging, SuspendedEVSE, SuspendedEV, Finishing, Reserved, Unavailable, Faulted
connectors[].connectorIdnumber충전기 내 커넥터 번호 (1-base)
connectors[].connectorTypestring?물리 커넥터 타입 (CCS1/Type1/Type2/CHAdeMO/NACS) — 운영자 입력값, 미입력 시 없음
connectors[].lastStatusTimestring?마지막 상태 변경 시각 (UTC)

충전기 상세

GET/api/v1/ext/chargers/{chargerId}

충전기 단건(커넥터 상태 포함)을 조회합니다. 응답 스키마는 목록의 항목과 동일합니다. 존재하지 않거나 다른 CPO 소유인 경우 404.

요청 예시

curl "https://external-api.oasis-arca.com/api/v1/ext/chargers/3004" -H "x-api-key: <API 키>"

충전기 판매 단가 설정 (v1.9.0)

GET/api/v1/ext/chargers/{chargerId}/pricing

충전기에 CSMS 에 설정된 판매 단가를 반환합니다. 충전기에 질의하지 않는 설정값이라 충전기가 오프라인이어도 응답합니다. 기준일(date, KST, 기본 오늘)에 유효한 단가 세트가 할당돼 있으면 시간대별 회원/비회원 단가를, 없으면 CPO 기본 단가를 적용 대상으로 표시합니다. 존재하지 않거나 다른 CPO 소유인 충전기는 404.

쿼리 파라미터

파라미터타입기본값설명
dateYYYY-MM-DD오늘(KST)기준일 — 이 날짜에 유효한 단가 세트 할당을 고릅니다

요청 예시

curl "https://external-api.oasis-arca.com/api/v1/ext/chargers/3004/pricing?date=2026-09-18" -H "x-api-key: <API 키>"

응답 200

{
  "chargerId": 3004,
  "chargerIdentity": "CP-0001",
  "asOf": "2026-09-18",
  "currency": "KRW",
  "priceUnit": "KRW/kWh",
  "source": "ASSIGNED_PRICE_SET",
  "priceSet": {
    "id": 3,
    "name": "주간 세트",
    "validFrom": "2026-09-01",
    "validTo": "2026-12-31",
    "timeRanges": [
      { "start": "00:00:00", "end": "12:00:00", "memberPrice": 150.00, "nonMemberPrice": 180.00 },
      { "start": "12:00:00", "end": "00:00:00", "memberPrice": 220.00, "nonMemberPrice": 260.00 }
    ]
  },
  "defaultUnitPrice": { "member": 200.00, "nonMember": 240.00 },
  "rounding": { "mode": "HALF_UP", "unit": 1 }
}
필드타입설명
asOfstring기준일(KST)
sourcestringASSIGNED_PRICE_SET(기준일에 유효한 단가 세트 있음) / DEFAULT_UNIT_PRICE(없음 → CPO 기본 단가)
priceSetobject?{ id, name, validFrom, validTo, timeRanges[] } — 기준일에 유효한 단가 세트와 이 충전기에 대한 할당 기간(양끝 포함). DEFAULT_UNIT_PRICE 면 없음
priceSet.timeRanges[]array{ start, end, memberPrice, nonMemberPrice } — KST 벽시계 HH:mm:ss, start 포함·end 미포함, 시작 시각 오름차순. end 가 00:00:00 이면 자정(24:00)까지 — 마지막 구간의 표준 끝. start > end 면 자정을 넘는 구간
defaultUnitPriceobject{ member, nonMember } — CPO 기본 단가(KRW/kWh). 세트 미할당 시, 그리고 세트 시간대에 포함되지 않는 시각에 적용
roundingobject{ mode, unit } — 거래 최종 금액 라운딩 규칙(HALF_UP 기본 1원 반올림 / CEILING / FLOOR). 단가·구간 계산에는 미적용
요일·공휴일·계절 차등은 없습니다 — 날짜별 차등은 세트 할당 기간으로만 표현됩니다. 로밍카드 거래에는 이 단가가 아니라 협약 로밍사 소매가가 적용됩니다(거래의 feeBreakdown.roaming). 단가 세트는 운영자가 수정할 수 있고 변경 이력이 없으므로, 과거 거래에 적용된 단가는 이 API 가 아니라 거래의 feeBreakdown으로 확인하십시오.

충전기 충전 프로필 — CSMS 설정값 (v1.10.0)

GET/api/v1/ext/chargers/{chargerId}/charging-profiles

CSMS 가 이 충전기에 SetChargingProfile 로 보낸 충전 프로필(전력 제한값·시간대별 스케줄)의 현재 유효한 목록입니다. 충전기에 질의하지 않는 CSMS 전송 기록이며, 충전기가 실제로 수락했는지는 항목별 commandStatus로 판단하십시오(기준선으로 쓸 때는 ACCEPTED만). 존재하지 않거나 다른 CPO 소유인 충전기는 404.

요청 예시

curl "https://external-api.oasis-arca.com/api/v1/ext/chargers/3004/charging-profiles" -H "x-api-key: <API 키>"

응답 200

{
  "chargerId": 3004,
  "chargerIdentity": "CP-0001",
  "ocppVersion": "1.6",
  "asOf": "2026-09-18T03:00:00Z",
  "profiles": [
    {
      "profileId": 1587249301,
      "connectorId": 0,
      "purpose": "ChargePointMaxProfile",
      "purposeOcpp": "ChargePointMaxProfile",
      "kind": "Recurring",
      "recurrency": "Daily",
      "stackLevel": 0,
      "validFrom": "2026-09-18T00:00:00Z",
      "validTo": "2026-12-31T15:00:00Z",
      "schedule": {
        "duration": 86400,
        "startSchedule": "2026-09-18T00:00:00Z",
        "chargingRateUnit": "W",
        "periods": [
          { "startPeriod": 0,     "limit": 7000, "numberPhases": 1 },
          { "startPeriod": 32400, "limit": 3500, "numberPhases": 1 },
          { "startPeriod": 64800, "limit": 7000, "numberPhases": 1 }
        ]
      },
      "source": "PRESET",
      "sentAt": "2026-09-18T00:00:05Z",
      "commandStatus": "ACCEPTED",
      "commandRespondedAt": "2026-09-18T00:00:06Z"
    }
  ]
}
필드타입설명
ocppVersionstring충전기 OCPP 버전 (1.6 / 2.0.1)
asOfstring조회 시각 — 만료(validTo 경과)·교체·해제 판정 기준
profiles[].profileIdnumber충전기로 보낸 chargingProfileId
profiles[].connectorIdnumber0 = 충전기 전체 (2.0.1 은 evseId)
profiles[].purposestringOCPP 1.6 명칭 — ChargePointMaxProfile(상한) / TxDefaultProfile(거래 기본) / TxProfile(특정 거래)
profiles[].purposeOcppstring충전기 프로토콜로 실제 전송된 명칭 — 2.0.1 은 ChargingStationMaxProfile
profiles[].kindstringAbsolute / Recurring / Relative. Recurring 이면 recurrency(Daily/Weekly)
profiles[].stackLevelnumber같은 목적 안에서 높은 값이 우선
profiles[].validFrom / validTostring?유효기간(UTC). validTo 가 지난 프로필은 목록에서 제외
profiles[].scheduleobject{ duration, startSchedule, chargingRateUnit(W|A), minChargingRate, periods[{ startPeriod, limit, numberPhases }] } — startPeriod 는 스케줄 시작으로부터의 오프셋(초), limit 는 chargingRateUnit 단위
profiles[].sourcestringADMIN(운영자 폼) / PRESET(전력제한 템플릿 적용)
profiles[].sentAtstringCSMS 가 명령을 보낸 시각
profiles[].commandStatusstring충전기 응답 — PENDING / SENT / ACCEPTED / REJECTED / ERROR / EXPIRED / UNKNOWN(명령 로그 없음)
profiles[].commandRespondedAt / commandErrorstring?응답 시각 / 거절·오류 사유
합성 스케줄(GetCompositeSchedule)은 충전기가 계산하는 값이라 CSMS 에 없습니다. 이 목록의 프로필을 OCPP 우선순위 규칙(stackLevel 높은 것 우선, TxProfile → TxDefaultProfile, ChargePointMaxProfile 은 상한)으로 합성하시면 됩니다. 기록 시작(2026-09) 이전에 보낸 프로필은 이력이 없어 나타나지 않으며, 운영자가 다시 보내면 채워집니다. 2.0.1 자동 EV 협상 (ISO 15118) TxProfile 은 거래 단위 일회성이라 기록하지 않습니다.

충전 트랜잭션 내역

GET/api/v1/ext/transactions

충전 트랜잭션 내역을 시작 시각 내림차순으로 반환합니다. 기간은 [from, to) 반개구간으로 필터됩니다.

쿼리 파라미터

파라미터타입기본값설명
fromISO-8601 date-timeto − 30일조회 시작 시각 (예: 2026-06-01T00:00:00Z)
toISO-8601 date-time현재 시각조회 종료 시각 (exclusive)
pagenumber00부터 시작하는 페이지 번호
sizenumber50페이지 크기 (최대 200)
최대 조회 기간은 92일입니다. 초과 시 400이 반환됩니다.

요청 예시

curl "https://external-api.oasis-arca.com/api/v1/ext/transactions?from=2026-06-01T00:00:00Z&to=2026-07-01T00:00:00Z&page=0&size=50" \
  -H "x-api-key: <API 키>"

응답 200

{
  "items": [
    {
      "id": 98765,
      "chargerId": 3004,
      "chargerIdentity": "CP-0001",
      "connectorId": 1,
      "startTime": "2026-07-11T02:10:00Z",
      "stopTime": "2026-07-11T03:05:12Z",
      "consumedWh": 21500,
      "totalFee": 6450.00,
      "assessedFee": 6450.00,
      "authType": "MEMBER_CARD",
      "feeBreakdown": {
        "pricingSource": "ASSIGNED_PRICE_SET",
        "memberType": "MEMBER",
        "exempted": false,
        "energyWh": 21500,
        "currency": "KRW",
        "priceSet": { "id": 3, "name": "주간 세트" },
        "segments": [
          { "from": "2026-07-11T02:10:00Z", "to": "2026-07-11T03:00:00Z", "energyKwh": 19.5455, "unitPrice": 300.00, "fee": 5863.6364 },
          { "from": "2026-07-11T03:00:00Z", "to": "2026-07-11T03:05:12Z", "energyKwh": 1.9545, "unitPrice": 300.00, "fee": 586.3636 }
        ],
        "rounding": { "mode": "HALF_UP", "unit": 1, "rawFee": 6450.0000, "finalFee": 6450.00 }
      },
      "reason": "Remote",
      "metricsExcluded": false
    }
  ],
  "page": 0,
  "size": 50,
  "totalElements": 1,
  "totalPages": 1
}
필드타입설명
idnumber트랜잭션 ID
chargerIdnumber충전기 ID
chargerIdentitystring?OCPP 충전기 식별자
connectorIdnumber충전기 내 커넥터 번호 (1-base)
startTimestring충전 시작 시각 (UTC)
stopTimestring?충전 종료 시각 — 진행 중이면 없음
consumedWhnumber?충전량(Wh) — 끝난 세션은 확정값, 진행 중 세션은 조회 시점까지의 누계(통상 약 60초 주기 갱신). 미터값 미수신 시 없음
totalFeenumber?실제 청구 요금(원) — 에너지 요금만(점유·시간 요금 없음). 미과금카드 거래는 0. 진행 중이면 없음
assessedFeenumber?산정 요금(원) — 미과금 면제와 무관하게 계산된 정상 요금. totalFee = 0 인 거래의 면제 전 금액. 진행 중·산정 실패면 없음
authTypestring?시작 시점 인증 구분 — NON_BILLING(미과금카드) / MEMBER_CARD(회원카드) / ROAMING(로밍카드) / GUEST_PREPAY(비회원 선결제) / PNC / UNREGISTERED. 2026-07-31 이전 거래는 없음
feeBreakdownobject?요금 산정 스냅샷 — 아래 표. 진행 중 거래와 스냅샷 도입(v1.8.0) 이전 종료 거래는 없음
reasonstring?종료 사유 (OCPP StopTransaction reason)
metricsExcludedbooleanCSMS 지표 제외 거래 — 시작 시점에 충전기의 「지표·통계 집계 포함」이 꺼져 있던 거래(접속·기능 테스트 등)면 true. CSMS 대시보드·충전통계에서는 빠지지만 이 목록에는 그대로 실림. 파트너 측 통계에서 뺄지는 이 값으로 판단 (v1.12.0 문서화, 2026-10-14부터 응답에 포함)
page / size / totalElements / totalPagesnumber페이지네이션 메타

feeBreakdown — 요금 산정 스냅샷 (v1.8.0)

거래 종료 시점에 어떤 단가가 어느 시간대 구간에 적용됐는지를 고정한 기록입니다. 단가 세트는 운영자가 수정할 수 있으므로 이 스냅샷이 그 거래에 적용된 단가의 유일한 근거입니다. 도매(정산) 단가와 결제 수단 정보는 담지 않습니다.

필드타입설명
pricingSourcestring단가 출처 — ASSIGNED_PRICE_SET(충전기 할당 단가 세트, 시간대별 회원/비회원 단가) / DEFAULT_UNIT_PRICE(할당 없음 → CPO 기본 단가) / ROAMING_RETAIL(로밍 거래 — 협약 로밍사 소매가)
memberTypestring단가 선택에 쓰인 이용자 구분 — MEMBER / NON_MEMBER(비회원 선결제) / ROAMING
exemptedbooleantrue = 미과금카드 거래. totalFee 는 0, 산정액은 assessedFee
energyWhnumber산정에 쓴 충전량(Wh)
priceSetobject?적용 단가 세트 { id, name } — ASSIGNED_PRICE_SET 일 때만
roamingobject?로밍 소매가 정보 { bid, companyName, chargerKw, bandMinKw, bandMaxKw, unitPrice } — ROAMING_RETAIL 일 때만
segments[]array시간대 구간별 산정 { from, to, energyKwh, unitPrice, fee }. 구간 에너지는 전체 충전량을 구간 시간 비례로 배분한 값(구간별 실측 아님). fee 합 = rounding.rawFee
roundingobject{ mode, unit, rawFee, finalFee } — mode: HALF_UP(기본 1원 반올림) / CEILING(올림) / FLOOR(내림). finalFee 가 곧 assessedFee
totalFee는 에너지 요금만입니다(점유·시간·기본요금 없음). 따라서 totalFee ÷ consumedWh가 곧 실효 단가이며, 같은 충전기에서 값이 갈리는 것은 authType(회원/비회원/로밍)과 시간대 구간 때문입니다. totalFee = 0은 authType = NON_BILLING(feeBreakdown.exempted = true) 또는 충전량 0으로 판별하십시오.

거래별 미터값 시계열

GET/api/v1/ext/transactions/{transactionId}/meter-values

한 트랜잭션에 적재된 미터값(누적 전력량·순시 전력)을 시각 오름차순으로 반환합니다. 충전기 MeterValues 보고 주기(통상 약 60초)로 적재되며, 진행 중인 세션도 조회할 수 있습니다. 보관 중인 과거 거래는 기간 제한 없이 트랜잭션 ID로 소급 조회할 수 있습니다.

쿼리 파라미터

파라미터타입기본값설명
pagenumber00부터 시작하는 페이지 번호
sizenumber50페이지 크기 (최대 200)

요청 예시

curl "https://external-api.oasis-arca.com/api/v1/ext/transactions/98765/meter-values?page=0&size=200" \
  -H "x-api-key: <API 키>"

응답 200

{
  "items": [
    { "timestamp": "2026-08-27T09:23:28Z", "context": "Transaction.Begin", "energyWh": 273, "powerW": null },
    { "timestamp": "2026-08-27T09:24:28Z", "context": "Sample.Periodic",   "energyWh": 294, "powerW": 1260 }
  ],
  "page": 0,
  "size": 200,
  "totalElements": 2,
  "totalPages": 1
}
필드타입설명
timestampstring측정 시각 (UTC)
contextstring?OCPP ReadingContext (Sample.Periodic / Transaction.Begin / Transaction.End 등)
energyWhnumber?누적 충전 전력량(Wh) — 미터 누계값
powerWnumber?순시 전력(W) — Power.Active.Import, 충전기가 보고하지 않으면 없음
다른 CPO 소유 거래를 조회하면 404가 반환됩니다.

출력 등급 분류 기준

GET/api/v1/ext/meta/speed-grades

충전기 출력 등급(완속/중속/급속)의 분류 기준을 반환합니다. 충전기 응답의 maxPowerKw(kW)를 grades 배열 순서대로 상한과 비교해 첫 매칭이 그 충전기의 등급입니다(마지막 등급은 상한 없음). CPO와 무관한 공통 기준이며, CSMS 관리콘솔 대시보드 「출력 분포」와 동일합니다. maxPowerKw가 없는(모델 미지정) 충전기는 미분류로 취급하십시오.

요청 예시

curl "https://external-api.oasis-arca.com/api/v1/ext/meta/speed-grades" \
  -H "x-api-key: <API 키>"

응답 200

{
  "basis": "chargers[].maxPowerKw (kW)",
  "grades": [
    { "grade": "SLOW", "label": "완속", "upperBoundKw": 11, "upperInclusive": true },
    { "grade": "MID",  "label": "중속", "upperBoundKw": 50, "upperInclusive": false },
    { "grade": "FAST", "label": "급속", "upperBoundKw": null, "upperInclusive": null }
  ]
}
필드타입설명
gradestring등급 코드 (SLOW/MID/FAST)
labelstring한글 표기 (완속/중속/급속)
upperBoundKwnumber?이 등급의 상한(kW) — 없으면 상한 없음(최상위 등급)
upperInclusiveboolean?상한 포함 여부 — true: ≤, false: <

한전 요금표 (v1.11.0)

GET/api/v1/ext/meta/kepco-tariffs

한전 EV 충전 요금표(도매원가 단가)를 반환합니다. CPO와 무관한 전역 데이터이며, CSMS 기동 시 표준 요금표가 자동 입력되고 이후 CSMS 운영자가 관리합니다. 충전기 응답의 kepcoContract(voltageType·planOption)로 그 충전기에 적용되는 요금표 행을 고른 뒤, seasons(월 기준 계절)와 timeBands(계절 그룹별 KST 시간대)로 시각별 단가를 적용합니다 — CSMS 내부 원가 계산과 동일한 해석입니다.

요청 예시

curl "https://external-api.oasis-arca.com/api/v1/ext/meta/kepco-tariffs" \
  -H "x-api-key: <API 키>"

응답 200

{
  "currency": "KRW",
  "rateUnit": "KRW/kWh",
  "demandChargeUnit": "KRW/kW/월",
  "seasons": [
    { "season": "SUMMER", "months": [6, 7, 8] },
    { "season": "SPRING_FALL", "months": [3, 4, 5, 9, 10] },
    { "season": "WINTER", "months": [1, 2, 11, 12] }
  ],
  "timeBands": [
    { "seasons": ["SUMMER", "SPRING_FALL"], "ranges": [
      { "start": "08:00:00", "end": "11:00:00", "band": "MID_PEAK" },
      { "start": "11:00:00", "end": "12:00:00", "band": "ON_PEAK" },
      { "start": "12:00:00", "end": "13:00:00", "band": "MID_PEAK" },
      { "start": "13:00:00", "end": "18:00:00", "band": "ON_PEAK" },
      { "start": "18:00:00", "end": "22:00:00", "band": "MID_PEAK" },
      { "start": "22:00:00", "end": "08:00:00", "band": "OFF_PEAK" } ] },
    { "seasons": ["WINTER"], "ranges": [ ... ] }
  ],
  "holidayBand": "OFF_PEAK",
  "saturdayPeakBand": "MID_PEAK",
  "tariffs": [
    { "voltageType": "HIGH", "planOption": "OPTION_2",
      "effectiveFrom": "2026-01-01",
      "demandChargePerKw": 2580.00,
      "rates": {
        "summer":     { "offPeak": 78.20, "midPeak": 113.00, "peak": 198.60 },
        "springFall": { "offPeak": 80.20, "midPeak": 91.00,  "peak": 94.90 },
        "winter":     { "offPeak": 95.20, "midPeak": 105.50, "peak": 172.40 } } },
    { "voltageType": "HIGH", "planOption": "OPTION_4",
      "effectiveFrom": "2026-01-01",
      "demandChargePerKw": 2580.00,
      "rates": {
        "summer":     { "allTime": 137.40 },
        "springFall": { "allTime": 91.00 },
        "winter":     { "allTime": 127.70 } } }
  ]
}
필드타입설명
rateUnitstring전력량 요금 단위 — KRW/kWh
demandChargeUnitstring기본요금 단위 — KRW/kW/월 (계약전력 kW 당 월 요금)
seasons[]array{ season, months[] } — SUMMER / SPRING_FALL / WINTER 와 그 계절에 속하는 월(KST)
timeBands[]array{ seasons[], ranges[] } — 계절 그룹별 시간대 편성. ranges[]는 { start, end, band }(KST 벽시계, start 포함·end 미포함)로 24시간을 빈틈없이 덮습니다. end 가 00:00:00 이면 자정(24:00)까지 — 마지막 구간의 표준 끝. start > end 면 자정을 넘는 구간
holidayBandstring공휴일(CSMS 운영자 등록 기준)에 하루 전체 적용하는 시간대 — 경부하
saturdayPeakBandstring토요일의 최대부하(ON_PEAK) 구간을 대체하는 시간대 — 중간부하
tariffs[]array요금표 행 — 전압 구분·선택 요금 오름차순, 같은 조합은 시행일 내림차순(첫 행이 최신)
tariffs[].effectiveFrom / effectiveTostring / string?시행일·종료일(둘 다 포함). effectiveTo가 없으면 현행
tariffs[].demandChargePerKwnumber기본요금 — 계약전력 kW 당 월 요금(원)
tariffs[].ratesobject{ summer, springFall, winter } — 계절별 { offPeak, midPeak, peak, allTime }(원/kWh). 선택 Ⅰ~Ⅲ 은 시간대 3종, 선택 Ⅳ(OPTION_4)는 시간대 무관 단일 단가 allTime 만 있습니다(없는 항목은 키 생략)
요금표는 한전 공시 요금의 CSMS 입력본입니다 — 계약서 정본이 아니며, 귀사 계약 조건(할인·부가 조항)은 반영돼 있지 않습니다. 실제 청구액 대사에는 한전 고지서를 기준으로 사용하십시오. 충전기별 계약 조건(전압 구분·선택 요금·기본요금 반영 여부·계약전력)은 충전기 응답의 kepcoContract에 있습니다.

충전 부하 예측 (v1.13.0 · 충전소 단위 v1.14.0)

GET/api/v1/ext/load-forecast

키에 매핑된 CPO 의 시간별 충전 부하 예측입니다. CSMS 가 매일 05:50(KST)에 당일 06:00 ~ 다음날 05:00 24시간을 예측합니다(AWS SageMaker, 주 1회 재학습). 기준일(date, KST, 기본 오늘) 00:00~24:00 의 시각을 돌려주며, 같은 시각을 여러 번 예측했으면 가장 최근 생성분만 나옵니다 — 오늘 기준일의 00~05시는 전날 예측입니다. 예측 대상이 아닌 CPO(최근 2주 충전량이 적은 경우)나 예측 적재 전이면 points 가 빈 배열입니다.stationId 를 주면 그 충전소 하나의 예측과 그 충전소 충전기의 계약전력 합을 돌려줍니다(v1.14.0). 키의 CPO 소속이 아니면 404 이고, 주간 재학습의 홀드아웃 오차(WAPE)가 100% 를 넘는 충전소는 기준 미달로 points 가 빕니다.

요청 예시

curl "https://external-api.oasis-arca.com/api/v1/ext/load-forecast?date=2026-10-21" \
  -H "x-api-key: <API 키>"
# 충전소 하나 (v1.14.0)
curl "https://external-api.oasis-arca.com/api/v1/ext/load-forecast?date=2026-10-21&stationId=120" \
  -H "x-api-key: <API 키>"

응답 200

{
  "date": "2026-10-21",
  "stationId": null,
  "contractKw": 217.00,
  "modelVersion": "k3x9q2abcd1e",
  "points": [
    { "timestamp": "2026-10-21T01:00:00Z", "p50Kw": 10.42, "p90Kw": 38.92, "forecastMadeAt": "2026-10-20T20:50:12Z" },
    { "timestamp": "2026-10-21T02:00:00Z", "p50Kw": 9.93, "p90Kw": 43.65, "forecastMadeAt": "2026-10-20T20:50:12Z" }
  ]
}
  • p50Kw — 예측 중앙값: 그 1시간 평균 부하(kW). 1시간 공급 에너지(kWh)와 같은 수입니다.
  • p90Kw — 예측 90% 상단: 실제 부하가 이 값 이하일 것으로 보는 상단. 피크 대비·계약전력 초과 경보에 쓰십시오.
  • contractKw — CSMS 에 등록된 충전기 계약전력 합(kW).
  • 시각은 모두 UTC ISO-8601 입니다(timestamp 는 그 시각부터 1시간).

OpenAPI 스펙

기계가독형 계약 문서(OpenAPI 3.0)를 제공합니다. 클라이언트 코드 생성(openapi-generator 등)에 사용할 수 있습니다.

# 예: TypeScript 클라이언트 생성
npx @openapitools/openapi-generator-cli generate \
  -i https://admin.oasis-arca.com/docs/external-api.openapi.yaml \
  -g typescript-fetch -o ./csms-external-client

문의

API 키 발급·차단, 사용량 플랜, 응답 필드 추가 요청 등은 CSMS 운영팀에 문의하십시오.

문의: axd@bionever.com

CSMS External API(B2B) Integration Guide · v1