EVENT 엔드포인트 API 레퍼런스
SDK 구현 대신 server-to-server 연동을 통해 Singular의 REST API를 사용하여 인앱 이벤트와 매출을 추적하고, 어트리뷰션 분석 및 캠페인 최적화에 활용하세요.
개요
Server-to-Server 사용 사례
EVENT API는 인앱 이벤트 추적을 지원합니다. 앱이 사용자 상호작용 데이터를 여러분의 백엔드로 전달하면, 백엔드가 이를 Singular 서버로 전송하여 이벤트 어트리뷰션 및 매출 분석 리포팅에 사용합니다.
지원 기능:
- 이벤트 어트리뷰션: 사용자 행동을 마케팅 캠페인과 연결
- 매출 추적: 인앱 구매 및 거래를 측정하고 어트리뷰션
- 커스텀 이벤트: 회원 가입부터 레벨 완료까지 모든 사용자 상호작용 추적
- 이벤트 속성: 보다 심층적인 분석을 위해 이벤트에 맥락 데이터 첨부
데이터 흐름 아키텍처
Server-to-server 이벤트 추적은 4단계 데이터 전송 프로세스를 따릅니다.
- 클라이언트 수집: 앱이 이벤트 데이터와 디바이스 식별자를 수집
- 서버 전송: 앱이 이벤트 데이터를 여러분의 백엔드 서버로 전달
- 디바이스 그래프 조회: 서버가 Singular 디바이스 그래프에서 디바이스 정보를 조회하거나 업데이트
- Event API 호출: 서버가 이벤트를 Singular REST API 엔드포인트로 전송
필수 요구사항
사전 요구사항:
- 이벤트 이전에 SESSION: 이벤트 추적을 하기 전에 반드시 SESSION이 먼저 성립되어야 함
- 순차적 순서: 잘못된 세션 순서는 데이터 불일치 및 어트리뷰션 오류를 유발
연동 제약사항:
- 실시간 처리: 요청은 개별적으로 처리됨—배치는 지원되지 않음
- 시간순 이벤트: 이벤트는 발생한 순서대로 전송되어야 함
- 중복 제거 없음: Singular는 데이터를 중복 제거하지 않음—중복을 방지하려면 서버 측에서 중복 제거를 구현
- 데이터 영속성: 디바이스 수준 데이터는 수집 후 삭제할 수 없음—전송 전에 검증
이벤트 추적 가이드라인
네이밍 규칙과 데이터 구조에 대한 Singular의 모범 사례를 따라 이벤트 추적을 구현하세요.
이벤트 정의
이벤트 정의하기
S2S 연동을 구현하기 전에, 캠페인 성과 분석을 위해 여러분의 조직이 추적하려는 이벤트의 전체 목록을 정의하세요.
이벤트 계획 가이드: 인앱 이벤트 정의하기
이벤트 네이밍의 영향: Singular로 전달되는 이벤트 이름은 이벤트가 리포트, 익스포트, 포스트백에 어떻게 표시되는지를 직접적으로 결정합니다.
표준 이벤트 네이밍
모범 사례:
- 표준 이벤트: 파트너 연동 매핑을 간소화하려면 Singular의 표준 이벤트 네이밍 규칙 을 사용
- 영어 사용: 서드파티 파트너 및 분석 솔루션과의 호환성을 위해 이벤트 이름은 영어로 전달
- 표준 속성: 이벤트 속성에는 표준 이벤트 속성 이름 을 사용
문자 제한
길이 제한:
- 이벤트 이름: 최대 32 ASCII 문자(non-ASCII의 경우 UTF-8 변환 시 32바이트)
- 이벤트 속성: 속성 키와 값당 최대 500 ASCII 문자
API 엔드포인트 선택
Singular은 서로 다른 연동 아키텍처에 최적화된 두 가지 EVENT 엔드포인트 버전을 제공합니다.
엔드포인트 선택: 연동 아키텍처와 디바이스 식별자 전략에 따라 엔드포인트를 선택하세요. 사용 사례가 올바른 엔드포인트를 결정합니다.
Event Endpoint V1
V1 사용 사례
플랫폼별 디바이스 식별자(IDFA, IDFV, AIFA, ASID 등)에 의존하는 연동에는 Event Endpoint V1을 사용하세요.
권장 대상:
- 순수 서버 측: Singular SDK 구현이 없는 서버 측 연동
- 하이브리드(비-SDID): Singular SDK가 Singular Device ID(SDID)를 사용하지 않는 하이브리드 연동
엔드포인트 URL:
GET https://s2s.singular.net/api/v1/evt
Event Endpoint V2
V2 사용 사례
Singular SDK가 SDID를 사용하여 세션을 추적하고 서버가 동일한 SDID로 이벤트를 전송하는 하이브리드 연동에는 Event Endpoint V2를 사용하세요.
권장 대상:
- 하이브리드(SDID 기반): Singular SDK가 SDID로 세션을 추적하고 서버 측 이벤트가 동일한 SDID를 사용
- 단순화된 식별자: 플랫폼별 디바이스 식별자(IDFA, AIFA 등)를 사용하지 않는 구현
엔드포인트 URL:
GET https://s2s.singular.net/api/v2/evt
계정 활성화: V2 엔드포인트는 SDID 사용을 위한 Singular 계정 구성이 필요합니다. 활성화를 위해 담당 Solution Engineer 또는 CSM에게 문의하세요.
웹(p=Web) 변형
웹 연동은 이 동일한 EVENT 엔드포인트를
p=Web
과 함께 사용합니다. 웹에는 SESSION 호출이 없습니다.
conversion_event=true
가 설정된 첫 번째
__PAGE_VISIT__
이벤트가 앱 실행을 대신하여 어트리뷰션 터치포인트를 성립시킵니다.
전체 가이드:
전체 브라우저 지원 패턴(SDID
유지,
__PAGE_VISIT__
시퀀싱, web-to-app,
클립보드 디퍼드 딥링킹)에 대해서는
Web S2S 구현 가이드
를 참조하세요.
웹 전용 파라미터
이 파라미터들은
p=Web
일 때 적용됩니다. 공유 파라미터
(
a
,
i
,
ip
,
sdid
,
custom_user_id
)는
S2S Fundamentals
에 정의되어 있습니다.
| 파라미터 | 세부 정보 |
|---|---|
conversion_event
|
어트리뷰션 이벤트인
예시:
|
attribution_data
|
랜딩 URL에서 파싱된 캠페인 데이터의 URL 인코딩된 JSON으로,
예시:
|
web_url
|
마케팅 파라미터(UTM /
예시:
|
web_page_referrer
|
리퍼러(
예시:
|
웹 클릭 ID:
파트너 클릭 ID
(
ScCid
,
ttclid
,
gclid
/
gbraid
/
wbraid
,
dclid
,
fbclid
,
rdt_uuid
)는 이벤트
e
파라미터 안에 전달합니다.
필수 디바이스 식별자
디바이스 식별자 요구사항은 엔드포인트 버전과 플랫폼에 따라 다릅니다. 아래 플랫폼별 요구사항을 검토하세요.
V1 엔드포인트 식별자
플랫폼별 식별자
Event Endpoint V1은 디바이스 운영체제 및 앱 배포 방식에 따라 플랫폼별 광고 식별자를 필요로 합니다.
이들은 S2S Fundamentals 에 한 번 정의된 공유 S2S 파라미터입니다.
V2 엔드포인트 식별자
SDID 전용 요구사항
Event Endpoint V2는 모든 플랫폼에서 Singular Device ID(SDID)만을 필요로 하여 디바이스 식별을 단순화합니다.
| 파라미터 | 세부 정보 |
|---|---|
sdid
|
플랫폼: iOS, Android, Web, PC, Xbox, PlayStation, Nintendo, MetaQuest, CTV Singular SDK에서 얻거나 클라이언트 측에서 생성한 Singular Device ID입니다.
예시:
|
필수 파라미터
모든 EVENT 요청은 디바이스 식별자 외에 다음 필수 파라미터를 포함해야 합니다.
파라미터 형식: 모든 파라미터는 GET 메서드를 사용하여 URL 쿼리 파라미터로 전달해야 합니다. JSON 요청 본문으로 파라미터를 전송하지 마세요.
API 인증
이들은 S2S Fundamentals 에 한 번 정의된 공유 S2S 파라미터입니다.
디바이스 파라미터
이들은 S2S Fundamentals 에 한 번 정의된 공유 S2S 파라미터입니다.
애플리케이션 파라미터
이들은 S2S Fundamentals 에 한 번 정의된 공유 S2S 파라미터입니다.
이벤트 파라미터
| 파라미터 | 세부 정보 |
|---|---|
n
|
추적하는 이벤트의 이름입니다.
예시:
|
선택 파라미터
선택 파라미터는 추가적인 맥락과 기능으로 이벤트 추적을 강화합니다.
타임스탬프 파라미터
| 파라미터 | 세부 정보 |
|---|---|
utime
|
이벤트의 10자리 Unix 타임스탬프입니다.
예시:
|
umilisec
|
밀리초 단위의 13자리 Unix 타임스탬프입니다.
예시:
|
이벤트 속성
파트너 Conversion API 지원: Singular의 Conversion API 연동을 통해 이러한 이벤트를 광고 네트워크 파트너로 전달하려면, 표준 선택적 이벤트 속성(eventId 및 ehash와 같은 해시된 자사 데이터)을 포함하세요. Conversion API 연동을 위한 표준 이벤트 속성을 참조하세요.
| 파라미터 | 세부 정보 |
|---|---|
e
|
커스텀 이벤트 속성을 지정하는 JSON URL 인코딩 문자열입니다. JSON 구조:
URL 인코딩 예시:
|
global_properties
|
이벤트에 전역적으로 적용되는 커스텀 키-값 쌍을 담은 JSON URL 인코딩 오브젝트입니다. 제한:
JSON:
URL 인코딩:
|
네트워크 파라미터
이들은 S2S Fundamentals 에 한 번 정의된 공유 S2S 파라미터입니다.
데이터 프라이버시
이들은 S2S Fundamentals 에 한 번 정의된 공유 S2S 파라미터입니다.
크로스 디바이스 지원
이들은 S2S Fundamentals 에 한 번 정의된 공유 S2S 파라미터입니다.
SKAdNetwork 지원
| 파라미터 | 세부 정보 |
|---|---|
skan_conversion_value
iOS |
이벤트 시점의 최신 SKAdNetwork 컨버전 값입니다. 자세히 알아보기: SKAdNetwork 구현
예시:
|
skan_first_call_timestamp
iOS |
SKAdNetwork API에 대한 첫 호출의 Unix 타임스탬프입니다.
예시:
|
skan_last_call_timestamp
iOS |
이벤트 시점의 SKAdNetwork API에 대한 가장 최근 호출의 Unix 타임스탬프입니다.
예시:
|
매출 추적
적절한 검증 및 통화 처리로 인앱 구매와 매출 이벤트를 추적하세요.
필수 매출 파라미터
기본 매출 추적
직접 매출 검증을 수행할 때 매출 이벤트 추적에 필요한 최소 파라미터입니다.
모범 사례: 이벤트 요청을 Singular로 전송하기 전에 서버 측에서 App Store와 매출 이벤트를 검증하세요. 직접 검증을 수행하는 경우 이 파라미터들만 필요합니다.
| 파라미터 | 세부 정보 |
|---|---|
is_revenue_event
|
이벤트가 매출 이벤트인지 여부를 지정합니다.
예시:
|
amt
|
거래의 통화 금액입니다.
예시:
|
cur
|
ISO 4217 세 글자 대문자 통화 코드입니다.
예시:
|
매출 검증 파라미터
Singular 검증 매출
Singular이 App Store와 서버 측 매출 검증을 수행하도록 하는 선택 파라미터입니다.
검증 요구사항:
- App Store와의 매출 검증을 Singular에 의존하는 경우 필수
- 구매 영수증 및 서명 값의 올바른 구문을 확인
-
잘못된 형식은 Singular이 매출을 차단하고
__iapinvalid__이벤트를 생성하게 함
| 파라미터 | 세부 정보 |
|---|---|
purchase_receipt
iOS, Android |
구매 거래에서 받은 영수증입니다. 예시(iOS):
예시(Android, URL 인코딩):
|
receipt_signature
Android |
구매 영수증에 서명하는 데 사용된 서명(Android 전용)입니다. 예시:
|
purchase_product_id
|
제품 SKU 식별자입니다.
예시:
|
purchase_transaction_id
|
거래 식별자입니다.
예시(iOS):
예시(Android):
|
요청 예시
샘플 코드는 여러 프로그래밍 언어에 걸친 EVENT 엔드포인트 연동을 보여줍니다.
예시 고지사항:
코드 샘플에 모든 필수 파라미터가 포함되어 있지 않을 수 있습니다. 프로덕션 구현 전에 전체 파라미터 목록을 검증하세요. 개발/테스트에는 고유한
i
(앱 식별자)를 사용하세요.
Python 예시
import requests
params = {
'a': 'sdk_key_here',
'p': 'Android',
'i': 'com.singular.app',
'ip': '10.1.2.3',
've': '9.2',
'ma': 'samsung',
'mo': 'SM-G935F',
'lc': 'en_US',
'bd': 'Build/13D15',
'aifa': '8ecd7512-2864-440c-93f3-a3cabe62525b',
'asid': 'edee92a2-7b2f-45f4-a509-840f170fc6d9',
'n': 'sng_add_to_cart'
}
response = requests.get('https://s2s.singular.net/api/v1/evt', params=params)
print(response.json())
cURL 예시
curl -G "https://s2s.singular.net/api/v1/evt" \
--data-urlencode "a=sdk_key_here" \
--data-urlencode "p=Android" \
--data-urlencode "i=com.singular.app" \
--data-urlencode "ip=10.1.2.3" \
--data-urlencode "ve=9.2" \
--data-urlencode "ma=samsung" \
--data-urlencode "mo=SM-G935F" \
--data-urlencode "lc=en_US" \
--data-urlencode "bd=Build/13D15" \
--data-urlencode "aifa=8ecd7512-2864-440c-93f3-a3cabe62525b" \
--data-urlencode "asid=edee92a2-7b2f-45f4-a509-840f170fc6d9" \
--data-urlencode "n=sng_add_to_cart"
HTTP 예시
GET /api/v1/evt
?a=sdk_key_here
&p=Android
&i=com.singular.app
&ip=10.1.2.3
&ve=9.2
&ma=samsung
&mo=SM-G935F
&lc=en_US
&bd=Build%2F13D15
&aifa=8ecd7512-2864-440c-93f3-a3cabe62525b
&asid=edee92a2-7b2f-45f4-a509-840f170fc6d9
&n=sng_add_to_cart HTTP/1.1
Host: s2s.singular.net
Accept: application/json
Java 예시
// Base URL
String baseUrl = "https://s2s.singular.net/api/v1/evt";
// Parameters
Map<String, String> params = new HashMap<>();
params.put("a", "sdk_key_here");
params.put("p", "Android");
params.put("i", "com.singular.app");
params.put("ip", "10.1.2.3");
params.put("ve", "9.2");
params.put("ma", "samsung");
params.put("mo", "SM-G935F");
params.put("lc", "en_US");
params.put("bd", "Build/13D15");
params.put("aifa", "8ecd7512-2864-440c-93f3-a3cabe62525b");
params.put("asid", "edee92a2-7b2f-45f4-a509-840f170fc6d9");
params.put("n", "sng_add_to_cart");
// Build URL with encoded parameters
StringBuilder urlBuilder = new StringBuilder(baseUrl);
urlBuilder.append('?');
for (Map.Entry<String, String> entry : params.entrySet()) {
if (urlBuilder.length() > baseUrl.length() + 1) {
urlBuilder.append('&');
}
urlBuilder.append(URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8))
.append('=')
.append(URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8));
}
// Create connection
URL url = new URL(urlBuilder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
// Get response
int responseCode = conn.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(conn.getInputStream())
);
String inputLine;
StringBuilder response = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
// Check status
System.out.println("HTTP Status Code: " + responseCode);
System.out.println("Response: " + response.toString());
// Disconnect
conn.disconnect();
응답 코드 및 오류
EVENT 엔드포인트는 요청 성공 또는 실패를 나타내는 HTTP 상태 코드와 JSON 응답을 반환합니다.
전체 오류 문서: S2S 응답 코드 및 오류 처리
테스트 및 검증
실시간 데이터 검증을 위해 Singular SDK Console을 사용하여 프로덕션 배포 전에 S2S 이벤트 연동을 확인하세요.
테스트 절차
엔드투엔드 검증
- 테스트 디바이스 등록: 디바이스 광고 ID를 확보하여 Singular SDK Console 에 추가
- Console 로깅 활성화: 테스트 데이터를 캡처하기 위해 SDK Console에 디바이스 식별자 추가
-
개발용 App ID 사용:
테스트 데이터를 프로덕션 데이터와 분리하기 위해 앱 식별자를 개발 버전(예:
com.singular.app.dev)으로 재정의 - 빌드 및 실행: 종료된 상태에서 앱을 빌드하거나 열기
- 클라이언트 데이터 검증: 앱이 필요한 모든 Singular 데이터 포인트를 여러분의 서버로 전송하는지 확인
-
세션 확인:
여러분의 서버가 필요한 모든 파라미터와 함께
https://s2s.singular.net/api/v1/launch로 SESSION 요청을 전송하는지 확인 - SDK Console 확인(세션): 몇 초 이내에 SESSION 이벤트가 SDK Console에 나타나야 함
이벤트 테스트
- 이벤트 트리거: 앱에서 이벤트를 트리거하는 단계로 진행
- 이벤트 데이터 검증: 이벤트가 필요한 모든 Singular 데이터 포인트와 함께 여러분의 서버로 전송되는지 확인
-
서버 요청 확인:
여러분의 서버가 필요한 모든 파라미터와 함께
https://s2s.singular.net/api/v1/evt로 EVENT 요청을 전송하는지 확인 - SDK Console 확인(이벤트): 몇 초 이내에 EVENT가 SDK Console에 나타나야 함
- 테스트 반복: 전송된 모든 이벤트가 예상 값을 갖는지 검증
필수 확인 사항:
- EVENT가 수신되기 전에 앱 열기/포그라운드 시 SESSION 이벤트가 발생하는지 확인
- EVENT의 필수 데이터 포인트가 SESSION 데이터 포인트와 일치하는지 확인
성공 지표: 이벤트가 SDK Console에 나타나면, 성공적인 엔드투엔드 이벤트 연동 테스트를 완료한 것입니다!
추가 리소스
테스트 문서
포괄적인 테스트 가이드: S2S 연동 테스트 가이드