오류 코드

Listings API HTTP 상태 코드, Listings 및 Social의 SYxxxxx 오류 코드, v4 API가 반환하는 3가지 오류 응답 형식입니다.

Listings API는 표준 HTTP 상태 코드를 사용하여 요청 결과를 알립니다. 오류 코드는 SY 접두사로 시작하며, 오류 message 문자열에 SYxxxxx: <human-readable reason> 형식으로 포함됩니다.

HTTP 상태 코드

HTTP status code summary

상태의미일반적인 SY 코드Python SDK 예외
200 OK요청이 성공했습니다. 쓰기 작업에서는 응답 본문도 확인합니다(아래 참조).--
400 Bad Request잘못된 형식의 요청, 파싱할 수 없는 필터, 유효하지 않은 열거형 값 또는 잘못된 형식의 ID입니다.SY90006, SY90001ValidationError
401 UnauthorizedAPI 키가 없거나, 형식이 잘못되었거나, 해지되었습니다. 아직 키가 없다면 무료 샌드박스 1일 이용권이 제공되는 기간에 발급받을 수 있습니다.SY90005AuthenticationError
402 Payment Required계정에 미납 청구서가 있어 API 액세스가 일시 중지되었습니다. Social 전용 미납 청구서는 Social 엔드포인트만 일시 중지합니다. payment_required 및 social_payment_required를 참조합니다.-APIError
403 Forbidden키는 유효하지만 해당 리소스에 액세스할 권한이 없습니다.SY90003PermissionDeniedError
404 Not Found경로 또는 ID로 지정한 리소스가 존재하지 않습니다.SY90002NotFoundError
422 Unprocessable Entity요청 형식은 올바르지만 값을 처리할 수 없습니다(예: 알 수 없거나 모호한 카테고리).-ValidationError
429 Too Many Requests요금제의 요청 빈도 제한을 초과했습니다. Retry-After 헤더를 준수합니다.-RateLimitError
5xx서버 오류입니다. 읽기 작업은 대기 시간을 점차 늘리며 안전하게 재시도할 수 있습니다. 쓰기 작업을 반복하기 전에는 아래 주의 사항을 참조합니다.SY90007InternalServerError

3가지 응답 형식

아래 절에서 설명하는 것처럼 대부분의 실패에는 최상위 수준이나 작업 결과 내부에 중첩된 errors 배열이 포함됩니다. 일부 실패는 대신 단일 error 객체를 반환합니다. 여기에는 요청 빈도 제한(429)과 일부 요청 수준의 실패(INTERNAL_SERVER_ERROR와 같은 code를 포함하는 400/500)가 해당합니다. 두 형식을 모두 검사합니다. errors는 배열이고 error는 객체입니다.

1. 요청 수준: 최상위 errors[]

인증, 권한 부여 및 잘못된 요청 형식으로 인한 실패는 작업이 실행되기 전에 처리를 중단합니다. 이러한 실패는 해당 4xx 상태(위 참조)를 반환하며, 오류는 응답의 최상위 수준에 포함됩니다.

JSON
{  "data": { "createLocation": null },  "errors": [{ "message": "SY90005: Invalid Token" }]}

2. 쓰기 유효성 검사: 중첩된 data.<operation>.errors[]

그 밖의 형식에 문제가 없는 생성, 업데이트 또는 게시 요청은 HTTP 200을 반환합니다. 입력이 비즈니스 규칙을 위반하면 해당 작업 자체의 페이로드 아래 data.<operation>.errors에 중첩된 형태로 실패가 보고됩니다. 성공 시에도 이 배열은 존재하며 비어 있습니다("errors": []).

JSON
{  "data": {    "createLocation": {      "errors": [        { "message": "SY10126: City is Mandatory" },        { "message": "SY10010: state_iso" }      ],      "location": null    }  }}

3. 게이트웨이 수준: 최상위의 단일 error 객체

요청 빈도 제한과 예기치 않은 게이트웨이 오류는 변환 전에 처리를 중단하고, code, message 및 correlation_id를 포함하는 error 객체 1개를 반환합니다. 429 본문은 아래 rate_limited를 참조합니다.

쓰기 작업에서는 값이 채워진 data.<operation> 객체가 있는 200 응답이라도 항상 data.<operation>.errors를 확인합니다. 쓰기 작업은 부분적으로 실패할 수 있으며, 해당 실패가 여기에 보고될 수 있습니다.

402 Payment Required 응답에는 error 래퍼가 없습니다. code, message, doc_url 및 납부할 청구서가 있을 때의 pay_url은 최상위 수준에 있습니다. 아래 payment_required를 참조합니다.

쓰기 작업은 부담 없이 재시도할 수 없습니다

v4 API는 Idempotency-Key를 지원하지 않습니다. 해당 헤더는 무시되며, 반복된 쓰기 작업을 감지하는 엔드포인트는 없습니다. 생성, 업데이트 또는 게시 호출이 시간 초과되거나 5xx를 반환하더라도 서버에서는 이미 변경 사항이 커밋되었을 수 있으므로, 확인 없이 재시도하면 사업장, 게시물 또는 리뷰 답글이 중복 생성될 수 있습니다.

읽기 작업은 대기 시간을 점차 늘리며 자유롭게 재시도합니다. 쓰기 작업은 먼저 다시 읽어 확인합니다. 직접 관리하는 키(storeId, 매장 코드, 상호작용의 답글 목록)로 레코드를 조회하고, 실제로 존재하지 않을 때만 호출을 반복합니다.

일반적인 코드

Common SY error codes

코드메시지HTTP 상태의미
SY90005Invalid Token401API 키가 누락되었거나, 형식이 잘못되었거나, 폐기되었습니다. 대시보드에서 키를 재발급하고 Authorization: API <your-key>로 전송합니다.
SY90001Not authorized to access this resource401 / 403이 리소스에 대한 키 사용이 거부되었습니다. Python SDK와 Node SDK 모두 이 오류를 AuthenticationError로 발생시킵니다.
SY90002Invalid Id404 / 400경로 또는 인수의 ID를 확인할 수 없습니다(잘못된 relay ID이거나 base64로 인코딩되지 않은 relay ID인 경우가 많습니다).
SY10126City is Mandatory200(응답 본문)입력에서 필수 필드(city)가 누락되었습니다.
SY10010state_iso200(응답 본문)stateIso 값이 누락되었거나 유효하지 않습니다. 유효한 값은 국가 및 주 엔드포인트를 참조합니다.

SY10xxx 범위의 유효성 검사 코드는 특정 입력 필드에 해당하며, message는 유효성 검사를 통과하지 못한 필드나 규칙을 명시합니다. SY90xxx 범위의 인증 및 권한 부여 코드는 요청 수준의 코드이며, 해당 상태와 함께 최상위 수준에 반환됩니다.

연결된 계정 코드

SY810xx 범위의 코드는 게시 플랫폼의 등록 정보를 가져오거나 연결하는 Connected Accounts 엔드포인트에서 반환됩니다. 이 코드는 HTTP 200 응답의 본문에 중첩되어 반환되므로(위의 응답 형식 2), 상태가 성공이더라도 data.<operation>.errors를 확인합니다.

SY810xx connected-account and import codes

코드의미조치 방법
SY81019키에 해당하는 계정의 사용자를 확인할 수 없습니다.계정에 활성 기본 사용자가 없으므로 지원팀에 문의합니다.
SY81066connectedAccountId가 존재하지 않거나 계정이 보관 처리되었습니다.GET /connected-accounts에서 ID를 다시 확인합니다.
SY81067connectedAccountListingId를 디코딩하거나 확인할 수 없습니다.connected-account-listings 레코드의 id에서 다시 가져옵니다.
SY81068해당 등록 정보는 이미 사업장에 연결되어 있습니다.먼저 연결을 해제하거나 다른 등록 정보를 선택합니다.
SY81069연결된 계정의 자격 증명이 더 이상 유효하지 않습니다.connect-google 또는 connect-facebook을 통해 계정을 다시 연결합니다.
SY81070등록 정보가 지정한 연결된 계정에 속하지 않습니다.각 등록 정보를 해당 등록 정보를 가져온 계정과 짝지어 사용합니다. 흔한 원인 중 하나는 본문에 connectedAccountId를 포함하지 않고 등록 정보를 가져오는 것으로, 이 경우 다른 계정의 등록 정보가 반환됩니다.
SY81071사업장을 생성하는 중 예기치 않은 오류가 발생했습니다.다시 시도하고, 문제가 지속되면 지원팀에 문의합니다.
SY81072사업장을 구성하거나 저장하는 중 생성에 실패했습니다.다시 시도하고, 문제가 지속되면 지원팀에 문의합니다.
SY81073이 등록 정보 유형은 가져오기를 지원하지 않습니다.Google 및 Facebook 등록 정보만 가져올 수 있습니다.
SY81074Google에서 해당 등록 정보의 데이터를 반환하지 않았습니다.등록 정보가 여전히 존재하며 계정에서 계속 관리하고 있는지 확인합니다.
SY81075Google의 API 호출 빈도 제한을 초과했습니다.백오프를 적용하여 나중에 다시 시도합니다.
SY81076Google에서 등록 정보를 가져오지 못했습니다.다시 시도하고, 계정의 Google 권한을 확인합니다.
SY81077Facebook 페이지에서 국가를 확인할 수 없습니다.Facebook에서 페이지 주소에 국가를 추가한 후 다시 시도합니다.
SY81078Facebook 페이지를 기반으로 사업장 데이터를 구성하지 못했습니다.다시 시도하고, 문제가 지속되면 지원팀에 문의합니다.
SY81081등록 정보에 기본 카테고리가 설정되어 있지 않습니다.등록 정보에 기본 카테고리를 설정한 후 다시 시도합니다.
SY81082등록 정보의 국가는 지원되지 않습니다.지원되는 국가는 국가 및 주 엔드포인트를 참조합니다.
SY81083Google 등록 정보를 가져올 수 없습니다.타임스탬프를 포함하여 지원팀에 문의합니다.
SY81084Facebook 가져오기를 준비하는 중 내부 오류가 발생했습니다.다시 시도하고, 문제가 지속되면 타임스탬프를 포함하여 지원팀에 문의합니다.
SY81085Facebook 페이지를 가져올 수 없습니다.타임스탬프를 포함하여 지원팀에 문의합니다.
SY81086비즈니스 규칙에 따라 사업장 생성이 거부되었습니다. 중첩된 message에는 원인이 된 코드가 포함되며, 예를 들어 계정의 사업장 허용 수를 모두 사용한 경우 SY10151이 포함됩니다.중첩된 메시지를 확인하고, SY10151인 경우 사업장 추가 기능을 추가하거나 요금제를 업그레이드합니다.
SY81087사업장 생성 요청이 실패했습니다.다시 시도하고, 문제가 지속되면 타임스탬프를 포함하여 지원팀에 문의합니다.
SY81088알 수 없는 이유로 사업장 생성에 실패했습니다.타임스탬프를 포함하여 지원팀에 문의합니다.
SY81089내부 서비스 호출이 성공 이외의 상태를 반환했습니다. 요청 자체의 문제는 아닙니다.1번 다시 시도하고, 문제가 지속되면 내부 호출을 추적할 수 있도록 타임스탬프를 포함하여 지원팀에 문의합니다.
SY81090내부 사업장 생성 호출 중 예기치 않은 오류가 발생했습니다.다시 시도하고, 문제가 지속되면 타임스탬프를 포함하여 지원팀에 문의합니다.

Social 코드

SY950xx 범위의 코드는 브랜드, 연결, 소셜 게시물에 관한 Social 엔드포인트에서 발생합니다. 연결된 계정 관련 코드와 마찬가지로, 이 코드들은 HTTP 200의 응답 본문에 중첩된 형태로 전달되므로 상태가 성공이더라도 data.<operation>.error를 확인하고 일괄 처리 경로에서는 data.<operation>.errors도 확인해야 합니다.

SY950xx Social codes

코드의미조치 방법
SY95041계정의 브랜드 수가 한도에 도달했습니다. API 요금제에서는 발생할 수 없습니다: 해당 요금제에서는 브랜드 수가 무제한입니다.API 요금제에서는 별도 조치가 필요하지 않습니다. 이 코드가 표시되면 신고해 주시기 바랍니다. GET /social/limits는 brands: null을 반환해야 합니다.
SY95042계정의 현재 청구 기간에 대한 연결 수가 한도에 도달했습니다.한도는 GET /social/limits의 usage.connections와 비교하며, 이 값은 현재 연결된 수에 이번 기간에 해제된 수를 더한 청구 대상 수입니다. 연결 해제 또는 브랜드 보관 처리로 비워진 슬롯은 해당 기간이 끝날 때까지 점유된 상태로 유지되므로, 최근에 연결을 해제했더라도 이 오류는 해소되지 않습니다. 해제한 계정 중 하나를 원래 연결되어 있던 브랜드에 다시 연결하거나(기존 슬롯을 재사용하므로 무료), 연결 5개 팩을 추가로 구매하거나(즉시 적용), usage.connectionsReleased 슬롯을 다시 사용할 수 있는 갱신 시점까지 기다립니다. 해제한 계정을 다른 브랜드에 연결하면 기존 슬롯이 재사용되지 않습니다. 요금제 및 추가 기능을 참조합니다.
SY95043이 계정에 해당 ID의 브랜드가 없거나, 해당 브랜드가 보관 처리되었습니다.GET /social/brands에서 ID를 다시 확인합니다. 브랜드 ID는 Base64 relay ID가 아닌 일반 UUID입니다.
SY95044이 계정에서는 해당 플랫폼이 활성화되어 있지 않습니다.계정의 Social 요금제에는 연결을 요청한 플랫폼이 포함되어 있지 않습니다. 지원팀에 문의하거나 계정에서 이용할 수 있는 플랫폼을 선택합니다.
SY95045브랜드에 해당 플랫폼의 연결된 채널이 없습니다.사용자에게 해당 플랫폼의 연결 링크를 통해 연결하도록 안내하거나, platforms에서 해당 플랫폼을 제외합니다. 게시물 예약 후 채널 연결이 해제된 경우에도 발생합니다.
SY95046예약 일정 또는 시간대가 유효하지 않습니다.scheduledAt 또는 scheduleDate + scheduleTime을 전송하며, 절대 둘 다 전송하지 않습니다. scheduledAt에는 UTC 오프셋이 필요하며, scheduleTime은 HH:MM입니다. 시간대는 IANA 식별자(tzCode)를 사용합니다.
SY95047이 계정에 해당 ID의 일괄 처리 작업이 없습니다.일괄 생성 응답에서 job.id를 다시 확인합니다. 작업은 영구적으로 보관되지 않습니다.
SY95048일괄 요청이 행 수 한도를 초과합니다.요청당 최대 500개 행을 전송하고 나머지는 추가 배치로 나눕니다. 아무것도 생성되지 않았습니다.
SY95049리디렉션 URL이 유효하지 않습니다.연결 링크의 redirectUrl과 errorUrl은 직접 관리하는 절대 https URL이어야 합니다.
SY95050일괄 유효성 검사에 실패했습니다. 행별 오류를 확인합니다.아무것도 생성되지 않았습니다. job.results[]를 확인합니다. 거부된 각 행에는 0부터 시작하는 index, 해당 행의 clientReference, 그리고 errors[]에 담긴 사유가 포함됩니다. 해당 행들을 수정한 후 전체 배치를 다시 전송합니다.
SY95051브랜드가 90일 유지 기간 요건을 충족하지 않았습니다.브랜드는 생성 후 90일이 지나기 전에는 보관 처리할 수 없습니다. 응답에는 status: "TENURE_NOT_MET"도 포함되며, 아무것도 변경되지 않았습니다. 90일이 지난 후 다시 시도하면 브랜드와 해당 연결이 즉시 보관 처리되지만, 연결 슬롯은 청구 기간이 끝날 때까지 점유된 상태로 유지됩니다. 유지 기간 규칙을 참조합니다.
SY95052연결된 채널이 이 브랜드에 속하지 않습니다.각 연결을 해당 연결이 생성된 브랜드와 짝지어 사용합니다. 한 브랜드의 게시물과 다른 브랜드의 채널 ID로 인사이트 호출을 구성할 때 흔히 발생합니다.

SY95042와 SY95044는 입력 오류가 아닌 이용 권한 오류이므로, 요금제를 변경하지 않고 다시 시도하면 동일하게 실패합니다. SY95045, SY95046, SY95049, SY95052는 다음 요청에서 수정할 수 있는 입력 오류입니다.

Listings 이용 권한 코드

Listings plan codes

코드의미조치 방법
SY10150계정의 사업장 수가 한도에 도달했습니다.사업장을 보관 처리하거나, 사업장 추가 기능을 구매하거나, 요금제를 업그레이드합니다. 요금제 및 추가 기능을 참조합니다.
SY10151계정이 현재 요금제에서 사용할 수 있는 사업장 슬롯을 모두 사용했습니다. 샌드박스 1일 이용권에서는 사업장 2개가 모두 사용 중입니다.SY10150과 동일한 조치 방법을 적용합니다. 1일 이용권에서는 기존 사업장을 업데이트하거나 유료 요금제를 선택합니다. 연결된 계정의 등록 정보에서 사업장을 생성할 때 SY81086 내부에 중첩되어 나타나기도 합니다.
SY10152사업장의 활성 상태 유지 기간이 보관 처리에 필요한 기간을 충족하지 못했습니다.POST /locations/archive에서 사업장을 보관 처리하려면 계정에 설정된 최소 유지 기간(기본값 90일) 동안 사업장이 활성 상태여야 합니다. 해당 기간이 지날 때까지 기다립니다.
SY10155계정에 Listings 요금제가 없어 사업장을 생성할 수 없습니다.API 키가 Social 전용 계정처럼 Listings 구독이 없는 계정에 속해 있습니다. 사업장은 Listings 제품에 포함되므로 POST /locations를 호출하기 전에 Listings를 구독합니다.

rate_limited

429 Too Many Requests: 계정이 요금제의 요청 빈도 제한을 초과했습니다. 본문은 표준 오류 응답이며, retry_after_seconds 힌트, 지원 요청 시 명시할 correlation_id, 이 섹션으로 연결되는 doc_url을 포함합니다:

JSON
{  "error": {    "code": "RATE_LIMITED",    "message": "Too many requests. Slow down.",    "retry_after_seconds": 30,    "correlation_id": "9f2c1e64-2b1a-4b0e-9f1a-2c7d5e8a1b3c",    "doc_url": "https://listingsapi.com/docs/error-codes#rate_limited"  }}

retry_after_seconds에 지정된 시간(Retry-After 헤더가 있으면 해당 헤더에 지정된 시간) 동안 기다린 후 지수 백오프를 적용하여 재시도합니다. 요금제별 제한과 백오프 구현 예시는 요청 빈도 제한을 참조합니다.

payment_required

402: 이 계정의 마지막 결제가 처리되지 않아 모든 /api/v4 엔드포인트가 일시 중지되었습니다. 미결제 청구서의 Stripe 페이지가 있으면 본문에 해당 페이지를 가리키는 pay_url이 포함되며, X-Error-Code 응답 헤더에도 동일한 code가 포함됩니다. 대시보드의 청구 페이지는 계속 열 수 있으며, 여기에서 결제할 수 있습니다.

JSON
{  "code": "payment_required",  "message": "This account has an unpaid invoice, so API access is paused. Pay the invoice to restore access.",  "pay_url": "https://invoice.stripe.com/i/acct_123/test_abc",  "doc_url": "https://listingsapi.com/docs/error-codes#payment_required"}

마지막 미결제 청구서의 결제가 완료되면 1분 이내에 액세스가 복구됩니다. 최초 결제 실패 후 3일이 지나도 청구서가 미결제 상태이면 Listings 구독이 취소되고 계정의 사업장이 보관 처리됩니다. 계정에 활성 Social 구독도 있으면 Social 액세스는 유지되며, 그렇지 않으면 계정이 폐쇄되고 해당 계정의 API 키가 더 이상 작동하지 않습니다.

social_payment_required

402: Social 구독의 마지막 결제가 처리되지 않아 Social 엔드포인트(/api/v4/social/*)가 일시 중지되었습니다. Listings 엔드포인트는 계속 작동합니다. 본문에는 payment_required와 동일한 필드가 포함되며, "code": "social_payment_required"가 함께 제공됩니다. 최초 결제 실패 후 3일이 지나도 청구서가 미결제 상태이면 Social 구독이 취소되고 계정의 브랜드가 보관 처리됩니다. Listings 구독이 없는 계정은 폐쇄되며, 해당 계정의 API 키가 더 이상 작동하지 않습니다.

개발자 포털 제어 영역 오류

개발자 포털의 계정 및 키 관리 엔드포인트(대시보드 자체 API 경로)는 위의 REST errors[] 형식과 구분되는 단일 구조의 오류 응답을 반환합니다. 각 code에는 correlation_id와 이 문서의 해당 섹션으로 연결되는 doc_url이 포함됩니다.

JSON
{  "error": {    "code": "AUTH_INVALID_KEY",    "message": "Session is invalid or expired.",    "correlation_id": "9f2c1e64-2b1a-4b0e-9f1a-2c7d5e8a1b3c",    "doc_url": "https://listingsapi.com/docs/error-codes#auth_invalid_key"  }}

auth_missing_key

401: 자격 증명이 제공되지 않았습니다. 다시 로그인하거나 키를 Authorization: API <your-key> 형식으로 전송합니다.

auth_invalid_key

401: 세션 또는 키가 유효하지 않거나 만료되었습니다. 다시 인증하거나 대시보드에서 키를 재발급합니다.

auth_insufficient_scope

403: 자격 증명은 유효하지만 이 작업을 수행할 권한이 없습니다. 읽기 권한 범위의 키로는 쓰기 엔드포인트를 호출할 수 없으므로, 필요한 경우 쓰기 키를 발급합니다.

not_found

404: 요청한 리소스 또는 ID로 지정한 리소스가 존재하지 않습니다.

conflict

409: 요청이 리소스의 현재 상태와 충돌합니다(예: 이미 폐기된 키를 다시 폐기하는 경우).

validation_failed

422: 요청 본문이 유효성 검사를 통과하지 못했습니다. 응답의 field와 details에 문제가 있는 입력이 명시됩니다.

internal_error

500: 예기치 않은 서버 측 오류가 발생했습니다. 읽기 작업은 지수 백오프를 적용하여 재시도하고, 쓰기 작업은 먼저 해당 레코드를 다시 조회합니다(쓰기 작업은 부담 없이 재시도할 수 없습니다 참조). 지원팀에 문의할 경우 correlation_id를 명시합니다.

dependency_unavailable

503: API가 의존하는 서비스를 일시적으로 사용할 수 없습니다. 백오프를 적용하여 재시도합니다.

429에 대해서는 위의 rate_limited를 참조합니다.

코드에서 오류 처리하기

먼저 HTTP 상태를 확인한 다음, 쓰기 작업의 경우 응답 본문에 중첩된 errors 배열이 있는지 확인합니다:

Python
from listingsapi import APIError, ListingsAPI client = ListingsAPI(api_key=os.environ["LISTINGSAPI_KEY"]) try:    location = client.locations.create(input=payload)except APIError as e:    # Raised for a non-2xx status (AuthenticationError, ValidationError, and    # so on) and for an error payload returned inside a 200 body.    raise RuntimeError(f"Listings API error: {e}") from e

원시 HTTP API를 직접 사용할 때도 상태 코드, 응답 페이로드 순서로 동일한 2가지 항목을 명시적으로 확인합니다:

Python
resp = requests.post(    "https://listingsapi.com/api/v4/locations",    headers={"Authorization": f"API {os.environ['LISTINGSAPI_KEY']}"},    json=payload,    timeout=30,)resp.raise_for_status()body = resp.json() op = (body.get("data") or {}).get("createLocation") or {}if op.get("errors"):    messages = [e["message"] for e in op["errors"]]    raise RuntimeError(f"Listings API error: {messages}")

Python SDK는 이 2가지 확인을 모두 수행합니다. 각 HTTP 상태를 해당 타입의 예외에 매핑하고, 200 본문 안에 오류 페이로드가 반환된 경우에도 예외를 발생시킵니다.