מדריך עזר ל־API
כל נקודות הקצה, השדות, האירועים והסטטוסים.
כללי
כתובת הבסיס https://api.oneli.io. כל נקודת קצה כאן דורשת Authorization: Bearer oli_… (מפתח API או טוקן של סוכן מחובר), חוץ מ־GET /v1/voices. גופי בקשה ב־JSON. שגיאות לפי מבנה השגיאות. לא מוצגים כאן נקודות קצה שדורשות התחברות של אדם (חיוב, פרופיל, מפתחות).
יצירת משימת שיחה
POST/v1/call-tasks
| שדה | סוג | תיאור | |
|---|---|---|---|
idempotency_key | string ≤100 | חובה | מפתח ייחודי לבקשה. אותו מפתח שוב מחזיר את המשימה הקיימת (200, created: false) ולא יוצר שיחה, גם אם שאר הגוף שונה. |
to_number | string | חובה | מספר ישראלי: נייד 05X, קווי 02/03/04/08/09 או 07X. מקבלים 0501234567, 050-123-4567, +972501234567. מספר לא תקין: 400 INVALID_NUMBER. |
goal | string 1–500 | חובה | מה השיחה צריכה להשיג, במילים פשוטות. |
instructions | string ≤2000 | רשות | איך לנהל את השיחה: טון, פרטים, גבולות. |
constraints | object | רשות | מגבלות. max_price_ils (מספר): מעליו הסוכנת מתייעצת. fallback (מחרוזת): מה לעשות אם המטרה לא מתאפשרת. |
dynamic_variables | object<string,string> | רשות | opening_line: המשפט הראשון בשיחה (עד 300 תווים). אם הוא לא אומר שזו עוזרת דיגיטלית, זה מתווסף. |
consult_mode | policy | manual | silent | רשות | מי עונה להתייעצויות. manual (ברירת מחדל): אתם, דרך ה־API, ה־webhook או האתר. policy: תשובה אוטומטית מיד: approve אם כל מחיר שהוזכר נמצא בתוך constraints.max_price_ils, אחרת ask_user. silent: לא מתייעצים בכלל, הסוכנת לא מתחייבת לכלום (ask_user). ב־policy וב־silent ה־webhook לא נקרא, וההתייעצות מופיעה באירועים עם answered_via=policy. |
max_duration_s | integer 30–1800 | רשות | משך שיחה מרבי בשניות. ברירת מחדל 300, מקסימום 1800. מוגבל גם בדקות שנשארו במסלול. |
menu_data | object<string,string> | רשות | נתונים שהמשתמש אישר במפורש להקשה בתפריט טלפוני, למשל id_number (ספרות, * ו־# בלבד, עד 5). לא מנחשים, ולא נשמרים ביומן. |
max_cost_minor | integer 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.
{
"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.
{
"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.
{
"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
| שדה | סוג | תיאור | |
|---|---|---|---|
instruction | string 1–1000 | חובה | ההנחיה לסוכנת. |
expected_revision | integer | חובה | ה־revision הנוכחי של המשימה. אם השתנה: 409 REVISION_CONFLICT. |
idempotency_key | string ≤100 | רשות | אותו מפתח שוב מחזיר את התוצאה המקורית. |
mode | contextual | user_message | רשות | ברירת מחדל contextual. |
urgent | boolean | רשות | תיקון שצריך להיאמר עכשיו: הסוכנת מפסיקה את מה שהיא אומרת ואומרת אותו מיד. ההנחיה החדשה ביותר תמיד גוברת על הקודמות. |
תשובה: {command_id, revision, status: "pending"}. בשיחה פעילה ההנחיה משפיעה מהתור הבא של הסוכנת. במשימה שעדיין בתור היא נשמרת ומצורפת להנחיות של השיחה כשהיא מחייגת (וגם לחיוג חוזר).
שגיאות: 409 REVISION_CONFLICT · 409 CALL_NOT_ACTIVE · 404 TASK_NOT_FOUND
ביטול
POST/v1/call-tasks/:id/cancel
| שדה | סוג | תיאור | |
|---|---|---|---|
reason | string | רשות | נשמר ביומן. ברירת מחדל 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
| שדה | סוג | תיאור | |
|---|---|---|---|
decision | approve | decline | ask_user | חובה | חייב להיות אחת מ־options של ההתייעצות. ask_user תמיד זמין. |
reason | string ≤500 | רשות | נשמר ביומן השיחה. לא מוקרא לצד השני. |
digits | string [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.queued | goal, scheduled_for?, reason? | המשימה נוצרה. מחוץ לשעות השיחה: scheduled_for ו־reason: "quiet_hours". |
call.dispatching | attempt_id | ניסיון חיוג מתחיל. |
call.ringing | - | מחייגים. |
call.connected | - | השיחה נענתה. יכול להופיע יותר מפעם אחת. |
transcript.final | speaker (agent | callee), text | משפט סופי בתמלול. |
consultation.requested | consultation_id, question, options, context_summary, deadline_at | הסוכנת מבקשת החלטה. |
consultation.answered | consultation_id, decision, reason, answered_via | התקבלה תשובה. answered_via: agent, webhook, web או card. |
consultation.expired | consultation_id | לא הגיעה תשובה בזמן. הסוכנת ממשיכה בלי להתחייב. |
instruction.accepted | command_id, revision, text | הנחיה התקבלה. |
call.ended | reason, outcome, duration_s, cost_minor, attempt, summary?, currency?, included_seconds?, overage_seconds? | ניסיון החיוג הסתיים. duration_s הן השניות המחויבות. |
task.retry_scheduled | reason, attempt, max_attempts, retry_at | קו תפוס או אין מענה: ניסיון נוסף נקבע. |
task.cancel_requested | reason | נשלחה בקשת ניתוק לשיחה פעילה. |
task.cancelled | reason | משימה בתור בוטלה. |
task.failed | reason | המשימה נכשלה לפני חיוג: do_not_call, quota_exhausted או insufficient_balance. |
task.expired | reason, not_before, expires_at | המשימה לא חויגה בזמן. |
callee.do_not_call | - | מי שקיבל את השיחה ביקש שלא יתקשרו אליו שוב. |
call.reconciling | error | תוצאת החיוג לא ידועה זמנית. לא מחייגים שוב באופן עיוור. |
עשויים להופיע סוגים נוספים (למשל אירועי בקרה פנימיים). התעלמו מסוג שאינכם מכירים.
סטטוסים ותוצאות
| 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.