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.
hashstringsha256(평문 키) 를 hex 64자로 쓴 값. 키를 지목하는 유일한 주소이며 /keys/{hash} 의 경로 세그먼트로 그대로 쓴다.
labelstring마스킹 문자열 sk-mo-v1-au7…890. 화면에 키를 구분해 보여 주기 위한 것이지 인증에 쓸 수 없다.
namestring발급할 때 붙인 이름.
disabledbooleantrue 면 이 키로는 추론이 되지 않는다. 사용자가 직접 끈 경우뿐 아니라 상태가 active 가 아닌 모든 경우(잔액 소진 자동 정지, 관리자 정지)가 true 로 합쳐진다. 왜 멈췄는지는 이 필드로 구별되지 않는다 — 그 키로 요청을 보내 보면 402(충전하면 풀림)와 403(관리자만 풀 수 있음)으로 갈린다.
limitnumber | null사용 한도(원). null 이면 무제한.
usagenumberlimit_reset 기간의 사용액(원). 기간 경계는 Asia/Seoul 기준이고, 한도가 never/미설정이면 전체 누적이다. limit_reset 자체는 이 객체에 담기지 않는다 — 값이 필요하면 GET /key 로 그 키를 조회한다.
응답 예시
{
"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 의 여덟 필드와 같다. 갓 만든 키이므로 usage 는 0, updated_at 은 null 이다.
keystring평문 키. sk-mo-v1- + hex 64자. 이 응답에서 딱 한 번 나오고 그 뒤로는 어디에서도 볼 수 없다.
{
"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 으로 해싱한 값과 정확히 같다. 직접 확인해 볼 수 있다.
printf '%s' "$PLAINTEXT_KEY" | sha256sum오류
| 상태 | error_type | 언제 |
|---|---|---|
| 400 | invalid_request | 본문이 JSON 이 아님. name 이 없거나 빈 문자열. limit 이 숫자가 아님. limit_reset 이 네 값 중 하나가 아님 |
| 401 | invalid_api_key | 헤더 없음. 추론 키로 호출. 존재하지 않거나 꺼졌거나 폐기된 키 |
| 401 | expired_api_key | 관리 키가 만료됨 |
| 402 | insufficient_credits | 관리 키가 suspended_no_credit 상태 |
| 403 | key_suspended | 관리자가 관리 키를 정지함 |
| 500 | server | 그 밖의 서버 오류 |
{
"error": {
"code": 400,
"message": "`name` 이 필요합니다.",
"metadata": { "error_type": "invalid_request" }
}
}발급한 키가 멈추는 세 가지 경우
| 상태 | 누가 걸었나 | 요청하면 | 어떻게 풀리나 |
|---|---|---|---|
suspended_no_credit | 시스템(잔액 소진) | 402 insufficient_credits | 충전하면 자동 복구 |
suspended_admin | 관리자 | 403 key_suspended | 관리자만 해제 |
revoked | DELETE /keys/{hash} | 401 invalid_api_key | 영구. 되돌릴 수 없다 |
여기에 더해 키에 limit 을 걸었고 기간 사용액이 한도 이상이면 402 key_limit_exceeded 가 나온다. 이때 metadata.limit_krw 와 metadata.usage_krw 가 함께 온다.
관련 문서
- GET/PATCH/DELETE /keys/{hash} — 키 하나를 조회·수정·폐기한다
- GET /key · /auth/key — 지금 쓰는 키의 상태
- 관리 API 키 — 관리 키를 언제 쓰는가
- 오류와 디버깅 —
error_type전체 표
마지막 수정 2026. 9. 5.