# 429 Too Many Requests saat scraping: apa artinya dan cara memperbaikinya

> Apa arti HTTP 429 Too Many Requests untuk scraper, cara membaca Retry-After, dan kode Python untuk backoff dengan jitter. Perlambat; jangan menghindar.

- URL: https://crawlrelay.com/id/docs/errors/429-too-many-requests/
- Terakhir diperbarui: 2026-10-13
- Publisher: CrawlRelay (https://crawlrelay.com)

Kode status HTTP (4xx, kesalahan klien): pesan tepat di tiap alat, penyebab yang mungkin secara urut, dan perbaikan yang berhasil.

**Jawaban cepat — Apa arti 429 Too Many Requests dengan proxy?**

**429 Too Many Requests** artinya situs membatasi laju Anda: Anda mengirim lebih banyak permintaan daripada yang diterima dalam jendela waktu. Perbaikannya adalah mengirim lebih sedikit, bukan menyembunyikan lebih banyak. Dengan proxy residential CrawlRelay, hargai header `Retry-After`, batasi konkurensi per host, dan lakukan backoff eksponensial dengan jitter acak. Rotasi IP untuk melebihi batas situs melanggar sebagian besar ketentuan penggunaan.

## 429 Too Many Requests sekilas

| Atribut | Nilai |
| --- | --- |
| Kesalahan | 429 Too Many Requests |
| Tipe | Kode status HTTP (4xx, kesalahan klien) |
| Dikirim oleh | Situs target atau gateway API-nya |
| Didefinisikan dalam | RFC 6585, section 4 (Retry-After: RFC 9110, section 10.2.3) |
| Mencoba lagi? | Ya, setelah jeda Retry-After atau backoff eksponensial |
| Periksa pertama | Baca header Retry-After dan laju permintaan per detik per host Anda |

## Apa arti 429 Too Many Requests?

RFC 6585 memperkenalkan 429 untuk pembatasan laju. Server bisa menambahkan header `Retry-After`, berupa jumlah detik atau tanggal HTTP, untuk memberi tahu kapan harus kembali. API sering menambahkan header sendiri, seperti `X-RateLimit-Remaining`.

429 adalah jawaban paling sopan yang bisa diberikan situs kepada scraper. Itu menandakan konten tersedia, hanya saja tidak secepat laju Anda saat ini. Situs yang mengabaikan 429 biasanya akan menaikkan menjadi 403, CAPTCHA atau blokir permanen.

## Seperti apa a 429 dalam Python, curl, Node.js, dan browser?

Kegagalan yang sama dicetak berbeda di setiap alat. Ini adalah pesan yang perlu dicari di log Anda:

- **Python requests / httpx:** `status_code == 429`, biasanya dengan `Retry-After: 30`
- **Scrapy:** ditangani oleh `RetryMiddleware`, karena 429 ada di `RETRY_HTTP_CODES` bawaan
- **curl:** `HTTP/2 429` diikuti `retry-after:` di header respons
- **API:** dengan body JSON seperti `{"error": "rate_limited"}`

## Apa penyebab a 429?

Kemungkinan besar pertama:

- **Terlalu banyak konkurensi per host.** Lima puluh pekerja paralel di satu domain terlihat seperti serangan bagi kebanyakan situs.
- **Tanpa jeda antar permintaan**, atau jeda tetap yang membuat banyak pekerja melakukan permintaan bersamaan.
- **Retry tanpa backoff.** Gelombang retry setelah 429 pertama meningkatkan beban.
- **Batas berbagi.** Beberapa situs menghitung permintaan per akun, per kunci API, atau per cookie sesi, bukan per IP.
- **Endpoint berat.** URL pencarian dan penyaringan sering memiliki batas lebih ketat daripada halaman statis.

## Bagaimana cara mendiagnosis a 429 langkah demi langkah?

1. Catat nilai `Retry-After` dan header pembatas laju saat 429 pertama muncul.
2. Ukur laju permintaan nyata Anda per host, bukan total laju.
3. Periksa apakah batas mengikuti IP, cookie, atau kunci API: ubah satu per satu.
4. Baca dokumentasi API atau robots.txt situs; baris `Crawl-delay` menyatakan kecepatan yang diminta.

*Uji URL yang gagal dengan curl (port HTTP, verbose)*

```bash
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:PASSWORD@gw.crawlrelay.com:7777 https://TARGET_URL

# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URL
```

## Bagaimana cara memperbaiki a 429?

- **Hormati Retry-After.** Tunggu minimal waktu yang diminta server.
- **Batasi konkurensi per host**, bukan hanya secara global. Scrapy memiliki `CONCURRENT_REQUESTS_PER_DOMAIN` dan `AUTOTHROTTLE_ENABLED`.
- **Lakukan backoff eksponensial dengan jitter**: 1 detik, 2 detik, 4 detik, dst, plus fraksi acak, dibatasi maksimum.
- **Ambil lebih sedikit.** Cache respons, kirim `If-Modified-Since` atau `If-None-Match`, dan lewati halaman yang tidak berubah.
- **Gunakan API resmi** jika situs menyediakannya; batasannya biasanya terdokumentasi.

*Python: coba ulang dengan Retry-After, backoff eksponensial, dan jitter*

```python
import random
import time

import requests

PROXY = "http://USERNAME:PASSWORD@gw.crawlrelay.com:7777"
PROXIES = {"http": PROXY, "https": PROXY}
RETRY_STATUSES = {429, 502, 503, 504}


def fetch(url, attempts=5, timeout=(10, 30)):
    for attempt in range(attempts):
        try:
            r = requests.get(url, proxies=PROXIES, timeout=timeout)
        except (requests.exceptions.ConnectionError, requests.exceptions.Timeout):
            r = None  # dropped exit, reset or timeout: a new connection gets a new exit
        if r is not None and r.status_code not in RETRY_STATUSES:
            return r
        retry_after = r.headers.get("Retry-After", "") if r is not None else ""
        if retry_after.isdigit():
            wait = int(retry_after)
        else:
            wait = min(60, 2 ** attempt) + random.uniform(0, 1)
        time.sleep(wait)
    raise RuntimeError("giving up on %s after %d attempts" % (url, attempts))
```

## Haruskah saya mencoba lagi setelah a 429?

Ya, 429 memang dimaksudkan untuk dicoba ulang nanti. Tunggu jeda `Retry-After` jika server mengirimnya; jika tidak, gunakan backoff eksponensial dengan jitter dan batas maksimum. Hitung 429 berturut-turut per host dan turunkan konkurensi host saat jumlahnya bertambah. Fungsi Python di bawah ini melakukan bagian dasar tersebut.

## Bagaimana 429 Too Many Requests berlaku untuk CrawlRelay?

429 yang Anda terima lewat CrawlRelay membawa header dan body target sendiri: batasan milik situs, dan penjadwalan per host adalah tugas Anda. Gunakan sesi sticky saat situs menghitung permintaan per sesi, agar laju Anda tetap terukur, dan lihat [panduan konkurensi](https://crawlrelay.com/id/docs/concurrency/) untuk angka awal.

Gateway: `gw.crawlrelay.com`, port 7777 (HTTP, HTTPS melalui CONNECT) dan port 7778 (SOCKS5). Format username: `USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}`. Terkait: [403 Forbidden](https://crawlrelay.com/id/docs/errors/403-forbidden/) · [503 Service Unavailable](https://crawlrelay.com/id/docs/errors/503-service-unavailable/) · [Panduan konkurensi](https://crawlrelay.com/id/docs/concurrency/).

## 429 Too Many Requests: pertanyaan yang sering ditanyakan pengembang

### Haruskah saya merotasi IP untuk menghindari error 429?

Tidak. 429 adalah permintaan situs agar Anda memperlambat. Menyebar laju permintaan yang sama ke lebih banyak IP untuk tetap di bawah batas per-IP adalah penghindaran, dan sebagian besar ketentuan penggunaan melarangnya. Rotasi berguna untuk penyebaran beban dan lokasi, bukan untuk melewati batas yang diumumkan. Turunkan laju Anda dan gunakan cache jika bisa.

### Berapa lama harus menunggu setelah 429?

Tunggu jumlah detik di header `Retry-After`, atau sampai tanggal yang diberikan. Tanpa header, mulai dari satu atau dua detik dan gandakan jeda setelah setiap 429 baru, dengan tambahan acak dan batas sekitar satu menit. Lanjutkan dengan laju lebih rendah, bukan laju yang menyebabkan 429.

### Mengapa saya mendapat 429 dengan hanya beberapa permintaan per menit?

Batas kemungkinan per akun, cookie, atau kunci API, bukan per IP, atau endpoint bisa berat, seperti halaman pencarian. Beberapa situs juga menetapkan batas rendah untuk klien yang mereka klasifikasikan sebagai bot. Periksa header respons dan dokumentasi API situs, dan minta akses jika perlu lebih.

## Kesalahan proxy lain dalam referensi ini

- [401 Unauthorized vs 407](https://crawlrelay.com/id/docs/errors/401-unauthorized/)
- [403 Forbidden](https://crawlrelay.com/id/docs/errors/403-forbidden/)
- [407 Proxy Authentication Required](https://crawlrelay.com/id/docs/errors/407-proxy-authentication-required/)
- [429 Too Many Requests](https://crawlrelay.com/id/docs/errors/429-too-many-requests/)
- [502 Bad Gateway](https://crawlrelay.com/id/docs/errors/502-bad-gateway/)
- [503 Service Unavailable](https://crawlrelay.com/id/docs/errors/503-service-unavailable/)
- [504 Gateway Timeout](https://crawlrelay.com/id/docs/errors/504-gateway-timeout/)
- [Cannot connect to proxy (ProxyError)](https://crawlrelay.com/id/docs/errors/cannot-connect-to-proxy/)
- [Connection reset by peer (ECONNRESET)](https://crawlrelay.com/id/docs/errors/connection-reset/)
- [ERR_PROXY_CONNECTION_FAILED](https://crawlrelay.com/id/docs/errors/err-proxy-connection-failed/)
- [ERR_TUNNEL_CONNECTION_FAILED](https://crawlrelay.com/id/docs/errors/err-tunnel-connection-failed/)
- [Read timed out (ReadTimeout)](https://crawlrelay.com/id/docs/errors/read-timeout/)
- [SOCKS5 proxy errors](https://crawlrelay.com/id/docs/errors/socks5-proxy-errors/)
- [SSL: CERTIFICATE_VERIFY_FAILED](https://crawlrelay.com/id/docs/errors/ssl-certificate-verify-failed/)
- [SSL: WRONG_VERSION_NUMBER](https://crawlrelay.com/id/docs/errors/ssl-wrong-version-number/)

**Proxy residensial dengan dokumentasi yang membahas kasus kegagalan** Proxy residensial CrawlRelay dari US$0,50/GB, lalu lintas yang tidak pernah kedaluwarsa. [Lihat harga](https://crawlrelay.com/id/pricing/) · [Mulai cepat](https://crawlrelay.com/id/docs/)

---

CrawlRelay: CrawlRelay adalah layanan proxy residensial dan proxy seluler 4G/5G yang berfokus pada pengembang untuk scraper dan pipeline data AI: trafik pay-as-you-go tanpa kedaluwarsa mulai dari US$0,50/GB, dibayar dengan crypto, tanpa perlu unggah ID. Tanpa KYC — tanpa ID, tanpa selfie, tanpa dokumen. Bayar dengan crypto.
