GET /generation

요청 하나의 토큰·비용·시도 내역

generation id 하나로 정산이 끝난 요청을 조회해서, 실제로 얼마가 청구됐는지, 토큰을 몇 개 썼는지, 응답하기까지 어떤 후보들이 시도됐는지를 돌려줍니다. 청구액을 대조해야 할 때 부르는 엔드포인트입니다 — 여기의 total_cost 는 다시 계산한 추정치가 아니라 크레딧 원장에 실제로 기록된 금액 그 자체입니다.

GET https://openrouter.myip.co.kr/api/v1/generation?id=gen-…

인증

Bearer 키가 필요합니다 — 추론 키(sk-mo-v1-), 관리 키(sk-mo-mgmt-v1-) 둘 다 됩니다. 조회하는 generation 은 그 키가 속한 계정의 것이어야 합니다.

Authorization: Bearer sk-mo-v1-…

쿼리 파라미터

idstring필수

generation id, 예: gen-7kqmXbT4vRz9pFhLn2wYcJdA3s. 원래 chat/completions 호출의 응답 본문 최상위 id, 그리고 X-MyIP-Generation-Id 헤더와 같은 값입니다. 비어 있거나 없으면 400 invalid_request 입니다.

기록이 언제 생기는가

원래 요청의 정산이 끝나는 즉시 행이 생깁니다. 비스트리밍 호출은 응답을 돌려주기 전에 정산이 끝나므로 기록을 바로 조회할 수 있습니다. 스트리밍 호출은 다릅니다 — 정산은 스트림이 닫힌 뒤 응답 수명과 분리되어 돌아갑니다. [DONE] 직후 바로 GET /generation 을 부르면 아주 짧게 아직 행이 없을 수 있습니다. 오류로 취급하지 말고 잠깐 뒤에 한 번 더 시도하세요.

응답

idstring

조회한 generation id.

request_idstring

이 결과를 만든 요청의 id(원래 호출의 X-MyIP-Request-Id 와 같은 값). 한 요청을 위해 시도된 모든 후보가 이 값을 공유합니다.

modelstring

실제로 응답한 모델 — 처음 요청한 모델이 아닌 다른 후보로 폴백됐다면 served_model_id, 아니면 요청한 그 모델입니다.

provider_namestring | null

응답한 provider 의 표시 이름, 예: "MyIP Local GPU".

total_costnumber

청구된 금액, 단위는 KRW, 소수점 6자리에서 반올림. 아래 usage 와 같고, 원래 호출이 돌려준 X-MyIP-Cost-KRW 헤더(스트리밍이었다면 마지막 usage 청크의 cost)와도 같습니다. 조회 시점에 다시 계산하는 값이 아니라, 이미 정산되어 저장된 금액입니다.

usagenumber

total_cost 와 같은 값입니다. 같은 값을 두 이름으로 두는 것은 openrouter 형상이 역사적으로 비용을 두 필드 모두에 실어 왔기 때문입니다 — 어느 쪽을 읽는 클라이언트든 깨지지 않도록 둘 다 남겨둡니다.

upstream_inference_costnumber | null

이 요청의 우리 원가(KRW). 응답한 후보의 원가 기준이 없으면(원가 정보가 없는 로컬 GPU 모델이 전형적입니다) null 입니다.

created_atstring

사용 기록이 기록된 시각, ISO 8601.

streamedboolean

원래 요청에 "stream": true 가 있었는지.

cancelledboolean

스트림이 끝나기 전에 클라이언트가 연결을 끊었으면 true. 취소된 요청도 끊기기 전까지 생성된 토큰만큼은 청구됩니다 — 스트리밍 의 "취소" 항목을 보세요.

latencyinteger | null

응답한 후보로부터 첫 바이트가 오기까지 걸린 밀리초.

generation_timeinteger | null

요청이 게이트웨이에 도착한 순간부터 정산까지, 전체에 걸린 밀리초.

moderation_latencynull

항상 null. 우리는 별도의 모더레이션 단계를 두지 않습니다.

finish_reasonstring | null

정규화된 종료 사유("stop", "tool_calls", "error" 등).

native_finish_reasonstring | null

정규화 이전의, 업스트림 엔진이 준 그대로의 종료 사유 문자열. 업스트림이 따로 주지 않으면 finish_reason 을 그대로 복사합니다.

tokens_promptinteger

프롬프트 토큰 수. native_tokens_prompt 와 같은 값입니다.

tokens_completioninteger

완성 토큰 수(추론 토큰 포함). native_tokens_completion 과 같은 값입니다.

native_tokens_promptinteger

tokens_prompt 와 동일합니다. 우리는 네이티브 토크나이저가 센 값을 다시 세지 않고 그대로 씁니다 — 숫자는 하나뿐이고, 형상 호환을 위해 두 필드명 아래에 같이 노출됩니다.

native_tokens_completioninteger

같은 이유로 tokens_completion 과 동일합니다.

native_tokens_cachedinteger

캐시에서 서빙된 프롬프트 토큰 수. tokens_prompt 안에 이미 포함되어 있고 별도로 더해지지 않습니다. 프롬프트 캐싱 을 보세요.

native_tokens_reasoninginteger

추론 토큰 수. tokens_completion 안에 이미 포함되어 있고 별도로 더해지지 않습니다. 지금 우리 카탈로그의 두 모델 모두 0 입니다. 추론 토큰 을 보세요.

num_media_promptnull

항상 null. 우리는 아직 멀티모달 입력을 서빙하지 않습니다.

num_media_completionnull

항상 null.

num_search_resultsnull

항상 null. 웹 검색 플러그인이 없습니다.

originstring | null

http_referer 와 같은 값입니다.

http_refererstring | null

원래 요청에 HTTP-Referer 헤더가 있었다면 그 값.

app_idinteger | null

http_referer 로부터 생성된 앱 표기 행의 내부 id. 기록된 것이 없으면 null. 앱 표기 를 보세요.

user_agentstring | null

원래 요청의 User-Agent 헤더.

provider_responsesobject[]

이 요청의 후보 체인 전체 시도 기록입니다 — 순서대로 시도된 모든 후보, 성공 여부, 걸린 시간.

json
[{ "alias": "local::google/gemma-4-26b-a4b", "status": 200, "error": null, "ms": 812 }]

status 는 그 후보가 돌려준 HTTP 상태이거나, HTTP 응답 자체가 없었던 실패라면 "timeout", "connect_error", "slot_cold_budget_exceeded" 같은 문자열입니다. error 는 잘린 오류 메시지이거나, 성공했으면 null 입니다. 요청이 예상보다 오래 걸린 이유, 또는 models[] 목록 중 실제로 어떤 후보가 응답했는지를 여기서 확인합니다. 모델 폴백 을 보세요.

is_byokboolean

항상 false. 우리는 BYOK(직접 키 반입)를 지원하지 않습니다.

cache_discountnull

항상 null. 캐시로 절약된 금액은 total_cost 자체에 이미 반영되어 있습니다(cached_tokens 에 더 낮은 단가가 적용됨) — 따로 보고할 할인액이 없습니다.

api_typestring

항상 "chat".

data_regionstring

항상 "kr".

routernull

항상 null. 자동 라우터가 없습니다 — 서비스 원칙 을 보세요.

preset_idnull

항상 null. Presets 기능이 없습니다.

session_idnull

항상 null. session_id 스티키 라우팅을 구현하지 않습니다 — 프롬프트 캐싱 을 보세요.

workspace_idnull

항상 null. Workspaces 기능이 없습니다.

external_usernull

항상 null.

service_tiernull

항상 null.

응답 예제

bash
curl -s "https://openrouter.myip.co.kr/api/v1/generation?id=gen-7kqmXbT4vRz9pFhLn2wYcJdA3s" \
  -H "Authorization: Bearer $MYIP_API_KEY"
json
{
  "data": {
    "id": "gen-7kqmXbT4vRz9pFhLn2wYcJdA3s",
    "request_id": "req-9dLpQn3kVsWx7mB2tYeRfH6uZa",
    "model": "google/gemma-4-26b-a4b",
    "provider_name": "MyIP Local GPU",
    "total_cost": 0.005310,
    "usage": 0.005310,
    "upstream_inference_cost": 0.001076,
    "created_at": "2026-09-04T09:12:41.000Z",
    "streamed": false,
    "cancelled": false,
    "latency": 812,
    "generation_time": 1240,
    "moderation_latency": null,
    "finish_reason": "stop",
    "native_finish_reason": "stop",
    "tokens_prompt": 42,
    "tokens_completion": 27,
    "native_tokens_prompt": 42,
    "native_tokens_completion": 27,
    "native_tokens_cached": 0,
    "native_tokens_reasoning": 0,
    "num_media_prompt": null,
    "num_media_completion": null,
    "num_search_results": null,
    "origin": "https://myapp.example",
    "http_referer": "https://myapp.example",
    "app_id": 14,
    "user_agent": "openai-python/1.54.0",
    "provider_responses": [
      { "alias": "local::google/gemma-4-26b-a4b", "status": 200, "error": null, "ms": 812 }
    ],
    "is_byok": false,
    "cache_discount": null,
    "api_type": "chat",
    "data_region": "kr",
    "router": null,
    "preset_id": null,
    "session_id": null,
    "workspace_id": null,
    "external_user": null,
    "service_tier": null
  }
}

폴백이 있었던 체인

응답한 후보 전에 실패한 후보가 있었다면 provider_responses 에 두 개 이상의 항목이 있고, model / provider_name 은 처음 요청한 모델이 아니라 실제로 답을 만든 후보를 가리킵니다.

json
{
  "model": "google/gemma-4-26b-a4b",
  "provider_name": "MyIP Local GPU",
  "provider_responses": [
    { "alias": "local::lgai/exaone-4.0-32b", "status": "slot_budget_exceeded", "error": "wait budget exceeded", "ms": 5000 },
    { "alias": "local::google/gemma-4-26b-a4b", "status": 200, "error": null, "ms": 640 }
  ]
}

오류

상태error_type발생 조건
400invalid_requestid 쿼리 파라미터가 없거나 비어 있음
401invalid_api_keyAuthorization 헤더가 없거나, 키가 두 형식 중 어느 쪽으로도 파싱되지 않음
404not_supported그 id 를 가진 사용 기록이 여러분 계정 소유가 아님(또는 아예 존재하지 않음)

일반적인 오류 형식은 오류와 디버깅 을 보세요.

관련 문서

  • 스트리밍 — 스트리밍 요청의 기록이 [DONE] 직후 잠깐 늦게 나타날 수 있는 이유
  • 요금 계산 방식total_cost 뒤에 있는 산식
  • 모델 폴백provider_responses 를 읽고 요청이 그 경로를 탄 이유를 확인하기

마지막 수정 2026. 9. 5.