API v1

תיעוד API

חברו את מערכת החיוב או ה-ERP שלכם ל-OmniFlow Collect: שלחו לקוחות וחשבוניות ישירות, בלי לייצא קובץ אקסל, ורשמו תשלומים כשהם מתקבלים.

אימות

כל בקשה נשלחת עם מפתח ה-API האישי שלכם, בכותרת Authorization. המפתח מזהה את החשבון שלכם, וכל מה שתקראו או תכתבו שייך רק לו.

Authorization: Bearer your_api_token_here

את המפתח תמצאו בעמוד ההגדרות, תחת 'טוקן API של Tokomni'. שמרו עליו כמו על סיסמה: מי שיש לו את המפתח יכול לקרוא, לשנות ולמחוק את כל הלקוחות והחשבוניות שלכם.

כתובת בסיס

https://flow.omnitelecom.com/api/v1/me

כל הכתובות בעמוד הזה מתחילות ב-‎/api/v1/me. ה-‎me הוא החשבון שהמפתח שייך לו. אם אתם מנהלים כמה חשבונות, לכל אחד יש מפתח נפרד.

התחלה מהירה

קריאה אחת יוצרת גם את הלקוח וגם את החשבונית. הריצו אותה שוב עם אותם נתונים — לא ייווצרו כפילויות.

curl -X POST https://flow.omnitelecom.com/api/v1/me/import \
  -H "Authorization: Bearer $OMNIFLOW_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "customers": [{
      "customerId": "C-2024-001",
      "name": "Acme Ltd",
      "emails": ["[email protected]"],
      "invoices": [{
        "invoiceNumber": "INV-2024-001",
        "amountMajor": 1500.50,
        "issueDate": "2024-01-01T00:00:00Z",
        "dueDate": "2024-01-31T00:00:00Z"
      }]
    }]
  }'

כדאי לדעת

  • יש שתי דרכים לשלוח סכום: בשדה amount באגורות (וסנטים בדולר ואירו) — 150050 הם ₪1,500.50; או בשדה amountMajor בשקלים — 1500.50. שלחו אחד מהם בלבד.
  • כל התאריכים בפורמט ISO 8601, למשל 2024-01-15T00:00:00Z.
  • השדה customerId הוא תמיד מספר הלקוח שלכם, מהמערכת שלכם — למשל C-2024-001. המזהים הפנימיים של OmniFlow לא מופיעים ב-API בכלל.
  • סטטוס החשבונית מחושב אוטומטית לפי תאריך הפירעון. שלחו אותו רק אם אתם רוצים לקבוע אותו בעצמכם.
  • התזכורות נשלחות בתהליך רקע שרץ כל כמה דקות. חשבונית שעברה את מועד התשלום נכנסת לתהליך הגבייה תוך דקות, לא מיד.

לקריאה לפני החיבור הראשון

חמישה דברים שקל לפספס. בכל אחד מהם הבקשה תצליח — לא תקבלו שגיאה, אבל הנתונים שיישמרו לא יהיו מה שהתכוונתם.

amount או amountMajor — אחד מהם, אף פעם לא שניהם

amount נספר באגורות, amountMajor בשקלים. אותו מספר בדיוק נותן תוצאה שונה פי 100:

"amount": 1500₪15.00
"amountMajor": 1500₪1,500.00

אם המערכת שלכם מחזיקה סכומים בשקלים, שלחו תמיד amountMajor ולא תצטרכו לחשוב על זה.

רשימת אנשי קשר מחליפה את הקיימת, לא מתווספת אליה

נניח שללקוח כבר רשומות שתי כתובות: [email protected] ו[email protected]. מה שיישמר תלוי במה שתשלחו:

"emails": ["[email protected]"]נשארת רק [email protected]. שתי הקודמות נמחקו
"emails": []כל כתובות האימייל נמחקות
בלי השדה emails בכלל[email protected] ו[email protected] נשארות כמו שהן

אותו כלל חל על phones. אם אתם מעדכנים רק שם או סוג לקוח — אל תשלחו את שדות אנשי הקשר.

מומלץ לשלוח את הסכום המקורי של החשבונית, לא את היתרה לתשלום

יתרת החוב מחושבת כסכום החשבונית פחות התשלומים שנרשמו. לדוגמה, חשבונית על ₪10,000 שכבר שולמו ממנה ₪4,000:

"amountMajor": 10000חוב פתוח ₪6,000 — נכון
"amountMajor": 6000חוב פתוח ₪2,000 — התשלום נגרע פעמיים

זו המלצה ולא חסימה: הבקשה תתקבל, התשלומים לא נמחקים, ותקבלו אזהרה בתגובה. בנוסף החשבונית תסומן, וההסבר יופיע בהיסטוריית התשלומים שלה עד שיישלח הסכום הנכון.

‎/import לסנכרון חוזר, ‎/invoices ליצירה חד-פעמית

שתיהן יוצרות חשבוניות. ההבדל מתגלה כשהחשבונית כבר קיימת:

POST /importמעדכן את החשבונית הקיימת — אפשר להריץ כל לילה
POST /invoicesמחזיר 409 על מספר חשבונית שכבר קיים

‎/import יוצר את הלקוח, ‎/invoices מצפה שכבר יהיה קיים

אם אתם מושכים נתונים ממערכת אחרת ואין לכם ודאות שהלקוח כבר נוצר ב-OmniFlow:

POST /importיוצר את הלקוח ואת החשבונית באותה קריאה
POST /invoicesמחזיר 404 אם הלקוח לא קיים
POST /invoices/bulkמחזיר 404 אם הלקוח לא קיים

נקודות קצה

ייבוא

הקריאה שרוב החיבורים צריכים: לקוחות והחשבוניות שלהם בקריאה אחת, שאפשר לחזור עליה שוב ושוב. זו המקבילה ב-API להעלאת קובץ אקסל.

POST
/api/v1/me/import

יוצר או מעדכן לקוחות יחד עם החשבוניות שלהם. שליחה חוזרת של אותם נתונים לא משנה כלום, אז אפשר להריץ כל לילה. עד 200 לקוחות ו-1,000 חשבוניות בקריאה. אם רשומה אחת לא תקינה — שום דבר לא נכתב, וכל הבעיות מפורטות בתגובה.

פרמטרים בגוף הבקשה

customers(array) — הלקוחות לייבוא. לכל אחד אפשר לצרף את החשבוניות שלו
customers[].customerId(string) — מספר הלקוח שלכם, למשל "C-2024-001"
customers[].name(string) — שם הלקוח כפי שיופיע ב-OmniFlow ובתזכורות
customers[].customerType(string, אופציונלי) — שם סוג הלקוח. חייב להיות קיים בהגדרות שלכם. ברירת המחדל: individual
customers[].emails(string[], אופציונלי) — כתובות אימייל. מחליף את הרשימה הקיימת — ראו האזהרות למעלה
customers[].phones(string[], אופציונלי) — מספרי טלפון. מספר ישראלי מקומי מתקבל כמו שהוא; לכל השאר צריך קידומת מדינה, למשל ‎+972501234567
customers[].invoices(array, אופציונלי) — החשבוניות של הלקוח. לכל אחת צריך invoiceNumber, סכום, issueDate ו-dueDate
דוגמת בקשה
{
  "customers": [
    {
      "customerId": "C-2024-001",
      "name": "Acme Ltd",
      "customerType": "business",
      "emails": ["[email protected]"],
      "phones": ["+972501234567"],
      "invoices": [
        {
          "invoiceNumber": "INV-2024-001",
          "amountMajor": 1500.50,
          "currency": "NIS",
          "issueDate": "2024-01-01T00:00:00Z",
          "dueDate": "2024-01-31T00:00:00Z",
          "description": "Monthly service fee"
        }
      ]
    }
  ]
}
דוגמת תגובה
{
  "success": true,
  "message": "1 customer(s) and 1 invoice(s) processed",
  "customers": { "total": 1, "created": 1, "updated": 0 },
  "invoices":  { "total": 1, "created": 1, "updated": 0 }
}

לקוחות

יצירה, קריאה, עדכון ומחיקה של לקוח בודד, או יצירה ועדכון של הרבה לקוחות בבת אחת.

GET
/api/v1/me/customers

מציג את רשימת הלקוחות שלכם, עם פרטי הקשר ומספר החשבוניות של כל אחד.

פרמטרים בשאילתה

page(integer, אופציונלי) — מספר עמוד, מתחיל ב-1
limit(integer, אופציונלי) — תוצאות בעמוד, עד 200 (ברירת מחדל 50)
search(string, אופציונלי) — מחפש בשם הלקוח, במספר הלקוח, באימייל ובטלפון
customerType(string, אופציונלי) — שם סוג הלקוח. חייב להיות קיים בהגדרות שלכם. ברירת המחדל: individual
sortBy(string, אופציונלי) — name, customerId, createdAt או invoiceCount
sortOrder(string, אופציונלי) — asc או desc
דוגמת תגובה
{
  "success": true,
  "customers": [
    {
      "customerId": "C-2024-001",
      "name": "Acme Ltd",
      "customerType": "business",
      "emails": ["[email protected]"],
      "phones": ["+972501234567"],
      "invoiceCount": 3,
      "createdAt": "2024-01-15T10:30:00.000Z",
      "updatedAt": "2024-01-15T10:30:00.000Z"
    }
  ],
  "total": 1, "page": 1, "limit": 50, "totalPages": 1
}
POST
/api/v1/me/customers

יוצר לקוח אחד. אם מספר הלקוח כבר קיים תקבלו 409 — לעדכון השתמשו ב-PUT, וליצירה-או-עדכון ב-‎/customers/bulk או ב-‎/import.

פרמטרים בגוף הבקשה

customerId(string) — מספר הלקוח שלכם, למשל "C-2024-001"
name(string) — שם הלקוח כפי שיופיע ב-OmniFlow ובתזכורות
customerType(string, אופציונלי) — שם סוג הלקוח. חייב להיות קיים בהגדרות שלכם. ברירת המחדל: individual
emails(string[], אופציונלי) — כתובות אימייל. מחליף את הרשימה הקיימת — ראו האזהרות למעלה
phones(string[], אופציונלי) — מספרי טלפון. מספר ישראלי מקומי מתקבל כמו שהוא; לכל השאר צריך קידומת מדינה, למשל ‎+972501234567
דוגמת בקשה
{
  "customerId": "C-2024-001",
  "name": "Acme Ltd",
  "customerType": "business",
  "emails": ["[email protected]"],
  "phones": ["+972501234567"]
}
דוגמת תגובה
{
  "success": true,
  "message": "Customer \"C-2024-001\" created",
  "customer": {
    "customerId": "C-2024-001",
    "name": "Acme Ltd",
    "customerType": "business",
    "emails": ["[email protected]"],
    "phones": ["+972501234567"],
    "createdAt": "2024-01-15T10:30:00.000Z",
    "updatedAt": "2024-01-15T10:30:00.000Z"
  }
}
POST
/api/v1/me/customers/bulk

יוצר או מעדכן עד 200 לקוחות בקריאה אחת. הכול או כלום: אם רשומה אחת נכשלת באימות, שום דבר לא נכתב, והתגובה מציינת כל בעיה ואת המיקום שלה ברשימה ששלחתם.

פרמטרים בגוף הבקשה

customers(array) — עד 200 לקוחות. מספרי לקוח קיימים יעודכנו, חדשים ייווצרו
דוגמת בקשה
{
  "customers": [
    { "customerId": "C-2024-001", "name": "Acme Ltd" },
    { "customerId": "C-2024-002", "name": "Globex", "emails": ["[email protected]"] }
  ]
}
דוגמת תגובה
{
  "success": true,
  "message": "2 customer(s) processed (2 created, 0 updated)",
  "count": 2, "created": 2, "updated": 0,
  "customers": [ /* ... */ ]
}
GET
/api/v1/me/customers/{customerId}

מחזיר לקוח אחד עם פרטי הקשר וכל החשבוניות שלו.

פרמטרים בנתיב

customerId(string) — מספר הלקוח שלכם, למשל "C-2024-001"
דוגמת תגובה
{
  "success": true,
  "customer": {
    "customerId": "C-2024-001",
    "name": "Acme Ltd",
    "customerType": "business",
    "emails": ["[email protected]"],
    "phones": ["+972501234567"],
    "invoices": [ /* full invoice objects */ ],
    "createdAt": "2024-01-15T10:30:00.000Z",
    "updatedAt": "2024-01-15T10:30:00.000Z"
  }
}
PUT
/api/v1/me/customers/{customerId}

מעדכן לקוח. רק השדות שתשלחו ישתנו.

פרמטרים בנתיב

customerId(string) — מספר הלקוח שלכם, למשל "C-2024-001"

פרמטרים בגוף הבקשה

customerId(string, אופציונלי) — שינוי מספר הלקוח עצמו. אם לקוח אחר כבר משתמש בו תקבלו 409
name(string, אופציונלי) — שם הלקוח כפי שיופיע ב-OmniFlow ובתזכורות
customerType(string, אופציונלי) — שם סוג הלקוח. חייב להיות קיים בהגדרות שלכם. ברירת המחדל: individual
emails(string[], אופציונלי) — מחליף את כל כתובות האימייל. שלחו [] כדי למחוק את כולן, או אל תשלחו את השדה כדי להשאיר אותן
phones(string[], אופציונלי) — מחליף את כל מספרי הטלפון. שלחו [] כדי למחוק את כולם, או אל תשלחו את השדה כדי להשאיר אותם
דוגמת בקשה
{
  "name": "Acme Ltd (Israel)",
  "emails": ["[email protected]", "[email protected]"]
}
דוגמת תגובה
{
  "success": true,
  "message": "Customer \"C-2024-001\" updated",
  "customer": { /* ... */ }
}
DELETE
/api/v1/me/customers/{customerId}

מוחק לקוח יחד עם החשבוניות, התשלומים והיסטוריית ההודעות שלו, ועוצר כל רצף תזכורות פעיל. המידע נשמר אצלנו לצורכי ביקורת, אבל לא מופיע יותר באפליקציה.

פרמטרים בנתיב

customerId(string) — מספר הלקוח שלכם, למשל "C-2024-001"
דוגמת תגובה
{
  "success": true,
  "message": "Customer \"C-2024-001\" deleted"
}

חשבוניות

הצגה ועדכון של חשבוניות, ויצירת חשבונית ללקוח קיים.

GET
/api/v1/me/invoices

מציג חשבוניות מכל הלקוחות שלכם. זו גם הדרך להגיע לחשבונית שמספרה מכיל תווים שלא מתאימים לכתובת URL.

פרמטרים בשאילתה

page(integer, אופציונלי) — מספר עמוד, מתחיל ב-1
limit(integer, אופציונלי) — תוצאות בעמוד, עד 200 (ברירת מחדל 50)
customerId(string, אופציונלי) — מספר הלקוח שלכם, למשל "C-2024-001"
status(string, אופציונלי) — רשימה מופרדת בפסיקים, למשל debtor,partially_paid
sortBy(string, אופציונלי) — dueDate, issueDate, amount או createdAt
sortOrder(string, אופציונלי) — asc או desc
דוגמת תגובה
{
  "success": true,
  "invoices": [ /* invoice objects */ ],
  "total": 12, "page": 1, "limit": 50, "totalPages": 1
}
POST
/api/v1/me/invoices

יוצר חשבונית אחת ללקוח קיים. אם מספר הלקוח לא מוכר תקבלו 404, ואם מספר החשבונית כבר בשימוש אצל אותו לקוח — 409.

פרמטרים בגוף הבקשה

customerId(string) — מספר הלקוח שלכם, למשל "C-2024-001"
invoiceNumber(string) — מספר חשבונית, ייחודי לכל לקוח
amount(integer) — סכום באגורות (או בסנטים). שלחו את זה או את amountMajor
currency(string, אופציונלי) — NIS (ברירת מחדל), USD או EUR
issueDate(string) — תאריך הנפקה, ISO 8601
dueDate(string) — תאריך פירעון, ISO 8601. לא יכול להקדים את תאריך ההנפקה
description(string, אופציונלי) — טקסט חופשי שמוצג לצד החשבונית
דוגמת בקשה
{
  "customerId": "C-2024-001",
  "invoiceNumber": "INV-2024-001",
  "amount": 150000,
  "currency": "NIS",
  "issueDate": "2024-01-01T00:00:00Z",
  "dueDate": "2024-01-31T00:00:00Z",
  "description": "Monthly service fee"
}
דוגמת תגובה
{
  "success": true,
  "message": "Invoice \"INV-2024-001\" created for customer \"C-2024-001\"",
  "invoice": {
    "customerId": "C-2024-001",
    "customerName": "Acme Ltd",
    "invoiceNumber": "INV-2024-001",
    "amount": 150000,
    "paidAmount": 0,
    "currency": "NIS",
    "status": "pending",
    "issueDate": "2024-01-01T00:00:00.000Z",
    "dueDate": "2024-01-31T00:00:00.000Z"
  }
}
POST
/api/v1/me/invoices/bulk

יוצר עד 200 חשבוניות ללקוח קיים אחד. הכול או כלום: אם חשבונית אחת נכשלת, אף אחת לא נוצרת.

פרמטרים בגוף הבקשה

customerId(string) — מספר הלקוח שלכם, למשל "C-2024-001"
invoices(array) — עד 200 חשבוניות. לכל אחת invoiceNumber, סכום, issueDate ו-dueDate
דוגמת בקשה
{
  "customerId": "C-2024-001",
  "invoices": [
    {
      "invoiceNumber": "INV-2024-001",
      "amount": 150000,
      "issueDate": "2024-01-01T00:00:00Z",
      "dueDate": "2024-01-31T00:00:00Z"
    }
  ]
}
דוגמת תגובה
{
  "success": true,
  "message": "1 invoice(s) created for customer \"C-2024-001\"",
  "count": 1,
  "invoices": [ /* ... */ ]
}
GET
/api/v1/me/customers/{customerId}/invoices

מציג את החשבוניות של לקוח אחד.

פרמטרים בנתיב

customerId(string) — מספר הלקוח שלכם, למשל "C-2024-001"

פרמטרים בשאילתה

page(integer, אופציונלי) — מספר עמוד, מתחיל ב-1
limit(integer, אופציונלי) — תוצאות בעמוד, עד 200 (ברירת מחדל 50)
status(string, אופציונלי) — רשימה מופרדת בפסיקים, למשל debtor,partially_paid
דוגמת תגובה
{
  "success": true,
  "customerId": "C-2024-001",
  "invoices": [ /* invoice objects */ ],
  "total": 3, "page": 1, "limit": 50, "totalPages": 1
}
PUT
/api/v1/me/customers/{customerId}/invoices/{invoiceNumber}

מעדכן חשבונית. רק השדות שתשלחו ישתנו. שינוי הסטטוס לערך סגור עוצר את רצף התזכורות של הלקוח, ברגע שלא נשאר לו חוב פתוח.

פרמטרים בנתיב

customerId(string) — מספר הלקוח שלכם, למשל "C-2024-001"
invoiceNumber(string) — מספר חשבונית, ייחודי לכל לקוח

פרמטרים בגוף הבקשה

amount(integer, אופציונלי) — סכום באגורות (או בסנטים). שלחו את זה או את amountMajor
amountMajor(number, אופציונלי) — סכום בשקלים, למשל 1500.50. שלחו את זה או את amount
currency(string, אופציונלי) — NIS (ברירת מחדל), USD או EUR
issueDate(string, אופציונלי) — תאריך הנפקה, ISO 8601
dueDate(string, אופציונלי) — תאריך פירעון, ISO 8601. לא יכול להקדים את תאריך ההנפקה
description(string, אופציונלי) — טקסט חופשי שמוצג לצד החשבונית
status(string, אופציונלי) — pending, debtor, paid, bad_debt, exemption או debt_cancellation. לביטול חשבונית שהונפקה בטעות השתמשו ב-debt_cancellation. את partially_paid אי אפשר לקבוע כאן — רשמו תשלום במקום
דוגמת בקשה
{
  "status": "debt_cancellation"
}
דוגמת תגובה
{
  "success": true,
  "message": "Invoice \"INV-2024-001\" updated",
  "invoice": { /* ... */ }
}

תשלומים

רישום תשלומים שהתקבלו. יש תמיכה בתשלום חלקי, ואתם בוחרים אם רצף התזכורות ממשיך או מתחיל מחדש.

POST
/api/v1/me/invoices/payments

רושם תשלום על חשבונית. תשלום חלקי משאיר את החשבונית בגבייה ומסמן אותה כמשולמת חלקית; תשלום מלא סוגר אותה ומסיים את הרצף.

פרמטרים בגוף הבקשה

customerId(string) — מספר הלקוח שלכם, למשל "C-2024-001"
invoiceNumber(string) — מספר חשבונית, ייחודי לכל לקוח
amount(integer) — סכום התשלום באגורות (או בסנטים). לא יכול לעלות על היתרה לתשלום
paidAt(string) — מועד קבלת התשלום, ISO 8601
note(string, אופציונלי) — טקסט חופשי, עד 500 תווים
workflowAction(string, אופציונלי) — לתשלום חלקי: "continue" (ברירת מחדל) משאיר את רצף התזכורות במקום שבו הוא נמצא, "restart" מתחיל אותו מחדש מתהליך העבודה הראשון
דוגמת בקשה
{
  "customerId": "C-2024-001",
  "invoiceNumber": "INV-2024-001",
  "amount": 75000,
  "paidAt": "2024-02-15T10:30:00Z",
  "note": "Partial payment - bank transfer",
  "workflowAction": "continue"
}
דוגמת תגובה
{
  "success": true,
  "message": "Payment of 75000 recorded for invoice \"INV-2024-001\"",
  "payment": {
    "amount": 75000,
    "paidAt": "2024-02-15T10:30:00.000Z",
    "note": "Partial payment - bank transfer"
  },
  "invoiceStatus": "partially_paid",
  "invoicePaidAmount": 75000
}
POST
/api/v1/me/invoices/payments/bulk

רושם עד 200 תשלומים ללקוח אחד בקריאה אחת. הכול נבדק לפני שנכתב משהו, כך שבקשה שנדחתה לא משאירה תוצאות חלקיות.

פרמטרים בגוף הבקשה

customerId(string) — מספר הלקוח שלכם, למשל "C-2024-001"
workflowAction(string, אופציונלי) — מופעל פעם אחת אחרי כל התשלומים: "continue" (ברירת מחדל) או "restart"
payments(array) — עד 200 תשלומים. לכל אחד invoiceNumber, סכום ו-paidAt
דוגמת בקשה
{
  "customerId": "C-2024-001",
  "payments": [
    { "invoiceNumber": "INV-2024-001", "amount": 75000, "paidAt": "2024-02-15T10:30:00Z" },
    { "invoiceNumber": "INV-2024-002", "amount": 250000, "paidAt": "2024-02-15T10:30:00Z" }
  ]
}
דוגמת תגובה
{
  "success": true,
  "message": "2 payment(s) recorded for customer \"C-2024-001\"",
  "count": 2,
  "payments": [ /* ... */ ]
}

שגיאות

400

בקשה שגויה — משהו בבקשה לא תקין: שדה פגום, או תשלום שגדול מהיתרה לתשלום. בבקשות מרוכזות תקבלו פירוט של כל בעיה בנפרד.

401

לא מורשה — מפתח ה-API חסר, שגוי, או שייך לחשבון סגור.

404

לא נמצא — אין לקוח או חשבונית שמתאימים למזהים ששלחתם.

409

התנגשות — מספר הלקוח או מספר החשבונית כבר בשימוש.

429

יותר מדי בקשות — חרגתם ממגבלת הקצב. חכו את הזמן שמופיע בכותרת Retry-After.

500

שגיאת שרת — משהו השתבש אצלנו. הבקשה לא בוצעה.

כל שגיאה נראית ככה

{
  "success": false,
  "error": "AMOUNT_BELOW_PAID",
  "message": "Invoice \"INV-1\": amount 110050 is below the 400000 already recorded as paid. Send the ORIGINAL invoice total, not the remaining balance."
}

בשדה error יופיע אחד מהקודים האלה, כדי שתוכלו לבדוק אותו בקוד בלי לנתח את הטקסט:

VALIDATION_ERRORAUTH_REQUIREDAUTH_INVALIDCUSTOMER_NOT_FOUNDINVOICE_NOT_FOUNDDUPLICATE_CUSTOMERDUPLICATE_INVOICEAMBIGUOUS_TOKENINVOICE_ALREADY_RESOLVEDPAYMENT_EXCEEDS_BALANCERATE_LIMIT_EXCEEDEDINTERNAL_ERROR

מגבלות קצב

הבקשות מוגבלות ל-60 בדקה לכל כתובת IP, ול-100 בדקה לכל מפתח API. הקריאות המרוכזות מקבלות עד 200 רשומות בכל קריאה, כך שסנכרון של אלפי רשומות נכנס בקלות במגבלה — עדיף פחות קריאות גדולות מהרבה קריאות קטנות. בכל תגובה תמצאו את הכותרות X-RateLimit-Limit ו-X-RateLimit-Remaining, ובחריגה גם Retry-After.