Api qiwi как найти

Введение

Последнее обновление: 02-03-2023 | Эта страница на GitHub

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

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

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

  • Авторизация

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

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

https://edge.qiwi.com

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

  • Корректные значения HTTP-заголовков Accept и Content-Type в запросе. API QIWI Кошелька поддерживает только один MIME-тип: application/json. Любое другое значение приведет к ошибке формата данных.
  • URL, составленный согласно требованиям к нужному запросу.
  • OAuth-токен, выданный вам для доступа к вашему QIWI кошельку. Для некоторых запросов его не потребуется.

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

Мы остановили выпуск OAuth-токенов. Приносим извинения за доставленные неудобства.

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

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

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

    Token Issue

  2. Во всплывающем окне выберите разрешения на операции с токеном и нажмите Продолжить:
    • Запрос информации о профиле кошелька — выполнение запросов профиля пользователя, идентификации, лимитов.
    • Запрос баланса кошелька — выполнение запросов баланса.
    • Просмотр истории платежей — выполнение запросов истории платежей.
    • Проведение платежей без SMS — выполнение платежных запросов без подтверждения по SMS, оплата счетов, использование уведомлений.
    • Управление виртуальными картамиAPI управления и выпуска карт QIWI-Мастер. Внимание! Для доступа к API также добавьте разрешения на операции Запрос информации о профиле кошелька, Просмотр истории платежей, Проведение платежей без SMS.

    Token Scopes

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

    Token Scopes

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

    Token Accept

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

    Token

block token

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

curl "адрес сервера" 
  --header "Accept: application/json" 
  --header "Content-Type: application/json" 
  --header "Authorization: Bearer <токен API QIWI Кошелька>"

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

  • В результате авторизации на сайте QIWI Кошелек и выпуска токена получен токен, представляющий собой строку:

U1QtOTkwMTAyLWNud3FpdWhmbzg3M

  • Токен добавляется в заголовок Authorization: Bearer

  • Итоговый заголовок, добавляемый в каждый запрос к API QIWI Кошелька:

Authorization: Bearer U1QtOTkwMTAyLWNud3FpdWhmbzg3M

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

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

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

Запрос → GET

curl "https://edge.qiwi.com/person-profile/v1/profile/current?authInfoEnabled=false" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <токен API>"
GET /person-profile/v1/profile/current HTTP/1.1
Accept: application/json
Authorization: Bearer <токен API>
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']
  • URL /person-profile/v1/profile/current?parameter=value

  • Параметры

    Данные параметры передаются в строке запроса и не являются обязательными:

Название Тип Описание
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

curl -X POST 
  "https://edge.qiwi.com/identification/v1/persons/79111234567/identification" 
  --header "Accept: application/json" 
  --header "Content-Type: application/json" 
  --header "Authorization: Bearer <токен API>" 
  -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 <токен API>
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()
  • URL /identification/v1/persons/wallet/identification

    • wallet – номер вашего кошелька без знака “+”
  • Параметры

    Данные параметры передаются в 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

curl -X GET 
  "https://edge.qiwi.com/identification/v1/persons/79111234567/identification" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <токен API>"
GET /identification/v1/persons/79111234567/identification HTTP/1.1
Accept: application/json
Authorization: Bearer <токен API>
Host: edge.qiwi.com
  • URL /identification/v1/persons/wallet/identification

    • wallet – номер вашего кошелька без знака “+”

Ответ ←

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 кошелька.
На данный момент понижение доступно только с уровня “Профессиональный” до уровня “Основной”.

Для понижения уровня необходимо сделать 2 запроса:

  • Создание заявки на понижение уровня идентификации.
  • Подтверждение заявки на понижение уровня идентификации.

Создание заявки на понижение уровня идентификации

Запрос → POST

curl -X POST 
  "https://edge.qiwi.com/qw-ident-downgrade-api/v1/persons/79111234567/identification-downgrade/operations" 
  --header "Accept: application/json" 
  --header "Content-Type: application/json" 
  --header "Authorization: Bearer <токен API>" 
  -d '{
  "identificationLevel": "VERIFIED"
}'
POST /qw-ident-downgrade-api/v1/persons/79111234567/identification-downgrade/operations HTTP/1.1
Accept: application/json
Authorization: Bearer <токен API>
Content-type: application/json
Host: edge.qiwi.com

{
  "identificationLevel": "VERIFIED"
}
  • URL /qw-ident-downgrade-api/v1/persons/wallet/identification-downgrade/operations

    • wallet – номер вашего кошелька без знака “+”
  • Параметры

    Данные параметры передаются в JSON-теле запроса:

Название Тип Описание
identificationLevel String Уровень, до которого требуется понизить идентификацию (на данный момент понижение возможно только до статуса “Основной” – VERIFIED)

Ответ ←

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

{
  "downgradeOperationId": "1747ea28-1082-41bc-bde4-72994b3ffeb4"
}

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

Поле ответа Тип Описание
downgradeOperationId String ID заявки на понижение уровня идентификации

Подтверждение заявки на понижение уровня идентификации

Запрос → PUT

curl -X PUT 
  https://edge.qiwi.com/qw-ident-downgrade-api/v1/persons/79111234567/identification-downgrade/operations/1747ea28-1082-41bc-bde4-72994b3ffeb4/confirm 
  --header "Accept: application/json" 
  --header "Content-Type: application/json" 
  --header "Authorization: Bearer <токен API>" 
  -d '{}'
PUT /qw-ident-downgrade-api/v1/persons/79111234567/identification-downgrade/operations/1747ea28-1082-41bc-bde4-72994b3ffeb4/confirm HTTP/1.1
Accept: application/json
Authorization: Bearer <токен API>
Content-type: application/json
Host: edge.qiwi.com

{}
  • URL /qw-ident-downgrade-api/v1/persons/wallet/identification-downgrade/operations/downgradeOperationId/confirm

    • wallet – номер вашего кошелька без знака “+”
    • downgradeOperationId – ID вашей заявки на понижение уровня идентификации

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json
{
  "downgradeOperation": {
    "downgradeOperationId": "1747ea28-1082-41bc-bde4-72994b3ffeb4",
    "status": {
      "type": "IN_PROGRESS"
    }
  }
}

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

Поле ответа Тип Описание
downgradeOperation.downgradeOperationId String ID заявки на понижение уровня идентификации
downgradeOperation.status.type String Статус заявки на понижение уровня идентификации.
IN_PROGRESS – Заявка на понижение уровня идентификации в обработке. Вы можете проверять текущий статус заявки отдельным запросом (см. ниже).
SUCCESS – Заявка на понижение уровня идентификации успешно обработана.
FAIL – Понижение уровня идентификации невозможно.

Запрос статуса заявки на понижение уровня идентификации

Запрос → GET

curl -X GET 
  https://edge.qiwi.com/qw-ident-downgrade-api/v1/persons/79111234567/identification-downgrade/operations/1747ea28-1082-41bc-bde4-72994b3ffeb4 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <токен API>"
GET /qw-ident-downgrade-api/v1/persons/79111234567/identification-downgrade/operations/1747ea28-1082-41bc-bde4-72994b3ffeb4 HTTP/1.1
Accept: application/json
Authorization: Bearer <токен API>
Host: edge.qiwi.com
  • URL /qw-ident-downgrade-api/v1/persons/wallet/identification-downgrade/operations/downgradeOperationId

    • wallet – номер вашего кошелька без знака “+”
    • downgradeOperationId – ID вашей заявки на понижение уровня идентификации

Ответ ←

HTTP/1.1 200 OK
Content-Type: application/json
{
  "downgradeOperation": {
    "downgradeOperationId": "1747ea28-1082-41bc-bde4-72994b3ffeb4",
    "status": {
      "type": "SUCCESS"
    }
  }
}

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

Поле ответа Тип Описание
downgradeOperation.downgradeOperationId String ID заявки на понижение уровня идентификации
downgradeOperation.status.type String Статус заявки на понижение уровня идентификации.
IN_PROGRESS – Заявка на понижение уровня идентификации в обработке.
SUCCESS – Заявка на понижение уровня идентификации успешно обработана.
FAIL – Понижение уровня идентификации невозможно.

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

Уровни лимитов

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

Запрос → GET

curl "https://edge.qiwi.com/qw-limits/v1/persons/79115221133/actual-limits?types%5B0%5D=TURNOVER" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <токен API>"
GET /qw-limits/v1/persons/79115221133/actual-limits?types%5B0%5D=TURNOVER HTTP/1.1
Accept: application/json
Authorization: Bearer <токен API>
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()
  • URL /qw-limits/v1/persons/personId/actual-limits?parameter=value

    • personId – номер вашего кошелька без знака “+”
  • Параметры

    Данные параметры передаются в строке запроса:

Название Тип Описание
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 кошельке.

Запрос → GET

curl "https://edge.qiwi.com/qw-limits/v1/persons/79999999999/p2p-payment-count-limit" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <токен API>"
GET /qw-limits/v1/persons/79999999999/p2p-payment-count-limit HTTP/1.1
Accept: application/json
Authorization: Bearer <токен API>
Host: edge.qiwi.com
import requests

# Количество операций с физлицами
def get_p2p_payment_count(login, api_access_token):
    s = requests.Session()
    s.headers['Accept']= 'application/json'
    s.headers['Content-Type']= 'application/json'
    s.headers['authorization'] = 'Bearer ' + api_access_token
    b = s.get('https://edge.qiwi.com/qw-limits/v1/persons/' + login + '/p2p-payment-count-limit')
    return b.json()
  • URL /qw-limits/v1/persons/personId/p2p-payment-count-limit

    • personId – номер вашего кошелька без знака “+”

Ответ ←

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

{
    "p2pPaymentCountLimit": 1
}
mylogin = '79999999999'
api_access_token = '975efd8e8376xxxb95fa7cb213xxx04'

# Количество операций с физлицами за текущий месяц
print(get_p2p_payment_count(api_access_token, mylogin))

{'p2pPaymentCountLimit': 1}

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

Поле ответа Тип Описание
p2pPaymentCountLimit Number Kоличество операций с физлицами в месяце

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

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

Запрос → GET

curl "https://edge.qiwi.com/person-profile/v1/persons/79115221133/status/restrictions" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <токен API>"
GET /person-profile/v1/persons/79115221133/status/restrictions HTTP/1.1
Accept: application/json
Authorization: Bearer <токен API>
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()
  • URL /person-profile/v1/persons/personId/status/restrictions

    • personId – номер вашего кошелька без знака “+”

Ответ ←

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 платежей

curl "https://edge.qiwi.com/payment-history/v2/persons/<wallet>/payments?rows=10" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <токен API>"

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

curl "https://edge.qiwi.com/payment-history/v2/persons/<wallet>/payments?rows=50&startDate=2017-05-10T00%3A00%3A00%2B03%3A00&endDate=2017-05-10T23%3A59%3A59%2B03%3A00" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <токен API>"

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

curl "https://edge.qiwi.com/payment-history/v2/persons/<wallet>/payments?rows=50&nextTxnId=9103121&nextTxnDate=2017-05-11T12%3A35%3A23%2B03%3A00" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <токен API>"

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

GET /payment-history/v2/persons/<wallet>/payments?rows=10&operation=OUT&sources%5B0%5D=QW_RUB&sources%5B1%5D=CARD HTTP/1.1
Accept: application/json
Authorization: Bearer <токен API>
Host: edge.qiwi.com

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

GET /payment-history/v2/persons/<wallet>/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 <токен API>
Host: edge.qiwi.com

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

GET /payment-history/v2/persons/<wallet>/payments?rows=50&nextTxnId=9103121&nextTxnDate=2017-05-11T12%3A35%3A23%2B03%3A00 HTTP/1.1
Accept: application/json
Authorization: Bearer <токен API>
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()
  • URL /payment-history/v2/persons/wallet/payments?parameter=value

    • wallet – номер вашего кошелька без знака “+”
  • Параметры

    Данные параметры передаются в строке запроса:

Название Тип Описание
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":"",
    "currencyRate":1
  ],
  "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] Список объектов PaymentHistoryItem.
Число объектов в списке меньше или равно параметру rows из запроса
nextTxnId Number(Integer) ID следующего платежа в полном списке
nextTxnDate DateTime Дата/время следующего платежа в полном списке, время московское (в формате ГГГГ-ММ-ДД'T'чч:мм:сс+03:00)

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

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

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

Запрос → GET

curl "https://edge.qiwi.com/payment-history/v2/persons/<wallet>/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 <токен API>"
GET /payment-history/v2/persons/<wallet>/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 <токен API>
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()
  • URL /payment-history/v2/persons/wallet/payments/total?parameter=value

    • wallet – номер вашего кошелька без знака “+”
  • Параметры

    Данные параметры передаются в строке запроса:

Название Тип Описание
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

curl "https://edge.qiwi.com/payment-history/v2/transactions/9112223344" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <токен API>"
GET /payment-history/v2/transactions/9112223344 HTTP/1.1
Accept: application/json
Authorization: Bearer <токен API>
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()
  • URL /payment-history/v2/transactions/transactionId?type=value

    • transactionId – номер транзакции из истории платежей (параметр data[].txnId в ответе)
    • type – тип транзакции из истории платежей (параметр data[].type в ответе). Параметр является необязательным

Ответ ←

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": "",
    "currencyRate": 1,
    "extras": [],
    "features": {
      "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

curl "https://edge.qiwi.com/payment-history/v1/transactions/9112223344/cheque/file?type=IN&format=PDF" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <токен API>"
GET /payment-history/v1/transactions/9112223344/cheque/file?type=IN&format=PDF HTTP/1.1
Accept: application/json
Authorization: Bearer <токен API>
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)
  • URL /payment-history/v1/transactions/transactionId/cheque/file?type=value&format=value

    • transactionId – номер транзакции из истории платежей (параметр data[].txnId в ответе)
    • type – тип транзакции из истории платежей (параметр data[].type в ответе)
    • format – тип файла, в который сохраняется квитанция. Допустимые значения: JPEG, PDF

Ответ ←

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

[
  ""
]

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

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

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

Запрос → POST

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 <токен API>" 
  -d '{"email": "my@example.com"}'
POST /payment-history/v1/transactions/9112223344/cheque/send?type=IN HTTP/1.1
Accept: application/json
Authorization: Bearer <токен API>
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
  • URL /payment-history/v1/transactions/transactionId/cheque/send?type=value

    • transactionId – номер транзакции из истории платежей (параметр data[].txnId в ответе)
    • type – тип транзакции из истории платежей (параметр data[].type в ответе)
  • Параметр

    Параметр передается в JSON-теле запроса:

Название Тип Описание
email String Адрес для отправки электронной квитанции

Ответ ←

HTTP/1.1 201 Created
# номер кошелька в формате 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

Класс PaymentHistoryItem

{
    "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": "",
        "description": "",
        "keys": "",
        "siteUrl": "",
        "extras": []
    },
    "source": {
        "id": 7,
        "shortName": "QIWI Wallet",
        "longName": "QIWI Wallet",
        "logoUrl": "",
        "description": "",
        "keys": "мобильный кошелек, кошелек, перевести деньги, личный кабинет, отправить деньги, перевод между пользователями",
        "siteUrl": "",
        "extras": []
    },
    "comment": "",
    "currencyRate": 1
}

Объект, описывающий существующую транзакцию в сервисе 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) Курс конвертации (если применяется в транзакции)

Класс 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": "",
        "description": "",
        "keys": "",
        "siteUrl": "",
        "extras": []
    },
    "source": {
        "id": 7,
        "shortName": "QIWI Wallet",
        "longName": "QIWI Wallet",
        "logoUrl": "",
        "description": "",
        "keys": "мобильный кошелек, кошелек, перевести деньги, личный кабинет, отправить деньги, перевод между пользователями",
        "siteUrl": "",
        "extras": []
    },
    "comment": "",
    "currencyRate": 1,
    "paymentExtras": [],
    "features": {
      "chequeReady": false,
      "bankDocumentAvailable": false,
      "bankDocumentReady": false,
      "repeatPaymentEnabled": false,
      "favoritePaymentEnabled": false,
      "regularPaymentEnabled": false,
      "chatAvailable": true,
      "greetingCardAttached": true
    },
    "serviceExtras": {},
    "view": {
      "title": "",
      "account": ""
    }
}

Объект, описывающий существующую транзакцию в сервисе 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) Курс конвертации (если применяется в транзакции)
paymentExtras Array of Objects Служебная информация
features Object Набор специальных полей
features.chequeReady Boolean Специальное поле
features.bankDocumentReady Boolean Специальное поле
features.bankDocumentAvailable Boolean Специальное поле
features.repeatPaymentEnabled Boolean Специальное поле
features.favoritePaymentEnabled Boolean Специальное поле
features.regularPaymentEnabled Boolean Специальное поле
features.chatAvailable Boolean Специальное поле
features.greetingCardAttached Boolean Специальное поле
serviceExtras Object Служебная информация
view Object Служебная информация

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

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

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

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

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

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

Запрос → GET

curl "https://edge.qiwi.com/funding-sources/v2/persons/<кошелек>/accounts" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <токен API>"
GET /funding-sources/v2/persons/<кошелек>/accounts HTTP/1.1
Accept: application/json
Authorization: Bearer <токен API>
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()
  • URL /funding-sources/v2/persons/personId/accounts

    • personId – номер вашего кошелька без знака “+”

Ответ ←

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

curl -X POST 
  "https://edge.qiwi.com/funding-sources/v2/persons/<кошелек>/accounts" 
  --header "Accept: application/json" 
  --header "Content-Type: application/json" 
  --header "Authorization: Bearer <токен API>" 
  -d '{  "alias": "qw_wallet_eur"}'
POST /funding-sources/v2/persons/<кошелек>/accounts HTTP/1.1
Accept: application/json
Authorization: Bearer <токен API>
Content-type: application/json
Host: edge.qiwi.com

{ "alias": "qw_wallet_eur" }
  • URL /funding-sources/v2/persons/personId/accounts

    • personId – номер вашего кошелька без знака “+”
  • Параметры

    Параметр передается в JSON-теле запроса:

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

Ответ ←

HTTP/1.1 201 Created

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

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

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

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

Запрос → GET

curl -X GET 
  "https://edge.qiwi.com/funding-sources/v2/persons/<кошелек>/accounts/offer" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <токен API>"
GET /funding-sources/v2/persons/<кошелек>/accounts/offer HTTP/1.1
Accept: application/json
Authorization: Bearer <токен API>
Host: edge.qiwi.com
  • URL /funding-sources/v2/persons/personId/accounts/offer

    • personId – номер вашего кошелька без знака “+”

Ответ ←

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

curl -X PATCH 
  "https://edge.qiwi.com/funding-sources/v2/persons/<кошелек>/accounts/qw_wallet_usd" 
  --header "Accept: application/json" 
  --header "Content-Type: application/json" 
  --header "Authorization: Bearer <токен API>" 
  -d '{ "defaultAccount": true }'
PATCH /funding-sources/v2/persons/<кошелек>/accounts/qw_wallet_usd HTTP/1.1
Accept: application/json
Authorization: Bearer <токен API>
Content-type: application/json
Host: edge.qiwi.com

{ "defaultAccount": true }
  • URL /funding-sources/v2/persons/personId/accounts/accountAlias

    • personId – номер вашего кошелька без знака “+”
    • accountAlias – псевдоним счета в кошельке из списка счетов (параметр accounts[].alias в ответе)
  • Параметры

    Параметр передается в JSON-теле запроса:

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

Ответ ←

HTTP/1.1 204 Modified

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

API QIWI Мастер

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

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

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

  • QIWI Мастер Prepaid – для оплаты рекламы в сервисах Яндекс.Директ и myTarget;
  • QIWI Мастер Debit – новый дебетовый БИН.

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

  • Управление виртуальными картами,
  • Запрос информации о профиле кошелька,
  • Просмотр истории платежей,
  • Проведение платежей без SMS.

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

Token Scopes

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

С помощью методов API вы можете:

  • Выпустить карту QIWI Мастер.
  • Получить список ваших карт QIWI Мастер.
  • Получить выписку транзакций по карте.
  • Заблокировать и разблокировать карту.
  • Получить реквизиты карты.
  • Переименовать карту.

Чтобы начать работу с API, необходимо приобрести пакет QIWI Мастер.

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

Запрос → POST

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 <токен API>" 
  -d '{
        "id":"1600884280003",
        "sum": {
          "amount":2999,
          "currency":"643"
        },
        "paymentMethod": {
          "type":"Account",
          "accountId":"643"
        },
        "comment":"Оплата",
        "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 <токен API>
Host: edge.qiwi.com

{
 "id":"1600884280003",
 "sum": {
  "amount":2999,
  "currency":"643"
 },
 "paymentMethod": {
  "type":"Account",
  "accountId":"643"
 },
 "comment":"Оплата",
 "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()
  • URL /sinap/api/v2/terms/28004/payments

  • Параметры

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

Название Тип Описание
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 Новый дебетовый БИН “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. Если карта платная (выпускается сверх лимита в 5 карт), то 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 Мастер в вашем кошельке. Карту можно найти по дате активации (поле activated) или по сравнению со списком ранее выпущенных карт.

Список карт 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": "Yandex",
      "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=<дата окончания выписки>

ID карты можно получить:

  • при ее выпуске — для бесплатной карты;
  • из ответа на запрос списка карт — для платной карты.

Успешный ответ в формате application/pdf (в бинарном виде) содержит 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

ID карты можно получить:

  • при ее выпуске — для бесплатной карты;
  • из ответа на запрос списка карт — для платной карты.

Ответ ←

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

ID карты можно получить:

  • при ее выпуске — для бесплатной карты;
  • из ответа на запрос списка карт — для платной карты.

Успешный ответ содержит 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

ID карты можно получить:

  • при ее выпуске — для бесплатной карты;
  • из ответа на запрос списка карт — для платной карты.

В теле запроса укажите JSON с обязательным параметром:

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

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

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

Платежное API

Последнее обновление: 2022-10-20 | Предложить правки на GitHub

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

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

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

Запрос → POST

curl -X POST 
  'https://edge.qiwi.com/sinap/providers/99/onlineCommission' 
  --header "Accept: application/json" 
  --header "Content-Type: application/json" 
  --header "Authorization: Bearer <токен API>" 
  -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 <токен API>
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']
  • URL /sinap/providers/{ID}/onlineCommission

ID — идентификатор провайдера. Возможные значения:

  • 99 — Перевод на QIWI Кошелек.
  • 1717 — Перевод по банковским реквизитам организации.
  • Провайдеры банковских переводов.

Также идентификатор нужного провайдера можно установить поиском по ключевым словам.

  • Параметры

Обязательные параметры в теле запроса:

Название Тип Описание
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

  • URL https://qiwi.com/{ID}?{parameter}={value}

ID — идентификатор провайдера, у которого набор реквизитов платежа ограничен только полем fields.account. Возможные значения:

  • 99 — Перевод на QIWI Кошелек.
  • 99999 — Перевод на QIWI Кошелек по никнейму.
  • 1963 — Перевод на карту Visa (карты российских банков).
  • 21013 — Перевод на карту MasterCard (карты российских банков).
  • 31652 — Перевод на карту МИР.
  • 22351 — Перевод на Виртуальную карту QIWI.
  • 1717 — Перевод по банковским реквизитам организации.

Также идентификатор нужного провайдера можно установить поиском по ключевым словам.

  • Параметры

В строке URL запроса указываются параметры отображения платежной формы:

Название Тип Описание Поле на форме
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

curl -X GET 
  "https://edge.qiwi.com/qw-nicknames/v1/persons/79111234567/nickname" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <токен API>"
GET /qw-nicknames/v1/persons/79111234567/nickname HTTP/1.1
Accept: application/json
Authorization: Bearer <токен API>
Host: edge.qiwi.com
  • URL /qw-nicknames/v1/persons/{wallet}/nickname

wallet — номер вашего кошелька без знака +.

Ответ ←

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

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

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

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

Запрос → POST

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 <токен API>" 
  -d '{
        "id":"11111111111111",
        "sum": {
          "amount":100,
          "currency":"643"
        },
        "paymentMethod": {
          "type":"Account",
          "accountId":"643"
        },
        "comment":"Комментарий",
        "fields": {
          "account":"+79121112233"
        }
      }'
POST /sinap/api/v2/terms/99/payments HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer <токен API>
Host: edge.qiwi.com

{
 "id":"11111111111111",
 "sum": {
  "amount":100.50,
  "currency":"643"
 },
 "paymentMethod": {
  "type":"Account",
  "accountId":"643"
 },
 "comment":"Комментарий",
 "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()
  • URL /sinap/api/v2/terms/99/payments

  • Параметры

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

Название Тип Описание
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

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 <токен API>" 
  -d '{
        "id":"11111111111111",
        "sum": {
          "amount":100,
          "currency":"398"
        },
        "paymentMethod": {
          "type":"Account",
          "accountId":"643"
        },
        "comment":"Комментарий",
        "fields": {
          "account":"+79121112233"
        }
      }'
POST /sinap/api/v2/terms/1099/payments HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer <токен API>
Host: edge.qiwi.com

{
  "id":"11111111111111",
  "sum": {
    "amount":10.00,
    "currency":"398"
  },
	"paymentMethod": {
		"type":"Account",
		"accountId":"643"
	},
	"comment":"Комментарий",
	"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()
  • URL /sinap/api/v2/terms/1099/payments

  • Параметры

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

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

Ответ ←

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

Курсы валют

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

Запрос → GET

curl "https://edge.qiwi.com/sinap/crossRates" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <токен API>"
GET /sinap/crossRates HTTP/1.1
Accept: application/json
Authorization: Bearer <токен API>
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']
  • URL /sinap/crossRates

Ответ ←

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

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 <токен API>" 
  -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 <токен API>
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()
  • URL /sinap/api/v2/terms/{ID}/payments

ID — идентификатор провайдера. Определяется с помощью поиска провайдера.

  • Параметры

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

Название Тип Описание
fields.account String Номер мобильного телефона для пополнения (без префикса 8)

Ответ ←

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

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

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

Поиск ID для переводов на банковские карты РФ и Белоруссии

Определение ID для переводов на банковские карты РФ и Белоруссии.

Запрос → POST

POST /sinap/api/refs/bd6fb248-2bdf-49ed-bcb2-9b0a789cfde8/containers HTTP/1.1
Accept: application/vnd.qiwi.v1+json
Content-Type: application/json
Host: edge.qiwi.com
Authorization: Bearer <токен API>

{
  "account":"1234 1234 1234 1234"
}
curl -X POST 
  "https://edge.qiwi.com/sinap/api/refs/bd6fb248-2bdf-49ed-bcb2-9b0a789cfde8/containers" 
  --header "Content-Type: application/json" 
  --header "Accept: application/vnd.qiwi.v1+json" 
  --header "Authorization: Bearer <токен API>" 
  -d '{
    "account":"1234 1234 1234 1234"
  }'
  • URL /sinap/api/refs/bd6fb248-2bdf-49ed-bcb2-9b0a789cfde8/containers

  • Параметры

В поле account JSON-тела запроса передается номер карты в строковом формате. В номере после каждой четвертой цифры ставится пробел.

Ответ ←

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

{
  "elements": [
    { 
      "type": "field",
      "name": "termsId",
      "value": "36390"
    }
  ]
}
{"elements":[{"type": "field","name": "termsId","value": "36390"}]}

В поле ответа elements[].value возвращается ID провайдера для перевода на банковскую карту.

Перевод на карты банков РФ и зарубежных банков

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

Платежи на карты Visa и MasterCard, выпущенные иностранными банками, временно остановлены по причине ограничений со стороны платежной системы.

Запрос → POST

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

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 <токен API>" 
  -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 <токен API>
Host: edge.qiwi.com

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

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

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 <токен API>" 
  -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 <токен API>
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()
  • URL /sinap/api/v2/terms/{ID}/payments

ID — идентификатор провайдера. Возможные значения:

  • 1963 — Перевод на карту Visa. Для карт, выпущенных российскими банками.
  • 1960 — Перевод на карту Visa. Для карт, выпущенных банками стран Албания, Андорра,Аргентина, Армения, Австралия, Австрия, Азербайджан, Беларусь, Бельгия, Бенин, Босния и Герцеговина, Бразилия, Болгария, Китай, Хорватия, Кипр, Чешская Республика, Дания, Египет, Эстония, Финляндия, Франция, Грузия, Германия, Греция, Гонконг (Китай), Венгрия, Исландия, Индия, Индонезия, Израиль, Италия, Япония, Казахстан, Кения, Корея Республика, Кувейт, Кыргызстан, Латвия, Литва, Люксембург, Макао, Китай, Македония, Мадагаскар, Малайзия, Мальдивы, Мальта, Республика Молдова, Монако, Монголия, Черногория, Намибия, Нидерланды, Новая Зеландия, Нигерия, Норвегия, Оман, Парагвай, Польша, Португалия, Катар, Румыния, Саудовская Аравия, Республика Сербия, Сингапур, Словакия, Словения, Южная Африка, Испания, Шри-Ланка, Швеция, Таджикистан, Танзания, Таиланд, Турция, Туркменистан, Объединенные Арабские Эмираты, Великобритания, Узбекистан, Вьетнам, Замбия.
  • 21013 — Перевод на карту MasterCard. Для карт, выпущенных российскими банками.
  • 21012 — Перевод на карту MasterCard. Для карт, выпущенных банками стран Албания, Аргентина, Армения, Австралия, Австрия, Азербайджан, Бангладеш, Барбадос, Беларусь, Бельгия, Бенин, Босния и Герцеговина, Буркина-Фасо, Бразилия, Болгария, Камбоджа, Камерун Объединенная Республика, Чили, Китай, Колумбия, Конго, Коста-Рика, Хорватия, Кипр, Чешская Республика, Демократическая Республика Конго, Дания, Доминиканская Республика, Эквадор, Сальвадор, Египет, Эстония, Финляндия, Франция, Грузия, Германия, Гана, Греция, Гватемала, Гонконг, Венгрия, Индия, Индонезия, Ирландия, Израиль, Италия, Япония, Иордания, Казахстан, Кения, Корея, Кувейт, Кыргызстан, Латвия, Ливан, Литва, Люксембург, Макао, Македония, Мадагаскар, Малайзия, Мальдивы, Мальта, Мексика, Молдова, Монако, Монголия, Черногория, Марокко, Намибия, Нигерия, Непал, Нидерланды, Новая Зеландия, Нигерия, Норвегия, Оман, Панама, Парагвай, Перу, Филиппины, Польша, Португалия, Румыния, Катар, Саудовская Аравия, Сенегал, Сербия Республика, Сингапур, Словакия, Словения, Южная Африка, Испания, Шри-Ланка, Швеция, Швейцария, Таджикистан, Танзания, Тайланд, Тунис, Турция, Туркменистан, Объединенные Арабские Эмираты, Великобритания, Узбекистан, Вьетнам, Замбия.
  • 31652 — Перевод на карту МИР.
  • 22351 — Перевод на Виртуальную карту QIWI.
  • Параметры

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

Параметры для 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 Фамилия получателя

Ответ ←

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

Перевод на карты банков Казахстана

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

Запрос → POST

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

curl -X POST 
  --location 
  "https://edge.qiwi.com/sinap/api/terms/27292/payments" 
  -H "authorization: Bearer <токен API>" 
  -H "accept: application/vnd.qiwi.v2+json" 
  -H "sec-fetch-site: same-site" 
  -H "sec-fetch-mode: cors" 
  -H "sec-fetch-dest: empty" 
  -H "Content-Type: application/json" 
  -d '{
        "id": "<случайный id платежа>",
        "sum": {
          "amount": <сумма перевода>,
          "currency": "398"
        },
        "paymentMethod": {
          "accountId": "398",
          "type": "Account"
        },
        "comment": "",
        "fields": {
          "cardNumber": "<номер карты>",
          "version": "2",
          "transferSum": "100",
          "info": "Для продолжения оплаты, подтвердите, что являетесь держателем указанного банковского счета.",
          "accept": "1",
          "account": "<значение account из подготовительного запроса>",
          "ev_account1": "<значение ev_account1 из подготовительного запроса>"
        }
    }`
POST /sinap/api/terms/27292/payments HTTP/1.1
Content-Type: application/json
Accept: application/vnd.qiwi.v2+json
Authorization: Bearer <токен API>
sec-fetch-site: same-site
sec-fetch-mode: cors
sec-fetch-dest: empty
Host: edge.qiwi.com

{
  "id":"21131343",
  "sum": {
        "amount":1000,
        "currency":"398"
  },
  "paymentMethod": {
      "type":"Account",
      "accountId":"398"
  },
  "fields": {
            "cardNumber": "<номер карты>",
            "version": "2",
            "transferSum": "100",
            "info": "Для продолжения оплаты, подтвердите, что являетесь держателем указанного банковского счета."
            "accept": "1",
            "account": "<значение account из подготовительного запроса>",
            "ev_account1": "<значение ev_account1 из подготовительного запроса>"
  }
}
  • URL /sinap/api/terms/27292/payments

  • Параметры

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

Название Тип Описание
fields.cardNumber String Номер банковской карты получателя (без пробелов)
fields.account String Значение поля account из ответа на подготовительный запрос
fields.ev_account1 String Значение поля ev_account1 из ответа на подготовительный запрос
fields.transferSum String Всегда 100
fields.accept String Всегда 1
fields.info String Всегда Для продолжения оплаты, подтвердите,
что являетесь держателем указанного банковского счета.

Ответ ←

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

Подготовительный запрос для перевода на карту

Запрос → POST

Пример подготовительного запроса

curl -X POST 
  "https://edge.qiwi.com/sinap/api/refs/a42ebc79-0584-4271-b8a0-15cb4ea8b340/containers" 
  --header "Content-Type: application/json" 
  --header "Accept: application/vnd.qiwi.v1+json" 
  --header "Authorization: Bearer <токен API>" 
  -H 'sec-fetch-site: same-site' 
  -H 'sec-fetch-mode: cors' 
  -H 'sec-fetch-dest: empty' 
  --data-raw '{"cardNumber":"<ваш номер карты>","version":"2","transferSum":"100","src":"sinap"}' 
  --compressed
POST /sinap/api/refs/a42ebc79-0584-4271-b8a0-15cb4ea8b340/containers HTTP/1.1
Content-Type: application/json
Accept: application/vnd.qiwi.v1+json
Authorization: Bearer YUu2qw048gtdsvlk3iu
sec-fetch-site: same-site
sec-fetch-mode: cors
sec-fetch-dest: empty
Host: edge.qiwi.com

{
  "cardNumber":"<ваш номер карты>",
  "version":"2",
  "transferSum":"100",
  "src":"sinap"
}
  • URL /sinap/api/refs/a42ebc79-0584-4271-b8a0-15cb4ea8b340/containers

  • Параметры

Название Тип Описание
cardNumber String Номер банковской карты получателя (без пробелов)
transferSum String Всегда 100
version String Всегда 2
src String Всегда sinap

Ответ ←

...
"elements":[
  {
    "type":"field",
    "name":"account",
    "value":"<маскированный PAN карты>"
  },
  {
    "type":"field",
    "name":"ev_account1",
    "value":"<длинная строка>"
  }
]

Успешный JSON-ответ содержит блоки "name": "account" и "name": "ev_account1". Сохраните значения из поля value для передачи в платежном запросе.

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

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

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

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

Запрос → POST

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 <токен API>" 
  -d '{
        "id":"21131343",
        "sum": {
          "amount":1000,
          "currency":"643"
        },
        "paymentMethod": {
          "type":"Account",
          "accountId":"643"
        },
        "fields": {
          "account_type": "1",
          "account":"4256********1231",
          "exp_date": "0422"
        }
    }'
POST /sinap/api/v2/terms/464/payments HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer <токен API>
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": "0422"
  }
}
  • URL /sinap/api/v2/terms/{ID}/payments

ID — идентификатор провайдера. Возможные значения:

  • 464 — Альфа-Банк
  • 804 — АО “ОТП БАНК”
  • 810 — АО “РОССЕЛЬХОЗБАНК”
  • 815 — Русский Стандарт
  • 816 — ВТБ (ПАО)
  • 821 — Промсвязьбанк
  • 870 — ПАО Сбербанк
  • 881 — Ренессанс Кредит
  • 1134 — ПАО “МОСКОВСКИЙ КРЕДИТНЫЙ БАНК”
  • Параметры

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

Название Тип Описание
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

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 <токен API>" 
  -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 <токен API>
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***"
  }
}
  • URL /sinap/api/v2/terms/{ID}/payments

ID — идентификатор провайдера. Возможные значения:

  • 313 – ХоумКредит Банк
  • 464 – Альфа-Банк
  • 821 – Промсвязьбанк
  • 804 – АО “ОТП БАНК”
  • 810 – АО “РОССЕЛЬХОЗБАНК”
  • 816 – ВТБ (ПАО)
  • 819 – АО ЮНИКРЕДИТ БАНК
  • 868 – КИВИ БАНК (АО)
  • 870 – ПАО Сбербанк
  • 1134 – ПАО “МОСКОВСКИЙ КРЕДИТНЫЙ БАНК”
  • 27324 – АО “РАЙФФАЙЗЕНБАНК”
  • Параметры

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

Название Тип Описание
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

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 <токен API>" 
  -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 <токен API>
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()
  • URL /sinap/api/v2/terms/{ID}/payments

ID — идентификатор провайдера. Возможные значения:

  • 674 – OnLime.
  • 1239 – Фонд Подари жизнь.
  • Идентификатор другого интернет-провайдера или благотворительного фонда. Воспользуйтесь поиском провайдера по ключевым словам.
  • Параметры

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

Название Тип Описание
fields.account String Пользовательский идентификатор

Ответ ←

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

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

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

Запрос → POST

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 <токен API>" 
  --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 <токен API>
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"
  }
}
  • URL /sinap/api/v2/terms/1717/payments

  • Параметры

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

Название Тип Описание
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 с данными о принятом платеже.

Поиск провайдера по ключевым словам

Используйте этот запрос для поиска идентификатора провайдера. В запросе указывается список ключевых слов (например, название провайдера), разделенных пробелами.

Запрос → GET

curl -X GET 
  "https://edge.qiwi.com/search/v1/search?query=%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" 
  --header "Authorization: Bearer <токен API>"
GET /search/v1/search?query=%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: edge.qiwi.com
Authorization: Bearer <токен API>
import requests

# поиск на qiwi.com - определение id провайдера по названию
def qiwi_com_search(api_access_token, search_phrase):
    s = requests.Session()
    s.headers['authorization'] = 'Bearer ' + api_access_token
    search = s.get('https://edge.qiwi.com/search/v1/search', params={'query':search_phrase})
    return search.json()['items']
  • URL https://edge.qiwi.com/search/v1/search?query={value}

query — строка ключевых слов, разделенных пробелами.

Ответ ←

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

{
    "items": [
        {
            "name": "МТС Домашний интернет, ТВ и Телефония РФ",
            "description": "МТС Домашний интернет, ТВ и Телефония РФ",
            "uri": null,
            "data": {
                "id": 23729,
                "logoUrl": "https://static.qiwi.com/img/providers/logoBig/23729_l.png",
                ...
            }
        },
        ...
    ]
}
# Поиск провайдера: парсинг ответа
prv = qiwi_com_search('xxxxxxxxxxxxxxxxxxx','Билайн домашний интернет')[0]['data']['id']
print(str(prv))

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

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

Поиск сотового оператора по номеру телефона

Используйте этот запрос для поиска идентификатора провайдера сотового оператора. В запросе указывается номер мобильного телефона в формате 11 цифр, начинающийся с цифры 7. Действует только для мобильных операторов РФ и Казахстана.

Запрос → GET

curl "https://edge.qiwi.com/qw-mobile-providers-resolver/v1/providers?phoneNumber=79277010101" 
--header "Accept: application/json" 
--header "Authorization: Bearer <токен API>" 
GET /qw-mobile-providers-resolver/v1/providers?phoneNumber=79270010101 HTTP/1.1
Accept: application/json
Host: edge.qiwi.com
Authorization: Bearer <токен API>
import requests

# поиск на qiwi.com - определение id провайдера по номеру телефона
def qiwi_com_search_mobile(api_access_token, number):
    s = requests.Session()
    s.headers['authorization'] = 'Bearer ' + api_access_token
    search = s.get('https://edge.qiwi.com/qw-mobile-providers-resolver/v1/providers', params={'phoneNumber':number})
    return search.json()['mobileOperatorProviderList']
  • URL https://edge.qiwi.com/qw-mobile-providers-resolver/v1/providers?phoneNumber={value}

value — номер мобильного телефона в формате 11 цифр, начинающийся с 7.

Ответ ←

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

{
  "mobileOperatorProviderList": [
    { 
      "id": 3,
      "shortName": "МегаФон Столичный филиал",
      "logoUrl": "https://static.qiwi.com/img/providers/logoBig/3_l.png"
    }
  ]
}
# Поиск провайдера: парсинг ответа
prv = qiwi_com_search_mobile('xxxxxxxxxxxxxxxxxxx','79270010101')[0]['id']
print(str(prv))

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

Поле ответа Тип Описание
mobileOperatorProviderList Array Информация о провайдере
id Number Идентификатор провайдера
shortName 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": "Комментарий"
}

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

{
  "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 (платеж принят к проведению). Финальный результат транзакции можно узнать в истории платежей.

Счета

Счет в QIWI Wallet API — универсальная заявка на платеж или перевод с QIWI кошелька.

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

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

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

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

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

Запрос возвращает в ответе пару токенов P2P:

  • поле PublicKey — токен для выставления счета при вызове платежной формы;
  • поле SecretKey — токен для выставления счета через API.

Запрос → POST

curl -X POST 
  https://edge.qiwi.com/widgets-api/api/p2p/protected/keys/create 
  -H 'Authorization: Bearer <токен API QIWI Кошелька>' 
  -H 'Content-Type: application/json' 
  -H 'Accept: 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 <токен API QIWI Кошелька>
Content-Type: application/json
Accept: application/json
User-Agent: ****

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

{"PublicKey": "XXX", "SecretKey": "YYY"}
  • URL /widgets-api/api/p2p/protected/keys/create

  • Параметры

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

Параметры передаются в теле запроса как JSON:

Название Тип Описание
keysPairName String Название пары токенов P2P (произвольная строка)
serverNotificationsUrl String URL для уведомлений об оплате счетов (необязательный параметр)

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

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

Запрос → GET

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: ****
  • URL /checkout-api/api/bill/search?statuses=READY_FOR_PAY&parameter=value

  • Параметры

Параметры передаются в строке URL запроса:

Название Тип Описание
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": "Пополнение счета 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

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"
}
  • URL /checkout-api/invoice/pay/wallet

  • Параметры

Обязательные параметры в теле запроса:

Название Тип Описание
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

curl -X POST 
  --header 'Accept: application/json' 
  --header 'Authorization: Bearer ***' 
  --header 'Content-Type: application/json;charset=UTF-8' 
  -d '{ "id": 1034353453 }' 
  'https://edge.qiwi.com/checkout-api/api/bill/reject'
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
}
  • URL /checkout-api/api/bill/reject

  • Параметры

Обязательный параметр передается в теле запроса в формате JSON:

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

Ответ ←

HTTP/1.1 200 OK

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

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

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

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

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

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

  • 79.142.16.0/20
  • 195.189.100.0/22
  • 91.232.230.0/23
  • 91.213.51.0/24

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

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

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

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

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

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

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

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

{"hash": "50779a03d90c4fa60ac44dfd158dbceec0e9c57fa4cf4f5298450fdde1868945",
 "hookId": "f57f95e2-149f-4278-b2cb-4114bc319727",
 "messageId": "f9a197a8-26b6-4d42-aac4-d86b789c373c",
 "payment": {"account": "myAccount",
             "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: example.com

{"hash": "50779a03d90c4fa60ac44dfd158dbceec0e9c57fa4cf4f5298450fdde1868945",
 "hookId": "f57f95e2-149f-4278-b2cb-4114bc319727",
 "messageId": "6e2a0e32-4c8d-4fe2-9eed-fe3b6a726ff4",
 "payment": {"account": "masterDre",
             "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: example.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: example.com

{"hash": "a56ed0090fa3fd2fd0b002ed80f85a120037a6a85f840938888275e1631da96f",
 "hookId": "8c79f60d-0272-476b-b120-6e7629467328",
 "messageId": "bba24947-ab5f-4b33-881b-738fc3a4c9e1",
 "payment": {"account": "79042426915",
             "comment": "Пополнение кошелька",
             "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"}

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

Поле Тип Описание
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 Хэш цифровой подписи уведомления

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

<?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
import requests

# Base64 encoded ключ для расшифровки вебхука (/hook/{hookId}/key)
webhook_key_base64 = 'JcyVhjHCvHQwufz+IHXolyqHgEc5MoayBfParl6Guoc='
# строка параметров из запроса
data = '643|1|IN|+79161112233|13353941550'
# хэш подписи из запроса
sign_hash = 'f05c4e7bdf00620205d47696d77f924bfd3ba4d02b0398ac8a626e737dc27243'
webhook_key = base64.b64decode(bytes(webhook_key_base64,'utf-8'))
print('Signature verified?')
print(hmac.new(webhook_key, data.encode('utf-8'), hashlib.sha256).hexdigest() == sign_hash)

Реализуйте шаги проверки подписи:

  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":"+79161112233","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.signFieldssum.currency,sum.amount,type,account,txnId):
    643|1|IN|+79161112233|13353941550
  4. Поля шифруются методом SHA-256 с Base64-раскодированным ключом из п.1. Результат
    f05c4e7bdf00620205d47696d77f924bfd3ba4d02b0398ac8a626e737dc27243
    совпадает с параметром hash из запроса.

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

Запрос → PUT

curl -X PUT 
  "https://edge.qiwi.com/payment-notifier/v1/hooks?hookType=1&param=http%3A%2F%2Fexample.com%2Fcallbacks%2F&txnType=2" 
  -H "accept: */*" 
  -H "authorization: Bearer <токен API>"
PUT /payment-notifier/v1/hooks?hookType=1&param=http%3A%2F%2Fexample.com%2Fcallbacks%2F&txnType=2 HTTP/1.1
Host: edge.qiwi.com
Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f
User-Agent: ****
  • URL /payment-notifier/v1/hooks?parameter=value

  • Параметры

    Параметры передаются в query запроса. Все параметры обязательны.

Название Тип Описание
hookType Integer Тип хука. Только 1 – вебхук.
param URL-encoded Адрес сервера обработки вебхуков. Длина исходного (не URL-encoded) адреса — не более 100 символов. URL обработчика должен быть доступен из Интернета.
txnType String Тип транзакций, по которым будут включены уведомления. Возможные значения:
0 – только входящие транзакции (пополнения);
1 – только исходящие транзакции (платежи);
2 – все транзакции

Ответ ←

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

{
  "hookId":"d63a8729-f5c8-486f-907d-9fb8758afcfc",
  "hookParameters":{
    "url":"http://example.com/callbacks/"
  },
  "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 <токен API>"
DELETE /payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc HTTP/1.1
Host: edge.qiwi.com
Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f
User-Agent: ****
  • URL /payment-notifier/v1/hooks/hookId

    • hookId – UUID вебхука

Ответ ←

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 <токен API>"
GET /payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc/key HTTP/1.1
Host: edge.qiwi.com
Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f
User-Agent: ****
  • URL /payment-notifier/v1/hooks/hookId/key

    • hookId – UUID вебхука

Ответ ←

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 <токен API>"
POST /payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc/newkey HTTP/1.1
Host: edge.qiwi.com
Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f
User-Agent: ****
  • URL /payment-notifier/v1/hooks/hookId/newkey

    • hookId – UUID вебхука

Ответ ←

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 <токен API>"
GET /payment-notifier/v1/hooks/active HTTP/1.1
Host: edge.qiwi.com
Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f
User-Agent: ****
  • URL /payment-notifier/v1/hooks/active

Ответ ←

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

{
  "hookId":"d63a8729-f5c8-486f-907d-9fb8758afcfc",
  "hookParameters":{
    "url":"http://example.com/callbacks/"
  },
  "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 <токен API>"
GET /payment-notifier/v1/hooks/test HTTP/1.1
Host: edge.qiwi.com
Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f
User-Agent: ****
  • URL /payment-notifier/v1/hooks/test

Ответ ←

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

{
  "response":"Webhook sent"
}

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

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

Коды ошибок

Последнее обновление: 2022-01-21 | Этот раздел на 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 Платеж отклонен. Обратитесь в банк, выпустивший карту.
   
   
   

Introduction

Last update: 2023-03-02 | Propose corrections on GitHub

QIWI Wallet API makes it easy to automate getting info on your account’s state in QIWI Wallet service and making financial operations.

API uses HTTPS requests and JSON-formatted responses.

API methods are accessible after the user is registered in QIWI Wallet service.

Service data

  • Authorization

Parameter Description Type
token Token to authorize API requests. Token is valid within one month after its issuing. String

API Access

We have stopped issuing QIWI OAuth-tokens.

Main URL address to call API methods (unless explicitly stated):

https://edge.qiwi.com

To make a successful request of API methods, you need:

  • Correct HTTP headers: Accept and Content-Type, as designated in a method description.
  • URL composed according to the method reference
  • OAuth token issued for your QIWI Wallet. Some requests do not require it though.

Authorization

Authorization data

QIWI Wallet API implements OAuth 2.0 open authorization protocol specification. A user registers or authenticates on https://qiwi.com QIWI Wallet site and requests a token with a certain scopes. Token issue is confirmed by SMS code.

How to get a token

  1. Open https://qiwi.com/api page in your browser. You will need to register or authenticate on QIWI Wallet service. Click on Выпустить новый токен (please note, interface is Russian only).

    Token Issue

  2. Select token scopes in the pop-up window and click Продолжить:
    • Запрос информации о профиле кошелька – allows use of person’s profile requests, identification API, limits API
    • Запрос баланса кошелька – allows balance requests
    • Просмотр истории платежей – allows payments history requests
    • Проведение платежей без SMS – allows making payment requests with no SMS confirmation (regardless the security settings, using invoicing’s API and notification service
      Token Scopes
  3. Confirm a token issue and click Продолжить.

    Token Scopes

  4. Enter confirmation code from SMS sent to the phone number of your wallet.

    Token Accept

  5. Copy token string and save it in secure place. Use the token in all QIWI Wallet API requests which require authorization.

    Token

Authorization example

curl "server address" 
  --header "Authorization: Bearer jMyN22DQxMjM6NDUzRmRnZDQ0Mw11212e"
  • As a result of authentication in QIWI Wallet site, you got the token:

U1QtOTkwMTAyLWNud3FpdWhmbzg3M

  • Add the token to Authorization: Bearer HTTP header.

  • The header has to be added to each API request:

Authorization: Bearer U1QtOTkwMTAyLWNud3FpdWhmbzg3M

User’s Profile API

Last update: 2020-07-28 | Edit on GitHub

The API returns information about your profile – a set of user data and settings of your QIWI Wallet.

Request → GET

curl "https://edge.qiwi.com/person-profile/v1/profile/current?authInfoEnabled=false" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <API token>"
GET /person-profile/v1/profile/current HTTP/1.1
Accept: application/json
Authorization: Bearer <API token>
Host: edge.qiwi.com
import requests

# User profile
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'

# Full info
profile = get_profile(api_access_token)

# Blocking status
profile['contractInfo']['blocked']

# Identification level
profile['contractInfo']['identificationInfo'][0]['identificationLevel']

# Linked email
profile['authInfo']['boundEmail']
  • URL /person-profile/v1/profile/current?parameter=value

  • Parameters

    These options are transmitted in the URL query:

Name Type Description
authInfoEnabled Boolean Flag to get authorization settings.
By default, true
contractInfoEnabled Boolean Flag to get your QIWI wallet data.
By default, true
userInfoEnabled Boolean Flag to get other user data.
By default, true

Response ←

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
  }
}

Successful JSON-response has the following fields:

Field Type Description
authInfo Object Current authorization settings. The object may be missing, depending on the authInfoEnabled parameter in the request.
authInfo.personId Number Wallet number
authInfo.registrationDate String QIWI Wallet date/registration time (via website/mobile app, or otherwise)
authInfo.boundEmail String E-mail linked to your QIWI wallet. If not, null
authInfo.ip String IP address of the last user session
authInfo.lastLoginDate String The date/time of the last session in QIWI Wallet service
authInfo.mobilePinInfo Object PIN data of the mobile app
mobilePinInfo.mobilePinUsed Boolean Flag of using a PIN-code (actually means that the mobile app is being used)
mobilePinInfo.lastMobilePinChange String The date/time of the last time of the PIN change in the mobile app
mobilePinInfo.nextMobilePinChange String The date/time of the next (planned) change of the PIN in the mobile app
authInfo.passInfo Object Password usage data on the qiwi.com site
passInfo.passwordUsed Boolean Flag of using password (actually means using the site qiwi.com)
passInfo.lastPassChange String The date/time of the last password change on qiwi.com
passInfo.nextPassChange String The date/time of the next (planned) password change on qiwi.com
authInfo.pinInfo Object PIN usage data to the wallet app on the self-service kiosks
pinInfo.pinUsed Boolean Flag of using a PIN for the terminal (actually means using the wallet app on the self-service kiosk)
contractInfo Object Information about the wallet. The object may be missing, depending on the contractInfoEnabled parameter in the request.
contractInfo.blocked Boolean Flag of wallet block
contractInfo.contractId Number Wallet number
contractInfo.creationDate String The date/time to create a wallet (via website/mobile app, either at first topup or otherwise)
contractInfo.features Array[Object] Service info
contractInfo.identificationInfo Array[Object] User’s identification data
identificationInfo[].bankAlias String String’s acronym of the system, in which the user has received the identification::
QIWI – QIWI Wallet.
identificationInfo[].identificationLevel String Current level of the wallet identification. Possible values:
ANONYMOUS – no identification;
SIMPLE, VERIFIED – simplified identification;
FULL – full identification.
identificationInfo[].passportExpired Boolean Validity of passport data of the wallet’ owner (true means that the passport data is invalid).
userInfo Object Other user data. The object may be missing, depending on the userInfoEnabled parameter in the request.
userInfo.defaultPayCurrency Number(3) Default wallet balance currency code (ISO-4217)
userInfo.defaultPaySource Number Service info
userInfo.email String User’s e-mail
userInfo.firstTxnId Number Identifier of the first transaction after registration
userInfo.language String Service info
userInfo.operator String Name of the mobile operator of the user’s number
userInfo.phoneHash String Service info
userInfo.promoEnabled String Service info

Identification API

Use methods of this API to identify and check identification status of your wallet in QIWI Wallet service. You need identification to get access to increased limits for balances and transactions.

Identification details (in Russian)

User identification

This request allows you to start the identification of your QIWI Wallet.

To obtain Main wallet status, you must provide the following data about the owner of the wallet:

  • The name
  • Series / Passport No.
  • Date of birth
  • TIN, SNILS or OMS policy number is optional.

To identify your wallet, you must send your name, series/passport number and date of birth. If the data has been verified, the answer will show your TIN and simplified wallet identification will be established. If the data has not been verified, the wallet remains in the status of “No Identification.”

Request → POST

curl -X POST 
  "https://edge.qiwi.com/identification/v1/persons/79111234567/identification" 
  --header "Accept: application/json" 
  --header "Content-Type: application/json" 
  --header "Authorization: Bearer <API token>" 
  -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 <API token>
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()
  • URL /identification/v1/persons/wallet/identification

    • wallet – number of your QIWI wallet without + sign
  • Parameters

    Send in JSON body of the request:

Name Type Description
birthDate String Date of birth (in “YYYY-MM-DD” format)
firstName String User’s first name
middleName String User’s surname
lastName String User’s last name
passport String Series / Passport No. (only digits)
inn String User’s TIN
snils String User’s SNILS
oms String User’s medical insurance number (OMS)

Response ←

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'}

Successful JSON response confirms wallet identification data:

Response field Type Description
id Number User’s QIWI wallet number
type String Current identification level of the wallet:
SIMPLE – no identification, wallet status “MINIMAL”.
VERIFIED – wallet status “MAIN” (identification data has been successfully verified).
FULL – the wallet already got “FULL” status by the provided personally verified name, passport and date of birth.
birthDate String Date of birth
firstName String User’s first name
middleName String User’s surname
lastName String User’s last name
passport String Series / Passport No. (only digits)
inn String User’s TIN. If the parameter is returned but not present in the original request, then the wallet identification is established
snils String User’s SNILS
oms String User’s medical insurance number (OMS)

Identification data

Gets masked private data and identification status of your QIWI Wallet.

Request → GET

curl -X GET 
  "https://edge.qiwi.com/identification/v1/persons/79111234567/identification" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <API token>"
GET /identification/v1/persons/79111234567/identification HTTP/1.1
Accept: application/json
Authorization: Bearer <API token>
Host: edge.qiwi.com
  • URL /identification/v1/persons/wallet/identification

    • wallet – your QIWI wallet number without + sign
  • URL /qw-limits/v1/persons/personId/actual-limits?parameter=value

    • personId – your QIWI wallet number without + sign

Response ←

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"
}

Successful JSON response contains masked data used for the wallet identification:

Response field Type Description
id Number User’s QIWI wallet number
type String Current identification level of the wallet:
SIMPLE – no identification, status “MINIMAL”.
VERIFIED – status “MAIN” (identification data has been successfully verified).
FULL – “FULL” status, the wallet already got full identification by the provided name, passport and date of birth.
birthDate String Date of birth
firstName String User’s first name
middleName String User’s surname
lastName String User’s last name
passport String Series / Passport No. (first and last two digits)
inn String User’s TIN (first and last two digits)
snils String User’s SNILS (first and last two digits)
oms String User’s medical insurance number (OMS) (first and last two digits)

QIWI Wallet Limits API

Limit levels

By using this API, you can get current limits for operations in your QIWI wallet. Limits apply on accessible amount of the operations.

Request → GET

curl "https://edge.qiwi.com/qw-limits/v1/persons/79115221133/actual-limits?types%5B0%5D=TURNOVER" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <API token>"
GET /qw-limits/v1/persons/79115221133/actual-limits?types%5B0%5D=TURNOVER HTTP/1.1
Accept: application/json
Authorization: Bearer <API token>
Host: edge.qiwi.com
import requests

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()
  • URL /qw-limits/v1/persons/personId/actual-limits?parameter=value

    • personId – your QIWI wallet number without + sign
  • Parameters

    Send in the request path:

Name Type Description
types Array[String] A list of the types of operations that limits are requested for. Each type is numbered by an array element, starting from zero (types[0], types[1], etc.). Acceptable types of transactions:
REFILL – balance in the account
TURNOVER – turnover per month
PAYMENTS_P2P – transfers to other wallets per month
PAYMENTS_PROVIDER_INTERNATIONALS – payments to foreign companies per month
PAYMENTS_PROVIDER_PAYOUT – transfers to bank accounts and cards, wallets of other systems
WITHDRAW_CASH – cash withdrawals per month.
At least one type of operation must be specified.

Response ←

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"
            }
        },
        ...
    ]
  }
}
# wallet number like 79992223344
mylogin = '79999999999'
api_access_token = '975efd8e8376xxxb95fa7cb213xxx04'

# list of all limits
limits = limits(mylogin,api_access_token)['limits']['RU']

# turnover limit
turnoverInfo = [x for x in limits if x['type'] == 'TURNOVER']
turnoverLimit = turnoverInfo[0]['rest']

Successful JSON response contains an array of limits for your QIWI wallet operations:

Response field Type Description
limits Object Limits data
limits[].’RU’ Array[Object] An array of limits for operations
type String Operation type where the limit is applied
currency String Currency of the operation
max String Value of the limit
spent String Amount already spent in the operations
rest Boolean The rest of the limit which can be used in the given period (see interval field)
interval Object Details of the limit’s period
interval.dateFrom, interval.dateTill String Period’s start and end, as YYYY-MM-DDTHH:MM:SStmz string

Person-to-person transaction limit

The API returns the value of the person-to-person transaction number for the current month.

Request → GET

curl "https://edge.qiwi.com/qw-limits/v1/persons/79999999999/p2p-payment-count-limit" 
  --header "Accept: application/json" 
  --header "Authorization:  Bearer <API token>"
GET /qw-limits/v1/persons/79999999999/p2p-payment-count-limit HTTP/1.1
Accept: application/json
Authorization: Bearer <API token>
Host: edge.qiwi.com
import requests

# Number of person-to-person transactions
def get_p2p_payment_count(login, api_access_token):
    s = requests.Session()
    s.headers['Accept']= 'application/json'
    s.headers['Content-Type']= 'application/json'
    s.headers['authorization'] = 'Bearer ' + api_access_token
    b = s.get('https://edge.qiwi.com/qw-limits/v1/persons/' + login + '/p2p-payment-count-limit')
    return b.json()
  • URL /qw-limits/v1/persons/personId/p2p-payment-count-limit

    • personId – your QIWI wallet number without “+”

Response ←

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

{
    "p2pPaymentCountLimit": 1
}
mylogin = '79999999999'
api_access_token = '975efd8e8376xxxb95fa7cb213xxx04'

# P2p payment count for the current month
print(get_p2p_payment_count(api_access_token, mylogin))

{'p2pPaymentCountLimit': 1}

Successful JSON response contains an information of your person-to-person transactions:

Response field Type Description
p2pPaymentCountLimit Number Person-to-person transaction count per month

Payments History API

Last update: 2020-07-28 | Edit on GitHub

The API gives access to the history of transactions in your QIWI wallet.

List of payments

Provides a list of payments and top-ups of your wallet. You can use the filter by number, ID and date (date interval) of transactions.

Interactive API

Request → GET

Example 1. Last 10 payments

curl "https://edge.qiwi.com/payment-history/v2/persons/<wallet>/payments?rows=10" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <API token>"

Example 2. Payments for 10.05.2017

curl "https://edge.qiwi.com/payment-history/v2/persons/<wallet>/payments?rows=50&startDate=2017-05-10T00%3A00%3A00%2B03%3A00&endDate=2017-05-10T23%3A59%3A59%2B03%3A00" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <API token>"

Example 3. Continuing payments list (parameters nextTxnId=9103121 and nextTxnDate=2017-05-11T12:35:23+03:00 returned in the previous history request)

curl "https://edge.qiwi.com/payment-history/v2/persons/<wallet>/payments?rows=50&nextTxnId=9103121&nextTxnDate=2017-05-11T12%3A35%3A23%2B03%3A00" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <API token>"

Example 4. Last 10 payments from the ruble account and from the linked card

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

Example 5. Payments for 10.05.2017 from the ruble account

GET /payment-history/v2/persons/<wallet>/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 <API token>
Host: edge.qiwi.com

Example 6. Continuing payments list for 10.05.2017 (see Example 2, parameters nextTxnId=9103121 и nextTxnDate=2017-05-11T12:35:23+03:00 returned)

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

# Payments history - the most recent and next n payments
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()
  • URL /payment-history/v2/persons/wallet/payments?parameter=value

    • wallet – your QIWI wallet number without + sign
  • Parameters

    These are transmitted in the query path:

Name Type Description
rows Integer The number of payments in response to break down the report into chunks. It must be from 1 to 50. The request returns a specified number of payments in reverse chronological order, starting from the current date or date in the startDate option. Required
operation String The type of operations in the report, for selection. Acceptable values:
ALL – all transactions,
IN – only top-ups,
OUT – only payments,
QIWI_CARD – only payments from QIWI cards (QVC, QVP).
By default, ALL is used
sources Array[String] A list of payment sources for the filter. Each source is numbered from scratch (sources[0], sources[1] etc). Acceptable values:
QW_RUB – ruble account of your QIWI wallet,
QW_USD – USD account of your QIWI wallet,
QW_EUR – euro account of your QIWI wallet,
CARD – cards linked to the wallet and other credit cards,
MK – the corresponding account on the mobile operator. If not specified, all sources are considering
startDate DateTime URL-encoded The initial date for the search for payments. It is only used with endDate. The maximum allowable interval between startDate and endDate is 90 calendar days. By default, equal to the daily shift from the current date to Moscow time. The date can be specified in any time zone TZD (in YYYY-MM-DD'T'hh:mm:ssTZD format), but it must coincide with the time zone in the endDate parameter. Timezone designation: +hh:mm or –hh:mm (time shift from GMT).
endDate DateTime URL-encoded The final date for the search for payments. It is only used with startDate. The maximum allowable interval between startDate and endDate is 90 calendar days. By default, equal to current date/time in Moscow time. The date can be specified in any time zone TZD (in YYYY-MM-DD'T'hh:mm:ssTZD format), but it must coincide with the time zone in the startDate parameter. Timezone designation: +hh:mm or –hh:mm (time shift from GMT).
nextTxnDate DateTime URL-encoded The transaction date to start the report (should be equal to nextTxnDate in the previous report). Used only with nextTxnId
nextTxnId Long The transaction number to start the report (should be equal to nextTxnId in the previous report). Used only with nextTxnDate

Response ←

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":"",
    "currencyRate":1
  }],
  "nextTxnId":9001,
  "nextTxnDate":"2017-01-31T15:24:10+03:00"
}
mylogin = '79999999999'
api_access_token = '975efd8e8376xxxb95fa7cb213xxx04'

# last 20 payments
lastPayments = payment_history_last(mylogin, api_access_token, '5','','')

# date and time of the next payment (to use in the next request)
nextTxnDate = lastPayments['nextTxnDate']

# transaction id of the next payment (to use in the next request)
nextTxnId = lastPayments['nextTxnId']

# the most recent and next n payments
orderedPayments = payment_history_last(mylogin, api_access_token, '5', nextTxnId, nextTxnDate)

Successful JSON-response contains a list of payments corresponding to the request’s filter:

Field Type Description
data Array[Object] A list of PaymentHistoryItem objects.
Number of objects in the list is less than or equals to rows value from the request
nextTxnId Number(Integer) Next transaction ID, in the complete list of your transactions
nextTxnDate DateTime Next transaction date/time, in the complete list of your transactions, Moscow time (in YYYY-MM-DD'T'hh:mm:ss+03:00)

Statistics

Provides aggregate statistics on the amount of payments for a given period.

Interactive API

Request → GET

curl "https://edge.qiwi.com/payment-history/v2/persons/<wallet>/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 <API token>"
GET /payment-history/v2/persons/<wallet>/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 <API token>
Host: edge.qiwi.com
import requests

# Sum of payments for a range of dates
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()
  • URL /payment-history/v2/persons/wallet/payments/total?parameter=value

    • wallet – the number of your QIWI wallet without + sign
  • Parameters

    Send them in the query path:

Name Type Description
startDate DateTime URL-encoded Start date of the period, in any time zone TZD (date format YYYY-MM-DD'T'hh:mm:ssTZD). Time zone must coincide with endDate time zone. Designation TZD: +hh:mm or –hh:mm (time shift from GMT). Required
endDate DateTime URL-encoded Final date of th period, in any time zone TZD (date format YYYY-MM-DD'T'hh:mm:ssTZD). Time zone must coincide with startDate time zone. Designation TZD: +hh:mm or –hh:mm (time shift from GMT). Required
operation String Operations to take into account when accumulating statistics. Possible values:
ALL – all operations,
IN – only top-ups,
OUT – only payments,
QIWI_CARD – only payments from QIWI cards (QVC, QVP).
Default value is ALL.
sources Array[String] Payment sources to filter data. Each source is enumerated starting from zero (sources[0], sources[1] and so on). Possible values of each source:
QW_RUB – ruble QIWI Wallet account,
QW_USD – USD QIWI Wallet account,
QW_EUR – euro QIWI Wallet account,
CARD – credit cards, both linked to QIWI Wallet and others,
MK – mobile operator account. If not specified, all sources are collected.

Response ←

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'

# Payments amount from April 12 till July 11
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}]}

Successful JSON-response contains statistics data for a specified period:

Field Type Description
incomingTotal Array[Object] Array of total amounts of incoming payments (top-up payments) separated by payment’s currency
incomingTotal[].amount Number(Decimal) Top-ups amount for the period
incomingTotal[].currency Number(3) Currency of the operations (ISO-4217)
outgoingTotal Array[Object] Array of total amounts of payments separated by payment’s currency
outgoingTotal[].amount Number(Decimal) Payments amount for the period
outgoingTotal[].currency Number(3) Currency of the operations (ISO-4217)

Transaction details

Returns details on a specific transaction from your payments history.

Interactive API

Request → GET

curl "https://edge.qiwi.com/payment-history/v2/transactions/9112223344" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <API token>"
GET /payment-history/v2/transactions/9112223344 HTTP/1.1
Accept: application/json
Authorization: Bearer YUu2qw048gtdsvlk3iu
Host: edge.qiwi.com
import requests

# Transaction details
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()
  • URL /payment-history/v2/transactions/transactionId?type=value

    • transactionId – transaction ID from Payments history report (txnId field of Transaction object)
    • type – transaction type from Payments history report (type field of Transaction object). This is optional parameter

Response ←

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": "",
    "currencyRate": 1,
    "paymentExtras": [],
    "serviceExtras": {},
    "view": {},
    "features": {
      "chequeReady": false,
      "bankDocumentAvailable": false,
      "bankDocumentReady": false,
      "repeatPaymentEnabled": false,
      "favoritePaymentEnabled": false,
      "regularPaymentEnabled": false
    }
}
# wallet number like 79992223344
mylogin = '79999999999'
api_access_token = '975efd8e8376xxxb95fa7cb213xxx04'

# Transaction ID 11181101215 details
transactionInfo = payment_history_transaction(api_access_token, '11181101215', 'OUT')

# Transaction number 5 details
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)

Successful JSON-response contains Transaction object.

Payment receipt

Returns electronic receipt for a certain transaction in PDF/JPEG format, either as binary file or via e-mail to specified address.

Receipt file

Interactive API

Request → GET

curl "https://edge.qiwi.com/payment-history/v1/transactions/9112223344/cheque/file?type=IN&format=PDF" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <API token>"
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

# Get receipt text in file
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)
  • URL /payment-history/v1/transactions/transactionId/cheque/file?type=value&format=value

    • transactionId – transaction ID from Payments history report (txnId field in Transaction object)
    • type – transaction type from Payments history report (type field in Transaction object)
    • format – file type for receipt export. Possible values: JPEG, PDF

Response ←

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

[
  ""
]

Successful JSON-response contains binary file.

Receipt sending

Interactive API

Request → POST

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 <API token>" 
  -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

# Send receipt to 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
  • URL /payment-history/v1/transactions/transactionId/cheque/send?type=value

    • transactionId – transaction ID from Payments history report (txnId field in Transaction object)
    • type – transaction type from Payments history report (type field in Transaction object)
  • Parameter

    Send this parameter in JSON body of the request:

Name Type Description
email String Email address

Response ←

HTTP/1.1 201 Created
# wallet number like 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']

# Send receipt to email
payment_history_cheque_send(str(last_txn_id), last_txn_type, 'mmd@yandex.ru', api_access_token)

Successful JSON-response contains HTTP result code of file sending operation.

API data models

PaymentHistoryItem class

Object contains information about existing QIWI Wallet payment.

Name Type Description
txnId Integer Transaction ID in QIWI Wallet processing
personId Integer Wallet number
date DateTime For payments history reports – Payment date/time, in the request time zone (see startDate parameter). Date format YYYY-MM-DD'T'hh:mm:ss+03:00
For transaction details – Payment date/time, in Moscow time zone (date format: YYYY-MM-DD'T'hh:mm:ss+03:00)
errorCode Number(Integer) Payment error code
error String Error description
type String Payment type. Possible values:
IN – top-up,
OUT – payment,
QIWI_CARD – payment from QIWI card (QVC, QVP).
status String Payment status. Possible values:
WAITING – payment is processing,
SUCCESS – successful payment,
ERROR – payment error.
statusText String Text description of the status
trmTxnId String Transaction’s client ID (assigned on the client device)
account String For payments, recipient’s identifier (masked card number, phone number, account number etc.). For top-ups, sender’s or terminal’s identifier, or top-up agent name
sum Object Payment’s amount data.
sum.amount Number(Decimal) amount,
sum.currency Number(3) currency (ISO-4217)
commission Object Payment’s commission data
commission.amount Number(Decimal) amount,
commission.currency Number(3) currency (ISO-4217)
total Object Total amount of transaction.
total.amount Number(Decimal) amount, it is sum.amount plus commission.amount,
total.currency Number(3) currency (ISO-4217)
provider Object Provider’s data
provider.id Integer Provider ID in QIWI Wallet system,
provider.shortName String Provider’s short name,
provider.longName String Provider’s extended name,
provider.logoUrl String Provider’s logo URL,
provider.description String Provider’s description (in HTML),
provider.keys String Provider’s keywords list,
provider.siteUrl String Provider’s site
comment String Comment to the payment
currencyRate Number(Decimal) Currency exchange rate (if applied to transaction)

Transaction class

Object contains information about existing QIWI Wallet transaction.

Name Type Description
txnId Integer Transaction ID in QIWI Wallet processing
personId Integer Wallet number
date DateTime For payments history reports – Payment date/time, in the request time zone (see startDate parameter). Date format YYYY-MM-DD'T'hh:mm:ss+03:00
For transaction details – Payment date/time, in Moscow time zone (date format: YYYY-MM-DD'T'hh:mm:ss+03:00)
errorCode Number(Integer) Payment error code
error String Error description
type String Payment type. Possible values:
IN – top-up,
OUT – payment,
QIWI_CARD – payment from QIWI card (QVC, QVP).
status String Payment status. Possible values:
WAITING – payment is processing,
SUCCESS – successful payment,
ERROR – payment error.
statusText String Text description of the status
trmTxnId String Transaction’s client ID (assigned on the client device)
account String For payments, recipient’s identifier (masked card number, phone number, account number etc.). For top-ups, sender’s or terminal’s identifier, or top-up agent name
sum Object Payment’s amount data.
sum.amount Number(Decimal) amount,
sum.currency Number(3) currency (ISO-4217)
commission Object Payment’s commission data
commission.amount Number(Decimal) amount,
commission.currency Number(3) currency (ISO-4217)
total Object Total amount of transaction.
total.amount Number(Decimal) amount, it is sum.amount plus commission.amount,
total.currency Number(3) currency (ISO-4217)
provider Object Provider’s data
provider.id Integer Provider ID in QIWI Wallet system,
provider.shortName String Provider’s short name,
provider.longName String Provider’s extended name,
provider.logoUrl String Provider’s logo URL,
provider.description String Provider’s description (in HTML),
provider.keys String Provider’s keywords list,
provider.siteUrl String Provider’s site
comment String Comment to the payment
currencyRate Number(Decimal) Currency exchange rate (if applied to transaction)
paymentExtras Array of Object Service information
features Object Set of special fields
features.chequeReady Boolean Special field
features.bankDocumentReady Boolean Special field
features.bankDocumentAvailable Boolean Special field
features.repeatPaymentEnabled Boolean Special field
features.favoritePaymentEnabled Boolean Special field
features.regularPaymentEnabled Boolean Special field
features.chatAvailable Boolean Special field
features.greetingCardAttached Boolean Special field
serviceExtras Object Служебная информация
view Object Служебная информация

Wallet Balances API

Last update: 2020-07-28 | Edit on GitHub

API provides methods to control balances of your QIWI wallet.

List of balances

Provides current balances of your QIWI Wallet.

Interactive API

Request → GET

curl "https://edge.qiwi.com/funding-sources/v2/persons/<wallet>/accounts" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <API token>"
GET /funding-sources/v2/persons/<wallet>/accounts HTTP/1.1
Accept: application/json
Authorization: Bearer <API token>
Host: edge.qiwi.com
import requests

# QIWI Wallet balances
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()
  • URL /funding-sources/v2/persons/personId/accounts

    • personId – your wallet number (without + sign)

Response ←

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
        }
    ]
}
# wallet number as 79992223344
mylogin = '79999999999'
api_access_token = '975efd8e8376xxxb95fa7cb213xxx04'

# All balances
balances = balance(mylogin,api_access_token)['accounts']

# Ruble account balance
rubAlias = [x for x in balances if x['alias'] == 'qw_wallet_rub']
rubBalance = rubAlias[0]['balance']['amount']

Repeated request when you got empty “balance” object and “hasBalance”: true in response

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

Successful response is JSON array of all active balances of your QIWI wallet used for payment funding:

Response field Type Description
accounts Array[Object] Array of balances
accounts[].alias String User balance alias
accounts[].fsAlias String Bank account alias
accounts[].bankAlias String Bank alias
accounts[].title String Wallet account name
accounts[].hasBalance Boolean Flag of actual QIWI Wallet balance (not a linked card or cell phone balance or something like that)
accounts[].currency Number(3) Currency of the balance (ISO-4217). Only balances in following currencies are returned: 643 – Russian ruble, 840 – USD, 978 – Euro
accounts[].type Object Account information
type.id, type.title String Account title
accounts[].balance Object Balance data.
If null is returned and accounts[].hasBalance is true, repeat the request with additional parameters:
timeout=1000 and alias="accounts[].alias" (alias of that balance)
balance.amount Number Текущий баланс данного счета
balance.currency Number(3) Код валюты баланса (ISO-4217)

Creating balance

Creates a new account and its balance in your QIWI wallet. List of account types which you can create is provided by other request.

Interactive API

Request → POST

curl -X POST 
  "https://edge.qiwi.com/funding-sources/v2/persons/<wallet/accounts" 
  --header "Accept: application/json" 
  --header "Content-Type: application/json" 
  --header "Authorization: Bearer <API token>" 
  -d '{  "alias": "qw_wallet_eur"}'
POST /funding-sources/v2/persons/<wallet>/accounts HTTP/1.1
Accept: application/json
Authorization: Bearer <API token>
Content-type: application/json
Host: edge.qiwi.com

{ "alias": "qw_wallet_eur" }
  • URL /funding-sources/v2/persons/personId/accounts

    • personId – your wallet number without + sign
  • Parameters

    In JSON body of the request:

Name Type Description
alias String Alias of the new account (taken from Available accounts)

Response ←

HTTP/1.1 201 Created

Successful response contains HTTP code 201.

Available accounts

Provides all possible account aliases for your QIWI wallet.

Interactive API

Request → GET

curl -X GET 
  "https://edge.qiwi.com/funding-sources/v2/persons/<wallet>/accounts/offer" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <API token>"
GET /funding-sources/v2/persons/<wallet>/accounts/offer HTTP/1.1
Accept: application/json
Authorization: Bearer <API token>
Host: edge.qiwi.com
  • URL /funding-sources/v2/persons/personId/accounts/offer

    • personId – your wallet number without + sign

Response ←

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

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

Successful JSON response contains a list of accounts available for creation:

Response field Type Description
{} Object List of accounts
Object.alias String Alias of the account
Object.currency Number(3) Account’s currency code (ISO-4217)

Default balance

Sets up default account in your QIWI wallet for funding all payments. The account must be in the list of available accounts

Interactive API

Request → PATCH

curl -X PATCH 
  "https://edge.qiwi.com/funding-sources/v2/persons/<wallet>/accounts/qw_wallet_usd" 
  --header "Accept: application/json" 
  --header "Content-Type: application/json" 
  --header "Authorization: Bearer <API token>" 
  -d '{ "defaultAccount": true }'
PATCH /funding-sources/v2/persons/<wallet>/accounts/qw_wallet_usd HTTP/1.1
Accept: application/json
Authorization: Bearer <API token>
Content-type: application/json
Host: edge.qiwi.com

{ "defaultAccount": true }
  • URL /funding-sources/v2/persons/personId/accounts/accountAlias

    • personId – your wallet number without + sign
    • accountAlias – account’s alias in the wallet, from a list (see parameter accounts[].alias in response)
  • Parameters

    Parameter in JSON body:

Name Type Description
defaultAccount Boolean Flag of default account

Response ←

HTTP/1.1 204 Modified

Successful response has HTTP code 204.

Payments API

Last update: 2022-06-30 | Edit on GitHub

Commission rates

Returns total commission amount for the payment by the given payment requisites.

Request → POST

curl -X POST 
  'https://edge.qiwi.com/sinap/providers/99/onlineCommission' 
  --header "Accept: application/json" 
  --header "Content-Type: application/json" 
  --header "Authorization: Bearer <API token>" 
  -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 <API token>
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']
  • URL /sinap/providers/ID/onlineCommission

ID — provider’s identifier. Possible values:

  • 99 — QIWI Wallet transfer.
  • 1717 — Payment by bank requisites to commercial organization.
  • Providers of bank wire transfer.

You can also search for a required identifier through API by keywords.

  • Parameters

Required parameters in JSON body:

Name Type Description
account String User’s identifier (phone number, card/account number, and other entity depending on provider)
paymentMethod Object Object defining payment processing by QIWI Wallet. Includes the following parameters:
paymentMethod.type String Payment method, Account only
paymentMethod.accountId String QIWI Wallet account identifier, 643 only.
purchaseTotals Object Object with payment requisites
purchaseTotals.total Object Payment amount data:
total.amount Number Amount (rubles and kopeks, divided by .). Positive number, rounded down to 2 decimals. If you send more decimals, value will be rounded down to kopeks.
total.currency String Currency (643 only, that is rubles)

Response ←

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 wallet transfer commission
print(get_commission(api_access_token,'+380000000000','99',5000))
# Card transfer commission
print(get_commission(api_access_token,'4890xxxxxxxx1698','22351',1000))

Commission rate returns in qwCommission.amount field of the JSON response.

Payment form auto-filling

Provides auto-filled payment form on qiwi.com site.

Link example (click to see the form)

If you don’t want to show your wallet number, use transfer to the wallet nickname:

Link example for nickname transfer (click to see the form)

To get payments to your QIWI Wallet, you can use also P2P-form.

Request → 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
  • URL https://qiwi.com/ID?{parameter}={value}

ID — provider’s identifier. Only providers with payment requisites limited to fields.account are accepted. Possible values:

  • 99 — QIWI Wallet transfer.
  • 99999 — QIWI Wallet nickname transfer.
  • 1963 — Visa card transfer (issued by only Russian banks).
  • 21013 — MasterCard card transfer (issued by only Russian banks).
  • 31652 — MIR national payment system card transfer.
  • 22351 — QIWI Virtual card transfer.
  • 1717 — Payment by bank requisites to commercial organization.

You can also search for a required identifier through API by keywords.

  • Parameters

Parameters in URL query to fill the form fields:

Name Type Description Form field
amountInteger Integer Integer part of the payment amount (in rubles). If absent, the “Amount” field on the form will be empty. The number not greater than 99 999 (payment amount limit) Amount
amountFraction Integer Fractional part of the payment amount (kopeks). If absent, the “Amount” field on the form will be empty. Amount
currency Constant string, 643 Payment currency code. Required if you send the payment amount in the link
extra[‘comment’] URL-encoded string Payment comment. Use it only for ID=99 Comment to the transfer
extra[‘account’] URL-encoded string Field format is the same as fields.account of the corresponding payment request: for provider 99 – recipient’s wallet number; for mobile network operators – phone number for top-up (without international prefix); for card transfer – recipient’s card number without spaces, for other providers – user’s identifier. For provider 99999 use nickname or number of the wallet and use appropriate value of extra['accountType'] parameter. Wallet number, phone number, user ID.
blocked Array[String] Name of blocked (inactive) form field. User will not be able to change this field. Each parameter corresponds to respective form field and should be numbered starting from zero (blocked[0], blocked[1], and so on). If absent, user can change all form fields. Possible values:
sum – “Payment amount” field,
account – “Phone number/Account number” field,
comment – “Comment” field.
Example (for payment amount field): blocked[0]=sum
extra[‘accountType’] URL-encoded string Use only for ID=99999. The value determines transfer to QIWI wallet by nickname or wallet number.
phone – for transfer to wallet number
nickname – for transfer to wallet nickname. If you don’t want to show your wallet number on the form, use this value.
 

How to retrieve your wallet nickname

Request → GET

curl -X GET 
  "https://edge.qiwi.com/qw-nicknames/v1/persons/79111234567/nickname" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <API token>"
GET /qw-nicknames/v1/persons/79111234567/nickname HTTP/1.1
Accept: application/json
Authorization: Bearer <API token>
Host: edge.qiwi.com
  • URL /qw-nicknames/v1/persons/wallet/nickname

    • wallet – your wallet number without + sign

Response ←

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

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

Successful response contains nickname of your wallet in JSON field nickname.

QIWI wallet transfer

Request → POST

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 <API token>" 
  -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 <API token>
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 wallet transfer
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()
  • URL /sinap/api/v2/terms/99/payments

  • Parameters

Send JSON object Payment in the request’s body. Payment requisites in fields object:

Name Type Description
fields.account String Required. Wallet number of the recipient

Response ←

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

{
    "id": "150217833198900",
    "terms": "99",
    "fields": {
        "account": "79121238345"
    },
    "sum": {
        "amount": 100,
        "currency": "643"
    },
    "transaction": {
        "id": "11155897070",
        "state": {
            "code": "Accepted"
        }
    },
    "source": "account_643",
    "comment": "test"
}
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'}}}

Successful response contains JSON-object PaymentInfo with accepted payment data.

Conversion

Transfers funds to currency account in QIWI wallet with conversion from your QIWI wallet ruble account. Two transactions are created: conversion between accounts of your QIWI wallet, and transfer to another wallet. You can get currency rates from another API method.

Request → POST

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 <API token>" 
  -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 <API token>
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

# Conversion in QIWI wallet (currency as currency integer code as 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()
  • URL /sinap/api/v2/terms/1099/payments

  • Parameters

Send JSON object Payment in the request’s body. Payment requisites in fields object:

Name Type Description
fields.account String Required. Wallet number for the conversion

Response ←

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

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

Successful response contains JSON-object PaymentInfo with accepted payment data.

Currency rates

Returns current QIWI Bank currency rates and cross-rates.

Request → GET

curl "https://edge.qiwi.com/sinap/crossRates" 
  --header "Accept: application/json" 
  --header "Authorization: Bearer <API token>"
GET /sinap/crossRates HTTP/1.1
Accept: application/json
Authorization: Bearer <API token>
Host: edge.qiwi.com
import requests

# Currencies rate (currency pair codes in 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')

    # all rates
    rates = res.json()['result']

    # requested rate
    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']
  • URL /sinap/crossRates

Response ←

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
        }
    ]
}

Successful response contains JSON array of currency rates in result field. An element of the list corresponds to currency pair:

Response field Type Description
from String Base currency
to String Quote currency
rate Number Rate

Mobile network payment

Request → POST

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 <API token>" 
  -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 <API token>
Host: edge.qiwi.com

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

# Cell phone top-up
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()
  • URL /sinap/api/v2/terms/ID/payments

    • ID – QIWI provider identifier. How to get provider ID
  • Parameters

Send JSON object Payment in the request’s body. Payment requisites in fields object:

Name Type Description
fields.account String Cell phone number to top-up (without 8 prefix)

Response ←

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

{
    "id": "21131343",
    "terms": "1",
    "fields": {
          "account": "9161112233"
    },
    "sum": {
         "amount": 1000,
         "currency": "643"
    },
    "source": "account_643",
    "transaction": {
         "id": "4969142201",
         "state": {
            "code": "Accepted"
          }
    }
}
send_mobile(api_access_token,'2','9670058909','123','1')

Successful response contains JSON-object PaymentInfo with accepted payment data.

Card money transfer

Transfers money to Visa, MasterCard, or MIR credit cards.

Money transfers to Visa and MasterCard cards issued by foreign banks are suspended due to restrictions from the payment system.

Request → POST

Payment request for domestic card

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 <API token>" 
  -d '{
        "id":"21131343",
        "sum":{
          "amount":1000,
          "currency":"643"
        },
        "paymentMethod":{
          "type":"Account",
          "accountId":"643"
        },
        "fields": {
          "account":"4256********1231"
        }
    }'

Payment request for foreign card

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 <API token>" 
  -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/1963/payments HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer <API token>
Host: edge.qiwi.com

{
  "id":"21131343",
  "sum": {
        "amount":1000,
        "currency":"643"
  },
  "paymentMethod": {
      "type":"Account",
      "accountId":"643"
  },
  "fields": {
        "account":"4256XXXXXXXX1231"
  }
}
POST /sinap/api/v2/terms/1960/payments HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer <API token>
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

# Card money transfer
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()
  • URL /sinap/api/v2/terms/ID/payments

ID — QIWI provider identifier. Possible values:

  • 1963 — Visa money transfer to cards issued by Russian banks only.
  • 21013 — MasterCard money transfer to cards issued by Russian banks only.
  • 1960 — Visa money transfer to credit cards issued by banks in Albania, Andorra, Argentina, Armenia, Australia, Austria, Azerbaijan, Belarus, Belgium, Benin, Bosnia and Herzegovina, Brazil, Bulgaria, China, Croatia, Cyprus, Czech Republic, Denmark, Egypt, Estonia, Finland, France, Georgia, Germany , Greece, Hong Kong (China), Hungary, Iceland, India, Indonesia, Israel, Italy, Japan, Kazakhstan, Kenya, Korea Republic, Kuwait, Kyrgyzstan, Latvia, Lithuania, Luxembourg, Macao, China, Macedonia, Madagascar, Malaysia, Maldives , Malta, Republic of Moldova, Monaco, Mongolia, Montenegro, Namibia, Netherlands, New Zealand, Nigeria, Norway, Oman, Paraguay, Poland, Portugal, Qatar, Romania, Saudi Arabia, Republic of Serbia, Singapore, Slovakia, Slovenia, South Africa, Spain, Sri Lanka, Sweden, Tajikistan, Tanzania, Thailand, Turkey, Turkmenistan, United Arab Emirates, United Kingdom, Uzbekistan, Vietnam, Zambia.
  • 21012 — MasterCard money transfer to credit cards issued by banks in Albania, Argentina, Armenia, Australia, Austria, Azerbaijan, Bangladesh, Barbados, Belarus, Belgium, Benin, Bosnia and Herzegovina, Burkina Faso, Brazil, Bulgaria, Cambodia, Cameroon United Republic, Chile, China, Colombia, Congo, Costa Rica, Croatia, Cyprus, Czech Republic, Democratic Republic of the Congo, Denmark, Dominican Republic, Ecuador, El Salvador, Egypt, Estonia, Finland, France, Georgia, Germany, Ghana, Greece, Guatemala, Hong Kong, Hungary, India, Indonesia, Ireland, Israel, Italy, Japan, Jordan, Kazakhstan, Kenya, Korea, Kuwait, Kyrgyzstan, Latvia, Lebanon, Lithuania, Luxembourg, Macao, Macedonia, Madagascar, Malaysia, Maldives, Malta, Mexico, Moldova, Monaco, Mongolia, Montenegro, Morocco, Namibia, Nigeria, Nepal, Netherlands, New Zealand, Nigeria, Norway, Oman, Panama, Paraguay, Peru, Philippines, Poland, Portugal, Romania, Qatar, Russian Federation, Saudi Arabia, Senegal, Serbia Republic, Singapore, Slovakia, Slovenia, South Africa, Spain, W ri-Lanka, Sweden, Switzerland, Tajikistan, Tanzania, Thailand, Tunisia, Turkey, Turkmenistan, United Arab Emirates, United Kingdom, Uzbekistan, Vietnam, Zambia.
  • 31652 — Transfer to MIR national payment system cards.
  • 22351 — Transfer to QIWI Virtual Card.
  • Parameters

Send JSON-object Payment in the request’ body. Payment requisites in fields object depend on the provider ID.

For ID 1963, 21013, 31652, 22351

Name Type Description
fields.account String Recipient’s card number (no spaces)

For ID 1960, 21012

Name Type Description
fields.account String Recipient’s card number (no spaces)
fields.rem_name String Sender’s first name
fields.rem_name_f String Sender’s last name. Required for ID 1960, 21012 only
fields.rec_address String Sender’s address (no zip code, only text)
fields.rec_city String Sender’s city
fields.rec_country String Sender’s country
fields.reg_name String Recipient’s first name
fields.reg_name_f String Recipient’s last name

Response ←

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

{
  "id": "21131343",
  "terms": "1963",
  "fields": {
          "account": "4256********1231"
    },
    "sum": {
         "amount": 1000,
         "currency": "643"
    },
    "source": "account_643",
    "transaction": {
         "id": "4969142201",
         "state": {
            "code": "Accepted"
          }
    }
}
payment_data = {'prv_id': '1963', 'to_card' : '41548XXXXXXXX008', 'sum': 100}

jss = send_card(token, payment_data)

Successful response contains JSON-object PaymentInfo with accepted payment data.

Bank money transfer

Makes money transfer to personal bank cards/accounts opened in Russian banks.

Transfer to card number

Makes money transfer to cards issued by Russian banks.

Request → POST

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 <API token>" 
  -d '{
        "id":"21131343",
        "sum": {
          "amount":1000,
          "currency":"643"
        },
        "paymentMethod": {
          "type":"Account",
          "accountId":"643"
        },
        "fields": {
          "account_type": "1",
          "account":"4256********1231",
          "exp_date": "0623"
        }
    }'
POST /sinap/api/v2/terms/464/payments HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer <API token>
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": "0623"
  }
}
  • URL /sinap/api/v2/terms/ID/payments

    • ID – QIWI provider identifier. Possible values:
      • 464 – Alfa Bank
      • 804 – OTP Bank
      • 810 – Rosselkhozbank
      • 815 – Russkiy Standart
      • 816 – VTB
      • 821 – Promsvyazbank
      • 870 – Sberbank
      • 881 – Renaissance Credit
      • 1134 – Moskovskiy Creditnyi Bank
  • Parameters

Send JSON object Payment in the request’s body. Payment requisites in fields object:

Name Type Description
fields.account String Recipient’s card number (no spaces)
fields.exp_date String Card expiry date, as MMYY (for example, 0218). Parameter is required for ID 464 and 821.
fields.account_type String Bank identifier type. For each bank specific value applies:
ID 464 – 1
ID 084 – 1
ID 815 – 1
ID 810 – 5
ID 816 – 5
ID 821 – 7
ID 870 – 5
ID 1134 – 5
ID 881 – 1.
fields.mfo String Bank MFO (BIK)
fields.lname String Recipient’s last name
fields.fname String Recipient’s first name
fields.mname String Recipient’s middle name

Response ←

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

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

Successful response contains JSON-object PaymentInfo with accepted payment data.

Transfer to bank account

Makes money transfer to personal accounts opened in Russian banks. You can use quick transfer service (within an hour if transaction is made from 9:00 until 19:30).

Request → POST

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 <API token>" 
  -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 <API token>
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***"
  }
}
  • URL /sinap/api/v2/terms/ID/payments

    • ID – QIWI provider identifier. Possible values:
      • 313 – HomeCredit Bank
      • 464 – Alfa Bank
      • 821 – Promsvyazbank
      • 804 – OTP Bank
      • 810 – Rosselkhozbank
      • 816 – VTB
      • 819 – Unicredit Bank
      • 868 – QIWI Bank
      • 870 – Sberbank
      • 815 – Russkiy Standart
      • 881 – Renaissance Credit
      • 1134 – Moskovskiy Creditnyi Bank
      • 27324 – Raiffeisen Bank
  • Parameters

Send JSON object Payment in the request’s body. Payment requisites in fields object:

Name Type Description
fields.account String Recipient’s bank account number
fields.urgent String Quick transfer flag. For 0 – not used; for 1 – make quick transfer by Urgent transfer service of Central Bank of Russia. Extra commission is paid for quick transfer
fields.mfo String Bank MFO (BIK)
fields.account_type String Bank identifier type. For each bank specific value applies:
ID 464 – 2
ID 804 – 2
ID 810 – 2
ID 815 – 2
ID 816 – 2
ID 821 – 9
ID 819 – 2
ID 868 – 2
ID 870 – 2
ID 1134 – 2
ID 27324 –2
ID 810 – 2
ID 816 – 5
ID 821 – 9
ID 881 – 2
ID 313 – 6.
fields.lname String Recipient’s last name
fields.fname String Recipient’s first name
fields.mname String Recipient’s middle name
fileds.agrnum String Bank agreement number – for ID 313

Response ←

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

{
  "id": "21131343",
  "terms": "464",
  "fields": {
          "account": "407121010910909011",
          "account_type": "2"
  },
  "sum": {
         "amount": 1000,
         "currency": "643"
  },
  "source": "account_643",
  "transaction": {
         "id": "4969142201",
         "state": {
            "code": "Accepted"
          }
  }
}

Successful response contains JSON-object PaymentInfo with accepted payment data.

Other services

You can pay for services by user identifier. This request applies for QIWI providers with one user identifier and without requirement of account number online check.

Request → POST

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 <API token>" 
  -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 <API token>
Host: edge.qiwi.com

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

# payment for service provider

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()
  • URL /sinap/api/v2/terms/ID/payments

    • ID – QIWI provider identifier. Possible values:
      • 674 – OnLime
      • Other Internet providers
      • 1239 – Podari zhizn Charitable Foundation
      • Other charitable foundations identifiers
      • Find a service provider identifier
  • Parameters

Send JSON object Payment in the request’s body. Payment requisites in fields object:

Name Type Description
fields.account String User identifier

Response ←

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

{
  "id": "21131343",
  "terms": "674",
  "fields": {
          "account": "111000"
  },
  "sum": {
         "amount": 100,
         "currency": "643"
  },
  "source": "account_643",
  "transaction": {
         "id": "4969142201",
         "state": {
            "code": "Accepted"
          }
  }
}

Successful response contains JSON-object PaymentInfo with accepted payment data.

Payment by any requisites

Makes payments for commercial services by their bank details.

Request → POST

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 <API token>" 
  --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 <API token>
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"
  }
}
  • URL /sinap/api/v2/terms/1717/payments

  • Parameters

Send JSON object Payment in the request’s body. Payment requisites in fields object:

Name Type Description
fields.name String Recipient’s bank name (escape quotes with )
fields.extra_to_bik String Recipient’s bank MFO (BIK)
fields.to_bik String Recipient’s bank MFO (BIK)
fields.city String Recipient’s city of placement
fields.info String Constant, Коммерческие организации (in Russian)
fields.is_commercial String Service info, constant 1
fields.to_name String Recipient’s organization name (escape quotes with )
fields.to_inn String Organization’s TIN
fields.to_kpp String Organization’s KPP (code for the reason in the tax service regisration)
fields.nds String Value-added tax flag. If you pay for invoice and there is no VAT, then put the string НДС не облагается (in Russian). Otherwise, put the string В т.ч. НДС (in Russian).
fields.goal String Payment appointment
fields.urgent String Urgent payment (0 – no, 1 – yes). Urgent payment is made in 10 minutes or more. It is applicable for weekdays from 9:00 to 20:30, Moscow time zone. Extra fee for the service is 25 rubles.
fields.account String Recipient’s account number
fields.from_name String Recipient’s first name
fields.from_name_p String Recipient’s middle name
fields.from_name_f String Recipient’s last name
fields.requestProtocol String Service info, constant qw1
fields.toServiceId String Service info, QIWI provider ID 1717

Response ←

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

{
  "id": "21131343",
  "terms": "1717",
  "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"
  },
  "sum": {
         "amount": 1000,
         "currency": "643"
  },
  "source": "account_643",
  "transaction": {
         "id": "10969142201",
         "state": {
            "code": "Accepted"
          }
  }
}

Successful response contains JSON-object PaymentInfo with accepted payment data.

QIWI provider search

Performs search of QIWI provider’s ID for payment methods by keywords (for example, provider’s name).

Request → GET

curl -X GET 
  "https://edge.qiwi.com/search/v1/search?query=%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" 
  --header "Authorization: Bearer <API token>"
GET /search/v1/search?query=%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
Authorization: Bearer <API token>
Host: edge.qiwi.com
import requests

# provider id by its name
def qiwi_com_search(search_phrase):
    s = requests.Session()
    search = s.get('https://edge.qiwi.com/search/v1/search', params={'query':search_phrase})
    return search.json()['data']['items']
  • URL https://edge.qiwi.com/search/v1/search?query={value}

    • query — keywords for provider’s searching separated by spaces.

Response ←

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

{
    "items": [
        {
            "name": "МТС Домашний интернет, ТВ и Телефония РФ",
            "description": "МТС Домашний интернет, ТВ и Телефония РФ",
            "uri": null,
            "data": {
                "id": 23729,
                "logoUrl": "https://static.qiwi.com/img/providers/logoBig/23729_l.png",
                "siteUrl": "http://www.mts.ru/internet/mts_stream/",
                "category": {
                    "name": "Интернет, ТВ, IP-телефония"
                },
                "type": "PROVIDER"
            }
        },
        ...
    ]
}
# Provider search: response parsing
prv = qiwi_com_search('Билайн домашний интернет')[0]['data']['id']
print(str(prv))

Successful JSON-response contains IDs of the found QIWI providers:

Response field Type Description
items Array of objects List of providers
items[].data.id Number Provider’s ID in the array’s element

API data models

Payment class

{
  "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"
  }
}

Object describes payment data for QIWI Wallet provider.

Name Type Description  
id String Required. Client transaction ID (max 20 digits). Must be unique for each transaction. Increment with each following transaction. To satisfy these requirements, set it to 1000*(Standard Unix time in seconds). +
sum Object Required. Payment amount data  
sum.amount Number Payment amount value (rubles and kopeks, separator .). Positive number rounded down to 2 decimals. If you specify more decimals, our system will round the number down to the same precision.  
sum.currency String Payment currency (only rubles, 643)  
paymentMethod Object Required. QIWI wallet account to fund the payment  
paymentMethod.type String Constant, Account  
paymentMethod.accountId String Constant, 643  
fields Object Required. Payment requisites. Object fields depend on provider ID.  
comment String Payment comment. Used for QIWI wallet transfer or conversion only  

PaymentInfo class

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

Object describes QIWI wallet transaction data and returns in response from Payment API.

Name Type Description
id Number id parameter from the original request
terms String QIWI provider ID used for the payment
fields Object fields object from the original request. Card number returns in masked form
sum Object sum object from the original request
source String Always constant, account_643
comment String comment parameter from the original request (if exists in the request)
transaction Object Object with QIWI transaction data
transaction.id String QIWI transaction ID
transaction.state Object Current state of the transaction
state.code String Current status of the transaction. Only Accepted is returned (it means that the payment is accepted for processing). Actual transaction status can be obtained from Payments history API.

Invoices

Invoice is the universal request for payment or money transfer from user’s QIWI wallet.

API provides operations of invoice creation (only P2P invoices for money transfer to another QIWI wallet), payment, rejection, and also method for requesting list of unpaid invoices issued to your QIWI wallet.

Invoice creation and P2P token

You can issue invoices to any QIWI wallet by using P2P invoices API. Use special P2P token for authorization in P2P invoices API.

How to get P2P token

Authorize on p2p.qiwi.com, or use the given request. You may also specify Invoice payment callbacks URL in this request.

The method returns P2P tokens in JSON format:

  • PublicKey response field — token for using with Payment form;
  • SecretKey response field — token for this P2P API.

Use QIWI Wallet API token for authorization.

Request → POST

curl -X POST 
  https://edge.qiwi.com/widgets-api/api/p2p/protected/keys/create 
  -H 'Authorization: Bearer <API token>' 
  -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"}
  • URL /widgets-api/api/p2p/protected/keys/create

  • Parameters

Send parameters in JSON-body:

Name Type Description
keysPairName String Name for the couple of P2P tokens
serverNotificationsUrl String Invoice payment callbacks URL (optional)

List of invoices

Returns only unpaid invoices issued to your wallet. Invoices are placed in the list in reverse chronological order.

By default, the list is paginated on 50 elements on each page. You can specify the number of elements on each page.
You may use filters: invoice creation period of dates and starting invoice ID.

Request → GET

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: ****
  • URL /checkout-api/api/bill/search?statuses=READY_FOR_PAY&parameter=value

  • Parameters

Send parameters in the request query URL:

Name Type Description
statuses String Unpaid invoice status. Only READY_FOR_PAY. Required parameter.
rows Integer Maximum number of invoices to be returned, for list pagination. Integer number from 1 to 50. Default value is 50.
min_creation_datetime Long Lower time limit for invoice search, Unix-time
max_creation_datetime Long Greater time limit for invoice search, Unix-time
next_id Number Starting invoice identifier for invoice search. Only invoices with IDs equal or smaller than this ID are returned. Use it for obtaining next invoices in the paginated list.
next_creation_datetime Long Starting date for invoice search, Unix-time. Only invoices created before this date are returned. Use it for obtaining next invoices in the paginated list.

Response ←

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": "Пополнение счета 13515573",
      "pay_url":"https://oplata.qiwi.com/form?shop=480706&transaction=102263702405"
    }
  ]
}

Successful JSON response includes a list of unpaid invoices according to the conditions of the request:

Response field Type Description
bills Array[Object] List of invoices.
List length is rows parameter from the original request, or 50, if it is absent
bills[].id Integer QIWI Wallet invoice ID
bills[].external_id String Merchant’s invoice ID
bills[].creation_datetime Long Date/time of the invoice creation, Unix-time
bills[].expiration_datetime Long Date/time of the invoice expiration, Unix-time
bills[].sum Object Invoice amount data
sum.currency Integer Invoice currency
sum.amount Number Invoice amount
bills[].status String Constant, READY_FOR_PAY
bills[].type String Constant, MERCHANT
bills[].repetitive Boolean Service data
bills[].provider Object Merchant information
provider.id Integer QIWI identifier
provider.short_name String Short name
provider.long_name String Full name
provider.logo_url String Logo URL
bills[].comment String Invoice comment
bills[].pay_url String URL to pay for the invoice on QIWI Payment Form

Invoice payment

Makes invoice payment immediately without SMS confirmation.

Request → POST

curl -X POST 
  'https://edge.qiwi.com/checkout-api/invoice/pay/wallet' 
  --header 'Content-Type: application/json;charset=UTF-8' 
  --header 'Accept: application/json' 
  --header 'Authorization: Bearer ***' 
  -d '{
        "invoice_uid": "1063702405",
        "currency": "643"
      }'
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"
}
  • URL /checkout-api/invoice/pay/wallet

  • Parameters

Required parameters in JSON body:

Name Type Description
invoice_uid String QIWI invoice ID, taken from bills[].id field of invoice data
currency String Invoice currency, taken from bills[].sum.currency field of invoice data)

Response ←

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

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

Successful response contains JSON with paid invoice status:

Field Type Description
invoice_status String Invoice payment status, PAID_STATUS. Any other status means unsuccessful transaction.
is_sms_confirm String SMS confirmation flag

Cancelling unpaid invoice

Rejects an unpaid invoice, which makes the invoice unavailable for payment.

Request → POST

curl -X POST 
  'https://edge.qiwi.com/checkout-api/api/bill/reject' 
  --header 'Accept: application/json' 
  --header 'Authorization: Bearer ***' 
  -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
}
  • URL /checkout-api/api/bill/reject

  • Parameter

Required parameter in JSON body:

Name Type Description
id Integer Invoice ID to reject, taken from bills[].id field of invoice data

Response ←

HTTP/1.1 200 OK

Successful response has HTTP code 200.

Callbacks

Last update: 2020-07-28 | Edit on GitHub

Webhook allows you to receive real-time HTTP notifications of events (outgoing / incoming payments). You need to implement a web service to receive and processing of POST-requests according to the requests format.

You need to respond the notification with HTTP 200 OK within 1-2 sec. If QIWI service has no response, it sends next notification in 10 min, then in 1 hour.

Pools of IP-addresses from which QIWI service sends notifications:

  • 79.142.16.0/20
  • 195.189.100.0/22
  • 91.232.230.0/23
  • 91.213.51.0/24

If your web service works behinds the firewall, you need to add these IP-addresses to the list of allowed addresses for incoming TCP packets.

Quick start

  1. Implement web service for webhook requests. Make sure to implement correctly the digital signature verification.
  2. Register your service. Please note that its URL original length (before URL-encoding) cannot be longer than 100 symbols.
  3. Request for signature key.
  4. Test your service with test request. Empty notification will be sent to your service registered at stage 2.

To change webhook service URL:

  1. Remove current webhook service.
  2. Register new webhook service. Please note that its URL original length (before URL-encoding) cannot be longer than 100 symbols.
  3. Request for new signature key.
  4. Test your service with test request. Empty notification will be sent to your service registered at stage 2.

Processing notification

Outgoing payments – notification of payment in process

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

{"hash": "50779a03d90c4fa60ac44dfd158dbceec0e9c57fa4cf4f5298450fdde1868945",
 "hookId": "f57f95e2-149f-4278-b2cb-4114bc319727",
 "messageId": "f9a197a8-26b6-4d42-aac4-d86b789c373c",
 "payment": {"account": "myAccount",
             "comment": "My 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"}

Outgoing payment – notification of successful payment

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

{"hash": "50779a03d90c4fa60ac44dfd158dbceec0e9c57fa4cf4f5298450fdde1868945",
 "hookId": "f57f95e2-149f-4278-b2cb-4114bc319727",
 "messageId": "6e2a0e32-4c8d-4fe2-9eed-fe3b6a726ff4",
 "payment": {"account": "thedandod",
             "comment": "My 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"}

Outgoing payments – notification of unsuccessful payment

POST /some-hook.php HTTP/1.1
Accept: application/json
Content-type: application/json
Host: example.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"}

Incoming payment – notification of successful payment

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

{"hash": "a56ed0090fa3fd2fd0b002ed80f85a120037a6a85f840938888275e1631da96f",
 "hookId": "8c79f60d-0272-476b-b120-6e7629467328",
 "messageId": "bba24947-ab5f-4b33-881b-738fc3a4c9e1",
 "payment": {"account": "79042426915",
             "comment": "Replenishing wallet",
             "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"}

Each notification is an incoming POST-request with single payment data in JSON body. JSON scheme is as followed:

Field Type Description
hookId String (UUID) Unique webhook id
messageId String (UUID) Unique notification id
payment Object Payment data
payment.txnId String QIWI Wallet transaction ID
payment.account String For outgoing payments – recipients account number. For incoming payments – sender number, self-service kiosk number, or top-up agent name
payment.signFields String A list of fields in payment object (separated by comma) to use for HmacSHA256 hash calculation of notification signature (see hash field)
payment.personId Integer Your wallet number
payment.date String DateTime Payment date/time, in Moscow time zone, as YYYY-MM-DD'T'hh:mm:ss+03:00
payment.errorCode String Payment error code
payment.type String Payment type:
IN – wallet top-up,
OUT – payment
payment.status String Payment status:
WAITING – payment in process,
SUCCESS – successful payment,
ERROR – payment error.
payment.provider Integer Provider ID in QIWI Wallet
payment.comment String Transaction comment
payment.sum Object Payment amount data
sum.amount Number(Decimal) Amount
sum.currency Number(3) Currency code
payment.commission Object Payment commission
commission.amount Number(Decimal) Commission amount
commission.currency Number(3) Currency code
payment.total Object Total payment amount
total.amount Number(Decimal) Amount
total.currency Number(3) Currency code
test Boolean Flag indicating test notification
version String Webhook API version
hash String Hash of the notification’s digital signature

Notification signature verification

<?php
//Procedure returns string of sorted values from notification parameters and signature hash for verification
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!');
    }
    // String of parameters
    $reqparams = $decoded['payment']['sum']['currency'] . '|' . $decoded['payment']['sum']['amount'] . '|'. $decoded['payment']['type'] . '|' . $decoded['payment']['account'] . '|' . $decoded['payment']['txnId'];
    // Signature
    foreach ($decoded as $name=>$value) {
       if ($name == 'hash') {
            $SIGN_REQ = $value;
       }
    }
    return [$reqparams, $SIGN_REQ];
}
// Resulted data
$Request = getReqParams();
// Base64 encoded key for decryption (method /hook/{hookId}/key)
$NOTIFY_PWD = "JcyVhjHCvHQwufz+IHXolyqHgEc5MoayBfParl6Guoc=";
// Get SHA-256 hash of the string and encrypt with your webhook key
$reqres = hash_hmac("sha256", $Request[0], base64_decode($NOTIFY_PWD));
// Verify signature
if (hash_equals($reqres, $Request[1])) {
    $error = array('response' => 'OK');
}
else $error = array('response' => 'error');
//Response
header('Content-Type: application/json');
$jsonres = json_encode($error);
echo $jsonres;
error_log('error code' . $jsonres);
?>
import base64
import hmac
import hashlib

# Base64 encoded key (get it with /hook/{hookId}/key request)
webhook_key_base64 = 'JcyVhjHCvHQwufz+IHXolyqHgEc5MoayBfParl6Guoc='
# notification parameters
data = '643|1|IN|+79161112233|13353941550'
webhook_key = base64.b64decode(bytes(webhook_key_base64,'utf-8'))
print(hmac.new(webhook_key, data.encode('utf-8'), hashlib.sha256).hexdigest())

To verify signature of a notification, proceed with the following:

  1. Take values of fields specified in payment.signFields field of the notification JSON (in the same order) as Strings.
  2. Join them with | separator.
  3. Encode the resulted string with SHA-256 and signature key.
  4. Compare obtained value with hash field of the notification.

Example of signature verification (see also PHP procedure on the right tab):

  1. You get signature key, encoded in Base64:
    JcyVhjHCvHQwufz+IHXolyqHgEc5MoayBfParl6Guoc=
  2. You get notification:
    {"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":"+79161112233","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. Join values of the fields specified in signFields field (sum.currency,sum.amount,type,account,txnId):
    643|1|IN|+79161112233|13353941550
  4. The obtained string is encoded with SHA-256 and the Base64-decoded key from step 1:
    f05c4e7bdf00620205d47696d77f924bfd3ba4d02b0398ac8a626e737dc27243
    Result coincides with hash field from the notification. The verification is successful.

Webhook service registration

Request → PUT

curl -X PUT 
  "https://edge.qiwi.com/payment-notifier/v1/hooks?hookType=1&param=http%3A%2F%2Fexample.com%2Fcallbacks%2F&txnType=2" 
  -H "accept: */*" 
  -H "authorization: Bearer <API token>"
PUT /payment-notifier/v1/hooks?hookType=1&param=http%3A%2F%2Fexample.com%2Fcallbacks%2F&txnType=2 HTTP/1.1
Host: edge.qiwi.com
Authorization: Bearer <API token>
User-Agent: ****
  • URL /payment-notifier/v1/hooks?parameter=value

  • Parameters

    Send parameters in the request query. All parameters are required.

Name Type Description
hookType Integer Webhook type. Only 1.
param URL-encoded Service URL. URL original length (before URL-encoding) must be within 100 symbols. URL must be accessible from the Internet.
txnType String Choose type of transactions for notifications:
0 – only incoming transactions (wallet top-up);
1 – only outgoing transactions (payments);
2 – all transactions

Response ←

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

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

Response in JSON.

Field Type Description
hookId String Webhook service UUID
hookParameters Object Webhook service parameters
hookParameters.url String Webhook service URL
hookType String Webhook type (only WEB)
txnType String Transactions type for notifications (IN – incoming, OUT – outgoing, BOTH – all)

Remove webhook service registration

Request → DELETE

curl -X DELETE 
  "https://edge.qiwi.com/payment-notifier/v1/hooks/<hook-id>" 
  -H "accept: */*" 
  -H "authorization: Bearer <API token>"
DELETE /payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc HTTP/1.1
Host: edge.qiwi.com
Authorization: Bearer <API token>
User-Agent: ****
  • URL /payment-notifier/v1/hooks/hookId

    • hookId – webhook UUID

Response ←

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

{
  "response":"Hook deleted"
}

Response in JSON.

Field Type Description
response String Operation result

Secret key provision

Each notification contains digital signature encoded by secret key. Use this request to get the key.

Request → GET

curl -X GET 
  "https://edge.qiwi.com/payment-notifier/v1/hooks/<hook-id>/key" 
  -H "accept: */*" 
  -H "accept: */*" 
  -H "authorization: Bearer <API token>"
GET /payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc/key HTTP/1.1
Host: edge.qiwi.com
Authorization: Bearer <API token>
User-Agent: ****
  • URL /payment-notifier/v1/hooks/hookId/key

    • hookId — webhook UUID

Response ←

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

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

Response in JSON.

Field Type Description
key String Base64-encoded key

Secret key change

Changes the secret key for notifications signature.

Request → POST

curl -X POST 
  "https://edge.qiwi.com/payment-notifier/v1/hooks/<hook-id>/newkey" 
  -H "accept: */*" 
  -H "authorization: Bearer <API token>"
POST /payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc/newkey HTTP/1.1
Host: edge.qiwi.com
Authorization: Bearer <API token>
User-Agent: ****
  • URL /payment-notifier/v1/hooks/hookId/newkey

    • hookId – webhook UUID

Response ←

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

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

Response in JSON.

Field Type Description
key String Base64-encoded new key

Webhook service data

Gets the active webhook service linked to your wallet.

Request → GET

curl -X GET 
  "https://edge.qiwi.com/payment-notifier/v1/hooks/active" 
  -H "accept: */*" 
  -H "accept: */*" 
  -H "authorization: Bearer <API token>"
GET /payment-notifier/v1/hooks/active HTTP/1.1
Host: edge.qiwi.com
Authorization: Bearer <API token>
User-Agent: ****
  • URL /payment-notifier/v1/hooks/active

Response ←

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

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

Response in JSON.

Field Type Description
hookId String Active webhook UUID
hookParameters Object Webhook service parameters
hookParameters.url String Webhook URL
hookType String Webhook type (only WEB)
txnType String Transactions type for notifications (IN – incoming (wallet topup), OUT – outgoing (payments), BOTH – all)

Test webhook service

Use this request to test your webhook service. As a result of the request, empty test notification is sent to the URL of the active webhook service.

Request → GET

curl -X GET 
  "https://edge.qiwi.com/payment-notifier/v1/hooks/test" 
  -H "accept: */*" 
  -H "authorization: Bearer <API token>"
GET /payment-notifier/v1/hooks/test HTTP/1.1
Host: edge.qiwi.com
Authorization: Bearer <API token>
User-Agent: ****
  • URL /payment-notifier/v1/hooks/test

Response ←

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

{
  "response":"Webhook sent"
}

Response in JSON.

Field Type Description
response String Notification on the request

Error Codes

API returns the following HTTP codes in case of errors.

HTTP code API Description
400 All Wrong data format of request
401 All Wrong API token or token expired
403 All Not enough rights of API token for the request
404 Payments history, Transaction info, Receipt Transaction not found or no payments with such data
404 Balances, User’s profile, Identification Wallet not found
404 Callbacks Active webhook not found
404 Pay/Cancel invoice Invoice not found
422 Webhook registration Wrong domain/subnet/host in new webhook URL, wrong webhook type or transactions type, or webhook already exists and is active
423 All Too many requests, service temporary unavailable
500 All Internal service error (webhook URL too long, infrastructure maintenance, resource is unavailable and so on)

The following errors return in errorCode field in responses to payments history and transaction info requests:

errorCode Description
0 OK
3 Technical error. Repeat the request later
4 Incorrect format of phone or account number. Check the data
5 No such number. Check the data and try again
8 Technical problem on the recipient’s bank side. Try again later
57 Recipient’s wallet status not allowing the money transfer. Ask them to enter passport data in QIWI Wallet to increase status level.
131 Payment type unavailable for your country
166 Your wallet status not allowing the money transfer. Enter passport data in QIWI Wallet to increase status level.
167 Recipient’s wallet status not allowing the money transfer. Ask them to enter passport data in QIWI Wallet to increase status level.
202 Technical error. Repeat the payment later
204 Your wallet status not allowing the cash topup. Enter passport data in QIWI Wallet to increase status level.
220 Not enough funds. Replenish your wallet
241 Payment amount must be larger than 1 ruble
242 Payment amount larger than maximum allowed
254 Payment amount must be larger than 1 ruble
271 Technical issue on the recipient’s bank side. Try again later
300 Technical error. Repeat the payment later
303 Wrong phone number – enter 10 digits
319 Your wallet status not allowing the money transfer. Enter passport data in QIWI Wallet to increase status level.
407 Not enough funds on your card
408 You already have the same payment – pay or cancel it
455 Payment is not possible due to limit on minimum balance
461 Time to confirm operation is expired. Try again later
472 Not enough funds on your wallet – replenish it
500 Technical error on the recipient’s bank side. Contact the bank’s Support service
522 Recipient’s card wrong number or expiration date. Check data and try again
547 Recipient’s card wrong expiration date. Check data and try again
548 Recipient’s card expired
558 Payment amount larger than maximum allowed
561 Bank where the money is transferring does not accept the payment. Contact the bank’s Support service
700 Limit for your wallet current status is exceeded. Increase your status level or check your current limit in Profile section
702 Payment is not possible due to recipient’s limit. Its balance’s limit is exceeded. Recipient has to contact with our Support
704 The monthly limit on your wallet has been exceeded. To remove the restrictions, increase your wallet status in Profile section
705 The monthly limit on your wallet has been exceeded. To remove the restrictions, increase your wallet status in Profile section
710 Transfer is not possible – the weekly limit of payments for the same recipient have been exceeded
711 Transfer is not possible. You have exceeded the monthly payment limit for such transactions
716 You have exceeded the monthly limit on withdrawals from the card. To remove the restrictions, increase your wallet status in Profile section
717 You have exceeded the daily limit on withdrawals from the card. To remove the restrictions, increase your wallet status in Profile section
746 Transfer is impossible – the limit for the same recipient has been exceeded
747 Transfer is not possible. The number of operations for the same recipient has been exceeded
749 Technical error. Contact our Support
750 Technical error. Repeat the payment later
757 The limit on the number of payments has been exceeded. To remove the restrictions, increase your wallet status in Profile section
797 Payment has been cancelled, the money is returned to your wallet
852 Transfer is impossible – the limit for the same recipient has been exceeded
866 Payment not processed. Limit on outgoing transfers has been exceeded – 5 000 RUB from RUB, USD, EUR accounts to KZT monthly. Increase your wallet status in Profile section and pay without limits
867 Payment not processed. Limit on incoming transfers has been exceeded – 5 000 RUB from RUB, USD, EUR accounts to KZT monthly. Increase your wallet status in Profile section and pay without limits
893 Transfer rejected. Date is expired
901 The code to confirm the payment has expired. Repeat the payment
943 The limit on transfers per month is exceeded. Increase your wallet status in Profile section and transfer without restrictions
1050 The limit on such operations is exceeded. Increase your wallet status in Profile section and expand your options
7000 Payment rejected. Check card’s details and repeat the payment
7600 Payment rejected. Contact the bank that issued the card
   
   
   
title search metatitle metadescription category language_tabs toc_footers includes

API QIWI Кошелька

true

API QIWI Кошелька

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

apiqiwiwallet

http

Запрос/ответ

shell

cURL

php

PHP

python

Python

<a href=’/ru/qiwi-wallet-api-release-notes/index.html’>Список изменений</a>

<a href=’/’>На главную</a>

<a href=’mailto:api_help@qiwi.com’>Обратная связь</a>

<a href=’https://t.me/qiwi_api_help_bot’>Помощь по P2P-операциям</a>

<a href=’/sandbox/index.html’>Попробовать API</a>

qiwi-wallet-personal/profile_ru

qiwi-wallet-personal/payment_history_ru

qiwi-wallet-personal/balance_ru

qiwi-wallet-personal/master_ru

qiwi-wallet-personal/payment_ru

qiwi-wallet-personal/webhook_ru

qiwi-wallet-personal/error_ru

*[Токен]: Символьная строка для аутентификации пользователя в API по стандарту OAuth 2.0 RFC 6749, RFC 6750.
*[токен]: Символьная строка для аутентификации пользователя в API по стандарту OAuth 2.0 RFC 6749, RFC 6750.
*[API]: Application Programming Interface – набор готовых методов, предоставляемых приложением (системой) для использования во внешних программных продуктах.
*[JSON]: JavaScript Object Notation – текстовый формат обмена данными, основанный на JavaScript.

Введение {#intro}

Последнее обновление: 02-03-2023 | Эта страница на GitHub

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

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

Авторизация запросов {#auth_param}

  • Авторизация

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

Доступ к API {#auth_api}

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

https://edge.qiwi.com

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

  • Корректные значения HTTP-заголовков Accept и Content-Type в запросе. API QIWI Кошелька поддерживает только один MIME-тип: application/json. Любое другое значение приведет к ошибке формата данных.
  • URL, составленный согласно требованиям к нужному запросу.
  • OAuth-токен, выданный вам для доступа к вашему QIWI кошельку. Для некоторых запросов его не потребуется.

Получение OAuth-токена {#auth_data}

Мы остановили выпуск OAuth-токенов. Приносим извинения за доставленные неудобства.

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

Если у вас уже есть действующий токен, то он автоматически заблокируется при выпуске нового токена

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

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

    Token Issue

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

    • Запрос информации о профиле кошелька — выполнение запросов профиля пользователя, идентификации, лимитов.
    • Запрос баланса кошелька — выполнение запросов баланса.
    • Просмотр истории платежей — выполнение запросов истории платежей.
    • Проведение платежей без SMS — выполнение платежных запросов без подтверждения по SMS, оплата счетов, использование уведомлений.
    • Управление виртуальными картами — API управления и выпуска карт QIWI-Мастер. Внимание! Для доступа к API также добавьте разрешения на операции Запрос информации о профиле кошелька, Просмотр истории платежей, Проведение платежей без SMS.

    Token Scopes

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

    Token Scopes

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

    Token Accept

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

    Token

Токен действует в течение 180 дней с момента выпуска. Вы можете заблокировать токен, не дожидаясь окончания срока его действия. Для этого удалите доступ к вашему кошельку приложению QIWI API на этой странице.

block token

Пример вызова API {#auth_ex}

curl "адрес сервера" 
  --header "Accept: application/json" 
  --header "Content-Type: application/json" 
  --header "Authorization: Bearer <токен API QIWI Кошелька>"

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

  • В результате авторизации на сайте QIWI Кошелек и выпуска токена получен токен, представляющий собой строку:

U1QtOTkwMTAyLWNud3FpdWhmbzg3M

  • Токен добавляется в заголовок Authorization: Bearer

  • Итоговый заголовок, добавляемый в каждый запрос к API QIWI Кошелька:

Authorization: Bearer U1QtOTkwMTAyLWNud3FpdWhmbzg3M

Чтобы автоматически управлять картами в составе пакета QIWI Мастер вы можете воспользоваться специальным API. С помощью API вы сможете:

  • Подключать пакет QIWI Мастер
  • Мгновенно выпускать и блокировать виртуальные карты
  • Получать выписки по картам и реквизиты
  • Переименовывать карты

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

Для настройки API и работы с ним вам потребуются базовые знания знание программирования на языках PHP или Python. Далее мы пошагово расскажем как отправлять запросы и обрабатывать ответы от сервиса QIWI.

Попробуйте интерфейс для управления вирутальными картами QIWI Мастер по API.

Установка и настройка сервера

Пропустите этот шаг если вы знаете, как запустить сервер на локальном компьютере или на хостинге. Перейти к работе с API.

Для отправки запросов через API и обработки ответов вам нужно настроить сервер. Разберем, как установить сервер Apache на домашнем компьютере или арендовать сервер в интернете. В примерах мы будем использовать язык программирования PHP. 

Сервер на домашнем компьютере

  1. Установите специальную программу XAMPP для Windows или Mac.
  2. После установки откройте контрольную панель XAMPP (появится ярлык на рабочем столе) и запустите сервер Apache.
  3. Запуск сервера Apache
  4. Далее в  папке C:xampphtdocs создайте папку своего проекта, например master-api.  
  5. Создание папки
  6. В корне папки cоздайте файл index.php со следующим содержимым: <?php  echo ‘заработало’; ?> и сохраните его.
  7. Проверка работы сервера
  8. В любом браузере откройте адрес  http://localhost/master-api .  Если вы все сделали правильно в браузере появится текст: заработало
  9. Сервер заработал

В этой папке будут лежать исполняемые файлы вашей программы.

Аренда сервера у хостинг-компании

Этот способ быстрее, но нужен свободный домен, с которого будут отправляться запросы. Некоторые хостинг-провайдеры предоставляют домен в подарок при покупке хостинга. Желательно использовать ssl сертификат и отправлять запросы по https-протоколу. SSL сертификат нужен, чтобы ваш трафик не смогли расшифровать и подменить данные при отправке.

Для работы с API достаточно оплатить любой виртуальный хостинг с поддержкой скриптов на PHP и интерфейсом на cPanel (например тариф Host-A от Reg.ru). Виртуальные сервера VDSVPS тоже подойдут, но больше времени уйдет на настройку.  

После покупки хостинга заходите в административную панель cPanel (доступы ваш пришлют на почту после покупки).
Если вы купили хостинг с доменом – ничего настраивать не нужно. Переходите в  менеджер файлов.

Аренда сервера с Cpanel

  • В корневой папке домена создайте файл index.php со следующим содержимым:
  • <?php  echo ‘заработало’; ?>
  • В браузере откройте адрес  https://вашдомен.ru/.  Если все прошло успешно, вы увидите текст: заработало

Подготовка к работе с API

Сервер настроен, но перед отправкой запросов в API нужно получить специальный токен – это ваш ключ доступа к кошельку удаленно. Получить этот ключ можно в разделе https://qiwi.com/api .

Выпуск токена для работы с API QIWI

При создании токена отметьте следующие разрешения:

  • Управление виртуальными картами
  • Запрос информации о профиле кошелька
  • Просмотр истории платежей
  • Проведение платежей без SMS.

Выдача прав для токена

Отправка запросов и обработка ответа

Любой запрос содержит заголовки и тело запроса.  В заголовках передаётся тип запроса и авторизационный токен,  а в теле – данные для отправки на сервер. Подробнее о структуре запросов вы можете почитать в официальной справке по API: https://developer.qiwi.com/ru/qiwi-wallet-personal/#qiwi-master

Обработка запросов

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

В теле запроса нужно передать объект Payment и дополнительные обязательные поля:
fields.account – номер вашего кошелька
fields.vas_alias – “qvc-master”

Пример запроса на PHP, который выведет статус покупки пакета. Скопируйте этот код в файл masterbuy.php и перейдите в браузере на cтраницу http://localhost/master-api/masterbuy.php , если вы работаете на локальном сервере или http://вашсайт.ru/masterbuy.php, если у вас виртуальный хостинг.

Код запроса для покупки пакета QIWI Мастер. Напишите свой номер кошелька в переменную $qiwiNumber и скопируйте токен в переменную $qiwiToken:

 $qiwiToken = "токен вашего кошелька";
$qiwiNumber = "79999999999"; //номер вашего кошелька
$urlPayment = 'https://edge.qiwi.com/sinap/api/v2/terms/28004/payments';
$header = array();
$header[] = "Content-Type: application/json";
$header[] = "Accept: application/json";
$header[] = "Authorization: Bearer " . $qiwiToken;
$data = [ 
	'id' => ''.time().'', // клиентский id платежа - им может быть любой уникальный нарастающий идентификатор, например время транзакции
	'sum' => [
		'amount' => 2999, //сумма платежа
		'currency' => '643' // валюта платежа - рубли
	],
	'paymentMethod' => [
		'type' => 'Account',
		'accountId' => '643'
	],
	'fields' => [
		'account' => $qiwiNumber, //номер вашего кошелька
		'vas_alias' => 'qvc-master'
	]
];
$data = json_encode($data);

if ($curl = curl_init()) {
	curl_setopt($curl, CURLOPT_URL, $urlPayment);
	curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl, CURLOPT_POST, true);
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
	curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
	$paymentInfo = curl_exec($curl);
	curl_close($curl);
	$paymentInfo = json_decode($paymentInfo);
}
echo $paymentInfo->transaction->state->code; //покажет статус транзакции

После исполнения скрипта в браузере появится статус транзакции.

Скачать пример кода

Покупка карты

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

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

  • Для оплаты рекламы в Яндекс.Директ и myTarget:    “qvc-cpa”
  • Для оплаты рекламы в Facebook, Google и Tiktok:    “qvc-cpa-debit”

Скопируйте этот код в файл cardsbuy.php и перейдите в браузере на cтраницу http://localhost/master-api/cardsbuy.php.

$qiwiToken = "токен"; //токен вашего кошелька
$qiwiNumber = "79999999999"; //номер вашего кошелька
$cardAlias = "qvc-cpa";  // какую карту заказываем, debit  (qvc-cpa-debit) за 199 руб. или prepaid (qvc-cpa) за 99 руб.

	//заказ карты				
$urlOrderCard = 'https://edge.qiwi.com/cards/v2/persons/'.$qiwiNumber.'/orders';

$header = array();
$header[] = "Content-Type: application/json";
$header[] = "Accept: application/json";
$header[] = "Authorization: Bearer " . $qiwiToken;

$data = [
	'cardAlias' => ''.$cardAlias.'', // клиентский id платежа - им может быть любой уникальный нарастающий идентификатор, например время транзакции
   
	];

$data = json_encode($data);

if ($curl = curl_init()) {
	curl_setopt($curl, CURLOPT_URL, $urlOrderCard);
	curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl, CURLOPT_POST, true);
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
	curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
	$cardOrder = curl_exec($curl);
	curl_close($curl);
	$cardOrder = json_decode($cardOrder);
}
//print_r($cardOrder); //ответ сервера

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

Далее запрос на подтверждение заказа карты.

Добавьте следующий код в файл cardbuy.php для подтверждения заказа карты:

//подтверждение заказа

$urlConfirm = 'https://edge.qiwi.com/cards/v2/persons/'.$qiwiNumber.'/orders/'.$cardOrder->id.'/submit';

$header = array();
$header[] = "Content-Type: application/json";
$header[] = "Accept: application/json";
$header[] = "Authorization: Bearer " . $qiwiToken;

if ($curl = curl_init()) {
	curl_setopt($curl, CURLOPT_URL, $urlConfirm);
	curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
	$cardConfirm = curl_exec($curl);
	curl_close($curl);
	$cardConfirm = json_decode($cardConfirm);
}

//print_r($cardConfirm); //ответ сервера

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

Отправим запрос для покупки карты.

Добавьте следующий код в файл cardbuy.php для подтверждения заказа карты:

$urlBuy = 'https://edge.qiwi.com/sinap/api/v2/terms/32064/payments';

$header = array();
$header[] = "Content-Type: application/json";
$header[] = "Accept: application/json";
$header[] = "Authorization: Bearer " . $qiwiToken;

$data = [
	'id' => ''.time().'', // клиентский id платежа - им может быть любой уникальный нарастающий идентифкатор
	'sum' => [
		'amount' => $cardConfirm->price->amount, //сумма платежа, если карта бесплатная то 0
		'currency' => '643' // валюта платежа - рубли
	],
	'paymentMethod' => [
		'type' => 'Account',
		'accountId' => '643'
	],
	'fields' => [
		'account' => $qiwiNumber, //номер вашего кошелька
		'order_id' => $cardConfirm->id // номер подтвержденного заказа
	]
];
$data = json_encode($data);


if ($curl = curl_init()) {
	curl_setopt($curl, CURLOPT_URL, $urlBuy);
	curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl, CURLOPT_POST, true);
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
	curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
	$cardBuy = curl_exec($curl);
	curl_close($curl);
	$cardBuy = json_decode($cardBuy);
}

//print_r($cardBuy); // покажет ответ, который прислал сервер QIWI

echo $cardBuy->transaction->state->code; //покажет статус транзакции

Сообщение “Accepted!” означает, что карта выпущена успешно. Любое другое сообщение значит ошибку.

Скачать пример файла cardsbuy.php

Список карт с реквизитами

Чтобы получить список карт нужно отправить GET запрос без параметров.
Для получения реквизитов карт нужен отдельный PUT запрос  с параметрами id карты из списка и operationId – любой уникальный идентификатор транзакции, например время.

Скопируйте этот код в файл cardsreq.php и перейдите в браузере на cтраницу http://localhost/master-api/cardsreq.php:

 
$qiwiToken = "токен"; //токен вашего кошелька
$qiwiNumber = "79999999999"; //номер вашего кошелька

$urlCardList= 'https://edge.qiwi.com/cards/v1/cards/?vas-alias=qvc-master';

$header = array();
//$header[] = "Content-Type: application/x-www-form-urlencoded";
$header[] = "Accept: application/json";
$header[] = "Authorization: Bearer " . $qiwiToken;

if ($curl = curl_init()) {
	curl_setopt($curl, CURLOPT_URL, $urlCardList);
	curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
	$cardOrder = curl_exec($curl);
	curl_close($curl);
	$cardOrder = json_decode($cardOrder);
}
		
for ($i=count($cardOrder)-1;$i>=0; $i--) 
{
	$urlCardNumber = 'https://edge.qiwi.com/cards/v1/cards/'.$cardOrder[$i]->qvx->id.'/details';

	$header = array();
	$header[] = "Content-Type: application/json";
	$header[] = "Accept: application/json";
	$header[] = "Authorization: Bearer " . $qiwiToken;
	
	
	$data = [
		'operationId' => ''.time().'', // клиентский id платежа - им может быть любой уникальный нарастающий идентификатор, например время транзакции
	   
		];
	
	$data = json_encode($data);


	if ($curl = curl_init()) {
		curl_setopt($curl, CURLOPT_URL, $urlCardNumber);
		curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
		curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
		curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
		$cardNumber = curl_exec($curl);
		curl_close($curl);
		$cardNumber = json_decode($cardNumber);
	}
	$l=$i+1;
	echo "

“.$l.”. Номер: “.$cardNumber->pan.”      CVV: “.$cardNumber->cvv.”       Месяц/год: “.$cardOrder[$i]->qvx->cardExpireMonth.”/”.$cardOrder[$i]->qvx->cardExpireYear.” 

";
		
}

В результате выполнения кода вы получите список выпущенных вирутальных карт в составе пакета QIWI Мастер.

Скачать пример файла cardsreq.php

Прием платежей на сайте можно организовать разными способами. Самый удобный – это посредники, агрегаторы платёжных сервисов. Однако, у большинства них жесткие условия и комиссии. Альтернатива – подключиться к платежным системам напрямую. В случае банков это непросто, но для электронные кошельков не составляет проблемы. Кроме того, помимо самих кошельков, через ПС можно платить и картами российских банков. Давайте рассмотрим пример подключения приема платежей на сайте для QIWI через api.

Условия

Вообще, данное апи предназначено для получения платежей физическими лицами. Оно так и называется – API P2P-счетов. То есть если у вас небольшой ресурс, то вы смело можете настраивать прием денежки на свой кошелек. Условие одно – он должен иметь статус «Основной», то есть вы должны ввести свои реальные данные в систему киви.

Начало

Переходим сюда https://qiwi.com/p2p-admin/api и создаем пару ключей для каждого сайта. Галочку для уведомлений на первое время можно не ставить

Получаем два ключа. Один публичный и второй приватный. Скопируйте и сохраните их.

Код фронтенд

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

Итак, первое – это некая форма, в которой пользователь будет вводить сумму, на которую хочет пополнить свой (ваш) баланс

<input type="hidden" name="account" id="account" value="<?php echo uid; ?>" />
<input type="number" value="1" id="sum" name="sum" >
<button id="add_pay" >Пополнить</button>

Здесь кнопка и два параметра – ид аккаунта (чтобы мы знали, кому пополнять баланс на сайте) и собственно сумма пополнения, по умолчанию стоит 1 рубль.

По нажатию кнопки будет выполняться вот такой JS код (я использую jQuery но вам никто не мешает использовать что-то свое)

jQuery("#add_pay").click(function() {
    jQuery.post("ajax.php", {
        user_id: jQuery("#account ").val(),
        reque: "add_pay_user",
        sum: jQuery("#sum").val()
    }).done(function(data) {
        var obj = JSON.parse(data);
        if (obj["success"] == true){
            let url = "https://oplata.qiwi.com/create?publicKey=<?php echo QIWI_PUBLIC_KEY; ?>";
            let amount = obj["sum"];
            let billId = obj["billId"];              
            let qiwi_pay_url = url + "&amount=" + amount + "&billId=" + billId;
            window.open(qiwi_pay_url, "_blank"); 
        }
        else {
            alert(obj["err"]);
        }
    });

});

Здесь

  • ajax.php – адрес файла обработчика
  • QIWI_PUBLIC_KEY – публичный ключ, который вы получали ранее

Отправляя POST-запрос к своему ajax.php мы создаем счет, возвращаем его идентификатор, формируем урл и переходим по нему, открывая ссылку в новом окне.

Как выглядит

Вот такое открывается у нас новое окно

Код бэкенд

Теперь давайте приведу примерный код файла ajax.php

$reque = $_POST["reque"];
if ($reque == "add_pay_user"){
    $sum  =  (int)$_POST["sum"];
    $user_id  = (int)$_POST["user_id"];
    $resp = array();
    $resp["success"] = true;
    $query = "INSERT INTO `pay_history` (`sum`, `user_id`) VALUES ('$sum', '$user_id');";
    $ress = (mysqli_query($conn, $query) or die (mysqli_error($conn)));
    $billId = $conn->insert_id;
    $resp["billId"] = "l2".$billId;
    $resp["sum"] = $sum;
    echo json_encode($resp);
}

А теперь нам надо проверять оплаченные счета. Вообще, сам киви рекомендует делать это через вебхуки. Однако проще проверять их самостоятельно периодически. Например, запустить на выполнение через крон скрипт примерно такого содержания

$result = $conn->query("SELECT * FROM `pay_history` WHERE l2_pay_history.pay_status = '1' ORDER by id DESC LIMIT 5");

while ($row = $result->fetch_assoc()){ 
    $billid = "l2".$row["id"];
    $user_id = $row["user_id"];
    $add_sum = $row["sum"];
    $history_payments_id = $row["id"];

    $invoice_raw = get_info_invoice($billid);
    $invoice = json_decode($invoice_raw, true);
    $status = $invoice["status"]["value"];
	//если счет оплачен
    if ($status == "PAID"){
        //обновляем баланс пользователя
        update_user_balance($user_id, $end_add_sum);
		
		//пишем, что деньги поступил
		update_history_payments_status($history_payments_id);
    }
}

Сама функция получения статуса счета

function get_info_invoice($billid){
    $token = "здесь_ваш_секретный_ключ";
    $url = "https://api.qiwi.com/partner/bill/v1/bills/$billid";
     
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
       'Content-Type: application/json',
       'Authorization: Bearer ' . $token
       ));
    $data = curl_exec($ch);
    curl_close($ch);

    return $data;
}

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

Итоги

Вот так несложно и быстро можно подключить к своему сайту прием платежей, оплату чего-либо. Если вам требуется платная помощь или консультация – пишите мне.


Автор этого материала – я – Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML – то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, qiwi, php, javascript

Читайте также:

  • Пример подключения к API от QIWI кошелька на C# для новичков

Добавить комментарий