מדריך עזר ל־API

כל נקודות הקצה, השדות, האירועים והסטטוסים.

כללי

כתובת הבסיס https://api.oneli.io. כל נקודת קצה כאן דורשת Authorization: Bearer oli_… (מפתח API או טוקן של סוכן מחובר), חוץ מ־GET /v1/voices. גופי בקשה ב־JSON. שגיאות לפי מבנה השגיאות. לא מוצגים כאן נקודות קצה שדורשות התחברות של אדם (חיוב, פרופיל, מפתחות).

יצירת משימת שיחה

POST/v1/call-tasks

שדהסוגתיאור
idempotency_keystring ≤100חובהמפתח ייחודי לבקשה. אותו מפתח שוב מחזיר את המשימה הקיימת (200, created: false) ולא יוצר שיחה, גם אם שאר הגוף שונה.
to_numberstringחובהמספר ישראלי: נייד 05X, קווי 02/03/04/08/09 או 07X. מקבלים 0501234567, ‏050-123-4567, ‏+972501234567. מספר לא תקין: ⁨400 INVALID_NUMBER⁩.
goalstring 1–500חובהמה השיחה צריכה להשיג, במילים פשוטות.
instructionsstring ≤2000רשותאיך לנהל את השיחה: טון, פרטים, גבולות.
constraintsobjectרשותמגבלות. max_price_ils (מספר): מעליו הסוכנת מתייעצת. fallback (מחרוזת): מה לעשות אם המטרה לא מתאפשרת.
dynamic_variablesobject<string,string>רשותopening_line: המשפט הראשון בשיחה (עד 300 תווים). אם הוא לא אומר שזו עוזרת דיגיטלית, זה מתווסף.
consult_modepolicy | manual | silentרשותמי עונה להתייעצויות. manual (ברירת מחדל): אתם, דרך ה־API,‏ ה־webhook או האתר. policy: תשובה אוטומטית מיד: approve אם כל מחיר שהוזכר נמצא בתוך constraints.max_price_ils, אחרת ask_user. silent: לא מתייעצים בכלל, הסוכנת לא מתחייבת לכלום (ask_user). ב־policy וב־silent ה־webhook לא נקרא, וההתייעצות מופיעה באירועים עם answered_via=policy.
max_duration_sinteger 30–1800רשותמשך שיחה מרבי בשניות. ברירת מחדל 300, מקסימום 1800. מוגבל גם בדקות שנשארו במסלול.
menu_dataobject<string,string>רשותנתונים שהמשתמש אישר במפורש להקשה בתפריט טלפוני, למשל id_number (ספרות, * ו־# בלבד, עד 5). לא מנחשים, ולא נשמרים ביומן.
max_cost_minorinteger 1–100000רשותתקרת עלות באגורות לחשבונות בלי מסלול (יתרה). ברירת מחדל 300. בחשבון עם מסלול השיחה נמדדת בדקות.

תשובה: 201 עם {task, created: true}, או 200 עם {task, created: false} כשהמפתח כבר שימש. מחוץ לשעות השיחה המשימה נכנסת לתור ו־not_before מראה מתי תחויג.

שגיאות: 400 VALIDATION · 400 INVALID_NUMBER · 403 LEGAL_ACCEPTANCE_REQUIRED · 403 CALLS_PAUSED · 403 NO_PLAN · 403 QUOTA_EXHAUSTED · 403 QUOTA_HELD · 403 DO_NOT_CALL · 429 DAILY_CALL_LIMIT · 429 NUMBER_DAILY_LIMIT

רשימת משימות

GET/v1/call-tasks

50 המשימות האחרונות, מהחדשה לישנה: {tasks: [...]}. כל פריט כולל id, goal, to_number, status, outcome, created_at, not_before, attempts, duration_s, cost_minor, currency, billing, summary, status_detail. ‏billing הוא plan או wallet.

משימה אחת

GET/v1/call-tasks/:id

מחזיר {task, pending_consultation}. המשימה כוללת את כל השדות שנשלחו, את status,‏ outcome,‏ revision (לשליחת הנחיות), attempts,‏ summary,‏ call_end (התוכן של אירוע call.ended האחרון) ו־status_detail. תוכן השיחה נמחק אחרי content_expires_at.

200 OK
{
  "task": {
    "id": "task_44be8f8d43da4748",
    "idempotency_key": "order-1234-call",
    "to_number": "972501234567",
    "goal": "לבדוק אם הזמנה 1234 מוכנה לאיסוף",
    "instructions": "",
    "constraints": { "max_price_ils": 50 },
    "dynamic_variables": {},
    "consult_mode": "manual",
    "max_duration_s": 180,
    "max_cost_minor": 300,
    "status": "completed",
    "outcome": "goal_achieved",
    "revision": 2,
    "not_before": "2026-10-22T09:14:03.120Z",
    "expires_at": "2026-10-23T09:14:03.120Z",
    "created_at": "2026-10-22T09:14:03.120Z",
    "updated_at": "2026-10-22T09:16:40.502Z",
    "content_expires_at": "2026-11-21T09:14:03.120Z",
    "attempts": 1,
    "summary": "ההזמנה מוכנה לאיסוף עד 18:00 היום.",
    "call_end": { "reason": "ended", "outcome": "goal_achieved", "duration_s": 74, "cost_minor": 0, "attempt": 1,
                  "currency": "ILS", "included_seconds": 74, "overage_seconds": 0, "summary": "…" },
    "status_detail": null
  },
  "pending_consultation": null
}

pending_consultation הוא null, או {id, question, options, context_summary, deadline_at} כשיש החלטה שממתינה.

שגיאות: 404 TASK_NOT_FOUND

אירועים

GET/v1/call-tasks/:id/events?after=<sequence>&limit=<n>&wait=<seconds>

wait (0–25): המתנה ארוכה. אם אין אירועים חדשים, הבקשה ממתינה עד שמגיע אירוע (תוך פחות משנייה) או עד שהזמן נגמר. ככה עוקבים אחרי שיחה שורה־שורה בלי לשאול כל כמה שניות. התשובה כוללת גם last_user_decision: החלטה שהמשתמש קיבל בעצמו בכרטיס או באתר, שאין לשנות בהנחיה. אירועים מיוחדים: agent.unverified_claim (הסוכנת אמרה תאריך, שעה או מחיר שהצד השני לא אמר: {text, claims}) ו־call.end_held (הסוכנת עומדת לסיים, יש כמה שניות להנחיה אחרונה). בתפריט טלפוני (הפעלה הדרגתית, יכול להיות כבוי): ivr.entered, ivr.prompt, ivr.action (נתונים אישיים מופיעים רק כתווית כמו menu_data:id_number), ivr.hold, ivr.person_detected, ivr.handoff, ivr.back_to_menu, ivr.gave_up (המשימה מסתיימת ב־not_achieved), ivr.unavailable, וגם consultation.cancelled (ההתייעצות נסגרה, אין לענות עליה).

after: מספר הרצף האחרון שכבר קראתם (ברירת מחדל 0). limit: עד 200, ברירת מחדל 50. התשובה: {events, next_cursor, pending_consultation}. כל אירוע: sequence, type, payload, source, occurred_at. כשאין אירועים חדשים, next_cursor שווה ל־after.

200 OK
{
  "events": [
    { "sequence": 1, "type": "task.queued", "payload": { "goal": "…" }, "source": "api", "occurred_at": "…" },
    { "sequence": 2, "type": "call.dispatching", "payload": { "attempt_id": "att_…" }, "source": "scheduler", "occurred_at": "…" },
    { "sequence": 5, "type": "transcript.final", "payload": { "speaker": "agent", "text": "שלום, אני עוזרת דיגיטלית…" }, "source": "voice", "occurred_at": "…" },
    { "sequence": 9, "type": "consultation.requested",
      "payload": { "consultation_id": "con_…", "question": "…", "options": ["approve", "decline", "ask_user"],
                   "context_summary": "…", "deadline_at": "…" }, "source": "voice", "occurred_at": "…" },
    { "sequence": 14, "type": "call.ended",
      "payload": { "reason": "ended", "outcome": "goal_achieved", "duration_s": 74, "cost_minor": 0, "attempt": 1, "summary": "…" },
      "source": "voice", "occurred_at": "…" }
  ],
  "next_cursor": 14,
  "pending_consultation": null
}

תמלול מלא

GET/v1/call-tasks/:id/transcript

כל השיחה בתשובה אחת, לפי הסדר: מי דיבר (agent לסוכנת של OneLi, callee לצד השני) ומה נאמר, בלי תגיות סגנון קול. כולל גם status, outcome ו־summary. עובד גם עם מפתח API. אחרי תקופת השמירה התמלול נמחק ו־content_deleted הוא true.

200 OK
{
  "task_id": "task_9380c85c2043caf3",
  "status": "completed",
  "outcome": "goal_achieved",
  "summary": "נקבע תור ליום שלישי ב־10:30.",
  "content_deleted": false,
  "transcript": [
    { "speaker": "agent",  "text": "שלום, כאן העוזרת הדיגיטלית של דניאל…", "at": "2026-10-23T08:01:12Z" },
    { "speaker": "callee", "text": "כן, במה אפשר לעזור?", "at": "2026-10-23T08:01:16Z" }
  ]
}

שגיאות: 404 TASK_NOT_FOUND

הנחיה לשיחה

POST/v1/call-tasks/:id/instructions

שדהסוגתיאור
instructionstring 1–1000חובהההנחיה לסוכנת.
expected_revisionintegerחובהה־revision הנוכחי של המשימה. אם השתנה: ⁨409 REVISION_CONFLICT⁩.
idempotency_keystring ≤100רשותאותו מפתח שוב מחזיר את התוצאה המקורית.
modecontextual | user_messageרשותברירת מחדל contextual.
urgentbooleanרשותתיקון שצריך להיאמר עכשיו: הסוכנת מפסיקה את מה שהיא אומרת ואומרת אותו מיד. ההנחיה החדשה ביותר תמיד גוברת על הקודמות.

תשובה: {command_id, revision, status: "pending"}. בשיחה פעילה ההנחיה משפיעה מהתור הבא של הסוכנת. במשימה שעדיין בתור היא נשמרת ומצורפת להנחיות של השיחה כשהיא מחייגת (וגם לחיוג חוזר).

שגיאות: 409 REVISION_CONFLICT · 409 CALL_NOT_ACTIVE · 404 TASK_NOT_FOUND

ביטול

POST/v1/call-tasks/:id/cancel

שדהסוגתיאור
reasonstringרשותנשמר ביומן. ברירת מחדל cancelled_by_user, וגם הופך ל־outcome של משימה שבוטלה בתור.

תשובה: {status: "cancelled"} למשימה בתור, או {status: "cancel_requested"} לשיחה פעילה.

שגיאות: 409 CALL_NOT_ACTIVE · 404 TASK_NOT_FOUND

האזנה חיה

POST/v1/call-tasks/:id/listen

מחזיר {url, expires_at}: כתובת WebSocket לשיחה הפעילה, בתוקף 60 שניות. האזנה בלבד, שני הצדדים, לא מוקלט ולא נשמר; הצד השני מקבל הודעה כשמישהו מתחיל להאזין. הזרם: PCM‏ 16-bit מונו 8000 Hz. הרשאה calls:read, עד 10 בדקה לשיחה.

שגיאות: 409 CALL_NOT_ACTIVE · 404 TASK_NOT_FOUND · 429 RATE_LIMITED · 503 LISTEN_NOT_CONFIGURED

מענה להתייעצות

POST/v1/consultations/:id/response

שדהסוגתיאור
decisionapprove | decline | ask_userחובהחייב להיות אחת מ־options של ההתייעצות. ask_user תמיד זמין.
reasonstring ≤500רשותנשמר ביומן השיחה. לא מוקרא לצד השני.
digitsstring [0-9*#] ≤20רשותרק לשאלה של תפריט טלפוני (menu: true), עם approve, ורק נתונים שהמשתמש אישר במפורש. מוקש פעם אחת ולא נשמר.

תשובה: {status: "accepted"}; ‏{status: "expired"} אם המועד עבר; או {status: "conflict", decision} אם תשובה אחרת הגיעה קודם. התשובה הראשונה קובעת.

שגיאות: 400 BAD_DECISION · 404 CONSULTATION_NOT_FOUND

Webhook להחלטות

PUT/v1/decision-webhook

גוף: {url} (עד 500 תווים, https ציבורי בפורט 443). תשובה: {url, secret}. הסוד whsec_… מוצג פעם אחת; הגדרה מחדש יוצרת סוד חדש.

GET/v1/decision-webhook

{webhook: {url, created_at, last_status, last_delivery_at} | null}

DELETE/v1/decision-webhook

{deleted: true} · המדריך המלא

שגיאות: 400 BAD_WEBHOOK_URL

החשבון

GET/v1/me

{user, wallet, plan, rate_per_minute_minor, legal, terms_required}. ‏plan כולל את קוד המסלול, available_seconds ו־period_end, או null. לבדיקת חיבור ומכסה לפני שיוצרים משימה.

GET/v1/wallet

{currency, available, balance, reserved} (באגורות)

קולות

GET/v1/voices

בלי אימות. {voices: [{id, name, gender, style, preview_url}], default_voice_id}. הקול נבחר בפרופיל באתר ולא לכל משימה.

סוגי אירועים

סוגpayloadמשמעות
task.queuedgoal, scheduled_for?, reason?המשימה נוצרה. מחוץ לשעות השיחה: scheduled_for ו־reason: "quiet_hours".
call.dispatchingattempt_idניסיון חיוג מתחיל.
call.ringing-מחייגים.
call.connected-השיחה נענתה. יכול להופיע יותר מפעם אחת.
transcript.finalspeaker (agent | callee), textמשפט סופי בתמלול.
consultation.requestedconsultation_id, question, options, context_summary, deadline_atהסוכנת מבקשת החלטה.
consultation.answeredconsultation_id, decision, reason, answered_viaהתקבלה תשובה. answered_via: agent,‏ webhook,‏ web או card.
consultation.expiredconsultation_idלא הגיעה תשובה בזמן. הסוכנת ממשיכה בלי להתחייב.
instruction.acceptedcommand_id, revision, textהנחיה התקבלה.
call.endedreason, outcome, duration_s, cost_minor, attempt, summary?, currency?, included_seconds?, overage_seconds?ניסיון החיוג הסתיים. duration_s הן השניות המחויבות.
task.retry_scheduledreason, attempt, max_attempts, retry_atקו תפוס או אין מענה: ניסיון נוסף נקבע.
task.cancel_requestedreasonנשלחה בקשת ניתוק לשיחה פעילה.
task.cancelledreasonמשימה בתור בוטלה.
task.failedreasonהמשימה נכשלה לפני חיוג: do_not_call,‏ quota_exhausted או insufficient_balance.
task.expiredreason, not_before, expires_atהמשימה לא חויגה בזמן.
callee.do_not_call-מי שקיבל את השיחה ביקש שלא יתקשרו אליו שוב.
call.reconcilingerrorתוצאת החיוג לא ידועה זמנית. לא מחייגים שוב באופן עיוור.

עשויים להופיע סוגים נוספים (למשל אירועי בקרה פנימיים). התעלמו מסוג שאינכם מכירים.

סטטוסים ותוצאות

statusמשמעות
queuedבתור: ממתין לשעות השיחה, לערוץ פנוי או לניסיון חוזר.
dispatchingמחייגים.
activeהשיחה מחוברת.
reconcilingבודקים מה קרה לחיוג שתוצאתו לא התקבלה.
completedסופי. השיחה התקיימה, או שכל הניסיונות היו תפוס או אין מענה.
failedסופי. למשל מספר שגוי, תא קולי או מכסה שנגמרה.
cancelledסופי. בוטל.
expiredסופי. לא חויג בתוך 24 שעות מ־not_before.
outcomeמשמעות
goal_achievedהמטרה הושגה.
partially_achievedהושג חלק מהמטרה.
not_achievedהמטרה לא הושגה.
declinedענו decline להתייעצות.
needs_user_inputההחלטה חזרה אליכם (ask_user או שלא הגיעה תשובה).
endedהשיחה הסתיימה בלי דיווח תוצאה.
busyהקו תפוס. מנסים שוב עד 3 חיוגים בסך הכול, אחרי 5 ואחרי 15 דקות, בשעות השיחה ובמגבלות היומיות.
no_answerאין מענה. אותה מדיניות ניסיונות חוזרים.
voicemailהגיע לתא קולי. לא מחויב.
invalid_numberהמספר לא קיים או שהרשת דחתה אותו. לא מנסים שוב.
do_not_callהמספר ברשימת ״לא להתקשר״.
quota_exhaustedנגמרו הדקות במסלול.
expiredלא חויג בזמן.

status_detail מסביר במשפט אחד מה קרה אחרי חיוג שלא נענה: {code, he, en, retry_at?}. למשל busy_will_retry עם שעת הניסיון הבא, no_answer_final אחרי הניסיון האחרון, או invalid_number. בשאר המקרים הוא null.