# 콘텐츠 관리

> 탭조이 오퍼월 리포트 API를 사용하여 앱, 콘텐츠 카드, 플레이스먼트, 가상 재화 등 오퍼월 설정을 효율적으로 관리할 수 있습니다.

리포트 API를 사용하여 콘텐츠를 관리하고 이벤트와 광고 세트의 설정 세부 정보를 검토할 수 있습니다.

## 필수 조건##prerequisites

API로 인증해야 합니다. [API 인증](/grow/offerwall/monetization/api/api-authentication.md)을 참고하십시오.

* 리포트 API를 통해 보고 데이터 가져오기에 관한 내용을 알아보려면 [리포트 API - 퍼블리셔](/grow/offerwall/monetization/api/reporting-api-publisher.md)를 참고하십시오.
* 리포트 API로 오류 처리 및 제한 사항에 관한 내용을 알아보려면 [리포트 API 베스트 프랙티스](/grow/offerwall/monetization/api/reporting-api-best-practices.md)를 참고하십시오.

## 앱 관리##manage-your-apps

### 앱 추가##add-your-apps

오퍼월을 사용하여 수익화할 앱입니다. 대시보드에서도 앱을 추가할 수 있습니다. 자세한 내용은 [오퍼월 설정 가이드](/grow/offerwall/monetization/getting-started/offerwall-setup-guide.md)를 참고하십시오.

> **Note:**
>
> 이 단계를 완료하기 위해 앱이 App Store나 Google Play 스토어에 출시되어 있을 필요는 없습니다(*storeUrl* 파라미터: 선택 사항).

레퍼런스: [createPublisherApp](https://api.tapjoy.com/graphql/docs/mutation/createpublisherapp?category=publishers) 변경

다음의 변환은 스토어 URL이 포함되어 있거나 없는 새로운 퍼블리셔 앱을 생성합니다.

```graphql
mutation createPublisherAppWithStoreUrl {
  createPublisherApp(input: {
    name: "App Created With Store URL",
    platform: ANDROID,
    storeUrl: "https://play.google.com/store/apps/details?id=com.tapjoy.tapout&gl=us",
    orientation: PORTRAIT
  }) {
    app {
      id
      name
      timezone
      realWorldCurrency
    }
  }
}

mutation createPublisherAppWithoutStoreUrl {
  createPublisherApp(input: {
    name: "App Created WithOUT Store URL",
    platform: ANDROID,
    orientation: PORTRAIT,
    currency: KRW,
    timezone: TOKYO_SEOUL
  }) {
    app {
      id
      name
	  timezone
      realWorldCurrency
    }
  }
}
```

### 앱 및 플레이스먼트 정보 조회##look-up-app-and-placement-information

플레이스먼트 ID, 콘텐츠, 설명 등 앱의 플레이스먼트 정보를 검토합니다.

레퍼런스: [Publisher#apps](https://api.tapjoy.com/graphql/docs/object/publisher#apps) 필드, [PublisherApp](https://api.tapjoy.com/graphql/docs/object/publisherapp/) 유형

다음 쿼리 ID, 이름, 관련 플레이스먼트 세부 정보를 포함하여 최대 50개의 앱 반환합니다.

```graphql
query {
  publisher{
    apps(first: 50){
      edges{
        node{
          id
          name
          placements{
            id
            name
            mediationName
          }
        }
      }
      pageInfo {
        endCursor
        hasNextPage
      }
    }
  }
}
```

응답은 앱 해당 플레이스먼트의 목록을 반환하며 페이지 지정 정보는 더 많은 결과를 사용할 수 있는지 여부를 나타냅니다.

```graphql
{
  "data": {
    "publisher": {
      "apps": {
        "edges": [
          {
            "node": {
              "id": "00000000-0000-0000-0000-000000000000",
              "name": "XXX YYY ZZZ",
              "placements": [
                {
                  "id": "00000000-0000-0000-0000-000000000000",
                  "name": "XXX YYY ZZZ",
                  "mediationName": null
                },
                {
                  "id": "00000000-0000-0000-0000-000000000000",
                  "name": "XXX YYY ZZZ",
                  "mediationName": null
                },
                {
                  "id": "00000000-0000-0000-0000-000000000000",
                  "name": "XXX YYY ZZZ",
                  "mediationName": "ironsource"
                },
                {
                  "id": "00000000-0000-0000-0000-000000000000",
                  "name": "XXX YYY ZZZ",
                  "mediationName": null
                }
              ]
            }
          },
          {
            "node": {
              "id": "00000000-0000-0000-0000-000000000000",
              "name": "XXX YYY ZZZ",
              "placements": []
            }
          }
        ],
        "pageInfo": {
          "endCursor": "Mg",
          "hasNextPage": true
        }
      }
    }
  }
}
```

### 특정 앱 ID의 플레이스먼트 정보 조회##look-up-placement-information-for-a-specific-app-id

레퍼런스: [Publisher#placements](https://api.tapjoy.com/graphql/docs/object/publisher#placements) 필드, [플레이스먼트](https://api.tapjoy.com/graphql/docs/object/placement/) 유형

다음 쿼리 ID, 이름, Mediation 이름 등 특정 앱의 모든 플레이스먼트를 반환합니다.

```graphql
query {
  publisher{
    placements(appId: "00000000-0000-0000-0000-000000000000"){
      id
      name
      mediationName
    }
  }
}
```

응답은 특정 앱에 대해 설정된 플레이스먼트 목록을 반환합니다.

```graphql
{
  "data": {
    "publisher": {
      "placements": [
        {
          "id": "00000000-0000-0000-0000-000000000000",
          "name": "AppLaunch",
          "mediationName": null
        },
        {
          "id": "00000000-0000-0000-0000-000000000000",
          "name": "InsufficientCurrency",
          "mediationName": null
        },
      ]
    }
  }
}
```

## 플레이스먼트 및 콘텐츠 카드 관리##manage-your-placements-and-content-cards

플레이스먼트는 앱에서 오퍼월을 표시할 수 있는 특정 영역입니다. 콘텐츠 카드는 특정 플레이스먼트에 표시할 광고 유형을 정의합니다.

### 플레이스먼트 및 콘텐츠 카드 생성##create-placements-and-content-cards

대시보드에서 플레이스먼트와 콘텐츠 카드를 생성할 수 있습니다. 자세한 내용은 각각 [플레이스먼트](/grow/offerwall/monetization/dashboard/placements.md)와 [오퍼월 카드 설정](/grow/offerwall/monetization/dashboard/offerwall-cards.md)을 참고하십시오.

레퍼런스: [createPlacementsAndContents](https://api.tapjoy.com/graphql/docs/mutation/createplacementsandcontents?category=publishers) 변화

다음의 변환은 지정된 앱에 대한 새 플레이스먼트와 연결된 콘텐츠 카드를 생성합니다.

```graphql
mutation createPlacementAndContent {
  createPlacementsAndContents(input: {entries: [
    {
      appId: "<PASTE_YOUR_APP_ID_HERE>",
      placementName: "Placement from API"
    }
  ]}) {
    placements {
      id
      name
      description
      contents {
        id
        name
        type
        isSkippable
      }
    }
  }
}
```

### 콘텐츠 카드 설정 조회##look-up-content-card-configuration

설정된 A/B 테스트의 콘텐츠 카드 ID, 유형, 상태 등의 정보를 확인합니다.

레퍼런스: [Placement#contents](https://api.tapjoy.com/graphql/docs/object/placement#contents) 필드, [ContentCard](https://api.tapjoy.com/graphql/docs/object/contentcard/) 유형

다음 쿼리 특정 앱의 모든 플레이스먼트와 관련 콘텐츠 카드를 반환합니다.

```graphql
query {
  publisher {
    placements (appId:"00000000-0000-0000-0000-000000000000") {
      id
      name
      contents {
        id
        name
      }
    }
  }
}
```

응답은 구성된 콘텐츠 카드와 함께 각 플레이스먼트를 반환합니다.

```graphql
{
  "data": {
    "publisher": {
      "placements": [
        {
          "id": "00000000-0000-0000-0000-000000000000",
          "name": "AppLaunch",
          "contents": [
            {
              "id": "00000000-0000-0000-0000-000000000000",
              "name": "Content for AppLaunch testing by Tapjoy"
            },
            {
              "id": "00000000-0000-0000-0000-000000000000",
              "name": "Content for testing placement by Tapjoy"
            }
          ]
        },
        {
          "id": "00000000-0000-0000-0000-000000000000",
          "name": "InsufficientCurrency",
          "contents": [
            {
              "id": "00000000-0000-0000-0000-000000000000",
              "name": "Content for InsufficientCurrency testing by Tapjoy"
            },
            {
              "id": "00000000-0000-0000-0000-000000000000",
              "name": "Content for testing placement by Tapjoy"
            }
          ]
        }
      ]
    }
  }
}
```

## 가상 재화 관리##manage-your-virtual-currency

탭조이로 수익화를 진행하려면 가상 재화가 필요합니다. 앱 ID, 재화 이름, 교환율, 만료 기간을 제공해야 합니다.

자세한 내용은 [가상 재화 개요](/grow/offerwall/monetization/virtual-currency/virtual-currency-overview.md)를 참고하십시오.

### 가상 재화 생성##create-virtual-currency

API에서 이 액션을 수행하려면 앱 ID, 재화 이름, 교환율, 만료 시간을 제공해야 합니다. 대시보드에서도 가상 재화를 생성할 수 있습니다.

레퍼런스: [createCurrency](https://api.tapjoy.com/graphql/docs/mutation/createcurrency?category=publishers) 변화

다음의 변환은 특정 앱에 대한 새로운 가상 재화를 생성하여 해당 환율과 만료 레벨을 설정합니다.

```graphql
mutation createCurrency {
  createCurrency(input: {
    appId: "<PASTE_YOUR_APP_ID_HERE>",
    name: "New Virtual Currency",
    exchangeRate: 100,
    maturity: MEDIUM
  }) {
    currency {
      id
      name
      exchangeRate
      initialBalance
      maturity
    }
  }
}
```

### 가상 재화 업데이트##update-a-virtual-currency

아래의 변화를 사용하여 가상 재화를 업데이트할 수도 있습니다.
레퍼런스: [updateCurrency](https://api.tapjoy.com/graphql/docs/mutation/updatecurrency?category=publishers) 변화

다음의 변환은 기존 가상 재화의 이름, 안정성 레벨, 초기 잔액을 업데이트합니다.

```graphql
mutation updateCurrency {
  updateCurrency(input: {
    id: "<CURRENCY_ID>",
    maturity: HIGH,
    name: "Shell Bells",
    initialBalance: 100
  }) {
    currency {
      id
      name
      exchangeRate
      initialBalance
      maturity
      callbackUrl
    }
  }
}
```
