세션 엔드포인트 API 참조
SDK 구현 대신 서버 간 연동을 통해 Singular의 REST API를 사용하여 사용자 세션을 추적하고 앱 설치, 리인게이지먼트 및 유지율 지표에 대한 기여도 추적을 활성화하세요.
개요
서버 간 연동 사용 사례
Singular REST API는 앱이 기기별 데이터를 백엔드로 전달하고, 백엔드가 Singular 서버로 전송하여 어트리뷰션 처리 및 분석 보고를 수행하는 직접적인 서버 간 연동을 지원합니다.
지원 기능:
- 설치 어트리뷰션: 마케팅 캠페인에 대한 퍼스트 터치 어트리뷰션
- 리인게이지먼트 어트리뷰션: 재방문 사용자에 대한 멀티터치 어트리뷰션
- 유지율 지표: 세션 기반 참여 추적
- 이벤트 추적: 맞춤형 인앱 이벤트 측정
데이터 흐름 아키텍처
서버 간 연동은 4단계 데이터 전송 프로세스를 따릅니다.
- 클라이언트 수집: 앱이 필요한 기기 및 애플리케이션 데이터를 수집
- 서버 전송: 앱이 수집된 데이터를 백엔드 서버로 전달
- Singular API 호출: 서버가 Singular REST API 엔드포인트로 데이터 전송
- 응답 처리: 서버가 Singular의 응답을 수신하고 처리합니다
주요 고려 사항
핵심 요구사항:
- 실시간 처리: 요청은 개별적으로 처리되며—배치 지원 없음
- 순차적 순서: 이벤트는 시간순으로 전송되어야 함
- 중복 제거 없음: Singular는 데이터를 중복 제거하지 않음— 서버 측 중복 제거 구현
- 데이터 영속성: 수집된 장치 수준 데이터는 삭제 불가—전송 전 유효성 검증
- 세션 우선: 이벤트 추적 전에 세션이 설정되어야 함
연동 이점:
- 유연성: 데이터 수집 및 전송 시점에 대한 완전한 제어권
- 기능 동등성: 적절한 데이터 제공 시 모든 SDK 기능 지원
- 맞춤형 구현: 특정 백엔드 아키텍처에 연동을 조정
세션 관리
SESSION 엔드포인트는 어트리뷰션 및 추적을 위한 사용자 세션 초기화를 위해 앱 실행 이벤트를 Singular에 알립니다.
세션 전송 시기
세션 트리거
다음 앱 라이프사이클 이벤트에 대해 SESSION 요청을 전송합니다:
- 신규 설치: 설치 후 첫 앱 실행
- 종료 상태 실행: 완전히 종료된 상태에서 앱 실행
- 백그라운드에서 포그라운드로: 타임아웃 기간 후 앱이 포그라운드로 복귀 (권장: 60초)
세션 시간 초과 로직
앱이 잠시 백그라운드 상태일 때 과도한 SESSION 요청을 방지하기 위해 세션 타임아웃을 구현하십시오.
권장 구현:
- 타임아웃 기간: 60초(1분)
- 포그라운드 < 타임아웃: 타임아웃 기간 내에 앱이 포그라운드로 복귀할 경우 SESSION 전송하지 않음
- 포그라운드 > 타임아웃: 앱이 타임아웃 기간 이후에도 백그라운드 상태를 유지할 경우 SESSION 전송
- 앱 라이프사이클 추적: 앱 라이프사이클 이벤트와 타이머를 활용하여 세션 상태 관리
딥 링크 지원: 딥 링크, 유니버설 링크 또는 openuri 매개변수가 설정된 앱 링크를 통해 앱이 열릴 경우, 타임아웃 상태와 관계없이 항상 SESSION을 전송합니다.
어트리뷰션 처리
세션 기반 어트리뷰션
Singular는 SESSION 요청을 처리하여 어트리뷰션 유형을 결정하고 적절한 워크플로를 트리거합니다.
| 세션 유형 | Singular 처리 | 어트리뷰션 결과 |
|---|---|---|
| 첫 세션 (신규 설치) | 설치 어트리뷰션 프로세스 트리거됨 | 설치를 마케팅 캠페인에 기여 |
| 리인게이지먼트 자격 부여 | 리인게이지먼트 기여도 프로세스 트리거됨 | 사용자 귀환을 캠페인 또는 딥 링크에 귀속 |
| 표준 세션 | 리텐션 추적을 위한 세션 기록 | 사용자 활동 및 참여 지표에 반영 |
자세히 알아보기: 리인게이지먼트 기여도 FAQ
이벤트 순서 요구사항
세션 및 이벤트 타이밍은 어트리뷰션 정확도와 데이터 품질에 직접적인 영향을 미칩니다.
중요한 순서 규칙:
- 세션 우선 이벤트: 해당 세션의 모든 이벤트 전에 반드시 Singular 세션이 수신되어야 합니다
- 실시간 이벤트 전송: 앱 내 이벤트는 해당 세션 이후 실시간으로 전송되어야 함
- 순차적 처리: 잘못된 세션 순서는 데이터 불일치 및 속성 오류를 초래합니다
고급 옵션
확장 기능
Singular S2S 연동은 추가 세션 매개변수가 필요한 고급 기능을 지원합니다. 고급 기능: 심링크, SKAdNetwork 및 크로스 디바이스 추적 요구사항에 대한 고급 S2S 옵션을 검토하십시오.
고급 기능: 딥 링크, SKAdNetwork 및 크로스 디바이스 추적 요구 사항에 대해서는 고급 S2S옵션 을 검토하십시오.
API 엔드포인트 사양
SESSION 엔드포인트는 쿼리 매개변수에 기기, 애플리케이션 및 어트리뷰션 데이터를 포함하는 GET 요청을 수락합니다.
엔드포인트 URL
기본 URL 및 메서드
GET https://s2s.singular.net/api/v1/launch
요청 형식:
GET /api/v1/launch?param1=value1¶m2=value2
요청 본문: 요청 본문을 제공하지 마십시오—모든 매개변수는 GET 메서드를 사용하여 URL 쿼리 매개변수로 전송해야 합니다.
필수 매개변수
모든 SESSION 요청에는 적절한 값과 형식으로 다음 필수 매개변수가 포함되어야 합니다.
API 인증
SDK 키
| 매개변수 | 유형 | 설명 |
|---|---|---|
a
|
string
|
API 인증을 위한 Singular SDK 키. 검색 위치: Singular UI → 메인 메뉴 → 개발자 도구
예시: 중요: 리포팅 API 키를 사용하지 마십시오—요청이 거부됩니다. |
기기 식별자
플랫폼별 식별자
기기 식별자는 플랫폼 및 가용성에 따라 다릅니다. 해당 플랫폼에 적용 가능한 모든 식별자를 포함하십시오.
| 매개변수 | 플랫폼 | 설명 |
|---|---|---|
idfa
|
iOS |
광고주 식별자(IDFA) 광고 추적 및 캠페인 기여도 분석을 가능하게 합니다. ATT 요구 사항: iOS 14.5 이상에서는 앱 추적 투명성 프레임워크를 통한 사용자 동의가 필요합니다.
예시: |
idfv
|
iOS |
Identifier for Vendors (IDFV) 동일 공급업체의 모든 앱에서 일관되게 유지됩니다. 항상 필수: ATT 상태나 IDFA 사용 가능 여부와 관계없이 반드시 포함되어야 함
예시: |
aifa
|
Android (Google Play) |
Google 광고 ID(GAID)는 Android에서 사용자가 재설정 가능한 광고 추적을 가능하게 합니다.
예시: |
asid
|
Android (Google Play) |
Android 앱 세트ID 동일 개발자의 앱 간에 개인정보 보호를 고려한 추적을 제공합니다. 항상 필수: GAID 유무와 관계없이 Google Play 기기에서 반드시 포함되어야 합니다. 항상 필요: GAID 사용 가능 여부와 관계없이 Google Play 기기에 반드시 포함되어야 함
예시: |
amid
|
Android (Amazon) |
Amazon AdvertisingID Google Play 서비스가 없는 Amazon 기기용.
예시: |
oaid
|
Android (중국 OEM) |
Google Play 서비스가 없는 중국산 기기용 오픈 광고 식별자(OAID) (화웨이, 샤오미, OPPO 등).
예시: |
andi
|
Android (비-Google Play) |
Android ID는 기기에서 생성된 64비트 식별자입니다. 제한된 사용: Google Play 기기에서는 사용 금지—대신 AIFA 및 ASID 사용. 다른 식별자가 없으며 앱이 Google Play를 통해 배포되지 않은 경우에만 전송. [구글 플레이를 통해 배포되지 않은 경우에만 사용 가능]
예시: |
sdid
|
PC, Xbox, PlayStation, Nintendo, MetaQuest, CTV |
Singular 기기 ID는 클라이언트에서 생성된 UUIDv4로, 유일한 앱 설치를 나타냅니다. 주 식별자: PC 및 콘솔 애플리케이션에 사용되는 유일한 기기 식별자
예시: |
sing
|
기업 전용 |
표준 식별자를 사용할 수 없는 특수 사용 사례를 위한 클라이언트 정의 식별자. 제한됨: 엔터프라이즈 고객 전용— Singular 솔루션 엔지니어가 앱별로 활성화해야 함. 자세한 내용은 CSM에 문의하십시오.
예시: |
기기 매개변수
기기 정보
| 매개변수 | 설명 |
|---|---|
p
|
애플리케이션의 플랫폼. 허용 값 (대소문자 구분):
예: |
ip
|
장치의 공용 IPv4 IP 주소. IPv6 지원되나 광고 네트워크와의 속성 호환성을 위해 IPv4 권장.
예시: |
ve
|
세션 시점의 기기 OS 버전.
예시: |
maiOS, Android |
기기 제조사(제조사명). 반드시
예시: |
moiOS, Android |
기기 모델.
예시: |
lciOS, Android |
IETF 로케일 태그—언어 및 국가 코드 두 글자를 밑줄(-)으로 구분.
예시: |
bdiOS, Android |
URL 인코딩된 기기 빌드 식별자.
예: |
애플리케이션 매개변수
앱 정보
| 매개 변수 | 설명 |
|---|---|
i
|
앱 식별자(대소문자 구분).
예시: |
app_v
|
애플리케이션 버전.
예시: |
install
|
세션이 설치 또는 재설치 후 첫 세션인지 여부를 나타냅니다. 또는 재설치.
필요 목적: 재설치 추적 기능
예시: |
install_timeiOS, Android |
첫 앱 설치 시점의 유닉스 타임스탬프.
예시: |
update_timeiOS, Android |
마지막 앱 업데이트의 유닉스 타임스탬프.
예시: |
att_authorization_statusiOS |
앱 추적 투명성(ATT) 상태 코드(iOS 14.5 이상). 상태 값:
항상 필요: ATT가 구현되지 않은 경우에도
예시: |
사기 방지 매개변수
설치 소스 검증
| 매개변수 | 설명 |
|---|---|
install_sourceAndroid, PC |
소스 패키지 이름 또는 스토어 식별자를 설치합니다. Android:소스 패키지 이름 설치
Android 예시: PC 지원 스토어:
|
install_receiptiOS |
사기 검증을 위한 Base64 인코딩된 iOS 설치 영수증.
예시(축약): |
딥 링크 매개 변수
딥 링크 지원
| 매개 변수 | 설명 |
|---|---|
openuriiOS, Android |
앱을 실행한 URL 인코딩 딥 링크, 유니버설 링크 또는 앱 링크.
원본 URL:
인코딩된 예시: |
ddl_enablediOS, Android |
응답에 지연 딥 링크 URL을 기대하는지 여부를 나타냅니다.
예시 응답:
|
singular_link_resolve_requirediOS, Android |
Singular 짧은 링크를 긴 링크로 변환해 달라는 요청입니다.
예시 응답:
|
고급 어트리뷰션 매개변수
플랫폼 어트리뷰션 향상
| 매개변수 | 설명 |
|---|---|
install_refAndroid (Google Play) 네이티브 PC (Google Play 게임) |
JSON URL 인코딩된 Google 설치 리퍼러 정보. Android 및 Google Play Games PC 설치에 대해 가장 정확한 어트리뷰션을 제공합니다. Android JSON 구조:
네이티브 PC JSON 구조:
필수 적용 대상:
추가 정보:
URL 인코딩 예시: |
meta_refAndroid (Google Play) |
2025년 6월 18일 기준:Meta Advanced Mobile Measurement(AMM) Meta 설치 리퍼러 구현이 더 이상 필요하지 않습니다. AMM이 활성화된 경우 권장하지 않습니다. 세분화된 사용자 수준 어트리뷰션 데이터를 위한 JSON URL 인코딩된 Meta Install Referrer. JSON 구조:
자세히 알아보기: Meta Referrer FAQ |
attribution_tokeniOS |
AdServices 프레임워크의 Apple Search Ads 어트리뷰션 토큰 (iOS 14.3 이상). 사용 방법: 설치/재설치 후 첫 앱 실행 시attributionToken() 호출.
예시 (축약): |
선택적 매개변수
선택적 매개변수는 추적 기능을 강화하고 고급 기능을 지원합니다. .
타임스탬프 매개변수
| 매개변수 | 설명 |
|---|---|
utime
|
세션의 10자리 유닉스 타임스탬프.
예시: |
umilisec
|
밀리초를 포함한 13자리 유닉스 타임스탬프.
예: |
네트워크 및 위치 매개변수
| 매개 변수 | 설명 |
|---|---|
use_ip
|
제한 사항:
예시: |
country
|
ISO 3166-1alpha-2 2자리 국가 코드.
필요 시점: IP 주소가 없거나
예시: |
ua
|
URL 인코딩된 사용자 에이전트 문자열.
원본:
인코딩된 형태:
|
ciOS, Android |
네트워크 연결 유형.
허용 값:
예시: |
cniOS, Android |
인터넷 공급자의 통신사 이름.
예시: |
사용자 정의 속성
| 매개 변수 | 설명 |
|---|---|
global_properties
|
사용자 정의 키-값 쌍이 포함된 URL 인코딩된 JSON 객체. 제한 사항:
JSON:
URL 인코딩:
|
제거 추적 지원
| 매개변수 | 설명 |
|---|---|
apns_tokeniOS |
16진수 인코딩된 Apple 푸시 알림 서비스(APNs) 기기 토큰.
예시:
|
fcmAndroid |
Firebase Cloud Messaging 기기 토큰.
예시:
|
데이터 개인정보 보호 매개변수
| 매개변수 | 설명 |
|---|---|
data_sharing_options
|
데이터 공유에 대한 최종 사용자의 동의를 URL 인코딩한 JSON. 모든 후속 SESSION 및 EVENT 요청에 지속적이며 전달되어야 함. 사용자 동의(옵트인): 사용자 동의(옵트인):
사용자 거부(옵트아웃):
URL 인코딩 예시:
|
dntiOS, Android |
추적 금지 상태.
예시: |
dntoffiOS, Android |
추적 금지 기능이 꺼져 있는지 여부를 나타냅니다.
예시: |
크로스 디바이스 지원
| 매개 변수 | 설명 |
|---|---|
custom_user_id
|
크로스 디바이스 추적을 위한 내부 사용자 ID.
예: |
SKAdNetwork 지원
| 매개 변수 | 설명 |
|---|---|
skan_conversion_valueiOS |
세션 시간 기준 최신 SKAdNetwork 전환 값. 자세히 알아보기: SKAdNetwork 구현
예시: |
skan_first_call_timestampiOS |
SKAdNetwork API 첫 호출 시점의 유닉스 타임스탬프.
예: |
skan_last_call_timestampiOS |
세션 시간 기준 SKAdNetwork API에 대한 가장 최근 호출의 유닉스 타임스탬프. 예시: xml-ph-0000@deepl.internal
예시: |
Google Ads ICM 지원 (베타)
| 매개변수 | 설명 |
|---|---|
odm_infoiOS |
Google Ads 연동 전환 측정(베타)에 필수적입니다. Google Ads ICM 문서 |
odm_erroriOS |
Google Ads 연동 전환 측정(베타)에 필수적입니다. (Beta). |
요청 예시
샘플 코드는 여러 프로그래밍 언어에 걸친 SESSION 엔드포인트 연동을 보여줍니다.
참고: 코드 예제에는
필수 매개변수가 모두 포함되지 않을 수 있습니다.
실제 운영 환경 적용 전 전체 매개변수 목록을 반드시 확인하십시오.
개발/테스트 시 고유한 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',
'aifa': '8ecd7512-2864-440c-93f3-a3cabe62525b',
'asid': 'edee92a2-7b2f-45f4-a509-840f170fc6d9',
'install': 'true',
'n': 'MyCoolAppName',
'bd': 'Build/13D15',
'app_v': '1.2.3',
'openuri': 'myapp://home/page?queryparam1=value1',
'ddl_enabled': 'true',
'install_source': 'com.android.vending',
'install_time': 1510040127,
'update_time': 1510090877
}
response = requests.get('https://s2s.singular.net/api/v1/launch', params=params)
print(response.json())
cURL 예시
curl -G "https://s2s.singular.net/api/v1/launch" \
--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 "aifa=8ecd7512-2864-440c-93f3-a3cabe62525b" \
--data-urlencode "asid=edee92a2-7b2f-45f4-a509-840f170fc6d9" \
--data-urlencode "install=true" \
--data-urlencode "n=MyCoolAppName" \
--data-urlencode "bd=Build/13D15" \
--data-urlencode "app_v=1.2.3" \
--data-urlencode "openuri=myapp://home/page?queryparam1=value1" \
--data-urlencode "ddl_enabled=true" \
--data-urlencode "install_source=com.android.vending" \
--data-urlencode "install_time=1510040127" \
--data-urlencode "update_time=1510090877"
HTTP 예시
GET /api/v1/launch
?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
&aifa=8ecd7512-2864-440c-93f3-a3cabe62525b
&asid=edee92a2-7b2f-45f4-a509-840f170fc6d9
&install=true
&n=MyCoolAppName
&bd=Build%2F13D15
&app_v=1.2.3
&openuri=myapp%3A%2F%2Fhome%2Fpage%3Fqueryparam1%3Dvalue1
&ddl_enabled=true
&install_source=com.android.vending
&install_time=1510040127
&update_time=1510090877 HTTP/1.1
Host: s2s.singular.net
Accept: application/json
Java 예시
// Base URL
String baseUrl = "https://s2s.singular.net/api/v1/launch";
// 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("aifa", "8ecd7512-2864-440c-93f3-a3cabe62525b");
params.put("asid", "edee92a2-7b2f-45f4-a509-840f170fc6d9");
params.put("install", "true");
params.put("n", "MyCoolAppName");
params.put("bd", "Build/13D15");
params.put("app_v", "1.2.3");
params.put("openuri", "myapp://home/page?queryparam1=value1");
params.put("ddl_enabled", "true");
params.put("install_source", "com.android.vending");
params.put("install_time", "1510040127");
params.put("update_time", "1510090877");
// 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();
응답 코드 및 오류
SESSION 엔드포인트는 요청 성공 또는 실패를 나타내는 HTTP 상태 코드와 JSON 응답을 반환합니다.
전체 오류 문서: S2S 응답 코드 및 오류 처리
테스트 및 검증
Singular SDK 콘솔을 사용하여 실시간 데이터 검증을 통해 프로덕션 배포 전 S2S 연동을 확인하십시오.
테스트 절차
종단 간 검증
- 테스트 기기 등록: 기기 광고 ID 획득 후 Singular SDK 콘솔에추가
- 콘솔 로깅 활성화: 테스트 데이터 수집을 위해 SDK 콘솔에 기기 식별자 추가
-
개발용 앱 ID 사용: 앱 식별자를
개발 버전(예:
com.singular.app.dev)으로 재정의하여 테스트 데이터를 프로덕션 데이터와 분리 - 앱 실행: 종료된 상태에서 앱을 열어 세션을 트리거
- 클라이언트 데이터 검증: 앱이 모든 필수 Singular 데이터 포인트를 서버로 전송하는지 확인
-
서버 요청 확인: 서버가 모든 필수 매개변수와 함께
https://s2s.singular.net/api/v1/launch로 SESSION 요청을 전송하는지 확인 - SDK 콘솔 확인: 몇 초 내에 SESSION 이벤트가 SDK 콘솔에 표시되어야 함
- 테스트 반복: 앱 진입 및 포그라운드 작업 시마다 SESSION이 트리거되는지 검증
중요 검증: 앱 실행/전경 모드 시 어떤 이벤트 요청보다 먼저 SESSION 이벤트가 발생하는지 확인. 순서 오류 시 어트리뷰션 오류 발생.
성공 지표: SDK 콘솔에 SESSION이 표시되면 엔드투엔드 연동 테스트를 성공적으로 완료한 것입니다!
추가 리소스
테스트 문서
종합 테스트 가이드: S2S 연동 테스트 가이드