API 오류 코드

이 사이트가 반환하는 모든 실패를 2026-09-01에 실제 엔드포인트로 한 건씩 호출해 확인한 목록입니다. 반환되는 8건 중 5건은 상태 코드가 실제 원인을 가리키지 않으며, 그중 2건은 공식 SDK가 조용히 재시도하기 때문에 프로그램에 도달하는 시점이 더 늦어집니다.

2026-09-01 검증

상태 코드가 실제 원인과 다름

상태 코드가 아니라 error.code를 읽으세요

모델 이름을 잘못 쓰면 503, messages 필드를 빼먹으면 500이 돌아옵니다. 둘 다 요청 자체의 잘못이라 몇 번을 재시도해도 결과가 바뀌지 않습니다. 그런데 openai-python, openai-node, Anthropic SDK는 모두 408·409·429와 모든 5xx를 기본값으로 두 번, 지수 백오프까지 붙여 재시도합니다. 오타 하나가 세 번의 왕복과 수십 초의 대기로 바뀌고, 그다음에야 처음부터 정해져 있던 원인이 드러납니다. 진짜 원인은 처음부터 응답 본문의 error.code에 있고, 거짓말을 하는 쪽은 상태 코드입니다.

대조표

상태 코드

숫자 순서가 아니라 실제로 자주 만나는 순서로 정렬했습니다.

  • HTTP 401빈 문자열
    실제로 일어난 일
    키가 존재하지 않거나 이미 폐기되었거나, Authorization 헤더 자체가 없습니다.
    처리 방법
    콘솔의 ‘API 키’ 페이지에서 키가 남아 있는지 확인하고 필요하면 새로 발급하세요. 참고로 "Bearer " 접두사를 빠뜨린 것은 원인이 아닙니다 — 이 사이트는 키만 보내도 받습니다.
    SDK 재시도
    안 함 — 즉시 실패
    실제 엔드포인트에서 측정
    probes-errors.mjs: invalid-token / missing-auth
    반환된 메시지
    Invalid token
  • HTTP 503model_not_found상태 코드가 실제 원인과 다름
    실제로 일어난 일
    그 모델 ID는 이 사이트 목록에 없습니다. 대부분 다른 업체 문서에서 그대로 옮겨 온 경우입니다(gpt-4o, claude-sonnet-4-5). 장애가 아니라, 존재하지 않는 모델에 배정할 경로가 없는 것입니다.
    처리 방법
    GET /v1/models 결과와 대조하세요. 그것이 유일한 공식 목록입니다. 이 사이트의 ID는 항상 벤더/모델 형식이며, 예를 들어 deepseek/deepseek-v4-flash입니다.
    SDK 재시도
    함 — 기본 2회
    실제 엔드포인트에서 측정
    probes-errors.mjs: unknown-model
    반환된 메시지
    No available channel for model gpt-4o under group y-api (distributor)
  • HTTP 403insufficient_user_quota상태 코드가 실제 원인과 다름
    실제로 일어난 일
    계정 잔액이 0이 되었습니다. 이 메시지는 중국어이고 잔액에 전각 $를 씁니다. 영어로 검색해도 아무것도 나오지 않는 이유입니다.
    처리 방법
    https://y-api.bestvirtualgoods.com/app/billing에서 충전하세요. 크레딧은 즉시 복구되고 기존 키도 그대로 쓸 수 있으며 코드도 고칠 필요가 없습니다.
    SDK 재시도
    안 함 — 즉시 실패
    상류 소스 코드로 확인, 이 사이트에서는 미발생
    service/billing_session.go:355-359
    반환된 메시지
    用户额度不足, 剩余额度: $0.00
  • HTTP 403pre_consume_token_quota_failed상태 코드가 실제 원인과 다름
    실제로 일어난 일
    계정에는 잔액이 있지만 이 키 하나가 생성 시 설정한 상한에 걸렸습니다. 메시지에 해당 키의 남은 한도와 이번 요청에 필요한 금액이 함께 표시됩니다.
    처리 방법
    ‘API 키’ 페이지에서 그 키의 상한을 올리거나 해제하거나, 상한이 없는 키로 바꾸세요. 계정 충전으로는 해결되지 않습니다 — 상한은 키 단위입니다.
    SDK 재시도
    안 함 — 즉시 실패
    실제 엔드포인트에서 측정
    probes-errors.mjs: quota-exhausted
    반환된 메시지
    token quota is not enough, token remain quota: $0.000002, need quota: $0.000074
  • HTTP 500invalid_request상태 코드가 실제 원인과 다름
    실제로 일어난 일
    요청 본문에 필수 필드가 없습니다. 대개 messages입니다. 400 계열이어야 할 요청 오류가 서버 오류로 돌아옵니다.
    처리 방법
    메시지에 필드 이름이 그대로 나오니 상태 코드가 아니라 그것을 읽으세요. 본문을 고쳐야 합니다. 재시도하면 같은 결과입니다.
    SDK 재시도
    함 — 기본 2회
    실제 엔드포인트에서 측정
    probes-errors.mjs: missing-field
    반환된 메시지
    field messages is required
  • HTTP 400invalid_request_error상태 코드가 실제 원인과 다름
    실제로 일어난 일
    그 엔드포인트는 이 사이트에 없습니다. /v1/embeddings, /v1/completions, /v1/images/generations가 모두 이 경우입니다. 게다가 본문은 messages가 필수라고 말해서, 실제 원인과 전혀 무관한 곳을 가리킵니다.
    처리 방법
    이 사이트가 제공하는 것은 chat completions와 Anthropic의 messages 엔드포인트입니다. 프레임워크가 내부에서 embeddings를 호출한다면 그 부분은 다른 제공자가 필요합니다.
    SDK 재시도
    안 함 — 즉시 실패
    실제 엔드포인트에서 측정
    probes-errors.mjs: unsupported-endpoint
    반환된 메시지
    `messages` is required and must be a non-empty array.
  • HTTP 400빈 문자열
    실제로 일어난 일
    요청 본문이 올바른 JSON이 아닙니다. 상류가 자기 "Invalid request:" 접두사를 두 번 붙이는데, 이는 표시상의 문제입니다.
    처리 방법
    직접 만든 페이로드나 셸 따옴표 문제일 때가 많습니다. 보내기 전에 JSON을 검증하고, 셸에서는 본문 전체를 작은따옴표로 감싸세요.
    SDK 재시도
    안 함 — 즉시 실패
    실제 엔드포인트에서 측정
    probes-errors.mjs: malformed-json
    반환된 메시지
    Invalid request: Invalid request: invalid JSON request body
  • HTTP 404빈 문자열
    실제로 일어난 일
    POST /v1/messages/count_tokens는 구현되어 있지 않습니다. Claude Code와 Anthropic SDK가 요청 전에 컨텍스트 크기를 추정하려고 호출합니다.
    처리 방법
    이쪽에서 고칠 것은 없습니다. 클라이언트는 추정을 건너뛰거나 경고를 표시할 뿐이고, 채팅·스트리밍·도구 호출에는 영향이 없습니다.
    SDK 재시도
    안 함 — 즉시 실패
    실제 엔드포인트에서 측정
    probes-errors.mjs: count-tokens
    반환된 메시지
    Invalid URL (POST /v1/messages/count_tokens)

조용한 실패

오류보다 더 까다로운 HTTP 200

200을 반환하고 예외도 던지지 않아 프로그램이 그대로 진행되는 실패가 세 가지 있습니다. 잘못된 것은 내용이거나 청구액입니다. 그래서 스스로 발견하기가 어렵습니다.

이미지를 받고 나서 무시합니다

상류는 5개 모델에 image_ratio를 붙여 두었습니다. 그것은 과금 계수이지 시각 능력이 아닙니다. 다섯 모델 모두 data URL 이미지를 받아 200을 반환하고, 본 적 없는 그림에 대해 자신 있게 답합니다 — 프로브가 보낸 것은 순수한 초록색 PNG였지만 색을 맞힌 모델은 하나도 없었습니다. 추천 모델은 오히려 400으로 거부하는데, 두 실패 중에서는 그쪽이 안전합니다.

클라이언트 호환성 매트릭스 출처

max_completion_tokens는 텍스트를 제한하지만 청구액은 제한하지 않습니다

상한을 12로 두었는데 moonshotai/kimi-k2.5의 과금은 261, 21.8배였습니다. 잘라내기 자체는 작동합니다(finish_reason=length). 초과분은 추론 토큰이며, 과금은 되지만 content에는 나타나지 않습니다. 이 상한으로 계산한 비용 추정치는 같은 배수만큼 낮게 나옵니다.

클라이언트 호환성 매트릭스 출처

Anthropic 메시지 id에 msg_ 접두사가 없습니다

POST /v1/messages는 접두사 없는 16진수 id를 반환합니다. msg_ 접두사를 전제로 검증하거나 id를 파싱해 응답을 분기하는 코드는 일치하지 않습니다 — 본문의 나머지는 규격에 맞는데도 그렇습니다.

클라이언트 호환성 매트릭스 출처

파싱

오류 본문의 형태

겉은 항상 {"error": {...}}이지만 필드 구성은 일정하지 않습니다. param이 있는 오류와 없는 오류가 있고, code는 빈 문자열인 경우가 많습니다. 모든 필드를 선택 항목으로 다루세요.

401, param 필드 없음
{"error":{"code":"","message":"Invalid token (request id: 2026090114474514374…)","type":"new_api_error"}}
404, param은 있으나 비어 있음
{"error":{"message":"Invalid URL (POST /v1/messages/count_tokens)","type":"invalid_request_error","param":"","code":""}}

모든 메시지 끝에는 request id가 붙고 요청마다 다릅니다. 이 페이지와 대조하기 전에 떼어내세요. 반대로 문제를 제보할 때는 반드시 함께 보내 주세요 — 로그에서 그 요청을 특정할 수 있는 유일한 단서입니다.

원인 추적

거의 모든 문제를 가려내는 3단계

이 순서대로. 한 단계마다 한 층을 배제하므로, 멈추는 지점이 답입니다.

  1. 먼저 키와 경로를 확인합니다

    GET /v1/models는 크레딧을 쓰지 않고 같은 키를 사용합니다. 200과 모델 목록이 오면 키·네트워크·CDN 엣지 모두 문제가 없다는 뜻입니다. 즉 원인은 인증이 아니라 요청 본문에 있습니다.

    curl -s https://api.y-api.bestvirtualgoods.com/v1/models -H "Authorization: Bearer $YAPI_KEY" | head -c 200
  2. curl로 재현합니다

    이렇게 하면 SDK를 떼어낼 수 있습니다. curl은 성공하는데 내 코드가 실패하면, 차이는 그 라이브러리가 요청을 만드는 방식에 있고 이 사이트에 있는 것이 아닙니다.

    curl -i https://api.y-api.bestvirtualgoods.com/v1/chat/completions \
      -H "Authorization: Bearer $YAPI_KEY" \
      -H "Content-Type: application/json" \
      -d '{"model":"deepseek/deepseek-v4-flash","messages":[{"role":"user","content":"hi"}]}'
  3. 진단 중에는 재시도를 끕니다

    재시도를 끄면 내 요청 때문에 생긴 500이나 503이 첫 시도에서 바로 드러납니다. 쓸데없는 두 번의 대기가 끼지 않습니다. 끝나면 되돌리세요 — 진짜 일시적 장애에는 재시도가 의미가 있습니다.

    client = OpenAI(
        base_url="https://api.y-api.bestvirtualgoods.com/v1",
        api_key=os.environ["YAPI_KEY"],
        max_retries=0,  # 진단 중에만
    )

어디에도 해당하지 않는다면

상태 페이지에서 이 사이트 자체가 저하 상태인지 지난 90일 기록과 함께 확인할 수 있습니다. 그쪽이 초록인데도 막혀 있다면, 오류 본문의 request id를 보내 주시는 것이 가장 도움이 됩니다.