API를 통한 비용 연동이 되어 있지 않은 매체에 대해 매체 비용 데이터를 직접 업로드하고 업로드 상태를 조회할 수 있는 API입니다.
Authorization
에어브릿지 API의 보안 인증은 HTTP Request Header에 있는 Authorization Key에 API 토큰을 넣는 형식을 따르고 있습니다. 에어브릿지는 매번 API가 호출될 시 해당 토큰의 진실성 여부를 체크합니다.
호출의 예시는 아래와 같습니다.
curl -H "Authorization: AIRBRIDGE-API-KEY {API-TOKEN}"
API KEY는 대시보드 내 [Settings > Tokens]에서 확인할 수 있습니다.
Endpoint
비용 데이터 업로드 요청 및 요청 상태 조회를 위해서는 아래 Endpoint를 사용합니다.
https://api.airbridge.io/custom-data-upload/v1.0/cost/requests
비용 데이터 업로드 요청하기
비용 데이터를 CSV 포맷으로 업로드 요청하는 API로, Request Header 내 'Content-Type' 은 multipart/form-data 를 사용합니다.
Content-Type: multipart/form-data; charset=utf-8
Request Example
$ cat input.csv
date,channel,currency,campaign,impressions,clicks,cost
2022-07-01,naver_blog,KRW,신제품 바이럴 캠페인,6090,298,313.82
$ curl --location --request POST 'https://api.airbridge.io/custom-data-upload/v1.0/cost/requests/' \
--header 'Authorization: AIRBRIDGE-API-KEY df14d75ab891400ab1b6b3e491be840d' \
--form 'file=@"input.csv"'
Response Example
{
"requestId": "08844672-62d8-4da8-9d48-e14961651e0c",
"status": "uploaded",
"prevStatus": null,
"reason": null,
"createdAt": "2022-08-09T08:59:15",
"updatedAt": "2022-08-09T08:59:15"
}
Name | Description | Example |
---|---|---|
requestId | 업로드 요청에 대한 고유 ID로, 요청 시 마다 새로운 ID가 부여됩니다. 업로드 요청 상태 조회 시 해당 ID가 사용됩니다. | 08844672-62d8-4da8-9d48-e14961651e0c |
status | 업로드 요청에 대한 진행 상태값입니다. | ingested |
prevStatus | 현재 status 이전의 상태값입니다. | validated |
reason | status가 'failed'로 업로드 실패 이유에 대한 값입니다. | {"date": ["invalid date"]} |
createdAt | 요청이 생성된 날짜 및 시간입니다. | 2022-08-09T08:59:15 |
updatedAt | 업데이트가 진행된 날짜 및 시간입니다. | 2022-08-09T08:59:15 |
CSV 파일 포맷 및 스키마
CSV 파일 내 컬럼명 및 컬럼값
Category | Column Name | Type | Description | Required |
---|---|---|---|---|
Group by | date | string | 업로드 데이터가 기록된 날짜 * 'YYYY-MM-DD' 포맷의 데이터만 허용됩니다. * 과거 92일 이전의 날짜와 업로드 요청 시점보다 미래의 날짜는 업로드가 불가합니다. e.g. 2022-08-25 | Required |
Group by | channel | string | 업로드 데이터에 대한 채널값 * Integrated Channels의 경우 Airbridge 대시보드에서 사용되는 채널별 고유 영문 소문자로 입력합니다. * 비용 연동 지원 매체는 업로드가 불가합니다. | Required |
Group by | currency | string | ISO 4217에 따른 3자리 Currency 코드(대문자) e.g. KRW, USD | Required |
Group by | campaign | string | 업로드 데이터에 대한 캠페인값 | Required |
Metric | impressions | int | 업로드 데이터에 대한 노출수 * 자리수 구분을 위한 콤마(,)는 허용되지 않습니다. | Required |
Metric | clicks | int | 업로드 데이터에 대한 클릭수 * 자리수 구분을 위한 콤마(,)는 허용되지 않습니다. | Required |
Metric | cost | float | 업로드 데이터에 대한 비용 * 자리수 구분을 위한 콤마(,)는 허용되지 않습니다. | Required |
Group by | campaign_id | string | 업로드 데이터에 대한 캠페인 ID값 | Optional |
Group by | ad_group | string | 업로드 데이터에 대한 광고 그룹값 | Optional |
Group by | ad_group_id | string | 업로드 데이터에 대한 광고 그룹 ID값 | Optional |
Group by | ad_creative | string | 업로드 데이터에 대한 광고 소재값 | Optional |
Group by | ad_creative_id | string | 업로드 데이터에 대한 광고 소재 ID값 | Optional |
Group by | term | string | 업로드 데이터에 대한 키워드값 | Optional |
Group by | term_id | string | 업로드 데이터에 대한 키워드 ID값 | Optional |
Group by | ad_account | string | 업로드 데이터에 대한 광고 계정값 | Optional |
Group by | ad_account_id | string | 업로드 데이터에 대한 광고 계정ID값 | Optional |
Group by | sub_publisher | string | 업로드 데이터에 대한 하위 퍼블리셔값 | Optional |
Group by | sub_sub_publisher_1 | string | 업로드 데이터에 대한 하하위 퍼블리셔1값 | Optional |
Group by | sub_sub_publisher_2 | string | 업로드 데이터에 대한 하하위 퍼블리셔2값 | Optional |
Group by | sub_sub_publisher_3 | string | 업로드 데이터에 대한 하하위 퍼블리셔3값 | Optional |
Group by | country | string | 업로드 데이터에 대한 2자리 소문자 국가값 e.g. kr, us, gb, fr | Optional |
Group by | os_name | string | 업로드 데이터에 대한 OS 이름값 * 대시보드 내 Airbridge에서 측정한 데이터와 함께 분석하기 위해서는 Case-sensitive 에 유의하여 입력합니다. e.g. Android, iOS | Optional |
Sample CSV File
업로드 진행 상태 조회하기
비용 데이터 업로드 요청에 대한 진행 상태를 조회할 수 있는 API입니다. 비용 데이터 업로드 요청 API를 통해 발급받은 requestId를 Path Parameter로 입력하여 해당 요청 건에 대한 진행 상태를 조회합니다.
Request Example
curl "https://api.airbridge.io/custom-data-upload/v1.0/cost/requests/${requestId}" \
-H 'Authorization: AIRBRIDGE-API-KEY ${API_TOKEN}'
Name | Description | Example |
---|---|---|
requestId | 업로드 요청에 대한 고유 ID로, 매 요청마다 새로운 ID가 부여됩니다. 업로드 요청 상태 조회 시 해당 ID가 사용됩니다. | 08844672-62d8-4da8-9d48-e14961651e0c |
Response Example
// 성공 시 Response
{
"requestId": "08844672-62d8-4da8-9d48-e14961651e0c",
"status": "succeeded",
"prevStatus": "ingested",
"reason": null,
"createdAt": "2022-08-09T08:59:15",
"updatedAt": "2022-08-09T08:59:59"
}
// 실패 시 Response
{
"requestId": "846b78f9-1b6f-4ede-a253-619ca68fcebf",
"status": "failed",
"prevStatus": "uploaded",
"reason": "{\"date\": [\"invalid date\"]}",
"createdAt": "2022-08-24T11:54:18",
"updatedAt": "2022-08-24T11:54:17"
}
Name | Description | Example |
---|---|---|
requestId | 업로드 요청에 대한 고유 ID로, 요청 시 마다 새로운 ID가 부여됩니다. 업로드 요청 상태 조회 시 해당 ID가 사용됩니다. | 08844672-62d8-4da8-9d48-e14961651e0c |
status | 업로드 요청에 대한 진행 상태값입니다. | ingested |
prevStatus | 현재 status 이전의 상태값입니다. | validated |
reason | status가 'failed'로 업로드 실패 이유에 대한 값입니다. | {"date": ["invalid date"]} |
createdAt | 요청이 생성된 날짜 및 시간입니다. | 2022-08-09T08:59:15 |
updatedAt | 업데이트가 진행된 날짜 및 시간입니다. | 2022-08-09T08:59:15 |
Status
업로드 요청된 파일은 아래와 같은 프로세스로 진행되며, 각 상태값의 의미는 다음과 같습니다.
- 진행 프로세스: uploaded → validated → ingested → succeeded
Status | Description |
---|---|
uploaded | API를 통해 업로드가 완료된 상태 |
validated | 업로드한 파일의 Validation이 완료된 상태 |
ingested | 업로드한 파일을 DW에 반영한 상태로, 곧 이어서 Indexing이 시작될 예정 |
succeeded | 업로드한 파일이 Indexing까지 완료된 상태로, 10분 이내에 대시보드 리포트에서 확인 가능 |
failed | 업로드한 파일의 처리가 실패한 상태로, Response 중 'reason' 값을 참고하여 올바른 파일로 재업로드 필요 |
데이터 Overwrite 및 삭제
데이터 Ovewrite
비용 데이터 업로드 시 'date', 'channel', 'campaign' 3개 필드값을 기준으로 기존에 동일한 조합이 있는 경우 기존 데이터를 신규 데이터로 Overwrite합니다.
[예시 시나리오1]
1. 2022-08-03: date, channel, campaign, ad_group 레벨의 데이터 업로드
date | channel | campaign | ad_group | currency | clicks | impressions | cost |
---|---|---|---|---|---|---|---|
2022-08-01 | owned_website | retargeting_campaign | 2030_female | KRW | 1000 | 10000 | 100000 |
2022-08-01 | owned_website | retargeting_campaign | 2030_male | KRW | 800 | 12000 | 80000 |
2. 2022-08-04: date, channel, campaign 레벨의 데이터 업로드
date | channel | campaign | currency | clicks | impressions | cost |
---|---|---|---|---|---|---|
2022-08-01 | owned_website | retargeting_campaign | KRW | 2000 | 20000 | 150000 |
3. 최종 반영: 8월 4일 업로드 데이터 처리 시 'date', 'channel', 'campaign' 3개 필드값을 기준으로 8월 3일에 업로드한 동일 데이터가 있기 때문에 해당 데이터 대신 최종적으로 8월 4일 업로드 데이터만 남게됩니다. (ad group 값은 null)
date | channel | campaign | currency | clicks | impressions | cost |
---|---|---|---|---|---|---|
2022-08-01 | owned_website | retargeting_campaign | KRW | 2000 | 20000 | 150000 |
[예시 시나리오2]
1. 2022-08-03: date, channel, campaign 레벨의 데이터 업로드
date | channel | campaign | currency | clicks | impressions | cost |
---|---|---|---|---|---|---|
2022-08-01 | owned_website | retargeting_campaign | KRW | 1000 | 10000 | 100000 |
2. 2022-08-04: date, channel, campaign, ad_group 레벨의 데이터 업로드
date | channel | campaign | ad_group | currency | clicks | impressions | cost |
---|---|---|---|---|---|---|---|
2022-08-01 | owned_website | retargeting_campaign | 2030_female | KRW | 2000 | 20000 | 150000 |
3. 최종 반영: 8월 4일 업로드 데이터 처리 시 'date', 'channel', 'campaign' 3개 필드값을 기준으로 8월 3일에 업로드한 동일 데이터가 있기 때문에 해당 데이터 대신 최종적으로 8월 4일 업로드 데이터만 남게됩니다.
date | channel | campaign | ad_group | currency | clicks | impressions | cost |
---|---|---|---|---|---|---|---|
2022-08-01 | owned_website | retargeting_campaign | 2030_female | KRW | 2000 | 20000 | 150000 |
[예시 시나리오3]
1. 2022-08-03: date, channel, campaign, ad_group 레벨의 데이터 업로드
date | channel | campaign | ad_group | currency | clicks | impressions | cost |
---|---|---|---|---|---|---|---|
2022-08-01 | owned_website | promotion_campaign | 2030_female | KRW | 1200 | 15000 | 10000 |
2022-08-01 | owned_website | retargeting_campaign | 2030_female | KRW | 1000 | 10000 | 100000 |
2022-08-01 | owned_website | retargeting_campaign | 2030_male | KRW | 800 | 12000 | 80000 |
2. 2022-08-04: date, channel, campaign, ad_group 레벨의 데이터 업로드
date | channel | campaign | ad_group | currency | clicks | impressions | cost |
---|---|---|---|---|---|---|---|
2022-08-01 | owned_website | retargeting_campaign | 2030_male | KRW | 900 | 15000 | 90000 |
2022-08-01 | owned_website | ua_campaign | 2030_female | KRW | 1200 | 15000 | 120000 |
3. 최종 반영: 8월 4일 업로드 데이터 처리 시 'date', 'channel', 'campaign' 3개 필드값을 기준으로 8월 3일에 업로드 데이터 중 동일 데이터는 8월 4일의 데이터로 대체되며, 나머지 데이터는 그대로 남게됩니다.
date | channel | campaign | ad_group | currency | clicks | impressions | cost |
---|---|---|---|---|---|---|---|
2022-08-01 | owned_website | promotion_campaign | 2030_female | KRW | 1200 | 15000 | 10000 |
2022-08-01 | owned_website | retargeting_campaign | 2030_male | KRW | 900 | 15000 | 90000 |
2022-08-01 | owned_website | ua_campaign | 2030_female | KRW | 1200 | 15000 | 120000 |
데이터 삭제
기존에 업로드한 비용 데이터를 삭제하기 위해서는 동일한 Group by에 대해서 clicks, impressions, cost 메트릭의 값을 모두 0으로 설정하여 다시 업로드합니다.
유의 사항
- 현재 비용 데이터 업로드 요청 및 상태 조회 API는 오너, 사내마케터 권한 계정의 API Token으로만 사용 가능합니다.
- CSV 파일 내 컬럼명은 정해진 소문자 값만 허용됩니다.
- 비용 연동을 지원하는 매체에 대해서는 비용 데이터 업로드가 불가합니다. 업로드 미지원 매체는 아래 리스트를 참조 부탁드립니다.
- app_lovin
- apple.searchads
- criteo_new
- facebook.business
- google.adwords
- ironsource
- kakao.keywordad
- kakao
- mintegral
- naver.performance_da
- naver.searchad
- tiktok
- unityads
- 업로드된 Group by 값은 대시보드에서 조회 시 Case-sensitive하게 처리되므로, Airbridge에서 측정한 데이터 및 다른 데이터와 함께 조회하기 위해서는 데이터 업로드 시 대소문자에 유의합니다. (channel, currency, country, os_name 등)
예를 들어 Airbridge에서 측정한 모바일 OS Name은 각각 'Android', 'iOS'로 기록하고 있지만 직접 업로드한 데이터의 OS Name을 'android', 'ios'로 입력한 경우 대시보드 내 별개의 Row로 분리됩니다. - 한 요청의 CSV 파일에는 최대 10000개 row까지 허용됩니다.
- 한 요청의 CSV 파일의 최대 크기는 1MB입니다.
- 컬럼값으로 공백은 허용하지 않습니다. 값이 없는 메트릭의 경우 0으로 입력하여 업로드해야 합니다.
예를 들어 Cost 데이터는 있지만, Clicks, Impressions 데이터는 없는 경우 Clicks, Impression 컬럼을 추가하되 값을 모두 0으로 입력하여 업로드합니다. - string 타입의 컬럼값은 1글자 이상, 256글자 이하로 제한됩니다.
- 컬럼명 및 컬럼값 앞뒤로 공백이 없도록 유의합니다.