Communitygithub.com

CraftOS-dev/CraftBot

Zoho CRM API 整合,附帶受管理的 OAuth 認證。管理潛在客戶、聯絡人、帳戶、交易及其他 CRM 記錄。

CraftBot 是什麼?

此技能提供一個完全代理化的介面,用於 Zoho CRM API,並透過 Maton 閘道處理 OAuth 認證生命週期。開發者可以對 CRM 模組(例如潛在客戶、聯絡人、帳戶、交易、任務、通話和活動)執行完整的 CRUD 操作,還能進行記錄搜尋、大量刪除以及中繼資料查閱。此外,它支援組織層級的詳細資料查詢和 CRM 內的使用者管理。該技能預期在 Claude Code、Cursor、Codex 等支援 API 呼叫的 AI 代理平台上使用,並仰賴網路連線和有效的 Maton API 金鑰進行認證。其主要價值在於免除開發者直接處理繁瑣的 Zoho OAuth 流程,而是由閘道自動注入認證權杖;同時,它還提供連線管理端點,以處理多個 Zoho 帳戶的授權連線。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/CraftOS-dev/CraftBot/tree/HEAD/skills/zoho-crm

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

Zoho CRM

透過受管理的 OAuth 認證存取 Zoho CRM API。對潛在客戶、聯絡人、帳戶、交易及其他 CRM 模組進行完整的 CRUD 操作,包括搜尋和批次操作。同時支援組織詳細資料、使用者管理及模組中繼資料取得。

快速入門

# 列出潛在客戶
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads?fields=First_Name,Last_Name,Email')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

基本 URL

https://gateway.maton.ai/zoho-crm/crm/v8/{endpoint}

閘道會將請求代理至 www.zohoapis.com/crm/v8,並自動注入您的 OAuth 權杖。

認證

所有請求都需要在授權標頭中提供 Maton API 金鑰:

Authorization: Bearer $MATON_API_KEY

環境變數: 將您的 API 金鑰設為 MATON_API_KEY:

export MATON_API_KEY="YOUR_API_KEY"

取得您的 API 金鑰

  1. 在 maton.ai 登入或建立帳戶
  2. 前往 maton.ai/settings
  3. 複製您的 API 金鑰

連線管理

在 https://ctrl.maton.ai 管理您的 Zoho CRM OAuth 連線。

列出連線

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=zoho-crm&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

建立連線

python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'zoho-crm'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

取得特定連線

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

回應:

{
  "connection": {
    "connection_id": "e55c5bac-241a-4cc8-9db5-50d2cad09136",
    "status": "ACTIVE",
    "creation_time": "2025-12-08T07:20:53.488460Z",
    "last_updated_time": "2026-01-31T20:03:32.593153Z",
    "url": "https://connect.maton.ai/?session_token=...",
    "app": "zoho-crm",
    "metadata": {}
  }
}

在瀏覽器中開啟回傳的 url 以完成 OAuth 授權。

刪除連線

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

指定連線

如果您有多個 Zoho CRM 連線,請使用 Maton-Connection 標頭指定要使用的連線:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads?fields=First_Name,Last_Name,Email')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', 'e55c5bac-241a-4cc8-9db5-50d2cad09136')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

如果省略,閘道會使用預設(最舊的)啟用連線。

API 參考

模組

Zoho CRM 將資料組織成模組。核心模組包括:

模組API 名稱說明
潛在客戶Leads潛在客戶
聯絡人Contacts個人
帳戶Accounts組織/公司
交易Deals銷售機會
行銷活動Campaigns行銷活動
任務Tasks待辦事項
通話Calls通話記錄
活動Events日曆約會
產品Products您銷售的項目

列出記錄

GET /zoho-crm/crm/v8/{module_api_name}?fields={field1},{field2}

查詢參數:

參數類型說明
fieldsstring必要。 逗號分隔的欄位 API 名稱(最多 50 個)
pageinteger頁碼(預設:1)
per_pageinteger每頁記錄數(預設/最多:200)
sort_bystring排序依據:id、Created_Time 或 Modified_Time
sort_orderstringasc 或 desc(預設)
cvidlong自訂檢視 ID
page_tokenstring用於超過 2000 條記錄的分頁

範例 - 列出潛在客戶:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads?fields=First_Name,Last_Name,Email,Phone,Company')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

回應:

{
  "data": [
    {
      "First_Name": "Christopher",
      "Email": "[email protected]",
      "Last_Name": "Maclead (Sample)",
      "Phone": "555-555-5555",
      "Company": "Rangoni Of Florence",
      "id": "7243485000000597000"
    }
  ],
  "info": {
    "per_page": 200,
    "count": 1,
    "page": 1,
    "sort_by": "id",
    "sort_order": "desc",
    "more_records": false,
    "next_page_token": null
  }
}

範例 - 列出聯絡人:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Contacts?fields=First_Name,Last_Name,Email,Phone')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

範例 - 列出帳戶:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Accounts?fields=Account_Name,Website,Phone')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

範例 - 列出交易:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Deals?fields=Deal_Name,Stage,Amount')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

取得單筆記錄

GET /zoho-crm/crm/v8/{module_api_name}/{record_id}

範例:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads/7243485000000597000')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

建立記錄

POST /zoho-crm/crm/v8/{module_api_name}
Content-Type: application/json

{
  "data": [
    {
      "field_api_name": "value"
    }
  ]
}

各模組的必要欄位:

模組必要欄位
潛在客戶Last_Name
聯絡人Last_Name
帳戶Account_Name
交易Deal_Name, Stage
任務Subject
通話Subject, Call_Type, Call_Start_Time, Call_Duration
活動Event_Title, Start_DateTime, End_DateTime

範例 - 建立潛在客戶:

python <<'EOF'
import urllib.request, os, json
data = json.dumps({
    "data": [{
        "Last_Name": "Smith",
        "First_Name": "John",
        "Email": "[email protected]",
        "Company": "Acme Corp",
        "Phone": "+1-555-0123"
    }]
}).encode()
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

回應:

{
  "data": [
    {
      "code": "SUCCESS",
      "details": {
        "Modified_Time": "2026-02-06T01:10:56-08:00",
        "Modified_By": {
          "name": "User Name",
          "id": "7243485000000590001"
        },
        "Created_Time": "2026-02-06T01:10:56-08:00",
        "id": "7243485000000619001",
        "Created_By": {
          "name": "User Name",
          "id": "7243485000000590001"
        }
      },
      "message": "record added",
      "status": "success"
    }
  ]
}

範例 - 建立聯絡人:

python <<'EOF'
import urllib.request, os, json
data = json.dumps({
    "data": [{
        "Last_Name": "Doe",
        "First_Name": "Jane",
        "Email": "[email protected]",
        "Phone": "+1-555-9876"
    }]
}).encode()
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Contacts', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

範例 - 建立帳戶:

python <<'EOF'
import urllib.request, os, json
data = json.dumps({
    "data": [{
        "Account_Name": "Acme Corporation",
        "Website": "https://acme.com",
        "Phone": "+1-555-1234"
    }]
}).encode()
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Accounts', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

更新記錄

PUT /zoho-crm/crm/v8/{module_api_name}
Content-Type: application/json

{
  "data": [
    {
      "id": "record_id",
      "field_api_name": "updated_value"
    }
  ]
}

範例:

python <<'EOF'
import urllib.request, os, json
data = json.dumps({
    "data": [{
        "id": "7243485000000619001",
        "Phone": "+1-555-9999",
        "Company": "Updated Company Name"
    }]
}).encode()
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads', data=data, method='PUT')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

回應:

{
  "data": [
    {
      "code": "SUCCESS",
      "details": {
        "Modified_Time": "2026-02-06T01:11:01-08:00",
        "Modified_By": {
          "name": "User Name",
          "id": "7243485000000590001"
        },
        "Created_Time": "2026-02-06T01:10:56-08:00",
        "id": "7243485000000619001",
        "Created_By": {
          "name": "User Name",
          "id": "7243485000000590001"
        }
      },
      "message": "record updated",
      "status": "success"
    }
  ]
}

刪除記錄

DELETE /zoho-crm/crm/v8/{module_api_name}?ids={record_id1},{record_id2}

查詢參數:

參數類型說明
idsstring逗號分隔的記錄 ID(必要,最多 100 個)
wf_triggerboolean是否觸發工作流程(預設:true)

範例:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads?ids=7243485000000619001', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

回應:

{
  "data": [
    {
      "code": "SUCCESS",
      "details": {
        "id": "7243485000000619001"
      },
      "message": "record deleted",
      "status": "success"
    }
  ]
}

搜尋記錄

GET /zoho-crm/crm/v8/{module_api_name}/search

查詢參數(擇一必要):

參數類型說明
criteriastring搜尋條件(例如 (Last_Name:equals:Smith))
emailstring依電子郵件地址搜尋
phonestring依電話號碼搜尋
wordstring全域文字搜尋
pageinteger頁碼
per_pageinteger每頁記錄數(最多 200 筆)

條件格式: ((field_api_name:operator:value) and/or (...))

運算子:

  • 文字欄位:equals、not_equal、starts_with、in
  • 日期/數字欄位:equals、not_equal、greater_than、less_than、between、in
  • 布林欄位:equals、not_equal

範例 - 依電子郵件搜尋:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/zoho-crm/crm/v8/Leads/[email protected]')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

範例 - 依條件搜尋:

python <<'EOF'
import urllib.request, os, json
import urllib.parse
criteria = urllib.parse.quote('(Last_Name:starts_with:Smith)')
req = urllib.request.Request(f'https://gateway.maton.ai/zoho-crm/crm/v8/Leads/search?criteria={criteria}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

回應:

{
  "data": [
    {
      "First_Name": "Christopher",
      "Email": "[email protected]",
      "Last_Name": "Maclead (Sample)",
      "id": "7243485000000597000"
    }
  ],
  "info": {
    "per_page": 200,
    "count": 1,
    "page": 1,
    "more_records": false
  }
}

組織詳細資料

...

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相關技能