메인 콘텐츠로 건너뛰기

일반적인 응답 구조

성공적인 응답은 200번대 HTTP 코드와 함께, 서버가 요청을 어떻게 해석했는지를 나타내는 정보와 더불어 요청한 객체가 조회, 생성, 수정 또는 삭제된 결과를 담은 JSON 기반 페이로드로 표현됩니다. 요청이 성공한 경우, 응답의 일부로 요청 내용을 그대로 반영한 request 노드를 받게 됩니다. 예: GET accounts/abcdefg/campaigns?with_deleted=true
{
  /* 응답의 데이터... */,
  "request": {
    "params": {
      "account_id": "abcdefg",
      "with_deleted": "true"
    }
  }
}
JSON 응답의 data 필드는 해당 리소스와 연관된 구체적인 객체를 포함합니다. 응답에 하나 이상의 결과가 포함될 수 있는 경우, data 노드는 JSON 배열 형식이 됩니다. 응답에서 오직 하나의 결과만 가능한 경우에는 JSON 해시(해시 맵) 형식으로 반환됩니다. 드문 경우이지만, 컬렉션이 포함되어야 할 응답에서 대신 해시 맵 하나만 포함된 응답을 볼 수도 있습니다. 이 경우, 해당 단일 해시 맵은 type 필드에 지정된 것과 동일한 type의 객체라고 간주하면 됩니다.

오류 응답 구조

오류 응답은 200대가 아닌 HTTP 상태 코드와 함께 반환됩니다. 일반적으로 JSON 응답이 함께 오지만, 일부 오류는 다른 종류의 본문으로 응답하기도 합니다. 응답 구조를 파싱할 수 없는 이러한 상황에서는 HTTP 상태 코드의 본래 의미를 우선적으로 고려해야 합니다. 예를 들어, 때때로 HTTP 404와 함께 HTML 응답을 볼 수 있습니다. 이 경우 해당 콘텐츠를 찾을 수 없다고 가정해도 안전합니다(HTTP 404는 “Not Found”를 의미합니다). 일반적인 오류 응답은 정상 응답과 유사한 구조를 따릅니다. 오류의 특성은 응답의 errors 노드에서 전달됩니다. errors/code 노드는 프로그램적으로 활용하여 어떤 방식으로 해결할지 결정하는 데 사용할 수 있는 CAPS_CASE 상수 오류 코드를 나타냅니다. errors/message 노드는 (일반적으로) 오류에 대한 사람이 읽을 수 있는 영어 설명을 나타냅니다. 오류에 대한 더 세부적인 정보를 나타내기 위해 추가 필드가 첨부될 수 있습니다.
{
  "errors": [
    {
      "parameter": "start_time",
      "details": "invalid date",
      "code": "INVALID_PARAMETER",
      "value": "",
      "message": "Expected time, got \"\" for start_time"
    }
  ],
  "request": {
    "params": {
      "account_id": "hkk5"
    }
  }
}
위의 예시에서는 start_time 매개변수에 잘못된 값을 사용해 analytics 엔드포인트로 요청을 보낸 경우입니다. 잘못된 매개변수가 포함된 요청의 errors/code 값은 INVALID_PARAMETER입니다.
HTTP 코드오류 코드
403ACCOUNT_LOCKED_OUT
404ACCOUNT_MEDIA_NOT_FOUND
403ACCOUNT_NOT_FOUND
403ACTION_NOT_ALLOWED
404APP_EVENT_PROVIDER_CONFIGURATION_NOT_FOUND
404APP_EVENT_TAG_NOT_FOUND
404BEHAVIOR_OR_BEHAVIOR_EXPANDED_NOT_FOUND
404CAMPAIGN_NOT_FOUND
408CANCELLED_REQUEST
404CARD_NOT_FOUND
403CURRENT_USER_SUSPENDED
400DUPLICATE_TWEET
400EXCLUSIVE_PARAMETERS
400FEATURE_NOT_AVAILABLE
403FUNDING_INSTRUMENT_ACCESS_NOT_ALLOWED
403FUNDING_INSTRUMENT_EXCEEDS_AVAILABLE_CREDIT_LIMIT
404FUNDING_INSTRUMENT_NOT_FOUND
403GENERIC_TWEET_ERROR
400ILLEGAL_CHARACTERS
400INCLUSIVE_PARAMETERS
500INTERNAL_ERROR
404INVALID_APP_ID
404INVALID_APP_STORE
400INVALID_DENOMINATION
400INVALID_FUNDING_INSTRUMENT
404INVALID_IAB_CATEGORY
404INVALID_ID_ILLEGAL_CHARACTERS
400INVALID_IMAGE
400INVALID_MEDIA
400INVALID_MEDIA_ID
400INVALID_PARAMETER
400INVALID_PLACEMENT_TYPE
400INVALID_TAILORED_AUDIENCE_TYPE
400INVALID_TARGETING_TYPE
400INVALID_TIME_WINDOW
400INVALID_TV_SHOW_LOCATIONS
400INVALID_TWEET
400INVALID_USER
400INVALID_USER_ID
423LOCK_ACQUISITION_TIMEOUT
404LINE_ITEM_APP_NOT_FOUND
404LINE_ITEM_NOT_FOUND
404MACT_APP_NOT_FOUND
403MALWARE_STATUS
404MEDIA_CREATIVE_NOT_FOUND
404MEDIA_NOT_FOUND
405METHOD_NOT_ALLOWED
400MISSING_PARAMETER
404NO_PROVIDER_AVAILABLE_FOR_THIS_CLIENT_APPLICATION
404NOT_FOUND
404PROMOTABLE_USER_NOT_FOUND
404PROMOTED_ACCOUNT_NOT_FOUND
404PROMOTED_TWEET_NOT_FOUND
403READONLY_CLIENT_APPLICATION
400REQUEST_TOO_COMPLEX
404ROUTE_NOT_FOUND
503SERVICE_UNAVAILABLE
503OVER_CAPACITY
400SPEND_EXCEEDS_BUDGET
404TAILORED_AUDIENCE_CHANGE_FILE_NOT_FOUND
404TAILORED_AUDIENCE_NOT_FOUND
404TAILORED_AUDIENCE_OR_TAILORED_AUDIENCE_EXPANDED_NOT_FOUND
404TARGETING_CRITERION_NOT_FOUND
400TOO_MANY_CAMPAIGNS
400TOO_MANY_LINE_ITEMS
429TOO_MANY_REQUESTS
400TV_SHOW_OUTSIDE_MARKET
400TWEET_CANNOT_BE_BLANK
403TWEET_IS_SPAM
404TWEET_NOT_FOUND
429TWEET_RATE_LIMIT_EXCEEDED
401UNAUTHORIZED_ACCESS
403UNAUTHORIZED_CLIENT_APPLICATION
400UNKNOWN_CARD_TYPE
400UNKNOWN_CRITERIA_TYPE
403USER_NOT_FOUND
404WEB_EVENT_TAG_NOT_FOUND