메인 콘텐츠로 건너뛰기

Base URL

https://api.lexq.io/api/v1/execution
실행 API의 Base URL(/api/v1/execution)은 관리 API(/api/v1/partners)와 다릅니다. 각 API에 맞는 Base URL을 사용하세요.

인증

관리 API와 동일한 API Key를 사용합니다. 모든 요청에 포함하세요:
x-api-key: YOUR_API_KEY

실행 모드

모드엔드포인트용도
단일 그룹POST /groups/{groupId}일반적인 단건 주문 평가
특정 버전POST /groups/{groupId}/versions/{versionId}A/B 테스트, 롤백 테스트
배치POST /groups/{groupId}/batch장바구니 계산, 상품 목록 혜택 표기
복합POST /composite다중 그룹 동시 평가 (할인 + 쿠폰 + 배송비)

단일 그룹 실행

현재 배포된 버전의 모든 활성 규칙을 평가합니다.
POST /groups/{groupId}

요청

curl -X POST https://api.lexq.io/api/v1/execution/groups/{groupId} \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-12345" \
  -d '{
    "facts": {
      "user_id": "user_abc",
      "payment_amount": 150000,
      "customer_tier": "VIP"
    },
    "context": {
      "channel": "mobile-app"
    }
  }'
필드타입필수설명
factsobject규칙 평가를 위한 입력 변수
contextobject추가 메타데이터 (조건에 사용되지 않으며 액션에 전달)

응답

{
  "result": "SUCCESS",
  "data": {
    "outputVariables": {
      "discount_amount": 15000,
      "discount_applied": true
    },
    "executionTraces": [
      {
        "ruleName": "VIP 10% 할인",
        "ruleId": "...",
        "conditionMatched": true,
        "evaluatedExpression": "payment_amount >= 100000 AND customer_tier == VIP"
      }
    ],
    "decisionTraces": [
      {
        "ruleName": "VIP 10% 할인",
        "ruleId": "...",
        "selected": true,
        "reason": "CONDITION_MATCHED"
      }
    ]
  }
}

멱등성

Idempotency-Key 헤더를 포함하면 중복 실행을 방지합니다. 동일한 키로 이미 처리된 요청이 있으면, 정책을 재실행하지 않고 원래 응답을 반환합니다.

특정 버전 실행

트래픽 라우팅을 우회하여 정책 그룹의 특정 버전을 실행합니다. A/B 테스트 후보 버전 검증이나 롤백 전 이전 버전 테스트에 유용합니다.
POST /groups/{groupId}/versions/{versionId}
요청과 응답 형식은 단일 그룹 실행과 동일합니다. 현재 배포된 버전 대신 지정된 버전을 사용하는 것만 다릅니다.
버전은 ACTIVE (발행됨) 상태여야 합니다. DRAFT 버전은 Engine API로 실행할 수 없습니다 — DRAFT 테스트에는 드라이런을 사용하세요.

배치 실행

여러 팩트 세트를 동일한 정책 그룹에 대해 한 번의 호출로 실행합니다. 일관성을 위해 배치 내 모든 요청이 동일 버전으로 평가됩니다.
POST /groups/{groupId}/batch

요청

curl -X POST https://api.lexq.io/api/v1/execution/groups/{groupId}/batch \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "requests": [
      { "facts": { "user_id": "user_1", "payment_amount": 50000 } },
      { "facts": { "user_id": "user_2", "payment_amount": 150000 } },
      { "facts": { "user_id": "user_3", "payment_amount": 300000 } }
    ],
    "sharedContext": {
      "channel": "batch-job"
    }
  }'
필드타입필수설명
requestsarray평가할 팩트 세트 목록
sharedContextobject모든 요청에 병합되는 공유 컨텍스트

응답

{
  "result": "SUCCESS",
  "data": {
    "results": [
      { "outputVariables": { ... }, "executionTraces": [ ... ], "decisionTraces": [ ... ] },
      { "outputVariables": { ... }, "executionTraces": [ ... ], "decisionTraces": [ ... ] },
      { "outputVariables": { ... }, "executionTraces": [ ... ], "decisionTraces": [ ... ] }
    ],
    "totalProcessingTimeMs": 45
  }
}
결과는 입력 요청과 동일한 순서로 반환됩니다. 각 요청의 context는 sharedContext와 병합됩니다 (개별 요청 컨텍스트가 충돌 시 우선).
배치 실행은 TPS 스로틀링에서 아이템 수와 관계없이 1회 API 호출로 계산됩니다. 단, 과금은 총 아이템 수 기준입니다.

복합 실행

동일한 팩트를 여러 정책 그룹에 대해 한 번의 호출로 평가합니다. 하나의 거래가 여러 정책 검사를 동시에 통과해야 할 때 사용합니다 (예: 상품할인 + 장바구니쿠폰 + 배송비 + 멤버십적립).
POST /composite

요청

curl -X POST https://api.lexq.io/api/v1/execution/composite \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-12345-composite" \
  -d '{
    "targetGroupIds": ["group-discount-id", "group-coupon-id", "group-shipping-id"],
    "facts": {
      "user_id": "user_abc",
      "payment_amount": 250000
    },
    "context": {
      "channel": "checkout"
    }
  }'
필드타입필수설명
targetGroupIdsarray평가할 정책 그룹 ID 목록
factsobject모든 그룹에 공유되는 입력 팩트
contextobject모든 그룹에 공유되는 컨텍스트
응답에는 평가된 모든 그룹의 outputVariables, executionTraces, decisionTraces가 병합되어 포함됩니다. 모든 대상 그룹이 ACTIVE 상태여야 합니다.

필수 팩트 조회

실행 엔드포인트를 호출하기 전에 배포된 버전이 어떤 입력 팩트를 필요로 하는지 확인합니다.
GET /groups/{groupId}/requirements
curl https://api.lexq.io/api/v1/execution/groups/{groupId}/requirements \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Accept-Language: ko"
Accept-Language 헤더로 usedBy 설명의 언어를 제어합니다 (en 또는 ko).

응답

{
  "result": "SUCCESS",
  "data": {
    "groupId": "...",
    "versionId": "...",
    "versionNo": 5,
    "requiredFacts": [
      {
        "key": "payment_amount",
        "type": "NUMBER",
        "displayName": "결제 금액",
        "required": true,
        "usedBy": [
          "조건 [GREATER_THAN] (규칙: VIP 10% 할인)",
          "DISCOUNT 액션 (규칙: VIP 10% 할인)"
        ]
      }
    ],
    "exampleRequest": {
      "facts": { "payment_amount": 50000 },
      "context": { "reqTime": "2025-01-01T00:00:00Z" }
    }
  }
}
첫 연동 전에 이 엔드포인트를 호출하여 필요한 팩트를 확인하세요. exampleRequest를 시작 템플릿으로 복사하고 실제 값을 채워 넣으면 됩니다.

시스템 팩트

모든 테넌트는 계정 생성 시 7개의 시스템 팩트가 자동 등록됩니다. 수동 생성이 필요 없습니다:
타입필수설명
user_idSTRING사용자 식별자
payment_amountNUMBER결제 금액
phone_numberSTRING휴대전화 번호
emailSTRING이메일 주소
device_tokenSTRING디바이스 토큰 (푸시 알림용)
user_tagsLIST_STRING사용자 태그
total_pointNUMBER현재 보유 포인트
커스텀 팩트 (예: customer_tier, order_region)는 사용 전에 팩트 정의에서 등록해야 합니다.

오류 처리

HTTP코드설명조치
404POLICY_GROUP_NOT_FOUND그룹 ID가 존재하지 않음그룹 ID 확인
400POLICY_GROUP_DISABLED그룹이 DISABLED 상태그룹 재활성화
404POLICY_VERSION_NOT_FOUND배포된 버전이 없거나 버전 ID 유효하지 않음버전 배포 필요
400INVALID_INPUT필수 팩트 누락/requirements 호출하여 확인
429TPS 한도 초과플랜 업그레이드 또는 재시도

다음 단계

드라이런

라이브 전에 부작용 없이 규칙을 테스트합니다.

팩트 정의

규칙에 사용할 커스텀 입력 변수를 등록합니다.