> ## Documentation Index
> Fetch the complete documentation index at: https://help.airbridge.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Metric Data 업로드 요청하기

메트릭 데이터를 CSV 포맷으로 업로드 요청합니다.

<h3 id="header-2">
  Header
</h3>

Request Header 내 'Content-Type' 은 multipart/form-data 를 사용합니다.

```header-multipart theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
Content-Type: multipart/form-data; charset=utf-8
```

<h3 id="csv-파일-포맷-및-스키마-2">
  CSV 파일 포맷 및 스키마
</h3>

<h4 id="csv-파일-내-컬럼명-및-컬럼값-2">
  CSV 파일 내 컬럼명 및 컬럼값
</h4>

<div style={{ overflowX: 'auto' }}>
  <table style={{ display: 'table' }}>
    <thead>
      <tr>
        <th>
          Category
        </th>

        <th>
          Column Name
        </th>

        <th>
          Type
        </th>

        <th>
          Description
        </th>

        <th>
          Required
        </th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>
          Group by
        </td>

        <td>
          date
        </td>

        <td>
          string
        </td>

        <td>
          데이터가 기록된 날짜, 'YYYY-MM-DD' 포맷의 데이터만 허용합니다
        </td>

        <td>
          **Required**
        </td>
      </tr>

      <tr>
        <td>
          Group by
        </td>

        <td>
          channel
        </td>

        <td>
          string
        </td>

        <td>
          광고 채널. 에어브릿지와 연동된 채널은 [에어브릿지 대시보드에서 사용되는 이름](https://docs.google.com/spreadsheets/d/13ThNnryqRmZQwJVecM8lZ2OB7LzA8s3cwLlQBGpbXLg/edit#gid=1415221276\&range=B:B)으로 입력해야 합니다
        </td>

        <td>
          **Required**
        </td>
      </tr>

      <tr>
        <td>
          Group by
        </td>

        <td>
          event\_category
        </td>

        <td>
          string
        </td>

        <td>
          업로드 데이터의 카테고리 명칭
        </td>

        <td>
          **Required**
        </td>
      </tr>

      <tr>
        <td>
          Metric
        </td>

        <td>
          event\_value
        </td>

        <td>
          double
        </td>

        <td>
          업로드 데이터의 값
        </td>

        <td>
          **Required**
        </td>
      </tr>

      <tr>
        <td>
          Group by
        </td>

        <td>
          campaign
        </td>

        <td>
          string
        </td>

        <td>
          캠페인 이름
        </td>

        <td>
          Optional
        </td>
      </tr>

      <tr>
        <td>
          Group by
        </td>

        <td>
          ad\_group
        </td>

        <td>
          string
        </td>

        <td>
          광고 그룹 이름
        </td>

        <td>
          Optional
        </td>
      </tr>

      <tr>
        <td>
          Group by
        </td>

        <td>
          ad\_creative
        </td>

        <td>
          string
        </td>

        <td>
          광고 소재
        </td>

        <td>
          Optional
        </td>
      </tr>

      <tr>
        <td>
          Group by
        </td>

        <td>
          content
        </td>

        <td>
          string
        </td>

        <td>
          광고 콘텐츠 종류
        </td>

        <td>
          Optional
        </td>
      </tr>

      <tr>
        <td>
          Group by
        </td>

        <td>
          event\_source
        </td>

        <td>
          string
        </td>

        <td>
          데이터 출처<br />- app<br />- web<br />- tracking\_link
        </td>

        <td>
          Optional
        </td>
      </tr>

      <tr>
        <td>
          Group by
        </td>

        <td>
          os\_name
        </td>

        <td>
          string
        </td>

        <td>
          OS 이름
        </td>

        <td>
          Optional
        </td>
      </tr>

      <tr>
        <td>
          Group by
        </td>

        <td>
          term
        </td>

        <td>
          string
        </td>

        <td>
          광고 키워드
        </td>

        <td>
          Optional
        </td>
      </tr>

      <tr>
        <td>
          Group by
        </td>

        <td>
          country
        </td>

        <td>
          string
        </td>

        <td>
          2문자 국가 코드
        </td>

        <td>
          Optional
        </td>
      </tr>

      <tr>
        <td>
          Group by
        </td>

        <td>
          currency
        </td>

        <td>
          string
        </td>

        <td>
          3문자 통화 코드(ISO 4217)
        </td>

        <td>
          Optional
        </td>
      </tr>

      <tr>
        <td>
          Group by
        </td>

        <td>
          sub\_publisher
        </td>

        <td>
          string
        </td>

        <td>
          하위 광고 채널 이름
        </td>

        <td>
          Optional
        </td>
      </tr>

      <tr>
        <td>
          Group by
        </td>

        <td>
          sub\_sub\_publisher\_1
        </td>

        <td>
          string
        </td>

        <td>
          하하위 광고 채널1 이름
        </td>

        <td>
          Optional
        </td>
      </tr>

      <tr>
        <td>
          Group by
        </td>

        <td>
          sub\_sub\_publisher\_2
        </td>

        <td>
          string
        </td>

        <td>
          하하위 광고 채널2 이름
        </td>

        <td>
          Optional
        </td>
      </tr>

      <tr>
        <td>
          Group by
        </td>

        <td>
          sub\_sub\_publisher\_3
        </td>

        <td>
          string
        </td>

        <td>
          하하위 광고 채널 이름
        </td>

        <td>
          Optional
        </td>
      </tr>

      <tr>
        <td>
          Group by
        </td>

        <td>
          is\_first\_event\_per\_device\_id
        </td>

        <td>
          boolean
        </td>

        <td>
          디바이스 ID 기준 각 이벤트의 최초 발생 여부<br />- true, TRUE: 최초로 발생한 이벤트<br />- false, FALSE: 추가로 발생한 이벤트
        </td>

        <td>
          Optional
        </td>
      </tr>

      <tr>
        <td>
          Group by
        </td>

        <td>
          is\_first\_event\_per\_user\_id
        </td>

        <td>
          boolean
        </td>

        <td>
          유저 ID 기준 각 이벤트의 최초 발생 여부<br />- true, TRUE: 최초로 발생한 이벤트<br />- false, FALSE: 추가로 발생한 이벤트
        </td>

        <td>
          Optional
        </td>
      </tr>
    </tbody>
  </table>
</div>

하나의 CSV 파일 내에 Group by와 event\_category가 모두 동일한 Row들이 존재할 경우, 해당 데이터는 리포트에서 동일한 Row들이 합쳐진 값으로 표시됩니다.

* 업로드 데이터

| date       | channel        | campaign              | event\_category | event\_Value |
| ---------- | -------------- | --------------------- | --------------- | ------------ |
| 2022-08-01 | owned\_website | retargeting\_campaign | self\_event     | 150000       |
| 2022-08-01 | owned\_website | retargeting\_campaign | self\_event     | 100000       |
| 2022-08-01 | owned\_website | retargeting\_campaign | self\_event     | 10000        |

* 리포트에 나오는 데이터

| date       | channel        | campaign              | event\_category | event\_value |
| ---------- | -------------- | --------------------- | --------------- | ------------ |
| 2022-08-01 | owned\_website | retargeting\_campaign | self\_event     | 251000       |

<h4 id="sample-csv-file-2">
  Sample CSV File
</h4>

* [CSV File 다운로드](https://static.airbridge.io/samples/Self-serve_sample.csv)

<div id="주의하세요-2" />

<Danger>
  **주의하세요**

  대소문자 입력에 주의해 주세요. Type이 string인 칼럼의 데이터들은 대소문자를 구분하여 인식합니다.

  Airbridge에서 측정한 모바일 OS Name은 각각 'Android', 'iOS'로 기록하고 있지만 직접 업로드한 데이터의 OS Name을 'android', 'ios'로 입력한 경우 대시보드 내 별개의 Row로 분리됩니다. 따라서 Group by 결과를 위해서 ‘Android’, 'iOS’로 기록해주셔야 합니다.
</Danger>

<h3 id="데이터-overwrite-및-삭제-2">
  데이터 Overwrite 및 삭제
</h3>

<h4 id="데이터-ovewrite-2">
  데이터 Ovewrite
</h4>

Self-serve 데이터 업로드 시 'date', 'channel', 'event\_category' 3개 필드값을 기준으로 기존에 동일한 조합이 있는 경우 기존 데이터를 신규 데이터로 Overwrite합니다.

**예시 시나리오 1**

**1. 2022-08-03:** date, channel, campaign, ad\_group 레벨의 데이터 업로드

| date       | channel        | campaign              | ad\_group    | event\_category | event\_value |
| ---------- | -------------- | --------------------- | ------------ | --------------- | ------------ |
| 2022-08-01 | owned\_website | retargeting\_campaign | 2030\_female | self\_event     | 100000       |
| 2022-08-01 | owned\_website | retargeting\_campaign | 2030\_male   | self\_event     | 80000        |

**2. 2022-08-04:** date, channel, campaign 레벨의 데이터 업로드

| date       | channel        | campaign              | event\_category | event\_value |
| ---------- | -------------- | --------------------- | --------------- | ------------ |
| 2022-08-01 | owned\_website | retargeting\_campaign | self\_event     | 150000       |

**3. 최종 반영:** 8월 4일 업로드 데이터 처리 시 'date', 'channel', 'event\_category' 3개 필드값을 기준으로 8월 3일에 업로드한 동일 데이터가 있기 때문에 해당 데이터 대신 최종적으로 8월 4일 업로드 데이터만 남게됩니다. (ad group 값은 null)

| date       | channel        | campaign              | event\_category | event\_value |
| ---------- | -------------- | --------------------- | --------------- | ------------ |
| 2022-08-01 | owned\_website | retargeting\_campaign | self\_event     | 150000       |

###### 예시 시나리오 2

**1. 2022-08-03:** date, channel, campaign 레벨의 데이터 업로드

| date       | channel        | campaign              | event\_category | event\_value |
| ---------- | -------------- | --------------------- | --------------- | ------------ |
| 2022-08-01 | owned\_website | retargeting\_campaign | self\_event     | 100000       |

**2. 2022-08-04:** date, channel, campaign, ad\_group 레벨의 데이터 업로드

| date       | channel        | campaign              | ad\_group    | event\_category | event\_value |
| ---------- | -------------- | --------------------- | ------------ | --------------- | ------------ |
| 2022-08-01 | owned\_website | retargeting\_campaign | 2030\_female | self\_event     | 150000       |

**3. 최종 반영:** 8월 4일 업로드 데이터 처리 시 'date', 'channel', 'event\_category' 3개 필드값을 기준으로 8월 3일에 업로드한 동일 데이터가 있기 때문에 해당 데이터 대신 최종적으로 8월 4일 업로드 데이터만 남게됩니다.(ad\_group 값도 추가 업데이트됨)

| date       | channel        | campaign              | ad\_group    | event\_category | event\_value |
| ---------- | -------------- | --------------------- | ------------ | --------------- | ------------ |
| 2022-08-01 | owned\_website | retargeting\_campaign | 2030\_female | self\_event     | 150000       |

###### 예시 시나리오 3

**1. 2022-08-03:** date, channel, campaign, ad\_group 레벨의 데이터 업로드

| date       | channel        | campaign              | ad\_group    | event\_category | event\_value |
| ---------- | -------------- | --------------------- | ------------ | --------------- | ------------ |
| 2022-08-01 | owned\_website | promotion\_campaign   | 2030\_female | self\_event     | 10000        |
| 2022-08-01 | owned\_website | retargeting\_campaign | 2030\_female | self\_event     | 100000       |
| 2022-08-01 | owned\_website | retargeting\_campaign | 2030\_male   | self\_event2    | 80000        |

**2. 2022-08-04:** date, channel, campaign, ad\_group 레벨의 데이터 업로드

| date       | channel        | campaign              | ad\_group    | event\_category | event\_value |
| ---------- | -------------- | --------------------- | ------------ | --------------- | ------------ |
| 2022-08-01 | owned\_website | retargeting\_campaign | 2030\_male   | self\_event     | 90000        |
| 2022-08-01 | owned\_website | ua\_campaign          | 2030\_female | self\_event     | 120000       |

**3. 최종 반영:** 8월 4일 업로드 데이터 처리 시 'date', 'channel', 'event\_category' 3개 필드값을 기준으로 8월 3일에 업로드 데이터 중 동일 데이터는 8월 4일의 데이터로 대체되며, 나머지 데이터는 그대로 남게됩니다.

| date       | channel        | campaign              | ad\_group    | event\_category | event\_value |
| ---------- | -------------- | --------------------- | ------------ | --------------- | ------------ |
| 2022-08-01 | owned\_website | retargeting\_campaign | 2030\_male   | self\_event2    | 80000        |
| 2022-08-01 | owned\_website | retargeting\_campaign | 2030\_male   | self\_event     | 90000        |
| 2022-08-01 | owned\_website | ua\_campaign          | 2030\_female | self\_event     | 120000       |

<h4 id="데이터-아카이브">
  데이터 아카이브
</h4>

기존에 업로드한 메트릭을 리포트에서 보이지 않게 하고 싶으신 경우 담당 CSM을 통해 요청해 주세요. 담당 CSM이 없는 경우 [문의하기](https://app.airbridge.io/supports)를 통해 요청해 주세요.

<h3 id="유의사항">
  유의사항
</h3>

* 현재 Metric 데이터 업로드 요청 및 상태 조회 API는 앱 역할이 오너 또는 사내 마케터인 에어브릿지 사용의 API Token으로만 사용 가능합니다.
* CSV 파일 내 컬럼명은 정해진 소문자 값만 허용됩니다. CSV 파일 내 모든 Row에서 Required 열은 값이 반드시 존재해야 합니다. 또한 Required 열은 공백을 허용하지 않습니다. event\_value도 공백이 아닌 0으로 입력하여 업로드해야 합니다.
* CSV 파일 내 칼럼 순서는 업로드 기능에 영향을 미치지 않습니다.
* 한번의 요청으로 업로드하는 CSV 파일의 최대 크기는 1MB입니다. 만약 1MB 이상 크기의 CSV 파일 업로드가 필요한 경우 gzip 압축을 한 뒤 업로드하거나, 여러 번의 API 호출로 나눠서 업로드 해주세요.
* string 타입의 칼럼값은 256글자 이하로 제한됩니다. 또한 칼럼명 및 칼럼값 앞뒤로 공백이 없도록 유의합니다.
* event\_category에는 영어와 숫자를 사용할 수 있습니다. 하지만 일부 기호(, , ", )는 사용할 수 없습니다.
* 등록된 메트릭은 Actuals Report와 Trends Reports의 메트릭 중 Self-serve Metric에서 업로드한 event\_category 이름을 찾으면 사용할 수 있습니다.
* Upload 시 등록된 새로운 데이터는 (ex. campaign에 self\_serve\_test\_campaign) Filter 사용시 선택옵션에 나타나지 않지만 freeform으로 등록해서 사용할 수 있습니다.

<Card title="Try API Request" icon="rectangle-api" horizontal href="https://www.postman.com/airbridge-engineering/workspace/airbridge-api/request/22395869-840b210b-7ed2-4166-966d-3a3ecb76a5bf" />

```text POST theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
https://api.airbridge.io/self-serve-data/v1/metric/requests
```

<h2 id="metric-data-업로드-요청하기-request">
  Request
</h2>

***

<h3 id="metric-data-업로드-요청하기-headers">
  Headers
</h3>

<ParamField header="Accept-Language" type="string">
  API 요청 및 결과 반환에 사용할 언어를 지정할 수 있습니다. ISO-639-1 포맷을 따릅니다.
</ParamField>

<ParamField header="Content-Type" type="string">
  리소스의 미디어 타입을 나타냅니다. 기본값으로 `application/json`을 사용합니다.
</ParamField>

<ParamField header="Authorization" type="string">
  API 요청에 사용하는 키값입니다. [키값 생성 및 조회 방법](/ko/references/introduction)을 확인하여 획득할 수 있습니다.
</ParamField>

<RequestExample>
  ```shellscript Request theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  curl -X POST 'https://api.airbridge.io/self-serve-data/v1/metric/requests' \
    -H 'Accept-Language: ko' \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer {AIRBRIDGE-API-TOKEN}'
  ```
</RequestExample>

<h2 id="metric-data-업로드-요청하기-response">
  Response
</h2>

***

### 200

| Name       | Description                                                         | Example                              |
| ---------- | ------------------------------------------------------------------- | ------------------------------------ |
| requestId  | 업로드 요청에 대한 고유 ID로, 요청마다 새로운 ID가 부여됩니다. 업로드 요청 상태 조회 시 해당 ID가 사용됩니다. | 08844672-62d8-4da8-9d48-e14961651e0c |
| status     | 업로드 요청에 대한 진행 상태값입니다.                                               | ingested                             |
| prevStatus | 현재 status 이전의 상태값입니다.                                               | validated                            |
| reason     | status가 'failed'로 업로드 실패 이유에 대한 값입니다.                               | \{"date": \["invalid date"]}         |
| createdAt  | 요청이 생성된 날짜 및 시간입니다.                                                 | 2023-01-01T09:00:00                  |
| updatedAt  | 업데이트가 진행된 날짜 및 시간입니다.                                               | 2023-01-01T09:09:00                  |

<ResponseExample>
  ```json 200 theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  {
    "reason": null,
    "status": "uploaded",
    "createdAt": "2023-01-01T09:00:00",
    "requestId": "08844672-62d8-4da8-9d48-e14961651e0c",
    "updatedAt": "2023-01-01T09:00:00",
    "prevStatus": null
  }
  ```
</ResponseExample>
