요약: URL을 사용하여 CSV 파일에서 앱스플라이어 집약형 리포트를 얻습니다.
Pull API 로데이터를 찾고 계십니까?
Pull API 종합 데이터 특성
- 보고서는 CSV 파일로 반환됩니다.
- 데이터 최신성은 데이터 내보내기 페이지 및 개요 대시보드 페이지에서 동일한 리포트와 같습니다. 비용은 몇 시간 지연으로 업데이트될 수 있으며 비용 데이터를 제공하는 파트너에 따라 비용이 달라질 수 있습니다.
- 사용 가능한 옵션별 필터: 미디어소스 및 날짜 범위.
- Pull API의 추가 기능은 다음과 같습니다.
- 어트리뷰션 터치 유형으로 필터링 가능
- 시간대 선택 가능
- Pull API는 계정 사용자와 BI 개발자가 사용하기에 적합합니다.
Pull API를 통해 사용 가능한 집약형 성과 리포트
카테고리 | UA | 리타게팅* | Protect360 |
---|---|---|---|
파트너 (미디어 소스) | ✓ | ✓ | ✓ |
파트너 - 날짜별 |
✓ | ✓ | ✓ |
일별 |
✓ | ✓ | ✓ |
지역 |
✓ | ✓ | ✓ |
지역별 날짜별 리포트 |
✓ | ✓ | ✓ |
* 리타겟팅 리포트의 경우, URI에 |
관련 읽을거리:
용어
용어 | 설명 |
---|---|
Pull API |
URI를 사용하여 CSV 리포트를 다운로드 하는 솔루션. |
API 호출(call) 또는 호출 |
브라우저 주소창에 붙여 넣거나 스크립트를 사용하여 URI를 앱스플라이어에 전송. |
URI |
|
계정 사용자용 안내서
URI 템플릿
- dev hub에서 확인되는 URI 템플릿은 앱 ID와 보고서 유형 값이 채워져 있습니다.
- 기간의 시작과 끝 날짜를 편집해야 하는 플레이스홀더를 가지고 있습니다.
- URI에서 물음표 (?) 오른쪽 부분은 파라미터를 포함합니다. 각 파라미터는 앤드 기호 (&)로 시작합니다. 파라미터는 조회 기준을 설정하고, 포함할 추가 필드, 통화 및 시간대를 지정하는데 사용됩니다. 예를 들어, 종합 리포트에서 특정 미디어 소스로 조회 기준을 설정하려면, media_source 파라미터를 사용하십시오:
&media_source=facebook
- Pull API에 대해 더 살펴보려면, 이어지는 안내 설명을 참고하십시오.
Pull API 리포트 내려받기 설명서
시작하기 전에:- 어드민 사용자에게 풀(Pull) API 토큰을 제공해 줄 것을 요청하십시오.
개발 허브에서 리포트를 다운로드하려면:
-
앱스플라이어 개발 허브 API 참조
-
왼쪽 메뉴에서 리포트 유형을 선택합니다.
예를 들어 로데이터 리포트(논오가닉) > 인스톨.
모든 리포트 유형 목록은 아래 표를 참조하십시오. - 모든 필수 필드를 작성하십시오
- URI 템플릿이 오른쪽에 표시됩니다.
- 복사 아이콘을 클릭하여 URI를 복사합니다.
- 브라우저에서 새 탭을 열고 URI를 붙여 넣습니다.
- <Enter> 키를 눌러 API 호출을 보냅니다.
리포트가 다운로드됩니다.
리포트 | 설명 | 업데이트 빈도 |
---|---|---|
로데이터 리포트 (논오가닉) | ||
인스톨 | 논오가닉 인스톨을 기록합니다. 사용자가 앱을 처음 열 때 레코드가 생성됩니다. |
실시간 |
인앱 이벤트 | 사용자가 수행한 이벤트를 기록합니다. |
실시간 |
앱 삭제 | 사용자가 앱을 삭제할 때 기록합니다. |
일별 |
리인스톨 |
앱을 삭제한 후 UA 미디어 소스에 참여하고 리어트리뷰션 기간 동안 앱을 다시 인스한 사용자를 기록합니다. | 실시간 |
로데이터 리포트(오가닉) |
||
오가닉 인스톨 |
사용자가 앱을 처음 열었을 때를 기록합니다. |
계속 |
오가닉 인앱 이벤트 |
사용자가 수행한 이벤트에 대한 세부 정보를 기록합니다. |
계속 |
오가닉 앱 삭제 |
앱을 삭제하는 사용자를 기록합니다. |
일별 |
오가닉 앱 리인스톨 |
리인게이지먼트 기간 동안 리타게팅 미디어 소스로 인한 사용자의 광고 수익을 기록합니다. |
일별 |
광고 수익 로데이터 |
||
어트리뷰션된 광고 수익 |
미디어 소스로 어트리뷰트한 사용자의 광고 수익을 기록합니다. | 일별 |
오가닉 광고 수익 | 미디어 소스에 어트리뷰트되지 않은 사용자의 광고 수익을 기록합니다. | 일별 |
프로텍트360 프로드(fraud) | ||
인스톨 | 사기로 식별되어 미디어 소스에 어트리뷰트되지 않은 인스톨을 기록합니다. | 실시간 |
포스트 어트리뷰션 인스톨 | 사기 설치로 한 인해 전허 어트리뷰트되지 않은 인앱이벤트를 기록합니다. | 실시간 |
인앱 이벤트 | Protect360에서 사기로 식별된 인앱이벤트를 기록합니다. | 일별 |
포스트 어트리뷰션 인앱 이벤트 | 인스톨 자체와 상관없이 미디어 소스에 어트리뷰트되거나 사기로 판단된 후 사기로 식별된 인스톨에 대한 인앱이벤트를 기록합니다. | 일별 |
클릭 | Protect360에 의해 차단된 사용자가 수행한 클릭을 기록합니다. | 일별 |
차단된 인스톨 포스트백 | 인스톨이 차단된 미디어 소스로 전송된 포스트백 사본을 기록합니다. | 실시간 |
포스트백 | ||
인스톨 포스트백 | 사용자가 앱을 처음 열 때 생성된 인스톨 이벤트를 기록합니다. | 일별 |
인앱 이벤트 포스트백 | 미디어 소스로 전송된 인앱이벤트 포스트백을 기록합니다. | 일별 |
리타게팅 인앱이벤트 포스트백 | 리인게이지먼트 기간 동안 사용자가 수행한 인앱이벤트를 기록합니다. | 실시간 |
리타게팅 전환 포스트백 | 리인게이지먼트 기간 동안 사용자가 수행한 인앱이벤트를 기록합니다. | 실시간 |
종합 데이터 Pull API 파라미터
종합 리포트 URI 및 파라미터
종합 URI 필수 파라미터
파라미터 | 설명 |
---|---|
api_token | API 전달자 인증 토큰입니다. |
from |
|
활용 |
종료일. from 으로 부터 시작해서 마치는 날.
|
종합 데이터의 선택적 필터와 표시 파라미터 (프로텍트360 제외)
파라미터 | 설명 |
---|---|
media_source |
특정 미디어 소스로 제한 (필터)하는데 사용합니다.
|
attribution_touch_type |
이 파라미터를 다음 예시처럼 설정하여 뷰-쓰루 어트리뷰션 (view-through attribution, VTA) KPI를 확인합니다. 예시: |
currency |
수익과 비용의 통화. Pull API 종합 리포트는 항상 앱 별 통화를 사용합니다. |
reattr |
리타게팅 전환 데이터 얻기.
|
시간대 |
[기본값] UTC를 사용하여 데이터가 반환됩니다.
시간대 선택 관련 참고 사항
|
구글 애즈로 필터한 리포트
https://hq.appsflyer.com/export/com.greatapp/partners_report/v5?
from=2018-04-09&to=2018-05-09&media_source=googleadwords_int
페이스북으로 필터한 리포트
https://hq.appsflyer.com/export/com.greatapp/partners_report/v5?
from=2018-04-09&to=2018-05-09&media_source=facebook
파라미터 | 설명 |
---|---|
URI |
|
pid |
리포트를 특정 미디어 소스로 필터하려면, |
시간대 |
데이터를 반환 시, 사용되는 시간대를 선택합니다. 만약 timezone 이 전송되지 않으면, 데이터는 UTC를 기반으로 반환됩니다. 템플릿은 timezone 파라미터를 포함합니다. 예시: |
KPI |
프로텍트360 파라미터는 Pull API 및 마스터 API와 동일합니다.
|
뷰-쓰루 어트리뷰션 (VTA) KPI
- VTA KPI를 가져오려면, 예시에 설명된 대로 파라미터 attribute_touch_type=impression 을 Pull API 종합 리포트 URI에 추가하십시오.
- 이 파라미터를 제공되는 모든 종합 리포트에 사용할 수 있습니다. 사용자 인터페이스에서 URL을 복사하여 파라미터에 붙이십시오.
- 또한 &media_source 파라미터를 추가하여, 다음 예시에 설명된 것처럼, 리포트를 특정 미디어 소스로만 필터할 수도 있습니다.
- 클릭 수, 노출 수 및 비용 API와 같은 일부 VTA KPI에는 해당하는 값이 없고, 대신 N/A 값이 표시됩니다.
예 | URI 예시 |
---|---|
VTA 만 | https://hq.appsflyer.com/export/{app_id}/partners_report/v5?from=yyyy-mm-dd&to=yyyy-mm-dd&attribution_touch_type=impression |
VTA와 미디어 소스 |
https://hq.appsflyer.com/export/{app_id}/partners_report/v5?from=yyyy-mm-dd&to=yyyy-mm-dd&attribution_touch_type=impression&media_source=example_ad_network |
개발자를 위한 Pull API
구현 원칙
선행 조건:
계정 사용자를 위한 Pull API 안내서를 숙지하십시오.
고려할 점:
- 제공되는 각 리포트 유형에 대해 dev hub에 템플릿 URI가 있습니다. 왼쪽 메뉴에서 리포트 유형을 선택합니다.
- 필요한 데이터를 얻도록 템플릿을 수정합니다. 예를 들어, 날짜 범위를 설정하고 파라미터를 사용해 필터링합니다.
- 로데이터 및 종합 데이터 리포트의 파라미터는 서로 다릅니다. 리포트 섹션에 상세 설명되어 있습니다.
경로 |
|
경로 파라미터 |
|
HTTP 메서드 |
|
파라미터 | 설명 |
---|---|
URI 예시 |
|
api_token |
|
다른 파라미터 |
파라미터는 아래 상황에 따라 달라집니다. |
예
URI 호출 예시에 추가 파라미터가 포함되어 있습니다.
https://hq.appsflyer.com/export/example.app.com/installs_report/v5?
from=yyyy-mm-dd
&to=yyyy-mm-dd&additional_fields=keyword_id,store_reinstall,
deeplink_url,oaid,install_app_store,contributor1_match_type,
contributor2_match_type,contributor3_match_type,match_type
스크립트 예시
Pull API를 스크립트에 통합하여 데이터를 가져옵니다.
- 필요에 따라, 보고서 유형, 날짜 범위 및 필터 측면에서 스크립트를 편집하십시오.
- 아래 예시는 인스톨 보고서 기준입니다.
import okhttp3.*;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.util.concurrent.TimeUnit;
public class PullApi {
public static void main(String[] args){
String appID = "<APP_ID>";
String reportType = "<REPORT_TYPE>";
String from = "<FROM_DATE>";
String to = "<TO_DATE>";
String requestUrl = "https://hq.appsflyer.com/export/" + appID + "/" + reportType + "/v5?api_token=" + apiToken + "&from=" + from + "&to=" + to;
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
Request request = new Request.Builder()
.url(requestUrl)
.addHeader("Accept", "text/csv")
.build();
try {
Response response = client.newCall(request).execute();
if(response.code() != 200) {
if(response.code() == 404) {
System.out.println("There is a problem with the request URL. Please make sure it is correct");
}
else {
assert response.body() != null;
System.out.println("There was a problem retrieving the data: " + response.body().string());
}
} else {
assert response.body() != null;
String data = response.body().string();
BufferedWriter writer;
writer = new BufferedWriter(new FileWriter(appID + "-" + reportType + "-" + from + "-to-" + to + ".csv"));
writer.write("");
writer.write(data);
writer.close();
}
System.exit(0);
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
}
request = require('request');
const fs = require('fs');
const appID = '<APP_ID>';
const reportType = '<REPORT_TYPE>';
const from = '<FROM_DATA>';
const to = '<T0_DATE>';
const requestUrl = `https://hq.appsflyer.com/export/${appID}/${reportType}/v5?api_token=${apiToken}&from=${from}&to=${to}`;
request(requestUrl, (error, response, body) => {
if (error) {
console.log('There was a problem retrieving data:', error);
}
else if (response.statusCode != 200) {
if (response.statusCode === 404) {
console.log('There is a problem with the request URL. Make sure that it is correct');
} else {
console.log('There was a problem retrieving data:', response.body);
}
} else {
fs.writeFile(`${appID}-${reportType}-${from}-to-${to}.csv`, response.body, (err) => {
if (err) {
console.log('There was a problem writing to file: ', err);
} else {
console.log('File was saved');
}
});
}
});
import requests
app_id = '<APP_ID>'
report_type = '<REPORT_TYPE>'
params = {
'from': 'FROM_DATE',
'to': 'TO_DATE'
}
request_url = 'https://hq.appsflyer.com/export/{}/{}/v5'.format(app_id, report_type)
res = requests.request('GET', request_url, params=params)
if res.status_code != 200:
if res.status_code == 404:
print('There is a problem with the request URL. Make sure that it is correct')
else:
print('There was a problem retrieving data: ', res.text)
else:
f = open('{}-{}-{}-to-{}.csv'.format(app_id, report_type, params['from'], params['to']), 'w', newline='', encoding="utf-8")
f.write(res.text)
f.close()
using System;
using RestSharp;
using System.Text;
using System.Net;
using System.IO;
namespace Pull_API
{
class PullAPi
{
static void Main(string[] args)
{
var appID = "<APP_ID>";
var reportType = "<REPORT_TYPE>";
var from = "<FROM_DATE>";
var to = "<TO_DATE>";
var requestUrl = "https://hq.appsflyer.com/export/" + appID + "/" + reportType + "/v5?api_token=" + apiToken + "&from=" + from + "&to=" + to;
var client = new RestClient(requestUrl);
var request = new RestRequest(Method.GET);
request.AddHeader("Accept", "text/csv; charset=UTF-8");
IRestResponse response = client.Execute(request);
HttpStatusCode statusCode = response.StatusCode;
int numericStatusCode = (int)statusCode;
if(numericStatusCode != 200){
if(numericStatusCode == 404){
Console.WriteLine("There is a problem with the request URL. Make sure that it is correct.");
} else {
Console.WriteLine("There was a problem retrieving data: " + response.Content);
}
} else {
System.IO.File.WriteAllText(@"" + appID + "-" + reportType + "-" + from + "-to-" + to + ".csv", response.Content);
Console.WriteLine("Data retrieved succesfully");
}
}
}
}
<?
$appID = '<APP_ID>';
$reportType = '<REPORT_TYPE>';
$from = '<FROM_DATE>';
$to = '<TO_DATE>';
$query = http_build_query([
'from' => $from,
'to' => $to
]);
$requestUrl = 'https://hq.appsflyer.com/export/' . $appID . '/' . $reportType . '/v5?'.$query;
$report = $appID . '-' . $report . '-' . $from . '-to-' . $to;
$curl = curl_init($requestUrl);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_ENCODING, "");
curl_setopt($curl, CURLOPT_NOSIGNAL, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
curl_setopt($curl, CURLOPT_FAILONERROR, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 100);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
"cache-control: no-cache",
"Accept: text/csv; charset=UTF-8"
));
$response = curl_exec($curl);
$info = curl_getinfo($curl);
$err = curl_error($curl);
curl_close($curl);
var_dump($response);
if ($err) {
echo $info['http_code'];
echo "cURL Error #: " . $err . '. ';
if ($info['http_code'] == 404) {
echo 'There is a problem with the request URL. Make sure that it is correct';
}
if ($info['http_code'] == 401) {
echo 'There was a problem retrieving data: authentication failed.';
}
echo PHP_EOL;
} else {
$fp = fopen($report, 'w+');
fwrite($fp, $response);
fclose($fp);
echo $response;
}
?>
추가 정보
특성과 제한 사항
항목 | 설명 |
---|---|
필수 API 토큰 유형 |
![]() |
광고 네트워크 액세스 | N |
에이전시 액세스 | Y |
에이전시 투명성 | Y |
앱 별 통화 | Y |
앱 별 시간대 | Y |
비용 | 비용 데이터는 UA 캠페인용입니다. 캠페인(인스톨이 없는 캠페인)을 리타게팅하거나 비활성화하기 위한 것이 아닙니다. |
데이터 최신성 | 계속 |
과거 데이터 | Y |
논오가닉 데이터 | Y |
오가닉 데이터 | Y |
콜 수 제한 | |
사이즈 제한 |
일러두기! 로데이터에 대한 Pull API는 백만 행을 지원합니다. 집약형 데이터 리포트는 20만 행으로 제한됩니다. |
캠페인 이름 변경 | Pull API 리포트는 캠페인 이름 변경 기능을 지원하지 않습니다. |
API 오류 코드 및 트러블슈팅
상태 메시지 | 코드 | 증상/메시지 | 해결 방안 |
---|---|---|---|
OK | 200 | 빈 CSV 파일 |
|
OK |
200 |
|
URL에서 API 토큰을 찾을 수 없습니다. |
Bad request |
400 |
원시 리포트의 역사적 룩백은 90일로 제한됩니다. |
|
Bad request |
400 |
주어진 보고서 유형에 대해 API 호출 제한에 도달했습니다. |
- |
Unauthorized |
401 |
Supplied API token is invalid |
앱스플라이어 어드민 계정에게 현재 토큰을 요청하십시오. |
Unauthorized |
401 |
계정이 일시 중단될 수 있습니다. |
대시보드에 로그인하여 계정 상태를 확인하십시오. |
Not found |
404 |
앱스플라이어 404 오류 메시지 페이지가 표시됩니다. |
|