Описание REST API

Авторизация, методы, примеры работы

REST API в Альфа CRM


Данное описание предназначено для интеграции Альфа CRM с другими информационными сервисами. Мы дополняем этот документ описанием новых методов, моделей и параметров.

Всё взаимодействие через API должно осуществляться по протоколу REST. В качестве формата данных используется JSON. Прочие форматы и протоколы не поддерживаются.

Методы API реализуются в Контроллере (MVC) виде CRUD парадигмы вокруг каждой Модели (MVC). Модель — это отдельная сущность в CRM системе, например Ученик, или Урок, или Филиал под которую реализуется отдельный Контроллер.

Примеры запросов можно посмотреть в приложенных коллекциях Postman

Рекомендации по работе с нашим API:

  1. Создание отдельного пользователя в системе для работы именно с API (особенно актуально, если передаёте информацию с доступами сторонним разработчикам, так как такой доступ всегда можно отключить).
  2. Кеширование токена авторизации (также можно использовать обработку ошибок, чтобы, как только придет ошибка с кодом 401, снова делать запрос на получение токена).
  3. Обработка запросов последовательно:
    • сделайте запрос по API;
    • дождитесь ответа;
    • разберите полученные данные;
    • определитесь, нужно ли отправлять следующий запрос.
  4. Сохранение результатов запросов, чтобы не выгружать одни и те же данные.

По вопросам работы с нашим API можно написать на почту dev@alfacrm.pro. Ответ может занять до 3-5 рабочих дней.


Авторизация


Данные для авторизации можно найти в настройках профиля.

Наведите курсор на правый верхний угол в системе, появится контекстное меню, выберите раздел «Мой профиль».



Скопируйте данные для авторизации из полей «E-mail» и «Ключ API (v2api)».



Прежде чем обращаться к методам CRUD необходимо авторизоваться и получить временный токен. Этим токеном должен подписываться каждый CRUD запрос заголовке X-ALFACRM-TOKEN. Время жизни токена — 3600 секунд. Для получения токена нужно обратиться методом POST к URI /v2api/auth/login, а в теле запроса передать JSON объект с ключами email и api_key.

Авторизующийся пользователь должен иметь роль с предоставленным доступом к модулю v2api. Иначе запросы к CRUD будут возвращать исключение Access Denied.

Пример из командной строки Linux (утилита curl):
$ curl -i -X 'POST' -d '{"email":"{email}","api_key":"{api_key}"}' 'https://{hostname}/v2api/auth/login'
            
//Пример кода на PHP
$ch      = curl_init();
$data    = ['email' => 'ivan@mail.ru', 'api_key' => '123456'];
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Accept: application/json', 'Content-Type: application/json']);
curl_setopt($ch, CURLOPT_URL, 'https://demo.s20.online/v2api/auth/login');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = json_decode(curl_exec($ch), true);
$code   = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (curl_errno($ch))
    throw new \Exception('Curl error');
curl_close($ch);
if ($code !== 200)
    throw new \Exception($result['name'] . ' - ' . $result['message']);
$token = $result['token'];
            

Варианты ответа сервера:

  • ОК, код ответа 200, в теле — JSON вида {"token":"GENERATED-TOKEN"}
  • исключение, код ответа 4XX, 5XX, в теле — JSON вида {"name":"Forbidden","message":"Not Authorized","code":0,"status":403}

Значение некоторых параметров


  • {hostname} — клиентский идентификатор, являющийся Hostname в URL для доступа в систему. Например, для https://demo.s20.online это demo.s20.online;
  • {branch} — ID филиала, в который происходит обращение;
  • {email} — e-mail пользователя для авторизации в системе;
  • {api_key} — ключ API для авторизации в системе;
  • {token} — токен, полученный при авторизации (см. блок Авторизация);

Примеры возвращаемых значений в


CRUD


  • Метод Index — возвращает JSON вида {"total":2,"count":2,"page":0,"items":[]}, где total — количество записей всего, count — количество записей в текущей коллекции items, page — текущая страница результатов выдачи. В items содержится вся коллекция записей в виде объектов различных моделей.
  • Методы Create и Update — возвращает JSON вида {"success":true,"errors":[],"model":{"id":1,...}}, где success — результат выполнения запроса (true / false), errors — коллекция ошибок если success == false, model — JSON объект Модели с публичными свойствами.
  • Метод Delete — возвращает JSON вида {"success":true,"errors":[]}, где success — результат выполнения запроса (true / false), errors — коллекция ошибок если success == false.

Branch — сущность филиала

POST на /v2api/branch/index в теле {"is_active":1,"page":0}
is_active — поле для фильтрации, page — пейджинация

Важно! Если в системе отключен филиал с ID 1, то в запросе необходимо указывать ID филиала, который активен в момент отправки запроса. Например: /v2api/2/branch/index
Пример из командной строки Linux (утилита curl):
$ curl -i -X 'POST' -H 'X-ALFACRM-TOKEN: {token}' -d '{"is_active":1,"page":0}' 'https://{hostname}/v2api/branch/index'
                            
Пример на PHP:
$ch     = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-ALFACRM-TOKEN: {token}', 'Accept: application/json', 'Content-Type: application/json']);
curl_setopt($ch, CURLOPT_URL, 'https://{hostname}/v2api/branch/index');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"is_active":1,"page":0}');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = json_decode(curl_exec($ch), true);
$code   = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (curl_errno($ch))
    throw new \Exception('Curl error');
curl_close($ch);
if ($code !== 200)
    throw new \Exception($result['name'] . ' - ' . $result['message']);
var_dump($result);
                            

Location — сущность локации

id
int
идентификатор
branch_id
int
филиал (Branch)
is_active
bool
флаг активности
name
string(50)
наименование

Customer — центральная сущность

POST на /v2api/{branch}/customer/index в теле {"is_study":0,"lead_status_ids":[1],"page":0}
lead_status_ids — поле для фильтрации,is_study — поле для фильтрации 0 - лид, 1 - клиент, 2 фильтрация по клиентам и лидам, page — пейджинация

Важно! При использовании дополнительной фильтрации по статусу клиента или по этапу воронки продаж, фильтр будет работать как логическое "И", а не "ИЛИ" (например, если укажем в теле запроса {"is_study":2,"phone":79900000000,"lead_status_id":1}, в ответ получим только лидов с номером телефона 79900000000 и с соответствующим id этапа воронки продаж 1).
В Body параметры для фильтрации:
{
    id // id клиента
    is_study // состояние клиента ( 0 - лид, 1 - клиент)
    study_status_id // id статуса клиента
    name // имя клиента
    gender // пол клиента
    age_from // возраст клиента от
    age_to // возраст клиента до
    phone // контакты клиента
    legal_type // тип заказчика(1-физ лицо, 2-юр.лицо)
    legal_name // имя заказчика
    company_id // id юр лица
    lesson_count_from // остаток уроков от
    lesson_count_to // остаток уроков до
    balance_contract_from // баланс договора от
    balance_contract_to // баланс договора до
    balance_bonus_from // баланс бонусов от
    balance_bonus_to // баланс бонусов до
    removed // флаг архивности (2 - только архивные, 1 - активные и архивные, 0 – только активные)
    removed_from // дата отправки в архив от, date
    removed_to // дата отправки в архив, date
    level_id // id уровня знаний
    assigned_id // id ответственного менеджера
    employee_id // id ответственного педагога
    lead_source_id // id источника
    color // id цвета
    note // примечание, string
    date_from // дата добавления от, string
    date_to // дата добавления до, string
    next_lesson_date_from // дата след.посещения, от, string (формат "YYYY-MM-DD")
    next_lesson_date_to // дата след.посещения до, string (формат "YYYY-MM-DD")
    last_attend_date_from // дата последнего посещения от, string (формат "YYYY-MM-DD")
    last_attend_date_to //   дата последнего посещения до, string (формат "YYYY-MM-DD")
    tariff_till_from // дата действия абонемента от
    tariff_till_to // дата действия абонемента до
    customer_ reject_id // id причины отказа
    comment // комментарий
    dob_from // дата рождения от
    dob_to // дата рождения до
    withGroups:true //активные группы клиента
    updated_at_from – дата внесения последних изменений  от, string (формат "DD.MM.YYYY")
    updated_at_to – дата внесения последних изменений до, string (формат "DD.MM.YYYY")
    created_at_from – дата создания от, string (формат "DD.MM.YYYY")
    created_at_to – дата создания до, string (формат "DD.MM.YYYY")
}
                                    
Пример из командной строки Linux (утилита curl):
$ curl -i -X 'POST' -H 'X-ALFACRM-TOKEN: {token}' -d '{"is_study":0,"lead_status_id":1,"page":0}' 'https://{hostname}/v2api/{branch}/customer/index'
                                
Пример на PHP:
$ch     = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-ALFACRM-TOKEN: {token}', 'Accept: application/json', 'Content-Type: application/json']);
curl_setopt($ch, CURLOPT_URL, 'https://{hostname}/v2api/{branch}/customer/index');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"is_study":0,"lead_status_id":1,"page":0}');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = json_decode(curl_exec($ch), true);
$code   = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (curl_errno($ch))
    throw new \Exception('Curl error');
curl_close($ch);
if ($code !== 200)
    throw new \Exception($result['name'] . ' - ' . $result['message']);
var_dump($result);
                                
id
int
идентификатор
name
string(50)
полное имя
branch_ids
int array
массив идентификаторов филиалов (Branch)
teacher_ids
int array
массив идентификаторов педагогов (Teacher)
is_study
bool
флаг обучения (0 - лид, 1 - клиент)
study_status_id
int
статус обучения (StudyStatus)
lead_status_ids
int array
этап воронки продаж (LeadStatus)
lead_source_id
int
источник (LeadSource)
assigned_id
int
ответственный менеджер (User)
legal_type
int
тип клиента (1 - физ. лицо, 2 - юр. лицо)
legal_name
string(50)
имя заказчика (если физ. лицо)
company_id
int
компания (Company)
dob
date
дата рождения
balance
float
текущий остаток, деньги
paid_lesson_count
int
текущий остаток, занятия
phone
text array
массив с телефонами
email
text array
массив с e-mail
web
text array
массив с сайтами
addr
text array
массив с адресами
note
text
примечание
updated_at
string
дата обновления("DD.MM.YYYY")
created_at
string
дата добавления ("DD.MM.YYYY")
custom_
...
доп. поля (custom_school, custom_range, etc)

Bonus— сущность бонусов

branch_id
int
id филиала
customer_id
int
id клиента
amount
int
количество бонусов
date
string
дата добавления/списания бонусов
note
string
примечание
calc_balance_bonus
float
полученный результат бонусов
balance_bonus
float
баланс бонусов
type
int
тип списания (1 - списание бонусов, 2 - выдача товара, 3 - компенсация на счет)
commodity_id
int
id товара, указывается при выдаче товара (тип списания 2 - выдача товара)


Group — сущность групп

POST на /v2api/{branch}/group/index в теле {"id":1,"page":0}
page — пейджинация
В Body параметры для фильтрации:
{
  "ids" // id групп, array[int]
  "id" // id группы, int
  "name" //название группы, string
  "note" // примечание, string
  "customer_name" // имя клиента, string
  "removed" //активность группы(активна 0, все 1, архивна 2), int
  "level_id" // id уровня группы, int
  "status_id"// id статуса группы, int
  "branch_id"// id филиала, int
  "b_date_from"// дата начала действия группы от, date
  "b_date_to" // дата начала действия группы до, date
  "e_date_from" // дата окончания действия группы от, date
  "e_date_to" //  дата окончания действия группы до date
  "teacher_id"// id ответственного педагога, int
  "updated_at_from" // дата внесения последних изменений от, string (формат "DD.MM.YYYY")
  "updated_at_to" // дата внесения последних изменений до, string (формат "DD.MM.YYYY")
  "created_at_from" // дата создания от, string (формат "DD.MM.YYYY")
  "created_at_to" // дата создания до, string (формат "DD.MM.YYYY")
}
                                        
Пример из командной строки Linux (утилита curl):
$ curl -i -X 'POST' -H 'X-ALFACRM-TOKEN: {token}' -d '{"customer_id":1,"page":0}' 'https://{hostname}/v2api/{branch}/group/index'
                                    
Пример на PHP:
$ch     = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-ALFACRM-TOKEN: {token}', 'Accept: application/json', 'Content-Type: application/json']);
curl_setopt($ch, CURLOPT_URL, 'https://{hostname}/v2api/{branch}/group/index');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"customer_id":1,"page":0}');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = json_decode(curl_exec($ch), true);
$code   = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (curl_errno($ch))
    throw new \Exception('Curl error');
curl_close($ch);
if ($code !== 200)
    throw new \Exception($result['name'] . ' - ' . $result['message']);
var_dump($result);
                                    

Lesson — сущность урока

POST на /v2api/{branch}/lesson/index в теле {"id":1,"page":0}
page — пейджинация
Важно! Если параметр status не передавать, по умолчанию status установлен как 3 - проведенный урок.
В Body параметры для фильтрации:
{
  "id" // id урока, int
  "status" // статус урока (1 - запланированный, 2 - отмененный, 3 - проведенный), int
  "teacher_id" // id педагога, int
  "customer_id" // id клиента, int
  "is_customer_attend" // присутствие клиента, int
  "group_id" // id группы, int
  "subject_id" // id предмета, int
  "location_ids // id локации, array[int],
  "room_ids" // id аудитории, array[int],
  "topic" // тема урока, string,
  "lesson_type_id" //id типа урока, int
  "date_from" // дата от, string, (формат "YYYY-MM-DD")
  "date_to" //дата до,string, (формат "YYYY-MM-DD")
  "homework" // домашнее задание, string,
  "duration" // продолжительность, int
  "updated_at_from" // дата внесения последних изменений от, string (формат "DD.MM.YYYY")
  "updated_at_to" // дата внесения последних изменений до, string (формат "DD.MM.YYYY")
  "created_at_from" // дата создания от, string (формат "DD.MM.YYYY")
  "created_at_to" // дата создания до, string (формат "DD.MM.YYYY")
}
                                        
Пример из командной строки Linux (утилита curl):
$ curl -i -X 'POST' -H 'X-ALFACRM-TOKEN: {token}' -d '{"customer_id":1,"page":0}' 'https://{hostname}/v2api/{branch}/lesson/index'
                                    
Пример на PHP:
$ch     = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-ALFACRM-TOKEN: {token}', 'Accept: application/json', 'Content-Type: application/json']);
curl_setopt($ch, CURLOPT_URL, 'https://{hostname}/v2api/{branch}/lesson/index');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"customer_id":1,"page":0}');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = json_decode(curl_exec($ch), true);
$code   = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (curl_errno($ch))
    throw new \Exception('Curl error');
curl_close($ch);
if ($code !== 200)
    throw new \Exception($result['name'] . ' - ' . $result['message']);
var_dump($result);
                                    
id
int
идентификатор
branch_id
int
id филиала (Branch)
teacher_ids
array[int]
id педагогов
customer_ids
array[int]
id клиентов
group_ids
array[int]
id групп
name
string
название
lesson_type_id
int
id типа урока
subject_id
int
id предмета
regular_id
int
id регулярного расписания
room_id
int
id аудитории
status
int
id статуса
topic
string
тема
date
string
дата
time_from
string
время начала урока
time_to
string
время окончания урока
note
string
комментарий
details
array
детали проведенного урока
updated_at
string
дата обновления ("DD.MM.YYYY")
created_at
string
дата добавления ("DD.MM.YYYY")

CGI — связь клиенты-группы

Subject — предметы обучения

StudyStatus — статусы обучения

LeadStatus — этапы воронки продаж

id
int
идентификатор
name<
string(50)
наименование
is_enabled
bool
флаг активности

LeadSource — источники

Pay — платежи

id
int
идентификатор
branch_id
int
id филиала (Branch)
location_id
int
id локации (Location)
customer_id
int
id клиента (Customer)
pay_type_id
int
id типа платежа (PayType)
pay_account_id
int
id кассы (PayAccount)
pay_item_id
int
id статьи (PayItem)
teacher_id
int
id педагога (Teacher)
commodity_id
int
id товара (Commodity)
document_date
string
дата
income
int
сумма
payer_name
string
плательщик
group_id
int
id группы, к которой привязан платеж
updated_at
string
дата обновления ("DD.MM.YYYY")
created_at
string
дата добавления ("DD.MM.YYYY")
note
string
примечание

Communication — коммуникации

POST на /v2api/{branch}/phone-call в теле {"page":0}
page — пейджинация
В Body параметры для фильтрации:
{
  "direction" // id направление звонка, может быть либо in (1) либо out (2), int
  "is_success" // id успешность звонка (0 или 1), 
  "local_number" // string локальный номер звонящего / принявшего звонок, string
  "remote_number" // string номер звонящего в случае входящего звонка, или исходящий номер, string
  "record_url" // string ссылка на запись звонка, string
  "date_from" // string дата звонка от, string
  "date_to" // string дата звонка до, string
}
                                        
Пример из командной строки Linux (утилита curl):
$ curl -i -X 'POST' -H 'X-ALFACRM-TOKEN: {token}' -d '{"page":0}' 'https://{hostname}/v2api/{branch}/phone-call'
                                    

CustomerTariff — получение списка


абонементов клиента

Discount — сущность скидок

Log — получение списка истории


изменений

RegularLesson — сущность


регулярных уроков

Tariff — сущность абонемента

Task — сущность задач

id
int
идентификатор
company_id
int
id связанной компании
user_id
int
id пользователя, создавшего задачу
assigned_ids
array[int]
id участников задачи
group_ids
array[int]
id прикрепленных групп
customer_ids
array[int]
id прикрепленных клиентов
title
string
заголовок задачи
text
string
текст задачи
is_archive
bool
флаг архивности
is_done
bool
флаг завершенности
is_private
bool
флаг приватности
created_at
string
дата создания
due_date
string
дата дедлайна
done_date
string
дата завершения
priority
int
приоритет (1-низкий, 2 – нормальный, 3 –высокий)

Teacher — сущность педагога

POST на /v2api/{branch}/teacher/working-hour в теле {"page":0}
page — пейджинация
В Body параметры для фильтрации:
{
    "id" // id графика работы педагога, int,
    "location_id" // id локации, в которой работает педагог, int,
    "weekday" // день недели графика работы, int,
    "time_from" // время начала работы (формат "HH:MM"), string,
    "time_to" // время окончания работы (формат "HH:MM"), string,
    "teacher_id" // id педагога, int
}
                                            
POST на /v2api/{branch}/teacher/update?id={id} в теле {"note":"text"}
Пример из командной строки Linux (утилита curl):
$ curl -i -X 'POST' -H 'X-ALFACRM-TOKEN: <strong>{token}</strong>' -d '{"note":"text"}' 'https://<strong>{hostname}</strong>/v2api/<strong>{branch}</strong>/task/teacher?id=<strong>{id}</strong>'
                                            
Пример на PHP:
$ch     = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-ALFACRM-TOKEN: <strong>{token}</strong>', 'Accept: application/json', 'Content-Type: application/json']);
curl_setopt($ch, CURLOPT_URL, 'https://<strong>{hostname}</strong>/v2api/<strong>{branch}</strong>/task/teacher?id=<strong>{id}</strong>');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"note":"text"}');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = json_decode(curl_exec($ch), true);
$code   = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (curl_errno($ch))
    throw new \Exception('Curl error');
curl_close($ch);
if ($code !== 200)
    throw new \Exception($result['name'] . ' - ' . $result['message']);
var_dump($result);
                                            
id
int
идентификатор
branch_ids
array[int]
id филиалов (Branch)
name
string
имя педагога
dob
string
день рождения
gender
int
пол
e_date
string
дата архивации педагога
subject_id
int
id предмета квалификации
subject_name
string
название предмета квалификации
skill_id
int
id квалификации
skill_name
string
название квалификации
note
string
примечание


Поля в модели working-hour

id
int
идентификатор
location_id
int
id локации графика работы (если локация НЕ задана, то стоит параметр null)
weekday
int
день недели графика работы (где 1 - это воскресенье, а 7 - это суббота)
time_from
string
время начала графика работы (формат "HH:MM:SS")
time_to
string
время окончания графика работы (формат "HH:MM:SS")
teacher_id
int
id педагога, которому принадлежит график работы


Поля в модели teacher-rate

id
int
идентификатор
rate
float
значение ставки
type
int
тип ставки (1 - ставка в валюте, 2 – процентная ставка)
teacher_id
int
id педагога, в карточке которого добавлена ставка
b_date
string
начало периода действия ставки (формат "YYYY-MM-DD”)
e_dat
string
конец периода действия ставки (формат "YYYY-MM-DD”)
s_multirate
bool
стоит ли галка напротив пункта “Умножить значение на кол-во посетивших” (0 - нет, 1 – да)
is_proportional
bool
стоит ли галка напротив пункта “Увеличить значение пропорционально длительности” (0 - нет, 1 – да)
condition_attend
int
тип расчета ставки (1 - если выбрано “За посетивших”; 2 - если выбрано “За пропустивших по причине”; 3 - если выбрано “За посетивших или пропустивших по при)а
reason_ids
array
id причин пропуска (если причины пропуска НЕ заданы, то стоит параметр null)
count_from
int
кол-во клиентов “от” в ставке (если поле НЕ заполнено, то стоит параметр null)
count_to
int
кол-во клиентов “до” в ставке (если поле НЕ заполнено, то стоит параметр null)
duration
int
длительность урока в ставке (если поле НЕ заполнено, то стоит параметр null)
lesson_type_ids
array
id типов уроков в ставке
subject_ids
array
id предметов в ставке
is_gt_zero
bool
стоит ли галка напротив пункта “Начислять, если списание за урок у клиента более 0” (0 - нет, 1 – да)


Empty

По вашему запросу ничего не найдено

Перейти

Навигация

Esc

Закрыть