amoCRM API v4 — это современный REST API с поддержкой OAuth 2.0 и вебхуков. Он предоставляет полный доступ ко всем сущностям CRM.
Категории методов amoCRM API v4:
1. Контакты (contacts):
- GET /api/v4/contacts — список контактов с фильтрацией
- POST /api/v4/contacts — создание контактов (до 500 за запрос)
- PATCH /api/v4/contacts — обновление контактов
- GET /api/v4/contacts/{id} — получение контакта по ID
2. Компании (companies):
- GET /api/v4/companies — список компаний
- POST /api/v4/companies — создание компаний
- PATCH /api/v4/companies — обновление компаний
3. Сделки (leads):
- GET /api/v4/leads — список сделок с фильтрацией
- POST /api/v4/leads — создание сделок (до 500 за запрос)
- PATCH /api/v4/leads — обновление сделок
- GET /api/v4/leads/pipeline — воронки продаж
4. Воронки чатов (chats):
- POST /api/v4/leads/chats — создание чата
- POST /api/v4/leads/{id}/messages — отправка сообщения
- GET /api/v4/leads/{id}/messages — получение истории
5. Задачи (tasks):
- GET /api/v4/tasks — список задач
- POST /api/v4/tasks — создание задач
- PATCH /api/v4/tasks — обновление задач
6. События и примечания:
- GET /api/v4/leads/{id}/notes — примечания к сделке
- POST /api/v4/leads/{id}/notes — добавление примечания
- GET /api/v4/events — события CRM
7. Пользовательские поля:
- GET /api/v4/leads/custom_fields — поля сделок
- POST /api/v4/leads/custom_fields — создание полей
Технические характеристики amoCRM API v4:
| Параметр | Значение |
|---|
| Тип авторизации | OAuth 2.0 / API Key |
| Формат данных | JSON |
| Лимит запросов | 7 запросов/сек |
| Макс. элементов в запросе | 500 штук |
| Время ответа | 50–500 мс |
| Webhook | Да, для всех сущностей |
| Версия API | v4 (актуальная) |
| Стоимость API | Бесплатно |
Пример авторизации через OAuth 2.0:
1import httpx
2from datetime import datetime, timedelta
3
4class AmoCRMAPI:
5 BASE_URL = "https://{subdomain}.amocrm.ru"
6
7 def __init__(self, subdomain: str, client_id: str, client_secret: str, refresh_token: str):
8 self.subdomain = subdomain
9 self.client_id = client_id
10 self.client_secret = client_secret
11 self.refresh_token = refresh_token
12 self.access_token = None
13 self.token_expires = None
14
15 async def _refresh_access_token(self):
16 """Обновить access_token"""
17 async with httpx.AsyncClient() as client:
18 response = await client.post(
19 f"{self.BASE_URL}/oauth2/access_token",
20 json={
21 "client_id": self.client_id,
22 "client_secret": self.client_secret,
23 "grant_type": "refresh_token",
24 "refresh_token": self.refresh_token,
25 }
26 )
27 data = response.json()
28 self.access_token = data["access_token"]
29 self.refresh_token = data["refresh_token"]
30 self.token_expires = datetime.now() + timedelta(seconds=data["expires_in"] - 60)
31
32 async def _get_headers(self) -> dict:
33 if not self.access_token or datetime.now() >= self.token_expires:
34 await self._refresh_access_token()
35 return {
36 "Authorization": f"Bearer {self.access_token}",
37 "Content-Type": "application/json",
38 }
39
40 async def create_lead(self, name: str, contact_data: dict, pipeline_id: int = None) -> dict:
41 """Создать сделку с контактом"""
42 headers = await self._get_headers()
43
44 # Сначала создаём или находим контакт
45 contact_id = await self._find_or_create_contact(contact_data)
46
47 lead = {
48 "name": name,
49 "contact_id": contact_id,
50 "custom_fields_values": [
51 {"field_id": 1, "values": [{"value": contact_data.get("source", "API")}]}
52 ],
53 }
54 if pipeline_id:
55 lead["pipeline_id"] = pipeline_id
56
57 async with httpx.AsyncClient() as client:
58 response = await client.post(
59 f"{self.BASE_URL}/api/v4/leads",
60 headers=headers,
61 json=[lead],
62 )
63 response.raise_for_status()
64 return response.json()["_embedded"]["leads"][0]
65
66 async def _find_or_create_contact(self, data: dict) -> int:
67 """Найти существующий контакт или создать новый"""
68 headers = await self._get_headers()
69
70 # Поиск по телефону
71 async with httpx.AsyncClient() as client:
72 response = await client.get(
73 f"{self.BASE_URL}/api/v4/contacts",
74 headers=headers,
75 params={"query": data["phone"]},
76 )
77 result = response.json()
78
79 if result.get("_embedded", {}).get("contacts"):
80 return result["_embedded"]["contacts"][0]["id"]
81
82 # Создаём новый контакт
83 async with httpx.AsyncClient() as client:
84 response = await client.post(
85 f"{self.BASE_URL}/api/v4/contacts",
86 headers=headers,
87 json=[{
88 "name": data["name"],
89 "custom_fields_values": [
90 {"field_id": 2, "values": [{"value": data["phone"], "enum_code": "WORK"}]},
91 {"field_id": 3, "values": [{"value": data.get("email", ""), "enum_code": "WORK"}]},
92 ],
93 }],
94 )
95 response.raise_for_status()
96 return response.json()["_embedded"]["contacts"][0]["id"]
Вебхуки amoCRM — мгновенные уведомления:
amoCRM отправляет webhook при каждом событии: создание/обновление контакта, сделки, задачи, смена этапа воронки.
1from fastapi import FastAPI, Request
2
3app = FastAPI()
4
5@app.post("/webhook/amocrm")
6async def handle_amocrm_webhook(request: Request):
7 """Обработка webhook от amoCRM"""
8 data = await request.json()
9
10 for lead in data.get("leads", {}).get("add", []):
11 # Новая сделка — запускаем автоматизацию
12 await process_new_lead(lead)
13
14 for lead in data.get("leads", {}).get("update", []):
15 # Обновление сделки — проверяем смену этапа
16 await check_stage_change(lead)
17
18 for contact in data.get("contacts", {}).get("add", []):
19 # Новый контакт — обогащаем данные
20 await enrich_contact(contact)
21
22 return {"status": "ok"}
Подробнее о возможностях CRM-интеграций читайте в статье интеграция API с CRM.