ממשק ה-API Notiondesk עונה על כל שגיאה עם אותה מעטפת JSON וקובץ code הניתן לקריאה על ידי מכונה, מגביל כל מפתח ל-120 קריאות ו-20 כתיבות לדקה, ומאפשר לך לנסות שוב כל שינוי בבטחה עם כותרת Idempotency-Key. מאמר זה מפרט כל קוד שגיאה של Notiondesk ב-API, מסביר את מגבלות הקצב ואת הכותרות שלהן, ומראה כיצד לבנות ניסיונות חוזרים שלא ישנו דבר פעמיים.
מעטפת השגיאה של ה-API Notiondesk
כל שגיאה עונה על אותה צורה, וכל שדה תמיד קיים:
{
"object": "error",
"code": "validation_error",
"message": "The request parameters are invalid.",
"request_id": "0f2c1e94-7a1b-4c2d-9e3f-5a6b7c8d9e0f",
"errors": [
{"field": "page_size", "message": "This value should be between 1 and 100."}
]
}| שָׂדֶה | מַשְׁמָעוּת |
|---|---|
object | תמיד __נשמר_78__ |
code | השגיאה הניתנת לקריאה על ידי מכונה. הסתעפו את הקוד שלכם בשדה זה בלבד. |
message | הסבר קריא לבני אדם. הוא יכול להשתנות, לכן לעולם אל תנתחו אותו |
request_id | מזהה את הבקשה בעת פנייה לתמיכה. null כאשר הבקשה נכשלה לפני הגעה למסלול, לדוגמה בנתיב לא ידוע. |
errors | בעיות ברמת השדה, כל אחת עם field ו-message. ריק כאשר השגיאה אינה קשורה לקלט ספציפי. |
כיצד field נותן שם לערך
- שדה ברמה העליונה הוא שמו:
page_size.
- שדה בתוך רשימה נותן את השם לרשימה, לערך שבסוגריים, ולאחר מכן לשדה:
items[fr].page_title.
- הסוגריים מכילים את מזהה הערך כפי ששלחת אותו (
localeב-items,category_idב-changelog_categories) כאשר לכל ערך יש מזהה ייחודי. אחרת, הוא מכיל את מיקום האפס של הערך:items[0].locale.
- בעיה בבקשה בכללותה כוללת את
"field": null.
קודי שגיאה של Notiondesk ב-API
code | סטטוס HTTP | מַשְׁמָעוּת | מה לעשות |
|---|---|---|---|
authentication_error | 401 | המפתח או אסימון הגישה חסרים או שלא ניתן להשתמש בהם | בדוק את המפתח, את תוקפו ואת התוכנית. ראה אימות באמצעות Notiondesk API |
insufficient_scope | 403 | לתעודה חסר ההיקף הנדרש מהמסלול | השתמש במפתח עם ההיקף ששמו מופיע ב-WWW-Authenticate |
permission_denied | 402, 403 | לאישור אין אפשרות לבצע פעולה זו על משאב זה, לדוגמה מכיוון שהתוכנית חסרה התכונה. | בדוק את התוכנית ואת הגדרות מרכז העזרה. אל תנסה שוב ללא שינוי. |
invalid_version | 400 | הכותרת nd-version שמה גרסה לא ידועה | שלח 2026-10-16 או השמט את הכותרת |
validation_error | 400, 422 | פרמטר או שדה גוף אינם חוקיים, לא ידועים או מחוץ לטווח | תקן את השדות המפורטים ב-errors |
not_found | 404, 405 | הנתיב, המשאב או המתודה אינם קיימים | בדוק את המזהים ואת המתודה |
conflict_error | 409 | הבקשה מתנגשת עם המצב הנוכחי, לדוגמה, סנכרון כבר פועל | המתן, ואז נסה שוב |
idempotency_key_invalid | 400 | הכותרת Idempotency-Key ריקה או ארוכה מ-255 תווים | שלח 1 עד 255 תווים |
idempotency_key_reused | 422 | ה-Idempotency-Key כבר היה בשימוש עבור בקשה אחרת. | השתמש במפתח חדש עבור בקשה חדשה |
request_in_progress | 409 | בקשה עם אותו Idempotency-Key עדיין פועלת | המתן, ואז נסה שוב עם אותו מקש |
rate_limited | 429 | יותר מדי בקשות | המתן Retry-After שניות |
internal_error | 500 ומעלה | Notiondesk נכשל | נסה שוב מאוחר יותר, וציין את request_id אם תפנה לתמיכה |
בקשה למרכז עזרה או משאב מחוץ לסביבת העבודה שלך עונה על שאלה 404 not_found, כך שה-API לעולם לא חושף אם הוא קיים.
מגבלות קצב של API Notiondesk
לכל מפתח API ולכל מענק OAuth יש שני תקציבי בקשה, הנספרים על פני חלון הזזה של דקה אחת:
| תַקצִיב | מסלולים | בקשות לדקה |
|---|---|---|
| קורא | GET מסלולים | 120 |
| כותב | מסלולים POST, PATCH ו-DELETE | 20 |
דוחות אנליטיקס נחשבים גם כחלק מתקציב של 30 בקשות לדקה לכל מרכז עזרה , המשותף לכל מפתח ואפליקציית OAuth בסביבת העבודה.
לתגובות יש שלוש כותרות:
| כּוֹתֶרֶת | מַשְׁמָעוּת |
|---|---|
X-RateLimit-Limit | בקשות המותרות בחלון הנוכחי |
X-RateLimit-Remaining | בקשות שנותרו בחלון הנוכחי |
Retry-After | שניות עד לקבלת הבקשה הבאה; 0 כל עוד נותרות הבקשות |
בקשה חורגת מהתקציב עונה על 429 rate_limited. המתן את מספר השניות ב-Retry-After לפני שליחת הבקשה הבאה.
נסה שוב בבטחה עם Idempotency-Key
פסק זמן ברשת משאיר אותך לא בטוח האם שינוי התבצע. כותרת Idempotency-Key מאפשרת לך לשלוח את אותה בקשה שוב מבלי לשנות דבר פעמיים.
כל נתיב שמשנה משהו מקבל זאת: שינויים בהפניה מחדש של דף, עדכוני הגדרות ומיתוג, שינויי אינטגרציה וטריגרים של סנכרון. שלח ערך ייחודי של 1 עד 255 תווים, כגון UUID, בניסיון הראשון, ואת אותו ערך בכל ניסיון חוזר:
מה קורה בניסיון חוזר:
curl -X POST "https://api.notiondesk.so/sites/c74781f6-1aea-4e17-ab23-bbb8b4d174b6/page-redirects" \
-H "Authorization: Bearer $NOTIONDESK_API_KEY" \
-H "nd-version: 2026-10-16" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6f0d6b1e-create-getting-started" \
-d '{"type": "article", "source_path": "/legacy/getting-started", "target_id": "1761580412", "locale": "en"}'| נסה שוב | תוֹצָאָה |
|---|---|
| אותו מפתח, אותו גוף, אותו מסלול, לאחר סיום הבקשה הראשונה | התגובה הראשונה שוב, כולל סטטוס וגוף, עם X-Idempotent-Replay: true. שום דבר לא משתנה. |
| אותו מפתח בזמן שהבקשה הראשונה עדיין פועלת | 409 request_in_progress. המתן ונסה שוב |
| אותו מפתח עם מזהי גוף, מסלול או נתיב שונים | 422 __נשמר_24__ |
| אותו מפתח ואותו גוף לאחר שהבקשה הראשונה ענתה על שגיאה | הבקשה פועלת שוב |
תגובה מוצלחת נושאת את X-Idempotent-Replay: false בפעם הראשונה ואת true בהשמעה חוזרת. Notiondesk שומר מפתח למשך 24 שעות לפחות. מפתח שייך למפתח ה-API או להענקת OAuth ששלחו אותו, והענקת OAuth שומרת את המפתחות שלו לאורך רענון האסימון.
ללא הכותרת, בקשה רצה פעם אחת, וניסיון חוזר רצה שוב.
אסטרטגיית ניסיון חוזר שעובדת
- צור
Idempotency-Keyאחד לכל שינוי לוגי, והשתמש בו שוב עבור כל ניסיון חוזר של שינוי זה.
- ב-
429 rate_limited, המתןRetry-Afterשניות, ולאחר מכן נסה שוב.
- ב-
409 request_in_progress, המתן מספר שניות, ולאחר מכן נסה שוב עם אותו מקש. ב-409 conflict_error, סנכרון של מרכז העזרה כבר פועל: המתן מספר דקות לפני שתפעיל שוב, או דלג על הפעלה זו.
- ב-
500ומעלה, או לאחר שגיאת רשת, יש לנסות שוב עם אפשרות ביטול פעולות אקספוננציאליות, לדוגמה לאחר 1, 2, 4 ו-8 שניות.
- לעולם אל תנסה שוב את
400,401,403,404או422ללא שינוי. תקן תחילה את הבקשה.
ב-JavaScript, עבור כל מסלול שמשנה משהו. הוא עוצר ב-conflict_error ומשאיר את ההחלטה הזו לקוד שלך:
שאלות נפוצות
import { randomUUID } from "node:crypto";
const sleep = (seconds) => new Promise((resolve) => setTimeout(resolve, seconds * 1000));
async function notiondeskRequest(method, path, body, attempts = 5) {
const idempotencyKey = randomUUID();
for (let attempt = 0; attempt < attempts; attempt++) {
let response;
try {
response = await fetch(`https://api.notiondesk.so${path}`, {
method,
headers: {
Authorization: `Bearer ${process.env.NOTIONDESK_API_KEY}`,
"nd-version": "2026-10-16",
"Content-Type": "application/json",
"Idempotency-Key": idempotencyKey,
},
body: body ? JSON.stringify(body) : undefined,
});
} catch {
await sleep(2 ** attempt);
continue;
}
if (response.ok) {
return response.status === 204 ? null : response.json();
}
const error = await response.json().catch(() => ({}));
const retryable = response.status === 429 || response.status >= 500 || error.code === "request_in_progress";
if (!retryable) {
throw new Error(`${response.status} ${error.code}: ${error.message}`);
}
const retryAfter = Number(response.headers.get("Retry-After"));
await sleep(retryAfter > 0 ? retryAfter : 2 ** attempt);
}
throw new Error(`Notiondesk request failed after ${attempts} attempts`);
} מהן מגבלות התעריף של Notiondesk ב-API?
120 בקשות קריאה ו-20 בקשות כתיבה לדקה עבור כל מפתח API או אישור OAuth, בנוסף ל-30 בקשות ניתוח נתונים לדקה עבור כל מרכז עזרה. בקשה מעבר לתקציב עונה על 429 עם כותרת Retry-After.
באיזה שדה הקוד שלי צריך לבדוק אם יש שגיאה?
code. זהו המסווג היציב היחיד הניתן לקריאה על ידי מכונה. ה-message מיועד לאנשים ויכול להשתנות.
מה עליי לשלוח לתמיכה כאשר בקשה נכשלת?
ה-request_id מתגובת השגיאה, הנתיב שאליו התקשרת וזמן הבקשה.
האם בטוח לנסות שוב טריגר סנכרון?
כן, עם Idempotency-Key. ניסיון חוזר עם אותו מפתח עונה שוב על התוצאה הראשונה ולא יוצר דבר בתור. ללא מפתח, טריגר סנכרון אתר שני בזמן שהראשון פועל עונה על 409 conflict_error.