모델 목록과 Models API

모델 목록과 Models API

OpenRouter에는 400개가 넘는 모델이 올라와 있어요. 웹사이트 openrouter.ai/models에서 탐색하거나, Models API로 프로그래밍 방식으로 가져올 수 있어요. 새 모델 소식을 RSS 피드로 구독할 수도 있고요. 이 페이지에서는 Models API로 모델 목록을 필터링·정렬·조회하고, 응답 스키마를 해석하는 방법을 정리해요.

출처: https://openrouter.ai/docs/guides/overview/models

쿼리 파라미터

Models API는 쿼리 파라미터로 반환할 모델 목록을 걸러 줘요.

output_modalities 파라미터로 모델의 출력 능력을 기준으로 필터링해요. 콤마로 구분한 값을 넣거나, 출력 유형을 가리지 않는 "all"을 넣으면 돼요.

설명
text 텍스트 출력 모델 (기본값)
image 이미지를 생성하는 모델
audio 오디오 출력을 내는 모델
embeddings 임베딩 모델
all 모든 모델 포함, 모달리티 필터링 생략
# 기본값 (텍스트 모델만)
curl "https://openrouter.ai/api/v1/models"

# 이미지 생성 모델만
curl "https://openrouter.ai/api/v1/models?output_modalities=image"

# 텍스트 + 이미지 모델
curl "https://openrouter.ai/api/v1/models?output_modalities=text,image"

# 모달리티 무관 전체
curl "https://openrouter.ai/api/v1/models?output_modalities=all"

같은 파라미터는 /v1/models/count 엔드포인트에도 있어서, 카운트가 목록 결과와 항상 일치해요.

supported_parameters는 모델이 지원하는 API 파라미터로 거르는 필터예요. 예를 들어 도구 호출(tools)을 지원하는 모델만 찾고 싶다면 이렇게 호출하면 돼요.

curl "https://openrouter.ai/api/v1/models?supported_parameters=tools"

sort는 서버 쪽에서 모델을 정렬해 반환해요. 아래 값 중 하나를 받아요.

설명
pricing-low-to-high 값싼 모델 우선 (프롬프트·컴플리션·요청·웹 검색 가격의 가중 평균)
pricing-high-to-low 비싼 모델 우선
context-high-to-low 컨텍스트 윈도우가 큰 순
throughput-high-to-low 초당 토큰이 높은 순 (p50 처리량)
latency-low-to-high 첫 토큰까지 시간이 짧은 순 (p50 지연)
most-popular 지난주 가장 많이 처리된 순
top-weekly most-popular와 동일
newest OpenRouter에 최근 추가된 순

정렬 기준 차원의 데이터가 없는 모델(가격·처리량 통계 없음)은 뒤에 정렬돼요. sort를 빼면 기본 순서(하위 호환)가 유지돼요.

# 값싼 모델 우선
curl "https://openrouter.ai/api/v1/models?sort=pricing-low-to-high"

# 최신 모델
curl "https://openrouter.ai/api/v1/models?sort=newest"

# 필터와 결합
curl "https://openrouter.ai/api/v1/models?sort=throughput-high-to-low&supported_parameters=tools"

단일 모델 조회

전체 목록을 받지 않고 GET /api/v1/model/{author}/{slug}로 단일 모델의 상세 정보만 뽑을 수 있어요. 이 엔드포인트는 별칭을 자동으로 풀어 줘요. 예컨대 anthropic/claude-3-5-sonnet은 정식 슬러그 anthropic/claude-3.5-sonnet으로 리다이렉트돼 그 데이터를 돌려주고, :free 같은 변형 접미사도 지원해요.

# 특정 모델 조회
curl "https://openrouter.ai/api/v1/model/openai/gpt-4o"

# 별칭 자동 해석
curl "https://openrouter.ai/api/v1/model/anthropic/claude-3-5-sonnet"

# 변형 접미사
curl "https://openrouter.ai/api/v1/model/openai/gpt-4:free"

모델이 존재하지 않고 다른 모델의 별칭도 아니라면 404를 돌려줘요. 응답은 목록 엔드포인트와 같은 Model 객체를 감싼 형태예요.

{
  "data": {
    "id": "openai/gpt-4o",
    "name": "GPT-4o",
    "pricing": { "prompt": "0.0000025", "completion": "0.00001" }
  }
}

Models API 표준

Models API는 확인되는 즉시 모든 LLM의 핵심 정보를 무료로 공개해요. 응답은 표준화된 JSON 형식이라 에지에 캐시되어 프로덕션 통합에 안정적으로 쓸 수 있어요.

루트 응답 객체

{
  "data": [ /* Model 객체 배열 */ ],
  "total_count": 150,        // 쿼리 조건에 맞는 모델 수
  "links": {
    "next": "/api/v1/models?offset=500&limit=500" // 다음 페이지 URL, 마지막이면 null
  }
}

페이지네이션은 옵트인이에요. offsetlimit를 모두 빼면 전체 목록이 반환되고 links.nextnull이 돼요. 페이지네이션하면 limit 기본값은 500(최대 1000)이고, links.next가 다음 페이지 준비된 URL을 담아요.

curl "https://openrouter.ai/api/v1/models?offset=0&limit=500"

Model 객체 스키마

data 배열의 각 모델은 다음 표준 필드를 포함해요.

필드 타입 설명
id string API 요청에 쓰는 고유 식별자 (예: "google/gemini-2.5-pro-preview")
canonical_slug string 절대 변하지 않는 정식 슬러그
name string 사람이 읽기 좋은 표시 이름
created number OpenRouter에 추가된 Unix 타임스탬프
description string 모델 능력·특성 상세 설명
context_length number 최대 컨텍스트 윈도우 크기(토큰)
architecture Architecture 모델 기술 능력을 설명하는 객체
pricing Pricing 최상위 제공자의 가격
top_provider TopProvider 주 제공자 설정 정보
per_request_limits 속도 제한 정보 (제한 없으면 null)
supported_parameters string[] 이 모델이 지원하는 API 파라미터 배열
default_parameters object | null 이 모델의 기본 파라미터 (없으면 null)
expiration_date string | null 모델 엔드포인트 지원 중단 날짜 (아니면 null)
benchmarks Benchmarks | undefined 제3자 벤치마크 순위 (데이터 없으면 생략)

Architecture 객체

{
  "input_modalities": ["file", "image", "text"],
  "output_modalities": ["text"],
  "tokenizer": "..." ,        // 사용하는 토큰화 방식
  "instruct_type": null       // 명령 형식 (해당 없으면 null)
}

Pricing 객체

모든 가격은 토큰/요청/단위당 USD예요. 값이 "0"이면 무료라는 뜻이에요.

{
  "prompt": "0.0000025",        // 입력 토큰당 비용
  "completion": "0.00001",      // 출력 토큰당 비용
  "request": "0",               // API 요청당 고정 비용
  "image": "0",                 // 이미지 입력당 비용
  "web_search": "0",            // 웹 검색 1회당 비용
  "internal_reasoning": "0",    // 내부 추론 토큰 비용
  "input_cache_read": "0",      // 캐시 입력 토큰 읽기당 비용
  "input_cache_write": "0",     // 캐시 입력 토큰 쓰기당 비용
  "overrides": []               // 조건부 가격 재정의
}

가격 재정의(Pricing Overrides): 일부 엔드포인트는 특정 조건에서 다른 요율을 매겨요. 토큰 임계값을 넘으면 비싸지는 긴 컨텍스트 가격이나, 피크 시간대에 더 비싼 시간대별 가격 같은 것이 여기 속해요. 이들은 pricing.overrides 배열로 표현돼요.

{
  // 조건: 프롬프트 토큰 총합이 이 임계값보다 클 때 적용
  "min_prompt_tokens": 200000,
  // 조건: 현재 UTC 시간이 이 일일 구간 안일 때
  "utc_start": 1630,   // 16:30 UTC 포함
  "utc_end": 30,       // 00:30 UTC 제외, 자정을 걸쳐 마감하면 wrap에 유의
  // 조건: 이 UTC 요일에만 적용 (없으면 매일)
  "utc_days": ["monday", "tuesday", "wednesday", "thursday", "friday"],
  // 재정의된 가격 (기본 pricing과 같은 키·단위)
  "prompt": "0.000005",
  "completion": "0.00002",
  "input_cache_read": "0.0000005",
  "input_cache_write": "0.00000625"
}

항목은 모든 조건 필드가 요청과 일치할 때 적용돼요. 여러 항목이 걸리면 나중 항목이 키별로 이겨요. 항목에 없는 가격 키는 기본 가격을 상속해요. 최상위 pricing 키는 항상 기본 조건에서의 가격을 반영하고, overrides가 조건부 예외를 담아요.

시간대별 조건은 피크/비피크 가격을 표현해요. overrides 배열은 항상 (피크와 비피크 모두) 하루 24시간 전체를 나란히 늘어놓아, 순간마다 정확히 하나가 일치하게 해요 — 그래서 소비자는 폴백 경로가 필요 없어요. 다음은 16:30~00:30 UTC 사이 반값인 모델 예시예요.

"pricing": {
  "prompt": "0.00000028",
  "completion": "0.00000042",
  "overrides": [
    { "utc_start": 30, "utc_end": 1630, "prompt": "0.00000028", "completion": "0.00000042" },
    { "utc_start": 1630, "utc_end": 30, "prompt": "0.00000014", "completion": "0.00000021" }
  ]
}

utc_days로 범위를 정한 항목은 주간 일정을 표현해요. 피크 구간이 평일만 적용되는 모델은 다음과 같이 보여요 (주말에는 전체 일별 가격만).

"pricing": {
  "prompt": "0.00000028",
  "completion": "0.00000042",
  "overrides": [
    { "utc_days": ["monday","tuesday","wednesday","thursday","friday"], "utc_start": 30, "utc_end": 1630, "prompt": "0.00000056", "completion": "0.00000084" },
    { "utc_days": ["monday","tuesday","wednesday","thursday","friday"], "utc_start": 1630, "utc_end": 30, "prompt": "0.00000028", "completion": "0.00000042" },
    { "utc_days": ["saturday","sunday"], "prompt": "0.00000028", "completion": "0.00000042" }
  ]
}

새 조건 필드는 시간이 지나면 추가될 수 있어요. 인식하지 못하는 조건 필드를 담은 항목은 그 가격을 적용하지 말고 건너뛰어야 해요. 최상위 pricing 키가 항상 기본 조건 가격을 반영하니까요.

Top Provider 객체

{
  "context_length": 200000,    // 제공자별 컨텍스트 한도
  "max_completion_tokens": 8000, // 응답 최대 토큰
  "is_moderated": false        // 콘텐츠 검열 적용 여부
}

입력·출력 토큰은 모델 컨텍스트 윈도우를 공유해요. 그래서 max_completion_tokensmax_tokens의 상한일 뿐 보장된 출력 크기가 아니에요. 요청의 실제 최대 출력은 입력 토큰을 빼고 남은 컨텍스트로 제한돼요.

Benchmarks 객체

제3자 벤치마크에서 평가된 모델에만 나타나요. 현재는 Design Arena 순위를 포함해요.

{
  "design_arena": [
    {
      "arena": "models",
      "category": "website",
      "elo": 1520,
      "win_rate": 0.62,
      "rank": 3
    }
  ]
}

순위는 OpenRouter에 등록된 모델 사이에서 계산된 것이지, 외부 전체 리더보드가 아니에요. 벤치마크 데이터가 없는 모델은 benchmarks 필드를 아예 생략해요.

지원 파라미터

supported_parameters 배열은 각 모델에서 동작하는 OpenAI 호환 파라미터를 알려 줘요. 대표적으로 tools(함수 호출), tool_choice, max_tokens, temperature, top_p, reasoning(내부 추론 모드), structured_outputs(JSON 스키마 강제), response_format, stop, frequency_penalty, presence_penalty, seed(결정적 출력) 등이 있어요.

모델마다 토큰화 방식이 달라요. GPT·Claude·Llama처럼 여러 글자를 한 덩어리로 나누는 모델이 있는가 하면, PaLM처럼 글자 단위로 토큰화하는 모델도 있어요. 그래서 입력·출력이 같아도 모델에 따라 토큰 수(따라서 비용)가 달라져요. 비용은 해당 모델의 토큰화 기준으로 표시·청구돼요. 정확한 입력·출력 토큰 수는 응답의 usage 필드로 확인할 수 있어요.

원하는 모델이나 제공자가 OpenRouter에 없다면 Discord 채널에서 알려 줄 수 있어요.

더 알아보기