Вопросы
api_help@qiwi.com
NAV Navbar
Запрос/ответ cURL PHP Python

Введение

Последнее обновление: 2020-07-28 | Предложить свои правки на GitHub

API QIWI Кошелька позволяет автоматизировать получение информации о вашем счёте в сервисе QIWI Кошелек и проводить операции с его помощью.

Методы API доступны после регистрации пользователя в сервисе QIWI Кошелек.

Авторизация запросов

Параметр Описание Тип
Bearer token Токен для доступа к вашему QIWI кошельку по API. Действие токена заканчивается через 180 дней после выпуска. Одновременно может действовать только один токен. String

Доступ к API

Основной URL-адрес для вызова методов API (если не указано иное):

https://edge.qiwi.com

Для успешного вызова методов API необходимы:

Получение OAuth-токена

API QIWI Кошелька использует открытый протокол OAuth 2.0. Согласно протоколу, пользователь авторизуется или регистрируется на сайте https://qiwi.com и запрашивает токен OAuth 2.0 Bearer с правом выполнения определённых действий. Выпуск токена подтверждается одноразовым кодом из СМС.

Для выпуска токена выполните следующие шаги:

  1. Откройте в браузере страницу https://qiwi.com/api. Для этого потребуется авторизоваться или зарегистрироваться в сервисе QIWI Кошелек. После этого нажмите Выпустить новый токен.

    Token Issue

  2. Во всплывающем окне выберите разрешения на операции с токеном и нажмите Продолжить:

    Token Scopes

  3. Подтвердите согласие на выпуск токена и нажмите Продолжить.

    Token Scopes

  4. Укажите проверочный код из SMS-сообщения, отправленного на номер вашего кошелька.

    Token Accept

  5. Скопируйте строку токена и сохраните в безопасном месте. Используйте токен для запросов к API QIWI Кошелька.

    Token

Пример вызова API

user@server:~$ curl "адрес сервера" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer jMyN22DQxMjM6NDUzRmRnZDQ0Mw11212e"

Полученный токен следует передавать в заголовке Authorization при каждом вызове API, указывая тип токена Bearer перед его значением. Пример получения такого заголовка:

U1QtOTkwMTAyLWNud3FpdWhmbzg3M

Authorization: Bearer U1QtOTkwMTAyLWNud3FpdWhmbzg3M

Профиль пользователя

Последнее обновление: 2020-07-06 | Предложить правки на GitHub

Запрос возвращает информацию о вашем профиле - наборе пользовательских данных и настроек вашего QIWI кошелька.

Запрос → GET

user@server:~$ curl "https://edge.qiwi.com/person-profile/v1/profile/current?authInfoEnabled=false" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer 5c4b25xx93aa435d9cb8cd17480356f9"
GET /person-profile/v1/profile/current HTTP/1.1
Accept: application/json
Authorization: Bearer 5c4b25xx93aa435d9cb8cd17480356f9
Content-type: application/json
Host: edge.qiwi.com
import requests

# Профиль пользователя
def get_profile(api_access_token):
    s7 = requests.Session()
    s7.headers['Accept']= 'application/json'
    s7.headers['authorization'] = 'Bearer ' + api_access_token
    p = s7.get('https://edge.qiwi.com/person-profile/v1/profile/current?authInfoEnabled=true&contractInfoEnabled=true&userInfoEnabled=true')
    return p.json()
api_access_token = '975efd8e8376xxxb95fa7cb213xxx04'

# Полная информация о профиле пользователя
profile = get_profile(api_access_token)

# Профиль пользователя
# статус блокировки
profile['contractInfo']['blocked']

# Профиль пользователя
# уровень идентификации в Киви Банке
profile['contractInfo']['identificationInfo'][0]['identificationLevel']

# привязанный email
profile['authInfo']['boundEmail']
Название Тип Описание
authInfoEnabled Boolean Логический признак выгрузки настроек авторизации.
По умолчанию true
contractInfoEnabled Boolean Логический признак выгрузки данных о вашем QIWI кошельке.
По умолчанию true
userInfoEnabled Boolean Логический признак выгрузки прочих пользовательских данных.
По умолчанию true

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

{
  "authInfo": {
    "boundEmail": "m@ya.ru",
    "ip": "81.210.201.22",
    "lastLoginDate": "2017-07-27T06:51:06.099Z",
    "mobilePinInfo": {
      "lastMobilePinChange": "2017-07-13T11:22:06.099Z",
      "mobilePinUsed": true,
      "nextMobilePinChange": "2017-11-27T06:51:06.099Z"
    },
    "passInfo": {
      "lastPassChange": "2017-07-21T09:25:06.099Z",
      "nextPassChange": "2017-08-21T09:25:06.099Z",
      "passwordUsed": true
    },
    "personId": 79683851815,
    "pinInfo": {
      "pinUsed": true
    },
    "registrationDate": "2017-01-07T16:51:06.100Z"
  },
  "contractInfo": {
    "blocked": false,
    "contractId": 79683851815,
    "creationDate": "2017-01-07T16:51:06.100Z",
    "features": [
      ...
    ],
    "identificationInfo": [
      {
        "bankAlias": "QIWI",
        "identificationLevel": "SIMPLE",
        "passportExpired": false
      }
    ]
  },
  "userInfo": {
    "defaultPayCurrency": 643,
    "defaultPaySource": 7,
    "email": null,
    "firstTxnId": 10807097143,
    "language": "string",
    "operator": "Beeline",
    "phoneHash": "lgsco87234f0287",
    "promoEnabled": null
  }
}

Успешный JSON-ответ содержит следующие данные:

Поле ответа Тип Описание
authInfo Object Текущие настройки авторизации. Объект может отсутствовать, в зависимости от признака authInfoEnabled в запросе.
authInfo.personId Number Номер кошелька
authInfo.registrationDate String Дата/время регистрации QIWI Кошелька (через сайт/мобильное приложение, либо другим способом)
authInfo.boundEmail String E-mail, привязанный к кошельку. Если отсутствует, то null
authInfo.ip String IP-адрес последней пользовательской сессии
authInfo.lastLoginDate String Дата/время последней сессии в QIWI Кошельке
authInfo.mobilePinInfo Object Данные о PIN-коде мобильного приложения QIWI Кошелька
mobilePinInfo.mobilePinUsed Boolean Логический признак использования PIN-кода (фактически означает, что мобильное приложение используется)
mobilePinInfo.lastMobilePinChange String Дата/время последнего изменения PIN-кода мобильного приложения QIWI Кошелька
mobilePinInfo.nextMobilePinChange String Дата/время следующего (планового) изменения PIN-кода мобильного приложения QIWI Кошелька
authInfo.passInfo Object Данные об использовании пароля к сайту qiwi.com
passInfo.passwordUsed Boolean Логический признак использования пароля (фактически означает использование сайта qiwi.com)
passInfo.lastPassChange String Дата/время последнего изменения пароля сайта qiwi.com
passInfo.nextPassChange String Дата/время следующего (планового) изменения пароля сайта qiwi.com
authInfo.pinInfo Object Данные об использовании PIN-кода к приложению QIWI Кошелька на QIWI терминалах самообслуживания
pinInfo.pinUsed Boolean Логический признак использования PIN-кода для терминала (фактически означает факт использования приложения QIWI Кошелька на терминале)
contractInfo Object Информация о кошельке. Объект может отсутствовать, в зависимости от признака contractInfoEnabled в запросе.
contractInfo.blocked Boolean Логический признак блокировки кошелька
contractInfo.contractId Number Номер кошелька
contractInfo.creationDate String Дата/время создания QIWI Кошелька (через сайт/мобильное приложение, либо при первом пополнении, либо другим способом)
contractInfo.features Array[Object] Служебная информация
contractInfo.identificationInfo Array[Object] Данные об идентификации пользователя.
identificationInfo[].bankAlias String Акроним системы, в которой пользователь получил идентификацию:
QIWI - QIWI Кошелек.
identificationInfo[].identificationLevel String Текущий уровень идентификации кошелька. Возможные значения:
ANONYMOUS - без идентификации;
SIMPLE, VERIFIED - упрощенная идентификация;
FULL - полная идентификация.
identificationInfo[].passportExpired Boolean Информация об актуальности паспортных данных владельца кошелька (true означает, что паспортные данные недействительны).
userInfo Object Прочие пользовательские данные. Объект может отсутствовать, в зависимости от признака userInfoEnabled в запросе.
userInfo.defaultPayCurrency Number(3) Код валюты баланса кошелька по умолчанию (ISO-4217)
userInfo.defaultPaySource Number Служебная информация
userInfo.email String E-mail пользователя
userInfo.firstTxnId Number Номер первой транзакции после регистрации
userInfo.language String Служебная информация
userInfo.operator String Название мобильного оператора номера пользователя
userInfo.phoneHash String Служебная информация
userInfo.promoEnabled String Служебная информация

Идентификация

Подробнее об идентификации

Идентификация пользователя

Данный запрос позволяет отправить данные для идентификации вашего QIWI кошелька.

Для получения статуса "Основной" необходимо предоставить следующие данные о пользователе-владельце кошелька:

Для идентификации кошелька вы обязательно должны отправить ФИО, серию/номер паспорта и дату рождения. Если данные прошли проверку, то в ответе будет отображен ваш ИНН и упрощенная идентификация кошелька будет установлена. В случае если данные не прошли проверку, кошелек остается в статусе "Минимальный".

Запрос → POST

user@server:~$ curl -X POST "https://edge.qiwi.com/identification/v1/persons/79111234567/identification" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer 5c4b25xx93aa435d9cb8cd17480356f9" \
  -d '{
  "birthDate": "1998-02-11",
  "firstName": "Иван",
  "inn": "",
  "lastName": "Иванов",
  "middleName": "Иванович",
  "oms": "",
  "passport": "4400111222",
  "snils": ""
}'
POST /identification/v1/persons/79111234567/identification HTTP/1.1
Accept: application/json
Authorization: Bearer 5c4b25xx93aa435d9cb8cd17480356f9
Content-type: application/json
Host: edge.qiwi.com

{
  "birthDate": "1998-02-11",
  "firstName": "Иван",
  "inn": "",
  "lastName": "Иванов",
  "middleName": "Иванович",
  "oms": "",
  "passport": "4400111222",
  "snils": ""
}
import requests

# идентификация
def get_identification(api_access_token, my_login):
    s = requests.Session()
    s.headers['authorization'] = 'Bearer ' + api_access_token
    res = s.get('https://edge.qiwi.com/identification/v1/persons/'+my_login+'/identification')
    return res.json()
Название Тип Описание
birthDate String Дата рождения пользователя (в формате "ГГГГ-ММ-ДД")
firstName String Имя пользователя
middleName String Отчество пользователя
lastName String Фамилия пользователя
passport String Серия и номер паспорта пользователя (только цифры)
inn String ИНН пользователя
snils String Номер СНИЛС пользователя
oms String Номер полиса ОМС пользователя

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

{
  "birthDate": "1996-03-18",
  "firstName": "Иван",
  "id": 79111234567,
  "inn": "7710000001",
  "lastName": "Иванов",
  "middleName": "Иванович",
  "oms": "",
  "passport": "1122333000",
  "snils": "",
  "type": "VERIFIED"
}
mylogin = '79999999999'
api_access_token = '975efd8e8376xxxb95fa7cb213xxx04'
print(get_identification(api_access_token, mylogin))

{'birthDate': '1984-01-09',
 'firstName': 'Иванов',
 'id': 79262111317,
 'inn': 'xxxxxxx',
 'lastName': 'Иванов',
 'middleName': 'Иванович',
 'oms': None,
 'passport': 'xxxx xxxxxx',
 'snils': None,
 'type': 'FULL'}

Успешный ответ в формате JSON содержит подтверждение идентификации кошелька:

Поле ответа Тип Описание
id Number Номер кошелька пользователя
type String Текущий статус кошелька:
SIMPLE - "Минимальный".
VERIFIED - "Основной" (данные для идентификации успешно прошли проверку).
FULL – "Профессиональный", если кошелек уже ранее получал полную идентификацию по данным ФИО, номеру паспорта и дате рождения.
birthDate String Дата рождения пользователя
firstName String Имя пользователя
middleName String Отчество пользователя
lastName String Фамилия пользователя
passport String Серия и номер паспорта пользователя
inn String ИНН пользователя. Если в запросе параметр не заполнен, но присутствует в ответе, то идентификация кошелька выполнена.
snils String Номер СНИЛС пользователя
oms String Номер полиса ОМС пользователя

Данные идентификации

Данный запрос позволяет выгрузить маскированные данные и статус идентификации своего QIWI кошелька.

Запрос → GET

user@server:~$ curl -X GET "https://edge.qiwi.com/identification/v1/persons/79111234567/identification" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer 5c4b25xx93aa435d9cb8cd17480356f9"
GET /identification/v1/persons/79111234567/identification HTTP/1.1
Accept: application/json
Authorization: Bearer 5c4b25xx93aa435d9cb8cd17480356f9
Host: edge.qiwi.com

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

{
  "birthDate": "1996-03-18",
  "firstName": "Иван",
  "id": 79111234567,
  "inn": "77***01",
  "lastName": "Иванов",
  "middleName": "Иванович",
  "oms": "",
  "passport": "43***11",
  "snils": "",
  "type": "VERIFIED"
}

Успешный ответ в формате JSON содержит маскированные данные идентификации кошелька:

Поле ответа Тип Описание
id Number Номер кошелька пользователя
type String Текущий статус кошелька:
SIMPLE - "Минимальный".
VERIFIED - "Основной" (данные для идентификации успешно прошли проверку).
FULL – "Профессиональный", если кошелек уже ранее получал полную идентификацию по данным ФИО, номеру паспорта и дате рождения.
birthDate String Дата рождения пользователя
firstName String Имя пользователя
middleName String Отчество пользователя
lastName String Фамилия пользователя
passport String Серия и номер паспорта пользователя (первые и последние 2 цифры)
inn String ИНН пользователя (первые и последние 2 цифры)
snils String Номер СНИЛС пользователя (первые и последние 2 цифры)
oms String Номер полиса ОМС пользователя (первые и последние 2 цифры)

Лимиты QIWI Кошелька

Следующий запрос возвращает текущие уровни лимитов по операциям в вашем QIWI кошельке. Лимиты действуют как ограничения на сумму определенных операций.

Запрос → GET

user@server:~$ curl "https://edge.qiwi.com/qw-limits/v1/persons/79115221133/actual-limits?types%5B0%5D=TURNOVER" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu"
GET /qw-limits/v1/persons/79115221133/actual-limits?types%5B0%5D=TURNOVER HTTP/1.1
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com
import requests

# Все лимиты QIWI Кошелька
def limits(login, api_access_token):
    types = [ 'TURNOVER', 'REFILL', 'PAYMENTS_P2P', 'PAYMENTS_PROVIDER_INTERNATIONALS', 'PAYMENTS_PROVIDER_PAYOUT', 'WITHDRAW_CASH']
    s = requests.Session()
    s.headers['Accept']= 'application/json'
    s.headers['Content-Type']= 'application/json'
    s.headers['authorization'] = 'Bearer ' + api_access_token
    parameters = {}
    for i, type in enumerate(types):
        parameters['types[' + str(i) + ']'] = type
    b = s.get('https://edge.qiwi.com/qw-limits/v1/persons/' + login + '/actual-limits', params = parameters)
    return b.json()
Название Тип Описание
types Array[String] Список типов операций, по которым запрашиваются лимиты. Каждый тип нумеруется элементом массива, начиная с нуля (types[0], types[1] и т.д.). Допустимые типы операций:
REFILL - максимальный допустимый остаток на счёте
TURNOVER - оборот в месяц
PAYMENTS_P2P - переводы на другие кошельки в месяц
PAYMENTS_PROVIDER_INTERNATIONALS - платежи в адрес иностранных компаний в месяц
PAYMENTS_PROVIDER_PAYOUT - Переводы на банковские счета и карты, кошельки других систем
WITHDRAW_CASH - снятие наличных в месяц. Должен быть указан хотя бы один тип операций.

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

{
    "limits":{
      "RU" :[
        {
            "type": "TURNOVER",
            "currency": "RUB",
            "rest": 200.00,
            "max": 40000.00,
            "spent": 39800.00,
            "interval": {
                "dateFrom": "2019-11-01T:00:00",
                "dateTill": "2019-12-01T00:00"
            }
        },
        ...
    ]
  }
}
# номер кошелька в формате 79992223344
mylogin = '79999999999'
api_access_token = '975efd8e8376xxxb95fa7cb213xxx04'

# все лимиты (список)
limits = limits(mylogin,api_access_token)['limits']['RU']

# лимит оборота
turnoverInfo = [x for x in limits if x['type'] == 'TURNOVER']
turnoverLimit = turnoverInfo[0]['rest']

Успешный ответ содержит JSON-массив лимитов по операциям вашего QIWI Кошелька:

Поле ответа Тип Описание
limits Object Описание лимитов
limits[].'RU' Array[Object] Массив лимитов на операции
type String Тип операций, на которые действует данный лимит
currency String Валюта операций
max String Значение лимита
spent String Сумма, потраченная по данным операциям
rest Boolean Остаток лимита, который можно потратить в данный период (период задается в параметре interval)
interval Object Сведения о периоде действия лимита
interval.dateFrom, interval.dateTill String Начало и конец периода, формат даты ГГГГ-ММ-ДДТЧЧ:ММ:ССtmz

Проверка ограничений исходящих платежей с QIWI Кошелька

Следующий запрос проверяет, есть ли ограничение на исходящие платежи с QIWI Кошелька.

Запрос → GET

user@server:~$ curl "https://edge.qiwi.com/person-profile/v1/persons/79115221133/status/restrictions \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu"
GET /person-profile/v1/persons/79115221133/status/restrictions HTTP/1.1
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com
import requests

# Блокировки
def get_restrictions(api_access_token, mylogin):
    s7 = requests.Session()
    s7.headers['Accept']= 'application/json'
    s7.headers['authorization'] = 'Bearer ' + api_access_token
    p = s7.get('https://edge.qiwi.com/person-profile/v1/persons/' + mylogin + '/status/restrictions')
    return p.json()

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

[
    {
        "restrictionCode": "OUTGOING_PAYMENTS",
        "restrictionDescription": "Исходящие платежи заблокированы"
    }
]
mylogin = '79999999999'
api_access_token = '975efd8e8376xxxb95fa7cb213xxx04'
print(get_restrictions(api_access_token, mylogin))

[
    {
        "restrictionCode": "OUTGOING_PAYMENTS",
        "restrictionDescription": "Исходящие платежи заблокированы"
    }
]

Успешный ответ содержит JSON-массив ограничений кошелька с их описанием:

Поле ответа Тип Описание
restrictionCode String Код блокировки
restrictionDescription String Описание блокировки

Возможные значения:

restrictionCode restrictionDescription
OUTGOING_PAYMENTS Исходящие платежи заблокированы

Если ограничений нет, возвращается пустой массив.

История платежей

Последнее обновление: 2020-07-06 | Предложить правки на GitHub

Список платежей

Запрос выгружает список платежей и пополнений вашего кошелька. Можно использовать фильтр по количеству, ID и дате (интервалу дат) транзакций.

Потестировать

Запрос → GET

Пример 1. Последние 10 платежей

user@server:~$ curl "https://edge.qiwi.com/payment-history/v2/persons/79112223344/payments?rows=10" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu"

Пример 2. Платежи за 10.05.2017

user@server:~$ curl "https://edge.qiwi.com/payment-history/v2/persons/79112223344/payments?rows=50&startDate=2017-05-10T00%3A00%3A00%2B03%3A00&endDate=2017-05-10T23%3A59%3A59%2B03%3A00" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu"

Пример 3. Продолжение списка платежей (в предыдущем запросе истории возвращены параметры nextTxnId=9103121 и nextTxnDate=2017-05-11T12:35:23+03:00)

user@server:~$ curl "https://edge.qiwi.com/payment-history/v2/persons/79112223344/payments?rows=50&nextTxnId=9103121&nextTxnDate=2017-05-11T12%3A35%3A23%2B03%3A00" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu"

Пример 4. Последние 10 платежей с рублевого баланса и с привязанной карты

GET /payment-history/v2/persons/79112223344/payments?rows=10&operation=OUT&sources%5B0%5D=QW_RUB&sources%5B1%5D=CARD HTTP/1.1
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com

Пример 5. Платежи за 10.05.2017 с рублевого счета

GET /payment-history/v2/persons/79112223344/payments?rows=50&sources%5B0%5D=QW_RUB&startDate=2017-05-10T00%3A00%3A00%2B03%3A00&endDate=2017-05-10T23%3A59%3A59%2B03%3A00 HTTP/1.1
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com

Пример 6. Продолжение списка платежей за 10.05.2017 (в Примере 2 возвращены параметры nextTxnId=9103121 и nextTxnDate=2017-05-11T12:35:23+03:00)

GET /payment-history/v2/persons/79112223344/payments?rows=50&nextTxnId=9103121&nextTxnDate=2017-05-11T12%3A35%3A23%2B03%3A00 HTTP/1.1
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com
import requests

# История платежей - последние и следующие n платежей
def payment_history_last(my_login, api_access_token, rows_num, next_TxnId, next_TxnDate):
    s = requests.Session()
    s.headers['authorization'] = 'Bearer ' + api_access_token  
    parameters = {'rows': rows_num, 'nextTxnId': next_TxnId, 'nextTxnDate': next_TxnDate}
    h = s.get('https://edge.qiwi.com/payment-history/v2/persons/' + my_login + '/payments', params = parameters)
    return h.json()
Название Тип Описание
rows Integer Число платежей в ответе, для разбивки отчета на страницы. Целое число от 1 до 50. Запрос возвращает указанное число платежей в обратном хронологическом порядке, начиная от текущей даты или даты в параметре startDate. Обязательный параметр
operation String Тип операций в отчете, для отбора. Допустимые значения:
ALL - все операции,
IN - только пополнения,
OUT - только платежи,
QIWI_CARD - только платежи по картам QIWI (QVC, QVP).
По умолчанию ALL
sources Array[String] Список источников платежа, для фильтра. Каждый источник нумеруется, начиная с нуля (sources[0], sources[1] и т.д.). Допустимые значения:
QW_RUB - рублевый счет кошелька,
QW_USD - счет кошелька в долларах,
QW_EUR - счет кошелька в евро,
CARD - привязанные и непривязанные к кошельку банковские карты,
MK - счет мобильного оператора. Если не указан, учитываются все источники
startDate DateTime URL-encoded Начальная дата поиска платежей. Используется только вместе с endDate. Максимальный допустимый интервал между startDate и endDate - 90 календарных дней. По умолчанию, равна суточному сдвигу от текущей даты по московскому времени.
Дату можно указать в любой временной зоне TZD (формат ГГГГ-ММ-ДД'T'чч:мм:ссTZD), однако она должна совпадать с временной зоной в параметре endDate. Обозначение временной зоны TZD: +чч:мм или -чч:мм (временной сдвиг от GMT).
endDate DateTime URL-encoded Конечная дата поиска платежей. Используется только вместе со startDate. Максимальный допустимый интервал между startDate и endDate - 90 календарных дней. По умолчанию, равна текущим дате/времени по московскому времени. Дату можно указать в любой временной зоне TZD (формат ГГГГ-ММ-ДД'T'чч:мм:ссTZD), однако она должна совпадать с временной зоной в параметре startDate. Обозначение временной зоны TZD: +чч:мм или -чч:мм (временной сдвиг от GMT).
nextTxnDate DateTime URL-encoded Дата транзакции для начала отчета (должна быть равна параметру nextTxnDate в предыдущем списке). Используется для продолжения списка, разбитого на страницы. Используется только вместе с nextTxnId
nextTxnId Long Номер транзакции для начала отчета (должен быть равен параметру nextTxnId в предыдущем списке). Используется для продолжения списка, разбитого на страницы. Используется только вместе с nextTxnDate

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

{"data":
  [ 
   {
    "txnId":9309,
    "personId":79112223344,
    "date":"2017-01-21T11:41:07+03:00",
    "errorCode":0,
    "error":null,
    "status":"SUCCESS",
    "type":"OUT",
    "statusText":"Успешно",
    "trmTxnId":"1489826461807",
    "account":"0003***",
    "sum":{
        "amount":70,
        "currency":643
        },
    "commission":{
        "amount":0,
        "currency":643
        },
    "total":{
        "amount":70,
        "currency":643
        },
    "provider":{
      ...
    },
    "source": {},
    "comment":null,
    "currencyRate":1,
    "extras":null,
    "chequeReady":true,
    "bankDocumentAvailable":false,
    "bankDocumentReady":false,
    "repeatPaymentEnabled":false,
    "favoritePaymentEnabled": true,
    "regularPaymentEnabled": true
   }
  ],
  "nextTxnId":9001,
  "nextTxnDate":"2017-01-31T15:24:10+03:00"
}
mylogin = '79999999999'
api_access_token = '975efd8e8376xxxb95fa7cb213xxx04'

# последние 20 платежей
lastPayments = payment_history_last(mylogin, api_access_token, '5','','')

# дата и время следующего платежа
nextTxnDate = lastPayments['nextTxnDate']

# id транзакции следующего платежа
nextTxnId = lastPayments['nextTxnId']

# История платежей - последние и следующие n платежей
orderedPayments = payment_history_last(mylogin, api_access_token, '5', nextTxnId, nextTxnDate)

Успешный JSON-ответ содержит список платежей из истории кошелька, соответствующих заданному фильтру:

Поле ответа Тип Описание
data Array[Object] Список объектов Transaction.
Число транзакций в списке меньше или равно параметру rows из запроса
nextTxnId Number(Integer) ID следующей транзакции в полном списке
nextTxnDate DateTime Дата/время следующей транзакции в полном списке, время московское (в формате ГГГГ-ММ-ДД'T'чч:мм:сс+03:00)

Статистика платежей

Данный запрос используется для получения сводной статистики по суммам платежей за заданный период.

Потестировать

Запрос → GET

user@server:~$ curl "https://edge.qiwi.com/payment-history/v2/persons/79112223344/payments/total?startDate=2017-03-01T00%3A00%3A00%2B03%3A00&endDate=2017-03-31T11%3A44%3A15%2B03%3A00" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu"
GET /payment-history/v2/persons/79112223344/payments/total?startDate=2017-03-01T00%3A00%3A00%2B03%3A00&endDate=2017-03-31T11%3A44%3A15%2B03%3A00 HTTP/1.1
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com
import requests

# История платежей - сумма за диапазон дат
def payment_history_summ_dates(my_login, api_access_token, start_Date, end_Date):
    s = requests.Session()
    s.headers['authorization'] = 'Bearer ' + api_access_token
    parameters = {'startDate': start_Date,'endDate': end_Date}
    h = s.get('https://edge.qiwi.com/payment-history/v2/persons/' + my_login + '/payments/total', params = parameters)
    return h.json()
Название Тип Описание
startDate DateTime URL-encoded Начальная дата периода статистики. Дату можно указать в любой временной зоне TZD (формат ГГГГ-ММ-ДД'T'чч:мм:ссTZD), однако она должна совпадать с временной зоной в параметре endDate. Обозначение временной зоны TZD: +чч:мм или -чч:мм (временной сдвиг от GMT). Обязательный параметр
endDate DateTime URL-encoded Конечная дата периода статистики. Дату можно указать в любой временной зоне TZD (формат ГГГГ-ММ-ДД'T'чч:мм:ссTZD), однако она должна совпадать с временной зоной в параметре startDate. Обозначение временной зоны TZD: +чч:мм или -чч:мм (временной сдвиг от GMT). Обязательный параметр
operation String Тип операций, учитываемых при подсчете статистики. Допустимые значения:
ALL - все операции,
IN - только пополнения,
OUT - только платежи,
QIWI_CARD - только платежи по картам QIWI (QVC, QVP).
По умолчанию ALL.
sources Array[String] Источники платежа, по которым вернутся данные. Каждый источник нумеруется, начиная с нуля (sources[0], sources[1] и т.д.). Допустимые значения:
QW_RUB - рублевый счет кошелька,
QW_USD - счет кошелька в долларах,
QW_EUR - счет кошелька в евро,
CARD - привязанные и непривязанные к кошельку банковские карты,
MK - счет мобильного оператора. Если не указан, учитываются все источники платежа.

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

{
 "incomingTotal":[
  {
  "amount":3500,
  "currency":643
  }],
 "outgoingTotal":[
  {
  "amount":3497.5,
  "currency":643
  }]
}
mylogin = '79999999999'
api_access_token = '975efd8e8376xxxb95fa7cb213xxx04'

# История платежей - сумма за диапазон
# не более 90 дней с 12 апреля по 11 июля 2019 года
print(payment_history_summ_dates(mylogin, api_access_token, '2019-04-12T00:00:00Z','2019-07-11T23:59:59Z'))

{'incomingTotal': [{'amount': 3.33, 'currency': 840},
  {'amount': 3481, 'currency': 643}],
 'outgoingTotal': [{'amount': 3989.98, 'currency': 643},
  {'amount': 3.33, 'currency': 840}]}

Успешный JSON-ответ содержит статистику платежей за выбранный период:

Поле ответа Тип Описание
incomingTotal Array[Object] Массив данных о суммах входящих платежей (пополнениях) по каждой валюте
incomingTotal[].amount Number(Decimal) Сумма пополнений за период
incomingTotal[].currency Number(3) Код валюты пополнений (ISO-4217)
outgoingTotal Array[Object] Массив данных о суммах исходящих платежей по каждой валюте
outgoingTotal[].amount Number(Decimal) Сумма платежей за период
outgoingTotal[].currency Number(3) Код валюты платежей (ISO-4217)

Информация о транзакции

Запрос используется для получения информации по определенной транзакции из вашей истории платежей.

Потестировать

Запрос → GET

user@server:~$ curl "https://edge.qiwi.com/payment-history/v2/transactions/9112223344" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu"
GET /payment-history/v2/transactions/9112223344 HTTP/1.1
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com
import requests

# История платежей - информация по транзакции
def payment_history_transaction(api_access_token, transaction_id, transaction_type):
    s = requests.Session()
    s.headers['authorization'] = 'Bearer ' + api_access_token  
    parameters = {'type': transaction_type} # transaction_type 'IN' 'OUT'
    h = s.get('https://edge.qiwi.com/payment-history/v1/transactions/'+transaction_id, params = parameters)
    return h.json()

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

{
    "txnId": 11233344692,
    "personId": 79161122331,
    "date": "2017-08-30T14:38:09+03:00",
    "errorCode": 0,
    "error": null,
    "status": "WAITING",
    "type": "OUT",
    "statusText": "Запрос обрабатывается",
    "trmTxnId": "11233344691",
    "account": "15040930424823121081",
    "sum": {
        "amount": 1,
        "currency": 643
    },
    "commission": {
        "amount": 0,
        "currency": 643
    },
    "total": {
        "amount": 1,
        "currency": 643
    },
    "provider": {
        "id": 1,
        "shortName": "MTS",
        "longName": "MTS",
        "logoUrl": null,
        "description": null,
        "keys": null,
        "siteUrl": null,
        "extras": []
    },
    "source": {
        "id": 7,
        "shortName": "QIWI Wallet",
        "longName": "QIWI Wallet",
        "logoUrl": null,
        "description": null,
        "keys": "мобильный кошелек, кошелек, перевести деньги, личный кабинет, отправить деньги, перевод между пользователями",
        "siteUrl": null,
        "extras": []
    },
    "comment": null,
    "currencyRate": 1,
    "extras": [],
    "chequeReady": false,
    "bankDocumentAvailable": false,
    "bankDocumentReady": false,
    "repeatPaymentEnabled": false,
    "favoritePaymentEnabled": false,
    "regularPaymentEnabled": false
}
# номер кошелька в формате 79992223344
mylogin = '79999999999'
api_access_token = '975efd8e8376xxxb95fa7cb213xxx04'

# История платежей - информация по транзакции
transactionInfo = payment_history_transaction(api_access_token, '11181101215', 'OUT')

# История платежей - информация по транзакции из истории платежей
lastPayments = payment_history_last(mylogin, api_access_token, '20','','')
last_txn_id = lastPayments['data'][5]['txnId']
last_txn_type = lastPayments['data'][5]['type']

transactionInfo = payment_history_transaction(api_access_token, str(last_txn_id), last_txn_type)

Успешный JSON-ответ содержит объект Transaction с данными о транзакции.

Квитанция платежа

Данный запрос используется для получения электронной квитанции (чека) по определенной транзакции из вашей истории платежей в формате PDF/JPEG в виде файла или почтовым сообщением на заданный e-mail.

Файл квитанции

Потестировать

Запрос → GET

user@server:~$ curl "https://edge.qiwi.com/payment-history/v1/transactions/9112223344/cheque/file?type=IN&format=PDF" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu"
GET /payment-history/v1/transactions/9112223344/cheque/file?type=IN&format=PDF HTTP/1.1
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com
import requests

# История платежей - получение текста чека в файле
def payment_history_cheque_file(transaction_id, transaction_type, filename, api_access_token):
    s = requests.Session()
    s.headers['Accept'] ='application/json'
    s.headers['authorization'] = 'Bearer ' + api_access_token
    parameters = {'type': transaction_type,'format': 'PDF'}
    h = s.get('https://edge.qiwi.com/payment-history/v1/transactions/'+transaction_id+'/cheque/file', params=parameters)
    h.status_code
    with open(filename + '.pdf', 'wb') as f:
        f.write(h.content)

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

[
  ""
]

Успешный JSON-ответ содержит файл выбранного формата в бинарном виде.

Отправка квитанции

Потестировать

Запрос → POST

user@server:~$ curl -X POST "https://edge.qiwi.com/payment-history/v1/transactions/9112223344/cheque/send?type=IN" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu" \
  -d '{"email": "my@example.com"}'
POST /payment-history/v1/transactions/9112223344/cheque/send?type=IN HTTP/1.1
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Content-type: application/json
Host: edge.qiwi.com

{"email": "my@example.com"}
import requests

# История платежей - отправить чек на email
def payment_history_cheque_send(transaction_id, transaction_type, email, api_access_token):
    s = requests.Session()
    s.headers['content-type'] ='application/json'
    s.headers['Accept'] ='application/json'
    s.headers['authorization'] = 'Bearer ' + api_access_token
    postjson = {'email':email}
    h = s.post('https://edge.qiwi.com/payment-history/v1/transactions/' + transaction_id + '/cheque/send?type=' + transaction_type, json = postjson)
    h.status_code
Название Тип Описание
email String Адрес для отправки электронной квитанции

Ответ ←

HTTP/1.1 201 Created
Content-Type: application/json
# номер кошелька в формате 79992223344
mylogin = '79999999999'
api_access_token = '975efd8e8376xxxb95fa7cb213xxx04'

lastPayments = payment_history_last(mylogin, api_access_token, '20','','')
last_txn_id = lastPayments['data'][5]['txnId']
last_txn_type = lastPayments['data'][5]['type']

# История платежей - отправить чек на email
payment_history_cheque_send(str(last_txn_id), last_txn_type, 'mmd@yandex.ru', api_access_token)

Успешный JSON-ответ содержит HTTP-код результата операции отправки файла.

Модели данных API

Класс Transaction

{
    "txnId": 11233344692,
    "personId": 79161122331,
    "date": "2017-08-30T14:38:09+03:00",
    "errorCode": 0,
    "error": null,
    "status": "WAITING",
    "type": "OUT",
    "statusText": "Запрос обрабатывается",
    "trmTxnId": "11233344691",
    "account": "15040930424823121081",
    "sum": {
        "amount": 1,
        "currency": 643
    },
    "commission": {
        "amount": 0,
        "currency": 643
    },
    "total": {
        "amount": 1,
        "currency": 643
    },
    "provider": {
        "id": 1,
        "shortName": "MTS",
        "longName": "MTS",
        "logoUrl": null,
        "description": null,
        "keys": null,
        "siteUrl": null,
        "extras": []
    },
    "source": {
        "id": 7,
        "shortName": "QIWI Wallet",
        "longName": "QIWI Wallet",
        "logoUrl": null,
        "description": null,
        "keys": "мобильный кошелек, кошелек, перевести деньги, личный кабинет, отправить деньги, перевод между пользователями",
        "siteUrl": null,
        "extras": []
    },
    "comment": null,
    "currencyRate": 1,
    "extras": [],
    "chequeReady": false,
    "bankDocumentAvailable": false,
    "bankDocumentReady": false,
    "repeatPaymentEnabled": false,
    "favoritePaymentEnabled": false,
    "regularPaymentEnabled": false
}

Объект, описывающий существующую транзакцию в сервисе QIWI Кошелек.

Элемент Тип Описание
txnId Integer ID транзакции в сервисе QIWI Кошелек
personId Integer Номер кошелька
date DateTime Для запросов истории платежей - Дата/время платежа, во временной зоне запроса (см. параметр startDate). Формат даты ГГГГ-ММ-ДД'T'чч:мм:сс+03:00
Для запросов данных о транзакции - Дата/время платежа, время московское (в формате ГГГГ-ММ-ДД'T'чч:мм:сс+03:00)
errorCode Number(Integer) Код ошибки платежа
error String Описание ошибки
type String Тип платежа. Возможные значения:
IN - пополнение,
OUT - платеж,
QIWI_CARD - платеж с карт QIWI (QVC, QVP).
status String Статус платежа. Возможные значения:
WAITING - платеж проводится,
SUCCESS - успешный платеж,
ERROR - ошибка платежа.
statusText String Текстовое описание статуса платежа
trmTxnId String Клиентский ID транзакции
account String Для платежей - номер счета получателя. Для пополнений - номер отправителя, терминала или название агента пополнения кошелька
sum Object Данные о сумме платежа или пополнения.
sum.amount Number(Decimal) сумма платежа
sum.currency Number(3) валюта платежа (код по ISO-4217)
commission Object Данные о комиссии платежа
commission.amount Number(Decimal) сумма
commission.currency Number(3) валюта (код по ISO-4217)
total Object Данные о фактической сумме платежа или пополнения.
total.amount Number(Decimal) сумма (равна сумме платежа sum.amount и комиссии commission.amount)
total.currency Number(3) валюта (код по ISO-4217)
provider Object Данные о провайдере.
provider.id Integer ID провайдера в QIWI Wallet
provider.shortName String краткое наименование провайдера
provider.longName String развернутое наименование провайдера
provider.logoUrl String ссылка на логотип провайдера
provider.description String описание провайдера (HTML)
provider.keys String список ключевых слов
provider.siteUrl String сайт провайдера
source Object Служебная информация
comment String Комментарий к платежу
currencyRate Number(Decimal) Курс конвертации (если применяется в транзакции)
extras Object Служебная информация
chequeReady Boolean Специальное поле
bankDocumentAvailable Boolean Специальное поле
repeatPaymentEnabled Boolean Специальное поле
favoritePaymentEnabled Boolean Специальное поле
regularPaymentEnabled Boolean Специальное поле

Баланс QIWI Кошелька

Последнее обновление: 2020-07-06 | Предложить правки на GitHub

Методы данного API предназначены для управления балансами вашего QIWI кошелька.

Список балансов

Запрос выгружает текущие балансы счетов вашего QIWI Кошелька.

Потестировать

Запрос → GET

user@server:~$ curl "https://edge.qiwi.com/funding-sources/v2/persons/79115221133/accounts" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu"
GET /funding-sources/v2/persons/79115221133/accounts HTTP/1.1
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com
import requests

# Баланс QIWI Кошелька
def balance(login, api_access_token):
    s = requests.Session()
    s.headers['Accept']= 'application/json'
    s.headers['authorization'] = 'Bearer ' + api_access_token  
    b = s.get('https://edge.qiwi.com/funding-sources/v2/persons/' + login + '/accounts')
    return b.json()

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

{
    "accounts": [
        {
            "alias": "mc_beeline_rub",
            "fsAlias": "qb_mc_beeline",
            "bankAlias": "QIWI",
            "title": "MC",
            "type": {
                "id": "MC",
                "title": "Счет мобильного кошелька"
            },
            "hasBalance": false,
            "balance": null,
            "currency": 643
        },
        {
            "alias": "qw_wallet_rub",
            "fsAlias": "qb_wallet",
            "bankAlias": "QIWI",
            "title": "WALLET",
            "type": {
                "id": "WALLET",
                "title": "QIWI Wallet"
            },
            "hasBalance": true,
            "balance": {
                "amount": 8.74,
                "currency": 643
            },
            "currency": 643
        }
    ]
}
# номер кошелька в формате 79992223344
mylogin = '79999999999'
api_access_token = '975efd8e8376xxxb95fa7cb213xxx04'

# все балансы
balances = balance(mylogin,api_access_token)['accounts']

# рублевый баланс
rubAlias = [x for x in balances if x['alias'] == 'qw_wallet_rub']
rubBalance = rubAlias[0]['balance']['amount']

Повторный запрос, если в ответе пришел пустой объект balance и поле "hasBalance": true

GET /funding-sources/v2/persons/79115221133/accounts?timeout=1000&alias=qw_wallet_rub HTTP/1.1
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com

Успешный ответ содержит JSON-массив счетов вашего QIWI Кошелька для фондирования платежей и текущие балансы счетов:

Поле ответа Тип Описание
accounts Array[Object] Массив балансов
accounts[].alias String Псевдоним пользовательского баланса
accounts[].fsAlias String Псевдоним банковского баланса
accounts[].bankAlias String Псевдоним банка
accounts[].title String Название соответствующего счета кошелька
accounts[].hasBalance Boolean Логический признак реального баланса в системе QIWI Кошелек (не привязанная карта, не счет мобильного телефона и т.д.)
accounts[].currency Number(3) Код валюты баланса (ISO-4217). Возвращаются балансы в следующих валютах: 643 - российский рубль, 840 - американский доллар, 978 - евро
accounts[].type Object Сведения о счете
type.id, type.title String Описание счета
accounts[].balance Object Сведения о балансе данного счета.
Если объект пустой и при этом поле accounts[].hasBalance равно true, повторите запрос с дополнительными параметрами:
timeout=1000 и alias=accounts[].alias (псевдоним этого баланса)
balance.amount Number Текущий баланс данного счета
balance.currency Number(3) Код валюты баланса (ISO-4217)

Создание баланса

Запрос создает новый счет и баланс в вашем QIWI Кошельке. Список доступных для создания счетов можно получить другим запросом.

Потестировать

Запрос → POST

user@server:~$ curl -X POST "https://edge.qiwi.com/funding-sources/v2/persons/79115221133/accounts" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu" \
  -d '{  "alias": "qw_wallet_eur"}'
POST /funding-sources/v2/persons/79115221133/accounts HTTP/1.1
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Content-type: application/json
Host: edge.qiwi.com

{ "alias": "qw_wallet_eur" }
Название Тип Описание
alias String Псевдоним нового счета (см. запрос доступных счетов)

Ответ ←

HTTP/1.1 201 Created
Content-Type: application/json

Успешный ответ содержит HTTP-код 201.

Запрос доступных счетов

Запрос отображает псевдонимы счетов, доступных для создания в вашем QIWI Кошельке.

Потестировать

Запрос → GET

user@server:~$ curl -X GET "https://edge.qiwi.com/funding-sources/v2/persons/79115221133/accounts/offer" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu"
GET /funding-sources/v2/persons/79115221133/accounts/offer HTTP/1.1
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

{ { "alias": "qw_wallet_eur", "currency": 978 }, {} }

Успешный JSON-ответ содержит данные о счетах, которые можно создать:

Поле ответа Тип Описание
{} Object Коллекция описаний счетов
Object.alias String Псевдоним счета
Object.currency Number(3) Код валюты счета (ISO-4217)

Установка баланса по умолчанию

Запрос устанавливает для вашего QIWI Кошелька счет, баланс которого будет использоваться для фондирования всех платежей по умолчанию. Счет должен содержаться в списке счетов

Потестировать

Запрос → PATCH

user@server:~$ curl -X PATCH "https://edge.qiwi.com/funding-sources/v2/persons/79115221133/accounts/qw_wallet_usd" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu" \
  -d '{ "defaultAccount": true }'
PATCH /funding-sources/v2/persons/79115221133/accounts/qw_wallet_usd HTTP/1.1
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Content-type: application/json
Host: edge.qiwi.com

{ "defaultAccount": true }
Название Тип Описание
defaultAccount Boolean Признак установки счета по умолчанию

Ответ ←

HTTP/1.1 204 Modified
Content-Type: application/json

Успешный ответ содержит HTTP-код 204.

API QIWI Мастер

Последнее обновление: 2021-01-27 | Предложить правки на GitHub

API предоставляет доступ к управлению пакетом QIWI Мастер. Данный пакет услуг позволяет выпускать до пяти бесплатных виртуальных карт QIWI и перевыпускать карты неограниченное число раз. Выпуск карт сверх указанного количества оплачивается по тарифу.

Доступны два типа карт:

Для вызова методов API вам потребуется токен API QIWI Wallet с разрешениями на следующие действия:

Отметьте данные разрешения при выпуске токена API QIWI Wallet.

Token Scopes

Пошаговое руководство по интеграции API QIWI Мастер

Покупка пакета QIWI Мастер

Запрос → POST

user@server:~$ curl -X POST 'https://edge.qiwi.com/sinap/api/v2/terms/28004/payments' \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu" \
  -d '{ \
        "id":"1600884280003", \
        "sum": { \
          "amount":2999, \
          "currency":"643" \
        }, \
        "paymentMethod": { \
          "type":"Account", \
          "accountId":"643" \
        },
        "comment":"test", \
        "fields": { \
          "account":"79121112233", \
          "vas_alias":"qvc-master" \
        } \
      }'
POST /sinap/api/v2/terms/28004/payments HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com

{
 "id":"1600884280003",
 "sum": {
  "amount":2999,
  "currency":"643"
 },
 "paymentMethod": {
  "type":"Account",
  "accountId":"643"
 },
 "comment":"test",
 "fields": {
   "account":"79121112233",
   "vas_alias":"qvc-master"
 }
}
import requests
import time

# Перевод на QIWI Кошелек
def buy_qiwi_master(api_access_token, qw):
    s = requests.Session()
    s.headers = {'content-type': 'application/json'}
    s.headers['authorization'] = 'Bearer ' + api_access_token
    s.headers['User-Agent'] = 'Android v3.2.0 MKT'
    s.headers['Accept'] = 'application/json'
    postjson = {"id":"","sum":{"amount":"","currency":""},"paymentMethod":{"type":"Account","accountId":"643"}, "fields":{"account":"", "vas_alias":"qvc-master"}}
    postjson['id'] = str(int(time.time() * 1000))
    postjson['sum']['amount'] = 2999
    postjson['sum']['currency'] = '643'
    postjson['fields']['account'] = qw
    res = s.post('https://edge.qiwi.com/sinap/api/v2/terms/28004/payments',json = postjson)
    return res.json()
Название Тип Описание Обяз.
fields.account String Номер кошелька для покупки пакета QIWI Мастер +
fields.vas_alias String Только qvc-master +

Ответ ←

print(buy_qiwi_master(mylogin,api_access_token,'+79261112233','comment',99.01))

>> Response
{'fields': {'account': '79261112233'},
 'id': '1514296828893',
 'source': 'account_643',
 'sum': {'amount': 2999.00, 'currency': '643'},
 'terms': '28004',
 'transaction': {'id': '11982501857', 'state': {'code': 'Accepted'}}}

Успешный JSON-ответ содержит объект PaymentInfo с данными о принятом платеже.

Выпуск виртуальной карты QIWI Мастер

Для выпуска виртуальной карты к пакету QIWI Мастер вам необходимо последовательно выполнить следующие запросы.

Шаг 1. Создание заказа

POST /cards/v2/persons/78000008024/orders HTTP/1.1
Accept: application/json
Authorization: Bearer f80f0875d8e45af7bdd244c7df3f1a3f
Content-Type: application/json
Host: edge.qiwi.com

{
 "cardAlias": "qvc-cpa"
}

Ответ

{
   "id": "<номер заказа>",
   "cardAlias": "qvc-cpa",
   "status": "DRAFT",
   "price": null,
   "cardId": null
}

Отправьте POST-запрос на адрес:

/cards/v2/persons/<номер кошелька>/orders

В ссылке запроса укажите номер кошелька с пакетом QIWI Мастер. В теле запроса укажите JSON с параметром:

Название Тип Описание Обяз.
cardAlias String Тип карты +

Успешный ответ содержит JSON с номером заказа:

Поле ответа Тип Описание
id String Номер заказа
cardAlias String Тип карты
status String Статус заказа
price Object Не заполняется
cardId String Не заполняется

Доступные для заказа типы карт

Название карты Описание cardAlias
QIWI Мастер Prepaid Для оплаты рекламы в сервисах Яндекс.Директ и myTarget "qvc-cpa"
QIWI Мастер Debit Для оплаты рекламы в сервисах Facebook и Google "qvc-cpa-debit"

Шаг 2. Подтверждение заказа

PUT /cards/v2/persons/78000008024/orders/920fa383-6209-4743-a5d1-883f473f7f95/submit HTTP/1.1
Accept: application/json
Authorization: Bearer f80f0875d8e45af7bdd244c7df3f1a3f
Content-Type: application/json
Host: edge.qiwi.com

Ответ, если карта бесплатная

{
   "id": "<номер заказа>",
   "cardAlias": "qvc-cpa",
   "status": "COMPLETED",
   "price": {
     "amount": 0,
     "currency": 643
   },
   "cardId": "<ID карты>"
}

Ответ, если карта платная

{
   "id": "<номер заказа>",
   "cardAlias": "qvc-cpa",
   "status": "PAYMENT_REQUIRED",
   "price": {
     "amount": <стоимость>,
     "currency": 643
   },
   "cardId": null
}

Отправьте PUT-запрос на адрес:

/cards/v2/persons/<номер кошелька>/orders/<номер заказа из ответа в Шаге 1>/submit

В ссылке запроса укажите номер кошелька с пакетом QIWI Мастер и номер заказа из ответа предыдущего шага (поле id). В теле запроса ничего не указывайте.

Успешный ответ содержит JSON со статусом заказа:

Поле ответа Тип Описание
id String Номер заказа
cardAlias String Тип карты
status String Статус заказа.
Если карта бесплатная, то COMPLETED. Если карта платная, то PAYMENT_REQUIRED.
price Object Сведения о платеже
amount Number(Decimal) Сумма покупки
currency Number(3) Валюта платежа (ISO-4217)
cardId String Номер карты. Не заполняется, если карта платная.

Шаг 3. Покупка карты

POST /sinap/api/v2/terms/32064/payments HTTP/1.1
Accept: application/json
Authorization: Bearer 68944212761e25f6fce457661cabba6c
Content-Type: application/json
Host: edge.qiwi.com

{
 "id": "1600884290004",
 "sum": {
   "amount": 99,
   "currency": "643"
 },
 "paymentMethod": {
   "type": "Account",
   "accountId": "643"
 },
 "fields": {
   "account": "78000008024",
   "order_id":"920fa383-6209-4743-a5d1-883f473f7f95"
 }
}

Отправьте POST-запрос на адрес:

/sinap/api/v2/terms/32064/payments

В теле запроса передается JSON-объект Payment. Набор реквизитов платежа в поле fields:

Название Тип Описание Обяз.
fields.account String Номер кошелька +
fields.order_id String Номер заказа карты из ответа на запрос +

Успешный JSON-ответ содержит объект PaymentInfo с данными о принятом платеже.

Список карт QIWI Мастер

GET /cards/v1/cards?vas-alias=qvc-master HTTP/1.1
Accept: application/json
Authorization: Bearer b15ba2d82db883697e8a35877e60e680
Host: edge.qiwi.com

Чтобы получить список всех ваших карт QIWI Мастер, отправьте GET-запрос на адрес:

/cards/v1/cards/?vas-alias=qvc-master

[
  {
    "qvx": {
      "id": 133789472,
      "maskedPan": "****9078",
      "status": "ACTIVE",
      "cardExpire": "2022-01-31T00:00:00+03:00",
      "cardType": "VIRTUAL",
      "cardAlias": "Facebook",
      "cardLimit": null,
      "activated": "2020-01-29T11:10:59+03:00",
      "smsResended": "2020-01-29T11:35:01+03:00",
      "postNumber": null,
      "blockedDate": null,
      "fullPan": null,
      "cardId": 2001291110576200000,
      "txnId": "2001291110576200000",
      "cardExpireMonth": "01",
      "cardExpireYear": "2022"
    },
    "balance": null,
    "info": {
      "id": 12,
      "name": "Виртуальная карта QIWI",
      "alias": "qvc-cpa",
      "price": {
        "amount": 99.0000,
        "currency": 643
      },
      "period": "за год",
      "type": "QVC_CPA",
      "details": {
        "info": "99 ₽, действует 1 год",
        "description": "",
        "tariffLink": "https://static.qiwi.com/qcms/files/1582791401478_5_JJ5vJe1L0szXzKb.pdf",
        "offerLink": "https://static.qiwi.com/ru/doc/qvc.pdf",
        "features": [
          "Покупки без комиссии"
        ],
        "requisites": [
          {
            "name": "Получатель",
            "value": "КИВИ Банк (АО)"
          },
          {
            "name": "ИНН",
            "value": "3123011520"
          },
          {
            "name": "Банк получателя",
            "value": "КИВИ Банк (АО)"
          },
          {
            "name": "БИК",
            "value": "044525416"
          },
          {
            "name": "КПП",
            "value": "772601001"
          },
          {
            "name": "Счет",
            "value": "47416810600000000004"
          },
          {
            "name": "Корр. счет",
            "value": "30101810645250000416 (открыт в ГУ Банка России по Центральному федеральному округу)"
          },
          {
            "name": "Назначение платежа",
            "value": "Пополнение QIWI Кошелька\nN +79258150000"
          }
        ]
      },
      "features": []
    }
  }
]

Успешный ответ содержит JSON-массив с данными выпущенных карт:

Поле ответа Тип Описание
qvx Object Общая информация о карте
id Number ID карты
maskedPan String Маскированный номер карты (отображаются только последние 4 цифры)
status String Текущий статус карты. Возможные значения: ACTIVE, SENDED_TO_BANK, SENDED_TO_USER, BLOCKED, UNKNOWN
cardExpire String Срок действия карты
cardType String Вид карты: всегда VIRTUAL (виртуальная карта)
cardAlias String Название карты в интерфейсе сайта qiwi.com
cardLimit Object Лимиты на карту
value Number Значение лимита
currencyCode Number(3) Код валюты (ISO-4217)
activated String Дата активации карты
smsResended String Дата высылки СМС с реквизитами
blockedDate String Дата блокировки
unblockAvailable Boolean Признак возможности разблокировать карту
txnId String ID транзакции заказа карты
cardExpireMonth String Месяц окончания действия карты
cardExpireYear String Год окончания действия карты
balance Object Данные баланса карты
amount Number Сумма баланса
currency Number(3) Код валюты баланса (ISO-4217)
info Object Тарифы и банковские реквизиты карты
alias String Тип карты
price Object Тариф карты
amount Number Стоимость обслуживания
currency Number(3) Код валюты баланса (ISO-4217)
period String Период обслуживания (по тарифу)
tariffLink String Ссылка на описание тарифа
offerLink String Ссылка на договор оферты на выпуск карты
requisites Array Список пар "ключ-значение" с данными банковских реквизитов для пополнения карты

Выписка по карте

GET /payment-history/v1/persons/78000008024/cards/158618787/statement?from=2020-01-01T00%3A00%3A00%2B03%3A00&till=2020-09-23T23%3A59%3A59%2B03%3A00 HTTP/1.1
Accept: application/json
Authorization: Bearer b15ba2d82db883697e8a35877e60e680
Host: edge.qiwi.com

Запрос предназначен для выгрузки операций по определенной карте за указанный период в тарифе QIWI Мастер.

Чтобы получить список операций по карте QIWI Мастер, отправьте GET-запрос на адрес:

/payment-history/v1/persons/<номер пользователя>/cards/<ID карты>/statement?from=<дата начала>&till=<дата окончания>

В запросе укажите:

Успешный ответ содержит файл с выпиской формата PDF в бинарном виде в формате application/pdf.

Блокировка карты

PUT /cards/v2/persons/78000006047/cards/70590106/block HTTP/1.1
Accept: application/json
Authorization: Bearer 68944212761e25f6fce457661cabba6c
Host: edge.qiwi.com

Чтобы заблокировать выбранную карту тарифа QIWI Мастер, отправьте PUT-запрос на адрес:

/cards/v2/persons/<номер пользователя>/cards/<ID карты>/block

В запросе укажите:

Ответ ←

HTTP/1.1 202 Accepted
Content-Type: application/json

Успешный ответ содержит HTTP-код 202.

Разблокировка карты

PUT /cards/v2/persons/78000006047/cards/111887288/unblock HTTP/1.1
Accept: application/json
Authorization: Bearer 68944212761e25f6fce457661cabba6c
Host: edge.qiwi.com

Ответ

{
   "status": "OK",
   "nextConfirmationRequest": null,
   "confirmationId": null,
   "operationId": null
}

Чтобы разблокировать выбранную карту, отправьте PUT-запрос на адрес:

/cards/v2/persons/<номер пользователя>/cards/<ID карты>/unblock

В запросе укажите:

Успешный ответ содержит JSON со статусом операции:

Поле ответа Тип Описание
status String Статус операции: OK, FAIL, CONFIRMATION_REQUIRED или CONFIRMATION_LIMIT_EXCEED
confirmationId String ID подтверждения (null для API)
operationId String ID операции (null для API)
nextConfirmationRequest String Дата следующей возможности запросить подтверждение (null для API)

Получение реквизитов карты

PUT /cards/v1/cards/158619365/details HTTP/1.1
Accept: application/json
Authorization: Bearer 68944212761e25f6fce457661cabba6c
Content-Type: application/json
Host: edge.qiwi.com

{
   "operationId": "43555447-a026-4c17-b56d-6956a09249c9"
}

Ответ

{
   "status": "OK",
   "cvv": "111",
   "pan": "44441111222233333",
   "errorCode": "0"
}

Чтобы получить платежные реквизиты карты (PAN и CVV), отправьте PUT-запрос на адрес:

/cards/v1/cards/<ID карты>/details

В запросе укажите ID карты, полученный при ее выпуске или из ответа на запрос списка карт.

В теле запроса укажите JSON с параметром:

Название Тип Описание Обяз.
operationId String Произвольный UUID +

Успешный ответ содержит JSON с PAN и CVV карты:

Поле ответа Тип Описание
status String Статус операции: OK, FAIL, CONFIRMATION_REQUIRED или CONFIRMATION_LIMIT_EXCEED
cvv String CVV карты
pan String PAN карты
errorCode String Код ошибки

Переименование карты

PUT /cards/v1/cards/158619365/alias HTTP/1.1
Accept: application/json
Authorization: Bearer 68944212761e25f6fce457661cabba6c
Content-Type: application/json
Host: edge.qiwi.com

{
   "alias": "new card name"
}

Ответ

{
   "status": "OK",
   "error": "OK",
   "errorCode": "OK"
}

Чтобы изменить название карты в интерфейсе сайта qiwi.com, отправьте PUT-запрос на адрес:

/cards/v1/cards/<ID карты>/alias

В теле запроса укажите JSON с параметром:

Название Тип Описание Обяз.
alias String Новое пользовательское имя карты +

Успешный ответ содержит JSON со статусом операции:

Поле ответа Тип Описание
status String Статус операции:OK или FAIL
error String Текстовое описание ошибки
errorCode String Код ошибки

Платежное API

Последнее обновление: 2020-07-06 | Предложить правки на GitHub

API предоставляет доступ к платежам в пользу провайдеров услуг, зарегистрированных в сервисах QIWI Кошелька.

Комиссионные тарифы

Чтобы узнать комиссию за платеж до его совершения, используйте данный запрос (требуется авторизация). Возвращается полная комиссия QIWI Кошелька за платеж в пользу указанного провайдера с учетом всех тарифов по заданному набору платежных реквизитов.

Запрос → POST

user@server:~$ curl -X POST 'https://edge.qiwi.com/sinap/providers/99/onlineCommission' \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu" \
  -d '{ \
        "account":"380995238345", \
        "paymentMethod":{ \
          "type":"Account", \
          "accountId":"643" \
        },\
        "purchaseTotals":{ \
          "total":{ \
            "amount":10, \
            "currency":"643" \
          } \
        } \
  }'
POST /sinap/providers/99/onlineCommission HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com

{
  "account":"380995238345",
  "paymentMethod":{
    "type":"Account",
    "accountId":"643"
  },
  "purchaseTotals":{
    "total":{
      "amount":10,
      "currency":"643"
    }
  }
}
import requests

# Тарифные комиссии
def get_commission(api_access_token, to_account, prv_id, sum_pay):
    s = requests.Session()
    s.headers = {'content-type': 'application/json'}
    s.headers['authorization'] = 'Bearer ' + api_access_token  
    postjson = {"account":"","paymentMethod":{"type":"Account","accountId":"643"}, "purchaseTotals":{"total":{"amount":"","currency":"643"}}}
    postjson['account'] = to_account
    postjson['purchaseTotals']['total']['amount'] = sum_pay
    c_online = s.post('https://edge.qiwi.com/sinap/providers/'+prv_id+'/onlineCommission',json = postjson)
    return c_online.json()['qwCommission']['amount']
Название Тип Описание
account String Пользовательский идентификатор (номер телефона с международным префиксом, номер карты/счета получателя, и т.д., в зависимости от провайдера)
paymentMethod Object Объект, определяющий обработку платежа процессингом QIWI Wallet. Содержит следующие параметры:
paymentMethod.type String Метод платежа, только Account
paymentMethod.accountId String Идентификатор счета, только 643.
purchaseTotals Object Объект с платежными реквизитами
purchaseTotals.total Object Объект, содержащий данные о сумме платежа:
total.amount Number Сумма (можно указать рубли и копейки, разделитель .). Положительное число, округленное до 2 знаков после десятичной точки. При большем числе знаков значение будет округлено до копеек в меньшую сторону.
total.currency String Валюта (только 643, рубли)
HTTP/1.1 200 OK
Content-Type: application/json

{
    "providerId": 99,
    "withdrawSum": {
        "amount": 1011.01,
        "currency": "643"
    },
    "enrollmentSum": {
        "amount": 1001,
        "currency": "643"
    },
    "qwCommission": {
        "amount": 10.01,
        "currency": "643"
    },
    "fundingSourceCommission": {
        "amount": 0,
        "currency": "643"
    },
    "withdrawToEnrollmentRate": 1
}
api_access_token = '975efd8e8376xxxb95fa7cb213xxx04'

# Комиссия за перевод на QIWI кошелек
print(get_commission(api_access_token,'+380000000000','99',5000))
# Комиссия за перевод на карту
print(get_commission(api_access_token,'4890xxxxxxxx1698','22351',1000))

Ответ ←

Рассчитанная сумма комиссии возвращается в поле qwCommission.amount JSON-ответа.

Автозаполнение платежных форм

Данный запрос отображает в браузере предзаполненную форму на сайте qiwi.com для совершения платежа.

Пример ссылки (нажмите для перехода на форму)

Если вы не хотите, чтобы пользователь видел номер вашего кошелька на форме, используйте перевод по никнейму:

Пример ссылки на перевод по никнейму (нажмите для перехода на форму)

Запрос → GET

GET /payment/form/99?extra%5B%27account%27%5D=79991112233&amountInteger=1&amountFraction=0&extra%5B%27comment%27%5D=test123&currency=643 HTTP/1.1
Host: qiwi.com

Название Тип Описание Поле на форме Обяз.
amountInteger Integer Целая часть суммы платежа (рубли). Если параметр не указан, поле "Сумма" на форме будет пустым. Допустимо число не больше 99 999 (ограничение на сумму платежа) Сумма -
amountFraction Integer Дробная часть суммы платежа (копейки). Если параметр не указан, поле "Сумма" на форме будет пустым. Сумма -
currency Константа, 643 Код валюты платежа. Обязательный параметр, если вы передаете в ссылке сумму платежа - +
extra['comment'] URL-encoded string Комментарий. Параметр используется только для ID=99 Комментарий к переводу -
extra['account'] URL-encoded string Формат совпадает с форматом параметра fields.account при оплате соответствующих провайдеров: для провайдера 99 - номер кошелька получателя; для провайдеров сотовой связи - номер мобильного телефона для пополнения (без префикса 8); для провайдеров перевода на карту - номер банковской карты получателя (без пробелов), для других провайдеров - идентификатор пользователя. Для провайдера 99999 указывается никнейм или номер кошелька получателя (задайте соответствующее значение параметра extra['accountType']). Номер Кошелька, номер телефона/счета/карты/пользовательский ID получателя. -
blocked Array[String] Признак неактивного поля формы. Пользователь не сможет менять значение данного поля. Каждый параметр задает соответствующее поле формы и нумеруется начиная с нуля (blocked[0], blocked[1] и т.д.). Если не указан, пользователь сможет изменить все поля формы. Допустимые значения:
sum - поле "сумма платежа",
account - поле "номер счета/телефона/карты",
comment - поле "комментарий".
Пример (неактивное поле суммы платежа): blocked[0]=sum
- -
extra['accountType'] URL-encoded string Параметр используется только для ID=99999. Значение определяет перевод на QIWI кошелек по никнейму или по номеру кошелька. Если вы не хотите, чтобы пользователь видел номер вашего кошелька на форме, используйте перевод по никнейму.
phone - для перевода по номеру
nickname - для перевода по никнейму.
   

Как узнать свой никнейм через API

Используйте данный запрос:

Запрос → GET

user@server:~$ curl -X GET "https://edge.qiwi.com/qw-nicknames/v1/persons/79111234567/nickname" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer 5c4b25xx93aa435d9cb8cd17480356f9"
GET /qw-nicknames/v1/persons/79111234567/nickname HTTP/1.1
Accept: application/json
Authorization: Bearer 5c4b25xx93aa435d9cb8cd17480356f9
Host: edge.qiwi.com

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

{
  "canChange": true,
  "canUse": true,
  "description": "",
  "nickname": "NICKNAME"
}

Успешный ответ в формате JSON содержит никнейм вашего кошелька в поле nickname.

Перевод на QIWI Кошелек

Запрос → POST

user@server:~$ curl -X POST 'https://edge.qiwi.com/sinap/api/v2/terms/99/payments' \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu" \
  -d '{ \
        "id":"11111111111111", \
        "sum": { \
          "amount":100, \
          "currency":"643" \
        }, \
        "paymentMethod": { \
          "type":"Account", \
          "accountId":"643" \
        },
        "comment":"test", \
        "fields": { \
          "account":"+79121112233" \
        } \
      }'
POST /sinap/api/v2/terms/99/payments HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com

{
 "id":"11111111111111",
 "sum": {
  "amount":100.50,
  "currency":"643"
 },
 "paymentMethod": {
  "type":"Account",
  "accountId":"643"
 },
 "comment":"test",
 "fields": {
	"account":"+79121112233"
 }
}
import requests
import time

# Перевод на QIWI Кошелек
def send_p2p(api_access_token, to_qw, comment, sum_p2p):
    s = requests.Session()
    s.headers = {'content-type': 'application/json'}
    s.headers['authorization'] = 'Bearer ' + api_access_token
    s.headers['User-Agent'] = 'Android v3.2.0 MKT'
    s.headers['Accept'] = 'application/json'
    postjson = {"id":"","sum":{"amount":"","currency":""},"paymentMethod":{"type":"Account","accountId":"643"}, "comment":"'+comment+'","fields":{"account":""}}
    postjson['id'] = str(int(time.time() * 1000))
    postjson['sum']['amount'] = sum_p2p
    postjson['sum']['currency'] = '643'
    postjson['fields']['account'] = to_qw
    res = s.post('https://edge.qiwi.com/sinap/api/v2/terms/99/payments',json = postjson)
    return res.json()
Название Тип Описание Обяз.
fields.account String Номер кошелька для перевода +

Ответ ←

print(send_p2p(mylogin,api_access_token,'+79261112233','comment',99.01))

{'comment': 'comment',
 'fields': {'account': '+79261112233'},
 'id': '1514296828893',
 'source': 'account_643',
 'sum': {'amount': 99.01, 'currency': '643'},
 'terms': '99',
 'transaction': {'id': '11982501857', 'state': {'code': 'Accepted'}}}

Успешный JSON-ответ содержит объект PaymentInfo с данными о принятом платеже.

Конвертация

Метод выполняет перевод средств на валютный счет QIWI Кошелька с конвертацией с вашего рублевого счета. При этом формируются две транзакции: конвертации между счетами вашего кошелька и перевода на другой кошелек. Курс валют для конвертации можно узнать другим запросом.

Запрос → POST

user@server:~$ curl -X POST 'https://edge.qiwi.com/sinap/api/v2/terms/1099/payments' \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu" \
  -d '{ \
        "id":"11111111111111", \
        "sum": { \
          "amount":100, \
          "currency":"398" \
        }, \
        "paymentMethod": { \
          "type":"Account", \
          "accountId":"643" \
        }, \
        "comment":"test", \
        "fields": { \
          "account":"+79121112233" \
        } \
      }'
POST /sinap/api/v2/terms/1099/payments HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com

{
  "id":"11111111111111",
  "sum": {
		"amount":10.00,
		"currency":"398"
	},
	"paymentMethod": {
		"type":"Account",
		"accountId":"643"
	},
	"comment":"test",
	"fields": {
	 	"account":"+79121112233"
	}
}
import requests
import time

# Конвертация в QIWI Кошельке (currency - код валюты String)
def exchange(api_access_token, sum_exchange, currency, to_qw):
    s = requests.Session()
    currencies = ['398', '840', '978']
    if currency not in currencies:
      print('This currency not available')
      return
    s.headers = {'content-type': 'application/json'}
    s.headers['authorization'] = 'Bearer ' + api_access_token
    s.headers['User-Agent'] = 'Android v3.2.0 MKT'
    s.headers['Accept'] = 'application/json'
    postjson = {"id":"","sum":{"amount":"","currency":""},"paymentMethod":{"type":"Account","accountId":"643"}, "comment":"'+comment+'","fields":{"account":""}}
    postjson['id'] = str(int(time.time() * 1000))
    postjson['sum']['amount'] = sum_exchange
    postjson['sum']['currency'] = currency
    postjson['fields']['account'] = to_qw
    res = s.post('https://edge.qiwi.com/sinap/api/v2/terms/1099/payments',json = postjson)
    return res.json()
Название Тип Описание Обяз.
fields.account String Номер кошелька для перевода +

Ответ ←

Успешный JSON-ответ содержит объект PaymentInfo с данными о принятом платеже.

Курсы валют

Метод возвращает текущие курсы и кросс-курсы валют КИВИ Банка.

Запрос → GET

user@server:~$ curl "https://edge.qiwi.com/sinap/crossRates" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer 5c4b25xx93aa435d9cb8cd17480356f9"
GET /sinap/crossRates HTTP/1.1
Accept: application/json
Authorization: Bearer 5c4b25xx93aa435d9cb8cd17480356f9
Content-type: application/json
Host: edge.qiwi.com
import requests

# Курс пары валют (коды валют в String)
def exchange(api_access_token, currency_to, currency_from):
    s = requests.Session()
    s.headers = {'content-type': 'application/json'}
    s.headers['authorization'] = 'Bearer ' + api_access_token
    s.headers['User-Agent'] = 'Android v3.2.0 MKT'
    s.headers['Accept'] = 'application/json'
    res = s.get('https://edge.qiwi.com/sinap/crossRates')

    # все курсы
    rates = res.json()['result']

    # запрошенный курс
    rate = [x for x in rates if x['from'] == currency_from and x['to'] == currency_to]
    if (len(rate) == 0):
        print('No rate for this currencies!')
        return
    else:
        return rate[0]['rate']

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

{
    "result": [
        {
            "set": "General",
            "from": "398",
            "to": "643",
            "rate": 6.22665
        },
        {
            "set": "General",
            "from": "398",
            "to": "756",
            "rate": 412.0174305
        },
        ...,
        {
            "set": "General",
            "from": "980",
            "to": "978",
            "rate": 31.4680914
        }
    ]
}

Успешный JSON-ответ содержит список курсов валют в списке result. Элемент списка соответствует валютной паре:

Поле ответа Тип Описание
from String Валюта покупки
to String Валюта продажи
rate Number Курс

Оплата сотовой связи

Запрос → POST

user@server:~$ curl -X POST "https://edge.qiwi.com/sinap/api/v2/terms/1/payments" \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu" \
  -d '{ \
        "id":"11111111111111", \
        "sum": { \
          "amount":100, \
          "currency":"643" \
        }, \
        "paymentMethod": { \
          "type":"Account", \
          "accountId":"643" \
        }, \
        "fields": { \
          "account":"9161112233" \
        } \
      }'
POST /sinap/api/v2/terms/1/payments HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com

{
  "id":"21131343",
  "sum": {
        "amount":1000,
        "currency":"643"
  },
  "paymentMethod": {
      "type":"Account",
      "accountId":"643"
  },
  "fields": {
        "account":"9161112233"
  }
}
import requests
import time

# Оплата мобильного телефона
def send_mobile(api_access_token, prv_id, to_account, comment, sum_pay):
    s = requests.Session()
    s.headers['Accept'] = 'application/json'
    s.headers['Content-Type'] = 'application/json'
    s.headers['authorization'] = 'Bearer ' + api_access_token
    postjson = {"id":"","sum": {"amount":"","currency":"643"},"paymentMethod": {"type":"Account","accountId":"643"},"comment":"","fields": {"account":""}}
    postjson['id'] = str(int(time.time() * 1000))
    postjson['sum']['amount'] = sum_pay
    postjson['fields']['account'] = to_account
    postjson['comment'] = comment
    res = s.post('https://edge.qiwi.com/sinap/api/v2/terms/'+prv_id+'/payments', json = postjson)
    return res.json()
Название Тип Описание
fields.account String Номер мобильного телефона для пополнения (без префикса 8)

Ответ ←

send_mobile(api_access_token,'2','9670058909','123','1')

Успешный JSON-ответ содержит объект PaymentInfo с данными о принятом платеже.

Перевод на карту

Запрос выполняет денежный перевод на карты платежных систем Visa, MasterCard или МИР. Предварительно можно узнать код провайдера для перевода на карту по номеру карты.

Запрос → POST

Пример перевода на карту банка РФ

user@server:~$ curl -X POST "https://edge.qiwi.com/sinap/api/v2/terms/1963/payments" \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu" \
  -d '{ \
        "id":"21131343", \
        "sum":{ \
          "amount":1000, \
          "currency":"643" \
        }, \
        "paymentMethod":{ \
          "type":"Account", \
          "accountId":"643" \
        }, \
        "fields": { \
          "account":"4256********1231" \
        } \
      }'
POST /sinap/api/v2/terms/1963/payments HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com

{
  "id":"21131343",
  "sum": {
        "amount":1000,
        "currency":"643"
  },
  "paymentMethod": {
      "type":"Account",
      "accountId":"643"
  },
  "fields": {
        "account":"4256XXXXXXXX1231"
  }
}

Пример перевода на международную карту

user@server:~$ curl -X POST "https://edge.qiwi.com/sinap/api/v2/terms/1960/payments" \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu" \
  -d '{ \
        "id":"21131343", \
        "sum":{ \
          "amount":1000, \
          "currency":"643"
        }, \
        "paymentMethod":{ \
          "type":"Account", \
          "accountId":"643" \
        }, \
        "fields": { \
          "account": "402865XXXXXXXXXX", \
          "rec_address": "Ленинский проспект 131, 56", \
          "rec_city": "Москва", \
          "rec_country": "Россия", \
          "reg_name": "Виктор", \
          "reg_name_f": "Петров", \
          "rem_name": "Сергей", \
          "rem_name_f": "Иванов" \
        } \
      }'
POST /sinap/api/v2/terms/1960/payments HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com

{
  "id":"21131343",
  "sum": {
        "amount":1000,
        "currency":"643"
  },
  "paymentMethod": {
      "type":"Account",
      "accountId":"643"
  },
  "fields": {
      "account": "402865XXXXXXXXXX",
      "rec_address": "Ленинский проспект 131, 56",
      "rec_city": "Москва",
      "rec_country": "Россия",
      "reg_name": "Виктор",
      "reg_name_f": "Петров",
      "rem_name": "Сергей",
      "rem_name_f": "Иванов"
  }
}
import requests
import time

# Перевод на карту
def send_card(api_access_token, payment_data):
    # payment_data - dictionary with all payment data
    s = requests.Session()
    s.headers['Accept'] = 'application/json'
    s.headers['Content-Type'] = 'application/json'
    s.headers['authorization'] = 'Bearer ' + api_access_token
    postjson = {"id":"","sum": {"amount":"","currency":"643"},"paymentMethod": {"type":"Account","accountId":"643"},"fields": {"account":""}}
    postjson['id'] = str(int(time.time() * 1000))
    postjson['sum']['amount'] = payment_data.get('sum')
    postjson['fields']['account'] = payment_data.get('to_card')
    prv_id = payment_data.get('prv_id')
    if payment_data.get('prv_id') in ['1960', '21012']:
        postjson['fields']['rem_name'] = payment_data.get('rem_name')
        postjson['fields']['rem_name_f'] = payment_data.get('rem_name_f')
        postjson['fields']['reg_name'] = payment_data.get('reg_name')
        postjson['fields']['reg_name_f'] = payment_data.get('reg_name_f')
        postjson['fields']['rec_city'] = payment_data.get('rec_address')
        postjson['fields']['rec_address'] = payment_data.get('rec_address')
        
    res = s.post('https://edge.qiwi.com/sinap/api/v2/terms/' + prv_id + '/payments', json = postjson)
    return res.json()

Параметры для ID 1963, 21013, 31652, 22351

Название Тип Описание
fields.account String Номер банковской карты получателя (без пробелов)

Параметры для ID 1960, 21012

Название Тип Описание
fields.account String Номер банковской карты получателя (без пробелов)
fields.rem_name String Имя отправителя
fields.rem_name_f String Фамилия отправителя
fields.rec_address String Адрес отправителя (без почтового индекса, в произвольной форме)
fields.rec_city String Город отправителя
fields.rec_country String Страна отправителя
fields.reg_name String Имя получателя
fields.reg_name_f String Фамилия получателя

Ответ ←

payment_data = {'prv_id': '1963', 'to_card' : '41548XXXXXXXX008', 'sum': 100}

jss = send_card(token, payment_data)

Успешный JSON-ответ содержит объект PaymentInfo с данными о принятом платеже.

Банковский перевод

Запрос выполняет денежный перевод на карты/счета физических лиц, открытые в российских банках.

Перевод по номеру карты

Запрос выполняет денежный перевод на карты физических лиц, выпущенные российскими банками.

Запрос → POST

user@server:~$ curl -X POST "https://edge.qiwi.com/sinap/api/v2/terms/464/payments" \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu" \
  -d '{ \
        "id":"21131343", \
        "sum": { \
          "amount":1000, \
          "currency":"643" \
        }, \
        "paymentMethod": { \
          "type":"Account", \
          "accountId":"643" \
        }, \
        "fields": { \
          "account_type": "1", \
          "account":"4256********1231", \
          "exp_date": "MMYY" \
        } \
      }'
POST /sinap/api/v2/terms/464/payments HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com

{
  "id":"21131343",
  "sum": {
        "amount":1000,
        "currency":"643"
  },
  "paymentMethod": {
      "type":"Account",
      "accountId":"643"
  },
  "fields": {
        "account":"4256********1231",
        "account_type": "1",
        "exp_date": "MMYY"
  }
}
Название Тип Описание
fields.account String Номер банковской карты получателя (без пробелов)
fields.exp_date String Срок действия карты, в формате ММГГ (например, 0218). Параметр указывается только в случае перевода на карту Альфа-Банка (ID 464) и Промсвязьбанка (ID 821).
fields.account_type String Тип банковского идентификатора. Номер карты соответствует типу 1. Для некоторых банков применяются собственные значения:
Россельхозбанк - 5
ВТБ - 5
Промсвязьбанк - 7
Сбербанк - 5
МОСКОВСКИЙ КРЕДИТНЫЙ БАНК - 5.
fields.mfo String БИК соответствующего банка/территориального отделения банка
fields.lname String Фамилия получателя
fields.fname String Имя получателя
fields.mname String Отчество получателя

Ответ ←

Успешный JSON-ответ содержит объект PaymentInfo с данными о принятом платеже.

Перевод по номеру счета/договора

Запрос выполняет денежный перевод на счета физических лиц, открытые в российских банках. Возможен обычный перевод или перевод с использованием сервиса срочного перевода (исполнение в течение часа, с 9:00 до 19:30).

Запрос → POST

user@server:~$ curl -X POST "https://edge.qiwi.com/sinap/api/v2/terms/816/payments" \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu" \
  -d '{ \
        "id":"21131343", \
        "sum": { \
          "amount":1000, \
          "currency":"643" \
        }, \
        "paymentMethod": { \
          "type":"Account", \
          "accountId":"643" \
        }, \
        "fields": { \
          "account_type": "2", \
          "urgent": "0", \
          "lname": "Иванов", \
          "fname": "Иван", \
          "mname": "Иванович", \
          "mfo": "046577795", \
          "account":"40817***" \
        } \
      }'
POST /sinap/api/v2/terms/816/payments HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com

{
  "id":"21131343",
  "sum": {
        "amount":1000,
        "currency":"643"
  },
  "paymentMethod": {
      "type":"Account",
      "accountId":"643"
  },
  "fields": {
          "account_type": "2",
          "urgent": "0",
          "lname": "Иванов",
          "fname": "Иван",
          "mname": "Иванович",
          "mfo": "046577795",
          "account":"40817***"
  }
}
Название Тип Описание
fields.account String Номер банковского счета получателя
fields.urgent String Признак ускоренного перевода. Значение 0 — не использовать; значение 1 — выполнить перевод через Сервис срочного перевода ЦБ РФ. Внимание! Взимается дополнительная комиссия за ускоренный перевод
fields.mfo String БИК соответствующего банка/территориального отделения банка
fields.account_type String Тип банковского идентификатора. Номер счета (2) или номер договора (3). Для некоторых банков применяются собственные значения:
Промсвязьбанк — 9
ВТБ — 5
ХоумКредит Банк — 6.
fields.lname String Фамилия получателя
fields.fname String Имя получателя
fields.mname String Отчество получателя
fileds.agrnum String Номер договора. Только для переводов в ХоумКредит Банк

Ответ ←

Успешный JSON-ответ содержит объект PaymentInfo с данными о принятом платеже.

Оплата других услуг

Оплата услуги по идентификатору пользователя. Данный запрос применяется для провайдеров, использующих в реквизитах единственный пользовательский идентификатор, без проверки номера аккаунта.

Запрос → POST

user@server:~$ curl -X POST "https://edge.qiwi.com/sinap/api/v2/terms/674/payments" \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu" \
  -d '{ \
        "id":"21131343", \
        "sum": { \
          "amount":100, \
          "currency":"643" \
        },\
        "paymentMethod": { \
          "type":"Account", \
          "accountId":"643" \
        }, \
        "fields": { \
          "account":"111000000" \
        } \
      }'
POST /sinap/api/v2/terms/674/payments HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com

{
  "id":"21131343",
  "sum": {
        "amount":100,
        "currency":"643"
  },
  "paymentMethod": {
      "type":"Account",
      "accountId":"643"
  },
  "fields": {
        "account":"111000"
  }
}
import requests
import time

# оплата простого провайдера

def pay_simple_prv(api_access_token, prv_id, to_account, sum_pay):
    s = requests.Session()
    s.headers['Accept'] = 'application/json'
    s.headers['Content-Type'] = 'application/json'
    s.headers['authorization'] = 'Bearer ' + api_access_token
    postjson = {"id":"","sum": {"amount":"","currency":"643"},"paymentMethod": {"type":"Account","accountId":"643"},"fields": {"account":""}}
    postjson['id'] = str(int(time.time() * 1000))
    postjson['sum']['amount'] = sum_pay
    postjson['fields']['account'] = to_account
    res = s.post('https://edge.qiwi.com/sinap/api/v2/terms/'+prv_id+'/payments', json = postjson)
    return res.json()
Название Тип Описание
fields.account String Пользовательский идентификатор

Ответ ←

Успешный JSON-ответ содержит объект PaymentInfo с данными о принятом платеже.

Платеж по свободным реквизитам

Оплата услуг коммерческих организаций по их банковским реквизитам.

Запрос → POST

user@server:~$ curl -X POST "https://edge.qiwi.com/sinap/api/v2/terms/1717/payments" \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YUu2qw048gtdsvlk3iu" \
  --header "User-Agent: ***" \
  -d '{ \
  "id":"21131343", \
  "sum": { \
        "amount":1000, \
        "currency":"643" \
  }, \
  "paymentMethod": { \
      "type":"Account", \
      "accountId":"643" \
  }, \
  "fields": { \
         "extra_to_bik":"044525201", \
         "requestProtocol":"qw1", \
         "city":"МОСКВА", \
         "name":"ПАО АКБ \"АВАНГАРД\"", \
         "to_bik":"044525201", \
         "urgent":"0", \
         "to_kpp":"772111001", \
         "is_commercial":"1", \
         "nds":"НДС не облагается", \
         "goal":" Оплата товара по заказу №090738231", \
         "from_name_p":"Николаевич", \
         "from_name":"Иван", \
         "from_name_f":"Михайлов", \
         "info":"Коммерческие организации", \
         "to_name":"ООО \"Технический Центр ДЕЛЬТА\"", \
         "to_inn":"7726111111", \
         "account":"40711100000012321", \
         "toServiceId":"1717" \
  } \
}'
POST /sinap/api/v2/terms/1717/payments HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com
User-Agent: ****

{
  "id":"21131343",
  "sum": {
        "amount":1000,
        "currency":"643"
  },
  "paymentMethod": {
      "type":"Account",
      "accountId":"643"
  },
  "fields": {
         "extra_to_bik":"044525201",
         "requestProtocol":"qw1",
         "city":"МОСКВА",
         "name":"ПАО АКБ \"АВАНГАРД\"",
         "to_bik":"044525201",
         "urgent":"0",
         "to_kpp":"772111001",
         "is_commercial":"1",
         "nds":"НДС не облагается",
         "goal":" Оплата товара по заказу №090738231",
         "from_name_p":"Николаевич",
         "from_name":"Иван",
         "from_name_f":"Михайлов",
         "info":"Коммерческие организации",
         "to_name":"ООО \"Технический Центр ДЕЛЬТА\"",
         "to_inn":"7726111111",
         "account":"40711100000012321",
         "toServiceId":"1717"
  }
}
Название Тип Описание
fields.name String Наименование банка получателя (кавычки экранируются символом \)
fields.extra_to_bik String БИК банка получателя
fields.to_bik String БИК банка получателя
fields.city String Город местонахождения получателя
fields.info String Константа, Коммерческие организации
fields.is_commercial String Служебная информация, константа 1
fields.to_name String Наименование организации (кавычки экранируются символом \)
fields.to_inn String ИНН организации
fields.to_kpp String КПП организации
fields.nds String Признак уплаты НДС. Если вы оплачиваете квитанцию и в ней не указан НДС, то строка НДС не облагается. В ином случае, строка В т.ч. НДС.
fields.goal String Назначение платежа
fields.urgent String Признак срочного платежа (0 - нет, 1 - да). Срочный платеж выполняется от 10 минут. Возможен по будням с 9:00 до 20:30 по московскому времени. Стоимость услуги — 25 рублей.
fields.account String Номер счета получателя
fields.from_name String Имя плательщика
fields.from_name_p String Отчество плательщика
fields.from_name_f String Фамилия плательщика
fields.requestProtocol String Служебная информация, константа qw1
fields.toServiceId String Служебная информация, константа 1717

Ответ ←

Успешный JSON-ответ содержит объект PaymentInfo с данными о принятом платеже.

Поиск провайдера

Поиск провайдера может понадобиться, если вы не знаете значения ID провайдера услуг для оплаты по идентификатору пользователя, либо для определения провайдера мобильной связи по номеру телефона или перевода на карту по номеру карты.

Определение провайдера перевода на карту

Определение провайдера перевода на карту выполняется данным запросом. В ответе возвращается идентификатор провайдера для запроса перевода на карту.

Запрос не требует авторизации.

Запрос → POST

user@server:~$ curl -X POST "https://qiwi.com/card/detect.action" \
  --header "Accept: application/json" \
  --header "Content-Type: application/x-www-form-urlencoded" \
  -d "cardNumber=4256********1231"
POST /card/detect.action HTTP/1.1
Host: qiwi.com
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache

cardNumber=4256********1231
import requests

def card_system(card_number):
    s = requests.Session()
    res = s.post('https://qiwi.com/card/detect.action', data = {'cardNumber': card_number })
    return res.json()['message']
Название Тип Описание
cardNumber String Немаскированный номер карты (без пробелов). Обязательный параметр

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

{
  "code": {
    "value": "0",
    "_name": "NORMAL"
  },
  "data": null,
  "message": "1963",
  "messages": null
}
print(card_system(4890xxxxxxxx1698))

Не удалось определить платежную систему карты

HTTP/1.1 200 OK
Content-Type: application/json

{
    "code": {
        "value": "2",
        "_name": "ERROR"
    },
    "data": null,
    "message": "Неверно введен номер банковской карты. Попробуйте ввести номер еще раз.",
    "messages": {}
}

Ответ с HTTP Status 200 и параметром code.value = 0 является признаком успешной проверки. Идентификатор платежной системы находится в параметре message.

Ответ с HTTP Status 200 и параметром code.value = 2 означает, что в номере карты ошибка или платежная система не определена.

Определение мобильного оператора

Предварительное определение оператора мобильного номера выполняется данным запросом. В ответе возвращается идентификатор провайдера для запроса пополнения телефона.

Запрос → POST

user@server:~$ curl -X POST "https://qiwi.com/mobile/detect.action" \
  --header "Accept: application/json" \
  --header "Content-Type: application/x-www-form-urlencoded" \
  -d "phone=79651238341"
POST /mobile/detect.action HTTP/1.1
Host: qiwi.com
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache

phone=79651238341
import requests

def mobile_operator(phone_number):
    s = requests.Session()
    res = s.post('https://qiwi.com/mobile/detect.action', data = {'phone': phone_number })
    s.headers['Accept'] = 'application/json'
    s.headers['Content-Type'] = 'application/x-www-form-urlencoded'
    return res.json()['message']
Название Тип Описание
phone String URL-encoded Мобильный номер в международном формате без знака +. Обязательный параметр.

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

{
  "code": {
    "value": "0",
    "_name": "NORMAL"
  },
  "data": null,
  "message": "3",
  "messages": null
}

Не удалось определить мобильного оператора

HTTP/1.1 200 OK
Content-Type: application/json

{
  "code": {
    "value": "2",
    "_name": "ERROR"
  },
 "data": null,
 "message": "По указанному номеру невозможно определить оператора сотовой связи. Воспользуйтесь поиском.",
 "messages": {}
}
print(mobile_operator(79652468447))

Ответ с HTTP Status 200 и параметром code.value = 0 является признаком успешной проверки. Идентификатор оператора находится в параметре message.

Ответ с HTTP Status 200 и параметром code.value = 2 означает, что невозможно определить оператора.

Используйте API для поиска идентификатора провайдера.

Запрос → POST

user@server:~$ curl -X POST "https://qiwi.com/search/results/json.action?searchPhrase=%D0%91%D0%B8%D0%BB%D0%B0%D0%B9%D0%BD+%D0%B4%D0%BE%D0%BC%D0%B0%D1%88%D0%BD%D0%B8%D0%B9+%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82" \
  --header "Accept: application/json"
POST /search/results/json.action?searchPhrase=%D0%91%D0%B8%D0%BB%D0%B0%D0%B9%D0%BD+%D0%B4%D0%BE%D0%BC%D0%B0%D1%88%D0%BD%D0%B8%D0%B9+%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82 HTTP/1.1
Accept: application/json
Host: qiwi.com
import requests

# поиск на qiwi.com - определение id провайдера по названию
def qiwi_com_search(search_phrase):
    s = requests.Session()
    search = s.post('https://qiwi.com/search/results/json.action', params={'searchPhrase':search_phrase})
    return search.json()['data']['items']

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json
  
{
  "data": {
    ...
    "items": [
      {
        "item": {
          "id": {
            "id": "120",
            ...
          },
          ...
        },
        ...
      }
    ]
  }
}
# Поиск провайдера
prv = qiwi_com_search('Билайн домашний интернет')[0]['item']['id']['id']
print(prv)

Успешный JSON-ответ содержит идентификаторы найденных провайдеров:

Поле ответа Тип Описание
data.items Array Список провайдеров
items[].item.id.id String Идентификатор провайдера

Модели данных API

Класс Payment

Объект, описывающий данные для платежа на провайдера в QIWI Кошельке.

Элемент Тип Описание Обяз.
id String Клиентский ID транзакции (максимум 20 цифр). Должен быть уникальным для каждой транзакции и увеличиваться с каждой последующей транзакцией. Для выполнения этих требований рекомендуется задавать равным 1000*(Standard Unix time в секундах). +
sum Object Данные о сумме платежа  
sum.amount Number Сумма (можно указать рубли и копейки, разделитель .). Положительное число, округленное до 2 знаков после десятичной точки. При большем числе знаков значение будет округлено до копеек в меньшую сторону. +
sum.currency String Валюта (только 643, рубли) +
paymentMethod Object Объект, определяющий обработку платежа процессингом QIWI Wallet.  
paymentMethod.type String Константа, Account +
paymentMethod.accountId String Константа, 643 +
fields Object Реквизиты платежа. Состав полей зависит от провайдера.  
comment String Комментарий к платежу. Используется только для переводов на QIWI кошелек и при конвертации -

Класс PaymentInfo

{
    "id": "150217833198900",
    "terms": "99",
    "fields": {
        "account": "79121238345"
    },
    "sum": {
        "amount": 100,
        "currency": "643"
    },
    "transaction": {
        "id": "11155897070",
        "state": {
            "code": "Accepted"
        }
    },
    "source": "account_643",
    "comment": "test"
}

Пример ответа с маскированным полем

{
  "id": "21131343",
  "terms": "1963",
  "fields": {
          "account": "4256********1231"
    },
    "sum": {
         "amount": 1000,
         "currency": "643"
    },
    "source": "account_643",
    "transaction": {
         "id": "4969142201",
         "state": {
            "code": "Accepted"
          }
    }
}

Объект, описывающий данные платежной транзакции в QIWI Кошельке. Возвращается в ответ на запросы к платежному API.

Элемент Тип Описание
id Number Копия параметра id из платежного запроса
terms String Идентификатор провайдера, на которого был отправлен платеж
fields Object Копия объекта fields из платежного запроса. Номер карты (если был выполнен перевод на карту) возвращается в маскированном виде
sum Object Копия объекта sum из платежного запроса
source String Константа, account_643
comment String Копия параметра comment из платежного запроса (возвращается, если присутствует в запросе)
transaction Object Объект с данными о транзакции в процессинге QIWI Wallet.
transaction.id String ID транзакции в процессинге QIWI Wallet
transaction.state Object Объект содержит текущее состояние транзакции в процессинге QIWI Wallet.
state.code String Текущий статус транзакции, только значение Accepted (платеж принят к проведению). Финальный результат транзакции можно узнать в истории платежей.

Счета

Счет - универсальная заявка на платеж или перевод.

В API поддерживаются операции выставления, оплаты и отмены счетов, а также запрос списка неоплаченных счетов вашего QIWI кошелька.

Выставление счета на QIWI кошелек

Для выставления счета на QIWI Кошелек используется протокол API P2P-счетов. Для авторизации используется токен P2P.

Выпуск токена P2P

Вы можете получить токен P2P на p2p.qiwi.com в личном кабинете, или использовать представленный ниже запрос. Этим запросом можно также настроить адрес уведомлений об оплате счетов

Данный запрос возвращает пару токенов P2P (для выставления счета при вызове платежной формы и через API, соответственно) в полях ответа PublicKey и SecretKey. Для авторизации используется токен API QIWI Кошелька.

Запрос → POST

curl -X POST \
  https://edge.qiwi.com/widgets-api/api/p2p/protected/keys/create \
  -H 'Authorization: Bearer ec74********' \
  -H 'Content-Type: application/json' \
  -H 'cache-control: no-cache' \
  -d '{"keysPairName":"Name","serverNotificationsUrl":"https://test.com"}'
POST /widgets-api/api/p2p/protected/keys/create HTTP/1.1
Host: edge.qiwi.com
Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f
Content-Type: application/json
User-Agent: ****

{"keysPairName":"Name", "serverNotificationsUrl":"https://test.com"}
HTTP/1.1 200 OK
Content-Type: application/json

{"PublicKey": "XXX", "SecretKey": "YYY"}
Название Тип Описание
keysPairName String Название пары токенов P2P (произвольная строка)
serverNotificationsUrl String URL для уведомлений об оплате счетов (необязательный параметр)

Список счетов

Метод получения списка неоплаченных счетов вашего кошелька. Список строится в обратном хронологическом порядке. По умолчанию, список разбивается на страницы по 50 элементов в каждой, но вы можете задать другое количество элементов (не более 50). В запросе можно использовать фильтры по времени выставления счета, начальному идентификатору счета.

Запрос → GET

user@server:~$ curl -X GET --header 'Accept: application/json' \
   --header 'Authorization: Bearer ***' \
   'https://edge.qiwi.com/checkout-api/api/bill/search?statuses=READY_FOR_PAY&rows=50'
GET /checkout-api/api/bill/search?statuses=READY_FOR_PAY&rows=50 HTTP/1.1
Accept: application/json
Authorization: Bearer ***
Host: edge.qiwi.com
User-Agent: ****
Название Тип Описание
statuses String Статус неоплаченного счета. Обязательный параметр. Только строка READY_FOR_PAY
rows Integer Максимальное число счетов в ответе, для разбивки списка на страницы. Целое число от 1 до 50. По умолчанию возвращается не более 50 счетов.
min_creation_datetime Long Нижняя временная граница для поиска счетов, Unix-time
max_creation_datetime Long Верхняя временная граница для поиска счетов, Unix-time
next_id Number Начальный идентификатор счета для поиска. Будет возвращен список счетов с идентификаторами, равными или меньше этого значения. Используется для продолжения списка, разбитого на страницы.
next_creation_datetime Long Начальное время для поиска (возвращаются только счета, выставленные ранее этого времени), Unix-time. Используется для продолжения списка, разбитого на страницы.

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

{
  "bills": [
    {
      "id": 1063702405,
      "external_id": "154140605",
      "creation_datetime": 1523025585000,
      "expiration_datetime": 1523026003808,
      "sum": {
        "currency": 643,
        "amount": 100
      },
      "status": "READY_FOR_PAY",
      "type": "MERCHANT",
      "repetitive": false,
      "provider": {
        "id": 480706,
        "short_name": "Букмекерская контора ФОНБЕТ",
        "long_name": "ООО «Ф.О.Н.»",
        "logo_url":"https://static.qiwi.com/img/providers/logoBig/480706_l.png"
      },
      "comment": "Deposit to FON 13515573",
      "pay_url":"https://oplata.qiwi.com/form?shop=480706&transaction=102263702405"
    }
  ]
}

Успешный JSON-ответ содержит список неоплаченных счетов вашего кошелька, соответствующих заданному фильтру:

Поле ответа Тип Описание
bills Array[Object] Список счетов.
Длина списка равна или меньше параметру rows из запроса, или максимально 50, если параметр не указан
bills[].id Integer Идентификатор счета в QIWI Кошельке
bills[].external_id String Идентификатор счета у мерчанта
bills[].creation_datetime Long Дата/время создания счета, Unix-time
bills[].expiration_datetime Long Дата/время окончания срока действия счета, Unix-time
bills[].sum Object Сведения о сумме счета
sum.currency Integer Валюта суммы счета
sum.amount Number Сумма счета
bills[].status String Константа, READY_FOR_PAY
bills[].type String Константа, MERCHANT
bills[].repetitive Boolean Служебное поле
bills[].provider Object Информация о мерчанте
provider.id Integer Идентификатор мерчанта в QIWI
provider.short_name String Сокращенное название мерчанта
provider.long_name String Полное название мерчанта
provider.logo_url String Ссылка на логотип мерчанта
bills[].comment String Комментарий к счету
bills[].pay_url String Ссылка для оплаты счета на Платежной форме QIWI

Оплата счета

Выполнение безусловной оплаты счета без SMS-подтверждения.

Запрос → POST

user@server:~$ curl -X POST --header 'Content-Type: application/json;charset=UTF-8' \
   --header 'Accept: application/json' \
   --header 'Authorization: Bearer 68ec21fd52e4244838946dd07ed225a1' \
   -d '{ \
         "invoice_uid": "1063702405", \
         "currency": "643" \
        }' 'https://edge.qiwi.com/checkout-api/invoice/pay/wallet'
POST /checkout-api/invoice/pay/wallet HTTP/1.1
Accept: application/json
Content-type: application/json
Authorization: Bearer ***
Host: edge.qiwi.com
User-Agent: ****

{
   "invoice_uid": "1063702405",
   "currency": "643"
}
Название Тип Описание
invoice_uid String ID счета в QIWI (берется из значения bills[].id данных о счете
currency String Валюта суммы счета (берется из значения bills[].sum.currency данных о счете)

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

{
  "invoice_status": "PAID_STATUS",
  "is_sms_confirm": false,
  "WALLET_ACCEPT_PAY_RESULT": {}
}

Успешный JSON-ответ содержит статус оплаченного счета:

Поле ответа Тип Описание
invoice_status String Строка кода статуса оплаты счета, PAID_STATUS. Любой другой статус означает неуспех платежной транзакции.
is_sms_confirm String Признак подтверждения по SMS

Отмена неоплаченного счета

Метод отклоняет неоплаченный счет. При этом счет становится недоступным для оплаты.

Запрос → POST

user@server:~$ curl -X POST --header 'Accept: application/json' \
                            --header 'Authorization: Bearer ***' \
                            'https://edge.qiwi.com/checkout-api/api/bill/reject' \
                            -d '{ "id": 1034353453 }'
POST /checkout-api/api/bill/reject HTTP/1.1
Accept: application/json
Authorization: Bearer ***
Content-type: application/json
Host: edge.qiwi.com
User-Agent: ****

{
  "id": 1034353453
}
Название Тип Описание
id Integer ID счета для отмены (берется из значения bills[].id данных о счете

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

Успешный ответ содержит HTTP-код 200.

Уведомления (вебхуки)

Последнее обновление: 2020-07-06 | Предложить правки на GitHub

Исходящие платежи - платеж в проведении

POST /some-hook.php HTTP/1.1
Accept: application/json
Content-type: application/json
Host: falcon.com

{"hash": "50779a03d90c4fa60ac44dfd158dbceec0e9c57fa4cf4f5298450fdde1868945",
 "hookId": "f57f95e2-149f-4278-b2cb-4114bc319727",
 "messageId": "f9a197a8-26b6-4d42-aac4-d86b789c373c",
 "payment": {"account": "thedandod",
             "comment": "",
             "commission": Null,
             "date": "2018-05-18T16:05:15+03:00",
             "errorCode": "0",
             "personId": 79254914194,
             "provider": 25549,
             "signFields": "sum.currency,sum.amount,type,account,txnId",
             "status": "WAITING",
             "sum": {"amount": 1.73, "currency": 643},
             "total": {"amount": 1.73, "currency": 643},
             "txnId": "13117338074",
             "type": "OUT"},
 "test": false,
 "version": "1.0.0"}

Исходящие платежи - успешный платеж

POST /some-hook.php HTTP/1.1
Accept: application/json
Content-type: application/json
Host: falcon.com

{"hash": "50779a03d90c4fa60ac44dfd158dbceec0e9c57fa4cf4f5298450fdde1868945",
 "hookId": "f57f95e2-149f-4278-b2cb-4114bc319727",
 "messageId": "6e2a0e32-4c8d-4fe2-9eed-fe3b6a726ff4",
 "payment": {"account": "thedandod",
             "comment": "",
             "commission": {"amount": 0.0, "currency": 643},
             "date": "2018-05-18T16:05:15+03:00",
             "errorCode": "0",
             "personId": 79254914194,
             "provider": 25549,
             "signFields": "sum.currency,sum.amount,type,account,txnId",
             "status": "SUCCESS",
             "sum": {"amount": 1.73, "currency": 643},
             "total": {"amount": 1.73, "currency": 643},
             "txnId": "13117338074",
             "type": "OUT"},
 "test": false,
 "version": "1.0.0"}

Исходящие платежи - неуспешный платеж

POST /some-hook.php HTTP/1.1
Accept: application/json
Content-type: application/json
Host: falcon.com

{"hash": "0637b07b1018d76585db26b0f8077016b12996006429e22a7dc5b6982710a1ef",
 "hookId": "f57f95e2-149f-4278-b2cb-4114bc319727",
 "messageId": "1133873b-9bb6-4adb-9bfe-7be3a9aa999f",
 "payment": {"account": "borya241203",
             "comment": "",
             "commission": None,
             "date": "2018-05-20T05:19:16+03:00",
             "errorCode": "5",
             "personId": 79254914194,
             "provider": 25549,
             "signFields": "sum.currency,sum.amount,type,account,txnId",
             "status": "ERROR",
             "sum": {"amount": 1.01, "currency": 643},
             "total": {"amount": 1.01, "currency": 643},
             "txnId": "13126423989",
             "type": "OUT"},
 "test": false,
 "version": "1.0.0"}

Входящие платежи - успешный платеж

POST /some-hook.php HTTP/1.1
Accept: application/json
Content-type: application/json
Host: falcon.com

{"hash": "a56ed0090fa3fd2fd0b002ed80f85a120037a6a85f840938888275e1631da96f",
 "hookId": "8c79f60d-0272-476b-b120-6e7629467328",
 "messageId": "bba24947-ab5f-4b33-881b-738fc3a4c9e1",
 "payment": {"account": "79042426915",
             "comment": "Order i_4769798 Счет №65361451. Пополнение аккаунта "
                        "P11689160 (garik3315@gmail.com) в платежной системе "
                        "Payeer. Внимание! Не меняйте сумму, валюту и "
                        "комментарий к переводу, не делайте повторный перевод, "
                        "в ином случае Ваш платеж зачислен НЕ будет!",
             "commission": {"amount": 0.0, "currency": 643},
             "date": "2018-03-25T13:16:48+03:00",
             "errorCode": "0",
             "personId": 79645265240,
             "provider": 7,
             "signFields": "sum.currency,sum.amount,type,account,txnId",
             "status": "SUCCESS",
             "sum": {"amount": 1.09, "currency": 643},
             "total": {"amount": 1.09, "currency": 643},
             "txnId": "12565018935",
             "type": "IN"},
 "test": false,
 "version": "1.0.0"}

Хуки или уведомления с данными о событии (платеже/пополнении) отправляются на ваш сервер. В настоящее время поддерживаются только вебхуки (webhook) - сообщения, адресованные веб-сервисам. Для приема вебхуков вам необходимо настроить свой сервер на прием и обработку POST-запросов (Формат запросов).

От вашего сервера успешный ответ 200 OK на входящий запрос должен поступить в течение 1-2 сек. Не дождавшись ответа, сервис КИВИ отправляет еще одно уведомление через 10 минут, потом еще одно через 1 час.

Пулы IP-адресов, с которых сервисы QIWI отправляют webhook:

Если ваш сервер обработки вебхуков работает за брандмауэром, необходимо добавить эти IP-адреса в список разрешенных адресов входящих TCP-пакетов.

Быстрый старт

  1. Реализуйте веб-сервис обработки запросов. Особое внимание обратите на реализацию проверки подписи.
  2. Зарегистрируйте свой обработчик. Внимание! Длина оригинального (не URL-encoded) адреса сервиса обработчика не должна превышать 100 символов.
  3. Запросите ключ проверки подписи.
  4. Протестируйте прием запросов вашим обработчиком с помощью тестового запроса. На зарегистрированный в п.1 сервис придет пустое уведомление.

Чтобы сменить адрес сервера для обработки вебхуков:

  1. Удалите обработчик вебхуков.
  2. Зарегистрируйте новый обработчик. Внимание! Длина оригинального (не URL-encoded) адреса сервиса обработчика не должна превышать 100 символов.
  3. Запросите ключ проверки подписи для нового обработчика.
  4. Протестируйте прием запросов новым обработчиком с помощью тестового запроса. На зарегистрированный в п.2 сервис придет пустое уведомление.

Обработка вебхука

Каждый вебхук посылает уведомления - входящие POST-запросы с JSON-объектом, содержащим данные об одном платеже. Схема объекта:

POST /some-hook.php HTTP/1.1
Accept: application/json
Content-type: application/json
Host: falcon.com

{"hash": "a56ed0090fa3fd2fd0b002ed80f85a120037a6a85f840938888275e1631da96f",
 "hookId": "8c79f60d-0272-476b-b120-6e7629467328",
 "messageId": "bba24947-ab5f-4b33-881b-738fc3a4c9e1",
 "payment": {"account": "79042426915",
             "comment": "Order i_4769798 Счет №65361451. Пополнение аккаунта "
                        "P11689160 (garik3315@gmail.com) в платежной системе "
                        "Payeer. Внимание! Не меняйте сумму, валюту и "
                        "комментарий к переводу, не делайте повторный перевод, "
                        "в ином случае Ваш платеж зачислен НЕ будет!",
             "commission": {"amount": 0.0, "currency": 643},
             "date": "2018-03-25T13:16:48+03:00",
             "errorCode": "0",
             "personId": 79645265240,
             "provider": 7,
             "signFields": "sum.currency,sum.amount,type,account,txnId",
             "status": "SUCCESS",
             "sum": {"amount": 1.09, "currency": 643},
             "total": {"amount": 1.09, "currency": 643},
             "txnId": "12565018935",
             "type": "IN"},
 "test": false,
 "version": "1.0.0"}
<?php

//Функция возвращает упорядоченную строку значений параметров webhook и хэш подписи webhook для проверки
function getReqParams(){

    //Make sure that it is a POST request.
    if(strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0){
        throw new Exception('Request method must be POST!');
    }

    //Receive the RAW post data.
    $content = trim(file_get_contents("php://input"));

    //Attempt to decode the incoming RAW post data from JSON.
    $decoded = json_decode($content, true);

    //If json_decode failed, the JSON is invalid.
    if(!is_array($decoded)){
        throw new Exception('Received content contained invalid JSON!');
    }

    //Check if test
    if ($decoded['test'] == 'true') {
      throw new Exception('Test!');
    }

    // Строка параметров
    $reqparams = $decoded['payment']['sum']['currency'] . '|' . $decoded['payment']['sum']['amount'] . '|'. $decoded['payment']['type'] . '|' . $decoded['payment']['account'] . '|' . $decoded['payment']['txnId'];
    // Подпись из запроса
    foreach ($decoded as $name=>$value) {
       if ($name == 'hash') {
            $SIGN_REQ = $value;
       }
    }

    return [$reqparams, $SIGN_REQ];
}

// Список параметров и подпись

$Request = getReqParams();

// Base64 encoded ключ для дешифровки вебхуков (метод /hook/{hookId}/key)

$NOTIFY_PWD = "JcyVhjHCvHQwufz+IHXolyqHgEc5MoayBfParl6Guoc=";

// Вычисляем хэш SHA-256 строки параметров и шифруем с ключом для веб-хуков

$reqres = hash_hmac("sha256", $Request[0], base64_decode($NOTIFY_PWD));

// Проверка подписи вебхука

if (hash_equals($reqres, $Request[1])) {
    $error = array('response' => 'OK');
}
else $error = array('response' => 'error');

//Ответ

header('Content-Type: application/json');
$jsonres = json_encode($error);
echo $jsonres;
error_log('error code' . $jsonres);
?>
import base64
import hmac
import hashlib

# Base64 encoded ключ для расшифровки вебхука (/hook/{hookId}/key)
webhook_key_base64 = 'JcyVhjHCvHQwufz+IHXolyqHgEc5MoayBfParl6Guoc='

# строка параметров
data = '643|1|IN|+79165238345|13353941550'

webhook_key = base64.b64decode(bytes(webhook_key_base64,'utf-8'))
print(hmac.new(webhook_key, data.encode('utf-8'), hashlib.sha256).hexdigest())
Поле Тип Описание
hookId String (UUID) Уникальный id хука
messageId String (UUID) Уникальный id уведомления
payment Object Данные платежа
payment.txnId String ID транзакции в процессинге QIWI Wallet
payment.account String Для платежей - номер счета получателя. Для пополнений - номер отправителя, терминала или название агента пополнения кошелька
payment.signFields String Список полей объекта payment (через ,), которые хешируются алгоритмом HmacSHA256 для проверки уведомления (см. параметр hash)
payment.personId Integer Номер кошелька
payment.date String DateTime Дата/время платежа, в московской временной зоне. Формат даты ГГГГ-ММ-ДД'T'чч:мм:сс+03:00
payment.errorCode String Код ошибки платежа
payment.type String Тип платежа. Возможные значения:
IN - пополнение,
OUT - платеж
payment.status String Статус платежа. Возможные значения:
WAITING - платеж проводится,
SUCCESS - успешный платеж,
ERROR - ошибка платежа.
payment.provider Integer ID провайдера QIWI Wallet
payment.comment String Комментарий к транзакции
payment.sum Object Данные о сумме платежа или пополнения. Параметры:
sum.amount Number(Decimal) Сумма
sum.currency Number(3) Код валюты
payment.commission Object Данные о комиссии для платежа или пополнения. Параметры:
commission.amount Number(Decimal) Сумма
commission.currency Number(3) Код валюты
payment.total Object Данные об итоговой сумме платежа или пополнения. Параметры:
total.amount Number(Decimal) Сумма
total.currency Number(3) Код валюты
test Boolean Признак тестового сообщения
version String Версия API
hash String Хэш цифровой подписи уведомления

Как проверить подпись уведомления

Реализуйте следующие шаги:

  1. Возьмите значения полей из списка в payment.signFields уведомления (в том же порядке) в формате String.
  2. Объедините значения в строку с разделителями |.
  3. Зашифруйте строку п.2 алгоритмом SHA-256 с ключом проверки подписи.
  4. Сравните полученное значение со значением поля hash уведомления.

Пример расшифровки подписи (см. также функцию PHP на вкладке справа):

  1. По запросу пользователь получает ключ вебхука, закодированный в Base64: JcyVhjHCvHQwufz+IHXolyqHgEc5MoayBfParl6Guoc=
  2. Приходит уведомление {"messageId":"7814c49d-2d29-4b14-b2dc-36b377c76156","hookId":"5e2027d1-f5f3-4ad1-b409-058b8b8a8c22", "payment":{"txnId":"13353941550","date":"2018-06-27T13:39:00+03:00","type":"IN","status":"SUCCESS","errorCode":"0","personId":78000008000,"account":"+79165238345","comment":"","provider":7, "sum":{"amount":1,"currency":643}, "commission":{"amount":0,"currency":643}, "total":{"amount":1,"currency":643}, "signFields":"sum.currency,sum.amount,type,account,txnId"}, "hash":"76687ffe5c516c793faa46fafba0994e7ca7a6d735966e0e0c0b65eaa43bdca0","version":"1.0.0","test":false}
  3. Склеиваются требуемые поля платежных данных (указаны в payment.signFields - sum.currency,sum.amount,type,account,txnId): 643|1|IN|+79165238345|13353941550
  4. Поля шифруются методом SHA-256 с Base64-раскодированным ключом из п.1. Результат 76687ffe5c516c793faa46fafba0994e7ca7a6d735966e0e0c0b65eaa43bdca0 совпадает с параметром hash из запроса.

Регистрация обработчика вебхуков

Запрос → PUT

curl -X PUT "https://edge.qiwi.com/payment-notifier/v1/hooks?hookType=1&param=http%3A%2F%2Fecho.fjfalcon.ru%2F&txnType=2" \
     -H "accept: */*" \
     -H "authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f"
PUT /payment-notifier/v1/hooks?hookType=1&param=http%3A%2F%2Fecho.fjfalcon.ru%2F&txnType=2 HTTP/1.1
Host: edge.qiwi.com
Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f
User-Agent: ****
Название Тип Описание
hookType Integer Тип хука. Только 1 - вебхук.
param URL-encoded Адрес сервера обработки вебхуков. Внимание! Длина исходного (не URL-encoded) адреса сервиса обработчика не должна превышать 100 символов.
txnType String Тип транзакций, по которым будут включены уведомления. Возможные значения:
0 - только входящие транзакции (пополнения);
1 - только исходящие транзакции (платежи);
2 - все транзакции

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

{
  "hookId":"d63a8729-f5c8-486f-907d-9fb8758afcfc",
  "hookParameters":{
    "url":"http://echo.fjfalcon.ru/"
  },
  "hookType":"WEB",
  "txnType":"BOTH"
}

Ответ в формате JSON.

Название Тип Описание
hookId String UUID созданного вебхука
hookParameters Object Набор параметров вебхука (только URL)
hookType String Тип вебхука (только WEB)
txnType String Тип транзакций, по которым отсылаются уведомления (IN - входящие, OUT - исходящие, BOTH - все)

Удаление обработчика вебхуков

Запрос → DELETE

curl -X DELETE "https://edge.qiwi.com/payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc" \
   -H "accept: */*" \
   -H "authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f"
DELETE /payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc HTTP/1.1
Host: edge.qiwi.com
Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f
User-Agent: ****

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

{
  "response":"Hook deleted"
}

Формат ответа JSON.

Название Тип Описание
response String Описание результата операции

Получение секретного ключа

Каждое уведомление содержит цифровую подпись сообщения, зашифрованную ключом. Для получения ключа проверки подписи используйте данный запрос.

Запрос → GET

curl -X GET "https://edge.qiwi.com/payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc/key" \
   -H "accept: */*" \
    -H "accept: */*" \
    -H "authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f"
GET /payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc/key HTTP/1.1
Host: edge.qiwi.com
Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f
User-Agent: ****

Ответ ←

HTTP/1.1 201 Created
Content-Type: application/json

{
  "key":"L8UVF3JkLVUr6r70LiE0A9/5WoGGwWKG2pI/e+l/9fs="
}

Формат ответа JSON.

Название Тип Описание
key String Base64-закодированный ключ

Изменение секретного ключа

Для смены ключа шифрования уведомлений используйте данный запрос.

Запрос → POST

curl -X POST "https://edge.qiwi.com/payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc/newkey" \
   -H "accept: */*" \
   -H "authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f"
POST /payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc/newkey HTTP/1.1
Host: edge.qiwi.com
Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f
User-Agent: ****

Ответ ←

HTTP/1.1 201 Created
Content-Type: application/json

{
  "key":"OikS4/CcIbSf+yYGnLbnOige8RGoYmGxs/LNMwkJy7Q="
}

Формат ответа JSON.

Название Тип Описание
key String Base64-закодированный новый ключ

Данные об обработчике уведомлений

Список действующих (активных) обработчиков уведомлений, связанных с вашим кошельком, можно получить данным запросом.

Так как сейчас используется только один тип хука - вебхук, то в ответе содержится только один объект данных.

Запрос → GET

curl -X GET "https://edge.qiwi.com/payment-notifier/v1/hooks/active" \
   -H "accept: */*" \
   -H "accept: */*" \
   -H "authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f"
GET /payment-notifier/v1/hooks/active HTTP/1.1
Host: edge.qiwi.com
Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f
User-Agent: ****

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

{
  "hookId":"d63a8729-f5c8-486f-907d-9fb8758afcfc",
  "hookParameters":{
    "url":"http://echo.fjfalcon.ru/"
  },
  "hookType":"WEB",
  "txnType":"BOTH"
}

Формат ответа JSON.

Название Тип Описание
hookId String UUID действующего обработчика вебхуков
hookParameters Object Набор параметров обработчика (только URL)
hookType String Тип вебхука (только WEB)
txnType String Тип транзакций, по которым отсылаются уведомления (IN - входящие, OUT - исходящие, BOTH - все)

Отправка тестового уведомления

Для проверки вашего обработчика вебхуков используйте данный запрос. Тестовое уведомление отправляется на адрес, указанный в параметрах действующего обработчика.

Запрос → GET

curl -X GET "https://edge.qiwi.com/payment-notifier/v1/hooks/test" \
   -H "accept: */*" \
   -H "authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f"
GET /payment-notifier/v1/hooks/test HTTP/1.1
Host: edge.qiwi.com
Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f
User-Agent: ****

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json

{
  "response":"Webhook sent"
}

Формат ответа JSON.

Название Тип Описание
response String Результат запроса

Коды ошибок

Последнее обновление: 2020-07-06 | Предложить правки на GitHub

В случае ошибки API возвращается HTTP-код ошибки.

HTTP Код Секция API Описание
400 Все Ошибка синтаксиса запроса (неправильный формат данных)
401 Все Неверный токен или истек срок действия токена API
403 Все Нет прав на данный запрос (недостаточно разрешений у токена API)
404 История платежей, Информация о транзакции, Отправка квитанции Не найдена транзакция или отсутствуют платежи с указанными признаками
404 Балансы, Профиль пользователя, Идентификация пользователя Не найден кошелек
404 Веб-хуки Не найден активный веб-хук
404 Оплата/Отмена счета Не найден счет
422 Регистрация веб-хука Неправильно указаны домен/подсеть/хост веб-хука(в параметре param для URL веб-хука), неправильно указаны тип хука или тип транзакции, попытка создать хук при наличии уже созданного
423 Все Слишком много запросов, сервис временно недоступен
500 Все Внутренняя ошибка сервиса (превышена длина URL веб-хука, проблемы с инфраструктурой, недоступность каких-либо ресурсов и т.д.)

Следующие ошибки возвращаются на запросы истории платежей и информации о транзакции в параметре errorCode ответа:

errorCode Описание
0 OK
3 Техническая ошибка. Повторите платеж позже.
4 Некорректный формат телефона или счета. Проверьте данные.
5 Данного номера не существует. Проверьте данные и попробуйте еще раз.
8 Техническая проблема на стороне банка-получателя. Попробуйте позже.
57 Статус кошелька получателя не позволяет перевести ему деньги. Попросите владельца кошелька повысить его статус: ввести паспортные данные.
131 Данный платеж недоступен для вашей страны
166 Ваш статус кошелька не позволяет совершить платеж. Повысьте статус кошелька: введите паспортные данные.
167 Статус кошелька получателя не позволяет перевести ему деньги. Попросите владельца кошелька повысить его статус: ввести паспортные данные.
202 Техническая ошибка. Повторите платеж позже.
204 Ваш статус кошелька не позволяет пополнять его наличными. Повысьте статус кошелька: введите паспортные данные.
220 Недостаточно средств. Пополните кошелек
241 Сумма платежа должна быть больше 1 рубля
242 Сумма платежа превышает максимально допустимую
254 Сумма платежа должна быть больше 1 рубля
271 Техническая проблема на стороне банка-получателя. Попробуйте позже.
300 Техническая ошибка. Повторите платеж позже.
303 Неверный номер телефона — введите 10 цифр
319 Ваш статус кошелька не позволяет совершить платеж. Повысьте статус кошелька: введите паспортные данные.
407 Недостаточно средств на вашей карте
408 У вас уже есть такой платеж — оплатите или отмените его
455 Платеж невозможен из-за ограничений на минимальный остаток
461 Время подтверждения операции истекло. Попробуйте еще раз.
472 Недостаточно денег на кошельке — пополните его
500 Техническая ошибка на стороне банка-получателя. Обратитесь в их поддержку.
522 Неверный номер или срок действия карты получателя. Проверьте данные и повторите попытку.
547 Неверный срок действия карты получателя. Проверьте данные и повторите попытку.
548 Истек срок действия карты получателя
558 Сумма платежа превышает максимально допустимую
561 Банк, куда вы переводите деньги, не принимает платеж. Обратитесь в его поддержку.
700 Превышен лимит для вашего статуса кошелька. Повысьте статус или уточните свой текущий лимит в разделе Профиль.
702 Платеж невозможен из-за ограничений у получателя. Превышен его лимит на остаток. Получателю необходимо связаться с нашей поддержкой.
704 Превышен ежемесячный лимит по вашему кошельку. Чтобы снять ограничения, повысьте статус кошелька в "Профиле".
705 Превышен ежемесячный лимит по вашему кошельку. Чтобы снять ограничения, повысьте статус кошелька в "Профиле".
710 Перевод невозможен – превышен лимит платежей за неделю в пользу одного и того же получателя
711 Перевод невозможен. Вы превысили лимит платежей для таких операций за месяц.
716 Вы превысили месячный лимит на снятие денег с карты. Чтобы снять ограничения, повысьте статус кошелька в Профиле.
717 Вы превысили дневной лимит на снятие денег с карты. Чтобы снять ограничения, повысьте статус кошелька в Профиле.
746 Перевод невозможен – превышен лимит в пользу одного и того же получателя
747 Перевод невозможен. Превышено количество операций в пользу одного и того же получателя.
749 Техническая ошибка. Обратитесь в нашу поддержку.
750 Техническая ошибка. Повторите платеж позже.
757 Превышен лимит на количество платежей. Чтобы снять ограничения, повысьте статус кошелька в Профиле.
797 Платеж был отменен, деньги возвращены на ваш кошелек
852 Перевод невозможен – превышен лимит в пользу одного и того же получателя
866 Платеж не проведен. Превышен лимит 5 000 RUB — на исходящие переводы из RUB, USD, EUR в KZT в месяц. Повысьте статус кошелька в Профиле и платите без ограничений.
867 Платеж не проведен. Превышен лимит 5 000 RUB — на входящие переводы из RUB, USD, EUR в KZT в месяц. Повысьте статус кошелька в Профиле и платите без ограничений.
893 Перевод отклонен. Истек его срок действия.
901 Истек срок действия кода для подтверждения платежа. Повторите платеж.
943 Превышен лимит на переводы в месяц. Повысьте статус кошелька в Профиле и переводите без ограничений.
1050 Превышен лимит на такие операции. Повысьте статус кошелька в Профиле и расширьте свои возможности.
7000 Платеж отклонен. Проверьте реквизиты карты и повторите платеж.
7600 Платеж отклонен. Обратитесь в банк, выпустивший карту.