Makor API#
הפקת מסמכים עסקיים ישראליים חוקיים דרך HTTP: חשבוניות מס עם מספר הקצאה בזמן אמת מרשות המסים, קבלות עם ניכוי מס במקור, חשבוניות זיכוי, קבצי PDF, וייצוא מבנה אחיד. את הכול אפשר לבדוק בסביבת ניסוי מבודדת לחלוטין לפני מעבר לייצור.
| כתובת בסיס (ייצור) | https://makor.izid.io/api/v1 |
| כתובת בסיס (ניסוי) | https://sandbox.makor.izid.io/api/v1 |
| סוג תוכן | application/json; charset=utf-8 |
| אימות | Authorization: Bearer mk_live_… / mk_test_… / mk_op_live_… |
| שגיאות | application/problem+json (RFC 9457) |
| סכמה | /api/openapi.json · /api/docs |
הפקת חשבונית בקריאה אחת
צרו מפתח API בהגדרות → API ושלחו מסמך. בברירת מחדל המסמך מופק מיד: מוקצה לו מספר, מתבצעת פנייה לרשות המסים כשנדרש, והוא מרונדר ומופק — הכול בבקשה אחת.
# Sandbox host + sandbox key. Swap both together to go live.
curl -X POST 'https://sandbox.makor.izid.io/api/v1/documents' \
-H 'Authorization: Bearer mk_test_1a2b3c4d5e6f...' \
-H 'Idempotency-Key: invoice-2026-0001' \
-H 'Content-Type: application/json' \
-d '{
"doc_type": 305,
"issue_date": "2026-08-07",
"customer_name": "לקוח לדוגמה",
"customer_tax_id": "123456782",
"lines": [
{ "description": "ייעוץ טכנולוגי", "quantity": 1, "unit_price": 6000 }
]
}'HTTP/1.1 201 Created
{
"id": "019fdad4-b4bb-70ce-94fd-8164faf6f426",
"doc_type": 305,
"doc_type_name_he": "חשבונית מס",
"doc_type_name_en": "Tax Invoice",
"series": "A",
"doc_number": 1,
"status": "issued",
"issue_date": "2026-08-07",
"customer_name": "לקוח לדוגמה",
"customer_tax_id": "123456782",
"subtotal": 6000.0,
"discount_total": 0.0,
"taxable_amount": 6000.0,
"vat_rate_bp": 1800,
"vat_amount": 1080.0,
"total": 7080.0,
"withholding_amount": 0,
"currency": "ILS",
"fx_rate": 1.0,
"ils": null,
"allocation_status": "approved",
"allocation_number": "20260807123456782000000001",
"is_sandbox": true,
"language": "he",
"parent_id": null,
"open_balance": null
}const KEY = process.env.MAKOR_API_KEY; // mk_live_… or mk_test_…
const BUSINESS = process.env.MAKOR_BUSINESS_ID;
// The key prefix and the base URL must always agree.
const BASE_URL = KEY.startsWith("mk_test_")
? "https://sandbox.makor.izid.io/api/v1"
: "https://makor.izid.io/api/v1";
const res = await fetch(
`${BASE_URL}/businesses/${BUSINESS}/documents`,
{
method: "POST",
headers: {
Authorization: `Bearer ${KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
doc_type: 320,
issue_date: new Date().toISOString().slice(0, 10),
customer_name: "לקוח לדוגמה",
lines: [{ description: "מנוי חודשי", quantity: 1, unit_price: 199 }],
payments: [{ method: "card", amount: 234.82, card_brand: "Visa" }],
}),
}
);
if (res.status === 202) {
const held = await res.json();
console.log(held.rejection_code, held.decisions);
} else if (!res.ok) {
const problem = await res.json();
throw new Error(`${problem.code}: ${problem.detail}`);
}import os, uuid, httpx
KEY = os.environ["MAKOR_API_KEY"]
BUSINESS = os.environ["MAKOR_BUSINESS_ID"]
# The key prefix and the base URL must always agree.
BASE_URL = (
"https://sandbox.makor.izid.io/api/v1" if KEY.startswith("mk_test_") else "https://makor.izid.io/api/v1"
)
with httpx.Client(
base_url=BASE_URL,
headers={"Authorization": f"Bearer {KEY}"},
timeout=30,
) as client:
r = client.post(
f"/businesses/{BUSINESS}/documents",
headers={"Idempotency-Key": str(uuid.uuid4())},
json={
"doc_type": 305,
"issue_date": "2026-08-07",
"customer_tax_id": "123456782",
"customer_name": "לקוח לדוגמה",
"lines": [
{"description": "ייעוץ", "quantity": 1, "unit_price": 6000}
],
},
)
if r.status_code == 202:
held = r.json()
client.post(
f"/businesses/{BUSINESS}/documents/{held['id']}/allocation-decision",
json={"choice": "continue"},
)
else:
r.raise_for_status()אימות#
מקור משתמשת במפתחות API אטומים כטוקן נשיאה (Bearer). אין שלב החלפת טוקן ואין מה לרענן — המפתח שיצרתם הוא בדיוק מה שנשלח בכל בקשה.
Authorization: Bearer mk_live_9f8e7d6c5b4a3928170615243342516071829304| קידומת | סביבה | התנהגות |
|---|---|---|
| mk_live_ | ייצור | תקף רק מול https://makor.izid.io/api/v1. יוצר מסמכים אמיתיים: צורך מהמספור החוקי, פונה לרשות המסים, ומופיע בדוחות ובמבנה האחיד. |
| mk_test_ | סביבת ניסוי | תקף רק מול https://sandbox.makor.izid.io/api/v1. יוצר מסמכי ניסוי בלבד — ראו סביבת ניסוי. |
| mk_op_live_ | ייצור (מפעיל) | מפתח של מפעיל: קשור למפעיל ולא לעסק בודד, ומגיע לכל עסק שהעניק לו הרשאה. ראו מפעילים. |
| mk_op_test_ | ניסוי (מפעיל) | מפתח מפעיל לסביבת הניסוי. תקף רק מול https://sandbox.makor.izid.io/api/v1. |
401).מצבי כשל
| 401 Unauthorized MAKOR-401 | מפתח חסר, פגום, לא מוכר או מבוטל. |
| 404 Not Found MAKOR-404 | המפתח תקין אך שייך לעסק אחר מזה שב-Makor-Business — או, במפתח מפעיל, שהעסק לא העניק לכם הרשאה או שההרשאה בוטלה. גישה לעסק זר מדווחת כ”לא נמצא” ולא כ”אסור”, כדי שמחזיקי מפתחות לא יוכלו לגלות אילו עסקים קיימים ומי לקוח של מי. |
| 403 Forbidden MAKOR-403 | האימות הצליח, אך למפתח חסרה ההרשאה שה-endpoint דורש. |
הרשאות (Scopes)#
כל endpoint מצהיר על הרשאה אחת בדיוק. מפתח מקבל את ההרשאות המינימליות שביקשתם; אם לא ציינתם הרשאות, הוא מקבל את המקסימום שתפקידכם מתיר.
| הרשאה | מה היא מתירה |
|---|---|
| documents:read | צפייה ברשימת מסמכים, קריאת מסמך והורדת PDF |
| documents:write | יצירה, הפקה, ביטול, מחיקת טיוטות, החלטות הקצאה וקישורי שיתוף |
| customers:read | צפייה בלקוחות ובהסכמתם למשלוח מסמכים |
| customers:write | יצירה, עדכון והשבתה של לקוחות; רישום הסכמה |
| items:read | צפייה בקטלוג הפריטים |
| items:write | יצירה, עדכון והשבתה של פריטים |
| scans:read | צפייה בסריקות והורדת תמונת העמוד |
| scans:write | העלאה, אישור, דחייה ומחיקה של סריקות |
| reports:read | דוחות הכנסות, מע"מ וניכוי במקור |
| export:read | הפקה והורדה של קבצי מבנה אחיד |
הרשאות המפתח ∩ ההרשאות שהעסק העניק. עסק יכול להעניק documents:read בלבד למפעיל שהמפתח שלו כולל כתיבה, והתוצאה תהיה קריאה בלבד באותו עסק. אל תסיקו מההרשאות של המפתח — GET /operator/businesses מחזיר את ההרשאה האפקטיבית לכל עסק.accountant מצומצם להרשאות קריאה בלבד, ללא קשר למה שהבקשה ביקשה. התשובה מחזירה את ההרשאות שניתנו בפועל — קראו אותן ואל תניחו.סביבת ניסוי#
התנסות בלי להפיק אף פעם חשבונית אמיתית. לסביבת הניסוי יש כתובת API נפרדת ומפתחות נפרדים, כך שאי אפשר לבלבל בין השתיים — אבל היא עדיין החשבון והנתונים שלכם, בלי הרשמה נוספת.
| סביבה | כתובת בסיס | מפתח |
|---|---|---|
| ייצור | https://makor.izid.io/api/v1 | mk_live_… |
| ניסוי | https://sandbox.makor.izid.io/api/v1 | mk_test_… |
mk_test_ מול כתובת הייצור נדחה ב-403, וכך גם מפתח mk_live_ מול כתובת הניסוי — עם הודעה שמפנה לכתובת הנכונה. זו הסיבה שאי אפשר להפיק חשבונית אמיתית בטעות בזמן פיתוח: צריך לטעות בשני מקומות בו-זמנית.צרו מפתח עם "sandbox": true וקראו לכתובת הניסוי. כל קריאה פועלת על נתוני ניסוי — בלי פרמטרים נוספים.
הגדרות → סביבת ניסוי → כניסה למצב ניסוי. באנר כתום מסמן את הסשן וכל מה שתיצרו הוא מסמך ניסוי.
מה הבידוד אומר בפועל
| מספור נפרד מובטח | מסמכי ניסוי שואבים מסדרת מספור משלהם לכל סוג מסמך. המספור החוקי והרציף שלכם לעולם לא מתקדם בגלל ניסוי. |
| אין תעבורה לרשות המסים מובטח | בקשות הקצאה למסמכי ניסוי נענות בסימולטור דטרמיניסטי ולעולם לא נשלחות לרשות — גם בסביבת ייצור. |
| מחוץ לספרים מובטח | מסמכי ניסוי לא מופיעים בדוחות הכנסות, מע"מ וניכוי במקור, ולא בייצוא המבנה האחיד. |
| מסומן בבירור מובטח | כל PDF של ניסוי נושא חותמת אלכסונית "SANDBOX — אינו מסמך חשבונאי", וה-API מחזיר is_sandbox: true. |
| עיוורון דו-כיווני מובטח | מפתח ייצור מקבל 404 על מסמך ניסוי ולהפך; קריאות רשימה מחזירות תמיד סביבה אחת בלבד. |
טריגרים דטרמיניסטיים להקצאה
כדי לתרגל כל תוצאה אפשרית מרשות המסים לפי דרישה, סביבת הניסוי בוחרת את התשובה לפי שתי ספרות האגורות האחרונות של הסכום לפני מע"מ. כך אפשר לבנות ולבדוק את זרימת הדחייה בלי לחכות לסירוב אמיתי.
| הסכום מסתיים ב | התוצאה המדומה | HTTP |
|---|---|---|
| …60 | מעוכב לבדיקה, קוד 460 — זרימת ארבע ההחלטות | 202 |
| …61 | קיימת חשבונית לא מאושרת שממתינה להחלטה, קוד 461 | 202 |
| …03 | תקלה טכנית — המסמך מופק עם failed_retro_pending | 201 |
| כל סכום אחר | אושר, עם מספר הקצאה מדומה בן 26 ספרות | 201 |
unit_price: 6000.60 (₪6,000.60) מפעיל עיכוב בקוד 460, בעוד 6000.00 יאושר.מוסכמות#
כמה כללים תקפים בכל ה-API. הבנה שלהם מראש חוסכת את רוב ההפתעות באינטגרציה.
| כסף מספר (₪) | הסכומים הם שקלים עם עד שתי ספרות אחרי הנקודה. ₪1,180.00 הם 1180.0; יותר משתי ספרות נדחה ולא מעוגל מאחורי הגב שלכם. אל תשלחו סכום מע"מ — הוא מחושב בשרת. |
| מע"מ מחושב בשרת | מחושב לפי השיעור החוקי בתוקף בתאריך issue_date (18% מ-1.1.2025), פעם אחת לכל קבוצת שיעור ברמת המסמך עם עיגול half-up — במכוון לא פר שורה, כדי למנוע סחף אגורות. עוסק פטור ומלכ"ר מקבלים אפס. המחירים שאתם שולחים הם לפני מע"מ, אלא אם צירפתם prices_include_vat: true — ואז כל מחיר והנחה בבקשה נקראים ככוללי מע"מ והשרת מחלץ אותו מהם, כך שסה"כ המסמך יוצא בדיוק הסכום ששלחתם. |
| תאריכים YYYY-MM-DD | תאריכי לוח בלבד, ללא אזור זמן. חותמות זמן בתשובות הן ISO-8601 ב-UTC; המספור ותקופות הדיווח לפי שעון ישראל. |
| מזהים UUIDv7 | מזהים ממויינים לפי זמן, כך שסדר לקסיקוגרפי שווה לסדר יצירה — זה מה שמאפשר עימוד יציב בקורסור. |
| מספרי זיהוי מחרוזת, 9 ספרות | ח.פ / מספר עוסק / ת.ז — בדיוק תשע ספרות כולל ספרת ביקורת, שנבדקת ביצירת העסק (MAKOR-BIZ-002). |
| טקסט בעברית UTF-8 | שלחו עברית כמות שהיא ב-JSON. הרינדור מטפל בכיווניות, וייצוא המבנה האחיד ממיר ל-ISO-8859-8 כפי שהתקן מחייב. |
שגיאות#
השגיאות תואמות ל-RFC 9457 בפורמט application/problem+json. הסתמכו על שדה code היציב ולא על הטקסט החופשי. כל שגיאה כוללת detail באנגלית ו-detail_he בעברית שניתן להציג ישירות למשתמש הקצה.
HTTP/1.1 422 Unprocessable Entity
Content-Type: application/problem+json
{
"type": "https://makor.izid.io/dev#errors",
"title": "Payment lines (5000) must sum to document total (11800)",
"status": 422,
"code": "MAKOR-DOC-011",
"detail": "Payment lines (5000) must sum to document total (11800)",
"detail_he": "סכום אמצעי התשלום חייב להיות שווה לסכום המסמך (כולל שורת ניכוי במקור)"
}| סטטוס | משמעות |
|---|---|
| 400 / 422 | הפרת ולידציה או כלל עסקי — ראו אינדקס הקודים למטה |
| 401 | האימות נכשל (מפתח חסר, לא מוכר או מבוטל) |
| 403 | מאומת אך חסרה ההרשאה הנדרשת, או תפקיד לקריאה בלבד |
| 404 | המשאב לא קיים, או שייך לעסק או לסביבה אחרת |
| 409 | התנגשות מצב — למשל הפקת מסמך שכבר אינו טיוטה |
| 202 | לא שגיאה: החשבונית עוכבה ברשות המסים וממתינה להחלטתכם |
422 תקני של הפריימוורק עם מערך detail, ללא קוד MAKOR-*. כללים עסקיים תמיד מחזירים MAKOR-*.אידמפוטנטיות#
יצירת מסמך היא הקריאה האחת שאסור לחזור עליה בטעות — כפילות תצרוך מספר מסמך חוקי שאי אפשר להשתמש בו שוב.
Idempotency-Keyכותרת, מחרוזתרשות | שלחו ערך ייחודי (UUID עובד מצוין) ב-POST /documents. ניסיון חוזר עם אותו מפתח יחזיר את התשובה המקורית — אותו מסמך, אותו מספר — במקום ליצור מסמך שני. המפתחות נשמרים 48 שעות. |
| מצב | תוצאה |
|---|---|
| אותו מפתח, אותו גוף בקשה, הושלם | התשובה המקורית מוחזרת כמות שהיא |
| אותו מפתח, גוף בקשה שונה | 422 MAKOR-IDEM-001 — מפתח יכול לתאר בקשה אחת בלבד |
| אותו מפתח בזמן שהבקשה הראשונה עדיין רצה | 409 MAKOR-IDEM-002 — נסו שוב בעוד רגע |
עימוד#
קריאות רשימה שיכולות לגדול ללא גבול משתמשות בעימוד מבוסס קורסור, שנשאר נכון גם בזמן שמופקים מסמכים חדשים.
{
"items": [ /* … */ ],
"next_cursor": "019fdad4-b4bb-70ce-94fd-8164faf6f426"
}limitמספר שלם= 50 | גודל עמוד, מקסימום 200. |
cursorמחרוזת (uuid)רשות | העבירו את next_cursor מהתשובה הקודמת כדי לקבל את העמוד הבא. התוצאות מסודרות מהחדש לישן; null אומר שהגעתם לסוף. קורסור לא תקין מחזיר 422 MAKOR-PAGE-001. |
limit ו-q במקום קורסור — אלה אוספים קטנים שמנוהלים ידנית.מספרי הקצאה#
במסגרת רפורמת חשבוניות ישראל, חשבונית מס מעל הסף הקבוע בחוק חייבת לשאת מספר הקצאה שמתקבל מרשות המסים בזמן אמת. בלעדיו הקונה אינו יכול לנכות מס תשומות, ומאוגוסט 2025 ההוצאה גם אינה מוכרת לצורכי מס הכנסה. מקור מבצעת את ההליך הזה בתוך קריאת ההפקה.
מתי זה חל
| סוג המסמך 305 / 320 | חשבונית מס וחשבונית מס/קבלה בלבד. חשבוניות זיכוי ומסמכים ללא מע"מ לעולם אינם עוברים אישור. |
| הסכום ≥ הסף | הסכום לפני מע"מ שווה או גבוה מהסף שבתוקף בתאריך ההפקה — ₪5,000 מ-1.6.2026 (₪10,000 מ-1.1.2026, ₪20,000 מ-1.1.2025, ₪25,000 מ-5.5.2024). |
| הצד שכנגד עסק לעסק | לקוח עסקי: customer_tax_id הופך לחובה מעל הסף (MAKOR-DOC-040). |
תוצאות אפשריות
| HTTP | allocation_status | מה קרה |
|---|---|---|
| 201 | approved | אושר. allocation_number מכיל את מספר האישור המלא בן 26 הספרות; ב-PDF מודפסות תשע הספרות הימניות תחת ”מספר הקצאה“. |
| 201 | not_required | מתחת לסף, לקוח פרטי, או סוג מסמך שאינו בגדר החובה. |
| 201 | failed_retro_pending | רשות המסים לא הייתה זמינה. התקנות מתירות להפיק בכל זאת; את המספר מבקשים אחר כך ב-POST /documents/{document_id}/allocation-request, עד שנה מתאריך החשבונית. |
| 202 | rejected | עוכב לבדיקה (קוד 460 או 461). למסמך הוקצה מספר אך הוא לא הופק — הוא נשאר pending עד שתבחרו מסלול. |
HTTP/1.1 202 Accepted
{
"id": "019fdad4-...",
"status": "pending",
"doc_number": 42,
"allocation_status": "rejected",
"allocation_decision_required": true,
"rejection_code": 460,
"rejection_message": "Data is correct but invoice was not approved",
"decisions": ["cancel", "continue", "reverse_charge", "object"]
}טיפול בחשבונית מעוכבת
ארבע האפשרויות הבאות הן החלופות הקבועות בחוק. חובה לבחור אחת — המסמך לא יכול להישאר תלוי באוויר — וההחלטה מדווחת בחזרה לרשות.
| choice | מה קורה | המשמעות |
|---|---|---|
| cancel | המסמך עובר לסטטוס מבוטל | המספר נשמר כמסמך מבוטל — לא ממוחזר לעולם, כך שהסדרה נשארת רציפה. |
| continue | מופק ללא מספר הקצאה | ב-PDF מודפס הכיתוב המחייב "אין לנכות מס תשומות בגין חשבונית זו" — הלקוח לא יוכל לנכות מס תשומות. |
| reverse_charge | נשלח מחדש כהיפוך חיוב | חשבונית עצמית בשיעור מע"מ אפס: הלקוח מדווח על העסקה. מקבלת מספר הקצאה משלה. |
| object | מוגשת השגה רשמית | המסמך נשאר pending עם allocation_status: objection עד להכרעת הרשות. |
curl -X POST 'https://makor.izid.io/api/v1/documents/{document_id}/allocation-decision' \
-H 'Authorization: Bearer mk_live_...' \
-H 'Content-Type: application/json' \
-d '{ "choice": "continue" }'אובייקט המסמך#
מוחזר מכל קריאה שקשורה למסמכים. הסכומים באגורות; שדות כספיים תמיד קיימים, גם כשערכם אפס.
idstring (uuid)חובה | מזהה קבוע. |
Makor-Businessheaderחובה | מפתח שקשור לעסק אחד אינו צריך לציין כלום — העסק נגזר מהמפתח. מפתח מפעיל מציין את העסק בכותרת Makor-Business, לפי ה-uuid שלנו או מספר עוסק / ח.פ. ח.פ שמתאים ליותר מעסק אחד שיש לכם גישה אליו נדחה עם 409 MAKOR-BIZ-005 במקום להיבחר בניחוש. |
doc_typeintegerרשות | קוד סוג המסמך — ראו סוגי מסמכים. אלה בדיוק הקודים של תקן המבנה האחיד. חובה לציין בדיוק אחד מבין doc_type ו-doc_kind. |
payment_methodstringרשות | קיצור ל”כל המסמך שולם באמצעי הזה”: cash · transfer · card · other. הסכום נגזר מסך המסמך, ולקבלה — מסכום החשבוניות המקושרות. לא ניתן לשלוח אותו יחד עם payments (422 MAKOR-DOC-014), ואם אין ממה להסיק סכום מוחזר 422 MAKOR-DOC-013. check מוכר אך נדחה: צ'ק מחייב מספר צ'ק לפי מבנה אחיד, ולכן יש להשתמש ב-payments. |
external_refstring ≤100רשות | מזהה משלכם למסמך, למשל מספר הזמנה במערכת שלכם. נשמר ומוחזר כמות שהוא, אינו מתפרש, ואינו חייב להיות ייחודי. |
draftbooleanרשות | ברירת המחדל היא להפיק. שלחו true כדי ליצור טיוטה שתופק מאוחר יותר דרך POST /documents/{document_id}/issue. שימו לב ש-status בתשובה עשוי להיות pending גם כשביקשתם להפיק, אם רשות המסים מעכבת בשער ההקצאה — ולכן זו כוונה ולא סטטוס. |
send_emailboolean | null= null | האם המסמך הזה יישלח במייל ללקוח בעת ההפקה, וגובר על ההגדרה של העסק לשני הכיוונים. null — ברירת המחדל וגם המשמעות של כל בקשה שנכתבה לפני שהשדה היה קיים — פירושו שההגדרה של העסק מחליטה. true ללקוח שאין בכרטיסו כתובת מוחזר ב-422 MAKOR-MAIL-002, ועל בקשת draft ב-422 MAKOR-DOC-016 — בשני המקרים לפני שנוצר מסמך כלשהו. |
doc_kindstringרשות | כינוי קריא לאותו קוד, למשל tax_invoice במקום 305. שקול לחלוטין ל-doc_type; שליחת שניהם מוחזרת עם 422 MAKOR-DOC-003 גם כשהם תואמים, כי אחרת סתירה אמיתית תעבור בשקט בפעם הבאה. כינוי לא מוכר מחזיר 422 MAKOR-DOC-004 ומונה את המוכרים. |
doc_type_name_he / _enstringחובה | שם סוג המסמך לתצוגה, מוכן להדפסה. |
seriesstringחובה | סדרת מספור, ברירת מחדל "A". |
doc_numberinteger | nullחובה | מוקצה בהפקה ולא ניתן לשינוי אחריה; null כל עוד המסמך טיוטה. |
statusstringחובה | draft · pending · issued · cancelled. |
customer_id / customer_name / customer_tax_idstring | nullחובה | תצלום של פרטי הלקוח שהוקפא בהפקה — עריכה מאוחרת של כרטיס הלקוח לא משנה מסמך שהופק. |
issue_date / due_datedate | nullחובה | תאריכי לוח. |
subtotalnumber (₪)חובה | סכום שורות המסמך לפני הנחת מסמך, ללא מע"מ. |
discount_totalnumber (₪)חובה | הנחה ברמת המסמך. |
taxable_amountnumber (₪)חובה | בסיס המע"מ אחרי חלוקת ההנחה — זה הסכום שנבדק מול סף ההקצאה. |
vat_rate_bpintegerחובה | שיעור בנקודות בסיס; 1800 = 18%. אפס כשהמסמך אינו נושא מע"מ. |
vat_amountnumber (₪)חובה | המע"מ המחושב. |
totalnumber (₪)חובה | סה"כ כולל מע"מ. |
withholding_amountnumber (₪)חובה | סכום שורות התשלום מסוג ניכוי מס במקור. |
currencystringחובה | קוד ISO 4217 של המטבע שבו נכתבו כל הסכומים שלמעלה. השמטת השדה בבקשה פירושה שקלים — בדיוק כמו כל בקשה שנכתבה לפני שהשדה היה קיים. כל מטבע אחר מחייב fx_rate. |
fx_ratenumber | nullחובה | ערך שקלי של יחידה אחת מהמטבע ביום המסמך. נשמר על המסמך ואינו משתנה בדיעבד — הוא חלק ממה שהמסמך מצהיר. אינו נשלף בשרת בזמן הפקה; ראו GET /fx/rates. עבור מסמך שקלי הערך הוא 1. |
ilsobject | nullחובה | אותו מסמך בשקלים, לפי השער שנשמר: subtotal · discount_total · taxable_amount · vat_amount · total · withholding_amount. null למסמך שקלי, שבו היה חוזר על אותם מספרים. זהו הצד שרשות המסים רואה — מבנה אחיד, דוחות מע"מ, וסף ההקצאה. |
allocation_statusstringחובה | ראו סטטוסי הקצאה. |
allocation_numberstring | nullחובה | מספר האישור המלא בן 26 ספרות. מדפיסים את תשע הספרות האחרונות. |
can_request_allocationbooleanרשות | האם POST /documents/{id}/allocation-request ייענה עבור המסמך הזה. שקלול של המצב, סוג המסמך, מספר הלקוח והשנה שהרשות מתירה — כדי שלא תצטרכו לשחזר את הכלל. הדבר היחיד שאינו נבדק כאן הוא חיבור העסק לרשות. |
languagestringחובה | he או en — קובע את שפת רינדור המסמך. |
parent_idstring | nullחובה | בחשבונית זיכוי: החשבונית המזוכה. |
is_sandboxbooleanרשות | true עבור מסמכי ניסוי. |
open_balancenumber (₪) | nullרשות | רק בקריאת מסמך בודד של חשבונית או חשבונית עסקה שהופקה: סה"כ פחות כל מה שכבר נסגר בקבלות ובזיכויים. |
lines[] / payments[]arrayרשות | נכללים רק בקריאת מסמך בודד, לא ברשימות. |
ערכים אפשריים#
אוצר מילים קבוע שחוזר בכל ה-API.
סוגי מסמכים
| קוד | doc_kind | שם | English | הערות |
|---|---|---|---|---|
| 10 | price_quote | הצעת מחיר | Quote | ללא השפעה חשבונאית |
| 100 | order | הזמנה | Order | ללא השפעה חשבונאית |
| 200 | delivery_note | תעודת משלוח | Delivery note | |
| 300 | proforma | חשבונית עסקה | Proforma | דרישת תשלום שאינה יוצרת אירוע מע"מ — הדפוס של בסיס מזומן |
| 305 | tax_invoice | חשבונית מס | Tax invoice | מספר הקצאה מעל הסף |
| 320 | tax_invoice_receipt | חשבונית מס/קבלה | Invoice-receipt | מחייבת תשלומים; ההקצאה חלה |
| 330 | credit_note | חשבונית זיכוי | Credit note | מחייבת parent_id; לעולם ללא הקצאה |
| 400 | receipt | קבלה | Receipt | מחייבת תשלומים; סוגרת חשבוניות דרך linked_invoices |
| 405 | donation_receipt | קבלה על תרומה | Donation receipt | עמותות בלבד, סדרה נפרדת |
MAKOR-DOC-001).סטטוס מסמך
| ערך | משמעות |
|---|---|
| draft | ניתן לעריכה, ללא מספר, ללא תוקף משפטי |
| pending | ממוספר ומוקפא; ממתין לאישור או להחלטה |
| issued | סופי ובלתי ניתן לשינוי |
| cancelled | בוטל; המספר נשמר בסדרה |
סטטוס הקצאה
| ערך | משמעות |
|---|---|
| not_required | מחוץ לחובת ההקצאה |
| pending | הבקשה בדרך |
| approved | אושר, המספר נשמר |
| rejected | מעוכב — נדרשת החלטה |
| rejected_continue | הופק ללא אישור, עם הכיתוב המשפטי |
| reverse_charge | הופק כהיפוך חיוב |
| objection | הוגשה השגה, ממתין להכרעה |
| failed_retro_pending | תקלה טכנית; המספר מתבקש בדיעבד |
אמצעי תשלום
| ערך | שדות נוספים |
|---|---|
| cash | — |
| cheque | מחייב cheque_number; מומלץ גם bank_code, branch, account, paid_date |
| card | card_brand, card_last4 (בדיוק 4 ספרות), installments |
| bank_transfer | transfer_ref |
| app | ביט, פייבוקס וכדומה |
| withholding | ניכוי מס במקור — לא כסף שהתקבל, אך מסלק את החוב ונספר בסכום |
| other | — |
טיפול מע"מ
| ערך | משמעות |
|---|---|
| standard | חייב מע"מ בשיעור מלא (18%) |
| exempt | עסקה פטורה — מחוץ לבסיס המע"מ |
| zero | מע"מ בשיעור אפס, למשל יצוא |
סוגי ישות
| ערך | בעברית |
|---|---|
| osek_patur | עוסק פטור |
| osek_murshe | עוסק מורשה |
| company | חברה בע"מ |
| partnership | שותפות |
| amuta | עמותה / מלכ"ר |
מסמכים#
ליבת ה-API. כל הנתיבים יחסיים לכתובת הבסיס ומשויכים לעסק.
/documentsdocuments:writeמפיק את המסמך: ולידציה → הקצאת מספר רציף → אישור מול רשות המסים → רינדור PDF. מחזיר 201, או 202 כשהרשות מעכבת את החשבונית. שליחת "draft": true עוצרת אחרי הוולידציה ומשאירה טיוטה ללא מספר.
פרמטרים וכותרות
Makor-Businessכותרתרשות | מפתח מפעיל מציין כאן על איזה עסק הוא פועל — uuid או מספר עוסק. |
sandboxboolean= false | יצירת מסמך ניסוי. מתעלמים ממנו במפתחות API — הסביבה של המפתח תמיד גוברת. |
Idempotency-Keyכותרתרשות | מומלץ בחום בכל בקשת כתיבה — שליחה חוזרת מחזירה את התשובה המקורית. |
גוף הבקשה
doc_typeintegerחובה | אחד מקודי סוגי המסמכים. |
issue_datedate= היום | ברירת מחדל: התאריך הנוכחי בישראל. קובע את שיעור המע"מ ואת סף ההקצאה שיחולו. |
customer_idstring (uuid)רשות | לקוח קיים; השם, מספר הזיהוי והכתובת מועתקים למסמך בהפקה. |
customer_namestringרשות | לקוח חד-פעמי, או דריסה של השם השמור. |
customer_tax_idstring (9 ספרות)רשות | חובה מעל סף ההקצאה (MAKOR-DOC-040). |
lines[]arrayרשות | description (חובה, ≤500), quantity (חובה, > 0), unit_price (חובה, ≥ 0), unit, discount, vat_treatment, item_id. נדרש לכל סוג מסמך חוץ מקבלות טהורות. |
payments[]arrayרשות | method ו-amount חובה. נדרש עבור 320, 400 ו-405, וסכומם חייב להיות שווה בדיוק לסכום המסמך (MAKOR-DOC-011). |
linked_invoices[]arrayרשות | { invoice_id, amount } — החשבוניות שהקבלה סוגרת, במלואן או בחלקן. נבדק מול היתרה הפתוחה של כל חשבונית תחת נעילת שורה, כך שקבלות מקבילות לא יכולות לסגור יתר. |
parent_idstring (uuid)רשות | חובה בחשבונית זיכוי (330): החשבונית המזוכה. |
document_discountnumber (₪)= 0 | הנחה על כלל המסמך, מחולקת יחסית על בסיס המע"מ. |
prices_include_vatboolean= false | המחירים בשורות (וההנחות) כבר כוללים מע"מ, והשרת מחלץ אותו מהם. הסכומים נשמרים ומיוצאים למבנה אחיד לפני מע"מ בכל מקרה; המסמך המודפס מציג את המחירים כפי שהוזנו. סה"כ המסמך יוצא בדיוק הסכום שהוזן. |
due_datedateרשות | תאריך לתשלום שיודפס על המסמך. |
languagestring= "he" | he או en — בוחר את שפת רינדור ה-PDF. |
seriesstring= "A" | סדרת מספור חלופית (למשל לפי סניף). כל סדרה רציפה בפני עצמה. |
notes / footer_textstringרשות | טקסט חופשי שיודפס על המסמך. |
{
"doc_type": 400,
"issue_date": "2026-08-07",
"customer_id": "019fda...",
"payments": [
{ "method": "bank_transfer", "amount": 1121.00, "paid_date": "2026-08-07" },
{ "method": "withholding", "amount": 59.00 }
],
"linked_invoices": [
{ "invoice_id": "019fdac1-...", "amount": 1180.00 }
]
}withholding הוא מה שמאזן את הקבלה — בדוגמה למעלה ₪1,121.00 הגיעו בהעברה ו-₪59.00 נוכו במקור, ויחד הם סוגרים חשבונית של ₪1,180.00./documents/{document_id}/issuedocuments:writeמפיק טיוטה קיימת — אותו צינור ואותה סמנטיקה של 201/202 כמו יצירה עם יצירה רגילה. הפקה של מסמך שאינו טיוטה מחזירה 409 MAKOR-DOC-060, וכך גם נראית בקשה כפולה.
/documents/{document_id}/allocation-decisiondocuments:writechoicestringחובה | אחד מ-cancel, continue, reverse_charge, object. |
reasonstring ≤500רשות | נשמר על המסמך בעת ביטול. |
תקף רק כשהמסמך pending וסטטוס ההקצאה שלו rejected או objection; אחרת 409 MAKOR-ALLOC-001. אם גם בקשת היפוך החיוב נדחית תקבלו 409 MAKOR-ALLOC-002.
/documents/{document_id}/allocation-requestdocuments:writeמבקש מספר הקצאה למסמך שכבר הופק. זהו הצד השני של השער: השער מבקש בזמן ההפקה, וזה מבקש אחר כך — עד שנה מתאריך החשבונית. מיועד לשלושת המצבים שבהם חשבונית קיימת ללא מספר: failed_retro_pending (הרשות לא הייתה זמינה), rejected_continue (הופקה ללא הקצאה לאחר דחייה) ו-not_required (מתחת לסף — הרשות מקצה גם עבורן). אם למסמך כבר יש מספר תקבלו 409 MAKOR-ALLOC-004: חשבונית אחת, הקצאה אחת. can_request_allocation על המסמך אומר מראש אם הקריאה תיענה.
curl -X POST 'https://makor.izid.io/api/v1/documents/{document_id}/allocation-request' \
-H 'Authorization: Bearer mk_live_...'HTTP/1.1 200 OK
{
"outcome": "approved",
"rejection_code": null,
"rejection_message": null,
"document": {
"id": "019fdad4-...",
"status": "issued",
"doc_number": 42,
"allocation_status": "approved",
"allocation_number": "20260807123456782000000042",
"allocation_number_short": "000000042",
"can_request_allocation": false
}
}outcome אומר איזו מהן: approved — למסמך יש מספר; rejected — הרשות ענתה על החשבונית הזאת ודחתה (rejection_code 460/461); failed — לא הושגה תשובה. בשתי האחרונות המסמך חוזר ללא שינוי: הוא הופק כדין, הוא בידי הלקוח, והדחייה אינה פותחת מחדש את החלטת ארבעת המסלולים. אם הוקצה מספר למסמך שהיה rejected_continue, הכיתוב "אין לנכות מס תשומות" אינו מופיע בעותק העדכני (?copy=true). המקור החתום נשמר ללא שינוי./documentsdocuments:readפרמטרים וכותרות
doc_typeintegerרשות | סינון לפי קוד סוג. |
statusstringרשות | draft · pending · issued · cancelled. |
from_date / to_datedateרשות | סינון לפי issue_date, כולל. |
limitinteger= 50 | מקסימום 200. |
cursorstringרשות | מתוך next_cursor הקודם. |
sandboxboolean= false | קריאות עם סשן מחליפות סביבה; מפתחות API נעולים לסביבה שלהם. |
מחזיר { items, next_cursor }, מהחדש לישן. פריטי הרשימה אינם כוללים lines, payments ו-open_balance — לשם כך קראו מסמך בודד.
/documents/{document_id}documents:readהמסמך המלא, כולל lines[], payments[] ו — בחשבוניות ובחשבוניות עסקה שהופקו — open_balance.
/documents/{document_id}/canceldocuments:writereasonstring ≤500רשות | סיבת הביטול; חובה בחשבונית מס שהופקה. |
original_not_deliveredbooleanרשות | חובה true לביטול חשבונית מס שהופקה: המקור לא יצא מרשות העסק. |
not_reportedbooleanרשות | חובה true: לא נכללה בדוח התקופתי. |
409 MAKOR-DOC-064); יש להפיק חשבונית זיכוי במקום. אם המקור נמסר או דווח, נדרש מסלול זיכוי. השרת דורש את שתי ההצהרות ומסרב כשקיים שיתוף או משלוח ידוע (MAKOR-DOC-066)./documents/{document_id}documents:writeמוחק טיוטה. כל מסמך שכבר ממוספר מחזיר 409 MAKOR-DOC-065 — מסמכים שהופקו הם בלתי ניתנים לשינוי ומבוטלים או מזוכים, לעולם לא נמחקים.
/documents/{document_id}/pdfdocuments:readמחזיר application/pdf. מסמכים חדשים נחתמים ונשמרים בזמן השלמת ההפקה; כל קריאה נוספת מחזירה בדיוק את אותם בייטים, כדי לשמר את קובץ המקור ללא שינוי. הוסיפו ?copy=true לרינדור העתק. לטיוטה אין PDF (409 MAKOR-PDF-001).
לקוחות#
/customerscustomers:readפרמטרים וכותרות
qstringרשות | חיפוש חופשי בשם, במספר הזיהוי ובאימייל. |
limitinteger= 50 | מקסימום 200. |
/customerscustomers:writenamestring ≤200חובה | שם לתצוגה. |
tax_idstring (9 ספרות)רשות | יידרש בהמשך אם תפיקו ללקוח חשבונית מעל סף ההקצאה. |
email / phonestringרשות | משמשים למשלוח מסמכים. |
address_street / _house / _city / _zipstringרשות | מודפסים על המסמכים. |
country_codestring (2)= "IL" | ISO 3166-1 alpha-2. |
withholding_rate_bpinteger 0–5000= 0 | שיעור ניכוי במקור ברירת מחדל בנקודות בסיס (500 = 5%), למילוי מראש בקבלות. |
notesstring ≤1000רשות | הערה פנימית. |
/customers/{customer_id}customers:read/customers/{customer_id}customers:writeעדכון חלקי. עריכת לקוח לעולם אינה משנה מסמכים שכבר הופקו עבורו — הם נושאים תצלום מוקפא.
/customers/{customer_id}customers:writeמחיקה רכה (השבתה). ההיסטוריה נשמרת לתקופת השמירה הקבועה בחוק.
/customers/{customer_id}/consentcustomers:read/customers/{customer_id}/consentcustomers:writegranted_viastringחובה | אחד מ-checkbox, link, import. |
פריטים#
קטלוג אופציונלי למילוי מהיר של שורות מסמך.
/itemsitems:readפרמטרים וכותרות
qstringרשות | חיפוש לפי שם. |
limitinteger= 100 | מקסימום 500. |
/itemsitems:writenamestring ≤200חובה | שם הפריט. |
name_enstringרשות | משמש במסמכים באנגלית. |
skustring ≤20רשות | מק"ט פנימי. |
unitstring= "יחידה" | יחידת מידה. |
unit_pricenumber (₪)= 0 | מחיר ברירת מחדל. |
vat_treatmentstring= "standard" | standard · exempt · zero. |
descriptionstring ≤500רשות | תיאור מורחב. |
/items/{item_id}items:write/items/{item_id}items:writeמספור#
סדרות מספור הן לפי עסק, סוג מסמך וסדרה, והן רציפות לחלוטין — החוק מחייב רצף, איסור שימוש חוזר באותה שנת מס, ושמסמך מבוטל ישמור על מספרו.
/numberingמציג את הסדרות האמיתיות (סדרות הניסוי פרטיות): doc_type, doc_type_name_he, series, next_number, configured_start, locked.
/numberingdoc_typeintegerחובה | הסוג שאת סדרתו אתם מגדירים. |
starting_numberinteger ≥ 1חובה | המספר הראשון שיופק. עוברים מפנקס ידני שהקבלה האחרונה בו הייתה 143? הזינו 144. |
seriesstring= "A" | הסדרה שיש להגדיר. |
409 MAKOR-NUM-002), מפני ששינוי רטרואקטיבי היה שובר את הרצף שהחוק מחייב.מטבע חוץ#
מסמך נקוב במטבע אחד. השמטת currency פירושה שקלים בשער 1 — בדיוק כמו כל בקשה שנכתבה לפני שהשדה היה קיים.
כל מטבע שאינו שקל מחייב fx_rate: הערך השקלי של יחידה אחת ביום המסמך. השער הוא חלק ממה שהמסמך מצהיר, ולכן הוא נשלח בבקשה ולא נשלף בשרת ברגע ההפקה — ונקפא עם המסמך. התשובה מחזירה את המסמך כפי שנשלח וגם כפי שדווח, תחת ils.
כל מה שהמדינה רואה קורא את הצד השקלי: ייצוא מבנה אחיד מדווח סכומי שקלים (המקור נשמר בשדות 1217/1218), דוחות המע"מ וההכנסות מסכמים בשקלים, וסף ההקצאה של 5,000 ₪ הוא סף שקלי — חשבונית של 1,500$ חוצה אותו.
שני כללים נובעים מכך שלמסמך יש מטבע אחד: סכום במטבע ללא יחידת משנה חייב להיות שלם (MAKOR-CUR-006 — 100.50¥ אינו מחיר), וקבלה סוגרת רק חשבונית באותו מטבע (MAKOR-LINK-006). אין שער שבו קישור דולרי מחסיר מיתרה שקלית.
/fx/ratesdocuments:readפרמטרים וכותרות
currencystringחובה | קוד ISO 4217, למשל USD. |
ondateרשות | ברירת המחדל היא היום בישראל. |
שער בנק ישראל למטבע אחד בתאריך אחד, מנורמל ליחידה אחת (הבנק מפרסם חלק מהמטבעות ל-100). 404 פירושו שהבנק לא פרסם את התאריך הזה — סוף שבוע או חג — ו-503 פירושו שהשירות אינו זמין. שניהם תשובות ולא כשלים: שלחו את השער שברשותכם.
/fx/currenciesdocuments:readהקודים שמותר להשתמש בהם, עם מספר הספרות שאחרי הנקודה והסמל לתצוגה.
סריקות (סריקת חשבוניות)#
מסמכים שהעסק קיבל. סריקה אינה מסמך: היא אינה מקבלת מספר, אינה נכנסת לייצוא מבנה אחיד ואינה יכולה להפוך למסמך — היא ראיה מתויקת שמזינה את דוח ההוצאות ואת מע"מ התשומות.
/scansscans:writeMultipart עם שדה file יחיד. אופציונלי: direction (expense/income), year, month, external_ref. JPG, PNG או PDF עד 50MB; PDF רב-עמודי הופך לסריקה לכל עמוד. מחזיר 202 עם scan_ids, או 200 עם {"scan_ids": [], "status": "duplicate"} כשאותם בייטים כבר הועלו — ולכן חזרה על העלאה תמיד בטוחה.
/scans/{id}scans:readהחילוץ רץ ברקע. עקבו עד ש-status יוצא מ-processing, או האזינו ל-scan.ready. extraction.uncertain_fields הוא המודל מסמן את קריאתו שלו; extraction.warnings הוא החשבון של השרת שחולק עליו. שניהם מסמנים מה לבדוק ואינם חוסמים תיוק.
/scans/{id}/approvescans:writeשום דבר אינו נספר בדוח עד לאישור. שלחו רק את מה שתוקן. האישור אוכף את מה שהסקירה רק התריעה עליו: סכום ביניים ועוד מע"מ חייבים להסתכם לסה"כ (MAKOR-SCAN-005), נדרש סה"כ (-009), וסריקה במטבע חוץ מחייבת fx_rate (-010).
/scans/{id}/imagescans:readכשהחילוץ אינו זמין — המתג כבוי או שאין מודל מוגדר — ההעלאה עדיין מצליחה והסריקה נוחתת ב-ready עם שדות ריקים ו-extraction.skipped_reason שמסביר. התייחסו לכך כמקרה רגיל, לא כשגיאה.
שליחה במייל#
קריאה אחת ששולחת ללקוח את המסמך שהופק, עם קובץ ה-PDF מצורף — אותם בייטים ש-GET /documents/{id}/pdf מחזיר, לא רינדור חדש.
/documents/{id}/senddocuments:writeשני השדות אופציונליים. השמטת to משתמשת בכתובת שבכרטיס הלקוח; כתובת מפורשת גוברת עליה. ללא אף אחת מהשתיים מוחזר MAKOR-MAIL-002 ולא הצלחה שקטה. ה-From הוא של מקור — כך המסר עובר DKIM בלי שכל עסק יפרסם רשומות DNS — ושם העסק מופיע בנושא ובגוף. Reply-To הוא כתובת העסק, כך שתשובה מגיעה אליו.
/documents/{id}/deliveriesdocuments:readstatus הוא sent, failed (עם error שמסביר — בטוח לנסות שוב) או captured — מצב ניסוי, שבו ההודעה נבנית ונרשמת ואף פעם אינה נשלחת. כל שליחה מפעילה webhook בשם document.emailed.
/email-deliveriesdocuments:readכל מה שהעסק שלח לאחרונה, החדש קודם. limit עד 100.
עסק שההגדרה email_auto_send שלו דלוקה שולח כל מסמך שמופק, לכל לקוח שיש בכרטיסו כתובת. השליחה רצה אחרי התשובה, וכישלון שליחה לעולם אינו מבטל הפקה — למסמך יש מספר והוא בספרים כך או כך. הכישלון הוא שורת משלוח failed לשליחה חוזרת, לא rollback. מפעיל קובע את ההגדרה ברישום העסק (POST /operator/businesses); לשנות אותה אחר כך יכול רק הבעלים, דרך PATCH /businesses/{id}.
send_email בקריאה שמפיקה את המסמך גובר על ההגדרה של העסק לשני הכיוונים: true שולח גם כשההגדרה כבויה, false עוצר גם כשהיא דלוקה, והשמטה משאירה את ההחלטה לעסק. בטיוטה שמופקת מאוחר יותר שולחים אותו ב-POST /documents/{id}/issue. בקשה שאי אפשר לקיים נדחית לפני שנוצר מסמך — 422 MAKOR-MAIL-002 ללקוח בלי כתובת, 422 MAKOR-DOC-016 על טיוטה — כי זה הרגע היחיד שדחייה לא עולה מספר מסמך. אחריו הכלל הרגיל חוזר: שליחה שנכשלת היא שורת משלוח, לא מסמך שבוטל.
מסמכים חדשים חתומים בתוך ה-PDF באמצעות מפתח נפרד לכל עסק. זוהי חתימה קריפטוגרפית בתעודה פנימית, ללא אישור של ספק חיצוני וללא חותמת זמן חיצונית. מסמכים היסטוריים אינם נחתמים מחדש. עותקים ותצוגת HTML אינם קובץ המקור החתום.
דוחות#
צבירות על מסמכים אמיתיים שהופקו. חשבוניות זיכוי מקוזזות; מסמכי ניסוי לעולם אינם נספרים.
/reports/incomereports:readפרמטרים וכותרות
from_datedateחובה | כולל. |
to_datedateחובה | כולל. |
מחזיר monthly[] (month, total, vat), by_type[] ו-total.
/reports/vatreports:readמע"מ עסקאות לפי חודש: periods[] עם taxable ו-output_vat, בתוספת total_output_vat.
/reports/withholdingreports:readמס שנוכה במקור לפי לקוח — הנתונים שמאחורי התאמת טופס 806 השנתית: customers[] ו-total_withheld.
מבנה אחיד#
ייצוא הספרים הסטטוטורי שמוגדר בהוראות ניהול ספרים, מפרט גרסה 1.31 — הקבצים שמבקר או רואה החשבון שלכם יבקשו.
/exports/unified-formatexport:readfrom_datedateחובה | כולל. |
to_datedateחובה | כולל; אסור שיקדם ל-from_date (MAKOR-EXP-001). |
בונה את INI.TXT ואת BKMVDATA.TXT (רוחב קבוע, ISO-8859-8, CRLF) בתוך מבנה התיקיות המחייב OPENFRMT/{vat}.{yy}/{MMDDhhmm}, ומחזיר export_id, folder_name, record_counts ואת closing_report — לכל סוג מסמך, הכמות והסכום שרואה החשבון מתאים מולם.
/exports/unified-format/{export_id}/downloadexport:readמחזיר את קובץ ה-ZIP. חברי צוות בתפקיד רואה חשבון יכולים לייצא גם בלי יכולת להפיק מסמכים — זו בדיוק מטרת התפקיד.
Webhooks#
הירשמו לאירועים במקום לתשאל בלולאה. כל משלוח חתום ב-HMAC וכל ניסיון נרשם.
/webhooksurlstring (https)חובה | כתובת היעד. |
eventsstring[]חובה | לפחות שם אירוע אחד; שמות לא מוכרים נדחים עם 422 MAKOR-WH-001. |
לבעלים בלבד. התשובה כוללת את סוד החתימה secret — מוצג פעם אחת.
| אירוע | נשלח | מטען |
|---|---|---|
| document.issued | כן | document_id, doc_type, doc_number, total, allocation_status |
| allocation.rejected | כן | document_id, rejection_code |
| document.emailed | כן | document_id, to, status |
| scan.ready | כן | scan_id, status, direction, external_ref |
| scan.failed | כן | scan_id, status, direction, external_ref |
| scan.approved | כן | scan_id, total, currency |
| document.cancelled | שמור | — |
| allocation.approved | שמור | — |
| allocation.retro_assigned | שמור | — |
| payment.linked | שמור | — |
| export.ready | שמור | — |
| ita.authorization_expiring | שמור | — |
POST https://your-app.example/hooks/makor
X-Makor-Event: document.issued
X-Makor-Signature: t=1786000000,v1=6f2b...c91
{
"event": "document.issued",
"created_at": "2026-08-07T12:31:07.481Z",
"data": {
"document_id": "019fdad4-...",
"doc_type": 305,
"doc_number": 42,
"total": 7080.0,
"allocation_status": "approved"
}
}אימות החתימה
חשבו HMAC-SHA256(secret, "{t}.{raw body}") על גוף הבקשה הגולמי — פענוח ה-JSON וסריאליזציה מחדש משנים את הבייטים ושוברים את ההשוואה. השוו בזמן קבוע ודחו חותמות זמן ישנות.
import crypto from "node:crypto";
export function verify(rawBody, header, secret, toleranceSec = 300) {
const parts = Object.fromEntries(
header.split(",").map((kv) => kv.split("=").map((s) => s.trim()))
);
const timestamp = Number(parts.t);
if (!Number.isFinite(timestamp)) return false;
if (Math.abs(Date.now() / 1000 - timestamp) > toleranceSec) return false;
const expected = crypto
.createHmac("sha256", secret)
.update(`${parts.t}.${rawBody}`)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(expected, "hex"),
Buffer.from(parts.v1, "hex")
);
}import hmac, hashlib, time
def verify(raw_body: bytes, header: str, secret: str, tolerance: int = 300) -> bool:
parts = dict(kv.split("=", 1) for kv in header.split(","))
ts = int(parts["t"])
if abs(time.time() - ts) > tolerance:
return False
expected = hmac.new(
secret.encode(),
f"{ts}.".encode() + raw_body,
hashlib.sha256,
).hexdigest()
return hmac.compare_digest(expected, parts["v1"])/webhooks/webhooks/{webhook_id}/deliveriesחמישים הניסיונות האחרונים עם event_type, status, response_status ו-attempt — המקום הראשון לבדוק כשאינטגרציה משתתקת.
/webhooks/{webhook_id}2xx ובצעו את העיבוד אסינכרונית; התייחסו לכל אירוע כאילו הוא עלול להישלח פעמיים והשתמשו ב-document_id כמפתח.מפתחות API#
מפתחות מנוהלים בידי משתמשים מחוברים, לא בידי מפתחות אחרים.
/api-keysnamestring ≤100חובה | תווית שתוצג בממשק. |
scopesstring[]רשות | ברירת מחדל: המקסימום שתפקידכם מתיר. הרשאה לא מוכרת מחזירה 422 MAKOR-KEY-001. |
sandboxboolean= false | יצירת מפתח mk_test_ הקשור לנתוני ניסוי. |
מחזיר את key (הסוד המלא, פעם אחת), key_id, ההרשאות שניתנו scopes ו-sandbox.
/api-keysמטא-דאטה בלבד — key_id, name, scopes, sandbox, last_used_at, revoked. הסודות אינם ניתנים לאחזור לעולם.
/api-keys/{key_id}מבטל מיידית. נדרש תפקיד בעלים או עובד.
מפעילים#
מפעיל הוא ספק תוכנה שמפיק מסמכים בשם עסקים אחרים — קופה, מערכת הזמנות, פלטפורמת SaaS. מפתח אחד, כל הלקוחות שלכם.
מודל ההרשאות
מפעיל אינו חבר בעסקים שהוא משרת. הוא מחזיק הרשאה אחת לכל עסק, שהעסק מעניק ויכול לבטל בכל רגע, ואין לו שום גישה לניהול העסק: לא לעדכון פרטי העסק, לא לצוות, לא למספור ולא ליצירת מפתחות. ההרשאה גם תוחמת את מה שהוא יכול לעשות — ראו הרשאות.
איך זה מתחבר
| שלב | מי מבצע | קריאה |
|---|---|---|
| רישום כמפעיל | אתם, מחוברים לחשבון | POST /operators |
| יצירת מפתח מפעיל | מנהל מפעיל, מחובר | POST /operators/{operator_id}/api-keys |
| הרשמה לאירועי חיבור | מנהל מפעיל, מחובר | POST /operators/{operator_id}/webhooks |
| הענקת הרשאה | בעל העסק | POST /businesses/{business_id}/operators |
| — או — רישום עסק חדש | המפתח שלכם | POST /operator/businesses |
| גילוי העסקים שלכם | המפתח שלכם | GET /operator/businesses |
| הפקת מסמכים | המפתח שלכם | POST /documents + Makor-Business |
Makor-Business (מזהה העסק או מספר העוסק/ח.פ). אינטגרציה קיימת לעסק בודד הופכת לרב-עסקית בהחלפת המפתח, הוספת הכותרת ולולאה מעל /operator/businesses.רישום עסק שאתם מביאים
/operator/businessesעד כאן ההנחה הייתה שהעסק כבר רשום ב-Makor והעניק לכם הרשאה. אם אתם מביאים לקוח חדש, הקריאה הזו רושמת אותו ומעניקה לכם הרשאה באותה פעולה. מאומתת במפתח המפעיל שלכם בלבד. מספר עוסק נרשם פעם אחת בלבד: אם הוא כבר שלכם תחזור 409 MAKOR-REG-001 עם מזהה העסק, ואם הוא רשום לגורם אחר תחזור 409 MAKOR-REG-004 — במקרה כזה על העסק לחבר אתכם מהחשבון שלו. אין כאן scopes: ההרשאה נפתחת מלאה, והבעלים מצמצם או מבטל אותה כשהוא תופס את העסק.
legal_namestring 2–200חובה | השם הרשום ברשות המסים — לא שם מסחרי. מודפס על כל מסמך. |
tax_idstring (9 ספרות)חובה | מספר עוסק / ח.פ. ספרת הביקורת נבדקת (422 MAKOR-BIZ-002). |
entity_typeenumחובה | osek_patur · osek_murshe · company · partnership · amuta. קובע חבות במע״מ ואת סוגי המסמכים. |
owner_emailemailחובה | בעל העסק. נוצר לו משתמש, והוא זה שיחבר את רשות המסים ויוכל לבטל את ההרשאה שלכם. |
address_street / _house / _citystringחובה | כתובת העסק, מודפסת על כל מסמך. אחרי הרישום אין אצלנו את מי לשאול — הבעלים עוד לא התחבר. |
phonestring 6–30חובה | טלפון העסק. |
terms_acceptedbooleanחובה | חייב להיות true. false מחזיר 422 MAKOR-REG-003 ולא נוצר דבר. |
owner_namestring ≤200רשות | שם הבעלים, למכתב ההזמנה. |
address_zipstringרשות | מיקוד. לא חובה — אינו ניתן לגזירה מכתובת. |
occupationstringרשות | תחום העיסוק. |
emailemailרשות | כתובת הקשר של העסק. אם לא נשלחה, נשתמש ב-owner_email. |
default_locale"he" | "en"= "he" | שפת המסמכים. |
email_auto_sendboolean= false | האם כל מסמך שהעסק מפיק יישלח גם במייל ללקוח. זה הרגע היחיד שאתם קובעים זאת — לאחר מכן המתג הוא של הבעלים (PATCH /businesses/{id} פתוח לבעלים בלבד). |
terms_accepted הוא ההצהרה שלכם, לא הוכחה. מה שנשמר אצלנו הוא מה שאנחנו באמת יודעים: איזה מפעיל הצהיר, באיזה מפתח, מתי, ומול איזו גרסת תנאים — את הגרסה ואת השעה אנחנו חותמים, לא אתם. עמדו מאחורי זה. שני דברים שהרישום אינו עושה: הוא אינו הופך אתכם לבעלים — לבעל העסק נשלחת הזמנה והוא יכול לנתק אתכם בכל רגע — והוא אינו מחבר את העסק לרשות המסים. חיבור רשות המסים דורש התחברות אישית של הבעלים, ולכן מספרי הקצאה לא יהיו זמינים עד שיעשה זאת./operator/businessesמוחזר data[] עם business_id, legal_name, tax_id, scopes (ההרשאה האפקטיבית) ו-granted_at, יחד עם has_more ו-next_offset. פרמטרים: limit (ברירת מחדל 100, מקסימום 500) ו-offset. זו הקריאה היחידה שבה מפתח מפעיל תקף בלי עסק בנתיב.
אינטגרציה מלאה
const KEY = process.env.MAKOR_OPERATOR_KEY; // mk_op_live_… or mk_op_test_…
const BASE_URL = KEY.startsWith("mk_op_test_")
? "https://sandbox.makor.izid.io/api/v1"
: "https://makor.izid.io/api/v1";
const auth = { Authorization: `Bearer ${KEY}` };
// 1. Ask which businesses have connected you, and what each one allows.
// Cache this; grant.created / grant.revoked keep it fresh.
const { data } = await (
await fetch(`${BASE_URL}/operator/businesses`, { headers: auth })
).json();
// 2. From here the API is identical to a single-business integration.
// The business_id in the path is the only thing that changes.
for (const biz of data) {
if (!biz.scopes.includes("documents:write")) continue; // read-only grant
await fetch(
`${BASE_URL}/businesses/${biz.business_id}/documents`,
{
method: "POST",
headers: {
...auth,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
doc_type: 320,
issue_date: new Date().toISOString().slice(0, 10),
customer_name: "לקוח לדוגמה",
lines: [
{ description: "מנוי חודשי", quantity: 1, unit_price: 199 },
],
payments: [
{ method: "card", amount: 234.82, card_brand: "Visa" },
],
}),
}
);
}/businesses/{business_id}/operatorsoperator_iduuidחובה | המפעיל שמקבל את ההרשאה. מפעיל לא מוכר או מושבת מחזיר 404. |
scopesstring[]חובה | התקרה שהעסק מעניק. הרשאה לא מוכרת מחזירה 422 MAKOR-KEY-001. |
לבעלים בלבד — מפעיל אינו יכול לצרף את עצמו. הרשאה כפולה מחזירה 409 MAKOR-OP-001; הענקה מחדש אחרי ביטול משתמשת באותה רשומה, כך שההיסטוריה של מי היה מחובר נשמרת במקום אחד.
/businesses/{business_id}/operators/businesses/{business_id}/operators/{grant_id}מנתק את המפעיל מהעסק הזה בלבד. הביטול נכנס לתוקף בבקשה הבאה, ואינו נוגע במפתח של המפעיל ולא ביתר העסקים שלו.
אירועי חיבור וניתוק
אירועי המפעיל נרשמים על נקודות הקצה של המפעיל, לא של העסק, וניתן להירשם רק אליהם שם. בלעדיהם תגלו ניתוק רק כשקריאות חיות יתחילו להחזיר 404.
| אירוע | מטען |
|---|---|
| grant.created | grant_id, business_id, legal_name, tax_id, scopes |
| grant.revoked | grant_id, business_id |
יעדי webhook ומפתחות נוצרים בקונסולת המפעיל בזמן שאתם מחוברים, ולא דרך ה-API — מפתח לא יכול ליצור מפתח נוסף.
מפתח מפעיל נוצר בידי מנהל מפעיל מחובר בלבד — מפתח לא יכול ליצור מפתח נוסף. מוחזר key פעם אחת בלבד, עם קידומת mk_op_live_ או mk_op_test_, כדי שמפתח שדלף יסגיר את היקף הנזק כבר מהמחרוזת.
מצב מול רשות המסים#
האם העסק מחובר, ולכן האם מספרי הקצאה זמינים לו בכלל. מפעיל שרשם עסק חדש ירצה לבדוק את זה לפני שהוא מנסה להפיק מעל הסף.
/ita/exports/unified-format/reportאינדקס קודי שגיאה#
כל שגיאת כלל עסקי שה-API יכול להחזיר. הקודים יציבים בין גרסאות — הסתמכו עליהם.
| קוד | HTTP | משמעות ואיך לתקן |
|---|---|---|
| MAKOR-401 | 401 | נדרש אימות — מפתח חסר, לא מוכר או מבוטל. |
| MAKOR-403 | 403 | חסרה הרשאה, או תפקיד לקריאה בלבד שמנסה לכתוב. |
| MAKOR-404 | 404 | לא נמצא, או שייך לעסק או לסביבה אחרת. |
| MAKOR-AUTH-001 | 409 | האימייל כבר רשום. |
| MAKOR-AUTH-002 | 401 | אימייל או סיסמה שגויים. |
| MAKOR-AUTH-003 | 403 | החשבון מושבת. |
| MAKOR-BIZ-001 | 422 | סוג ישות לא מוכר. |
| MAKOR-BIZ-002 | 422 | מספר הזיהוי נכשל בבדיקת ספרת ביקורת. |
| MAKOR-BIZ-003 | 409 | המשתמש כבר חבר או כבר הוזמן. |
| MAKOR-BIZ-004 | 403 | לא ניתן להסיר את חברות הבעלים. |
| MAKOR-DOC-000 | 422 | קוד סוג מסמך לא מוכר. |
| MAKOR-DOC-003 | 422 | יש לציין בדיוק אחד מבין doc_type ל-doc_kind. |
| MAKOR-DOC-004 | 422 | כינוי doc_kind לא מוכר — התשובה מונה את המוכרים. |
| MAKOR-DOC-013 | 422 | אין ממה להסיק את סכום ה-payment_method. |
| MAKOR-DOC-014 | 422 | נשלחו גם payment_method וגם payments. |
| MAKOR-DOC-015 | 422 | ערך payment_method לא מוכר. |
| MAKOR-DOC-016 | 422 | send_email:true על טיוטה — לטיוטה אין מה לשלוח. |
| MAKOR-DOC-017 | 422 | מזומן מעל המותר בחוק צמצום השימוש במזומן למחיר העסקה. |
| MAKOR-DOC-018 | 422 | תאריך המסמך עתידי. |
| MAKOR-DOC-019 | 422 | תאריך המסמך מוקדם מהמסמך הקודם בסדרה. |
| MAKOR-DOC-041 | 422 | חסר שם לקוח (ולא מדובר במכירה קמעונית במזומן). |
| MAKOR-REG-001 | 409 | כבר קיימת לכם הרשאה פעילה על מספר העוסק הזה. |
| MAKOR-REG-003 | 422 | terms_accepted חייב להיות true. |
| MAKOR-REG-004 | 409 | מספר העוסק כבר רשום במערכת לגורם אחר. |
| MAKOR-BIZ-005 | 409 | מספר העוסק מתאים ליותר מעסק אחד שיש לכם גישה אליו — יש לפנות לפי business_id. |
| MAKOR-BIZ-006 | 422 | מפתח מפעיל חייב לציין עסק בכותרת Makor-Business. |
| MAKOR-BIZ-007 | 422 | בסשן מחובר יש לציין את העסק במפורש. |
| MAKOR-DOC-001 | 422 | סוג הישות אינו רשאי להפיק סוג מסמך זה — למשל עוסק פטור שמנסה להפיק חשבונית מס. |
| MAKOR-DOC-002 | 422 | למסמך אין שורות. |
| MAKOR-DOC-010 | 422 | לקבלה אין שורות תשלום. |
| MAKOR-DOC-011 | 422 | שורות התשלום אינן מסתכמות בסכום המסמך — זכרו שניכוי במקור נספר כשורת תשלום. |
| MAKOR-DOC-012 | 422 | לתשלום בצ'ק חסר cheque_number — כולל שימוש ב-payment_method: check. |
| MAKOR-DOC-020 | 422 | לחשבונית זיכוי חסר parent_id. |
| MAKOR-DOC-021 | 422 | ניתן לזכות רק חשבונית מס או חשבונית מס/קבלה. |
| MAKOR-DOC-022 | 422 | רק קבלות יכולות לסגור חשבוניות. |
| MAKOR-DOC-030 | 422 | סכום חשבונית שלילי — יש להפיק חשבונית זיכוי במקום. |
| MAKOR-DOC-040 | 422 | customer_tax_id הוא חובה מעל סף ההקצאה. |
| MAKOR-DOC-050 | 404 | ה-customer_id אינו קיים בעסק הזה. |
| MAKOR-DOC-060 | 409 | המסמך אינו טיוטה — לרוב בקשת הפקה כפולה. |
| MAKOR-DOC-061 | 404 | המסמך לא נמצא. |
| MAKOR-DOC-062 | 409 | לא ניתן להשלים הפקה מהסטטוס הנוכחי של המסמך. |
| MAKOR-DOC-063 | 409 | טיוטה נמחקת, לא מבוטלת. |
| MAKOR-DOC-064 | 409 | למסמך מקושרות קבלות או זיכויים — יש לזכות אותו במקום לבטל. |
| MAKOR-DOC-065 | 409 | רק טיוטות ניתנות למחיקה. |
| MAKOR-LINK-001 | 422 | החשבונית המקושרת לא נמצאה. |
| MAKOR-LINK-002 | 422 | יעד הקישור אינו מסמך שהופק. |
| MAKOR-LINK-003 | 422 | קבלות יכולות לסגור רק חשבוניות מס או חשבוניות עסקה. |
| MAKOR-LINK-004 | 422 | סכום הקישור חייב להיות חיובי. |
| MAKOR-LINK-005 | 422 | סכום הקישור עולה על היתרה הפתוחה של החשבונית — קראו קודם את open_balance. |
| MAKOR-LINK-006 | 422 | לא ניתן לקשר מסמכים במטבעות שונים. |
| MAKOR-CUR-001 | 422 | מטבע לא נתמך. |
| MAKOR-CUR-002 | 422 | מסמך שקלי אינו יכול לשאת שער השונה מ-1. |
| MAKOR-CUR-003 | 422 | מסמך במטבע חוץ מחייב fx_rate. |
| MAKOR-CUR-004 | 422 | שער החליפין חייב להיות חיובי. |
| MAKOR-CUR-005 | 422 | שער החליפין מוגבל לשש ספרות אחרי הנקודה. |
| MAKOR-CUR-006 | 422 | למטבע אין יחידת משנה — הסכומים חייבים להיות שלמים. |
| MAKOR-CUR-007 | 422 | לשקל אין שער חליפין מול עצמו. |
| MAKOR-CUR-008 | 503 | שירות שערי בנק ישראל אינו זמין — יש להזין שער ידנית. |
| MAKOR-CUR-009 | 404 | לא פורסם שער לתאריך המבוקש — יש להזין שער ידנית. |
| MAKOR-ALLOC-001 | 409 | המסמך אינו ממתין להחלטת הקצאה. |
| MAKOR-ALLOC-002 | 409 | גם בקשת היפוך החיוב נדחתה. |
| MAKOR-ALLOC-003 | 409 | רק מסמך שהופק יכול לקבל מספר הקצאה בדיעבד. |
| MAKOR-ALLOC-004 | 409 | למסמך זה כבר הוקצה מספר הקצאה. |
| MAKOR-ALLOC-005 | 409 | מצב ההקצאה של המסמך אינו מאפשר בקשה חדשה. |
| MAKOR-ALLOC-006 | 422 | סוג המסמך אינו יכול לשאת מספר הקצאה. |
| MAKOR-ALLOC-007 | 422 | לא ניתן לבקש מספר הקצאה ללא מספר עוסק/ח.פ של הלקוח. |
| MAKOR-ALLOC-008 | 409 | חלפה יותר משנה מתאריך החשבונית. |
| MAKOR-ALLOC-009 | 409 | העסק אינו מחובר לרשות המסים. |
| MAKOR-NUM-001 | 422 | סוג המסמך אינו זמין לסוג הישות הזה. |
| MAKOR-NUM-002 | 409 | המספור נעול — כבר הופקו מסמכים בסדרה זו. |
| MAKOR-IDEM-001 | 422 | מפתח אידמפוטנטיות שומש עם גוף בקשה שונה. |
| MAKOR-IDEM-002 | 409 | הבקשה המקורית עדיין בעיבוד — נסו שוב בעוד רגע. |
| MAKOR-PAGE-001 | 422 | קורסור עימוד פגום. |
| MAKOR-PDF-001 | 409 | לטיוטות אין PDF. |
| MAKOR-SHARE-001 | 409 | ניתן לשתף רק מסמכים שהופקו. |
| MAKOR-MAIL-001 | 503 | שליחת מייל אינה מוגדרת בשרת הזה. |
| MAKOR-MAIL-002 | 422 | אין כתובת מייל ללקוח — יש להזין אחת ב-to. |
| MAKOR-MAIL-003 | 422 | כתובת המייל אינה תקינה. |
| MAKOR-MAIL-004 | 409 | ניתן לשלוח רק מסמך שהופק. |
| MAKOR-MAIL-005 | 502 | שרת הדואר דחה את ההודעה — אפשר לנסות שוב. |
| MAKOR-EXP-001 | 422 | טווח תאריכים לא חוקי לייצוא. |
| MAKOR-EXP-002 | 422 | סוף טווח התאריכים לא יכול להיות עתידי. |
| MAKOR-EXP-003 | 422 | נתיב השמירה ארוך מדי עבור שדה הנתיב בקובץ. |
| MAKOR-UNI-001 | 409 | ייצוא מבנה אחיד אינו מוגדר בצד השרת. |
| MAKOR-KEY-001 | 422 | התבקשה הרשאה לא מוכרת. |
| MAKOR-WH-001 | 422 | שם אירוע webhook לא מוכר. |
| MAKOR-OP-001 | 409 | המפעיל כבר מורשה בעסק הזה — בטלו קודם כדי לשנות הרשאות. |
| MAKOR-ITA-001 | 409 | קריאת ה-OAuth של רשות המסים אינה רלוונטית במצב הנוכחי. |
מגבלות וגרסאות#
| ניהול גרסאות /api/v1 | הגרסה נמצאת בנתיב. שינויים מוסיפים (שדות, endpoints וערכים חדשים) יוצאים בלי העלאת גרסה — פרסו בזהירות והתעלמו משדות לא מוכרים. |
| הגבלת קצב אין אכיפה | אין מכסה קשיחה כיום. שמרו על מקביליות סבירה; ההפקה מסודרת במכוון בטור לכל סדרת מספור, כך שהפקה מקבילה של אותו סוג מסמך לא תזרז דבר. |
| גודל בקשה מעשי | אין תקרה קבועה, אך שמרו על מספר שורות סביר במסמך — הוא צריך להתרנדר לקובץ PDF להדפסה. |
| שמירת נתונים 7 שנים | מסמכים שהופקו וקובצי המקור שלהם נשמרים לתקופה הקבועה בחוק ואינם ניתנים למחיקה דרך ה-API. |