GET /models/{author}/{slug}/endpoints
모델 하나를 서빙하는 후보들
모델 하나를 실제로 처리할 수 있는 엔드포인트(후보) 목록을 돌려줍니다. 인증이 필요 없습니다.
GET https://openrouter.myip.co.kr/api/v1/models/{author}/{slug}/endpoints경로의 {author}/{slug} 는 모델 id 를 / 로 나눈 두 조각입니다. google/gemma-4-26b-a4b 라면 /api/v1/models/google/gemma-4-26b-a4b/endpoints 입니다. GET /models 응답의 links.details 가 정확히 이 경로를 줍니다.
경로 파라미터
authorstring필수모델 id 의 / 앞부분. 예: google.
slugstring필수모델 id 의 / 뒷부분. 예: gemma-4-26b-a4b.
쿼리 파라미터는 없습니다.
요청 예제
curl https://openrouter.myip.co.kr/api/v1/models/google/gemma-4-26b-a4b/endpoints응답
data.idstring모델 id.
data.namestring모델 표시 이름.
data.createdinteger유닉스 초.
data.descriptionstring모델 설명. 없으면 빈 문자열.
data.architectureobjectmodality, input_modalities, output_modalities, tokenizer, instruct_type.
data.endpointsobject[]후보 목록. 아래 필드를 갖습니다.
data.endpoints[].namestring"<모델 이름> | <provider 이름>" 형식의 표시용 이름.
data.endpoints[].provider_namestringprovider 표시명. 응답 헤더 X-MyIP-Provider 에 실리는 값과 같습니다.
data.endpoints[].context_lengthinteger | null이 후보가 받는 컨텍스트 길이. 후보별 값이 없으면 모델의 값을 씁니다.
data.endpoints[].max_prompt_tokensinteger | null프롬프트 최대 토큰. context_length 와 같은 값입니다.
data.endpoints[].max_completion_tokensinteger | null생성 가능한 최대 토큰.
data.endpoints[].pricingobjectKRW/토큰 판매 단가. /models 의 pricing 과 같은 객체이며 currency 는 "KRW" 입니다.
단가는 모델 단위로 정해집니다. 그래서 같은 모델의 모든 후보가 같은 pricing 을 갖습니다 — 어느 후보가 응답하든 청구액이 달라지지 않습니다.
data.endpoints[].tagstring | null후보 구분 태그. 로컬 GPU 후보에는 추론 엔진 이름(vllm, llamacpp)이 들어갑니다.
data.endpoints[].quantizationstring | null양자화 방식. 모르면 null.
data.endpoints[].supported_parametersstring[]이 후보가 받는 파라미터. 후보별 값이 없으면 모델의 목록을 씁니다.
data.endpoints[].statusinteger | null후보 상태. 로컬 GPU 후보는 슬롯이 떠 있으면 0, 내려가 있으면 null 입니다. null 이라고 못 쓰는 것은 아닙니다 — 요청이 오면 슬롯을 깨웁니다(로컬 GPU 모델).
data.endpoints[].uptime_last_30mnumber | null최근 30분 가동률. 모르면 null.
data.endpoints[].latency_last_30mnumber | null최근 30분 지연. provider.sort: "latency" 가 읽는 값입니다. openrouter 응답에는 없는 우리 추가 필드입니다.
data.endpoints[].throughput_last_30mnumber | null최근 30분 처리량. provider.sort: "throughput" 이 읽는 값입니다. 역시 우리 추가 필드입니다.
응답 예제
{
"data": {
"id": "google/gemma-4-26b-a4b",
"name": "Google: Gemma 4 26B A4B",
"created": 1786924800,
"description": "Gemma 4 26B (MoE 활성 4B, QAT AWQ-INT4). MyIP 로컬 GPU 기본 슬롯. tool calling 지원.",
"architecture": {
"modality": "text+image->text",
"input_modalities": ["text", "image"],
"output_modalities": ["text"],
"tokenizer": "Other",
"instruct_type": null
},
"endpoints": [
{
"name": "Google: Gemma 4 26B A4B | MyIP Local GPU",
"context_length": 32768,
"pricing": {
"prompt": "0.000030",
"completion": "0.000150",
"request": "0",
"image": "0",
"web_search": "0",
"internal_reasoning": "0",
"input_cache_read": "0.000003",
"input_cache_write": null,
"currency": "KRW"
},
"provider_name": "MyIP Local GPU",
"tag": "vllm",
"quantization": null,
"max_completion_tokens": 32768,
"max_prompt_tokens": 32768,
"supported_parameters": [
"max_tokens", "temperature", "top_p", "top_k", "stop", "seed",
"frequency_penalty", "presence_penalty", "repetition_penalty",
"logit_bias", "response_format", "tools", "tool_choice"
],
"status": 0,
"uptime_last_30m": null,
"latency_last_30m": null,
"throughput_last_30m": null
}
]
}
}로컬 GPU 후보가 어떻게 여기 나타나는가
endpoints 배열은 두 곳을 합쳐 만듭니다.
- 외부 provider 에서 동기화해 둔 엔드포인트.
- 우리 GPU 팜의 슬롯. 이쪽은 외부 카탈로그에 존재하지 않으므로 슬롯 설정에서 엔드포인트 한 건을 합성합니다.
이 합성이 없으면 로컬 전용 모델의 endpoints 가 빈 배열이 되어 "쓸 수 있는 곳이 없다"로 읽힙니다. 실제로는 우리가 직접 서빙하는 모델인데도 말이죠.
응답의 후보 순서는 라우팅 우선순위와 같지 않습니다. 실제 요청이 어떤 순서로 시도되는지는 로컬 우선 라우팅과 Provider 라우팅을 보세요.
오류
| 상태 | error_type | 발생 조건 |
|---|---|---|
| 404 | not_supported | 그 모델 id 가 없거나 비활성화됨 |
| 429 | rate_limit_exceeded | 요청 빈도 제한 초과 |
| 500 | server | 서버 오류 |
{
"error": {
"code": 404,
"message": "지원하지 않는 경로입니다: /api/v1/models/nope/nope/endpoints",
"metadata": { "error_type": "not_supported" }
}
}비활성화된 모델과 존재하지 않는 모델은 같은 404 를 받습니다.
마지막 수정 2026. 9. 5.