Communitygithub.com

Zoho CRM

Zoho CRM API 통합 및 OAuth 관리. 리드, 연락처, 계정, 거래 및 기타 CRM 레코드를 관리합니다.

Zoho CRM란 무엇인가요?

이 스킬은 Zoho CRM API를 통해 리드, 연락처, 계정, 거래 및 기타 CRM 모듈에 대한 완전한 CRUD(생성, 읽기, 업데이트, 삭제) 작업을 지원하며, 검색 및 대량 작업도 포함합니다. 또한 조직 세부 정보, 사용자 관리, 모듈 메타데이터 검색을 지원합니다. Maton 게이트웨이(gateway.maton.ai)를 통해 OAuth 인증이 관리되어 사용자가 직접 토큰을 관리할 필요 없이 안전하게 API를 호출할 수 있습니다. Claude Code, Cursor 등 다양한 AI 에이전트 플랫폼에서 사용 가능하며, 사용 시 네트워크 액세스와 유효한 Maton API 키가 필요합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/CraftOS-dev/CraftBot/tree/HEAD/skills/zoho-crm

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Zoho CRM은(는) 무엇을 하나요?

관리되는 OAuth 인증으로 Zoho CRM API에 액세스하세요. 검색 및 대량 작업을 포함한 전체 CRUD 작업으로 리드, 연락처, 계정, 거래 및 기타 CRM 모듈을 관리하세요. 또한 조직 세부 정보, 사용자 관리 및 모듈 메타데이터 검색을 지원합니다.

빠른 시작

# 리드 목록 조회
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 토큰을 자동으로 주입합니다.

인증

모든 요청은 Authorization 헤더에 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}

쿼리 매개변수:

매개변수유형설명
fields문자열필수. 쉼표로 구분된 필드 API 이름 (최대 50개)
page정수페이지 번호 (기본값: 1)
per_page정수페이지당 레코드 수 (기본값/최대: 200)
sort_by문자열정렬 기준: id, Created_Time, 또는 Modified_Time
sort_order문자열asc 또는 desc (기본값)
cvidlong사용자 정의 보기 ID
page_token문자열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": "사용자 이름",
          "id": "7243485000000590001"
        },
        "Created_Time": "2026-02-06T01:10:56-08:00",
        "id": "7243485000000619001",
        "Created_By": {
          "name": "사용자 이름",
          "id": "7243485000000590001"
        }
      },
      "message": "레코드 추가됨",
      "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": "업데이트된 회사 이름"
    }]
}).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": "사용자 이름",
          "id": "7243485000000590001"
        },
        "Created_Time": "2026-02-06T01:10:56-08:00",
        "id": "7243485000000619001",
        "Created_By": {
          "name": "사용자 이름",
          "id": "7243485000000590001"
        }
      },
      "message": "레코드 업데이트됨",
      "status": "success"
    }
  ]
}

레코드 삭제

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

쿼리 매개변수:

매개변수유형설명
ids문자열쉼표로 구분된 레코드 ID (필수, 최대 100개)
wf_trigger부울워크플로 실행 (기본값: 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": "레코드 삭제됨",
      "status": "success"
    }
  ]
}

레코드 검색

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

쿼리 매개변수 (하나 필수):

매개변수유형설명
criteria문자열검색 기준 (예: (Last_Name:equals:Smith))
email문자열이메일 주소로 검색
phone문자열전화번호로 검색
word문자열전체 텍스트 검색
page정수페이지 번호
per_page정수페이지당 레코드 수 (최대 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.

관련 스킬