지원하지 않는 엔드포인트

무엇이 404 이고 왜 그런가

MyIP OpenRouter 는 openrouter API 의 채팅·완성·모델·키·크레딧 표면을 구현한다. 그 밖의 제품군은 구현하지 않았고, 앞으로도 대부분은 계획에 없다. 이 페이지는 그 경계를 한 곳에 모아 둔 것이다.

조용히 404 를 내면 SDK 사용자가 원인을 찾지 못한다. 그래서 미구현 경로는 무엇이 왜 없는지 알려 주는 본문을 함께 돌려준다.

404 응답 형식

json
{
  "error": {
    "code": 404,
    "message": "Endpoint not supported on MyIP OpenRouter",
    "metadata": {
      "error_type": "not_supported",
      "path": "/api/v1/embeddings"
    }
  }
}

metadata.path요청한 경로가 그대로 들어간다. 라이브러리가 우리 모르게 어떤 경로를 부르고 있는지 이 필드 하나로 확인할 수 있다. 응답에는 다른 /api/v1 응답과 마찬가지로 X-MyIP-Currency: KRW 헤더가 붙는다.

404 가 나는 경로

아래는 openrouter 코드에서 가장 자주 넘어오는 경로들이다. 목록에 없더라도 /api/v1 아래에서 우리가 구현하지 않은 경로는 모두 같은 404 를 받는다.

경로제품군
/embeddings임베딩
/images*, /videos*, /audio/*이미지·영상·음성 생성 및 전사
/responsesResponses API
/messagesAnthropic 형식 메시지 API
/rerank리랭킹
/files*파일 업로드·관리
/guardrails*가드레일·모더레이션
/byok*BYOK(사용자 provider 키)
/presets*프리셋
/workspaces*, /scim/*조직·워크스페이스·사용자 프로비저닝
/oauth/*OAuth PKCE 키 발급
/observability/*외부 관측 도구 연동
/containers/*코드 실행 컨테이너
/analytics/*, /activity분석·활동 API
/classifications/*분류기

대신 무엇을 쓰나

각 제품군마다 우리 쪽 대체물이 있으면 그것을, 없으면 없다고 적는다.

임베딩 (/embeddings)

대체물 없음. 우리는 생성 모델만 서빙한다. 임베딩이 필요하면 별도의 임베딩 서비스를 쓰고, 그 결과를 애플리케이션에서 합쳐야 한다.

이미지·영상·음성 (/images*, /videos*, /audio/*)

생성·전사 모두 대체물 없음. 이미지를 만들거나, 음성을 텍스트로 옮기거나, 텍스트를 음성으로 바꾸는 엔드포인트가 없다.

다만 입력은 다르다. 모델이 이미지 입력을 지원한다고 카탈로그에 선언되어 있으면 /chat/completions 의 메시지에 이미지를 실어 보낼 수 있다. 멀티모달 입력을 보라. 어떤 모델이 무엇을 받는지는 GET /models 응답의 architecture.input_modalities 로 확인한다.

Responses API (/responses)

/chat/completions 를 쓴다. openrouter 의 Responses API 는 OpenAI 의 새 표면을 따라간 것이고, 우리는 채팅 완성 하나만 유지한다. 스트리밍·툴 콜링·구조화 출력은 전부 /chat/completions 에서 된다.

Anthropic 형식 메시지 (/messages)

/chat/completions 를 쓴다. 요청 형상은 OpenAI 호환 한 가지만 지원한다. Anthropic SDK 를 그대로 붙일 수는 없고, OpenAI SDK 의 base_url 만 바꿔 붙이는 방식을 쓴다. OpenAI SDK 를 보라.

리랭킹 (/rerank)

대체물 없음.

파일 (/files*)

대체물 없음. 업로드해 둔 파일을 나중에 참조하는 방식은 지원하지 않는다. 필요한 내용은 요청마다 메시지 본문에 직접 실어 보낸다. 그만큼 매 요청의 프롬프트 토큰이 늘어나므로, 반복되는 긴 컨텍스트라면 프롬프트 캐싱이 비용을 줄여 준다.

가드레일·모더레이션 (/guardrails*)

대체물 없음. 입출력 검사는 애플리케이션 쪽에서 해야 한다. 게이트웨이는 내용을 검열하지 않는다.

BYOK (/byok*)

대체물 없음. 사용자가 자기 provider 키를 등록해 우리를 통해 호출하는 방식은 지원하지 않는다. 업스트림 용량은 우리가 사고, 이용자는 원 단위 크레딧으로 우리에게 지불한다. 그래서 GET /keybyok_usage 계열은 항상 0 이고 GET /generationis_byok 는 항상 false 다.

프리셋 (/presets*)

대체물 없음. 서버에 저장해 두고 이름으로 부르는 파라미터 묶음이 없다. 모델·온도·시스템 프롬프트 같은 설정은 애플리케이션 설정 파일에 두고 요청마다 보낸다.

조직·워크스페이스·SCIM (/workspaces*, /scim/*)

대체물 없음. 계정은 개인 단위 하나뿐이고 조직 계정, 좌석 관리, 사용자 자동 프로비저닝이 없다. 팀에서 함께 쓰려면 계정 하나에 용도별 키를 여러 개 발급하고 키마다 한도를 거는 방식이 현재로선 가장 가깝다 — GET/POST /keys.

OAuth PKCE (/oauth/*)

대체물 없음. 서드파티 앱이 사용자를 대신해 키를 발급받는 흐름이 없다. 키는 대시보드에서 사람이 발급하거나, 관리 키로 POST /keys 를 호출해 발급한다.

관측 연동 (/observability/*)

대체물 없음(연동 형태로는). 외부 관측 도구로 로그를 밀어 주는 기능은 없다. 대신 호출 하나하나의 비용·토큰·지연·실제 응답 provider 를 GET /generation 으로 조회할 수 있고, 응답 헤더 X-MyIP-Generation-Id 로 그 id 를 즉시 받을 수 있다. 이 두 가지로 자체 로깅을 붙이는 것이 지금의 방법이다.

코드 실행 컨테이너 (/containers/*)

대체물 없음. 모델이 만든 코드를 우리가 실행해 주지 않는다.

분석·활동 API (/analytics/*, /activity)

API 는 없다. 사용 내역은 대시보드의 활동 화면에서 볼 수 있고, 개별 호출은 GET /generation 으로 조회한다. 키 단위 집계는 GET /keyusage_daily·usage_weekly·usage_monthly, 계정 단위 총액은 GET /credits 가 준다.

분류기 (/classifications/*)

대체물 없음.

배치 API

대체물 없음. 요청을 모아 두었다가 할인가로 처리하는 경로가 없다. 동시 요청을 여러 개 보내는 방식으로 처리한다. 요청 한도는 요청 한도를 보라.

경로가 아니라 모델 이름 문제인 경우

다음 두 가지는 404 가 아니라 400 model_not_found 로 나타난다. 증상이 비슷해 혼동하기 쉬우므로 함께 적어 둔다.

모델 변종 접미사 (:free, :nitro, :exacto 등)

지원하지 않는다. 모델 id 는 카탈로그에 있는 문자열과 정확히 같아야 한다.

json
{ "model": "lgai/exaone-4.0-32b" }

lgai/exaone-4.0-32b:nitro 처럼 접미사를 붙이면 카탈로그에 없는 id 이므로 400 model_not_found 다. 속도·가격을 기준으로 고르고 싶다면 접미사 대신 provider.sort 를 쓴다 — Provider 라우팅.

자동 라우터 계열 (openrouter/auto 등)

지원하지 않는다. openrouter/ 접두사를 가진 모델 id 는 우리 카탈로그에 존재하지 않는다. 여러 모델을 순서대로 시도하고 싶다면 요청 본문의 models 배열을 쓴다 — 모델 폴백.

json
{
  "models": ["google/gemma-4-26b-a4b", "lgai/exaone-4.0-32b"],
  "messages": [{ "role": "user", "content": "안녕하세요" }]
}

우리가 구현한 것

경계의 반대쪽이다. 아래는 전부 동작한다.

경로인증
POST /chat/completions추론 키
POST /completions추론 키
GET /models, /models/count, /models/{author}/{slug}/endpoints없음
GET /models/user추론 키
GET /generation?id=추론 키
GET /key, /auth/key추론 키 또는 관리 키
GET /credits추론 키 또는 관리 키
GET/POST /keys, GET/PATCH/DELETE /keys/{hash}관리 키
GET /providers없음
GET /datasets/rankings-daily추론 키 또는 관리 키
GET /datasets/app-rankings추론 키 또는 관리 키
GET /benchmarks추론 키 또는 관리 키

not_supported 가 나오는 다른 자리

같은 error_type 이 한 군데 더 쓰인다. GET/PATCH/DELETE /keys/{hash} 에서 존재하지 않거나 다른 사용자의 키 해시를 지목하면 404 not_supported 다. 두 경우를 구분해야 한다면 metadata.path 의 유무를 보면 된다 — 미구현 경로에는 있고, 키 404 에는 없다.

관련 문서

마지막 수정 2026. 9. 5.