Shoply Merchant API 사용 방법
Shoply Merchant API를 사용하면 판매자가 보고 도구, 지원 워크플로, 예약된 내보내기, 비공개 비즈니스 애플리케이션에서 자신의 Shoply 데이터를 안전하게 사용할 수 있습니다.
각 통합은 Shoply Settings에서 생성한 취소 가능한 스토어 범위 자격 증명으로 인증합니다. Shopify Admin API 액세스 토큰을 공유할 필요가 없으며, 각 통합은 자격 증명을 발급한 해당 스토어에만 접근할 수 있습니다.
Merchant API로 무엇을 할 수 있나요?
Merchant API를 사용하여 다음을 수행할 수 있습니다:
- 일간, 주간 또는 월간 성과 결과를 스프레드시트나 데이터 웨어하우스로 내보냅니다.
- 세션, 채팅, 검색, 상품 클릭, 장바구니 담기 이벤트, 구매, 기여 매출을 위한 비공개 대시보드를 구축합니다.
- 고객 활동을 모니터링하고 참여도의 비정상적인 변화를 발견합니다.
- 지원, 머천다이징, 답변 품질 작업을 위해 채팅 및 검색 세션을 검토합니다.
- 고객 문제를 조사할 때 개별 대화 타임라인을 조회합니다.
- Shoply AI가 사용하는 사용자 지정 지식을 생성, 업데이트, 조회 및 삭제합니다.
- 외부 웹페이지나 업로드된 PDF, 텍스트 또는 Markdown 파일을 지식 베이스에 추가합니다.
- UTC 이벤트 데이터를 스토어의 현지 시간대에 맞춥니다.
이 가이드는 7개의 엔드포인트를 문서화합니다. 이 중 5개는 Shoply Admin → Analytics에서 사용하는 동일한 엔드포인트이며, 나머지 2개는 지식 베이스를 관리합니다:
| API | 카테고리 | 반환 내용 |
|---|---|---|
admin_store_analytics | 성과 | 일간, 주간 또는 월간 성과 행 및 합계 |
query_api_usage_count | 참여도 | UTC 분 또는 일별로 그룹화된 활동 수 |
query_sessionized_chat | 대화 | 채팅 및 검색 세션 요약 |
query_log_visualization | 대화 | 선택한 하나의 세션에 대한 전체 이벤트 타임라인 |
admin_get_store_metadata | 스토어 구성 | UTC 데이터를 올바르게 표시하는 데 사용되는 스토어 시간대 |
admin_store_knowledge | 지식 | 사용자 지정 텍스트, 외부 페이지, 업로드된 파일, 삭제 및 재크롤링 |
user_generated_file | 지식 파일 | PDF, 텍스트 또는 Markdown 파일을 지식으로 등록하기 전에 업로드 |
아래 응답 본문은 대표적인 예시입니다. 실제 필드와 값은 귀하의 스토어에 기록된 활동을 반영합니다.
배포 요구사항: 스토어 소유자 비밀 키 인증은 호출하는 API 서버에 배포되어 있어야 합니다. 유효한 비밀 키로 HTTP
403과 함께No access_token found가 반환된다면, 해당 서버는 여전히 이전의 액세스 토큰 전용 인증 코드를 실행 중인 것입니다.
API 비밀 키는 어떻게 생성하나요?
- Shoply AI 관리자 페이지를 엽니다.
- Settings → Store owner API secret로 이동합니다.
- 비밀 키를 생성하고
Weekly reporting export처럼 통합을 식별할 수 있는 이름을 지정합니다. - 비밀 키가 표시되면 복사합니다. Shoply는 평문 값을 한 번만 보여줍니다.
각 비밀 키의 유효 기간은 90일입니다. 하나의 스토어는 각각의 통합에 대해 별도의 비밀 키를 가질 수 있으며, 다른 비밀 키를 중단시키지 않고 하나만 취소할 수 있습니다.
다음 값들을 서버 측 환경 변수로 저장하세요:
export SHOPLY_STORE_KEY="your-store.myshopify.com"
export SHOPLY_STORE_OWNER_API_SECRETE="shoply_owner_key_example123.secret-value"SHOPLY_STORE_KEY에는 쇼핑객이 보통 사용자 지정 도메인을 방문하더라도, 스토어의 영구 myshopify.com 도메인을 사용하세요.

인증은 어떻게 작동하나요?
모든 Merchant API 요청은 값이 JSON 문자열인 Authorization 헤더를 전송합니다:
{
"store_key": "your-store.myshopify.com",
"store_owner_api_secrete": "YOUR_STORE_OWNER_API_SECRET"
}store_owner_api_secrete는 과거의 철자를 포함한 정확한 공개 필드 이름입니다. 이것은 Bearer 토큰이 아닙니다. 전체 JSON 문자열을 직접 Authorization 헤더에 넣으세요.
비밀 키는 백엔드 코드에만 보관하세요. URL, 브라우저 번들, 공개 저장소, 분석 이벤트 또는 애플리케이션 로그에 넣지 마세요.
공식 Python 및 Node.js 패키지가 있나요?
예. Shoply는 필요한 인증을 자동으로 추가하고 Merchant API를 타입이 지정된 함수로 제공하는 두 개의 서버 측 패키지를 제공합니다. 두 패키지 모두 shoplyai-public GitHub 조직에서 오픈 소스로 공개되어 있습니다.
Python 패키지
shoply-merchant-api 패키지는 Python 3.12를 지원하며 Pydantic v2 응답 모델을 사용합니다. 고정된 2.1.3 릴리스를 설치하세요:
python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install "git+https://github.com/shoplyai-public/shoply-merchant-api.git@v2.1.3"최신 채팅 및 검색 세션을 타입이 지정된 SessionSummary 모델로 조회합니다:
import os
from shoply_merchant_api import ShoplyMerchantClient
with ShoplyMerchantClient(
store_key=os.environ["SHOPLY_STORE_KEY"],
api_secret=os.environ["SHOPLY_STORE_OWNER_API_SECRETE"],
) as shoply:
session_response = shoply.list_sessions(limit=40)
for conversation in session_response.data:
print(conversation.customer_id, conversation.user_questions)이 패키지는 또한 분석, 활동 수, 전체 세션 타임라인, 스토어 시간대, 지식 관리를 위한 함수도 제공합니다. 자세한 내용은 business-use-case guide 및 API reference 를 참조하세요.
Node.js 및 TypeScript 패키지
shoply-merchant-api-js 저장소는 Node.js 20 이상용 @shoplyai/merchant-api 패키지를 제공합니다. 이 패키지는 내장 TypeScript 선언을 포함하고 런타임 의존성이 없는 ESM 패키지입니다. 고정된 2.1.3 릴리스를 GitHub에서 직접 설치하세요:
npm install "github:shoplyai-public/shoply-merchant-api-js#v2.1.3"Node.js 서버에서 동일한 최신 세션을 조회합니다:
import { ShoplyMerchantClient } from "@shoplyai/merchant-api";
const storeKey = process.env.SHOPLY_STORE_KEY;
const apiSecret = process.env.SHOPLY_STORE_OWNER_API_SECRETE;
if (!storeKey || !apiSecret) {
throw new Error("SHOPLY_STORE_KEY and SHOPLY_STORE_OWNER_API_SECRETE are required");
}
const shoply = new ShoplyMerchantClient({
storeKey,
apiSecret,
});
const sessionResponse = await shoply.listSessions({ limit: 40 });
for (const conversation of sessionResponse.data) {
console.log(conversation.customer_id, conversation.user_questions);
}npm 패키지는 Python 패키지와 동일한 Merchant API 엔드포인트를 지원합니다. 자세한 내용은 business-use-case guide 및 API reference 를 참조하세요.
두 패키지 모두 신뢰할 수 있는 백엔드 서비스, 예약 작업, 비공개 내부 도구용입니다. 어느 패키지도 스토어프론트 코드에 import하지 말고 브라우저 번들에 API 비밀 키를 노출하지 마세요.
패키지 없이 HTTP API를 호출할 수 있나요?
예. Merchant API는 여전히 표준 HTTPS API입니다. 아래의 저수준 Python 예제는 Requests를 사용하므로 전체 wire contract를 확인하거나 다른 언어에서 통합할 수 있습니다.
환경에 Requests가 아직 포함되어 있지 않다면 설치하세요:
python -m pip install requests아래 헬퍼는 모든 요청에 스토어 키와 인증 헤더를 추가합니다:
import json
import os
from typing import Any
import requests
BASE_URL = "https://api.shoplyai.ai"
STORE_KEY = os.environ["SHOPLY_STORE_KEY"]
STORE_OWNER_API_SECRETE = os.environ["SHOPLY_STORE_OWNER_API_SECRETE"]
session = requests.Session()
session.headers.update({
"Authorization": json.dumps({
"store_key": STORE_KEY,
"store_owner_api_secrete": STORE_OWNER_API_SECRETE,
})
})
def shoply_get(api_name: str, **params: Any) -> dict[str, Any]:
"""Call one store-scoped Shoply API and surface HTTP or API-level errors."""
response = session.get(
f"{BASE_URL}/{api_name}",
params={"store_key": STORE_KEY, **params},
timeout=30,
)
response.raise_for_status()
payload = response.json()
if payload.get("error") is not None or payload.get("statusCode") not in (None, 200):
raise RuntimeError(payload.get("error", "Shoply API request failed"))
return payload
def shoply_post(
api_name: str,
payload: dict[str, Any] | None = None,
**params: Any,
) -> dict[str, Any]:
"""Write store-scoped data and surface HTTP or API-level errors."""
response = session.post(
f"{BASE_URL}/{api_name}",
params={"store_key": STORE_KEY, **params},
json=payload,
timeout=60,
)
response.raise_for_status()
result = response.json()
if result.get("error") is not None or result.get("statusCode") not in (None, 200):
raise RuntimeError(result.get("error", "Shoply API request failed"))
return result아래 예제는 이 공용 클라이언트를 사용합니다. 두 헬퍼 모두 인증된 스토어 키를 자동으로 추가합니다.
API를 통해 Shoply AI 지식을 관리할 수 있나요?
예. admin_store_knowledge는 GET으로 지식을 조회하고 POST로 생성, 업데이트, 삭제 또는 재크롤링을 수행합니다. 기존 지식 ID를 사용하는 POST는 해당 항목을 업데이트하고, 새로운 ID를 사용하면 생성됩니다.
업데이트를 자동화하기 전에, 학습 가이드의 예시를 참고하여 유용한 스토어 지식을 계획하세요.
지식 쓰기 작업은 쇼핑객에게 표시되는 답변을 바꿀 수 있습니다. 지식을 관리하는 시스템에는 전용 비밀 키를 사용하고, 전송 전에 콘텐츠를 검증하며, 이 쓰기 권한이 있는 자격 증명을 스토어프론트 JavaScript에 절대 노출하지 마세요.
기존 지식 조회
knowledge_payload = shoply_get(
"admin_store_knowledge",
knowledge_id_to_retrieve="_ALL_",
)
for knowledge_id, knowledge in knowledge_payload["data"].items():
print(knowledge_id, knowledge.get("title"))샘플 응답
{
"data": {
"knowledge::shipping-policy": {
"title": "Shipping policy",
"text": "Orders leave our warehouse within two business days.",
"epoch_edit": 1787211246
}
}
}사용자 지정 텍스트 지식 생성 또는 업데이트
안정적이고 고유한 지식 ID를 선택하세요. 해당 항목을 업데이트할 때는 동일한 ID를 재사용하세요.
from time import time
knowledge_id = "knowledge::shipping-policy"
result = shoply_post(
"admin_store_knowledge",
{
knowledge_id: {
"title": "Shipping policy",
"text": (
"Orders leave our warehouse within two business days. "
"Standard delivery normally takes three to five business days."
),
"epoch_edit": int(time()),
}
},
)
print(result)샘플 응답
{
"statusCode": 200
}성공적인 응답은 지식이 저장되었음을 의미합니다. 검색 인덱싱에는 몇 분이 걸릴 수 있으므로 새 답변이 즉시 나타나지 않을 수 있습니다. API가 콘텐츠가 저장되었지만 인덱싱이 지연된다고 보고하면, 쓰기를 재시도하기 전에 GET으로 저장된 항목을 확인하세요.
외부 웹페이지 추가
external_url::로 시작하는 ID를 사용하세요. text에는 전체 http:// 또는 https:// URL을 넣으세요.
from time import time
result = shoply_post(
"admin_store_knowledge",
{
"external_url::returns-policy": {
"title": "Returns and exchanges",
"text": "https://www.example.com/policies/returns",
"epoch_edit": int(time()),
}
},
)지식 파일 업로드 및 등록
지식 파일은 PDF, TXT 또는 Markdown이어야 하며 5MB보다 작아야 합니다. 먼저 파일을 업로드한 다음, 반환된 비공개 S3 위치를 지식 항목으로 저장하세요.
from pathlib import Path
from time import time
file_path = Path("shipping-policy.md")
with file_path.open("rb") as file_handle:
upload_response = session.post(
f"{BASE_URL}/user_generated_file",
params={"store_key": STORE_KEY, "folder": "knowledge_file"},
files={"file": (file_path.name, file_handle, "text/markdown")},
timeout=60,
)
upload_response.raise_for_status()
uploaded = upload_response.json()
if uploaded.get("statusCode") != 200:
raise RuntimeError(uploaded.get("error", "Knowledge file upload failed"))
shoply_post(
"admin_store_knowledge",
{
"knowledge_file::shipping-policy": {
"title": "Shipping policy document",
"text": uploaded["file_url"],
"epoch_edit": int(time()),
}
},
)샘플 업로드 응답
{
"message": "File uploaded successfully",
"statusCode": 200,
"file_url": "s3://shoplystores/your-store.myshopify.com/uploads/shipping-policy.md"
}file_url은 Shoply가 반환하는 불투명한 비공개 위치로 취급하세요. 직접 구성하거나 변경하지 마세요.
지식 삭제
삭제는 영구적입니다. 먼저 현재 항목을 조회하고, 제거하려는 정확한 ID만 전송하세요.
result = shoply_post(
"admin_store_knowledge",
{
"knowledge_ids_to_delete": [
"knowledge::shipping-policy",
"external_url::returns-policy",
"knowledge_file::shipping-policy",
]
},
)웹사이트 재크롤 요청
판매자 웹사이트의 콘텐츠가 변경된 후에는 재크롤을 사용하세요. 일반적으로 모든 사용자 지정 텍스트 업데이트 후마다 필요하지는 않습니다.
result = shoply_post(
"admin_store_knowledge",
re_crawl_ind="true",
)비즈니스 사용 사례
- 내부 콘텐츠 시스템에서 배송, 반품, 보증, 사이즈 또는 상품 관리 지침을 동기화합니다.
- Shoply Admin에 수동으로 복사하지 않고 임시 캠페인 또는 연휴 정보를 게시합니다.
- 배포 워크플로의 일부로 정책 웹페이지나 승인된 문서를 지식 베이스에 추가합니다.
- 정책 또는 프로모션이 종료되는 즉시 오래된 안내를 제거합니다.
Merchant API 예제
1. 성과 분석 조회
admin_store_analytics는 Analytics → Summary 표를 구동합니다. 이 엔드포인트는 세션, 채팅, 검색, 클릭, 장바구니 담기 이벤트, 구매 및 기여 매출을 반환합니다.
엔드포인트
GET https://api.shoplyai.ai/admin_store_analytics쿼리 파라미터
| Parameter | Required | Description |
|---|---|---|
store_key | Yes | 공용 클라이언트가 추가함 |
report_type | Yes | daily, weekly, 또는 monthly |
start_date | Daily/weekly | YYYYMMDD 형식의 포함 UTC 날짜 |
end_date | Daily/weekly | YYYYMMDD 형식의 포함 UTC 날짜 |
월간 보고서는 Shoply에 저장된 월간 기록을 사용하며 날짜 범위를 요구하지 않습니다.
Python 예제
daily_report = shoply_get(
"admin_store_analytics",
report_type="daily",
start_date="20260801",
end_date="20260820",
)
for row in daily_report["data"]:
print(row["date"], row["sessions"], row["purchases"], row["revenue"])
print("Totals:", daily_report["totals"])
# Weekly rows use the Monday of each week as their date label.
weekly_report = shoply_get(
"admin_store_analytics",
report_type="weekly",
start_date="20260701",
end_date="20260820",
)
# Monthly requests do not need start_date or end_date.
monthly_report = shoply_get("admin_store_analytics", report_type="monthly")샘플 응답
{
"data": [
{
"date": "20260820",
"sessions": 42,
"chats": 18,
"searches": 24,
"clicks": 11,
"add_to_cart": 5,
"purchases": 2,
"revenue": "$168.00",
"revenue_usd": "$168.00"
}
],
"totals": {
"date": "totals",
"sessions": 42,
"chats": 18,
"searches": 24,
"clicks": 11,
"add_to_cart": 5,
"purchases": 2,
"revenue": "$168.00",
"revenue_usd": "$168.00"
},
"report_type": "daily"
}매출에는 둘 이상의 통화가 포함될 수 있습니다. revenue는 표시용 텍스트로 취급하세요. Shoply가 표시하는 정규화된 USD 값이 필요하다면 revenue_usd를 사용하세요.
비즈니스 사용 사례
- 판매자 또는 이커머스 팀에 일일 판매 영향 요약을 보냅니다.
- 검색, 상품 클릭, 장바구니 담기 이벤트 및 구매를 비교하여 퍼널 이탈 지점을 찾습니다.
- Shoply Admin 페이지를 스크래핑하지 않고 주간 또는 월간 비즈니스 인텔리전스 대시보드에 데이터를 공급합니다.
- 시간에 따른 기여 매출을 추적하고 이를 머천다이징 또는 캠페인 변경과 비교합니다.
2. 스토어 시간대 조회
admin_get_store_metadata는 Analytics → Chat & Search History에 표시되는 시간대 배지를 제공합니다. 이 페이지는 이를 사용하여 UTC 활동을 스토어 현지 시간으로 변환합니다.
엔드포인트
GET https://api.shoplyai.ai/admin_get_store_metadata쿼리 파라미터
| Parameter | Required | Description |
|---|---|---|
store_key | Yes | 공용 클라이언트가 추가함 |
metadata_key | Yes | 리터럴 값 time_zone 사용 |
Python 예제
timezone_payload = shoply_get(
"admin_get_store_metadata",
metadata_key="time_zone",
)
timezone = timezone_payload["data"]
print(timezone["ianaTimezone"], timezone["timezoneOffsetMinutes"])샘플 응답
{
"data": {
"ianaTimezone": "America/Los_Angeles",
"timezoneOffset": -7,
"timezoneOffsetMinutes": -420
},
"statusCode": 200
}비즈니스 사용 사례
- UTC 활동을 판매자가 Analytics에서 보는 동일한 현지 달력 날짜로 그룹화합니다.
- 스토어의 현지 날짜가 끝난 후 일일 내보내기를 예약합니다.
America/Los_Angeles와 같은 명확한 IANA 시간대로 보고서에 라벨을 붙입니다.
시간대 오프셋은 일광 절약 시간 규칙 때문에 변경될 수 있습니다. 보고 시스템이 지원한다면 숫자 오프셋 하나를 영구 저장하는 대신 ianaTimezone을 사용하는 것이 좋습니다.
3. 활동 수 조회
query_api_usage_count는 UTC 날짜 또는 원래 UTC 분 단위로 그룹화된 스토어 활동을 반환합니다. 또한 Analytics → Chat & Search History의 활동 차트 데이터 소스이기도 합니다.
엔드포인트
GET https://api.shoplyai.ai/query_api_usage_count쿼리 파라미터
| Parameter | Required | Description |
|---|---|---|
start_dt_utc | Yes | YYYY-MM-DD HH:mm:ss 형식의 UTC 시작 시간 |
end_dt_utc | Yes | YYYY-MM-DD HH:mm:ss 형식의 UTC 종료 시간 |
groupby | No | 일일 합계는 utc_date, 분 단위 행은 utc_date_time |
Python 예제
activity = shoply_get(
"query_api_usage_count",
start_dt_utc="2026-08-01 00:00:00",
end_dt_utc="2026-08-20 23:59:59",
groupby="utc_date",
)
for row in activity["data"]:
print(row)샘플 응답
{
"data": [
{
"utc_date": "2026-08-20",
"QA": 18,
"CHAT": 18,
"SEARCH": 20,
"CACHED_SEARCH": 4,
"PRODUCT_SEARCH": 22,
"CLICK": 11,
"ADD_TO_CART": 5,
"CHECKOUT": 2
}
]
}행에는 해당 기간에 사용 가능한 활동 카운터(예: 채팅 질문, 검색, 클릭, 장바구니 담기 이벤트, 체크아웃 이벤트)가 포함됩니다. 활동이 없는 카운터는 0으로 설정되는 대신 아예 없을 수 있습니다.
비즈니스 사용 사례
- Chat & Search History에 있는 것과 같은 시간별 또는 일별 활동 차트를 구축합니다.
- 비정상적인 트래픽 급증이나 고객 참여의 갑작스러운 감소를 감지합니다.
- 상품 검색량을 클릭, 장바구니 담기 이벤트 및 체크아웃과 비교합니다.
- 지원 및 머천다이징 팀이 가장 바쁜 기간을 언제 검토해야 하는지 추정합니다.
4. 채팅 및 검색 세션 요약 조회
query_sessionized_chat는 고객 세션당 하나의 간결한 레코드를 반환합니다. 또한 Analytics → Chat & Search History의 세션 목록도 구동합니다.
엔드포인트
GET https://api.shoplyai.ai/query_sessionized_chat쿼리 파라미터
| Parameter | Required | Description |
|---|---|---|
start_dt_utc | Yes | UTC 시작 시간 또는 리터럴 값 undefined |
end_dt_utc | Yes | UTC 종료 시간 또는 리터럴 값 undefined |
num_sessions | No | 둘 중 하나의 범위가 undefined일 때 선택할 세션 수 |
ScanIndexForward | No | 최신 세션부터 선택하려면 false 사용 |
최신 40개 세션 조회
summary_payload = shoply_get(
"query_sessionized_chat",
start_dt_utc="undefined",
end_dt_utc="undefined",
num_sessions=40,
ScanIndexForward="false",
)
sessions = summary_payload["data"]
for conversation in sessions:
print(conversation["customer_id"], conversation.get("user_questions", ""))UTC 범위 내 세션 조회
summary_payload = shoply_get(
"query_sessionized_chat",
start_dt_utc="2026-08-20 00:00:00",
end_dt_utc="2026-08-20 23:59:59",
ScanIndexForward="false",
)두 시간 범위가 모두 존재하는 경우 API는 전체 범위의 세션을 반환하며, num_sessions는 해당 범위 지정 쿼리를 제한하지 않습니다.
샘플 응답
{
"data": [
{
"customer_id": "customer-or-session-id",
"user_questions": "Do you have this in blue?\nWhen will it ship?",
"start_timestamp_ms": 1787184000000,
"end_timestamp_ms": 1787184065000,
"session_types": "product information, click",
"customer_email": null,
"customer_info": {},
"sentiment": "positive",
"num_questions": 2,
"num_searches": 1,
"num_clicks": 1
}
]
}선택적 필드는 세션에 따라 달라집니다. 전체 타임라인을 조회할 계획이라면 customer_id, start_timestamp_ms, end_timestamp_ms를 유지하세요.
비즈니스 사용 사례
- 답변 품질 및 지원 교육을 위해 최근 대화 샘플을 검토합니다.
- 상품 설명 또는 FAQ에 반영해야 할 반복적인 고객 질문을 찾습니다.
- 검색, 상품 클릭 또는 기타 쇼핑 행동이 포함된 높은 의도의 세션을 식별합니다.
- 더 큰 이벤트 수준 페이로드를 피하면서 추세 분석을 위해 세션당 한 행씩 내보냅니다.
5. 하나의 전체 세션 조회
선택한 요약을 query_log_visualization에 전달하여 고객, AI, 검색 및 커머스 이벤트를 조회합니다.
엔드포인트
GET https://api.shoplyai.ai/query_log_visualization쿼리 파라미터
| Parameter | Required | Description |
|---|---|---|
date_time_utc_start | Yes | UTC YYYY-MM-DD HH:mm:ss 형식의 세션 시작 |
date_time_utc_end | Yes | UTC YYYY-MM-DD HH:mm:ss 형식의 세션 종료 |
session_id | No | 요약의 customer_id, 이전 기록 레코드에 사용됨 |
start_timestamp_ms | Recommended | 요약의 정확한 밀리초 시작 타임스탬프 |
Python 예제
from datetime import datetime, timezone
def utc_from_milliseconds(timestamp_ms: int) -> str:
"""Format a Shoply millisecond timestamp for the history API."""
value = datetime.fromtimestamp(timestamp_ms / 1000, tz=timezone.utc)
return value.strftime("%Y-%m-%d %H:%M:%S")
selected = sessions[0]
timeline_payload = shoply_get(
"query_log_visualization",
date_time_utc_start=utc_from_milliseconds(selected["start_timestamp_ms"]),
date_time_utc_end=utc_from_milliseconds(selected["end_timestamp_ms"]),
session_id=selected["customer_id"],
start_timestamp_ms=selected["start_timestamp_ms"],
)
for event in timeline_payload["data"]:
print(event.get("server_timestamp_ms"), event.get("action_type"))샘플 응답
{
"data": [
{
"action_type": "QA",
"session_id": "customer-or-session-id",
"utc_date_time": "2026-08-20 00:00:00",
"start_timestamp_ms": 1787184000000,
"server_timestamp_ms": 1787184000123,
"Q": {
"question": "Do you have this in blue?",
"question_context": {}
},
"task_id": "task-id",
"list_tokens": [
{
"data_type": "LLMOutput",
"data": "Yes. These blue options are currently available."
}
],
"dict_search_results": {}
}
]
}타임라인에는 고객 질문, AI 답변, 검색 결과, 상품 클릭, 장바구니 담기 이벤트, 체크아웃 이벤트 및 상담원 참여가 포함될 수 있습니다. 혼합된 이벤트 유형의 순서를 정하려면 server_timestamp_ms를 사용하세요. 이전 레코드에는 더 적은 필드가 포함될 수 있습니다.
비즈니스 사용 사례
- 지원 조사 중 고객이 정확히 무엇을 물었고 Shoply가 무엇을 답했는지 감사 추적합니다.
- 쇼핑객에게 표시된 검색 결과 및 상품과 함께 답변 품질을 검토합니다.
- 질문에서 클릭, 장바구니 담기 또는 체크아웃까지의 여정을 재구성합니다.
- 관련 없는 기록을 검색하지 않고 고객이 보고한 하나의 세션을 진단합니다.
모든 API에 하나의 비밀 키를 사용할 수 있나요?
예. 유효한 store_owner_api_secrete는 하나의 스토어 범위로 제한되며 위의 Merchant API 엔드포인트 전반에서 작동합니다. SiteChat 계정의 경우 동일한 비밀 키로 catalog upload APIs도 인증할 수 있습니다. 더 안전한 운영을 위해서는 시스템별로 별도의 이름 있는 비밀 키를 사용하세요. 예를 들어 하나는 야간 데이터 내보내기용, 다른 하나는 내부 대시보드용으로 사용할 수 있습니다.
하나의 통합이 더 이상 사용되지 않거나 침해된 경우, Shoply Settings에서 해당 비밀 키만 취소하세요. 다른 통합은 계속 작동합니다.
만료, 개인정보 보호 및 오류에 대해 무엇을 알아야 하나요?
고객 답변에 어떤 정보가 사용 가능한지 이해하려면 Shoply 데이터 소스 및 개인정보 보호도 검토하세요.
- 스토어 소유자 API 비밀 키는 90일 후 만료됩니다. 만료일 전에 새 비밀 키를 생성하고 통합을 업데이트하세요.
- Shoply의 표준 채팅 및 검색 기록 보존 기간도 90일입니다. 비밀 키 만료와 데이터 보존은 별도의 정책입니다.
- 기록 응답에는 고객 식별자, 이메일 주소, 대략적인 위치, 질문 및 쇼핑 활동을 포함한 개인정보가 포함될 수 있습니다. 개인정보 처리방침 및 관련 법률에 따라 저장하고 처리하세요.
- HTTP
403은 비밀 키가 없거나, 유효하지 않거나, 만료되었거나, 취소되었거나, 다른 스토어에 속함을 의미합니다. - HTTP
422는 일반적으로 필수 쿼리 파라미터가 없거나 이름이 잘못되었음을 의미합니다. - HTTP
500또는statusCode: 500이 포함된 응답은 요청이 Shoply에 도달했지만 완료될 수 없었음을 의미합니다. 일시적인 실패는 백오프와 함께 재시도하고, 오류가 계속되면 문의해 주세요. - 응답이 관리 가능하도록 내보내기 및 반복 작업에는 범위가 지정된 UTC 구간을 사용하세요.
상품 검색도 Merchant API의 일부인가요?
Shoply의 공개 상품 검색 API는 다른 인증 및 요청 계약을 사용합니다. 비공개 판매자 데이터가 아니라 쇼핑객 대상 경험을 위한 상품 검색 결과가 필요하다면 How to Access Shoply AI Search Through the API를 참조하세요.
SiteChat 판매자도 상품 카탈로그를 업로드할 수 있나요?
예. SiteChat 계정은 동일한 스토어 소유자 API 비밀 키로 구조화된 상품과 상품 이미지를 업로드할 수 있습니다. 이러한 카탈로그 엔드포인트는 How to Upload Your Catalog for SiteChat에 별도로 문서화되어 있습니다. Shopify 스토어는 계속 Shopify를 통해 상품을 동기화하며 해당 업로드 경로를 사용하지 않습니다.
통합에 대한 도움이 필요하면 Shoply AI에 문의하세요.
