Max 구독 중에도 별도 API 청구가 발생했다.
gateway 인증 방식이 billing path를 갈랐기 때문이다.
4월 말 Anthropic Console usage를 확인했다.
$49.50. $48.90. $49.20.
2~3일 간격으로 API 청구가 누적되고 있었다. 월 기준으로는 $500 수준.
문제는 이미 Max 구독 상태였다는 점이다.
월 $100 정액제를 사용 중이었고, Claude 사용은 모두 그 안에서 처리된다고 생각하고 있었다.
하지만 실제로는 별도의 API billing path가 열려 있었다.
AI tooling을 여러 경로로 붙여 쓰는 경우 한 번쯤 확인해볼 만한 구조라 정리해둔다.
Anthropic 호출 경로가 여러 개 동시에 살아 있었다
mac mini 기준으로 확인된 경로는 3개였다.
- OpenClaw launchd daemon — Telegram bot 응답용 multi-LLM gateway. KeepAlive=true 상태.
- 별도 openclaw process — 터미널 세션에 남아 있던 실행 프로세스. 오래된 API key 유지 상태.
- Claude Desktop — 백그라운드 호출 유지.
개별 프로세스만 보면 이상이 없었다.
문제는 동일 provider로의 호출 경로가 중복 활성화돼 있었다는 점이다.
핵심은 인증 방식
OpenClaw는 다음 경로에 auth profile을 저장한다.
~/.openclaw/agents/main/agent/auth-profiles.json
설정 타입은 "type": "api_key" 이었다.
여기서 billing path가 갈린다.
api_key→ token 기반 직접 청구- OAuth(
sk-ant-oat-...) → Max quota 내부 처리
즉, Claude를 사용 중이더라도 gateway가 API key 기반이면 Max를 우회한다.
실제 비용은 subscription layer가 아니라 API layer에서 발생한다.
호출 비용은 context 구조에서 커졌다
persona spec + history가 누적되면서 turn당 input이 약 17k tokens 수준까지 증가해 있었다.
Sonnet 기준 대략:
- input $3 / 1M tokens
- turn당 약 $0.05 수준
여기에 background automation과 multi-instance 호출이 겹치면서 비용이 누적됐다.
/cost와 실제 billing은 다른 개념이다
Claude Code의 /cost는 실제 청구액이 아니다.
정확히는:
현재 세션을 API pricing으로 환산했을 때의 추정치
따라서:
- OAuth 기반 Max 사용 → 실제 추가 청구 0
- 하지만
/cost값은 계속 증가
반대로:
- API key 기반 호출 → 실제 billing 발생
/cost만 보면 OAuth usage와 구분되지 않음
실제 청구 기준은 Anthropic Console billing row다.
또 /usage 역시 billing이 아니라 quota 상태다.
즉:
/cost→ 비용 추정치/usage→ quota 소진량- Console billing → 실제 청구
이 셋은 서로 다른 레이어다.
정리하면 구조는 3층이다
1층. Infra cost
GPU, 서버, 전기세.
2층. LLM API billing
실제 돈이 빠져나가는 레이어.
- OAuth → subscription 내부 처리
- API key → token 직접 청구
3층. Quota / throttle
사용 제한 레이어.
- session token pool
- daily routine runs
- rate limit
- throttle
운영 중에는 이 세 층이 쉽게 섞여 보인다.
이후 운영 방식
지금은 다음 항목들을 주기적으로 확인한다.
- Anthropic Console billing row
- gateway auth type
- multi-instance process
- background cron
- macOS Keychain OAuth source
예를 들면:
ps -ef | grep openclaw
로 중복 process를 확인한다.
또 API key 기반 gateway는 기본 모델을 local fallback으로 변경했다.
Anthropic 호출은 opt-in 상태로만 유지한다.
실수 호출이 발생해도 billing이 0이 되도록 운영 레이어를 분리했다.
4월 24일 이후 cron job을 제거했고, 이후 billing row 증가가 멈췄다.
다만 일부 chat surface는 아직 API key path가 남아 있다.
현재도 정리 중이다.