이벤트 엔드포인트 API 레퍼런스
SDK 구현의 대안으로 서버 간 연동을 통해 Singular의 REST API를 사용하여 어트리뷰션 분석 및 캠페인 최적화를 위한 인앱 이벤트와 구매을 추적합니다.
개요
서버 간 사용 사례
EVENT API를 사용하면 앱이 사용자 상호작용 데이터를 백엔드로 전달하여 이벤트 어트리뷰션 및 구매 분석 보고를 위해 Singular의 서버로 전송하는 인앱 이벤트 추적이 가능합니다.
지원되는 기능
- 이벤트 어트리뷰션: 사용자 행동을 마케팅 캠페인에 연결
- 구매 추적: 인앱 구매 및 트랜잭션 측정 및 어트리뷰션
- 커스텀 이벤트: 등록부터 레벨 완료까지 모든 사용자 상호 작용 추적
- 이벤트 속성: 이벤트에 컨텍스트 데이터를 첨부하여 심층 분석 가능
데이터 흐름 아키텍처
서버 간 이벤트 추적은 4단계 데이터 전송 프로세스를 따릅니다.
- 클라이언트 수집: 앱이 이벤트 데이터 및 기기 식별자를 수집합니다.
- 서버 전송: 앱이 백엔드 서버로 이벤트 데이터를 전달합니다.
- 디바이스 그래프 쿼리: 서버가 Singular 디바이스 그래프에서 디바이스 세부 정보를 검색하거나 업데이트합니다.
- 이벤트 API 호출: 서버가 이벤트를 Singular REST API 엔드포인트로 전송합니다.
중요 요구 사항
전제 조건:
- 이벤트 전 세션: 이벤트 추적 전에 세션이 설정되어야 합니다.
- 순차적 순서: 세션 순서가 잘못되면 데이터 불일치 및 어트리뷰션 오류가 발생합니다.
연동 제약 조건:
- 실시간 처리: 요청은 개별적으로 처리되며 일괄 처리는 지원되지 않습니다.
- 시간순 이벤트: 이벤트는 발생한 순서대로 전송되어야 함
- 중복 제거 없음: 데이터 중복을 방지하기 위해 서버 측 중복 제거를 구현합니다.
- 데이터 영구성: 장치 수준 데이터는 수집 후 삭제할 수 없음 - 전송 전에 유효성 검사 수행
이벤트 추적 가이드라인
이름 지정 규칙과 데이터 구조에 대한 Singular의 모범 사례에 따라 이벤트 추적을 구현하세요.
이벤트 정의
이벤트 정의하기
S2S 연동을 구현하기 전에, 캠페인 성과 분석을 위해 추적하고자 하는 전체 이벤트 목록을 정의하세요.
이벤트 계획 가이드: 인앱 이벤트 정의하기
이벤트 네이밍 영향: Singular에 전달된 이벤트 이름은 보고서, 내보내기 및 포스트백에 이벤트가 표시되는 방식을 직접 결정합니다.
표준 이벤트 네이밍
모범 사례:
- 표준 이벤트: 간소화된 파트너 연동 매핑을 위해 Singular의 표준 이벤트 명명 규칙을사용하세요.
- 영어: 타사 파트너 및 분석 솔루션과의 호환성을 위해 이벤트 이름을 영어로 전달하세요.
- 표준 속성: 이벤트 속성에 표준 이벤트속성 이름사용
문자 제한
길이 제한:
- 이벤트 이름: 최대 32자(ASCII가 아닌 경우 UTF-8로 변환 시 32바이트)
- 이벤트 속성: 속성 키 및 값당 최대 500자(ASCII)
API 엔드포인트 선택
Singular는 서로 다른 연동 아키텍처에 최적화된 두 가지 EVENT 엔드포인트 버전을 제공합니다.
엔드포인트 선택: 연동 아키텍처와 디바이스 식별자 전략에 따라 엔드포인트를 선택하세요. 사용 사례에 따라 올바른 엔드포인트가 결정됩니다.
이벤트 엔드포인트 V1
V1 사용 사례
플랫폼별 장치 식별자(IDFA, IDFV, AIFA, ASID 등)에 의존하는 연동에는 이벤트 엔드포인트 V1을 사용하세요.
권장 대상:
- 순수한 서버 측: Singular SDK 구현이 없는 서버 측 연동
- 하이브리드(비 SDID): Singular SDK가 Singular 디바이스 ID(SDID)를 사용하지 않는 하이브리드 연동
엔드포인트 URL:
GET https://s2s.singular.net/api/v1/evt
이벤트 엔드포인트 V2
V2 사용 사례
Singular SDK가 SDID를 사용하여 세션을 추적하고 서버가 동일한 SDID를 사용하여 이벤트를 전송하는 하이브리드 연동에는 이벤트 엔드포인트 V2를 사용하세요.
권장 대상:
- 하이브리드(SDID 기반): Singular SDK는 SDID로 세션을 추적하고 서버 측 이벤트는 동일한 SDID를 사용합니다.
- 간소화된 식별자: 플랫폼별 디바이스 식별자(IDFA, AIFA 등)를 피하는 구현
엔드포인트 URL:
GET https://s2s.singular.net/api/v2/evt
계정 활성화: V2 엔드포인트는 SDID 사용을 위해 Singular 계정 구성이 필요합니다. 사용 설정은 솔루션 엔지니어 또는 CSM에게 문의하세요.
필수 장치 식별자
장치 식별자 요구 사항은 엔드포인트 버전 및 플랫폼에 따라 다릅니다. 아래에서 플랫폼별 요구 사항을 검토하세요.
V1 엔드포인트 식별자
플랫폼별 식별자
이벤트 엔드포인트 V1은 디바이스 운영 체제 및 앱 배포 방식에 따라 플랫폼별 광고 식별자를 요구합니다.
| 파라미터 | 플랫폼 | 설명 |
|---|---|---|
idfa
|
iOS |
광고주용 식별자(IDFA)는 광고 추적 및 캠페인 어트리뷰션을 가능하게 합니다. ATT 요구사항: iOS 14.5 이상에서는 앱 추적 투명성을 통한 사용자 옵트인이 필요합니다.
예: |
idfv
|
iOS |
공급업체용 식별자(IDFV)는동일한 공급업체의 모든 앱에서 일관성을 유지합니다. 항상 필수입니다: ATT 상태 또는 IDFA 사용 가능 여부에 관계없이 반드시 포함해야 합니다.
예: |
aifa
|
Android (구글 플레이) |
Google 광고 ID(GAID)는 사용자가 재설정 가능한 광고 추적을 가능하게 합니다.
예: |
asid
|
Android (구글 플레이) |
Android 앱 세트 ID는동일한 개발자에 대해 개인정보 보호를 고려한 교차 앱 추적을 제공합니다. 항상 필수입니다: GAID 사용 가능 여부와 관계없이 Google Play 기기에 반드시 포함되어야 합니다.
예: |
amid
|
Android (Amazon) |
구글 플레이 서비스가 없는 아마존 파이어 디바이스용 아마존 광고 ID.
예: |
oaid
|
Android (중국 OEM) |
구글 플레이 서비스가 없는 중국 제조 기기용 OAID(오픈 광고 식별자).
예: |
andi
|
Android (비구글 플레이) |
Android ID는 기기에서 생성된 64비트 식별자입니다. 사용 제한: Google Play 기기에서는 금지됩니다. 다른 식별자를 사용할 수 없고 Google Play를 통해 배포되지 않은 앱인 경우에만 사용하세요.
예시: |
sdid
|
웹, PC, 콘솔, CTV |
네이티브 광고 식별자가 없는 플랫폼을 위한 Singular 기기 ID.
예: |
sing
|
기업 전용 |
표준 식별자를 사용할 수 없는 특수한 사용 사례를 위한 클라이언트 정의 식별자. 제한됨: 기업 고객 전용-Singular 솔루션 엔지니어가 앱별로 활성화해야 합니다.
예: |
V2 엔드포인트 식별자
SDID 전용 요구 사항
이벤트 엔드포인트 V2는 모든 플랫폼에 대해 Singular 디바이스 ID(SDID)만 필요하므로 디바이스 식별이 간소화됩니다.
| 매개변수 | 설명 |
|---|---|
sdid
|
플랫폼: iOS, Android, 웹, PC, Xbox, PlayStation, Nintendo, MetaQuest, CTV Singular SDK에서 획득하거나 PC/콘솔/TV용 클라이언트 측에서 생성한 Singular 디바이스 ID.
예: |
필수 파라미터
모든 이벤트 요청에는 디바이스 식별자 외에 이러한 필수 파라미터가 포함되어야 합니다.
파라미터 형식: 모든 파라미터는 GET 메서드를 사용하여 URL 쿼리 파라미터로 전달해야 합니다. 파라미터를 JSON 요청 본문으로 보내지 마세요.
API 인증
| 파라미터 | 유형 | 설명 |
|---|---|---|
a
|
string
|
API 인증을 위한 Singular SDK 키입니다. 검색 위치: Singular UI → 메인 메뉴 → 개발자 도구 중요: 리포팅 API 키는 사용하지 마세요. 요청이 거부됩니다.
예시: |
디바이스 매개변수
| 파라미터 | 설명 |
|---|---|
p
|
애플리케이션의 플랫폼(대소문자 구분). 허용되는 값: 안드로이드, iOS, 웹, PC, 엑스박스, 플레이스테이션, 닌텐도, 메타퀘스트, CTV
예시: |
ip
|
디바이스의 공인 IPv4 IP 주소. IPv6도 지원되지만 어트리뷰션 호환성을 위해 IPv4를 권장합니다.
예시: |
ve
|
이벤트 시점의 디바이스 OS 버전.
예시: |
애플리케이션 매개변수
| 파라미터 | 설명 |
|---|---|
i
|
앱 식별자(대소문자 구분).
예시: |
att_authorization_statusiOS |
ATT(앱 추적 투명성) 상태 코드(iOS 14.5 이상). 상태 값:
항상 필요: ATT가 구현되지 않은 경우에도
예시: |
이벤트 매개변수
| 파라미터 | 설명 |
|---|---|
n
|
추적 중인 이벤트의 이름입니다.
예시: |
선택적 매개변수
선택적 매개변수는 추가적인 컨텍스트와 기능으로 이벤트 추적을 향상시킵니다.
타임스탬프 매개변수
| 파라미터 | 유형 | 설명 |
|---|---|---|
utime
|
int
|
이벤트의 10자리 유닉스 타임스탬프입니다.
예시: |
umilisec
|
int
|
13자리 유닉스 타임스탬프(밀리초 포함)입니다.
예시: |
maiOS, Android |
string
|
디바이스 제조사(제조업체 이름).
예시 |
moiOS, Android |
string
|
디바이스 모델.
예시 |
lciOS, Android |
string
|
IETF 로캘 태그 - 밑줄로 구분된 두 글자 언어와 국가 코드.
예시: |
bdiOS, Android |
string
|
URL로 인코딩된 디바이스 빌드 식별자.
예시: |
이벤트 속성
| 파라미터 | 설명 |
|---|---|
e
|
사용자 지정 이벤트 속성을 지정하는 JSON URL 인코딩 문자열입니다. JSON 구조입니다:
URL로 인코딩된 예시:
|
global_properties
|
이벤트에 전역적으로 적용되는 사용자 지정 키-값 쌍을 포함하는 JSON URL 인코딩된 개체입니다. 제한:
JSON:
URL 인코딩: |
네트워크 파라미터
| 파라미터 | 설명 |
|---|---|
use_ip
|
Singular가 제한사항:
예시: |
country
|
ISO 3166-1 알파-2두 글자 국가 코드.
필요한 경우: IP 주소를 사용할 수 없거나
예: |
데이터 개인정보
| 파라미터 | 설명 |
|---|---|
data_sharing_options
|
데이터 공유에 대한 최종 사용자의 JSON URL 인코딩 동의. 이후의 모든 이벤트 요청에 대해 유지되고 전달되어야 합니다. 사용자 동의(옵트인):
사용자 거부(옵트아웃):
URL 인코딩 예: |
교차 디바이스 지원
| 파라미터 | 설명 |
|---|---|
custom_user_id
|
교차 기기 추적을 위한 내부 사용자 ID입니다.
예시: |
SKAdNetwork 지원
| 파라미터 | 설명 |
|---|---|
skan_conversion_valueiOS |
이벤트 시점의 최신 SKAdNetwork 전환 값입니다. 자세히 알아보기: SKAdNetwork 구현
예시: |
skan_first_call_timestampiOS |
SKAdNetwork API를 처음 호출한 유닉스 타임스탬프.
예시: |
skan_last_call_timestampiOS |
이벤트 시점에 가장 최근에 SKAdNetwork API를 호출한 유닉스 타임스탬프입니다.
예시: |
구매 추적
적절한 유효성 검사 및 통화 처리를 통해 인앱 구매 및 구매 이벤트를 추적합니다.
필수 구매 매개변수
기본 구매 추적
자체 구매 유효성 검사를 수행할 때 구매 이벤트 추적에 필요한 최소 매개 변수입니다.
모범 사례: 이벤트 요청을 Singular에 보내기 전에 서버 측에서 앱 스토어를 통해 구매 이벤트를 검증합니다. 자체 검증을 수행하는 경우, 다음 파라미터만 필요합니다.
| 파라미터 | 유형 | 설명 |
|---|---|---|
is_revenue_event
|
string
|
이벤트가 구매 이벤트인지 여부를 지정합니다.
예시: |
amt
|
double
|
거래의 통화 금액입니다.
예시: |
cur
|
string
|
ISO 4217세 글자의 대문자 통화 코드입니다.
예: |
구매 유효성 검사 매개변수
Singular 유효성 검사 구매
앱스토어에서 서버 측 구매 유효성 검사를 수행하기 위한 Singular의 선택적 파라미터입니다.
유효성 검사 요구 사항:
- 앱스토어 구매 유효성 검사를 위해 Singular를 사용하는 경우 필수입니다.
- 구매 영수증 및 서명 값의 올바른 구문 확인
-
잘못된 서식으로 인해 Singular가 구매을 차단하고
__iapinvalid__이벤트를 생성합니다.
| 파라미터 | 설명 |
|---|---|
purchase_receiptiOS, Android |
구매 거래에서 받은 영수증입니다.
예(iOS):
예시(Android, URL 인코딩):
|
receipt_signatureAndroid |
구매 영수증에 서명하는 데 사용되는 서명(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
자바 예제
// 기본 URL String baseUrl = "https://s2s.singular.net/api/v1/evt"; // 매개변수 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"); // 인코딩된 파라미터로 URL 빌드 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)); } // 연결 URL 만들기 url = new URL(urlBuilder.toString()); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Accept", "application/json"); // 응답 받기 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(); // 상태 확인 System.out.println("HTTP 상태 코드: " + responseCode); System.out.println("Response: " + response.toString()); // 연결 끊기 conn.disconnect();
응답 코드 및 오류
EVENT 엔드포인트는 요청 성공 또는 실패를 나타내는 HTTP 상태 코드와 JSON 응답을 반환합니다.
전체 오류 문서: S2S 응답 코드 및 오류 처리
테스트 및 검증
실시간 데이터 유효성 검사를 위해 Singular SDK 콘솔을 사용하여 프로덕션 배포 전에 S2S 이벤트 연동을 검증하세요.
테스트 절차
엔드투엔드 검증
- 테스트 디바이스를 등록합니다: 디바이스 광고 ID를 획득하고 Singular SDK 콘솔에추가합니다.
- 콘솔 로깅을 활성화합니다: SDK 콘솔에 디바이스 식별자를 추가하여 테스트 데이터를 캡처합니다.
-
개발 앱 ID 사용: 앱 식별자를 개발 버전(예:
com.singular.app.dev)으로 재정의하여 테스트와 프로덕션 데이터를 분리합니다. - 빌드 및 실행: 종료된 상태에서 앱 빌드 또는 열기
- 클라이언트 데이터 유효성 검사: 앱이 필요한 모든 Singular 데이터 포인트를 서버로 전송하는지 확인합니다.
-
세션 확인: 서버가 모든 필수 파라미터와 함께
https://s2s.singular.net/api/v1/launch로 세션 요청을 보내는지 확인합니다. - SDK 콘솔(세션)을 확인합니다: 몇 초 내에 SDK 콘솔에 세션 이벤트가 표시되어야 합니다.
이벤트 테스트
- 이벤트 트리거: 앱에서 이벤트 트리거를 진행합니다.
- 이벤트 데이터 검증: 모든 필수 Singular 데이터 포인트와 함께 서버로 전송된 이벤트를 확인합니다.
-
서버 요청 확인: 서버가 모든 필수 파라미터와 함께
https://s2s.singular.net/api/v1/evt로 이벤트 요청을 보냈는지 확인합니다. - SDK 콘솔(이벤트)을 확인합니다: 몇 초 내에 SDK 콘솔에 EVENT가 표시되어야 합니다.
- 테스트를 반복합니다: 예상 값으로 전송된 모든 이벤트의 유효성 검사
중요 확인:
- 이벤트 수신 전 앱 오픈/포그라운드에서 세션 이벤트 발생 확인
- 이벤트 필수 데이터 포인트가 세션 데이터 포인트와 일치하는지 확인합니다.
성공 표시기: 이벤트가 SDK 콘솔에 나타나면 엔드투엔드 이벤트 연동 테스트가 성공적으로 완료된 것입니다!
추가 리소스
테스트 문서
종합 테스트 가이드: S2S 연동 테스트 가이드