API ו-Webhooks

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

התחלה מהירה

  1. נכנסים לאזור האישי, לטאב 🔌 חיבורים.
  2. כדי לקבל עדכונים, מדביקים כתובת Webhook ושומרים. מקבלים מפתח חתימה, ולוחצים "שליחת אירוע בדיקה".
  3. כדי שהמערכת שלכם תשלח אלינו, יוצרים מפתח API ושולחים אותו בכותרת Authorization.
curl https://voice.bdnhost.net/v1/calls?limit=5 \
  -H "Authorization: Bearer bdnv_YOUR_KEY"

Webhooks

כשמשהו קורה, נשלחת בקשת POST עם גוף JSON לכתובת שהגדרתם, שחייבת להתחיל ב-https://. תחזירו קוד 2xx תוך 10 שניות. אם המשלוח נכשל, ננסה שוב אחרי 30 שניות, אחרי 5 דקות ואחרי 30 דקות. יומן המשלוחים מופיע בטאב החיבורים.

כותרות שנשלחות עם כל אירוע: X-BDN-Event (שם האירוע) ו-X-BDN-Signature (חתימה, הסבר בהמשך).

{
  "event": "call.completed",
  "created_at": "2026-11-11T14:32:05.120Z",
  "data": {
    "business": "מיזוג אבי",
    "call": {
      "id": 1842,
      "conversation_id": "conv_3101m75k...",
      "started_at": "2026-11-11T14:29:51.000Z",
      "direction": "inbound",
      "caller": "+972521234567",
      "duration_seconds": 134,
      "summary": "לקוח מקריית ביאליק, המזגן בסלון מטפטף. מבקש טכנאי מחר בבוקר.",
      "urgent": false,
      "fields": {
        "full_name": "רונן לוי",
        "callback_phone": "0521234567",
        "reason": "מזגן מטפטף",
        "urgency": "רגיל",
        "preferred_time": "מחר בבוקר",
        "job_type": "תיקון מזגן",
        "location": "קריית ביאליק"
      },
      "recording_url": "https://voice.bdnhost.net/v1/recordings/1842?exp=...&sig=..."
    }
  }
}

הקישור להקלטה (recording_url) חתום ותקף 7 ימים. אם צריך את ההקלטה לטווח ארוך, הורידו ושמרו אותה אצלכם.

אירועים

אירועמתי נשלחמה כולל
call.completedבסוף כל שיחה נכנסתcall
call.urgentכשהשיחה סומנה כדחופה (נשלח בנוסף ל-completed)call
campaign.call_completedבסוף שיחה יוצאת מקמפייןcampaign, contact, call
number.activatedכשהמספר של העוזר/ת הופעלnumber

השדות ב-fields משתנים לפי מה שנאמר בשיחה. השדות האפשריים הם full_name, callback_phone, reason, urgency, preferred_time ו-needs_callback. בעסקי שירות נוספים גם job_type, location ו-scope.

אימות חתימה

הכותרת X-BDN-Signature נראית כך: t=1794410000,v1=5f2c…. כדי לאמת, מחשבים HMAC-SHA256 על המחרוזת t + "." + raw_body עם מפתח החתימה (whsec_…) ומשווים ל-v1. מומלץ גם לדחות אירועים שה-t שלהם ישן מ-5 דקות.

Node.js

import crypto from 'node:crypto';
function verify(rawBody, header, secret) {
  const { t, v1 } = Object.fromEntries(header.split(',').map(p => p.split('=')));
  const expected = crypto.createHmac('sha256', secret).update(t + '.' + rawBody).digest('hex');
  const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300;
  return fresh && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}

Python

import hmac, hashlib, time
def verify(raw_body: bytes, header: str, secret: str) -> bool:
    parts = dict(p.split('=', 1) for p in header.split(','))
    expected = hmac.new(secret.encode(), f"{parts['t']}.".encode() + raw_body, hashlib.sha256).hexdigest()
    return abs(time.time() - int(parts['t'])) < 300 and hmac.compare_digest(expected, parts['v1'])

אימות API

כל בקשה ל-https://voice.bdnhost.net/v1/… צריכה מפתח API בכותרת. מפתחות יוצרים ומבטלים בטאב החיבורים. אפשר להחזיק עד 5 מפתחות פעילים.

Authorization: Bearer bdnv_0123456789abcdef...
🔒 המפתח נותן גישה לשיחות של העסק. שמרו אותו בצד השרת בלבד, ואל תשימו אותו בקוד שרץ בדפדפן או באפליקציה.

נקודות קצה

GET/v1/me

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

GET/v1/calls?limit=50&since=2026-11-01T00:00:00Z

רשימת שיחות, מהחדשה לישנה. limit עד 200. כדי לסנכרן רק שיחות חדשות, שולחים ב-since את started_at של השיחה האחרונה שקיבלתם.

GET/v1/calls/{id}

שיחה אחת עם התמלול המלא: transcript: [{ role: "agent" | "caller", text, at_seconds }].

GET/v1/profile

מה העוזר/ת יודע/ת כרגע על העסק.

PATCH/v1/profile

עדכון הידע. אפשר לשלוח כל חלק מהשדות, והעוזר/ת מתעדכנ/ת תוך שניות. השדות האפשריים: description, hours, address, area, parking, contact_phone, prices, policies, extra, services (מערך) ו-faq (מערך של {q, a}, שמחליף את הרשימה הקיימת).

curl -X PATCH https://voice.bdnhost.net/v1/profile \
  -H "Authorization: Bearer bdnv_YOUR_KEY" -H "Content-Type: application/json" \
  -d '{"hours":"א׳–ה׳ 8:00–17:00, שישי 8:00–13:00","extra":"השבוע אין שירות ביום רביעי בגלל חג"}'
POST/v1/faq

הוספה או עדכון של שאלה נפוצה אחת: {"q": "יש חניה?", "a": "כן, חניה חינם מול העסק"}.

POST/v1/campaigns

פתיחת קמפיין שיחות יוצאות, למשל תזכורות או מעקב. כל קמפיין עובר אישור לפני שהוא מתחיל, והשיחות יוצאות רק בשעות מותרות. מותר להתקשר רק לאנשים שיש להם קשר עם העסק ושהסכימו לקבל שיחות (consent: true).

{
  "name": "תזכורת טיפול שנתי",
  "goal": "להזכיר ללקוח שהגיע הזמן לטיפול שנתי במזגן ולתאם מועד",
  "kind": "service",
  "consent": true,
  "contacts": [ { "name": "רונן לוי", "phone": "0521234567" } ]
}
GET/v1/campaigns

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

Zapier, Make ו-n8n (בלי קוד)

מגבלות ושגיאות

מגבלהערך
בקשות API120 לדקה למפתח
עדכוני פרופיל30 בשעה
תשובת Webhookעד 10 שניות, 4 ניסיונות בסך הכול

שגיאות חוזרות כ-JSON בצורה {"error": "..."}: 401 מפתח חסר או לא תקין, 404 לא נמצא, 429 חריגה מהמגבלה, 400 בקשה לא תקינה.

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