Kontrol Biaya Claude Code/API: Budget Token, Alert, dan Batas Aman
Perkirakan biaya Claude Code/API, catat token, pasang alert, dan cegah tagihan tak terduga dengan contoh jalan.
Claude Code jauh lebih mudah dipakai sehari-hari ketika biayanya bisa dijelaskan sebelum tagihan datang. Biaya tidak hanya ditentukan oleh model. Ukuran konteks, file yang dibaca, panjang jawaban, prompt cache, dan cara autentikasi ikut menentukan apakah kamu memakai kuota langganan Claude atau billing API Anthropic.
Panduan ini dicek pada 2026-06-03 terhadap sumber resmi: Anthropic API pricing, Claude Code cost management, Prompt caching, Token counting, dan Usage and Cost API. Harga dapat berubah, jadi selalu cek halaman resmi sebelum membeli, membuat proposal, atau memberi estimasi ke klien.
Cara berpikir soal biaya
| Istilah | Arti praktis | Dampak biaya |
|---|---|---|
| Token | Unit yang dibaca dan ditulis Claude | File, log, prompt, dan kode panjang menaikkan pemakaian |
| Konteks | Riwayat chat, file terbaca, CLAUDE.md, definisi tool | Konteks lama ikut dibayar lagi pada request berikutnya |
| Prompt cache | Memakai ulang prefix prompt yang sama | Input berulang menjadi jauh lebih murah |
| Batas budget | Limit per task, hari, user, atau workspace | Mencegah workflow berguna berubah jadi biaya terbuka |
estimasi biaya = token input * tarif input
+ token cache write * tarif cache write
+ token cache read * tarif cache read
+ token output * tarif output
Per 2026-06-03, tabel resmi mencantumkan Sonnet 4.6 pada $3/MTok input dan $15/MTok output. Haiku 4.5 pada $1 dan $5. Opus 4.8/4.7/4.6 pada $5 dan $25. Cache read bernilai 10% dari tarif input dasar, sedangkan cache write 5 menit bernilai 1.25x.
Biaya yang paling sering melebar adalah output. Ubah “jelaskan semuanya dengan detail” menjadi “maksimal 5 temuan, urut severity, masing-masing 2 baris”.
Alur kontrol biaya
flowchart LR
A["Tentukan task"] --> B["Pangkas input"]
B --> C["Pilih model"]
C --> D["Estimasi token"]
D --> E{"Masuk budget?"}
E -- "Ya" --> F["Jalankan Claude"]
E -- "Tidak" --> B
F --> G["Catat usage"]
G --> H{"Lewat threshold?"}
H -- "Ya" --> I["Stop, alert, atau ganti model"]
H -- "Tidak" --> A
Di Claude Code, mulai dari /usage dan /context. Pakai /clear saat pindah ke task yang tidak terkait, dan /compact saat kamu ingin menyimpan keputusan tanpa membawa seluruh riwayat. Angka di /usage adalah estimasi lokal; billing resmi tetap dicek di Console, dan untuk organisasi lewat Usage and Cost API.
Contoh 1: estimasi biaya bulanan
Script ini tidak memanggil API. Ia menghitung biaya bulanan dari pemakaian harian dalam MTok.
// claude-cost-estimator.mjs
const RATES = {
opus48: { input: 5, output: 25, cacheRead: 0.5 },
sonnet46: { input: 3, output: 15, cacheRead: 0.3 },
haiku45: { input: 1, output: 5, cacheRead: 0.1 },
};
const [model = "sonnet46", days = "22", input = "0.25", output = "0.06", cacheRead = "0.20"] =
process.argv.slice(2);
if (!RATES[model]) {
throw new Error(`Unknown model: ${model}`);
}
const rate = RATES[model];
const dailyUsd =
Number(input) * rate.input +
Number(output) * rate.output +
Number(cacheRead) * rate.cacheRead;
console.log({
model,
workDays: Number(days),
dailyUsd: Number(dailyUsd.toFixed(4)),
monthlyUsd: Number((dailyUsd * Number(days)).toFixed(2)),
});
node claude-cost-estimator.mjs sonnet46 22 0.25 0.06 0.20
node claude-cost-estimator.mjs haiku45 22 0.25 0.06 0.20
Tujuannya bukan menebak tagihan secara sempurna. Tujuannya melihat apakah workflow ini kira-kira $15, $50, atau $500 per bulan. Tambahkan buffer 20-30% untuk tool definitions, retry, cache writes, dan output yang lebih panjang dari rencana.
Contoh 2: API call dengan batas harian
Contoh ini menghitung token sebelum mengirim request, mencatat usage aktual ke JSONL, dan berhenti jika proyeksi biaya melewati DAILY_BUDGET_USD.
npm init -y
npm i @anthropic-ai/sdk
// budgeted-message.mjs
import Anthropic from "@anthropic-ai/sdk";
import fs from "node:fs";
const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
const model = process.env.CLAUDE_MODEL ?? "claude-sonnet-4-6";
const maxTokens = Number(process.env.MAX_TOKENS ?? 700);
const dailyBudgetUsd = Number(process.env.DAILY_BUDGET_USD ?? 5);
const RATES = {
"claude-opus-4-8": { input: 5, output: 25, cacheWrite5m: 6.25, cacheRead: 0.5 },
"claude-sonnet-4-6": { input: 3, output: 15, cacheWrite5m: 3.75, cacheRead: 0.3 },
"claude-haiku-4-5": { input: 1, output: 5, cacheWrite5m: 1.25, cacheRead: 0.1 },
};
function usdFromUsage(usage, rate) {
return (
(usage.input_tokens ?? 0) * rate.input +
(usage.output_tokens ?? 0) * rate.output +
(usage.cache_creation_input_tokens ?? 0) * rate.cacheWrite5m +
(usage.cache_read_input_tokens ?? 0) * rate.cacheRead
) / 1_000_000;
}
function todayTotalUsd(path) {
if (!fs.existsSync(path)) return 0;
const today = new Date().toISOString().slice(0, 10);
return fs.readFileSync(path, "utf8")
.trim()
.split("\n")
.filter(Boolean)
.map((line) => JSON.parse(line))
.filter((row) => row.date === today)
.reduce((sum, row) => sum + row.usd, 0);
}
const messages = [
{ role: "user", content: "List only the top three bug risks in this TypeScript function." },
];
const rate = RATES[model];
if (!rate) throw new Error(`No rate table for ${model}`);
const counted = await anthropic.messages.countTokens({ model, messages });
const worstCaseUsd = (counted.input_tokens * rate.input + maxTokens * rate.output) / 1_000_000;
const logPath = "claude-usage.jsonl";
if (todayTotalUsd(logPath) + worstCaseUsd > dailyBudgetUsd) {
throw new Error(`Budget stop: projected daily spend exceeds $${dailyBudgetUsd}`);
}
const response = await anthropic.messages.create({
model,
max_tokens: maxTokens,
cache_control: { type: "ephemeral" },
system: "You are a concise senior code reviewer. Return only actionable findings.",
messages,
});
const usd = usdFromUsage(response.usage, rate);
fs.appendFileSync(logPath, JSON.stringify({
date: new Date().toISOString().slice(0, 10),
model,
usd: Number(usd.toFixed(6)),
usage: response.usage,
}) + "\n");
console.log({ id: response.id, usd: Number(usd.toFixed(6)), usage: response.usage });
ANTHROPIC_API_KEY=sk-ant-...
DAILY_BUDGET_USD=5 node budgeted-message.mjs
Untuk pemula, jelaskan tiga hal: timbang request sebelum dikirim, simpan kuitansi setelah selesai, dan hentikan sebelum budget harian habis.
Contoh 3: laporan usage tim
Organisasi dapat memakai Admin Usage and Cost API untuk laporan harian. Ini membutuhkan Admin API key dan tidak tersedia untuk akun individual biasa.
curl "https://api.anthropic.com/v1/organizations/usage_report/messages?\
starting_at=2026-06-01T00:00:00Z&\
ending_at=2026-06-08T00:00:00Z&\
group_by[]=model&\
bucket_width=1d" \
--header "anthropic-version: 2023-06-01" \
--header "x-api-key: $ANTHROPIC_ADMIN_KEY"
| Sinyal | Risiko | Tindakan |
|---|---|---|
| Porsi Opus | Task ringan memakai model premium | Arahkan ringkasan, terjemahan, formatting ke Sonnet/Haiku |
| Output tokens | Jawaban terlalu panjang | Batasi temuan, baris, dan max_tokens |
| Cache reads | cache_read_input_tokens mendekati nol | Hapus timestamp dan nilai acak dari prefix cache |
Tiga use case nyata
Developer solo: jadikan Sonnet default, simpan Opus untuk arsitektur dan debugging berat, lalu /clear saat berpindah task.
Konten dan lokalisasi: cache style guide dan glossary sebagai prefix stabil, lalu ganti hanya isi artikel. Untuk volume besar yang tidak real-time, pertimbangkan diskon 50% Batch API.
Training dan adopsi tim: hari pelatihan membuat concurrency naik. Tetapkan budget harian, threshold, dan aturan prompt sebelum sesi. Untuk program tim yang lebih terstruktur, lihat /training/.
Kesalahan umum
API key mengubah billing. Bantuan resmi menjelaskan bahwa ANTHROPIC_API_KEY bisa diprioritaskan dibanding subscription yang login di Claude Code. Cek dengan /status.
Cache diasumsikan, bukan diukur. Prompt cache perlu prefix yang stabil. Timestamp, UUID, atau daftar file dinamis di system prompt bisa merusak hit rate.
Output tidak dibatasi. Review perlu batas jumlah temuan, ringkasan perlu batas panjang, dan code generation perlu scope file yang jelas.
Harga lama disalin terus. Model dan harga berubah. Cek halaman resmi sebelum membuat kalkulator, proposal, atau materi training.
Proxy murah tanpa audit. Jika identitas model, retensi log, dan credential handling tidak jelas, diskon itu bisa berubah menjadi risiko.
Bacaan terkait
- Claude Code token optimization
- Claude Code pricing guide
- Claude Code context management
- Claude Code permission budget loop
Template budget, prompt, dan checklist kontrol biaya tersedia di /products/.
Hasil praktik
Dalam workflow konten ClaudeCodeLab, dampak terbesar datang dari kontrol sederhana: cache instruksi bersama, arahkan terjemahan dan formatting ke Haiku/Sonnet, pakai Opus hanya untuk keputusan sulit, dan tulis setiap usage ke JSONL. Mulailah dengan alert 80%, stop 100%, dan bersihkan konteks ketika task berubah.
PDF gratis: cheatsheet Claude Code
Masukkan email dan unduh satu halaman berisi command, kebiasaan review, dan workflow aman.
Kami menjaga datamu dan tidak mengirim spam.
Tentang penulis
Masa
Engineer yang berfokus pada workflow Claude Code praktis dan adopsi tim.
Artikel terkait
Permission safety ladder Claude Code: perluas akses tanpa kehilangan kontrol
Naik dari read-only ke edit terbatas, command bukti, dan cek deploy dengan kontrol yang jelas.
Claude Code Small PR Proof Pack: perubahan kecil yang mudah direview
Paket bukti untuk PR Claude Code: diff, check, URL publik, jalur CTA, dan rollback.
Review gate Claude Code sebelum commit: diff, test, URL publik, dan CTA
Cara memakai Claude Code sebelum commit: diff scope, build, URL publik, link Gumroad, CTA konsultasi, missing test, dan file tidak terkait.