DM Champ Docs

API עבור סוכנויות

כסוכנות, באפשרותך להשתמש באותו REST API שבו משתמשים הלקוחות שלך, אך להפנות בקשות בודדות לאחד מחשבונות המשנה המנוהלים על ידך במקום לחשבון שלך. זה מאפשר לך לבנות כלים שמבצעים אונבורדינג (onboarding) ללקוח מקצה לקצה — יצירת הקמפיינים שלו, אימון ה-AI שלו על בסיס ידע, ייבוא אנשי הקשר שלו, חיבור ערוצי ההודעות שלו ורכישת מספרי טלפון — הכל מבלי להיכנס ידנית לכל חשבון משנה.

דף זה מכסה רק את ההתנהגות הספציפית לסוכנויות: כיצד לפעול בשם חשבון משנה באמצעות הפרמטר sub_account_id. עבור היסודות (יצירת מפתח, אימות, כתובת URL בסיסית, פורמט שגיאות, מגבלות קצב), התחל עם המדריך גישה ל-API. כל מה שכתוב שם תקף גם כאן — אתה מבצע אימות עם מפתח ה-API של חשבון הסוכנות שלך.

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


כיצד עובדת הפעולה “בשם”

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

  • השמטת sub_account_id → הבקשה פועלת על חשבון הסוכנות שלך.
  • הכללת sub_account_id → הבקשה פועלת על חשבון המשנה ההוא, אך רק לאחר שהפלטפורמה מאשרת שחשבון המשנה אכן שייך לך.

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

היכן למקם אותו

  • נקודות קצה מסוג GET / DELETE ← העבר אותו כפרמטר שאילתה: ?sub_account_id=THE_SUB_ACCOUNT_ID (לצד ה-apiKey שלך, אם אתה מבצע אימות באמצעות שאילתה).
  • נקודות קצה מסוג POST / PUT / PATCH ← כלול אותו בגוף הבקשה בפורמט JSON כ-"sub_account_id": "THE_SUB_ACCOUNT_ID".
  • עוזרי AI ← אין צורך להגדיר דבר. ה-שרת MCP נושא את אותה הגדרה בכלי הקריאה שלו, כך שחיבור אחד עם מפתח הסוכנות שלך יכול לדווח על כל לקוח: פשוט ציין את שם הלקוח בבקשה שלך (“כמה אנשי קשר יש ל-Bella’s Bistro?”). פעולות כתיבה זמינות גם הן: כל נקודת קצה שמקבלת sub_account_id נחשפת ככלי, כך שתוכל ליצור, לשנות ולשלוח בשם הלקוח מאותו חיבור.

מציאת מזהה של חשבון משנה

ה-sub_account_id הוא המזהה הייחודי של חשבון הלקוח. ניתן לקבל את רשימת חשבונות המשנה שלכם ואת המזהים שלהם מנקודות הקצה של ה-API מסוג SubAccounts (ראו את המדריך חשבונות משנה) או מדף חשבונות משנה בסרגל הצד.


הבעלות מאומתת תמיד

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

אם המזהה אינו מוכר, אינו חשבון משנה, או שייך לסוכנות אחרת, הבקשה תיכשל עם תגובת 404:

{
  "success": false,
  "error_code": 404,
  "error": "Sub-account not found."
}

למה 404 ולא 403? תגובת “אסור” (forbidden) תגלה לגורם חיצוני שהמזהה קיים אך אינו שייך לו. החזרת אותו 404 עבור “לא קיים” ו-“לא שייך לך” מבטיחה שלא ניתן להשתמש בנקודת הקצה כדי לגלות אילו מזהי חשבונות שייכים לסוכנויות אחרות. התייחס ל-404 כאן כאל “זה אינו חשבון משנה שאתה מנהל”.


היכן sub_account_id נתמך

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

  • הגדרת AI — קמפיינים, סוכנים, שאלות נפוצות (FAQs), מקורות בסיס ידע (סריקת אתרים והעלאת מסמכים), קבוצות בסיס ידע, שידורים, פונקציות מותאמות אישית, שרתי MCP
  • אנשי קשר ו-CRM — אנשי קשר (כולל ייבוא), רשימות, תגיות, משימות, עסקאות, פגישות, אירועים
  • ערוצים ומספרים — חיבור WhatsApp / WhatsApp Web / Telegram / Instagram & Messenger / LINE, חיפוש / רכישה / ניהול מספרי טלפון, תבניות WhatsApp, ניתוב ערוצים
  • הודעות ותוכן — שליחת הודעות, סשנים של צ’אט, ייצוא צ’אטים, סיכומים יומיים
  • הגדרות ואינטגרציות — Webhooks, הגדרות ווידג’ט צ’אט, הגדרות White-label, הגדרות BYOK SMS והגדרות חשבון אחרות, ניתוח נתונים (Analytics)

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

היכן זה לא חל

מספר נקודות קצה הן ברמת הסוכנות או מופנות לעצמן ומתעלמות מ-sub_account_id:

  • ניהול תתי-החשבונות עצמם — נקודות הקצה של SubAccounts (יצירה / רשימה / עדכון של תת-חשבון) ונקודת הקצה של מגבלת ההוצאות BYOK כבר מציינות את שם תת-החשבון בנתיב ה-URL שלהן. נקודות הקצה של תמחור ומדיניות ונקודות הקצה של ניטור צ’אט פועלות לפי אותו דפוס.
  • העתקת סוכן בין חשבונותPOST /v1/subaccounts/agents/copy מציין את שני החשבונות עצמם, כאשר הוא לוקח את חשבון היעד כ-targetUserId. ראו את הדוגמה המעשית להלן. (ה-POST /v1/subaccounts/campaigns/copy הישן יותר פועל באותה דרך אך הוא אינו מומלץ לשימוש יחד עם שאר ה-Campaigns API.)
  • התאמת קרדיטים, ושני סיכומי הנתונים ברמת הסוכנותPOST /v1/subaccounts/credits מזהה את תת-החשבון באמצעות email במקום זאת; GET /v1/subaccounts/credit-usage ו-GET /v1/subaccounts/campaign-status מדווחים על כל תת-חשבון בבת אחת, כך שאין חשבון יחיד למקד אליו.
  • החשבון של הסוכנות שלכם — ניהול מפתחות API, דיווח על שימוש בסוכנות, ניהול צוות ודרגות התמחור שלכם פועלים תמיד על חשבון הסוכנות שלכם.
  • Webhooks של הודעות נכנסות — נקודות קצה שמערכות חיצוניות שולחות אליהן הודעות (post) קשורות לחשבון שהגדיר אותן באמצעות פרטי הגישה שלו, כך שאין מה להפנות מחדש.

הרשימה המעודכנת תמיד, הניתנת לקריאה על ידי מכונה, של הפרמטרים שכל נקודת קצה מקבלת נמצאת בהפניית ה-API בלוח הבקרה שלכם (הגדרות ← אינטגרציות ← מפתח API) ובמפרט ה-OpenAPI בכתובת GET /v1/docs/openapi.yaml. אנו מפיצים שינויי API לעיתים קרובות — התייחסו אליהם כמקור האמת.

דף הגדרות מפתח API עם מפתח מוסתר ובקרת יצירה מחדש

הגדרות → אינטגרציות → מפתח API — המפתח של הסוכנות שלכם נמצא כאן, לצד הקישור למדריך ה-API המלא.


דוגמה מעשית: חיבור Instagram ו-Messenger עבור חשבון משנה

חיבור Instagram ו-Messenger הוא תהליך מבוסס דפדפן. אתה מתחיל אותו באמצעות ה-API, מעביר את כתובת ה-URL להסכמה שחזרה ללקוח (או פותח אותה עבורו), ממתין שהוא יאשר בדפדפן שלו, ואז בוחר איזה דף לחבר — כל זאת תוך מיקוד בחשבון המשנה שלו באמצעות sub_account_id.

שלב 1 — התחלת החיבור

קרא לנקודת הקצה של החיבור עם ה-sub_account_id של הלקוח בגוף הבקשה. לא נשלחים כאן אישורים; הפלטפורמה מחזירה כתובת URL להסכמה שהלקוח חייב לפתוח בדפדפן, בתוספת אסימון מתאם (correlation token) חד-פעמי.

cURL

curl -X POST "https://api.dmchamp.com/v1/channels/meta/connect?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "sub_account_id": "abc123def456"
  }'

JavaScript

const res = await fetch("https://api.dmchamp.com/v1/channels/meta/connect", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    sub_account_id: "abc123def456",
  }),
});

const data = await res.json();
// data.oauth_url -> open this in the client's browser

Python

import requests

res = requests.post(
    "https://api.dmchamp.com/v1/channels/meta/connect",
    headers={
        "X-API-Key": "YOUR_API_KEY",
        "Content-Type": "application/json",
    },
    json={
        "sub_account_id": "abc123def456",
    },
)

data = res.json()
# data["oauth_url"] -> open this in the client's browser

תגובה:

{
  "success": true,
  "oauth_url": "https://www.facebook.com/v21.0/dialog/oauth?client_id=...&state=...",
  "state_token": "8sFq2yV0kQ7m4n1pZr3tWb6cXe9hJl2aD5gK7uN0oI",
  "expires_at": "2026-06-10T12:30:00.000Z"
}

שלח את הלקוח ל-oauth_url בדפדפן כדי לאשר. ה-state_token מתאם בין ניסיון זה והוא סוד לטווח קצר — אל תתעד אותו בלוגים. הניסיון יפוג ב-expires_at; אם פג תוקפו, התחל מחדש.

שלב 2 — ביצוע סקר (Polling) עד לטעינת הדפים

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

cURL

curl "https://api.dmchamp.com/v1/channels/meta/status?apiKey=YOUR_API_KEY&sub_account_id=abc123def456"

JavaScript

const res = await fetch(
  "https://api.dmchamp.com/v1/channels/meta/status?sub_account_id=abc123def456",
  { headers: { "X-API-Key": "YOUR_API_KEY" } }
);

const data = await res.json();
// Wait until data.status === "pages_loaded", then read data.pages

Python

import requests

res = requests.get(
    "https://api.dmchamp.com/v1/channels/meta/status",
    headers={"X-API-Key": "YOUR_API_KEY"},
    params={"sub_account_id": "abc123def456"},
)

data = res.json()
# Wait until data["status"] == "pages_loaded", then read data["pages"]

תגובה:

{
  "success": true,
  "status": "pages_loaded",
  "pages": [
    {
      "id": "1098765432101234",
      "name": "Acme Studio",
      "category": "Hair Salon",
      "instagram_business_account": {
        "id": "17841400000000000",
        "username": "acme.studio"
      }
    }
  ],
  "selected_page": null
}

השדה status עובר דרך pendingtoken_receivedpages_loadedconnected. המתן ל-pages_loaded לפני בחירת דף. שני מצבי שגיאה סופיים יכולים להופיע גם במקום התקדמות: failed ו-expired (הלקוח סירב להסכמה, או שחלף חלון הזמן של כ-30 דקות של אסימון המצב) — שדה reason כלול כאשר אחד מהם מתרחש. הפסק את התשאול והתחל מחדש בשלב 1 אם אתה רואה אחד מהם; אל תמתין ל-pending לנצח. אסימוני גישה לדף לעולם אינם מוחזרים.

שלב 3 — בחירת הדף לחיבור

בחרו אחד ממזהי הדפים משלב 2 ובחרו אותו. בחירת דף מחברת גם את אינסטגרם וגם את מסנג’ר עבור אותו דף. כללו את sub_account_id בגוף הבקשה שוב.

cURL

curl -X POST "https://api.dmchamp.com/v1/channels/meta/select-page?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "page_id": "1098765432101234",
    "sub_account_id": "abc123def456"
  }'

JavaScript

const res = await fetch("https://api.dmchamp.com/v1/channels/meta/select-page", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    page_id: "1098765432101234",
    sub_account_id: "abc123def456",
  }),
});

const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.dmchamp.com/v1/channels/meta/select-page",
    headers={
        "X-API-Key": "YOUR_API_KEY",
        "Content-Type": "application/json",
    },
    json={
        "page_id": "1098765432101234",
        "sub_account_id": "abc123def456",
    },
)

data = res.json()

תגובה:

{
  "success": true,
  "page_id": "1098765432101234",
  "instagram_business_account_id": "17841400000000000"
}

זה הכל — אינסטגרם ומסנג’ר מחוברים כעת לחשבון המשנה של הלקוח. סיפקתם רק את page_id; אישור הגישה הבסיסי נפתר בשרת ולעולם אינו עובר דרך האינטגרציה שלכם.


דוגמה עובדת: רכישת מספר עבור חשבון משנה

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

חיפוש (cURL):

curl "https://api.dmchamp.com/v1/phone-numbers/available?apiKey=YOUR_API_KEY&country_code=US&sub_account_id=abc123def456"

רכישה (JavaScript):

const res = await fetch("https://api.dmchamp.com/v1/phone-numbers", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    phone_number: "+14155551234",
    country_code: "US",
    display_name: "Support line",
    sub_account_id: "abc123def456",
  }),
});

const data = await res.json();

רכישה (Python):

import requests

res = requests.post(
    "https://api.dmchamp.com/v1/phone-numbers",
    headers={
        "X-API-Key": "YOUR_API_KEY",
        "Content-Type": "application/json",
    },
    json={
        "phone_number": "+14155551234",
        "country_code": "US",
        "display_name": "Support line",
        "sub_account_id": "abc123def456",
    },
)

data = res.json()

תגובה:

{
  "success": true,
  "phone_number": "+14155551234",
  "channel": "whatsapp",
  "whatsapp_status": "PURCHASED",
  "outgoing_status": "PURCHASED",
  "status": "PURCHASED",
  "purchase_credits": 11.5,
  "monthly_credits": 11.5
}

המספר מוקצה במצב PURCHASED ורישום שולח ה-WhatsApp נמשך ברקע. בצע תשאול ל-GET /v1/phone-numbers/{phoneNumber}/status?sub_account_id=abc123def456 עד שהסטטוס יגיע ל-ONLINE לפני השליחה.


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

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

שלב 1 — העתקת הסוכן פנימה

POST /v1/subaccounts/agents/copy

curl -X POST "https://api.dmchamp.com/v1/subaccounts/agents/copy?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "agentId": "YOUR_TEMPLATE_AGENT_ID",
    "targetUserId": "abc123def456",
    "newName": "Inbound Instagram Leads",
    "copyFaqs": true
  }'

התגובה נושאת את ה-id של הסוכן החדש ב-data.agent_id. השאלות הנפוצות, מאגר הידע וספריית המדיה עוברים יחד איתו; תבניות ה-WhatsApp, הפוסטים החברתיים המחוברים ואנשי הקשר של חשבון המקור אינם עוברים במכוון. רשימת שדות מלאה נמצאת ב-AI Agents API.

שימו לב שנקודת קצה זו מקבלת targetUserId במקום sub_account_id — היא מציינת את שני החשבונות בעצמה. שתי הקריאות להלן משתמשות בפרמטר ה-sub_account_id הרגיל.

שלב 2 — הפעלה

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

curl -X PATCH "https://api.dmchamp.com/v1/agents/NEW_AGENT_ID/active?apiKey=YOUR_API_KEY&sub_account_id=abc123def456" \
  -H "Content-Type: application/json" \
  -d '{ "active": true }'

curl -X PUT "https://api.dmchamp.com/v1/agents/NEW_AGENT_ID?apiKey=YOUR_API_KEY&sub_account_id=abc123def456" \
  -H "Content-Type: application/json" \
  -d '{ "anthropic_model": "max" }'

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

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

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

curl -X PUT "https://api.dmchamp.com/v1/entry-points/channel-defaults?apiKey=YOUR_API_KEY&sub_account_id=abc123def456" \
  -H "Content-Type: application/json" \
  -d '{ "channel": "instagram", "agent_id": "NEW_AGENT_ID" }'

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

הגדירו את אזור הזמן של הלקוח בעת יצירת תת-החשבון. העבירו את time_zone_id ב-POST /v1/subaccounts. שעות הפעילות של הקמפיין מוערכות לפי אזור הזמן של תת-החשבון עצמו, כך שלקוח שנוצר ללא אזור זמן יקרא את לוח הזמנים שלו לפי UTC — מה שמשנה בשקט את הזמנים שבהם מותר לעוזר להשיב.


דלג על אשף ההגדרה עבור לקוח שאתה מגדיר בעצמך

POST /v1/subaccounts

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

curl -X POST "https://api.dmchamp.com/v1/subaccounts" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "client@example.com",
    "first_name": "Alex",
    "last_name": "Client",
    "business_name": "Client Co",
    "guided_onboarding": false,
    "usage_limits": { "monthly_credits": 500 }
  }'

השמיטו את השדה (או שלחו true) והאשף יתנהג בדיוק כפי שהתנהג תמיד, כך שאינטגרציות קיימות אינן זקוקות לשינוי. כדי להחזיר ללקוח את האשף מאוחר יותר, הציגו מחדש את הפריט guided_onboarding עם PUT /v1/subaccounts/{subAccountUid}/menu-visibility (להלן) — נראות התפריט קובעת אם האשף נגיש, guided_onboarding שולט רק בהפניה מחדש של הכניסה הראשונה.


השבתת משימות, סיכומים יומיים או ספריית המדיה עבור לקוח

POST /v1/subaccounts

שלושת אלו מופעלים עבור כל לקוח חדש אלא אם ציינת אחרת, והם מתנהגים אחרת מכל תכונה אחרת במדריך זה: הם מבוססים על ביטול הסכמה (opt-out), ולא על הצטרפות (opt-in). השמטתם מ-features אינה מספיקה כשלעצמה, מכיוון שרשימת ה-features של אינטגרציה ישנה פשוט לא הזכירה אותם מעולם — אין לנו דרך להבדיל בין “הסוכנות כיבתה את זה” לבין “הרשימה הזו נכתבה לפני שהאפשרות הייתה קיימת”.

לכן, יש לציין זאת במפורש באמצעות feature_settings:

curl -X POST "https://api.dmchamp.com/v1/subaccounts" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "client@example.com",
    "first_name": "Alex",
    "last_name": "Client",
    "business_name": "Client Co",
    "feature_settings": {
      "tasks": false,
      "daily_summaries": false,
      "ai_media_library": true
    }
  }'

כל מפתח הוא אופציונלי; כל מה שתשמיט יישאר מופעל. עם tasks: false ה-AI מפסיק ליצור משימות עבור אותו לקוח ולא נשלחים אימיילים מסוג “נוצרה משימה חדשה”; עם daily_summaries: false הסיכום הלילי לעולם לא נוצר ולא נשלח בדוא"ל.

feature_settings הוא הדבר היחיד שמכבה את שלושת אלו בעת היצירה. השמטתם מ-features לא עושה דבר כשלעצמה, ללא קשר לאופן שבו שאר הרשימה שלך נראית — זה מכוון, כדי שאינטגרציה ישנה לא תאבד את שלושתם בשקט.

כדי לשנות זאת לאחר מכן, שלח את רשימת ה-features המלאה ל-PUT /v1/subaccounts/{subAccountUid}/features — שם, נוכחות ברשימה מפעילה תכונה והיעדרות מכבה אותה.


כניסה אוטומטית של לקוחות לחשבון המשנה שלהם (SSO)

POST /v1/subaccounts/{subAccountUid}/sso-link

קריאה אחת עם מפתח ה-API של הסוכנות שלך מחזירה כתובת URL מוכנה לפתיחה, שמחברת את הלקוח ישירות לחשבון המשנה שלו — ללא מסך התחברות, ללא שלב סיסמה, וללא צורך לבנות דבר מעבר לכך. ניתן לפתוח אותה בלשונית חדשה, כהפניה (redirect), או בתוך iframe במוצר שלך.

שדה נדרש תיאור
redirect לא דף בתוך האפליקציה שאליו תרצה שהלקוח יגיע, לדוגמה "/chats" או "/agents". מוחזר כ-deep_link_url בתגובה.
app_base_url לא מארח לוח הבקרה עבור הקישור. ברירת המחדל היא דומיין ה-white-label של האפליקציה שלך (או דומיין הפלטפורמה אם אין לך כזה). חייב להיות https.

cURL

curl -X POST "https://api.dmchamp.com/v1/subaccounts/SUB_ACCOUNT_UID/sso-link" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "redirect": "/chats" }'

תגובה

{
  "success": true,
  "url": "https://app.yourdomain.com/auth?redirect=%2Fchats#token=eyJhbGciOi…",
  "deep_link_url": "https://app.yourdomain.com/chats",
  "expires_at": "2026-07-22T15:04:05.000Z",
  "sub_account_uid": "SUB_ACCOUNT_UID"
}

איך להשתמש בזה נכון:

  • דילוג אחד. פתיחת url מחברת את הלקוח ומעבירה אותו ישירות לדף ה-redirect בלוח הבקרה — ללא מסך התחברות וללא דף ביניים. deep_link_url מציין את אותו יעד עבור אינטגרטורים המעדיפים לנווט למסגרת באופן מפורש לאחר ההתחברות; ברגע שהסשן קיים, כל נתיב בלוח הבקרה יעבוד בהקשר של דפדפן זה.
  • הנפקה לפי דרישה, פתיחה מיידית. הקישור מכיל פרטי התחברות ותוקפו פג לאחר כשעה. בקש אותו בצד השרת ברגע שהלקוח לוחץ, ולעולם אל תשמור או תשלח אותו בדוא"ל.
  • אסימון ההתחברות עובר בתוך ה-fragment של ה-URL (#…), שדפדפנים לעולם אינם שולחים לשרתים, והוא מוסר משורת הכתובת ברגע שהוא מנוצל.
  • חשבונות המשנה שלך בלבד. נקודת הקצה מסרבת לכל חשבון שאינו בבעלות הסוכנות שלך.
  • קישור שפג תוקפו מציג שגיאה ברורה עם נתיב לניסיון חוזר — הנפק קישור חדש.

הסתרת פריטי ניווט בחשבון משנה

PUT /v1/subaccounts/{subAccountUid}/menu-visibility

שולט באילו פריטי סרגל צד והגדרות חשבון משנה רואה — שימושי כאשר אתה מטמיע את לוח הבקרה ורוצה רק את הממשקים שהמוצר שלך עדיין לא מכסה. כל מה שלא מופיע ברשימה נשאר גלוי; שלח null כערך ה-menuVisibility המלא כדי לאפס הכל למצב גלוי. הסתרת פריט מסתירה את כניסת התפריט — שלב זאת עם התכונות שאתה מעניק לחשבון המשנה לצורך חסימה קשיחה.

cURL

curl -X PUT "https://api.dmchamp.com/v1/subaccounts/SUB_ACCOUNT_UID/menu-visibility" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "menuVisibility": {
      "side_nav": { "Dashboard": false, "Campaigns": false, "Automations": false },
      "settings_nav": { "team": false }
    }
  }'

תגובה

{
  "success": true,
  "data": {
    "subAccountUid": "SUB_ACCOUNT_UID",
    "menuVisibility": {
      "side_nav": { "Dashboard": false, "Campaigns": false, "Automations": false },
      "settings_nav": { "team": false }
    }
  }
}

side_nav מקבל 13 מפתחות אלו, התואמים לשמות הפריטים בסרגל הצד: Dashboard, DailySummaries, Chats, Contacts, Deals, Tasks, Automations, Campaigns, Appointments, Settings, Help, CreditsCounter (יתרת האשראי המוצגת בסרגל הצד) ו-guided_onboarding (אשף ההגדרה). שלושה מפתחות נוספים — AiInsights, Sub Accounts ו-Agency Reselling — מתקבלים אך אינם מבצעים דבר: הם היו רלוונטיים רק ללוח הבקרה הקלאסי שיצא משימוש, לכן הגדרתם אינה משפיעה על חשבונות המשנה שלך. מפתחות חסרים משמעותם פריטים גלויים; כאשר אתה נכנס לחשבון המשנה בעצמך, פריטים מוסתרים מוצגים באופן זמני כדי שתוכל תמיד לשנות את ההגדרות בחזרה.

הסתרת דף מהתפריט לעולם אינה מעניקה גישה אליו. Automations דורש שתכונת ה-automations תהיה מורשית בחשבון המשנה — הגדר את המפתח ל-true בלעדיה והדף עדיין לא יופיע. Tasks ו-DailySummaries עובדים בצורה הפוכה: הם מופעלים עבור כל לקוח אלא אם תכבה אותם (ראה השבתת משימות, סיכומים יומיים או ספריית המדיה עבור לקוח).


בחר אילו סוגי ערוצים לקוח יכול לחבר

PUT /v1/subaccounts/{subAccountUid}/features

מתגי סוגי ערוצים (Channel Types) שאתה רואה ברמת תוכנית הם מזהי תכונות רגילים, לכן ניתן להגדיר אותם לכל לקוח דרך ה-API במקום דרך לוח הבקרה. זהו אחד מנקודות הקצה (endpoints) שמציינות את חשבון המשנה בתוך ה-URL שלו, לכן הוא לא דורש sub_account_id.

מזהה תכונה ערוץ
channel_chat_widget ווידג’ט צ’אט לאתר
channel_whatsapp_api WhatsApp Business API
channel_whatsapp_web WhatsApp Web (מספר מקושר ב-QR)
channel_instagram Instagram
channel_messenger Facebook Messenger
channel_telegram Telegram
channel_line LINE
channel_viber Viber
channel_email תיבת דואר אלקטרוני
channel_sms SMS
channel_imessage iMessage
curl -X PUT "https://api.dmchamp.com/v1/subaccounts/SUB_ACCOUNT_UID/features" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "features": [
      "channels_3",
      "channel_chat_widget",
      "channel_whatsapp_web",
      "channel_instagram",
      "image_understanding",
      "contact_tagging",
      "incoming_campaigns",
      "webhooks"
    ]
  }'

שלושה דברים שחשוב להקפיד עליהם:

  • הקריאה מחליפה את כל רשימת התכונות. שלח את כל התכונות שהלקוח צריך לשמור, לא רק את אלו שאתה משנה. אותם מזהים עובדים כ-features ב-POST /v1/subaccounts בעת יצירת החשבון.
  • סוגי ערוצים ומספר ערוצים הם חסמים נפרדים, ושניהם חלים. channels_1 / channels_3 / channels_unlimited שולטים ב-כמה חיבורים; מזהי ה-channel_* שולטים ב-אילו סוגים. הדוגמה לעיל אומרת “עד 3 חיבורים, ורק ווידג’ט צ’אט, WhatsApp Web או Instagram”.
  • שליחת מזהי channel_* ריקים משמעותה ללא הגבלת ערוצים. זוהי ההתנהגות המקורית, וזו הסיבה שלקוחות קיימים לא הושפעו כאשר תכונה זו הושקה. שלח מזהה אחד או יותר וכל השאר יוצגו כנעולים בדף הערוצים של הלקוח עם הערת שדרוג במקום כפתור “חיבור”. ערוצים שהלקוח כבר חיבר ימשיכו לעבוד.

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


הגדרת מגבלה מדויקת של חברי צוות עבור לקוח

PUT /v1/subaccounts/{subAccountUid}/limits

התכונות של team_seats_* מציעות רק שלבי סולם מוגדרים מראש (3 / 5 / 10 / ללא הגבלה). כדי להעניק ללקוח מספר מדויק של מושבי צוות — 2, 7, 15, או כל מספר אחר — הגדר במקום זאת את usage_limits.team_seats_limit. הגדרה זו גוברת על הערכים המוגדרים מראש, והפלטפורמה אוכפת אותה בכל הזמנה, הוספה ישירה ואישור הזמנה: ברגע שהמגבלה מגיעה למיצוי, הזמנות נוספות נדחות בצד השרת.

  • מספר שלם חיובי הוא המכסה המדויקת.
  • 0 פירושו שחברי צוות אינם כלולים — הלקוח אינו יכול להזמין איש.
  • -1 פירושו ללא הגבלה.
  • null מנקה את המגבלה המותאמת אישית וחוזר להסתמך על כל ערך מוגדר מראש של team_seats_* שקיים ברשימת התכונות.

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

curl -X PUT "https://api.dmchamp.com/v1/subaccounts/SUB_ACCOUNT_UID/limits" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "usageLimits": { "team_seats_limit": 7 }
  }'

ניתן להגדיר זאת גם בעת היצירה: POST /v1/subaccounts מקבל usage_limits.team_seats_limit עם אותה סמנטיקה. כדי לקרוא את הערך הנוכחי, משוך את חשבון המשנה עם GET /v1/subaccounts?email=... והסתכל על usage_limits.team_seats_limit (בהיעדר ערך/null = הגדרות ברירת המחדל קובעות). אותו נקודת קצה מעדכנת גם את credits, monthly_credits, roll_over_to_next_month, rollover_cap_months, rollover_expiry_days ו-byok_monthly_limit_usd — שלח רק את המפתחות שברצונך לשנות.

כיצד זה משפיע על מגבלות המושבים בתוכניות SaaS. תוכניות ה-SaaS שלך יכולות לכלול הקצאת מושבים משלהן (המוגדרת בעורך התוכניות — ראה מושבי צוות בתוכנית), אשר מוחלת באופן אוטומטי כאשר לקוח נרשם. מגבלה שאתה מגדיר דרך נקודת קצה זו נחשבת להקצאה ידנית: רכישת תוכנית מחליפה אותה בהקצאת המושבים של התוכנית עצמה (רכישה זו היא בחירה מפורשת בתוכנית), אך חידושים חודשיים אוטומטיים לעולם אינם דורסים מגבלה ידנית — כך שחריגה חד-פעמית שאתה מעניק ללקוח נשמרת לאורך מחזור החיוב שלו. ניקוי המגבלה הידנית באמצעות null מחזיר את השליטה בשדה לתוכנית בחידוש הבא שלה.

הגבל את מה שלקוח מעביר בין חידושים. שני מפתחות usage_limits נוספים נמצאים לצד roll_over_to_next_month. שניהם מתקבלים על ידי POST /v1/subaccounts גם בעת היצירה, ו-null מנקה את שניהם.

מפתח מה הוא עושה
rollover_cap_months חודשי הקצבה שהלקוח רשאי לשמור. מספר מ-0 עד 120, שברים מותרים (0.5 = חצי חודש). בכל חידוש, היתרה שלא נוצלה מצומצמת לכל היותר למספר זה כפול ההקצבה שהחידוש מעניק, לפני הוספת הקרדיטים החדשים; 0 לא מעביר דבר.
rollover_expiry_days מספר ימים שלם, 1 עד 3650. קרדיטים שלא נוצלו למשך זמן זה נמחקים בחידוש הראשון לאחר שהגיעו לגיל זה. ניצול תמיד נגרע מהקרדיטים הישנים ביותר תחילה, כך שלקוח שמנצל את ההקצבה שלו בכל חודש לעולם לא יאבד דבר.

אם לא יוגדרו, שניהם יחזרו להגדרות התוכנית של הלקוח; ערך שנשלח כאן יגבר על זה של התוכנית. רק קרדיטים חוזרים (ההקצבה החודשית וקרדיטי התוכנית) כפופים להם: תוספות, טעינות אוטומטיות ותוספות חד-פעמיות לעולם אינן מוגבלות או פוקעות. כל צמצום נרשם בהיסטוריית הקרדיטים של הלקוח כ-Rollover Cap Credit Adjustment או Expired Credits Credit Adjustment ולעולם לא נחשב כשימוש. המקבילות ברמת התוכנית הן rollover_cap_months ו-rollover_expiry_days בשכבת תמחור — ראה השדות בשכבה ו-הגבלת מה שמועבר.


הגדרת תמחור ומדיניות AI לכל לקוח

PUT /v1/subaccounts/{subAccountUid}/max-tier · /ai-tiers · /max-rate · /action-pricing · /insider-rate · /locked-bot-fields · /notifications · /zero-credit-reply

שמונה מתגים נוספים לכל לקוח, לצד /limits, /features ו-/menu-visibility לעיל. כל אחד לוקח את ה-uid של חשבון המשנה ב-URL (ללא sub_account_id גוף/פרמטר שאילתה — היעד כבר מצוין בנתיב) והוא מוגדר באותו אופן: מפתח הסוכנות שלך, וחשבון המשנה חייב להיות שייך לסוכנות שלך.

באילו מודלי AI לקוח יכול להשתמש

curl -X PUT "https://api.dmchamp.com/v1/subaccounts/SUB_ACCOUNT_UID/max-tier" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "enabled": true }'

{ "enabled": boolean } רושם את הלקוח לתוך (או מחוץ) לדרגת Max AI — התשתית שלנו במחיר המחירון של הפלטפורמה. הפעלת אפשרות זו עבור לקוח BYOK משנה את עלות ה-AI שלו מ-“חינם על המפתח שלי” ל-“מחויב ממאגר הקרדיטים שלי”, כך שמדובר בהחלטה מכוונת לכל לקוח ולא בברירת מחדל כלל-סוכנותית.

כדי להגביל באילו דרגות הקמפיינים והסוכנים של לקוח יכולים לבחור בכלל (במקום רק לחסום את Max), השתמש ב-ai-tiers:

curl -X PUT "https://api.dmchamp.com/v1/subaccounts/SUB_ACCOUNT_UID/ai-tiers" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "allowed_ai_tiers": ["standard", "economy"] }'

allowed_ai_tiers הוא מערך שנלקח מ-standard, economy, max, mini — הוא מחליף את רשימת המותרים (allow-list) של הלקוח. שלח null (או []) כדי לנקות את ההגבלה ולאפשר להם לבחור כל דרגה. זה חשוב מכיוון שתת-חשבון שבוחר דרגת AI משלו מוציא ממאגר הקרדיטים שלך, לכן זהו המנוף לקביעת אילו מודלים לקוח מסוג משווק יכול להפעיל על חשבונך.

תגובת המתנה בזמן שללקוח אין קרדיטים

curl -X PUT "https://api.dmchamp.com/v1/subaccounts/SUB_ACCOUNT_UID/zero-credit-reply" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "enabled": true, "message": "Thanks for your message, we will get back to you shortly." }'

כאשר היתרה של הלקוח (או המאגר שלך) ריקה, ה-AI לא יכול לענות ואיש הקשר לא שומע דבר. עם enabled: true, כל איש קשר שכותב במהלך ההשבתה מקבל את message פעם אחת (מקסימום 500 תווים, נשלח כפי שהוא בכל ערוץ), וה-AI עונה לשיחות אלו באמת ברגע שהקרדיטים חוזרים. enabled: false שומר את הטקסט שנשמר למועד מאוחר יותר; enabled: false ללא message מסיר את ההגדרה. אותו מתג כמו Holding reply when out of credits בחלון העריכה של חשבון המשנה — ראה תגובת המתנה בזמן שללקוח אין קרדיטים.

מה לקוח משלם עבור כל פעולת AI, ותוספת העמלה של WhatsApp

שתי דרכים להגדיר את התעריף מול הלקוח שלך, מהפשוטה ביותר ועד המפורטת ביותר:

curl -X PUT "https://api.dmchamp.com/v1/subaccounts/SUB_ACCOUNT_UID/max-rate" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "rate": 0.35 }'

rate הוא המחיר בקרדיטים שהיתרה העצמית של תת-החשבון שורפת עבור כל פעולת AI במודל Max — תוספת העמלה שלך מול הלקוח מעבר למה שהמאגר שלך משלם בפועל. null מנקה את העקיפה חזרה למחיר המחירון של הפלטפורמה. התעריף חייב להיות לפחות מה שפעולת Max עולה למאגר שלך (כך שלעולם לא תוכל לתמחר לקוח מתחת לעלות שלך) ולא יותר מ-10 קרדיטים; בקשה מחוץ לטווח זה תידחה עם הודעת שגיאה המציינת את הרף המינימלי המחושב.

עבור תמחור לפי סוג פעולה במקום תעריף Max אחיד, השתמש ב-action-pricing:

curl -X PUT "https://api.dmchamp.com/v1/subaccounts/SUB_ACCOUNT_UID/action-pricing" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "actionPricing": {
      "AI_MESSAGE": 0.6,
      "CHAT_SUMMARY": 0.15,
      "wa_carrier_multiplier": null
    }
  }'

actionPricing הוא מיזוג (MERGE) לתוך המפה הקיימת של הלקוח — מפתח שלא ציינת נשאר כפי שהיה, ו-null מבטל את המפתח הזה חזרה לברירת המחדל שלו. המפתחות המוכרים:

מפתח מחירים
AI_MESSAGE תשובת AI
AI_TOOL_USE קריאת כלי AI
EVALUATION_CALL מעבר הערכת צ’אט
INTERRUPTION_HANDLING טיפול בהפרעה באמצע תשובה
CONTACT_TAG תג איש קשר שהוקצה על ידי AI
CHAT_SUMMARY סיכום צ’אט
wa_carrier_multiplier מכפיל עמלה המוחל על כל עמלת WhatsApp שאינה AI שהלקוח משלם: שכירות חודשית של מספר, דמי משלוח בנתיב מנוהל, ועלויות העברה של Meta/Twilio עבור תבניות.

שיעורים לכל פעולה חייבים להיות מספר הגדול מ-0 ועד 10; wa_carrier_multiplier חייב להיות לפחות 1 (ללא הנחה מתחת לעלות) ועד 10. שליחת מפתח לא מזוהה, או ערך מחוץ לטווח, תדחה את הבקשה כולה ותציין כל מפתח בעייתי, כך ששגיאת הקלדה לעולם לא תגרום לשמירה שקטה של מחיר שאינו מוחל בפועל.

אם אתה חבר ב-Champions Circle, insider-rate מעביר את שיעור ה-20% הנחה שלך ב-Max/Lead Finder ללקוח אחד במקום להחיל אותו על כל הסוכנות:

curl -X PUT "https://api.dmchamp.com/v1/subaccounts/SUB_ACCOUNT_UID/insider-rate" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "enabled": true }'

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

נעל חלקים מתוכנית העבודה (playbook) של לקוח

curl -X PUT "https://api.dmchamp.com/v1/subaccounts/SUB_ACCOUNT_UID/locked-bot-fields" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "locked_bot_fields": ["instructions", "rules"] }'

locked_bot_fields הוא מערך שנלקח מ-instructions, goal, rules, personality, conclude_unless — הוא מחליף את רשימת הנעילות של הלקוח. חלק נעול נדחה בצד השרת אם ה-SUB-ACCOUNT עצמו מנסה לשנות אותו (ישירות, או באמצעות מפתח API), בעוד שאתה (דרך sub_account_id) ומנהל המערכת בלוח הבקרה של הלקוח עדיין יכולים לערוך הכל. שלח null (או []) כדי לבטל את הנעילה של הכל. שימושי עבור לקוחות בשיטת “עשה זאת עבורי” (done-for-you) שבהם אתה הבעלים של תוכנית העבודה ונשפט על התוצאה.

הגדר את העדפות ההתראות של לקוח בשמו

curl -X PUT "https://api.dmchamp.com/v1/subaccounts/SUB_ACCOUNT_UID/notifications" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "notifications": {
      "settings": {
        "credit_alerts": { "enabled": true, "channels": ["email", "in_app"] },
        "new_contacts": { "enabled": false }
      }
    }
  }'

notifications מחליף את כל מערך העדפות ההתראות של הלקוח (לא מיזוג לפי מפתח — שלח כל קטגוריה שברצונך לשמור, בהתאם לאופן שבו דף ההגדרות של חשבון המשנה שומר אותן). כל קטגוריה תחת settings מקבלת enabled (בוליאני) ועד שלושה channels מתוך email, in_app, webhook. שלח null כדי לאפס לברירות המחדל של הפלטפורמה.

כל שבע נקודות הקצה מגיבות ב-{ "success": true, "data": { "subAccountUid": "...", ...the field(s) you set... } }, ומתועדות ביומן ביקורת עם הערך שלפני/אחרי. שגיאות נפוצות: 403 אם החשבון שלך אינו חשבון סוכנות/מפתח או שחשבון המשנה אינו מנוהל על ידך, 400 אם זה אינו חשבון משנה של סוכנות או שערך כלשהו מחוץ לטווח.


השהיית לקוח שהשעה את המנוי שלו

POST /v1/subaccounts/{subAccountUid}/pause · POST /v1/subaccounts/{subAccountUid}/unpause

כאשר לקוח משעה את המנוי שלו איתך, השהה את החשבון שלו במקום למחוק אותו: כל מה שהוא שולח נעצר מיד — הודעות יוצאות, שידורים, תשובות AI בכל ערוץ — וכאשר הוא מתחבר, הוא יראה מסך נעילה של חשבון מושהה (עם הודעה אופציונלית ממך) במקום את האפליקציה. שום דבר לא נמחק או מתנתק: סוכנים, קמפיינים, ערוצים מחוברים, אנשי קשר והיסטוריית צ’אט נשארים בדיוק כפי שהם, כך שביטול ההשהיה מחזיר את הלקוח בדיוק לנקודה שבה עצר — ללא צורך בהגדרה מחדש.

שדה חובה תיאור
message לא מוצג ללקוח במסך הנעילה שלו. השאר ריק עבור הניסוח המוגדר כברירת מחדל.
reason לא הערה פנימית של הסוכנות הנשמרת עם ההשהיה וביומן הביקורת — לעולם לא מוצגת ללקוח.

cURL

curl -X POST "https://api.dmchamp.com/v1/subaccounts/SUB_ACCOUNT_UID/pause" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "message": "Your account is on hold — contact us to reactivate it.", "reason": "Subscription suspended per client email" }'

תגובה

{
  "success": true,
  "data": {
    "subAccountUid": "SUB_ACCOUNT_UID",
    "paused": true,
    "level": "hard_blocked"
  }
}

כאשר הלקוח חוזר, POST /v1/subaccounts/SUB_ACCOUNT_UID/unpause (ללא גוף הודעה) מסיר את הנעילה — שליחת הודעות ותשובות AI מתחדשות מיד.

כדאי לדעת:

  • זהו אותו מצב כמו מתג החסימה הקשיחה (Hard blocked) בלוח הבקרה (חסימה / השהיה של תת-חשבון) — לקוח שהושהה דרך ה-API מופיע כחסום בלוח הבקרה ולהיפך, וביטול השהיה מסיר חסימה שבוצעה מכל צד. ניתן לקרוא את המצב הנוכחי מהשדה agency_block ב-GET /v1/subaccounts (level של "none", "soft_blocked" או "hard_blocked").
  • שתי הקריאות הן אידמפוטנטיות. השהיית לקוח שכבר מושהה רק מרעננת את ההודעה, הסיבה וחותמת הזמן; ביטול השהיה ללקוח פעיל לא משנה דבר.
  • הלקוח לא מקבל אימייל באופן אוטומטי — סוכנויות רבות משתמשות במיתוג לבן (white-label), לכן העדכון על כך נשאר באחריותך.
  • החיוב שלך ב-DM Champ נותר ללא שינוי. השהיית לקוח משפיעה רק על מערכת היחסים שלך איתו.
  • עוזרי AI יכולים לעשות זאת גם: שרת ה-MCP חושף נקודות קצה אלו ככלים pause_subaccount ו-unpause_subaccount.

הענקת או הפחתת קרדיטים ישירות

POST /v1/subaccounts/credits

מוסיף או מסיר כמות מדויקת של קרדיטים מיתרת חשבון משנה אחד — המקבילה ב-API להתאמת קרדיט ידנית בלוח הבקרה. זהו שינוי יתרה חד-פעמי, נפרד מהגדרות ה-monthly_credits, roll_over_to_next_month, rollover_cap_months ו-rollover_expiry_days החוזרות ב-PUT /v1/subaccounts/{subAccountUid}/limits.

זוהי נקודת הקצה היחידה בדף זה שמזהה את חשבון המשנה לפי דוא"ל ולא לפי sub_account_id.

שדה חובה תיאור
email כן כתובת הדוא"ל של חשבון המשנה, כפי שהיא מופיעה תחת הסוכנות שלך.
amount כן מספר קרדיטים שאינו אפס. מספר חיובי מוסיף, שלילי מפחית.
description לא מוצג לצד ההתאמה בהיסטוריית הקרדיטים של הלקוח. כברירת מחדל מוצגת השורה הכללית “הותאם על ידי הסוכנות דרך API”.

cURL

curl -X POST "https://api.dmchamp.com/v1/subaccounts/credits" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "email": "client@example.com", "amount": 500, "description": "Q3 bonus credits" }'

תגובה

{
  "success": true,
  "data": {
    "email": "client@example.com",
    "previous_balance": 1200,
    "adjustment": 500,
    "new_balance": 1700
  }
}

amount שלילי שיביא את היתרה מתחת לאפס מסורב עם 400, המודיע לך על היתרה הזמינה ועל מה שניסית לנכות. אם הלקוח נמצא בחיוב Stripe משלו (מצב מכירה חוזרת), סכום שנוסף נחשב גם כקרדיטים שהוא רכש, כך שהוא שורד את האיפוס החודשי הבא שלו באותו אופן שבו טעינה אמיתית הייתה שורדת; בלקוח מוקצה סטנדרטי הוא מטופל כחלק מההקצבה החוזרת שלו במקום זאת. כך או כך, הם תוספת חד-פעמית, לכן הגבלת העברה או תוקף שנקבעו בחשבון (או בתוכנית שלו) לעולם לא יצמצמו אותם — רק ההקצבה החוזרת וקרדיטי התוכנית כפופים לאלו.


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

GET /v1/subaccounts/{subAccountUid}/chats · GET /v1/subaccounts/{subAccountUid}/chats/{contactId}/messages

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

הצגת אנשי קשר

curl "https://api.dmchamp.com/v1/subaccounts/SUB_ACCOUNT_UID/chats?apiKey=YOUR_AGENCY_API_KEY&pageSize=25"
פרמטר שאילתה נדרש תיאור
pageSize לא אנשי קשר בכל עמוד. ברירת המחדל היא 25, המקסימום הוא 50.
lastActivityAt לא סמן דפדוף (Pagination cursor) — העבר את ה-lastActivityAt של העמוד הקודם כדי להמשיך.
searchQuery לא סינון לפי שם איש קשר או מספר טלפון.

תגובה

{
  "success": true,
  "data": {
    "contacts": [
      {
        "contactId": "contact456",
        "firstName": "Jamie",
        "lastName": "Lee",
        "phoneNumber": "+14155551234",
        "email": "jamie@example.com",
        "channel": "whatsapp",
        "lastActivityAt": "2026-08-30T14:22:00.000Z",
        "lastMessage": { "body": "Thanks, that fixed it!", "direction": "inbound", "timestamp": "2026-08-30T14:22:00.000Z" },
        "isBotActive": true,
        "markChatClosed": false
      }
    ],
    "subAccountName": "Client Co",
    "subAccountEmail": "client@example.com",
    "hasMore": true,
    "lastActivityAt": "2026-08-30T14:22:00.000Z"
  }
}

אנשי הקשר מסודרים לפי הפעילות האחרונה ביותר תחילה. המשך לדפדף עם lastActivityAt כל עוד hasMore הוא true.

קריאת הודעות של איש קשר אחד

curl "https://api.dmchamp.com/v1/subaccounts/SUB_ACCOUNT_UID/chats/contact456/messages?apiKey=YOUR_AGENCY_API_KEY&pageSize=30"
פרמטר שאילתה נדרש תיאור
pageSize לא הודעות בכל עמוד. ברירת המחדל היא 30, המקסימום הוא 100.
beforeTimestamp לא סמן דפדוף (Pagination cursor) — משוך הודעות ישנות יותר מחותמת זמן ISO זו.

תגובה

{
  "success": true,
  "data": {
    "messages": [
      {
        "messageId": "msg789",
        "body": "Thanks, that fixed it!",
        "direction": "inbound",
        "timestamp": "2026-08-30T14:22:00.000Z",
        "status": "received",
        "channel": "whatsapp",
        "botReply": false,
        "mediaUrl": null,
        "mediaContentType": null,
        "name": "Jamie Lee",
        "role": null
      }
    ],
    "contactInfo": { "firstName": "Jamie", "lastName": "Lee", "phoneNumber": "+14155551234", "channel": "whatsapp" },
    "hasMore": false,
    "oldestTimestamp": "2026-08-30T14:22:00.000Z"
  }
}

ההודעות חוזרות מהחדשה ביותר לישנה ביותר; דפדף אחורה בהיסטוריה עם beforeTimestamp.


קריאת ניצול קרדיט ובריאות קמפיינים בכל החשבונות שלך

GET /v1/subaccounts/credit-usage · GET /v1/subaccounts/campaign-status

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

ניצול קרדיט

curl "https://api.dmchamp.com/v1/subaccounts/credit-usage?apiKey=YOUR_AGENCY_API_KEY&from=2026-08-01&to=2026-08-31"
פרמטר שאילתה נדרש תיאור
from / to כן טווח תאריכי ISO.
subAccountId לא השמט עבור סיכום ברמת הסוכנות, שורה אחת לכל חשבון משנה. כלול כדי לעבור למצב פירוט: הסיכום של חשבון המשנה הזה בתוספת רשומות השימוש הגולמיות והממוספרות שלו.
limitCount לא מצב פירוט בלבד. ברירת המחדל היא 500, המקסימום הוא 2000.
startAfterTimestamp לא מצב פירוט בלבד — סמן דפדוף.
{
  "success": true,
  "data": {
    "subAccounts": [
      {
        "subAccountId": "abc123def456",
        "subAccountName": "Client Co",
        "subAccountEmail": "client@example.com",
        "totalCreditsUsed": 842,
        "totalCostUsd": 3.15,
        "byReason": { "AI reply": 620, "Chat summary": 80 },
        "topCampaigns": [{ "campaignName": "Inbound Leads", "creditsUsed": 500 }]
      }
    ],
    "totals": { "totalCreditsUsed": 842, "totalCostUsd": 3.15, "totalRecords": 214 },
    "dateRange": { "from": "2026-08-01", "to": "2026-08-31" },
    "hasMore": false,
    "lastTimestamp": null
  }
}

העבר את subAccountId והתגובה תכלול גם את records: חיובים בודדים עם amount, reason, campaignName, contactName ו-timestamp. לקוח שמוציא כספים באמצעות מפתח BYOK משלו במקום הקרדיטים שלך, נתוני העלות/אסימונים שלו יוסתרו (costsRedacted: true) — זוהי טלמטריה של עלויות פלטפורמה, לא משהו שנועד להצגה לצופה בדרגת משווק. |

סטטוס קמפיין

curl "https://api.dmchamp.com/v1/subaccounts/campaign-status?apiKey=YOUR_AGENCY_API_KEY&pageSize=20"
פרמטר שאילתה נדרש תיאור
pageSize לא תת-חשבונות בכל עמוד. ברירת מחדל 10, מקסימום 50.
lastDocumentId לא סמן (cursor) עבור דפדוף.
searchQuery לא סינון לפי שם תת-חשבון או אימייל.
{
  "success": true,
  "data": {
    "totalSubAccounts": 34,
    "subAccountsWithIssues": 3,
    "totalLiveCampaigns": 51,
    "totalPausedCampaigns": 6,
    "subAccounts": [
      {
        "userId": "abc123def456",
        "email": "client@example.com",
        "displayName": "Jamie Lee",
        "businessName": "Client Co",
        "totalCampaigns": 2,
        "liveCampaigns": 1,
        "pausedCampaigns": 1,
        "hasIssues": true,
        "issueDetails": ["1 campaign paused"],
        "lastCampaignActivity": "2026-08-29T09:00:00.000Z"
      }
    ],
    "hasMore": true,
    "lastDocumentId": "abc123def456",
    "pageSize": 20
  }
}

דגל hasIssues / issueDetails מסמן תת-חשבונות שכדאי לבדוק — למשל, קמפיין מושהה, או קמפיין שאין לו ערוץ מנותב. השתמש בזה כדי לבנות לוח בקרה לבדיקת תקינות עבור כל הלקוחות, במקום לפתוח כל לקוח בנפרד כדי להבחין בקמפיין תקוע.

עבור הודעות ופעילות אשראי לאורך זמן עבור כל לקוח (סדרה מוכנה לתרשים ולא תמונת מצב של רגע נתון), עיין ב-GET /analytics/agency-rollup במדריך ה-Analytics API.


שלח חשבון לקוח שכבר הוגדר

PUT /v1/snapshots/default · POST /v1/snapshots/{snapshotId}/apply

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

אוטומטי — כל לקוח חדש מקבל אותה מלידה. סמן תמונת מצב כברירת המחדל שלך פעם אחת, וכל חשבון שתצור מאותו רגע יגיע כשהיא מותקנת בו. זה מכסה חשבונות שנוצרו דרך POST /v1/subaccounts, חשבונות שאתה יוצר בלוח הבקרה, וחשבונות שנוצרים אוטומטית כאשר לקוח משלם דרך קישור התשלום שלך.

ראשית, מצא את מזהה (id) תמונת המצב:

curl "https://api.dmchamp.com/v1/snapshots" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY"

לאחר מכן הגדר אותה כברירת מחדל:

curl -X PUT "https://api.dmchamp.com/v1/snapshots/default" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "snapshot_id": "SNAPSHOT_ID" }'

זו כל האינטגרציה. שלח {"snapshot_id": null} כדי לכבות אותה שוב. באפשרותך לעשות את אותו הדבר מלוח הבקרה על ידי לחיצה על הכוכב בדף Snapshots.

כדי לקרוא מה מסומן כרגע בכוכב (למשל, לפני שסקריפט הקצאה מחליט אם להגדיר אחד), GET /v1/snapshots/default מחזיר { "success": true, "data": { "default_snapshot_id": "SNAPSHOT_ID" } }null כאשר שום דבר אינו מסומן בכוכב. GET /v1/snapshots (משמש למציאת ה-id לעיל) מחזיר את אותו default_snapshot_id לצד מערך ה-snapshots המלא, כך שרוב האינטגרציות זקוקות רק לקריאה אחת. שדות אובייקט תמונת המצב המלאים נמצאים במדריך Snapshots.

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

curl -X POST "https://api.dmchamp.com/v1/snapshots/SNAPSHOT_ID/apply" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "sub_account_id": "SUB_ACCOUNT_UID" }'

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

כדאי לדעת לפני שמתחילים לבנות על זה:

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

בניית התבנית עצמה באמצעות ה-API

POST /v1/snapshots · סוכנים, פונקציות מותאמות אישית ומדיה באמצעות ה-API

הסעיף שלעיל מפיץ תמונת מצב (snapshot) שמישהו בנה בלוח הבקרה. גם חלק העריכה חשוף, כך שניתן להריץ את כל התהליך — הרכבת ההגדרה הראשית פעם אחת, לכידתה והעברתה לכל לקוח — מתוך קוד.

החלקים, לפי הסדר שבו סקריפט הקצאה משתמש בהם:

  1. צרו את הפונקציות המותאמות אישית שלכם. POST /v1/custom-functions יוצרת אחת; GET /v1/custom-functions מציג את מה שיש לכם, ו-GET, PUT ו-DELETE ב-/v1/custom-functions/{customFunctionId} קוראים, מעדכנים ומסירים אחת. POST /v1/custom-functions/test מריץ בדיקה (dry-run) להגדרה לפני שמירתה.
  2. צרו ועצבו את הסוכן. POST /v1/agents יוצר אותו, PUT /v1/agents/{agentId} מעדכן אותו, ו-PATCH /v1/agents/{agentId}/active עם { "active": false } שומר עליו במצב מושהה בזמן שאתם עובדים (אותה קריאה עם true מפעילה אותו). GET /v1/agents מציג אותם.
  3. תנו לסוכן את היכולות שלו. POST /v1/agents/{agentId}/custom-functions עם { "custom_function_id": "..." } מצמיד פונקציה לסוכן; ה-DELETE /v1/agents/{agentId}/custom-functions/{customFunctionId} התואם מנתק אותה.
  4. מלאו את ספריית המדיה. POST /v1/agents/{agentId}/media-library מעלה פריט (JSON עם base64Data, mimeType, title, description); GET מציג את הפריטים של הסוכן, ו-PATCH/DELETE ב-/{itemId} מעדכנים או מסירים אחד.
  5. לכדו זאת כתמונת מצב (snapshot).
curl -X POST "https://api.dmchamp.com/v1/snapshots" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Master setup v1",
    "agent_ids": ["AGENT_ID"],
    "include_knowledge": true,
    "include_tools": true,
    "include_media": true
  }'

משם זה ממשיך לסעיף הקודם: סמנו אותו כברירת מחדל כך שכל לקוח חדש ייוולד איתו, או החילו אותו לפי דרישה. פעולות תחזוקה נמצאות לצד זה: PATCH /v1/snapshots/{snapshotId} עם { "name": "..." } משנה שם של תמונה, DELETE /v1/snapshots/{snapshotId} מוחק אחת (ומסיר את סימון ברירת המחדל אם היא הייתה כזו), ו-GET /v1/snapshots/apply-targets מציג כל חשבון שאליו ניתן להתקין.

נקודות הקצה של הסוכן, הפונקציה המותאמת אישית והמדיה מקבלות כולן את sub_account_id, כך שאותן קריאות יכולות גם לתחזק סוכן ישירות בתוך חשבון של לקוח אחד. קריאות תמונת מצב (snapshot) פועלות תמיד על חשבון הסוכנות שלכם — התבנית נשארת אצלכם. סכימות מלאות של בקשות ותגובות עבור כל אלו נמצאות ב-API Reference.


ניהול דרגות התמחור שלכם דרך ה-API

GET /v1/agency/pricing-tiers · POST /v1/agency/pricing-tiers · PATCH /v1/agency/pricing-tiers/{tierIndex} · DELETE /v1/agency/pricing-tiers/{tierIndex}

ניתן לקרוא ולשנות את התוכניות שאתם מוכרים ב-SaaS Mode → Pricing Tiers מתוך הקוד, כך שפאנל הניהול או סקריפט ההקצאה שלכם יוכלו להוסיף תוכנית, לעדכן מחיר או לספק קישור לתשלום מבלי שאף אחד יצטרך לפתוח את לוח הבקרה. בצעו אימות עם מפתח ה-API של הסוכנות שלכם כמו בכל קריאה אחרת בדף זה; נקודות קצה אלו הן ברמת הסוכנות, ולכן הן אינן מקבלות sub_account_id. כל פעולת כתיבה מריצה את אותה אימות ואת אותו סנכרון מוצר ומחיר מול Stripe כמו בשמירה בלוח הבקרה, כך שתוכנית שנוצרה כאן אינה שונה מתוכנית שהגדרתם ידנית.

הצגת הדרגות שלכם

curl "https://api.dmchamp.com/v1/agency/pricing-tiers" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY"

תגובה

{
  "success": true,
  "data": {
    "tiers": [
      {
        "tierIndex": 0,
        "credits": 1000,
        "price_cents": 2900,
        "currency": "usd",
        "label": "Starter",
        "billing_interval": "month",
        "trial_days": 14,
        "trial_credits": 250,
        "trial_card_required": false,
        "trial_hard_expiry": true,
        "stripe_price_id": "price_1PxAbC…",
        "stripe_product_id": "prod_QxAbC…",
        "checkout_url": "https://app.yourdomain.com/v1/checkout?id=YOUR_AGENCY_UID&tierIndex=0"
      }
    ],
    "count": 1,
    "max_tiers": 20
  }
}

כל דרגה חוזרת עם ה-tierIndex שלה — המיקום שלה ברשימת התוכניות שלכם, שבאמצעותו שלוש הקריאות האחרות מתייחסות אליה — ועם checkout_url מוכן לשיתוף, אותו קישור שמופיע בלשונית Payments, המפנה כבר ל-דומיין ה-White Label שבו התוכנית נמכרת.

הוספת דרגה

גוף הבקשה הוא אובייקט דרגה אחד; הוא מתווסף לסוף הרשימה שלכם.

curl -X POST "https://api.dmchamp.com/v1/agency/pricing-tiers" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "label": "Starter",
    "credits": 1000,
    "price_cents": 2900,
    "currency": "usd",
    "billing_interval": "month",
    "trial_days": 14,
    "trial_credits": 250,
    "trial_card_required": false,
    "trial_hard_expiry": true,
    "features": ["channels_3", "channel_whatsapp_web", "webhooks"]
  }'

התגובה מכילה את הדרגה שנוצרה, כולל ה-tierIndex שבו היא מוקמה וה-checkout_url שלה.

עריכת דרגה

שלחו רק את השדות שברצונכם לשנות; כל שאר הפרטים בתוכנית יישארו כפי שהיו.

curl -X PATCH "https://api.dmchamp.com/v1/agency/pricing-tiers/0" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "price_cents": 3900, "trial_hard_expiry": true }'

שדה שה-API אינו מזהה יסורב במקום להתעלם ממנו, והשגיאה תציין אותו בשמו — כך ששגיאת הקלדה לעולם לא תגרום לכתיבה שקטה של הגדרה שנראית פעילה אך אינה עושה דבר. שינוי המחיר, הזיכויים, המטבע או מחזור החיוב יוצר מחיר חדש ב-Stripe שלכם; לקוחות שכבר נרשמו יישארו במסלול שאליו נרשמו.

מחיקת דרגה

curl -X DELETE "https://api.dmchamp.com/v1/agency/pricing-tiers/2" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY"

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

השדות בדרגה

שדה מה זה
label / description שם התוכנית, והשורה האופציונלית המוצגת בדף התשלום שלך.
credits קרדיטים שהלקוח מקבל לחודש בתוכנית חודשית או שנתית, ו-לתקופת חיוב בתוכנית שבועית.
price_cents מחיר למרווח חיוב, ביחידת המטבע הקטנה ביותר (2900 = $29.00). בתוכנית שנתית זהו המחיר של כל השנה.
currency קוד ISO באותיות קטנות — usd, eur, gbp וכן הלאה.
billing_interval / billing_interval_count month (ברירת המחדל), year, או week עם ספירה של 1–52 עבור “כל N שבועות”.
trial_days אורך תקופת ניסיון חינם, 0 עד 90. 0 (או השארתו ריק) אומר ללא תקופת ניסיון.
trial_credits קרדיטים שהלקוח מתחיל איתם את תקופת הניסיון. כברירת מחדל ל-credits של התוכנית.
trial_card_required false מאפשר ללקוח להתחיל את תקופת הניסיון ללא הזנת כרטיס. כברירת מחדל ל-true.
trial_hard_expiry true מחזיר קרדיטי ניסיון שלא נוצלו למאגר שלך ונועל את חשבון הלקוח כאשר תקופת ניסיון מסתיימת ללא שדרוג. כברירת מחדל ל-false — ראה Hard expiry after trial.
rollover_cap_months חודשי הקצבה שלקוחות בתוכנית זו רשאים להעביר בין חידושים — מספר מ-0 עד 120, שברים מותרים. 0 לא מעביר דבר; null (ברירת המחדל) אומר ללא הגבלה. ראה Capping what rolls over.
rollover_expiry_days ימים שאחריהם קרדיטים שלא נוצלו נמחקים בחידוש הבא — מספר שלם מ-1 עד 3650. null (ברירת המחדל) אומר שהם לעולם לא פוקעים.
features / feature_settings מה לקוחות בתוכנית זו מקבלים — אותם מזהי תכונות כמו Choose which channel types a client can connect.
team_seats_limit מושבי צוות שהתוכנית מעניקה: מספר מדויק, 0 ללא, -1 ללא הגבלה.
white_label_config באילו מ-דומייני ה-white label שלך התוכנית נמכרת.

שדות תקופת הניסיון משמעותיים רק בתוכנית שיש בה תקופת ניסיון: שמור שכבה (tier) עם trial_days: 0 והם יוסרו. מזהי המוצר והמחיר של Stripe עבור התוכנית מנוהלים עבורך ולא ניתן להגדירם ידנית.

שלושה דברים שחשוב להקפיד עליהם:

  • אינדקסי שכבות (Tier indexes) הם מיקומים, לא מזהים קבועים. מחיקת תוכנית מזיזה כל תוכנית שאחריה מיקום אחד אחורה, לכן יש לאחזר מחדש את הרשימה לאחר כל שינוי — ולהעתיק מחדש את קישורי התשלום שפרסמת, בדיוק כפי שהיית עושה לאחר מחיקת תוכנית בלוח הבקרה.
  • יש להגדיר תחילה את מצב SaaS. נקודות קצה אלו דורשות חשבון סוכנות עם מיתוג לבן (white labeling) ומפתח Stripe שכבר נשמר; ללא אלו, לא קיים חשבון Stripe שעליו יוכלו לשבת המוצר והמחיר של התוכנית.
  • המכסה היא עשרים תוכניות, בדיוק כמו בלוח הבקרה. השדה max_tiers בתגובת הרשימה מציין את המגבלה הנוכחית.

סכימות הבקשה והתגובה המלאות נמצאות ב-API Reference, תחת Agency.


הגדר את המחיר לקרדיט דרך ה-API

GET /v1/agency/credit-price · PATCH /v1/agency/credit-price

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

קריאת המחיר הנוכחי

curl "https://api.dmchamp.com/v1/agency/credit-price" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY"

תגובה

{
  "success": true,
  "data": {
    "price_per_credit_cents": 125,
    "price_per_credit_currency": "brl",
    "note": "USD 0.25 per credit at our reference rate",
    "minimum_cents": 60
  }
}

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

שינוי המחיר

curl -X PATCH "https://api.dmchamp.com/v1/agency/credit-price" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "price_per_credit_cents": 130, "currency": "brl" }'

שלח רק את מה שברצונך לשנות. price_per_credit_cents הוא המחיר ביחידת המטבע הקטנה ביותר (130 = R$1.30); currency הוא קוד ISO באותיות קטנות; note היא שורה אופציונלית של עד 200 תווים המוצגת ללקוחות ישירות מתחת למחיר לקרדיט בדף החיוב שלהם — שימושי למחיר ייחוס במטבע אחר, כגון “0.25 דולר ארה"ב לקרדיט לפי שער הייחוס שלנו”. שלח "note": "" כדי להסיר אותה. התגובה היא באותו מבנה כמו בקריאה לעיל, כך שמשימה יכולה להשוות ולדלג על הכתיבה כאשר דבר לא השתנה.

אותם כללים חלים כפי שחלים בלוח הבקרה: המחיר לא יכול לרדת מתחת למינימום של הפלטפורמה עבור אותו מטבע, והחשבון זקוק ל-White Labeling. בניגוד לנקודות הקצה של שכבות התמחור, אין צורך במפתח Stripe כדי לקרוא או לשנות ערך זה.

תן למשימה מפתח שלא יכול לעשות דבר אחר

הזנת מפתח הסוכנות המלא שלך למתזמן מעניקה גישה רחבה יותר ממה שעדכון מחיר דורש. במקום זאת, צור מפתח מוגבל (scoped key) המוגבל לאזור מחיר קרדיט סוכנות: מפתח זה יכול לקרוא ולשנות את המחיר לכל קרדיט ותו לא — הוא אינו יכול לגשת לחשבונות משנה, תוכניות, קרדיטים או לחיבור ה-Stripe שלך.

curl -X POST "https://api.dmchamp.com/v1/api-keys" \
  -H "X-API-Key: YOUR_AGENCY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "label": "FX price updater", "scopes": { "read_only": false, "tags": ["Agency Credit Price"] } }'

התגובה נושאת את המפתח החדש ב-api_key פעם אחת בלבד — הוא לא יוצג שוב לעולם, לכן שמור אותו מיד. הגדר "read_only": true עבור מפתח שצריך רק לקרוא את המחיר, והוסף "expires_at" (תאריך בפורמט ISO) אם ברצונך שהוא יפסיק לעבוד מעצמו. רק המפתח של בעל החשבון יכול ליצור מפתחות מוגבלים; הצג או בטל אותם באמצעות GET /v1/api-keys ו-DELETE /v1/api-keys/{id}.


אפשר לתת-חשבון לקרוא את התמחור שלך

GET /v1/subaccounts/agency-pricing

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

curl "https://api.dmchamp.com/v1/subaccounts/agency-pricing" \
  -H "X-API-Key: THE_SUB_ACCOUNTS_OWN_API_KEY"

תגובה

{
  "success": true,
  "data": {
    "tiers": [{ "credits": 1000, "price_cents": 2900, "currency": "usd" }],
    "price_per_credit_cents": 125,
    "price_per_credit_currency": "brl",
    "price_per_credit_note": "USD 0.25 per credit at our reference rate",
    "agency_display_name": "Client Co's Growth Partner"
  }
}

זה משקף בדיוק את מה ש-GET /v1/agency/pricing-tiers ו-GET /v1/agency/credit-price מחזירים עבורך כסוכנות, פחות כל מה שהלקוח לא צריך לראות (מזהי Stripe, max_tiers, וכן הלאה). זה עובד רק עבור חשבון שהוא אכן תת-חשבון עם סוכנות מקושרת — קריאה לזה מחשבון הסוכנות שלך תחזיר שגיאת הרשאה.


דברים שחשוב לזכור

  • השתמש במפתח הסוכנות שלך. בצע אימות לכל קריאה באמצעות מפתח ה-API של חשבון הסוכנות שלך — לא של חשבון המשנה. הפרמטר sub_account_id הוא זה שמפנה את הפעולה.
  • הזיכויים מגיעים מחשבון המשנה. רכישות וחיובים חוזרים יורדים מיתרת הזיכוי של חשבון המשנה הממוקד, לא מהיתרה שלך.
  • השגיאה 404 פירושה “לא חשבון המשנה שלך”. בדוק שוב את ה-id וודא שמדובר בחשבון שאתה מנהל.
  • הפרמטר הוא אופציונלי בכל מקום שבו הוא מתקבל. אם תשמיט אותו, אותו endpoint יפעל על חשבון הסוכנות שלך, כך שתוכל לעשות שימוש חוזר באינטגרציה אחת עבור שניהם.

קשור

  • גישת API — אימות, כתובת URL בסיסית, שגיאות, מגבלות קצב.
  • תת-חשבונות — הצגה וניהול של החשבונות שאליהם ניתן להתמקד.
  • טעינה אוטומטית של תת-חשבון — הענקת אשראי לתת-חשבון באמצעות webhook + API.
  • API של קמפיינים — יצירה, עדכון והעתקה של קמפיינים, כולל התייחסות מלאה לשדות.
  • API של חיבור ערוצים — חיבור ערוצים של לקוח וניתובם לקמפיין.
  • מדריך Analytics API (בסעיף ה-API) — ריכוז תת-חשבונות של סוכנות וכל נקודת קצה אחרת של דיווח.
  • תמונות מצב — מה תמונת מצב לוכדת וכיצד לבנות אחת בלוח הבקרה.