GET/POST /keys

관리 키로 키를 나열하고 발급한다

계정이 가진 추론 키를 나열하고(GET), 새 추론 키를 발급한다(POST). 두 메서드 모두 관리 키로만 호출할 수 있다.

GET  https://openrouter.myip.co.kr/api/v1/keys
POST https://openrouter.myip.co.kr/api/v1/keys

인증 — 여기서 가장 많이 틀린다

Authorization: Bearer sk-mo-mgmt-v1-…관리 키만 통과한다. 추론 키(sk-mo-v1-…)로 부르면 401 invalid_api_key 다.

두 종류의 키는 하는 일이 다르다.

접두사할 수 있는 것
추론 키sk-mo-v1-/chat/completions, /completions, /generation, /key, /credits
관리 키sk-mo-mgmt-v1-/keys, /keys/{hash}, /key, /credits. 추론은 할 수 없다

관리 키는 API 로 만들 수 없다. 대시보드의 설정 → API 키 에서 kind를 관리 키로 골라 직접 발급한다. 관리 키가 관리 키를 발급하는 경로를 열어 두면 키 하나가 새는 순간 복구 지점이 없어지기 때문이다.

GET /keys — 나열

요청 파라미터

없다. 쿼리 파라미터를 받지 않는다.

openrouter 의 offset · include_disabled 는 구현하지 않았다. 우리 목록은 관리 키 소유자의 추론 키 전부를 최신 발급 순으로 한 번에 돌려준다. 다만 다음 두 가지는 목록에 없다.

  • 폐기된(revoked) 키. 되살릴 수 없으므로 보여 줄 이유가 없다.
  • 관리 키 자신. 발급된 추론 키만 나온다.

사용자가 껐을 뿐인 키(disabled: true)와 잔액 소진·관리자 정지로 멈춘 키는 목록에 남아 있고, 모두 disabled: true 로 보인다.

요청 예시

curl https://openrouter.myip.co.kr/api/v1/keys \
  -H "Authorization: Bearer $MYIP_MANAGEMENT_KEY"

응답

{"data": [ … ]} 이고 각 항목은 여덟 개 필드를 가진 키 객체다. 이 객체는 POST /keys, GET /keys/{hash}, PATCH /keys/{hash} 가 모두 똑같이 돌려준다.

created_atstring

발급 시각(ISO 8601).

updated_atstring | null

마지막 수정 시각. 한 번도 고치지 않았으면 null.

hashstring

sha256(평문 키) 를 hex 64자로 쓴 값. 키를 지목하는 유일한 주소이며 /keys/{hash} 의 경로 세그먼트로 그대로 쓴다.

labelstring

마스킹 문자열 sk-mo-v1-au7…890. 화면에 키를 구분해 보여 주기 위한 것이지 인증에 쓸 수 없다.

namestring

발급할 때 붙인 이름.

disabledboolean

true 면 이 키로는 추론이 되지 않는다. 사용자가 직접 끈 경우뿐 아니라 상태가 active 가 아닌 모든 경우(잔액 소진 자동 정지, 관리자 정지)가 true 로 합쳐진다. 왜 멈췄는지는 이 필드로 구별되지 않는다 — 그 키로 요청을 보내 보면 402(충전하면 풀림)와 403(관리자만 풀 수 있음)으로 갈린다.

limitnumber | null

사용 한도(원). null 이면 무제한.

usagenumber

limit_reset 기간의 사용액(원). 기간 경계는 Asia/Seoul 기준이고, 한도가 never/미설정이면 전체 누적이다. limit_reset 자체는 이 객체에 담기지 않는다 — 값이 필요하면 GET /key 로 그 키를 조회한다.

응답 예시

json
{
  "data": [
    {
      "created_at": "2026-09-01T02:11:40.881Z",
      "updated_at": null,
      "hash": "9f2c1d0a7b3e4f5061728394a5b6c7d8e9f0112233445566778899aabbccddee",
      "label": "sk-mo-v1-au7…890",
      "name": "production",
      "disabled": false,
      "limit": 100000,
      "usage": 25500
    },
    {
      "created_at": "2026-08-20T11:05:02.130Z",
      "updated_at": "2026-08-29T09:41:18.004Z",
      "hash": "1a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f809",
      "label": "sk-mo-v1-c3f…21b",
      "name": "staging",
      "disabled": true,
      "limit": null,
      "usage": 0
    }
  ]
}

POST /keys — 발급

추론 키를 만든다. kind 를 받지 않으므로 이 경로로는 관리 키를 만들 수 없다.

요청 파라미터

namestring필수

키 이름. 빈 문자열이나 공백만 있는 문자열은 400 이다. 앞뒤 공백은 잘라서 저장한다.

limitnumber | null

사용 한도를 원(KRW) 단위 숫자로. 생략하거나 null 이면 무제한이다. 달러가 아니다 — 10 은 10원이지 10달러가 아니다.

limit_resetstring | null

한도가 초기화되는 주기. never · daily · weekly · monthly 중 하나이며, 다른 값은 400 이다. 생략하면 null 이고 한도는 발급 이후 누적 사용액에 걸린다. 경계는 Asia/Seoul 기준이다.

요청 예시

curl -X POST https://openrouter.myip.co.kr/api/v1/keys \
  -H "Authorization: Bearer $MYIP_MANAGEMENT_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "batch-worker",
    "limit": 50000,
    "limit_reset": "monthly"
  }'

응답

dataobject

방금 만든 키 객체. 위 GET /keys 의 여덟 필드와 같다. 갓 만든 키이므로 usage0, updated_atnull 이다.

keystring

평문 키. sk-mo-v1- + hex 64자. 이 응답에서 딱 한 번 나오고 그 뒤로는 어디에서도 볼 수 없다.

json
{
  "data": {
    "created_at": "2026-09-04T05:22:07.412Z",
    "updated_at": null,
    "hash": "4d6a8b2c0e1f3a5b7c9d0e2f4a6b8c0d1e3f5a7b9c1d3e5f7a9b1c3d5e7f9a1b",
    "label": "sk-mo-v1-8f2…c41",
    "name": "batch-worker",
    "disabled": false,
    "limit": 50000,
    "usage": 0
  },
  "key": "sk-mo-v1-8f2b6d1e0a4c7f93b5d8e02a6c1f4b7d9e3a5c8f0b2d4e6a8c0f2b4d6e8c41"
}

hash 는 응답의 key 를 sha256 으로 해싱한 값과 정확히 같다. 직접 확인해 볼 수 있다.

bash
printf '%s' "$PLAINTEXT_KEY" | sha256sum

오류

상태error_type언제
400invalid_request본문이 JSON 이 아님. name 이 없거나 빈 문자열. limit 이 숫자가 아님. limit_reset 이 네 값 중 하나가 아님
401invalid_api_key헤더 없음. 추론 키로 호출. 존재하지 않거나 꺼졌거나 폐기된 키
401expired_api_key관리 키가 만료됨
402insufficient_credits관리 키가 suspended_no_credit 상태
403key_suspended관리자가 관리 키를 정지함
500server그 밖의 서버 오류
json
{
  "error": {
    "code": 400,
    "message": "`name` 이 필요합니다.",
    "metadata": { "error_type": "invalid_request" }
  }
}

발급한 키가 멈추는 세 가지 경우

상태누가 걸었나요청하면어떻게 풀리나
suspended_no_credit시스템(잔액 소진)402 insufficient_credits충전하면 자동 복구
suspended_admin관리자403 key_suspended관리자만 해제
revokedDELETE /keys/{hash}401 invalid_api_key영구. 되돌릴 수 없다

여기에 더해 키에 limit 을 걸었고 기간 사용액이 한도 이상이면 402 key_limit_exceeded 가 나온다. 이때 metadata.limit_krwmetadata.usage_krw 가 함께 온다.

관련 문서

마지막 수정 2026. 9. 5.