# Основные принципы
# Точки входа
Боевое (production) окружение для авторизации: https://accounts.mandarinbank.com/ (opens new window) Боевое (production) окружение для запросов: https://api.psp.io/ (opens new window)
# Аутентификация запросов
Каждый запрос должен быть аутентифицирован с помощью токена (access_token), полученного в соответствии с протоколом OAuth 2.0 для приложений.
Токен действует в течение 36 000 секунд (10 часов). Если срок действия истек, токен нужно запросить еще раз.
Запрос на получение токена
Включает в себя обязательные form-data параметры, которые передаются в теле запроса (параметры application.client_id и application.client_secret неизменны для приложения и хранятся на стороне клиента).
| Параметр | Описание | Пример | 
|---|---|---|
| grant_type | Грант авторизации (всегда равен client_credentials). |  client_credentials | 
| client_id | Идентификатор клиента (равен значению application.client_id, предоставленному Mandarin). |  VvPtlhcyldKtkuoUWY42 pErdrj4er2AwFoBWrn8n | 
| client_secret | Секретный ключ-пароль клиента (равен значению application.client_secret, предоставленному Mandarin). |  uQfOIMsltZYL8x3XMqUGP5 iFM59PyFnKlN0UmD3Ihre2 Ry3AGazUAv5jPdUI4dBJqV 0Of6b9GFvWvzGahYnq2aVV xkxn9n4qWF57FP0C01Kp6l EtajhfYv3UZ2f4pAZ7 | 
| scope | Запрашиваемые скоупы (области доступа): например, transactions.read - "Чтение транзакций". Разделитель - пробел. Запрашивать можно любой список скоупов, при этом в ответе вернется тот список запрошенных скоупов, который может быть предоставлен для данного приложения.  |  transactions.read | 
curl --location --request POST 'https://accounts.mandarinbank.com/oauth/token/' \
--form 'grant_type=client_credentials' \
--form 'client_id=VvPtlhcyldKtkuoUWY42pErdrj4er2AwFoBWrn8n' \
--form 'client_secret=uQfOIMsltZYL8x3XMqUGP5iFM59PyFnKlN0UmD3Ihre2Ry3AGazUAv5jPdUI4dBJqV0Of6b9GFvWvzGahYnq2aVVxkxn9n4qWF57FP0C01Kp6lEtajhfYv3UZ2f4pAZ7' \
--form 'scope=transactions.read'
Ответ
| Параметр | Описание | Пример | 
|---|---|---|
| access_token | Токен (ключ доступа). | VnuxZiW14mXBedDeZO7d W7GBmzPxMn | 
| expires_in | Срок действия токена (в секундах). Всегда равен 36 000 секунд (10 часов). | 36000 | 
| token_type | Тип токена (всегда равен Bearer). |  Bearer | 
| scope | Разрешенные скоупы (области доступа): например, transactions.read - "Чтение транзакций". Разделитель - пробел. Запрашивать можно любой список скоупов, при этом в ответе вернется тот список запрошенных скоупов, который может быть предоставлен для данного приложения.  |  transactions.read | 
{
    "access_token": "VnuxZiW14mXBedDeZO7dW7GBmzPxMn",
    "expires_in": 36000,
    "token_type": "Bearer",
    "scope": "transactions.read"
}
Использование токена
Указывается в headers каждого запроса, в поле Authorization, после зарезервированного слова Bearer.
Authorization:Bearer VnuxZiW14mXBedDeZO7dW7GBmzPxMn
# Принципы работы
API реализовано в соответствии с принципами REST API.
API оперирует ресурсами, которые представляют сущности - объекты бизнес-логики (бизнес-модели, доме́нные модели, модели предметной области). Существует два основных типа ресурсов: ресурс коллекции и ресурс сущности.
Ресурсы коллекций названы во множественном числе, например: /transactions.
Ресурс сущности — это ресурс конкретной сущности в какой-то коллекции. Доступ к нему осуществляется всегда через ресурс коллекции и по уникальному номеру, например:
/transactions/{{id}}
API использует JSON как для ответов, так и для запросов (если это применимо). Ответы API стандартизированы.
Ответы ресурсов коллекции всегда содержат поле, названное так же, как и сам
ресурс, и содержащее массив бизнес моделей. Если в ответ на запрос данных нет,
то массив будет пустой. Например, если это ответ ресурса /transactions, то
ответ будет такой:
{  
   "transactions": [  
      { {{transaction_model}} },  
      { ... },  
      { ... }  
   ]  
}
Допустимые параметры запроса:
filter_by- выборка по заданным полям и условиям;sort_by- список полей (через запятую) для сортировки в порядке “по убыванию” (добавив минус-перед названием поля, можно переключить порядок сортировки на “по возрастанию”). По умолчанию отсортирован поid;limit_to- ограничить количество сущностей, выдаваемое за один раз; число, по умолчанию 50;cursor- используется для получения следующей/предыдущей части выдачи, имеет приоритет над остальными запросами, то есть, если передаётсяcursor, то остальные параметры игнорируются.
Параметр filter_by формируется следующим образом: список полей и значений, по
которому нужно отфильтровать сущности, операторы сравнения (=, >, >=, <, <=, возможно использование оператора IN), фильтры объединяются знаком амперсанда: & (который обозначает логический оператор AND).
Формируется следующая строка:
field_name1=value1&field_name2 in value2_1,value2_2&field_name3>=value3_1&field_name3<value3_2
Например, mw_type=transaction&opcode in 1,3&updated>=2019-10-01&updated<2019-10-31.
После чего эта строка URL-энкодится и передаётся как значение
параметра filter_by:
?filter_by=mw_type%3Dtransaction%26opcode%20in%201%2C3%26updated%3E%3D2019-10-01%26updated%3C2019-10-31
Параметры верхнего уровня sort_by и limit_to и их значения не URL-энкодятся.
Пример результирующего query-string:
?filter_by=mw_type%3Dtransaction%26opcode%20in%201%2C3%26updated%3E%3D2019-10-01%26updated%3C2019-10-31&sort_by=-opcode&limit_to=100
Ответы ресурсов коллекции всегда содержат вложенный объект пагинации (курсор). Объект курсора всегда содержит поля:
count- количество сущностей в текущем ответе.total- общее количество сущностей по данному запросу (с такими фильтрами и т.д.).next- указатель на следующую страницу выдачи (null, если такая страница не существует).prev- указатель на предыдущую страницу выдачи (null, если такая страница не существует).
Пример запроса, который вернет первые 100 сущностей:
GET /transactions?filter_by=mw_type%3Dtransaction%26opcode%20in%201%2C3%26updated%3E%3D2019-10-01%26updated%3C2019-10-31&sort_by=-opcode&limit_to=100
{
   "transactions": [ ... ],
   "cursor": {
      "count": 100,
      "next": "aad0f17a6af11672",
      "prev": "f0bb6887c3b2f501",
      "total": 4200
   }
}
Пример запроса для получения последующих 100 сущностей (в параметр cursor подставлено значение из поля ответа next):
GET /transactions?cursor=aad0f17a6af11672
Ответы ресурсов сущностей всегда содержат поле, названное так же, как и сам ресурс, но в единственном числе, например:
GET /transactions/12345
{  
   "transactions": {  
      {{transaction_model}}  
   }  
}