429 dari OpenAI berarti Anda telah melewati salah satu dari lima batas — dan tugas pertama adalah mencari tahu yang mana, karena perbaikannya mengarah ke solusi yang berlawanan. Halaman ini membahas apa yang diukur setiap batas, cara membaca jawabannya langsung dari header respons, logika percobaan ulang yang benar-benar menghentikan error, serta apa yang harus dilakukan ketika backoff yang tepat belum cukup.
Terverifikasi 30 September 2026 berdasarkan dokumentasi batas laju OpenAI.
Lima batas, dan salah satunya dapat terpicu
| Metrik | Mengukur | Biasanya terasa ketika |
|---|---|---|
| RPM | Permintaan per menit | Banyak panggilan kecil — klasifikasi, embedding, loop agen |
| TPM | Token per menit | Beberapa panggilan besar — RAG dengan konteks hasil retrieval yang besar, dokumen panjang |
| RPD | Permintaan per hari | Tier Free dan tier rendah; pekerjaan batch yang menghabiskan kuota harian |
| TPD | Token per hari | Sama, tetapi diukur dalam token |
| IPM | Gambar per menit | Beban kerja pembuatan gambar |
Batas mana pun yang habis lebih dahulu akan memicu error, jadi “kita masih jauh dari batas token” bukan alasan untuk mengesampingkan pembatasan laju — Anda mungkin masih jauh dari TPM tetapi tepat berada di batas RPM. Batas berlaku per organisasi dan per model, bukan per kunci: membuat kunci tambahan tidak membuat kuota tambahan.
Seperti apa 429
HTTP/1.1 429 Too Many Requests
retry-after: 12
x-ratelimit-limit-requests: 500
x-ratelimit-remaining-requests: 0
x-ratelimit-reset-requests: 12s
x-ratelimit-limit-tokens: 200000
x-ratelimit-remaining-tokens: 143820
x-ratelimit-reset-tokens: 17s
{
"error": {
"message": "Rate limit reached for gpt-5.4 in organization org-... on requests per min (RPM).",
"type": "requests",
"code": "rate_limit_exceeded"
}
}Semua yang Anda perlukan ada di respons tersebut. Isi respons menyebutkan dimensinya (“requests per min (RPM)”), sedangkan header memberi tahu batas persisnya, jumlah yang tersisa, dan kapan batas tersebut pulih.
| Header | Makna |
|---|---|
retry-after | Jumlah detik minimum sebelum mencoba lagi |
x-ratelimit-limit-requests | Jumlah maksimum permintaan yang diizinkan sebelum batas habis |
x-ratelimit-remaining-requests | Permintaan yang tersisa sebelum batas habis |
x-ratelimit-limit-tokens | Jumlah maksimum token yang diizinkan |
x-ratelimit-remaining-tokens | Token yang tersisa |
x-ratelimit-reset-requests / -reset-tokens | Waktu hingga setiap penghitung direset — penghitung direset secara independen |
Tier penggunaan
Batas Anda ditentukan oleh tier penggunaan, yang secara otomatis dinaikkan OpenAI seiring akumulasi pengeluaran kumulatif:
| Tingkat | Kualifikasi | Batas penggunaan bulanan |
|---|---|---|
| Gratis | Pengguna di wilayah yang diizinkan | $100 / bulan |
| Tingkat 1 | $5 dibayar | $100 / bulan |
| Tingkat 2 | $50 dibayar | $500 / bulan |
| Tingkat 3 | $100 dibayar | $1.000 / bulan |
| Tingkat 4 | $250 dibayar | $5.000 / bulan |
| Tingkat 5 | $1.000 dibayar | $200.000 / bulan |
Sengaja tidak dicantumkan di sini: angka RPM dan TPM per model. Angka tersebut berbeda untuk setiap model, berubah ketika model baru dirilis, dan dapat disesuaikan per akun — jadi tabel apa pun yang dipublikasikan di halaman pihak ketiga hanyalah perkiraan yang berlaku pada tanggal tertentu. Dua sumber resmi untuk akun Anda sendiri adalah halaman batas di dashboard OpenAI dan header x-ratelimit-* pada setiap respons yang sudah Anda terima. Bacalah header tersebut.
Solusinya: patuhi Retry-After, lalu tambahkan jitter
Rekomendasi terdokumentasi OpenAI adalah exponential backoff dengan jitter, dengan mengikuti Retry-After jika respons menyertakannya. Kedua bagian ini penting. Tanpa header tersebut, Anda mungkin mencoba lagi terlalu cepat; tanpa jitter, setiap klien yang gagal pada saat yang sama akan mencoba lagi pada saat yang sama dan kembali gagal bersama-sama — thundering herd yang mengubah satu detik buruk menjadi satu menit buruk.
import random, time
import openai
client = openai.OpenAI()
def call_with_backoff(fn, *, max_attempts=6, base=0.5, cap=30.0):
"""Retry 429s: honour Retry-After when present, jittered backoff otherwise."""
for attempt in range(max_attempts):
try:
return fn()
except openai.RateLimitError as err:
if attempt == max_attempts - 1:
raise
# The server's own answer beats any formula you invent.
retry_after = (err.response.headers or {}).get("retry-after")
if retry_after:
delay = float(retry_after)
else:
# Full jitter: sleep a random point in [0, 2^n * base], capped.
# Without the randomness every client that failed at the same
# instant retries at the same instant and fails again together.
delay = random.uniform(0, min(cap, base * 2**attempt))
time.sleep(delay)
resp = call_with_backoff(lambda: client.responses.create(
model="gpt-5.4",
input="Summarise this changelog in three bullets.",
))Bentuk yang sama dalam TypeScript:
import OpenAI from "openai";
const client = new OpenAI();
const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));
export async function callWithBackoff<T>(
fn: () => Promise<T>,
{ maxAttempts = 6, baseMs = 500, capMs = 30_000 } = {},
): Promise<T> {
for (let attempt = 0; ; attempt++) {
try {
return await fn();
} catch (err) {
const status = (err as { status?: number }).status;
if (status !== 429 || attempt === maxAttempts - 1) throw err;
const retryAfter = (err as { headers?: Headers }).headers?.get("retry-after");
const delay = retryAfter
? Number(retryAfter) * 1000
: Math.random() * Math.min(capMs, baseMs * 2 ** attempt);
await sleep(delay);
}
}
}
const resp = await callWithBackoff(() =>
client.responses.create({ model: "gpt-5.4", input: "Hello" }),
);SDK resmi sudah mencoba ulang 429 untuk Anda, sehingga sebagian besar aplikasi hanya memerlukan ini ketika membungkus panggilan dalam klien HTTP sendiri, atau ketika menginginkan perilaku berbeda — batas yang lebih lama untuk pekerjaan latar belakang, atau kegagalan seketika untuk permintaan yang menghadap pengguna ketika menunggu 12 detik lebih buruk daripada menerima error.
Pantau sebelum bermasalah
Penghitung tersedia pada setiap respons, bukan hanya pada kegagalan. Mencatat nilai yang tersisa mengubah pembatasan laju dari insiden menjadi pengukur — Anda dapat melihat ruang tersisa menyusut beberapa hari sebelum peluncuran menghabiskannya.
# Log the remaining counters on every response, not just on failures.
# By the time you see a 429 the useful signal is already an hour old.
resp = client.responses.with_raw_response.create(model="gpt-5.4", input="…")
h = resp.headers
log.info(
"openai_quota model=%s req_left=%s tok_left=%s reset_req=%s reset_tok=%s",
"gpt-5.4",
h.get("x-ratelimit-remaining-requests"),
h.get("x-ratelimit-remaining-tokens"),
h.get("x-ratelimit-reset-requests"),
h.get("x-ratelimit-reset-tokens"),
)
parsed = resp.parse() # the normal response objectDua kebiasaan yang layak diterapkan bersamaan: beri peringatan ketika x-ratelimit-remaining-tokens turun di bawah fraksi tertentu dari batas, bukan berdasarkan jumlah 429, dan tambahkan jitter pada jadwal, bukan hanya pada percobaan ulang. Cron yang menjalankan semuanya pada :00 akan menciptakan burst-nya sendiri.
Ketika backoff bukan jawabannya
Backoff yang tepat memperbaiki burst. Backoff tidak melakukan apa pun untuk permintaan berkelanjutan yang melebihi batas Anda — dalam kondisi itu, percobaan ulang hanya menunda kegagalan. Perbaikan struktural, kira-kira berdasarkan tingkat usaha:
- Batasi output. Token penalaran ditagihkan dan dihitung sebagai output, sehingga generasi tanpa batas adalah cara tercepat menghabiskan TPM.
- Ringkas konteks hasil retrieval. Pada batas TPM, mengurangi separuh chunk yang diambil akan menggandakan throughput Anda tanpa biaya tambahan.
- Pilih model dengan ukuran yang tepat. Langkah klasifikasi tidak memerlukan model frontier, dan model kecil memiliki anggaran terpisahnya sendiri.
- Pisahkan beban kerja. Pekerjaan batch dan traffic sensitif-latensi yang bersaing untuk satu batas tingkat organisasi adalah bentuk masalah ini yang paling sering disebabkan oleh diri sendiri.
- Naikkan tier. Tier bergerak mengikuti pengeluaran kumulatif, jadi hal ini sering kali sudah berlangsung.
Menyebarkan beban di beberapa keluarga model
Item terakhir dalam daftar itulah tempat gateway menunjukkan manfaatnya. Kunavo menyediakan API yang kompatibel dengan OpenAI — SDK yang sama, bentuk panggilan yang sama, satu kunci — di beberapa keluarga model, sehingga memindahkan beban kerja dari batas yang jenuh cukup dengan mengubah string model, bukan melakukan integrasi kedua:
from openai import OpenAI
client = OpenAI(
api_key="sk-kn-...",
base_url="https://api.kunavo.com/v1",
)
# Same SDK, same call shape — the model string chooses the family.
client.chat.completions.create(
model="gpt-5-6-terra", # or claude-sonnet-5, claude-haiku-4-5, …
messages=[{"role": "user", "content": "Hello"}],
)Secara konkret: pekerjaan batch untuk meringkas yang sebelumnya bersaing dengan traffic produksi Anda dapat berjalan pada claude-haiku-4-5 dengan tarif $0,70 / $3,50 per 1M, sementara jalur sensitif-latensi tetap menggunakan gpt-5-6-terra ($0,70 / $4,20) atau claude-sonnet-5 ($1,40 / $7,00). Keluarga berbeda, antrean berbeda.
Perjelas apa yang dilakukan dan tidak dilakukan solusi ini. Solusi ini menghilangkan bottleneck satu akun-satu model dan menyediakan tempat untuk failover. Solusi ini tidak menciptakan kapasitas: jika volume total Anda benar-benar melebihi batas yang diizinkan tier mana pun, jawabannya tetap menaikkan tier atau mengurangi pekerjaan. Tarif untuk setiap model tersedia di halaman harga, dan panduan setara untuk batas Anthropic ada di Claude API 429 rate_limit_error.
Pertanyaan umum
Berapa batas laju API OpenAI?
OpenAI mengukur lima dimensi sekaligus—RPM (permintaan per menit), TPM (token per menit), RPD (permintaan per hari), TPD (token per hari), dan IPM (gambar per menit)—serta mengembalikan HTTP 429 segera setelah salah satunya terlampaui. Batas aktual bergantung pada tier penggunaan Anda dan model tertentu, jadi angka resmi untuk akun Anda tersedia di halaman limits organisasi Anda dalam dasbor OpenAI dan pada header x-ratelimit-* di setiap respons, bukan dalam tabel yang dipublikasikan.
Apa saja tier penggunaan OpenAI?
Per 30 September 2026 OpenAI mendokumentasikan enam tier, masing-masing dibuka berdasarkan total pengeluaran dan masing-masing memiliki batas penggunaan bulanan: Free (tersedia di wilayah yang didukung, $100/bulan), Tier 1 setelah pembayaran $5 ($100/bulan), Tier 2 setelah pembayaran $50 ($500/bulan), Tier 3 setelah pembayaran $100 ($1.000/bulan), Tier 4 setelah pembayaran $250 ($5.000/bulan), dan Tier 5 setelah pembayaran $1.000 ($200.000/bulan). Promosi berlangsung otomatis seiring akumulasi pengeluaran.
Bagaimana cara memperbaiki 429 rate_limit_exceeded dari OpenAI?
Patuhi header Retry-After jika respons menyertakannya; jika tidak, coba lagi dengan backoff eksponensial ditambah jitter acak — ini adalah rekomendasi yang didokumentasikan oleh OpenAI sendiri. SDK resmi sudah mencoba ulang secara otomatis; klien HTTP yang dibuat sendiri harus mengimplementasikannya. Jika 429 tetap terjadi setelah backoff yang benar, Anda benar-benar melampaui kuota, bukan sekadar mengirim lonjakan, dan solusinya bersifat struktural: buat batch lebih kecil, batasi jumlah maksimum token keluaran, sebarkan pekerjaan terjadwal sepanjang satu menit, atau pindah ke tingkat yang lebih tinggi.
Batas laju mana yang sebenarnya saya capai?
Baca header-nya. Nilai nol pada x-ratelimit-remaining-requests berarti Anda mencapai batas permintaan; nilai nol pada x-ratelimit-remaining-tokens berarti Anda mencapai batas token. Keduanya di-reset secara independen—x-ratelimit-reset-requests dan x-ratelimit-reset-tokens memberi tahu kapan masing-masing pulih. Isi pesan juga menyebutkan dimensinya. Menebak di antara keduanya membuang waktu karena solusinya berlawanan: batas permintaan memerlukan antrean, sedangkan batas token memerlukan prompt yang lebih kecil.
Apakah batas laju berlaku per key atau per organisasi?
Per organisasi dan per model, bukan per key. Membuat key API tambahan tidak menciptakan kuota tambahan. Karena itu, beban kerja produksi yang sibuk dan pekerjaan batch dalam organisasi yang sama saling berebut batas yang sama—dan mengisolasinya lebih penting daripada menambah key.
Bisakah gateway membantu mengatasi batas laju OpenAI?
Gateway membantu pada kondisi ketika batas per model dari satu akun menjadi bottleneck, karena gateway memungkinkan Anda memindahkan pekerjaan ke keluarga model lain di balik key dan SDK yang sama—pekerjaan batch summarisation tidak perlu berada dalam antrean yang sama dengan lalu lintas yang sensitif terhadap latensi. Gateway tidak menciptakan kapasitas dari ketiadaan: jika volume total benar-benar melebihi batas yang diizinkan satu tier, jawabannya tetap menaikkan tier atau mengurangi pekerjaan.
Mengapa akun yang baru dibuat sudah terkena pembatasan laju?
Akun Free dan Tier 1 memiliki batas harian (RPD dan TPD) yang tidak dimiliki tier lebih tinggi, sehingga skrip pengujian sederhana dapat menghabiskan jatah sehari dalam satu sore. Tier 1 terbuka setelah pembayaran kumulatif mencapai $5.
Apakah 429 menimbulkan biaya?
Tidak — permintaan yang ditolak tidak diproses dan tidak ditagihkan. Dampaknya adalah latensi, serta apa pun yang dilakukan logika percobaan ulang Anda terhadap latensi tersebut.
Apakah lebih banyak kunci API akan memberi saya throughput lebih besar?
Tidak. Batas berlaku per organisasi dan per model. Kunci tambahan berguna untuk atribusi dan pencabutan akses, bukan untuk menambah kapasitas.
Haruskah saya menangani 429 atau membiarkan SDK yang menanganinya?
Biarkan SDK menangani kasus umum, dan tangani sendiri saat perilaku default tidak sesuai kebutuhan: permintaan yang menghadap pengguna dan harus gagal dengan cepat, atau pekerjaan latar belakang yang dapat menunggu jauh lebih lama daripada batas default.
Bagaimana dengan 429 yang sebenarnya disebabkan oleh kuota yang habis?
Batas penggunaan bulanan yang habis juga muncul sebagai 429, dan berapa pun durasi backoff tidak akan mengatasinya — isi pesan membedakan keduanya. Jika penghitung pada header masih sehat tetapi permintaan tetap ditolak, periksa penagihan sebelum mengubah kode percobaan ulang.