DM Champ Docs

代理店向けAPI

代理店として、クライアントが使用するものと同じREST APIを使用できますが、個々のリクエストを自分のアカウントではなく、管理下のサブアカウントに向けて送信します。これにより、クライアントのオンボーディングをエンドツーエンドで実行するツールを構築できます。キャンペーンの作成、ナレッジベースでのAIのトレーニング、連絡先のインポート、メッセージングチャネルの接続、電話番号の購入などを、各サブアカウントに手動でログインすることなくすべて実行可能です。

このページでは、代理店固有の動作、つまり sub_account_id パラメータを使用してサブアカウントの代理として操作する方法のみを説明します。基本事項(キーの生成、認証、ベースURL、エラー形式、レート制限)については、APIアクセスガイドから始めてください。そこに記載されているすべての内容はここにも適用されます。認証には代理店アカウントのAPIキーを使用します。

注: このページは技術的な内容です。開発者ではない場合は、インテグレーションを担当している方に共有してください。


「代理として操作する」仕組み

デフォルトでは、すべてのAPIリクエストはAPIキーを所有するアカウント、つまり代理店アカウントに対して実行されます。管理下のクライアントアカウントに対して操作を行うには、リクエストにオプションの sub_account_id パラメータを追加し、そのクライアントのアカウント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サーバーは読み取りツールで同じ設定を保持しているため、エージェンシーキーによる1つの接続ですべてのクライアントのレポートを作成できます。リクエスト内でクライアント名を指定するだけです(例: 「Bella’s Bistroには何人の連絡先がありますか?」)。書き込みアクションも利用可能です。sub_account_id を受け入れるすべてのエンドポイントがツールとして公開されているため、同じ接続からクライアントに代わって作成、変更、送信を行うことができます。

サブアカウントIDの確認方法

sub_account_id は、クライアントアカウントの一意のIDです。サブアカウントとそのIDのリストは、SubAccounts APIエンドポイント(サブアカウントガイドを参照)またはサイドバーの Sub Accounts ページから取得できます。


所有権は常に検証されます

sub_account_id を渡すと、プラットフォームはそのアカウントが実際のサブアカウントであること、かつあなたの代理店に属していることを確認します。その確認が取れた場合にのみ、リクエストが処理されます。

IDが不明な場合、サブアカウントではない場合、または別の代理店に属している場合、リクエストは 404 レスポンスで失敗します:

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

なぜ403ではなく404なのか? 「forbidden(禁止)」というレスポンスは、外部の人間に対して、そのIDが存在するものの自分のものではないという情報を与えてしまいます。存在しない場合と自分のものではない場合の両方に同じ 404 を返すことで、そのエンドポイントを使ってどのIDが他の代理店に属しているかを特定されることを防げます。ここでは 404 を「あなたが管理していないサブアカウントです」という意味として扱ってください。


sub_account_id がサポートされている場所

sub_account_id は、基本的にすべてのリソースエンドポイント(アカウント固有のデータの作成、読み取り、更新、削除を行うすべての呼び出し)で受け入れられます。実際には、代理店キーを使用してサブアカウントのセットアップ全体をプロビジョニングし、実行することができます:

  • AI設定 — キャンペーン、エージェント、FAQ、ナレッジベースソース(ウェブサイトクロール および ドキュメントアップロード)、ナレッジベースグループ、ブロードキャスト、カスタム関数、MCPサーバー
  • 連絡先 & CRM — 連絡先(インポートを含む)、リスト、タグ、タスク、案件、アポイントメント、イベント
  • チャネル & 番号 — WhatsApp / WhatsApp Web / Telegram / Instagram & Messenger / LINEの接続、電話番号の検索 / 購入 / 管理、WhatsAppテンプレート、チャネルルーティング
  • メッセージング & コンテンツ — メッセージ送信、チャットセッション、チャットエクスポート、日次サマリー
  • 設定 & 統合 — Webhook、チャットウィジェット設定、ホワイトラベル設定、BYOK SMSおよびその他のアカウント設定、分析

これらの各パラメーターはオプションです。省略した場合、呼び出しはあなた自身の代理店アカウントに対して行われるため、1つの統合で両方に対応できます。クレジットと使用量は常にターゲットとするアカウントから差し引かれます。サブアカウントのキャンペーン、メッセージ、タグ、番号に対する料金は、そのサブアカウントの残高に請求されます。

適用されない場合

一部のエンドポイントは代理店レベルまたは自己宛てであり、sub_account_idを無視します:

  • サブアカウント自体の管理 — SubAccountsエンドポイント(サブアカウントの作成 / 一覧取得 / 更新)およびBYOK利用限度額エンドポイントでは、すでにURLパス内でサブアカウントを指定しています。価格設定およびポリシーエンドポイントチャット監視エンドポイントも同様のパターンに従います。
  • アカウント間でのエージェントのコピーPOST /v1/subaccounts/agents/copyは両方のアカウントを自身で指定し、宛先をtargetUserIdとして受け取ります。以下の実例を参照してください。(古いPOST /v1/subaccounts/campaigns/copyも同様に動作しますが、Campaigns APIの他の部分とともに非推奨となっています。)
  • クレジットの調整および2つのエージェンシー全体のロールアップPOST /v1/subaccounts/creditsは代わりにemailでサブアカウントを識別します。また、GET /v1/subaccounts/credit-usageGET /v1/subaccounts/campaign-statusはすべてのサブアカウントを一度にレポートするため、ターゲットとなる単一のアカウントはありません。
  • エージェンシー自身のアカウント — APIキー管理、エージェンシーの利用状況レポート、チーム管理、および価格ティアは、常にエージェンシーアカウントに対して実行されます。
  • インバウンドメッセージのWebhook — 外部システムが送信先とするエンドポイントは、それらを構成した資格情報を持つアカウントに紐付けられているため、リダイレクトする必要はありません。

各エンドポイントが受け入れるパラメータの最新かつ機械可読なリストは、ダッシュボードのAPIリファレンス(Settings → Integrations → API Key)および GET /v1/docs/openapi.yaml のOpenAPI仕様で確認できます。APIの変更は頻繁に行われるため、これらを信頼できる情報源として扱ってください。

APIキー設定ページ。マスクされたキーと再生成コントロールが表示されています

設定 → 統合 → APIキー — 貴社のエージェンシーキーはここにあり、完全なAPIリファレンスへのリンクも併記されています。


実践例:サブアカウントのInstagramとMessengerを接続する

InstagramとMessengerの接続は、ブラウザベースのフローです。APIで開始し、返された同意URLをクライアントに渡す(またはクライアントのために開く)と、クライアントがブラウザで承認を行い、接続するページを選択します。これらすべてを sub_account_id でサブアカウントをターゲットにして行います。

ステップ 1 — 接続を開始する

クライアントの sub_account_id をボディに含めて接続エンドポイントを呼び出します。ここでは認証情報は送信されません。プラットフォームは、クライアントがブラウザで開く必要のある同意URLと、1回限りの相関トークンを返します。

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 — ページが読み込まれるまでポーリングする

クライアントが承認した後、接続可能なページが表示されるまで、ステータスエンドポイントをポーリングします(同じ 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になるまで待機してください。進行せずに、2つの最終エラー状態(failedまたはexpired:クライアントが同意を拒否した、または状態トークンの約30分の有効期限が切れた)が表示される場合があります。いずれかが発生した場合はreasonフィールドが含まれます。これらが発生した場合はポーリングを停止し、ステップ1からやり直してください。pendingで永久に待機しないでください。ページアクセストークンが返されることはありません。

ステップ 3 — 接続するページを選択する

ステップ 2 で取得したページ ID のいずれかを選択します。ページを選択すると、そのページの Instagram と Messenger の両方が接続されます。リクエストボディに再度 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"
}

これで完了です。クライアントのサブアカウントで Instagram と Messenger が接続されました。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送信者の登録はバックグラウンドで継続されます。送信前にステータスがONLINEに達するまでGET /v1/phone-numbers/{phoneNumber}/status?sub_account_id=abc123def456をポーリングしてください。


実例:テンプレートエージェントをすべての新規クライアントに展開する

一般的なエージェンシーのパターンは、エージェンシーアカウントにマスターエージェントを1つ保持し、すべてのクライアントの開始時に適した設定に調整しておき、プロビジョニング時に各新規サブアカウントにそのコピーを作成することです。これは3回の呼び出しで完了し、その後繰り返す必要はありません。コピーは変更されるまでその設定を保持します。

ステップ 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に含まれます。FAQ、ナレッジベース、メディアライブラリは引き継がれますが、ソースアカウントのWhatsAppテンプレート、接続されたソーシャル投稿、連絡先は意図的に引き継がれません。フィールドの全リストはAI Agents APIを参照してください。

このエンドポイントはsub_account_idではなくtargetUserIdを受け取ることに注意してください。これは両方のアカウントを自身で指定します。以下の2つの呼び出しでは、通常の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 — クライアントのチャネルをキャンペーンに割り当てる

コピーにはルーティングも設定されていないため、クライアントが接続したチャネルの応答者として設定するまで、何も届きません。チャネルごとに1回呼び出します:

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" }'

ここから、そのチャネル上の未知の連絡先からの最初のメッセージは、コピーされたエージェントによって自動的に拾われます。他のチャネルや番号ごとのルーティングについては、チャネルをエージェントに向けるを参照してください。

サブアカウント作成時にクライアントのタイムゾーンを設定してください。 POST /v1/subaccountstime_zone_idを渡します。キャンペーンの有効時間はサブアカウント自身のタイムゾーンで評価されるため、タイムゾーンを指定せずに作成されたクライアントのスケジュールは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を送信)すると、ウィザードはこれまで通り動作するため、既存の統合を変更する必要はありません。後でクライアントにウィザードを再度表示させるには、PUT /v1/subaccounts/{subAccountUid}/menu-visibility(下記)を使用してguided_onboarding項目を再表示してください。メニューの表示設定はウィザードにアクセスできるかどうかを制御し、guided_onboardingは初回サインイン時のリダイレクトのみを制御します。


クライアントのタスク、日次サマリー、またはメディアライブラリをオフにする

POST /v1/subaccounts

これら3つの機能は、特に指定しない限りすべての新規クライアントに対して有効になります。これらは本ガイドの他のすべての機能とは動作が異なり、オプトインではなくオプトアウト方式です。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は、作成時にこれら3つをオフにする唯一の方法です。featuresからこれらを除外しても、リストの他の部分がどうであれ、それ自体では何も起こりません。これは、古いインテグレーションでこれら3つが意図せず無効化されるのを防ぐための意図的な仕様です。

後からこれらを変更するには、完全なfeaturesリストをPUT /v1/subaccounts/{subAccountUid}/featuresに送信してください。リストに存在すれば機能がオンになり、存在しなければオフになります。


クライアントをサブアカウントへ自動ログインさせる(SSO)

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

エージェンシーAPIキーを使用して1回呼び出すだけで、クライアントを自身のサブアカウントに直接ログインさせるためのURLが取得できます。ログイン画面やパスワード入力の手順は不要で、追加で構築する必要もありません。このURLを新しいタブで開いたり、リダイレクトさせたり、あるいは自社プロダクト内のiframeで表示したりできます。

フィールド 必須 説明
redirect いいえ クライアントに表示させたいアプリ内ページ(例: "/chats""/agents")。レスポンスでは deep_link_url として返されます。
app_base_url いいえ リンクのダッシュボードホスト。デフォルトはホワイトラベルアプリのドメイン(設定がない場合はプラットフォームドメイン)です。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は同じ宛先を指定するもので、ログイン後にフレームを明示的にナビゲートすることを好むインテグレーター向けです。セッションが存在すれば、そのブラウザコンテキスト内でどのダッシュボードパスも機能します。
  • オンデマンドで発行し、即座に開く。 リンクにはログイン資格情報が含まれており、約1時間で期限切れになります。クライアントがクリックした瞬間にサーバー側でリクエストし、保存やメール送信は行わないでください。
  • ログイントークンはURLフラグメント(#…)で送信されます。これはブラウザがサーバーに送信することのない部分であり、消費された瞬間にアドレスバーから削除されます。
  • 自社のサブアカウントのみ。 エンドポイントは、貴社のエージェンシーが所有していないアカウントへのアクセスを拒否します。
  • 期限切れのリンクは、再試行パスを含む明確なエラーを表示します。その際は新しいリンクを発行してください。

サブアカウントのナビゲーション項目を非表示にする

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

サブアカウントに表示されるサイドバーや設定項目を制御します。ダッシュボードを埋め込む際に、自社プロダクトでカバーしていない機能のみを表示させたい場合に便利です。リストに含まれていない項目はすべて表示されたままになります。nullmenuVisibility の値全体として送信すると、すべて表示状態にリセットされます。項目を非表示にするとメニューエントリも隠れます。厳密なアクセス制限を行うには、サブアカウントに付与する機能と組み合わせて使用してください。

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個のキーを受け入れます:DashboardDailySummariesChatsContactsDealsTasksAutomationsCampaignsAppointmentsSettingsHelpCreditsCounter(サイドバーに表示されるクレジット残高)、および guided_onboarding(セットアップウィザード)。さらに3つのキー(AiInsightsSub AccountsAgency Reselling)も受け入れられますが、これらは何も機能しません。これらは廃止された旧ダッシュボードにのみ適用されていたものであり、設定してもサブアカウントには影響しません。キーが欠落している場合は表示されることを意味します。サブアカウントに自身でサインインした際には、非表示の項目が一時的に表示されるため、いつでも設定を元に戻すことができます。

メニューからページを非表示にしても、アクセス権が付与されるわけではありません。Automationsには、サブアカウントでautomations機能が許可されている必要があります。この機能なしでキーをtrueに設定しても、ページは表示されません。TasksDailySummariesは逆の動作をします。これらは、オフにしない限りすべてのクライアントで有効になります(クライアントのタスク、日次サマリー、またはメディアライブラリをオフにするを参照してください)。


クライアントが接続できるチャネルタイプを選択する

PUT /v1/subaccounts/{subAccountUid}/features

プラン階層に表示されるチャネルタイプのスイッチは通常の機能IDであるため、ダッシュボードからではなくAPIを使用してクライアントごとに設定できます。これはURL自体にサブアカウント名が含まれるエンドポイントの1つであるため、sub_account_idは必要ありません。

機能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"
    ]
  }'

正しく設定するための3つのポイント:

  • この呼び出しは機能リスト全体を置き換えます。 変更するものだけでなく、クライアントが保持すべきすべての機能を送信してください。同じIDは、アカウント作成時のPOST /v1/subaccountsにおけるfeaturesとしても機能します。
  • チャネルタイプとチャネル数は別々の制限であり、両方が適用されます。 channels_1 / channels_3 / channels_unlimited接続数を制御し、channel_*のIDはどのタイプかを制御します。上記の例は「最大3接続まで、かつチャットウィジェット、WhatsApp Web、またはInstagramのみ」を意味します。
  • channel_* IDを一切送信しない場合、チャネル制限は適用されません。 これが元の動作であるため、この機能がリリースされた際も既存のクライアントには影響がありませんでした。1つ以上のIDを送信すると、それ以外のすべてはクライアントの「チャネル」ページで「接続」ボタンの代わりにアップグレードの案内が表示され、ロックされた状態になります。クライアントがすでに接続済みのチャネルは引き続き機能します。

プラン階層でチャネルリストを設定し、そのプランを購入したすべてのクライアントに継承させる操作は、ダッシュボードの代理店プラン設定から行います。このエンドポイントは、特定のサブアカウントに対して設定を行うものです。


クライアントのチームメンバー数に正確な上限を設定する

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/subaccountsusage_limits.team_seats_limit と同じセマンティクスを受け入れます。GET /v1/subaccounts?email=... でサブアカウントを取得し、usage_limits.team_seats_limit を確認することで現在の値を読み取れます(存在しない場合や null の場合は、プリセットの設定が適用されます)。同じエンドポイントで creditsmonthly_creditsroll_over_to_next_monthrollover_cap_monthsrollover_expiry_daysbyok_monthly_limit_usd も更新できます。変更したいキーのみを送信してください。

SaaSプランのシート制限との相互作用について。 SaaSプランには独自のシート許容量を設定できます(プランエディターで設定します。詳細はプランのチームシートを参照してください)。これはクライアントがサブスクライブした際に自動的に適用されます。このエンドポイントを通じて設定した制限は、手動付与としてカウントされます。プランを購入すると、そのプラン独自のシート許容量に置き換わります(その購入は明示的なプランの選択であるため)。しかし、無人で行われる月次の更新によって手動制限が上書きされることはありません。そのため、クライアントに付与した一度限りの例外設定は、請求サイクルをまたいでも維持されます。nullを使用して手動制限を解除すると、次回の更新時にプランの設定が再び適用されるようになります。

クライアントが更新の間に持ち越せる量を制限します。 roll_over_to_next_month の隣にさらに2つの usage_limits キーがあります。どちらも作成時に POST /v1/subaccounts で受け入れられ、null を指定するといずれもクリアされます。

キー 機能
rollover_cap_months クライアントが保持できる許容量(月数)。0から120の数値で、小数も指定可能です(0.5 は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 に加え、クライアントごとに設定可能なスイッチがさらに8つあります。それぞれURL内でサブアカウントのuidを使用し(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_tiersstandardeconomymaxmini から抽出された配列であり、クライアントの許可リストを置き換えます。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 が1回だけ送信されます(最大500文字、すべてのチャネルでそのまま送信)。クレジットが回復すると、AIはその会話に対して実際に応答します。enabled: false は保存されたテキストを保持します。enabled: falsemessage を指定せずに送信すると、設定が削除されます。これはサブアカウントの編集モーダルにある Holding reply when out of credits(クレジット不足時の保留返信)と同じスイッチです。クライアントのクレジットが不足している間の保留返信 を参照してください。

クライアントがAIアクションごとに支払う料金とWhatsApp手数料のマークアップ

クライアント向けの料金を設定するには、最もシンプルな方法から最も詳細な方法まで、2つの方法があります。

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 は、MaxモデルのAIアクションごとにサブアカウント自身の残高から消費されるクレジット価格であり、プールが実際に支払う金額に上乗せするクライアント向けのマークアップです。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 はクライアントの既存のマップに対するマージ(結合)です。指定しなかったキーはそのまま残り、null はそのキーをデフォルトに戻します。認識されるキーは以下の通りです。

キー 価格
AI_MESSAGE AIの返信
AI_TOOL_USE AIツール呼び出し
EVALUATION_CALL チャット評価パス
INTERRUPTION_HANDLING 返信途中の中断処理
CONTACT_TAG AIが割り当てた連絡先タグ
CHAT_SUMMARY チャットの要約
wa_carrier_multiplier クライアントが支払うAI以外のWhatsApp手数料(月額番号レンタル料、管理レーン配信手数料、Meta/Twilioテンプレートのパススルーコスト)すべてに適用されるマークアップ乗数

アクションごとのレートは0より大きく10以下の数値である必要があります。wa_carrier_multiplierは少なくとも1(原価を下回る割引は不可)であり、最大10までとなります。認識されないキーや範囲外の値を送信するとリクエスト全体が拒否され、問題のあるすべてのキーが指摘されるため、タイプミスによって実際には適用されない価格が保存されてしまうことはありません。

Champions Circleメンバーの場合、insider-rateは20%オフのMax/Lead Finderレートをエージェンシー全体に適用するのではなく、1つのクライアントにのみ適用します:

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メンバーシップを保持している必要があります。無効にする場合はその必要がないため、メンバーシップが失効した状態でも、いつでもクライアントの設定を元に戻すことができます。

クライアントのプレイブックのセクションをロックする

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_fieldsinstructionsgoalrulespersonalityconclude_unlessから構成される配列であり、クライアントのロックリストを置き換えます。サブアカウント自身が(直接、または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(ブール値)と、emailin_appwebhookから最大3つのchannelsを受け付けます。プラットフォームのデフォルトにリセットするにはnullを送信してください。

7つのエンドポイントはすべて { "success": true, "data": { "subAccountUid": "...", ...the field(s) you set... } } を返し、変更前後の値が監査ログに記録されます。一般的なエラー: アカウントが Agency/Dev ではない、またはサブアカウントが管理対象外の場合は 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返信が直ちに再開されます。

知っておくべきこと:

  • ダッシュボードの「ハードブロック」トグルと同じ状態です (サブアカウントのブロック/一時停止)。API経由で一時停止されたクライアントはダッシュボード上でブロック中として表示され、その逆も同様です。また、どちら側から行われたブロックであっても、一時停止を解除すればブロックは解除されます。現在の状態は、GET /v1/subaccounts"none""soft_blocked"、または"hard_blocked"level)のagency_blockフィールドから読み取ることができます。
  • どちらの呼び出しもべき等です。 すでに一時停止されているクライアントを一時停止しても、メッセージ、理由、タイムスタンプが更新されるだけです。アクティブなクライアントの停止を解除しても何も変更されません。
  • クライアントに自動的にメールは送信されません。 多くの代理店がホワイトラベルを利用しているため、クライアントへの通知は代理店側で行う必要があります。
  • お客様自身のDM Champの請求には影響しません。 クライアントの一時停止は、お客様とクライアント間の関係にのみ影響します。
  • AIアシスタントもこれを行うことができます。 MCPサーバーは、これらのエンドポイントをpause_subaccountおよびunpause_subaccountツールとして公開しています。

クレジットの直接付与または控除

POST /v1/subaccounts/credits

サブアカウントの残高に対して正確な量のクレジットを追加または削除します。これはダッシュボードの手動クレジット調整のAPI版です。PUT /v1/subaccounts/{subAccountUid}/limits にある定期的な monthly_creditsroll_over_to_next_monthrollover_cap_monthsrollover_expiry_days の設定とは異なる、単発の残高変更です。

このページで、サブアカウントを sub_account_id ではなく メールアドレス で識別する唯一のエンドポイントです。

フィールド 必須 説明
email はい エージェンシー配下に存在するサブアカウントのメールアドレス。
amount はい 0以外のクレジット数。正の数は追加、負の数は控除となります。
description いいえ クライアントのクレジット履歴で調整内容として表示されます。デフォルトは「Adjusted by agency via API(エージェンシーが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
  }
}

残高がゼロを下回るような負の amount400 で拒否され、利用可能な残高と差し引こうとした額が通知されます。クライアントが独自の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 いいえ 1ページあたりの連絡先数。デフォルトは25、最大は50です。
lastActivityAt いいえ ページネーションカーソル — 前のページの 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"
  }
}

連絡先は、アクティビティの新しい順に並べ替えられます。hasMoretrue である間は、lastActivityAt を使用してページングを続けてください。

特定の連絡先のメッセージを読み取る

curl "https://api.dmchamp.com/v1/subaccounts/SUB_ACCOUNT_UID/chats/contact456/messages?apiKey=YOUR_AGENCY_API_KEY&pageSize=30"
クエリパラメータ 必須 説明
pageSize いいえ 1ページあたりのメッセージ数。デフォルトは30、最大100です。
beforeTimestamp いいえ ページネーションカーソル — この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

管理しているすべてのサブアカウントを対象とした2つのダッシュボード形式の集計機能です。クライアントごとに個別にクリックして確認するのではなく、独自の代理店用レポートを構築するために使用できます。

クレジット使用状況

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 いいえ 省略すると代理店全体の概要がサブアカウントごとに1行で表示されます。指定すると詳細モードに切り替わり、そのサブアカウントの概要と、生のページネーションされた使用記録が表示されます。
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 も含まれます。これには amountreasoncampaignNamecontactNametimestamp を含む個別の課金情報が含まれます。クライアントがあなたのクレジットではなく独自のBYOKキーで支払いを行っている場合、コスト/トークンの数値は非表示になります(costsRedacted: true)。これはプラットフォームのコストテレメトリであり、再販業者向けのビューに表示するものではありません。

キャンペーンステータス

curl "https://api.dmchamp.com/v1/subaccounts/campaign-status?apiKey=YOUR_AGENCY_API_KEY&pageSize=20"
クエリパラメータ 必須 説明
pageSize いいえ 1ページあたりのサブアカウント数。デフォルトは10、最大50です。
lastDocumentId いいえ ページネーションカーソル。
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 フラグは、一時停止中のキャンペーンや、ルーティングされたチャネルがないキャンペーンなど、確認が必要なサブアカウントを示します。これを使用して、各クライアントを個別に開いて停滞しているキャンペーンを確認するのではなく、全顧客にわたるヘルスチェックダッシュボードを構築してください。

全クライアントの時系列メッセージングおよびクレジットアクティビティ(時点のスナップショットではなく、チャート作成に適した時系列データ)については、Analytics APIガイドの GET /analytics/agency-rollup を参照してください。


セットアップ済みのクライアントアカウントを配布する

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

スナップショットは再利用可能なテンプレートです。これは、あなたのアカウントから取得した1つ以上のAIエージェントと、そのナレッジベース、ツール、メディアで構成されます。2つのエンドポイントを使用して、プロビジョニングフローに組み込むことができます。

自動 — すべての新規クライアントに適用されます。 スナップショットを一度デフォルトとしてスター登録すると、それ以降に作成されるすべてのアカウントにインストールされた状態で提供されます。これには、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}を送信してください。ダッシュボードのスナップショットページでスターをクリックすることでも同様の操作が可能です。

現在スターが付いているものを読み取るには(例えば、プロビジョニングスクリプトが設定を決定する前など)、GET /v1/snapshots/default{ "success": true, "data": { "default_snapshot_id": "SNAPSHOT_ID" } } を返します。何もスターが付いていない場合は null を返します。GET /v1/snapshots(上記のIDを見つけるために使用)は、同じ default_snapshot_id を完全な snapshots 配列とともに返すため、ほとんどの統合ではこの1回の呼び出しで十分です。完全なスナップショットオブジェクトのフィールドについては、スナップショットガイドを参照してください。

オンデマンド — 特定のアカウントにインストールします。 既存のクライアントのオンボーディングや、後からクライアントに別のテンプレートを提供する場合に便利です。

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キーを使用するツールはすぐに機能し続けます。
  • 2回適用すると2つ目のコピーが作成されます。 何も上書きされません。

API経由でテンプレート自体を構築する

POST /v1/snapshots · API経由のエージェント、カスタム関数、メディア

上記のセクションでは、ダッシュボードで作成されたスナップショットを配布する方法を説明しました。作成側の機能も公開されているため、「マスター設定を一度組み立て、キャプチャし、すべてのクライアントに配布する」という一連のループをコードから実行できます。

プロビジョニングスクリプトで使用する順序で、各要素を説明します。

  1. カスタム関数の作成。 POST /v1/custom-functions で作成し、GET /v1/custom-functions で既存の関数を一覧表示します。GETPUTDELETE/v1/custom-functions/{customFunctionId} に対して使用することで、読み取り、更新、削除が可能です。POST /v1/custom-functions/test は保存前に定義のドライランを行います。
  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 でアイテムをアップロードし(base64DatamimeTypetitledescription を含むJSON)、GET でエージェントのアイテムを一覧表示します。PATCH/DELETE/{itemId} に対して使用して更新や削除を行います。
  5. スナップショットとしてキャプチャ。
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 を受け入れるため、同じ呼び出しを使用して特定のクライアントアカウント内のエージェントを直接管理することも可能です。スナップショットの呼び出しは常にエージェンシーアカウントに対して行われ、テンプレートは管理側に保持されます。これらすべての完全なリクエストおよびレスポンススキーマについては、APIリファレンスを参照してください。


API経由での料金プランの管理

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

SaaSモード → 料金プランで販売するプランは、コードから読み取りや変更が可能です。そのため、貴社の管理パネルやプロビジョニングスクリプトから、ダッシュボードを開くことなくプランの追加、価格の調整、チェックアウトリンクの発行を行うことができます。このページの他のすべての呼び出しと同様に、エージェンシー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(他の3つの呼び出しで指定する値)と、共有可能なcheckout_urlが含まれます。これは支払い**タブで提供されるリンクと同じもので、そのプランが販売されているホワイトラベルドメインを指しています。

プランの追加

リクエストボディは1つのプランオブジェクトであり、リストの末尾に追加されます。

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)。年間プランでは1年分全体の価格。
currency 小文字のISOコード(usdeurgbp など)。
billing_interval / billing_interval_count month(デフォルト)、year、または「N週間ごと」の1〜52のカウントを指定する week
trial_days 無料トライアル期間(0〜90日)。0(または省略)はトライアルなしを意味します。
trial_credits クライアントがトライアル開始時に持つクレジット。デフォルトはプランの credits
trial_card_required false は、カード情報を入力せずにトライアルを開始できるようにします。デフォルトは true
trial_hard_expiry true は、アップグレードなしでトライアルが終了した際に、未使用のトライアルクレジットをプールに戻し、クライアントのアカウントをロックします。デフォルトは falseトライアル後のハード期限切れ を参照してください。
rollover_cap_months このプランのクライアントが更新の間に持ち越せる許容量(月数)。0から120の数値で、小数も指定可能。0 は持ち越しなし。null(デフォルト)は上限なしを意味します。繰越上限の設定 を参照してください。
rollover_expiry_days 次回の更新時に未使用クレジットが削除されるまでの日数(1〜3650の整数)。null(デフォルト)は有効期限なしを意味します。
features / feature_settings このプランのクライアントが利用できる機能。クライアントが接続できるチャネルタイプを選択 と同じ機能ID。
team_seats_limit プランで付与されるチームシート数。正確な数値、なしの場合は 0、無制限の場合は -1
white_label_config このプランが販売される ホワイトラベルドメイン のいずれか。

トライアル関連のフィールドは、トライアルが設定されているプランでのみ有効です。trial_days: 0でティアを保存すると、これらの設定は破棄されます。プランのStripeプロダクトIDおよび価格IDは自動的に管理されるため、手動で設定することはできません。

正しく設定するための3つのポイント:

  • ティアインデックスは位置を示すものであり、永続的なIDではありません。 プランを削除すると、それ以降のすべてのプランが1つずつ繰り上がります。そのため、変更を行った後は必ずリストを再取得してください。また、ダッシュボードでプランを削除した場合と同様に、公開済みのチェックアウトリンクも再コピーする必要があります。
  • SaaSモードを先に設定する必要があります。 これらのエンドポイントを使用するには、ホワイトラベル設定とStripeキーが保存されたエージェンシーアカウントが必要です。これらがない場合、プランのプロダクトや価格を紐付けるStripeアカウントが存在しません。
  • プラン数は最大20個までです。 これはダッシュボードと同じ制限です。リストレスポンス内の max_tiers フィールドで現在の制限を確認できます。

完全なリクエストおよびレスポンスのスキーマは、APIリファレンス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 は、その通貨でプラットフォームが許可する最低価格であるため、ジョブは新しい価格を送信する前に確認を行うことができます。価格が設定されるまで、これら3つの値はすべて 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文字のオプションのテキストです。*「USD 0.25 per credit at our reference rate(基準レートで1クレジットあたり0.25米ドル)」*のように、他通貨での参考価格を表示するのに便利です。"note": "" を送信すると削除されます。レスポンスは上記の読み取りと同じ形式であるため、ジョブは比較を行い、変更がない場合は書き込みをスキップすることができます。

ダッシュボードと同じルールが適用されます。価格はその通貨のプラットフォーム最低価格を下回ることはできず、アカウントにはホワイトラベル設定が必要です。価格ティアのエンドポイントとは異なり、この値を読み取ったり変更したりするためにStripeキーは必要ありません。

他の操作ができないキーをジョブに付与する

スケジューラーにエージェンシーのフルキーを入力することは、価格更新に必要な権限以上のアクセス権を与えることになります。代わりに、Agency Credit Price(エージェンシーのクレジット価格)エリアに限定されたスコープ付きキーを作成してください。このキーはクレジット単価の読み取りと変更のみが可能で、それ以外の操作(サブアカウント、プラン、クレジット、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 ID、max_tiers など)は除外されます。これは、エージェンシーとリンクされたサブアカウントである場合にのみ機能します。貴社自身のエージェンシーアカウントから呼び出すと、権限エラーが返されます。


注意事項

  • エージェンシーキーを使用してください。 すべての呼び出しは、サブアカウントのAPIキーではなく、エージェンシーアカウントのAPIキーで認証してください。sub_account_id パラメータがアクションの転送先を指定します。
  • クレジットはサブアカウントから消費されます。 購入や定期的な請求は、あなたのアカウントではなく、対象となるサブアカウントのクレジット残高に適用されます。
  • 404 は「対象外のサブアカウント」を意味します。 IDを再確認し、そのアカウントがあなたが管理しているものであることを確認してください。
  • このパラメータは、受け入れ可能なすべての場所でオプションです。 省略した場合、同じエンドポイントがエージェンシーアカウントに対して機能するため、1つの統合を両方に再利用できます。

関連情報

  • APIアクセス — 認証、ベースURL、エラー、レート制限。
  • サブアカウント — ターゲットにできるアカウントのリストと管理。
  • サブアカウントの自動リチャージ — Webhook + APIを介してサブアカウントにクレジットを付与。
  • キャンペーンAPI — キャンペーンの作成、更新、コピー(完全なフィールドリファレンスを含む)。
  • チャネル接続API — クライアントのチャネルを接続し、キャンペーンにルーティング。
  • Analytics APIガイド(APIセクション内) — エージェンシーのサブアカウントのロールアップおよびその他のすべてのレポートエンドポイント。
  • スナップショット — スナップショットがキャプチャするものと、ダッシュボードでの構築方法。