Описание 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 рабочих дней.


Авторизация


Прежде чем обращаться к методам 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 — сущность филиала

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

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

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

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

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 предмета
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 — платежи

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

id
int
идентификатор
phone_normalized
string
нормализация номера телефона
text
string
текст отправки
html
string
html запрос
integration_id
int
идентификатор интеграции
branch_id
int
id филиала
type_id
int
id типа коммуникации, int (1-комментарий)
class
int
класс связанной сущности
related_id
int
id связанной сущности
user_id
int
id пользователя, добавившего коммуникацию
added
string
дата
comment
string
текст

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

Закрыть