مرجع خطاها
مرجع کامل. اگر دنبال این هستید که یک کد مشخص یعنی چه، همینجاست. برای اینکه در کدتان چه کاری انجام دهید، جدول تصمیم در پایین صفحه را ببینید.
شکل بدنهٔ خطا
بدنهٔ خطا همیشه یک فیلد detail دارد و فیلد ok ندارد:
{"detail": "missing scope targets:write"}
بر اساس کد وضعیت HTTP تصمیم بگیرید، نه متن بدنه. متن detail برای انسان است و ممکن است
تغییر کند؛ الگوی ثابت، وضعیت HTTP است.
جدول مرجع
| وضعیت | در چه حالتی |
|---|---|
400 | کرسر خراب یا منقضی؛ period با قالب غلط؛ فیلتر status ناشناخته |
401 | کلید نفرستادهاید، ناشناخته است یا باطل شده |
403 | کلید معتبر، دسترسی لازم را ندارد |
404 | task_id / target_id ناشناخته؛ شناسهٔ حساب دیگر؛ درخواستی که چیزی را عوض نکرد |
422 | فیلد جاافتاده یا ناشناخته در بدنه، مقدار خارج از بازه، فیلد غیرقابل تغییر |
429 | محدودیت نرخ رد شده — Retry-After را ببینید |
چهار موردی که بیشتر غافلگیر میکنند
404 برای شناسهٔ دیگران
task_id یا target_id یک حساب دیگر 404 میگیرد، نه 403. وجودش فاش نمیشود؛
403 تأیید میکرد که این شناسه واقعی است.
404 نمیتوانید تشخیص دهید شناسه وجود ندارد یا متعلق به دیگری است — و نباید بتوانید.
اگر لازم دارید بدانید، از پشتیبانی بپرسید، نه از تفاوت کد وضعیت. مالکیت داده در
احراز هویت توضیح داده شده.404 برای درخواستی که چیزی را عوض نکرد
PATCH /targets/{id} وقتی واقعاً هیچ فیلدی تغییر نکرده باشد 404 میگیرد. این عمدی است
تا این پرسش قابل پاسخ بماند که «ویرایش من اعمال شد؟».
| میخواهید | چه کنید |
|---|---|
| مطمئن شوید ویرایش اعمال شده | 404 یعنی «چیزی برای اعمال نبود» |
| ست کردن دقیق همین مقدار | اول GET کنید و فقط تفاوت را بفرستید |
یک POST ساده که idempotent است | از POST /targets استفاده کنید، نه PATCH |
404 در PATCH همیشه «پیدا نشد» نیست. اگر کلاینت شما 404 را به معنی «هدف وجود
ندارد» ترجمه میکند، در حالی که هدف هست و فقط تفاوتی نبوده، به کاربر اطلاعات غلط میدهد.
متن خطا را هم بخوانید، یا از POST استفاده کنید که این ابهام را ندارد.422 برای فیلد ناشناخته
فیلد ناشناختهٔ بدنه رد میشود، نه اینکه بیصدا دور ریخته شود. یک املای غلط مثل
cadence_hour در غیر این صورت نادیده گرفته میشد و زمانبندی شما هرگز تغییر نمیکرد.
حالت 422 | یعنی چه |
|---|---|
| فیلد بدنهٔ جاافتاده | فیلد الزامی نفرستادهاید |
| فیلد ناشناخته در بدنه | املا را اشتباه نوشتهاید |
| مقدار خارج از بازه | مثلاً cadence_hours صفر یا منفی |
| فیلد غیرقابل تغییر | domain، keyword یا city را در PATCH فرستادهاید |
422 برای فیلد غیرقابل تغییر
آن سهتایی هویت هدف است و تغییر نمیکند. کلمهٔ کلیدیِ ذخیرهشده همان چیزی است که
واقعاً جستجو میشود؛ تغییرش تاریخچه را بازنویسی میکند، نه اینکه آن را ویرایش. برای رهگیری یک پرسوجوی متفاوت، DELETE کنید و بعد POST — در اهداف
توضیح داده شده.
کدام خطا را تلاش مجدد کنیم
این جدول تصمیم است، نه جدول مرجع:
| وضعیت | تلاش مجدد؟ | چرا |
|---|---|---|
400 | خیر | ورودی شما خراب است؛ فرستادن دوبارهٔ همان ورودی خراب چیزی را درست نمیکند |
401 | هرگز | کلید با تلاش دوباره درست نمیشود؛ فقط بینهایت حلقه میزنید |
403 | هرگز | مجوز باید عوض شود؛ این کار شما (انسان) است نه کد |
404 | خیر | یا مال شما نیست یا وجود ندارد |
422 | خیر | بدنه غلط است |
429 | بله | با زمان حل میشود؛ Retry-After را رعایت کنید |
401 و 403 هرگز با تلاش مجدد حل نمیشوند. کدی که با این دو مثل 429 برخورد میکند، در حلقه میافتد — 401 چون کلید همان است و 403 چون مجوز همان است. جزئیات در
احراز هویت.حالتی که در جدول نیست: Blocked
این کد وضعیت نیست. اجرایی که کپچا خورده 200 برمیگرداند و مشکل در فلگهای سند
گزارش میشود:
| نشانه | کجا |
|---|---|
flags.blocked: true | سند نتیجه |
status: "Blocked" | search_metadata در خروجی serpapi |
blocked در شمارندهها | مصرف |
Blocked را با همان ورودی دوباره نفرستید. کپچا با تکرار بیتغییر دوباره بلاک
میشود. ورودی را عوض کنید — شهر دیگر یا device متفاوت — یا صبر کنید. توضیح کامل در
نتایج.الگوی کلی
if r.status_code in (401, 403):
raise ConfigurationError("کلید یا مجوز را اصلاح کنید") # تلاش مجدد بیفایده
if r.status_code == 404:
raise LookupError("پیدا نشد، یا متعلق به شما نیست")
if r.status_code == 422:
raise ValueError(r.json()["detail"]) # بدنهٔ ورودی غلط
if r.status_code == 429:
time.sleep(int(r.headers["Retry-After"])) # تنها موردی که صبر میکند
r.raise_for_status()