├── LICENSE ├── README.md ├── _balance_en.html.md ├── _balance_ru.html.md ├── _error_en.html.md ├── _error_ru.html.md ├── _master_ru.html.md ├── _payment_en.html.md ├── _payment_history_en.html.md ├── _payment_history_ru.html.md ├── _payment_ru.html.md ├── _profile_en.html.md ├── _profile_ru.html.md ├── _webhook_en.html.md ├── _webhook_ru.html.md ├── qiwi-wallet-personal_en.html.md └── qiwi-wallet-personal_ru.html.md /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 QIWI Open API 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # qiwi-wallet-personal-docs 2 | API QIWI Кошелька позволяет автоматизировать выполнение платежей и получение отчетов о платежах, информации о вашем счёте в [сервисе QIWI Кошелек](https://qiwi.com). 3 | 4 | Методы API доступны после регистрации пользователя в [сервисе QIWI Кошелек](https://qiwi.com). 5 | 6 | -------------------------------------------------------------------------------- /_balance_en.html.md: -------------------------------------------------------------------------------- 1 | # Wallet Balances API {#balance} 2 | 3 | ###### [Edit on GitHub](https://github.com/QIWI-API/qiwi-wallet-personal-docs/blob/master/_balance_en.html.md) 4 | 5 | API provides methods to control balances of your QIWI wallet. 6 | 7 | ## List of balances {#balances_list} 8 | 9 | Provides current balances of your QIWI Wallet. 10 | 11 | [Interactive API](https://developer.qiwi.com/sandbox/index.html#!/account-controller-v-2/getByAliasUsingGET_1) 12 | 13 |

Request → GET

14 | 15 | ~~~shell 16 | curl "https://edge.qiwi.com/funding-sources/v2/persons//accounts" \ 17 | --header "Accept: application/json" \ 18 | --header "Authorization: Bearer " 19 | ~~~ 20 | 21 | ~~~http 22 | GET /funding-sources/v2/persons//accounts HTTP/1.1 23 | Accept: application/json 24 | Authorization: Bearer 25 | Host: edge.qiwi.com 26 | ~~~ 27 | 28 | ~~~python 29 | import requests 30 | 31 | # QIWI Wallet balances 32 | def balance(login, api_access_token): 33 | s = requests.Session() 34 | s.headers['Accept']= 'application/json' 35 | s.headers['authorization'] = 'Bearer ' + api_access_token 36 | b = s.get('https://edge.qiwi.com/funding-sources/v2/persons/' + login + '/accounts') 37 | return b.json() 38 | ~~~ 39 | 40 |
    41 |
  • URL /funding-sources/v2/persons/personId/accounts

    42 |
      43 |
    • personId - your wallet number (without + sign)
    • 44 |
    45 |
  • 46 |
47 | 48 |
    49 |
  • HEADERS

    50 |
      51 |
    • Accept: application/json
    • 52 |
    • Authorization: Bearer ***
    • 53 |
    54 |
  • 55 |
56 | 57 |

Response ←

58 | 59 | ~~~http 60 | HTTP/1.1 200 OK 61 | Content-Type: application/json 62 | 63 | { 64 | "accounts": [ 65 | { 66 | "alias": "mc_beeline_rub", 67 | "fsAlias": "qb_mc_beeline", 68 | "bankAlias": "QIWI", 69 | "title": "MC", 70 | "type": { 71 | "id": "MC", 72 | "title": "Счет мобильного кошелька" 73 | }, 74 | "hasBalance": false, 75 | "balance": null, 76 | "currency": 643 77 | }, 78 | { 79 | "alias": "qw_wallet_rub", 80 | "fsAlias": "qb_wallet", 81 | "bankAlias": "QIWI", 82 | "title": "WALLET", 83 | "type": { 84 | "id": "WALLET", 85 | "title": "QIWI Wallet" 86 | }, 87 | "hasBalance": true, 88 | "balance": { 89 | "amount": 8.74, 90 | "currency": 643 91 | }, 92 | "currency": 643 93 | } 94 | ] 95 | } 96 | ~~~ 97 | 98 | ~~~python 99 | # wallet number as 79992223344 100 | mylogin = '79999999999' 101 | api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' 102 | 103 | # All balances 104 | balances = balance(mylogin,api_access_token)['accounts'] 105 | 106 | # Ruble account balance 107 | rubAlias = [x for x in balances if x['alias'] == 'qw_wallet_rub'] 108 | rubBalance = rubAlias[0]['balance']['amount'] 109 | ~~~ 110 | 111 | > Repeated request when you got empty "balance" object and "hasBalance": true in response 112 | 113 | ~~~http 114 | GET /funding-sources/v2/persons/79115221133/accounts?timeout=1000&alias=qw_wallet_rub HTTP/1.1 115 | Accept: application/json 116 | Authorization: Bearer YUu2qw048gtdsvlk3iu 117 | Host: edge.qiwi.com 118 | ~~~ 119 | 120 | Successful response is JSON array of all active balances of your QIWI wallet used for payment funding: 121 | 122 | Response field | Type | Description 123 | --------|----|---- 124 | accounts|Array[Object]|Array of balances 125 | accounts[].alias | String | User balance alias 126 | accounts[].fsAlias | String | Bank account alias 127 | accounts[].bankAlias | String | Bank alias 128 | accounts[].title|String| Wallet account name 129 | accounts[].hasBalance|Boolean|Flag of actual QIWI Wallet balance (not a linked card or cell phone balance or something like that) 130 | accounts[].currency | Number(3)| Currency of the balance (ISO-4217). Only balances in following currencies are returned: `643` - Russian ruble, `840` - USD, `978` - Euro 131 | accounts[].type|Object| Account information 132 | type.id, type.title| String| Account title 133 | 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) 134 | balance.amount|Number|Текущий баланс данного счета 135 | balance.currency | Number(3)| Код валюты баланса (ISO-4217) 136 | 137 | ## Creating balance {#balance_create} 138 | 139 | Creates a new account and its balance in your QIWI wallet. List of account types which you can create is provided by [other request](#funding_offer). 140 | 141 | [Interactive API](https://developer.qiwi.com/sandbox/index.html#!/account-controller-v-2/createAccountUsingPOST) 142 | 143 |

Request → POST

144 | 145 | ~~~shell 146 | curl -X POST \ 147 | "https://edge.qiwi.com/funding-sources/v2/persons/" \ 151 | -d '{ "alias": "qw_wallet_eur"}' 152 | ~~~ 153 | 154 | ~~~http 155 | POST /funding-sources/v2/persons//accounts HTTP/1.1 156 | Accept: application/json 157 | Authorization: Bearer 158 | Content-type: application/json 159 | Host: edge.qiwi.com 160 | 161 | { "alias": "qw_wallet_eur" } 162 | ~~~ 163 | 164 |
    165 |
  • URL /funding-sources/v2/persons/personId/accounts

    166 |
      167 |
    • personId - your wallet number without + sign
    • 168 |
    169 |
  • 170 |
171 | 172 |
    173 |
  • HEADERS

    174 |
      175 |
    • Accept: application/json
    • 176 |
    • Content-type: application/json
    • 177 |
    • Authorization: Bearer ***
    • 178 |
    179 |
  • 180 |
181 | 182 |
    183 |
  • Parameters

    In JSON body of the request: 184 |
  • 185 |
186 | 187 | Name|Type|Description 188 | --------|----|---- 189 | alias|String| Alias of the new account (taken from [Available accounts](#funding_offer)) 190 | 191 |

Response ←

192 | 193 | ~~~http 194 | HTTP/1.1 201 Created 195 | ~~~ 196 | 197 | Successful response contains HTTP code `201`. 198 | 199 | ## Available accounts {#funding_offer} 200 | 201 | Provides all possible account aliases for your QIWI wallet. 202 | 203 | [Interactive API](https://developer.qiwi.com/sandbox/index.html#!/account-controller-v-2/getAccountsOfferUsingGET) 204 | 205 |

Request → GET

206 | 207 | ~~~shell 208 | curl -X GET \ 209 | "https://edge.qiwi.com/funding-sources/v2/persons//accounts/offer" \ 210 | --header "Accept: application/json" \ 211 | --header "Authorization: Bearer " 212 | ~~~ 213 | 214 | ~~~http 215 | GET /funding-sources/v2/persons//accounts/offer HTTP/1.1 216 | Accept: application/json 217 | Authorization: Bearer 218 | Host: edge.qiwi.com 219 | ~~~ 220 | 221 |
    222 |
  • URL /funding-sources/v2/persons/personId/accounts/offer

    223 |
      224 |
    • personId - your wallet number without + sign
    • 225 |
    226 |
  • 227 |
228 | 229 |
    230 |
  • HEADERS

    231 |
      232 |
    • Accept: application/json
    • 233 |
    • Authorization: Bearer ***
    • 234 |
    235 |
  • 236 |
237 | 238 |

Response ←

239 | 240 | ~~~http 241 | HTTP/1.1 200 OK 242 | Content-Type: application/json 243 | 244 | { { "alias": "qw_wallet_eur", "currency": 978 }, {} } 245 | ~~~ 246 | 247 | Successful JSON response contains a list of accounts available for creation: 248 | 249 | Response field|Type|Description 250 | --------|----|---- 251 | {} | Object | List of accounts 252 | Object.alias|String|Alias of the account 253 | Object.currency|Number(3)|Account's currency code (ISO-4217) 254 | 255 | ## Default balance {#default_balance} 256 | 257 | Sets up default account in your QIWI wallet for funding all payments. The account must be in the list of [available accounts](#balances_list) 258 | 259 | [Interactive API](https://developer.qiwi.com/sandbox/index.html#!/account-controller-v-2/saveAccountAttributesUsingPATCH) 260 | 261 |

Request → PATCH

262 | 263 | ~~~shell 264 | curl -X PATCH \ 265 | "https://edge.qiwi.com/funding-sources/v2/persons//accounts/qw_wallet_usd" \ 266 | --header "Accept: application/json" \ 267 | --header "Content-Type: application/json" \ 268 | --header "Authorization: Bearer " \ 269 | -d '{ "defaultAccount": true }' 270 | ~~~ 271 | 272 | ~~~http 273 | PATCH /funding-sources/v2/persons//accounts/qw_wallet_usd HTTP/1.1 274 | Accept: application/json 275 | Authorization: Bearer 276 | Content-type: application/json 277 | Host: edge.qiwi.com 278 | 279 | { "defaultAccount": true } 280 | ~~~ 281 | 282 |
    283 |
  • URL /funding-sources/v2/persons/personId/accounts/accountAlias

    284 |
      285 |
    • personId - your wallet number without + sign
    • 286 |
    • accountAlias - account's alias in the wallet, from a list (see parameter accounts[].alias in response)
    • 287 |
    288 |
  • 289 |
290 | 291 |
    292 |
  • HEADERS

    293 |
      294 |
    • Accept: application/json
    • 295 |
    • Content-type: application/json
    • 296 |
    • Authorization: Bearer ***
    • 297 |
    298 |
  • 299 |
300 | 301 |
    302 |
  • Parameters

    Parameter in JSON body: 303 |
  • 304 |
305 | 306 | Name|Type|Description 307 | --------|----|---- 308 | defaultAccount|Boolean| Flag of default account 309 | 310 |

Response ←

311 | 312 | ~~~http 313 | HTTP/1.1 204 Modified 314 | ~~~ 315 | 316 | Successful response has HTTP code `204`. 317 | -------------------------------------------------------------------------------- /_balance_ru.html.md: -------------------------------------------------------------------------------- 1 | # Баланс QIWI Кошелька {#balance} 2 | 3 | ###### [Предложить правки на GitHub](https://github.com/QIWI-API/qiwi-wallet-personal-docs/blob/master/_balance_ru.html.md) 4 | 5 | Методы данного API предназначены для управления балансами вашего QIWI кошелька. 6 | 7 | ## Список балансов {#balances_list} 8 | 9 | Запрос выгружает текущие балансы счетов вашего QIWI Кошелька. 10 | 11 | [Потестировать](https://developer.qiwi.com/sandbox/index.html#!/account-controller-v-2/getByAliasUsingGET_1) 12 | 13 |

Запрос → GET

14 | 15 | ~~~shell 16 | curl "https://edge.qiwi.com/funding-sources/v2/persons/<кошелек>/accounts" \ 17 | --header "Accept: application/json" \ 18 | --header "Authorization: Bearer <токен API>" 19 | ~~~ 20 | 21 | ~~~http 22 | GET /funding-sources/v2/persons/<кошелек>/accounts HTTP/1.1 23 | Accept: application/json 24 | Authorization: Bearer <токен API> 25 | Host: edge.qiwi.com 26 | ~~~ 27 | 28 | ~~~python 29 | import requests 30 | 31 | # Баланс QIWI Кошелька 32 | def balance(login, api_access_token): 33 | s = requests.Session() 34 | s.headers['Accept']= 'application/json' 35 | s.headers['authorization'] = 'Bearer ' + api_access_token 36 | b = s.get('https://edge.qiwi.com/funding-sources/v2/persons/' + login + '/accounts') 37 | return b.json() 38 | ~~~ 39 | 40 |
    41 |
  • URL /funding-sources/v2/persons/personId/accounts

    42 |
      43 |
    • personId - номер вашего кошелька без знака "+"
    • 44 |
    45 |
  • 46 |
47 | 48 |
    49 |
  • HEADERS

    50 |
      51 |
    • Accept: application/json
    • 52 |
    • Authorization: Bearer ***
    • 53 |
    54 |
  • 55 |
56 | 57 |

Ответ ←

58 | 59 | ~~~http 60 | HTTP/1.1 200 OK 61 | Content-Type: application/json 62 | 63 | { 64 | "accounts": [ 65 | { 66 | "alias": "mc_beeline_rub", 67 | "fsAlias": "qb_mc_beeline", 68 | "bankAlias": "QIWI", 69 | "title": "MC", 70 | "type": { 71 | "id": "MC", 72 | "title": "Счет мобильного кошелька" 73 | }, 74 | "hasBalance": false, 75 | "balance": null, 76 | "currency": 643 77 | }, 78 | { 79 | "alias": "qw_wallet_rub", 80 | "fsAlias": "qb_wallet", 81 | "bankAlias": "QIWI", 82 | "title": "WALLET", 83 | "type": { 84 | "id": "WALLET", 85 | "title": "QIWI Wallet" 86 | }, 87 | "hasBalance": true, 88 | "balance": { 89 | "amount": 8.74, 90 | "currency": 643 91 | }, 92 | "currency": 643 93 | } 94 | ] 95 | } 96 | ~~~ 97 | 98 | ~~~python 99 | # номер кошелька в формате 79992223344 100 | mylogin = '79999999999' 101 | api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' 102 | 103 | # все балансы 104 | balances = balance(mylogin,api_access_token)['accounts'] 105 | 106 | # рублевый баланс 107 | rubAlias = [x for x in balances if x['alias'] == 'qw_wallet_rub'] 108 | rubBalance = rubAlias[0]['balance']['amount'] 109 | ~~~ 110 | 111 | > Повторный запрос, если в ответе пришел пустой объект balance и поле "hasBalance": true 112 | 113 | ~~~http 114 | GET /funding-sources/v2/persons/79115221133/accounts?timeout=1000&alias=qw_wallet_rub HTTP/1.1 115 | Accept: application/json 116 | Authorization: Bearer YUu2qw048gtdsvlk3iu 117 | Host: edge.qiwi.com 118 | ~~~ 119 | 120 | Успешный ответ содержит JSON-массив счетов вашего QIWI Кошелька для фондирования платежей и текущие балансы счетов: 121 | 122 | Поле ответа|Тип|Описание 123 | --------|----|---- 124 | accounts|Array[Object]|Массив балансов 125 | accounts[].alias | String |Псевдоним пользовательского баланса 126 | accounts[].fsAlias | String |Псевдоним банковского баланса 127 | accounts[].bankAlias | String |Псевдоним банка 128 | accounts[].title|String|Название соответствующего счета кошелька 129 | accounts[].hasBalance|Boolean|Логический признак реального баланса в системе QIWI Кошелек (не привязанная карта, не счет мобильного телефона и т.д.) 130 | accounts[].currency | Number(3)| Код валюты баланса (ISO-4217). Возвращаются балансы в следующих валютах: `643` - российский рубль, `840` - американский доллар, `978` - евро 131 | accounts[].type|Object|Сведения о счете 132 | type.id, type.title| String| Описание счета 133 | accounts[].balance|Object |Сведения о балансе данного счета.
Если объект пустой и при этом поле `accounts[].hasBalance` равно `true`, повторите запрос с дополнительными параметрами:
`timeout=1000` и `alias=accounts[].alias` (псевдоним этого баланса) 134 | balance.amount|Number|Текущий баланс данного счета 135 | balance.currency | Number(3)| Код валюты баланса (ISO-4217) 136 | 137 | ## Создание баланса {#balance_create} 138 | 139 | Запрос создает новый счет и баланс в вашем QIWI Кошельке. Список доступных для создания счетов можно получить [другим запросом](#funding_offer). 140 | 141 | [Потестировать](https://developer.qiwi.com/sandbox/index.html#!/account-controller-v-2/createAccountUsingPOST) 142 | 143 |

Запрос → POST

144 | 145 | ~~~shell 146 | curl -X POST \ 147 | "https://edge.qiwi.com/funding-sources/v2/persons/<кошелек>/accounts" \ 148 | --header "Accept: application/json" \ 149 | --header "Content-Type: application/json" \ 150 | --header "Authorization: Bearer <токен API>" \ 151 | -d '{ "alias": "qw_wallet_eur"}' 152 | ~~~ 153 | 154 | ~~~http 155 | POST /funding-sources/v2/persons/<кошелек>/accounts HTTP/1.1 156 | Accept: application/json 157 | Authorization: Bearer <токен API> 158 | Content-type: application/json 159 | Host: edge.qiwi.com 160 | 161 | { "alias": "qw_wallet_eur" } 162 | ~~~ 163 | 164 |
    165 |
  • URL /funding-sources/v2/persons/personId/accounts

    166 |
      167 |
    • personId - номер вашего кошелька без знака "+"
    • 168 |
    169 |
  • 170 |
171 | 172 |
    173 |
  • HEADERS

    174 |
      175 |
    • Accept: application/json
    • 176 |
    • Content-type: application/json
    • 177 |
    • Authorization: Bearer ***
    • 178 |
    179 |
  • 180 |
181 | 182 |
    183 |
  • Параметры

    Параметр передается в JSON-теле запроса: 184 |
  • 185 |
186 | 187 | Название|Тип|Описание 188 | --------|----|---- 189 | alias|String| Псевдоним нового счета (см. [запрос доступных счетов](#funding_offer)) 190 | 191 |

Ответ ←

192 | 193 | ~~~http 194 | HTTP/1.1 201 Created 195 | ~~~ 196 | 197 | Успешный ответ содержит HTTP-код `201`. 198 | 199 | ## Запрос доступных счетов {#funding_offer} 200 | 201 | Запрос отображает псевдонимы счетов, доступных для создания в вашем QIWI Кошельке. 202 | 203 | [Потестировать](https://developer.qiwi.com/sandbox/index.html#!/account-controller-v-2/getAccountsOfferUsingGET) 204 | 205 |

Запрос → GET

206 | 207 | ~~~shell 208 | curl -X GET \ 209 | "https://edge.qiwi.com/funding-sources/v2/persons/<кошелек>/accounts/offer" \ 210 | --header "Accept: application/json" \ 211 | --header "Authorization: Bearer <токен API>" 212 | ~~~ 213 | 214 | ~~~http 215 | GET /funding-sources/v2/persons/<кошелек>/accounts/offer HTTP/1.1 216 | Accept: application/json 217 | Authorization: Bearer <токен API> 218 | Host: edge.qiwi.com 219 | ~~~ 220 | 221 |
    222 |
  • URL /funding-sources/v2/persons/personId/accounts/offer

    223 |
      224 |
    • personId - номер вашего кошелька без знака "+"
    • 225 |
    226 |
  • 227 |
228 | 229 |
    230 |
  • HEADERS

    231 |
      232 |
    • Accept: application/json
    • 233 |
    • Authorization: Bearer ***
    • 234 |
    235 |
  • 236 |
237 | 238 |

Ответ ←

239 | 240 | ~~~http 241 | HTTP/1.1 200 OK 242 | Content-Type: application/json 243 | 244 | { { "alias": "qw_wallet_eur", "currency": 978 }, {} } 245 | ~~~ 246 | 247 | Успешный JSON-ответ содержит данные о счетах, которые можно создать: 248 | 249 | Поле ответа|Тип|Описание 250 | --------|----|---- 251 | {} | Object |Коллекция описаний счетов 252 | Object.alias|String|Псевдоним счета 253 | Object.currency|Number(3)|Код валюты счета (ISO-4217) 254 | 255 | ## Установка баланса по умолчанию {#default_balance} 256 | 257 | Запрос устанавливает для вашего QIWI Кошелька счет, баланс которого будет использоваться для фондирования всех платежей по умолчанию. Счет должен содержаться в [списке счетов](#balances_list) 258 | 259 | [Потестировать](https://developer.qiwi.com/sandbox/index.html#!/account-controller-v-2/saveAccountAttributesUsingPATCH) 260 | 261 |

Запрос → PATCH

262 | 263 | ~~~shell 264 | curl -X PATCH \ 265 | "https://edge.qiwi.com/funding-sources/v2/persons/<кошелек>/accounts/qw_wallet_usd" \ 266 | --header "Accept: application/json" \ 267 | --header "Content-Type: application/json" \ 268 | --header "Authorization: Bearer <токен API>" \ 269 | -d '{ "defaultAccount": true }' 270 | ~~~ 271 | 272 | ~~~http 273 | PATCH /funding-sources/v2/persons/<кошелек>/accounts/qw_wallet_usd HTTP/1.1 274 | Accept: application/json 275 | Authorization: Bearer <токен API> 276 | Content-type: application/json 277 | Host: edge.qiwi.com 278 | 279 | { "defaultAccount": true } 280 | ~~~ 281 | 282 |
    283 |
  • URL /funding-sources/v2/persons/personId/accounts/accountAlias

    284 |
      285 |
    • personId - номер вашего кошелька без знака "+"
    • 286 |
    • accountAlias - псевдоним счета в кошельке из списка счетов (параметр accounts[].alias в ответе)
    • 287 |
    288 |
  • 289 |
290 | 291 |
    292 |
  • HEADERS

    293 |
      294 |
    • Accept: application/json
    • 295 |
    • Content-type: application/json
    • 296 |
    • Authorization: Bearer ***
    • 297 |
    298 |
  • 299 |
300 | 301 |
    302 |
  • Параметры

    Параметр передается в JSON-теле запроса: 303 |
  • 304 |
305 | 306 | Название|Тип|Описание 307 | --------|----|---- 308 | defaultAccount|Boolean| Признак установки счета по умолчанию 309 | 310 |

Ответ ←

311 | 312 | ~~~http 313 | HTTP/1.1 204 Modified 314 | ~~~ 315 | 316 | Успешный ответ содержит HTTP-код `204`. 317 | -------------------------------------------------------------------------------- /_error_en.html.md: -------------------------------------------------------------------------------- 1 | # Error Codes {#errors} 2 | 3 | API returns the following HTTP codes in case of errors. 4 | 5 | HTTP code | API | Description 6 | ---|-----|--------- 7 | 400 | All | Wrong data format of request 8 | 401 | All | Wrong API token or token expired 9 | 403 | All | Not enough rights of API token for the request 10 | 404 | [Payments history](#payments_history), [Transaction info](#txn_info), [Receipt](#payment_receipt) | Transaction not found or no payments with such data 11 | 404 | [Balances](#balance), [User's profile](#profile), [Identification](#identification) | Wallet not found 12 | 404 | [Callbacks](#webhook) | Active webhook not found 13 | 404 | [Pay/Cancel invoice](#paywallet_invoice) | Invoice not found 14 | 422 | [Webhook registration](#hook_reg) | Wrong domain/subnet/host in new webhook URL, wrong webhook type or transactions type, or webhook already exists and is active 15 | 423 | All | Too many requests, service temporary unavailable 16 | 500 | All | Internal service error (webhook URL too long, infrastructure maintenance, resource is unavailable and so on) 17 | 18 | 19 | 20 | The following errors return in `errorCode` field in responses to [payments history](#payments_history) and [transaction info](#txn_info) requests: 21 | 22 | errorCode | Description 23 | ----|------ 24 | 0 |OK 25 | 3 |Technical error. Repeat the request later 26 | 4 |Incorrect format of phone or account number. Check the data 27 | 5 |No such number. Check the data and try again 28 | 8 |Technical problem on the recipient's bank side. Try again later 29 | 57 | Recipient's wallet status not allowing the money transfer. Ask them to enter passport data in QIWI Wallet to increase status level. 30 | 131 |Payment type unavailable for your country 31 | 166 |Your wallet status not allowing the money transfer. Enter passport data in QIWI Wallet to increase status level. 32 | 167 |Recipient's wallet status not allowing the money transfer. Ask them to enter passport data in QIWI Wallet to increase status level. 33 | 202 |Technical error. Repeat the payment later 34 | 204 |Your wallet status not allowing the cash topup. Enter passport data in QIWI Wallet to increase status level. 35 | 220 |Not enough funds. Replenish your wallet 36 | 241 |Payment amount must be larger than 1 ruble 37 | 242 |Payment amount larger than maximum allowed 38 | 254 |Payment amount must be larger than 1 ruble 39 | 271 |Technical issue on the recipient's bank side. Try again later 40 | 300 |Technical error. Repeat the payment later 41 | 303 |Wrong phone number - enter 10 digits 42 | 319 |Your wallet status not allowing the money transfer. Enter passport data in QIWI Wallet to increase status level. 43 | 407 |Not enough funds on your card 44 | 408 |You already have the same payment - pay or cancel it 45 | 455 |Payment is not possible due to limit on minimum balance 46 | 461 |Time to confirm operation is expired. Try again later 47 | 472 |Not enough funds on your wallet - replenish it 48 | 500 |Technical error on the recipient's bank side. Contact the bank's Support service 49 | 522 |Recipient's card wrong number or expiration date. Check data and try again 50 | 547 |Recipient's card wrong expiration date. Check data and try again 51 | 548 |Recipient's card expired 52 | 558 |Payment amount larger than maximum allowed 53 | 561 |Bank where the money is transferring does not accept the payment. Contact the bank's Support service 54 | 700 |Limit for your wallet current status is exceeded. Increase your status level or check your current limit in [Profile section](https://qiwi.com/settings) 55 | 702 |Payment is not possible due to recipient's limit. Its balance's limit is exceeded. Recipient has to contact with our Support 56 | 704 |The monthly limit on your wallet has been exceeded. To remove the restrictions, increase your wallet status in [Profile section](https://qiwi.com/settings) 57 | 705 |The monthly limit on your wallet has been exceeded. To remove the restrictions, increase your wallet status in [Profile section](https://qiwi.com/settings) 58 | 710 | Transfer is not possible - the weekly limit of payments for the same recipient have been exceeded 59 | 711 | Transfer is not possible. You have exceeded the monthly payment limit for such transactions 60 | 716 |You have exceeded the monthly limit on withdrawals from the card. To remove the restrictions, increase your wallet status in [Profile section](https://qiwi.com/settings) 61 | 717 |You have exceeded the daily limit on withdrawals from the card. To remove the restrictions, increase your wallet status in [Profile section](https://qiwi.com/settings) 62 | 746 |Transfer is impossible - the limit for the same recipient has been exceeded 63 | 747 |Transfer is not possible. The number of operations for the same recipient has been exceeded 64 | 749 |Technical error. Contact our Support 65 | 750 |Technical error. Repeat the payment later 66 | 757 |The limit on the number of payments has been exceeded. To remove the restrictions, increase your wallet status in [Profile section](https://qiwi.com/settings) 67 | 797 |Payment has been cancelled, the money is returned to your wallet 68 | 852 |Transfer is impossible - the limit for the same recipient has been exceeded 69 | 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](https://qiwi.com/settings) and pay without limits 70 | 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](https://qiwi.com/settings) and pay without limits 71 | 893 |Transfer rejected. Date is expired 72 | 901 |The code to confirm the payment has expired. Repeat the payment 73 | 943 |The limit on transfers per month is exceeded. Increase your wallet status in [Profile section](https://qiwi.com/settings) and transfer without restrictions 74 | 1050 |The limit on such operations is exceeded. Increase your wallet status in [Profile section](https://qiwi.com/settings) and expand your options 75 | 7000 |Payment rejected. Check card's details and repeat the payment 76 | 7600 |Payment rejected. Contact the bank that issued the card 77 | | 78 | | 79 | | 80 | -------------------------------------------------------------------------------- /_error_ru.html.md: -------------------------------------------------------------------------------- 1 | # Коды ошибок {#errors} 2 | 3 | ###### [Этот раздел на GitHub](https://github.com/QIWI-API/qiwi-wallet-personal-docs/blob/master/_error_ru.html.md) 4 | 5 | В случае ошибки API возвращается HTTP-код ошибки. 6 | 7 | HTTP Код | Секция API | Описание 8 | ---|-----|--------- 9 | 400 | Все | Ошибка синтаксиса запроса (неправильный формат данных) 10 | 401 | Все | Неверный токен или истек срок действия токена API 11 | 403 | Все | Нет прав на этот запрос (недостаточно разрешений у токена API) 12 | 404 | [История платежей](#payments_history), [Информация о транзакции](#txn_info), [Отправка квитанции](#payment_receipt) | Не найдена транзакция или отсутствуют платежи с указанными признаками 13 | 404 | [Балансы](#balance), [Профиль пользователя](#profile), [Идентификация пользователя](#identification) | Не найден кошелек 14 | 404 | [Веб-хуки](#webhook) | Не найден активный веб-хук 15 | 404 | [Оплата/Отмена счета](#paywallet_invoice) | Не найден счет 16 | 422 | [Регистрация веб-хука](#hook_reg) | Неправильно указаны домен/подсеть/хост веб-хука (в параметре `param` для URL веб-хука), неправильно указаны тип хука или тип транзакции, попытка создать хук при наличии уже созданного 17 | 423 | Все | Слишком много запросов, сервис временно недоступен 18 | 500 | Все | Внутренняя ошибка сервиса (превышена длина URL веб-хука, проблемы с инфраструктурой, недоступность каких-либо ресурсов и т.д.) 19 | 20 | 21 | Следующие ошибки возвращаются на запросы [истории платежей](#payments_history) и [информации о транзакции](#txn_info) в параметре `errorCode` ответа: 22 | 23 | errorCode | Описание 24 | ----|------ 25 | 0 |OK 26 | 3 |Техническая ошибка. Повторите платеж позже. 27 | 4 |Некорректный формат телефона или счета. Проверьте данные. 28 | 5 |Данного номера не существует. Проверьте данные и попробуйте еще раз. 29 | 8 |Техническая проблема на стороне банка-получателя. Попробуйте позже. 30 | 57 |Статус кошелька получателя не позволяет перевести ему деньги. Попросите владельца кошелька повысить его статус: укажите паспортные данные. 31 | 131 |Платеж недоступен для вашей страны 32 | 166 |Ваш статус кошелька не позволяет совершить платеж. Повысьте статус кошелька: укажите паспортные данные. 33 | 167 |Статус кошелька получателя не позволяет перевести ему деньги. Попросите владельца кошелька повысить его статус: указать паспортные данные. 34 | 202 |Техническая ошибка. Повторите платеж позже. 35 | 204 |Ваш статус кошелька не позволяет пополнять его наличными. Повысьте статус кошелька: укажите паспортные данные. 36 | 220 |Недостаточно средств. Пополните кошелек 37 | 241 |Сумма платежа должна быть больше 1 рубля 38 | 242 |Сумма платежа превышает максимально допустимую 39 | 254 |Сумма платежа должна быть больше 1 рубля 40 | 271 |Техническая проблема на стороне банка-получателя. Попробуйте позже. 41 | 300 |Техническая ошибка. Повторите платеж позже. 42 | 303 |Неверный номер телефона — должно быть 10 цифр 43 | 319 |Ваш статус кошелька не позволяет совершить платеж. Повысьте статус кошелька: укажите паспортные данные. 44 | 407 |Недостаточно средств на вашей карте 45 | 408 |У вас уже есть такой платеж — оплатите или отмените его 46 | 455 |Платеж невозможен из-за ограничений на минимальный остаток 47 | 461 |Время подтверждения операции истекло. Попробуйте еще раз. 48 | 472 |Недостаточно денег на кошельке — пополните его 49 | 500 |Техническая ошибка на стороне банка-получателя. Обратитесь в их поддержку. 50 | 522 |Неверный номер или срок действия карты получателя. Проверьте данные и повторите попытку. 51 | 547 |Неверный срок действия карты получателя. Проверьте данные и повторите попытку. 52 | 548 |Истек срок действия карты получателя 53 | 558 |Сумма платежа превышает максимально допустимую 54 | 561 |Банк, куда вы переводите деньги, не принимает платеж. Обратитесь в его поддержку. 55 | 700 |Превышен лимит для вашего статуса кошелька. Повысьте статус или уточните свой текущий лимит в [разделе Профиль](https://qiwi.com/settings). 56 | 702 |Платеж невозможен из-за ограничений у получателя. Превышен его лимит на остаток. Получателю необходимо связаться с нашей поддержкой. 57 | 704 |Превышен ежемесячный лимит по вашему кошельку. Чтобы снять ограничения, повысьте статус кошелька в [Профиле](https://qiwi.com/settings). 58 | 705 |Превышен ежемесячный лимит по вашему кошельку. Чтобы снять ограничения, повысьте статус кошелька в [Профиле](https://qiwi.com/settings). 59 | 710 |Перевод невозможен – превышен лимит платежей за неделю в пользу одного и того же получателя 60 | 711 |Перевод невозможен. Вы превысили лимит платежей для таких операций за месяц. 61 | 716 |Вы превысили месячный лимит на снятие денег с карты. Чтобы снять ограничения, повысьте статус кошелька в [Профиле](https://qiwi.com/settings). 62 | 717 |Вы превысили дневной лимит на снятие денег с карты. Чтобы снять ограничения, повысьте статус кошелька в [Профиле](https://qiwi.com/settings). 63 | 746 |Перевод невозможен – превышен лимит в пользу одного и того же получателя 64 | 747 |Перевод невозможен. Превышено количество операций в пользу одного и того же получателя. 65 | 749 |Техническая ошибка. Обратитесь в нашу поддержку. 66 | 750 |Техническая ошибка. Повторите платеж позже. 67 | 757 |Превышен лимит на количество платежей. Чтобы снять ограничения, повысьте статус кошелька в [Профиле](https://qiwi.com/settings). 68 | 797 |Платеж был отменен, деньги возвращены на ваш кошелек 69 | 852 |Перевод невозможен – превышен лимит в пользу одного и того же получателя 70 | 866 |Платеж не проведен. Превышен лимит 5 000 RUB — на исходящие переводы из RUB, USD, EUR в KZT в месяц. Повысьте статус кошелька в [Профиле](https://qiwi.com/settings) и платите без ограничений. 71 | 867 |Платеж не проведен. Превышен лимит 5 000 RUB — на входящие переводы из RUB, USD, EUR в KZT в месяц. Повысьте статус кошелька в [Профиле](https://qiwi.com/settings) и платите без ограничений. 72 | 893 |Перевод отклонен. Истек его срок действия. 73 | 901 |Истек срок действия кода для подтверждения платежа. Повторите платеж. 74 | 943 |Превышен лимит на переводы в месяц. Повысьте статус кошелька в [Профиле](https://qiwi.com/settings) и переводите без ограничений. 75 | 1050 |Превышен лимит на такие операции. Повысьте статус кошелька в [Профиле](https://qiwi.com/settings) и расширьте свои возможности. 76 | 7000 |Платеж отклонен. Проверьте реквизиты карты и повторите платеж. 77 | 7600 |Платеж отклонен. Обратитесь в банк, выпустивший карту. 78 | | 79 | | 80 | | 81 | -------------------------------------------------------------------------------- /_master_ru.html.md: -------------------------------------------------------------------------------- 1 | # API QIWI Мастер {#qiwi-master} 2 | 3 | ###### [Предложить правки на GitHub](https://github.com/QIWI-API/qiwi-wallet-personal-docs/blob/master/_master_ru.html.md) 4 | 5 | API дает доступ к управлению пакетом услуг [QIWI Мастер](https://qiwi.com/qvc-master). Пакет услуг позволяет выпускать до пяти бесплатных виртуальных карт QIWI и перевыпускать карты неограниченное число раз. Выпуск карт сверх указанного количества оплачивается по [тарифу](https://static.qiwi.com/qcms/files/1582791401478_5_JJ5vJe1L0szXzKb.pdf). 6 | 7 | Доступны два типа карт: 8 | 9 | * QIWI Мастер Prepaid – для оплаты рекламы в сервисах Яндекс.Директ и myTarget; 10 | * QIWI Мастер Debit – новый дебетовый БИН. 11 | 12 | Для вызова методов API вам потребуется токен API QIWI Wallet с разрешениями на следующие действия: 13 | 14 | * *Управление виртуальными картами*, 15 | * *Запрос информации о профиле кошелька*, 16 | * *Просмотр истории платежей*, 17 | * *Проведение платежей без SMS*. 18 | 19 | Отметьте указанные разрешения при [выпуске токена API QIWI Wallet](#auth_data). 20 | 21 | ![Token Scopes](/images/apiwallet_token_scopes_qiwi-master.jpg) 22 | 23 | См. также [Пошаговое руководство по интеграции API QIWI Мастер](/ru/qiwi-wallet-api-master-guide/#how-to-use). 24 | 25 | С помощью методов API вы можете: 26 | 27 | * [Выпустить карту QIWI Мастер](#qiwi-master-issue-card). 28 | * [Получить список ваших карт QIWI Мастер](#qiwi-master-list). 29 | * [Получить выписку транзакций по карте](#card-payments). 30 | * [Заблокировать](#card-block) и [разблокировать](#card-unblock) карту. 31 | * [Получить реквизиты карты](#card-details). 32 | * [Переименовать карту](#qvc-rename). 33 | 34 | Чтобы начать работу с API, необходимо [приобрести пакет QIWI Мастер](#buy-qiwi-master). 35 | 36 | ## Покупка пакета QIWI Мастер {#buy-qiwi-master} 37 | 38 |

Запрос → POST

39 | 40 | ~~~shell 41 | curl -X POST \ 42 | 'https://edge.qiwi.com/sinap/api/v2/terms/28004/payments' \ 43 | --header "Content-Type: application/json" \ 44 | --header "Accept: application/json" \ 45 | --header "Authorization: Bearer <токен API>" \ 46 | -d '{ 47 | "id":"1600884280003", 48 | "sum": { 49 | "amount":2999, 50 | "currency":"643" 51 | }, 52 | "paymentMethod": { 53 | "type":"Account", 54 | "accountId":"643" 55 | }, 56 | "comment":"Оплата", 57 | "fields": { 58 | "account":"79121112233", 59 | "vas_alias":"qvc-master" 60 | } 61 | }' 62 | ~~~ 63 | 64 | ~~~http 65 | POST /sinap/api/v2/terms/28004/payments HTTP/1.1 66 | Content-Type: application/json 67 | Accept: application/json 68 | Authorization: Bearer <токен API> 69 | Host: edge.qiwi.com 70 | 71 | { 72 | "id":"1600884280003", 73 | "sum": { 74 | "amount":2999, 75 | "currency":"643" 76 | }, 77 | "paymentMethod": { 78 | "type":"Account", 79 | "accountId":"643" 80 | }, 81 | "comment":"Оплата", 82 | "fields": { 83 | "account":"79121112233", 84 | "vas_alias":"qvc-master" 85 | } 86 | } 87 | ~~~ 88 | 89 | ~~~python 90 | import requests 91 | import time 92 | 93 | # Перевод на QIWI Кошелек 94 | def buy_qiwi_master(api_access_token, qw): 95 | s = requests.Session() 96 | s.headers = {'content-type': 'application/json'} 97 | s.headers['authorization'] = 'Bearer ' + api_access_token 98 | s.headers['User-Agent'] = 'Android v3.2.0 MKT' 99 | s.headers['Accept'] = 'application/json' 100 | postjson = {"id":"","sum":{"amount":"","currency":""},"paymentMethod":{"type":"Account","accountId":"643"}, "fields":{"account":"", "vas_alias":"qvc-master"}} 101 | postjson['id'] = str(int(time.time() * 1000)) 102 | postjson['sum']['amount'] = 2999 103 | postjson['sum']['currency'] = '643' 104 | postjson['fields']['account'] = qw 105 | res = s.post('https://edge.qiwi.com/sinap/api/v2/terms/28004/payments',json = postjson) 106 | return res.json() 107 | ~~~ 108 | 109 |
    110 |
  • URL /sinap/api/v2/terms/28004/payments

  • 111 |
112 | 113 |
    114 |
  • HEADERS

    115 |
      116 |
    • Accept: application/json
    • 117 |
    • Content-type: application/json
    • 118 |
    • Authorization: Bearer ***
    • 119 |
    120 |
  • 121 |
122 | 123 |
    124 |
  • Параметры

    125 |
  • 126 |
127 | 128 | В теле запроса передается JSON-объект [Payment](#payment_obj). Набор обязательных реквизитов платежа в поле `fields`: 129 | 130 | Название|Тип|Описание 131 | --------|----|---- 132 | fields.account| String|Номер кошелька для покупки пакета QIWI Мастер 133 | fields.vas_alias| String| Только `qvc-master` 134 | 135 |

Ответ ←

136 | 137 | ~~~python 138 | print(buy_qiwi_master(mylogin,api_access_token,'+79261112233','comment',99.01)) 139 | 140 | >> Response 141 | {'fields': {'account': '79261112233'}, 142 | 'id': '1514296828893', 143 | 'source': 'account_643', 144 | 'sum': {'amount': 2999.00, 'currency': '643'}, 145 | 'terms': '28004', 146 | 'transaction': {'id': '11982501857', 'state': {'code': 'Accepted'}}} 147 | ~~~ 148 | 149 | Успешный JSON-ответ содержит [объект PaymentInfo](#payment_info) с данными о принятом платеже. 150 | 151 | ## Выпуск виртуальной карты QIWI Мастер {#qiwi-master-issue-card} 152 | 153 | Для выпуска виртуальной карты к пакету QIWI Мастер вам необходимо последовательно выполнить следующие запросы. 154 | 155 | ### Шаг 1. Создание заказа {#order-card} 156 | 157 | ~~~http 158 | POST /cards/v2/persons/78000008024/orders HTTP/1.1 159 | Accept: application/json 160 | Authorization: Bearer f80f0875d8e45af7bdd244c7df3f1a3f 161 | Content-Type: application/json 162 | Host: edge.qiwi.com 163 | 164 | { 165 | "cardAlias": "qvc-cpa" 166 | } 167 | ~~~ 168 | 169 | > Ответ 170 | 171 | ~~~json 172 | { 173 | "id": "<номер заказа>", 174 | "cardAlias": "qvc-cpa", 175 | "status": "DRAFT", 176 | "price": null, 177 | "cardId": null 178 | } 179 | ~~~ 180 | 181 | Отправьте POST-запрос на адрес: 182 | 183 | `/cards/v2/persons/<номер кошелька>/orders` 184 | 185 | В ссылке запроса укажите номер кошелька с пакетом QIWI Мастер. В теле запроса укажите JSON с обязательным параметром: 186 | 187 | Название|Тип|Описание 188 | --------|----|---- 189 | cardAlias| String|[Тип карты](#card-types) 190 | 191 | Успешный ответ содержит JSON с номером заказа: 192 | 193 | Поле ответа|Тип|Описание 194 | --------|----|---- 195 | id| String|Номер заказа 196 | cardAlias| String|[Тип карты](#card-types) 197 | status|String| Статус заказа 198 | price|Object|Не заполняется 199 | cardId|String|Не заполняется 200 | 201 | #### Доступные для заказа типы карт {#card-types} 202 | 203 | Название карты | Описание | cardAlias 204 | ---|----|----- 205 | QIWI Мастер Prepaid | Для оплаты рекламы в сервисах Яндекс.Директ и myTarget | "qvc-cpa" 206 | QIWI Мастер Debit | Новый дебетовый БИН | "qvc-cpa-debit" 207 | 208 | ### Шаг 2. Подтверждение заказа {#card-order-confirm} 209 | 210 | ~~~http 211 | PUT /cards/v2/persons/78000008024/orders/920fa383-6209-4743-a5d1-883f473f7f95/submit HTTP/1.1 212 | Accept: application/json 213 | Authorization: Bearer f80f0875d8e45af7bdd244c7df3f1a3f 214 | Content-Type: application/json 215 | Host: edge.qiwi.com 216 | 217 | ~~~ 218 | 219 | > Ответ, если карта бесплатная 220 | 221 | ~~~json 222 | { 223 | "id": "<номер заказа>", 224 | "cardAlias": "qvc-cpa", 225 | "status": "COMPLETED", 226 | "price": { 227 | "amount": 0, 228 | "currency": 643 229 | }, 230 | "cardId": "" 231 | } 232 | ~~~ 233 | 234 | > Ответ, если карта платная 235 | 236 | ~~~json 237 | { 238 | "id": "<номер заказа>", 239 | "cardAlias": "qvc-cpa", 240 | "status": "PAYMENT_REQUIRED", 241 | "price": { 242 | "amount": <стоимость>, 243 | "currency": 643 244 | }, 245 | "cardId": null 246 | } 247 | ~~~ 248 | 249 | Отправьте PUT-запрос на адрес: 250 | 251 | `/cards/v2/persons/<номер кошелька>/orders/<номер заказа из ответа в Шаге 1>/submit` 252 | 253 | В ссылке запроса укажите номер кошелька с пакетом QIWI Мастер и номер заказа из ответа предыдущего шага (поле `id`). В теле запроса ничего не указывайте. 254 | 255 | Успешный ответ содержит JSON со статусом заказа: 256 | 257 | Поле ответа|Тип|Описание 258 | --------|----|---- 259 | id| String|Номер заказа 260 | cardAlias| String|[Тип карты](#card-types) 261 | status|String| Статус заказа.
Если карта бесплатная, то `COMPLETED`. Если карта платная (выпускается сверх лимита в 5 карт), то `PAYMENT_REQUIRED`. 262 | price|Object|Сведения о платеже 263 | ---|---|--- 264 | amount|Number(Decimal)| Сумма покупки 265 | currency|Number(3)|Валюта платежа (ISO-4217) 266 | -----|---|---- 267 | cardId|String|Номер выпущенной карты. **Не заполняется, если карта платная**. 268 | 269 | ### Шаг 3. Покупка карты {#card-buy} 270 | 271 | ~~~http 272 | POST /sinap/api/v2/terms/32064/payments HTTP/1.1 273 | Accept: application/json 274 | Authorization: Bearer 68944212761e25f6fce457661cabba6c 275 | Content-Type: application/json 276 | Host: edge.qiwi.com 277 | 278 | { 279 | "id": "1600884290004", 280 | "sum": { 281 | "amount": 99, 282 | "currency": "643" 283 | }, 284 | "paymentMethod": { 285 | "type": "Account", 286 | "accountId": "643" 287 | }, 288 | "fields": { 289 | "account": "78000008024", 290 | "order_id":"920fa383-6209-4743-a5d1-883f473f7f95" 291 | } 292 | } 293 | ~~~ 294 | 295 | 298 | 299 | Отправьте POST-запрос на адрес: 300 | 301 | `/sinap/api/v2/terms/32064/payments` 302 | 303 | В теле запроса передается JSON-объект [Payment](#payment_obj). Набор обязательных реквизитов платежа в объекте `fields`: 304 | 305 | Название|Тип|Описание 306 | --------|----|---- 307 | fields.account| String|Номер кошелька 308 | fields.order_id| String| Номер заказа из ответа на [запрос](#order-card) 309 | 310 | Успешный JSON-ответ содержит [объект PaymentInfo](#payment_info) с данными о принятом платеже. 311 | 312 | Информацию о выпущенной карте вы можете запросить со [списком карт QIWI Мастер в вашем кошельке](#qiwi-master-list). Карту можно найти по дате активации (поле `activated`) или по сравнению со списком ранее выпущенных карт. 313 | 314 | ## Список карт QIWI Мастер {#qiwi-master-list} 315 | 316 | ~~~http 317 | GET /cards/v1/cards?vas-alias=qvc-master HTTP/1.1 318 | Accept: application/json 319 | Authorization: Bearer b15ba2d82db883697e8a35877e60e680 320 | Host: edge.qiwi.com 321 | ~~~ 322 | 323 | Чтобы получить список всех ваших карт QIWI Мастер, отправьте GET-запрос на адрес: 324 | 325 | `/cards/v1/cards/?vas-alias=qvc-master` 326 | 327 | > Ответ 328 | 329 | ~~~json 330 | [ 331 | { 332 | "qvx": { 333 | "id": 133789472, 334 | "maskedPan": "****9078", 335 | "status": "ACTIVE", 336 | "cardExpire": "2022-01-31T00:00:00+03:00", 337 | "cardType": "VIRTUAL", 338 | "cardAlias": "Yandex", 339 | "cardLimit": null, 340 | "activated": "2020-01-29T11:10:59+03:00", 341 | "smsResended": "2020-01-29T11:35:01+03:00", 342 | "postNumber": null, 343 | "blockedDate": null, 344 | "fullPan": null, 345 | "cardId": 2001291110576200000, 346 | "txnId": "2001291110576200000", 347 | "cardExpireMonth": "01", 348 | "cardExpireYear": "2022" 349 | }, 350 | "balance": null, 351 | "info": { 352 | "id": 12, 353 | "name": "Виртуальная карта QIWI", 354 | "alias": "qvc-cpa", 355 | "price": { 356 | "amount": 99.0000, 357 | "currency": 643 358 | }, 359 | "period": "за год", 360 | "type": "QVC_CPA", 361 | "details": { 362 | "info": "99 ₽, действует 1 год", 363 | "description": "", 364 | "tariffLink": "https://static.qiwi.com/qcms/files/1582791401478_5_JJ5vJe1L0szXzKb.pdf", 365 | "offerLink": "https://static.qiwi.com/ru/doc/qvc.pdf", 366 | "features": [ 367 | "Покупки без комиссии" 368 | ], 369 | "requisites": [ 370 | { 371 | "name": "Получатель", 372 | "value": "КИВИ Банк (АО)" 373 | }, 374 | { 375 | "name": "ИНН", 376 | "value": "3123011520" 377 | }, 378 | { 379 | "name": "Банк получателя", 380 | "value": "КИВИ Банк (АО)" 381 | }, 382 | { 383 | "name": "БИК", 384 | "value": "044525416" 385 | }, 386 | { 387 | "name": "КПП", 388 | "value": "772601001" 389 | }, 390 | { 391 | "name": "Счет", 392 | "value": "47416810600000000004" 393 | }, 394 | { 395 | "name": "Корр. счет", 396 | "value": "30101810645250000416 (открыт в ГУ Банка России по Центральному федеральному округу)" 397 | }, 398 | { 399 | "name": "Назначение платежа", 400 | "value": "Пополнение QIWI Кошелька\nN +79258150000" 401 | } 402 | ] 403 | }, 404 | "features": [] 405 | } 406 | } 407 | ] 408 | ~~~ 409 | 410 | Успешный ответ содержит JSON-массив с информацией о выпущенных картах: 411 | 412 | Поле ответа | Тип | Описание 413 | ----|-----|----- 414 | qvx | Object | Общая информация о карте 415 | ----|-----|---- 416 | id | Number | ID карты 417 | maskedPan | String | Маскированный номер карты (отображаются только последние 4 цифры) 418 | status | String | Текущий статус карты. Возможные значения: `ACTIVE`, `SENDED_TO_BANK`, `SENDED_TO_USER`, `BLOCKED`, `UNKNOWN` 419 | cardExpire |String | Срок действия карты 420 | cardType | String | Вид карты: всегда `VIRTUAL` (виртуальная карта) 421 | cardAlias | String | [Название карты](#qvc-rename) в интерфейсе сайта [qiwi.com](https://qiwi.com) 422 | cardLimit | Object | Лимиты на карту 423 | -----|-----|------ 424 | value | Number | Значение лимита 425 | currencyCode | Number(3) | Код валюты (ISO-4217) 426 | ----|---|--- 427 | activated | String | Дата активации карты 428 | smsResended | String | Дата высылки СМС с реквизитами 429 | blockedDate | String | Дата блокировки 430 | unblockAvailable | Boolean | Признак возможности разблокировать карту 431 | txnId | String | ID транзакции заказа карты 432 | cardExpireMonth | String | Месяц окончания действия карты 433 | cardExpireYear | String | Год окончания действия карты 434 | ----|---|--- 435 | balance | Object | Данные баланса карты 436 | ---|----|----- 437 | amount|Number| Сумма баланса 438 | currency|Number(3)| Код валюты баланса (ISO-4217) 439 | ----|-----|---- 440 | info | Object | Тарифы и банковские реквизиты карты 441 | -----|-----|---- 442 | alias|String|[Тип карты](#card-types) 443 | price|Object|Тариф карты 444 | -----|-----|---- 445 | amount|Number|Стоимость обслуживания 446 | currency|Number(3)| Код валюты баланса (ISO-4217) 447 | -----|-----|---- 448 | period|String|Период обслуживания (по тарифу) 449 | tariffLink | String | Ссылка на описание тарифа 450 | offerLink | String | Ссылка на договор оферты на выпуск карты 451 | requisites | Array | Список пар "ключ-значение" с данными банковских реквизитов для пополнения карты 452 | 453 | ## Выписка по карте {#card-payments} 454 | 455 | ~~~http 456 | 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 457 | Accept: application/json 458 | Authorization: Bearer b15ba2d82db883697e8a35877e60e680 459 | Host: edge.qiwi.com 460 | ~~~ 461 | 462 | Запрос предназначен для выгрузки операций по определенной карте за указанный период в тарифе QIWI Мастер. 463 | 464 | 465 | 466 | Чтобы получить список операций по карте QIWI Мастер, отправьте GET-запрос на адрес: 467 | 468 | `/payment-history/v1/persons/<номер кошелька>/cards//statement?from=<дата начала выписки>&till=<дата окончания выписки>` 469 | 470 | ID карты можно получить: 471 | 472 | * [при ее выпуске](#card-order-confirm) — для бесплатной карты; 473 | * из [ответа на запрос списка карт](#qiwi-master-list) — для платной карты. 474 | 475 | Успешный ответ в формате `application/pdf` (в бинарном виде) содержит PDF-файл с выпиской. 476 | 477 | ## Блокировка карты {#card-block} 478 | 479 | ~~~http 480 | PUT /cards/v2/persons/78000006047/cards/70590106/block HTTP/1.1 481 | Accept: application/json 482 | Authorization: Bearer 68944212761e25f6fce457661cabba6c 483 | Host: edge.qiwi.com 484 | ~~~ 485 | 486 | Чтобы заблокировать карту тарифа QIWI Мастер, отправьте PUT-запрос на адрес: 487 | 488 | `/cards/v2/persons/<номер кошелька>/cards//block` 489 | 490 | ID карты можно получить: 491 | 492 | * [при ее выпуске](#card-order-confirm) — для бесплатной карты; 493 | * из [ответа на запрос списка карт](#qiwi-master-list) — для платной карты. 494 | 495 |

Ответ ←

496 | 497 | ~~~http 498 | HTTP/1.1 202 Accepted 499 | Content-Type: application/json 500 | ~~~ 501 | 502 | Успешный ответ содержит HTTP-код 202. 503 | 504 | ## Разблокировка карты {#card-unblock} 505 | 506 | ~~~http 507 | PUT /cards/v2/persons/78000006047/cards/111887288/unblock HTTP/1.1 508 | Accept: application/json 509 | Authorization: Bearer 68944212761e25f6fce457661cabba6c 510 | Host: edge.qiwi.com 511 | ~~~ 512 | 513 | > Ответ 514 | 515 | ~~~json 516 | { 517 | "status": "OK", 518 | "nextConfirmationRequest": null, 519 | "confirmationId": null, 520 | "operationId": null 521 | } 522 | ~~~ 523 | 524 | 525 | 526 | Чтобы разблокировать карту, отправьте PUT-запрос на адрес: 527 | 528 | `/cards/v2/persons/<номер кошелька>/cards//unblock` 529 | 530 | ID карты можно получить: 531 | 532 | * [при ее выпуске](#card-order-confirm) — для бесплатной карты; 533 | * из [ответа на запрос списка карт](#qiwi-master-list) — для платной карты. 534 | 535 | Успешный ответ содержит JSON со статусом операции: 536 | 537 | Поле ответа | Тип | Описание 538 | ----|-----|----- 539 | status | String | Статус операции: `OK`, `FAIL`, `CONFIRMATION_REQUIRED` или `CONFIRMATION_LIMIT_EXCEED` 540 | confirmationId | String | ID подтверждения (`null` для API) 541 | operationId | String | ID операции (`null` для API) 542 | nextConfirmationRequest | String | Дата следующей возможности запросить подтверждение (`null` для API) 543 | 544 | ## Получение реквизитов карты {#card-details} 545 | 546 | ~~~http 547 | PUT /cards/v1/cards/158619365/details HTTP/1.1 548 | Accept: application/json 549 | Authorization: Bearer 68944212761e25f6fce457661cabba6c 550 | Content-Type: application/json 551 | Host: edge.qiwi.com 552 | 553 | { 554 | "operationId": "43555447-a026-4c17-b56d-6956a09249c9" 555 | } 556 | ~~~ 557 | 558 | > Ответ 559 | 560 | ~~~json 561 | { 562 | "status": "OK", 563 | "cvv": "111", 564 | "pan": "44441111222233333", 565 | "errorCode": "0" 566 | } 567 | ~~~ 568 | 569 | Чтобы получить платежные реквизиты карты (PAN и CVV), отправьте PUT-запрос на адрес: 570 | 571 | `/cards/v1/cards//details` 572 | 573 | ID карты можно получить: 574 | 575 | * [при ее выпуске](#card-order-confirm) — для бесплатной карты; 576 | * из [ответа на запрос списка карт](#qiwi-master-list) — для платной карты. 577 | 578 | В теле запроса укажите JSON с обязательным параметром: 579 | 580 | Название|Тип|Описание 581 | --------|----|---- 582 | operationId| String|Произвольный UUID 583 | 584 | Успешный ответ содержит JSON с PAN и CVV карты: 585 | 586 | Поле ответа | Тип | Описание 587 | ----|-----|----- 588 | status | String | Статус операции: `OK`, `FAIL`, `CONFIRMATION_REQUIRED` или `CONFIRMATION_LIMIT_EXCEED` 589 | cvv | String | CVV карты 590 | pan | String | PAN карты 591 | errorCode | String | Код ошибки 592 | 593 | ## Переименование карты {#qvc-rename} 594 | 595 | ~~~http 596 | PUT /cards/v1/cards/158619365/alias HTTP/1.1 597 | Accept: application/json 598 | Authorization: Bearer 68944212761e25f6fce457661cabba6c 599 | Content-Type: application/json 600 | Host: edge.qiwi.com 601 | 602 | { 603 | "alias": "new card name" 604 | } 605 | ~~~ 606 | 607 | > Ответ 608 | 609 | ~~~json 610 | { 611 | "status": "OK", 612 | "error": "OK", 613 | "errorCode": "OK" 614 | } 615 | ~~~ 616 | 617 | Чтобы изменить название карты в интерфейсе сайта [qiwi.com](https://qiwi.com), отправьте PUT-запрос на адрес: 618 | 619 | `/cards/v1/cards//alias` 620 | 621 | ID карты можно получить: 622 | 623 | * [при ее выпуске](#card-order-confirm) — для бесплатной карты; 624 | * из [ответа на запрос списка карт](#qiwi-master-list) — для платной карты. 625 | 626 | В теле запроса укажите JSON с обязательным параметром: 627 | 628 | Название|Тип|Описание 629 | --------|----|---- 630 | alias| String|Новое пользовательское имя карты 631 | 632 | Успешный ответ содержит JSON со статусом операции: 633 | 634 | Поле ответа | Тип | Описание 635 | ----|-----|----- 636 | status | String | Статус операции:`OK` или `FAIL` 637 | error | String | Текстовое описание ошибки 638 | errorCode | String | Код ошибки 639 | -------------------------------------------------------------------------------- /_payment_history_en.html.md: -------------------------------------------------------------------------------- 1 | # Payments History API {#payments_history} 2 | 3 | ###### [Edit on GitHub](https://github.com/QIWI-API/qiwi-wallet-personal-docs/blob/master/_payment_history_en.html.md) 4 | 5 | The API gives access to the history of transactions in your QIWI wallet. 6 | 7 | ## List of payments {#payments_list} 8 | 9 | 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. 10 | 11 | [Interactive API](https://developer.qiwi.com/sandbox/index.html#!/payment-history-controller-v-2/getPaymentHistoryByUserUsingGET_1) 12 | 13 | 14 | 15 |

Request → GET

16 | 17 | >Example 1. Last 10 payments 18 | 19 | ~~~shell 20 | curl "https://edge.qiwi.com/payment-history/v2/persons//payments?rows=10" \ 21 | --header "Accept: application/json" \ 22 | --header "Authorization: Bearer " 23 | ~~~ 24 | 25 | > Example 2. Payments for 10.05.2017 26 | 27 | ~~~shell 28 | curl "https://edge.qiwi.com/payment-history/v2/persons//payments?rows=50&startDate=2017-05-10T00%3A00%3A00%2B03%3A00&endDate=2017-05-10T23%3A59%3A59%2B03%3A00" \ 29 | --header "Accept: application/json" \ 30 | --header "Authorization: Bearer " 31 | ~~~ 32 | 33 | > Example 3. Continuing payments list (parameters nextTxnId=9103121 and nextTxnDate=2017-05-11T12:35:23+03:00 returned in the previous history request) 34 | 35 | ~~~shell 36 | curl "https://edge.qiwi.com/payment-history/v2/persons//payments?rows=50&nextTxnId=9103121&nextTxnDate=2017-05-11T12%3A35%3A23%2B03%3A00" \ 37 | --header "Accept: application/json" \ 38 | --header "Authorization: Bearer " 39 | ~~~ 40 | 41 | > Example 4. Last 10 payments from the ruble account and from the linked card 42 | 43 | ~~~http 44 | GET /payment-history/v2/persons//payments?rows=10&operation=OUT&sources%5B0%5D=QW_RUB&sources%5B1%5D=CARD HTTP/1.1 45 | Accept: application/json 46 | Authorization: Bearer 47 | Host: edge.qiwi.com 48 | ~~~ 49 | 50 | > Example 5. Payments for 10.05.2017 from the ruble account 51 | 52 | ~~~http 53 | GET /payment-history/v2/persons//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 54 | Accept: application/json 55 | Authorization: Bearer 56 | Host: edge.qiwi.com 57 | ~~~ 58 | 59 | > Example 6. Continuing payments list for 10.05.2017 (see Example 2, parameters nextTxnId=9103121 и nextTxnDate=2017-05-11T12:35:23+03:00 returned) 60 | 61 | ~~~http 62 | GET /payment-history/v2/persons//payments?rows=50&nextTxnId=9103121&nextTxnDate=2017-05-11T12%3A35%3A23%2B03%3A00 HTTP/1.1 63 | Accept: application/json 64 | Authorization: Bearer 65 | Host: edge.qiwi.com 66 | ~~~ 67 | 68 | ~~~python 69 | import requests 70 | 71 | # Payments history - the most recent and next n payments 72 | def payment_history_last(my_login, api_access_token, rows_num, next_TxnId, next_TxnDate): 73 | s = requests.Session() 74 | s.headers['authorization'] = 'Bearer ' + api_access_token 75 | parameters = {'rows': rows_num, 'nextTxnId': next_TxnId, 'nextTxnDate': next_TxnDate} 76 | h = s.get('https://edge.qiwi.com/payment-history/v2/persons/' + my_login + '/payments', params = parameters) 77 | return h.json() 78 | ~~~ 79 | 80 |
87 | 88 |
    89 |
  • HEADERS

    90 |
      91 |
    • Accept: application/json
    • 92 |
    • Authorization: Bearer ***
    • 93 |
    94 |
  • 95 |
96 | 97 |
    98 |
  • Parameters

    These are transmitted in the query path: 99 |
  • 100 |
101 | 102 | Name | Type | Description 103 | --------|----|---- 104 | 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** 105 | 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 106 | 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 107 | 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). 108 | 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). 109 | nextTxnDate | DateTime URL-encoded| The transaction date to start the report (should be equal to `nextTxnDate` in the previous report). **Used only with `nextTxnId`** 110 | nextTxnId | Long | The transaction number to start the report (should be equal to `nextTxnId` in the previous report). **Used only with `nextTxnDate`** 111 | 112 |

Response ←

113 | 114 | ~~~http 115 | HTTP/1.1 200 OK 116 | Content-Type: application/json 117 | ~~~ 118 | 119 | ~~~json 120 | {"data": 121 | [{ 122 | "txnId":9309, 123 | "personId":79112223344, 124 | "date":"2017-01-21T11:41:07+03:00", 125 | "errorCode":0, 126 | "error":null, 127 | "status":"SUCCESS", 128 | "type":"OUT", 129 | "statusText":"Успешно", 130 | "trmTxnId":"1489826461807", 131 | "account":"0003***", 132 | "sum":{ 133 | "amount":70, 134 | "currency":643 135 | }, 136 | "commission":{ 137 | "amount":0, 138 | "currency":643 139 | }, 140 | "total":{ 141 | "amount":70, 142 | "currency":643 143 | }, 144 | "provider":{ 145 | ... 146 | }, 147 | "source": {}, 148 | "comment":"", 149 | "currencyRate":1 150 | }], 151 | "nextTxnId":9001, 152 | "nextTxnDate":"2017-01-31T15:24:10+03:00" 153 | } 154 | ~~~ 155 | 156 | ~~~python 157 | mylogin = '79999999999' 158 | api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' 159 | 160 | # last 20 payments 161 | lastPayments = payment_history_last(mylogin, api_access_token, '5','','') 162 | 163 | # date and time of the next payment (to use in the next request) 164 | nextTxnDate = lastPayments['nextTxnDate'] 165 | 166 | # transaction id of the next payment (to use in the next request) 167 | nextTxnId = lastPayments['nextTxnId'] 168 | 169 | # the most recent and next n payments 170 | orderedPayments = payment_history_last(mylogin, api_access_token, '5', nextTxnId, nextTxnDate) 171 | ~~~ 172 | 173 | Successful JSON-response contains a list of payments corresponding to the request's filter: 174 | 175 | 176 | 177 | Field|Type|Description 178 | --------|----|---- 179 | data|Array[Object]| A list of [PaymentHistoryItem objects](#payment-history-item).
Number of objects in the list is less than or equals to `rows` value from the request 180 | nextTxnId|Number(Integer)| Next transaction ID, in the complete list of your transactions 181 | 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`) 182 | 183 | ## Statistics {#stat} 184 | 185 | Provides aggregate statistics on the amount of payments for a given period. 186 | 187 | [Interactive API](https://developer.qiwi.com/sandbox/index.html#!/payment-history-controller-v-2/getPaymentHistoryTotalByUserUsingGET_1) 188 | 189 | 190 | 191 |

Request → GET

192 | 193 | ~~~shell 194 | curl "https://edge.qiwi.com/payment-history/v2/persons//payments/total?startDate=2017-03-01T00%3A00%3A00%2B03%3A00&endDate=2017-03-31T11%3A44%3A15%2B03%3A00" \ 195 | --header "Accept: application/json" \ 196 | --header "Authorization: Bearer " 197 | ~~~ 198 | 199 | ~~~http 200 | GET /payment-history/v2/persons//payments/total?startDate=2017-03-01T00%3A00%3A00%2B03%3A00&endDate=2017-03-31T11%3A44%3A15%2B03%3A00 HTTP/1.1 201 | Accept: application/json 202 | Authorization: Bearer 203 | Host: edge.qiwi.com 204 | ~~~ 205 | 206 | ~~~python 207 | import requests 208 | 209 | # Sum of payments for a range of dates 210 | def payment_history_summ_dates(my_login, api_access_token, start_Date, end_Date): 211 | s = requests.Session() 212 | s.headers['authorization'] = 'Bearer ' + api_access_token 213 | parameters = {'startDate': start_Date,'endDate': end_Date} 214 | h = s.get('https://edge.qiwi.com/payment-history/v2/persons/' + my_login + '/payments/total', params = parameters) 215 | return h.json() 216 | ~~~ 217 | 218 |
    219 |
  • URL /payment-history/v2/persons/wallet/payments/total?parameter=value

    220 |
      221 |
    • wallet - the number of your QIWI wallet without + sign
    • 222 |
    223 |
  • 224 |
225 | 226 |
    227 |
  • HEADERS

    228 |
      229 |
    • Accept: application/json
    • 230 |
    • Authorization: Bearer ***
    • 231 |
    232 |
  • 233 |
234 | 235 |
    236 |
  • Parameters

    Send them in the query path: 237 |
  • 238 |
239 | 240 | Name| Type | Description 241 | --------|----|------- 242 | 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** 243 | 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** 244 | 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`. 245 | 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. 246 | 247 |

Response ←

248 | 249 | ~~~http 250 | HTTP/1.1 200 OK 251 | Content-Type: application/json 252 | ~~~ 253 | 254 | ~~~json 255 | { 256 | "incomingTotal":[ 257 | { 258 | "amount":3500, 259 | "currency":643 260 | } 261 | ], 262 | "outgoingTotal":[ 263 | { 264 | "amount":3497.5, 265 | "currency":643 266 | } 267 | ] 268 | } 269 | ~~~ 270 | 271 | ~~~python 272 | mylogin = '79999999999' 273 | api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' 274 | 275 | # Payments amount from April 12 till July 11 276 | print(payment_history_summ_dates(mylogin, api_access_token, '2019-04-12T00:00:00Z','2019-07-11T23:59:59Z')) 277 | 278 | {'incomingTotal': [{'amount': 3.33, 'currency': 840}, 279 | {'amount': 3481, 'currency': 643}], 280 | 'outgoingTotal': [{'amount': 3989.98, 'currency': 643}, 281 | {'amount': 3.33, 'currency': 840}]} 282 | ~~~ 283 | 284 | Successful JSON-response contains statistics data for a specified period: 285 | 286 | Field| Type | Description 287 | --------|----|---- 288 | incomingTotal|Array[Object]| Array of total amounts of incoming payments (top-up payments) separated by payment's currency 289 | incomingTotal[].amount | Number(Decimal) |Top-ups amount for the period 290 | incomingTotal[].currency|Number(3)| Currency of the operations (ISO-4217) 291 | outgoingTotal|Array[Object]| Array of total amounts of payments separated by payment's currency 292 | outgoingTotal[].amount | Number(Decimal) | Payments amount for the period 293 | outgoingTotal[].currency|Number(3)| Currency of the operations (ISO-4217) 294 | 295 | ## Transaction details {#txn_info} 296 | 297 | Returns details on a specific transaction from your payments history. 298 | 299 | [Interactive API](https://developer.qiwi.com/sandbox/index.html#!/payment-history-controller-v-2/getPaymentHistoryByTransactionUsingGET_1) 300 | 301 |

Request → GET

302 | 303 | ~~~shell 304 | curl "https://edge.qiwi.com/payment-history/v2/transactions/9112223344" \ 305 | --header "Accept: application/json" \ 306 | --header "Authorization: Bearer " 307 | ~~~ 308 | 309 | ~~~http 310 | GET /payment-history/v2/transactions/9112223344 HTTP/1.1 311 | Accept: application/json 312 | Authorization: Bearer YUu2qw048gtdsvlk3iu 313 | Host: edge.qiwi.com 314 | ~~~ 315 | 316 | ~~~python 317 | import requests 318 | 319 | # Transaction details 320 | def payment_history_transaction(api_access_token, transaction_id, transaction_type): 321 | s = requests.Session() 322 | s.headers['authorization'] = 'Bearer ' + api_access_token 323 | parameters = {'type': transaction_type} # transaction_type 'IN' 'OUT' 324 | h = s.get('https://edge.qiwi.com/payment-history/v1/transactions/'+transaction_id, params = parameters) 325 | return h.json() 326 | ~~~ 327 | 328 |
    329 |
  • URL /payment-history/v2/transactions/transactionId?type=value

    330 |
      331 |
    • transactionId - transaction ID from Payments history report (txnId field of Transaction object)
    • 332 |
    • type - transaction type from Payments history report (type field of Transaction object). This is optional parameter
    • 333 |
    334 |
  • 335 |
336 | 337 |
    338 |
  • HEADERS

    339 |
      340 |
    • Accept: application/json
    • 341 |
    • Authorization: Bearer ***
    • 342 |
    343 |
  • 344 |
345 | 346 |

Response ←

347 | 348 | ~~~http 349 | HTTP/1.1 200 OK 350 | Content-Type: application/json 351 | ~~~ 352 | 353 | ~~~json 354 | { 355 | "txnId": 11233344692, 356 | "personId": 79161122331, 357 | "date": "2017-08-30T14:38:09+03:00", 358 | "errorCode": 0, 359 | "error": null, 360 | "status": "WAITING", 361 | "type": "OUT", 362 | "statusText": "Запрос обрабатывается", 363 | "trmTxnId": "11233344691", 364 | "account": "15040930424823121081", 365 | "sum": { 366 | "amount": 1, 367 | "currency": 643 368 | }, 369 | "commission": { 370 | "amount": 0, 371 | "currency": 643 372 | }, 373 | "total": { 374 | "amount": 1, 375 | "currency": 643 376 | }, 377 | "provider": { 378 | "id": 1, 379 | "shortName": "MTS", 380 | "longName": "MTS", 381 | "logoUrl": null, 382 | "description": null, 383 | "keys": null, 384 | "siteUrl": null, 385 | "extras": [] 386 | }, 387 | "source": { 388 | "id": 7, 389 | "shortName": "QIWI Wallet", 390 | "longName": "QIWI Wallet", 391 | "logoUrl": null, 392 | "description": null, 393 | "keys": "мобильный кошелек, кошелек, перевести деньги, личный кабинет, отправить деньги, перевод между пользователями", 394 | "siteUrl": null, 395 | "extras": [] 396 | }, 397 | "comment": "", 398 | "currencyRate": 1, 399 | "paymentExtras": [], 400 | "serviceExtras": {}, 401 | "view": {}, 402 | "features": { 403 | "chequeReady": false, 404 | "bankDocumentAvailable": false, 405 | "bankDocumentReady": false, 406 | "repeatPaymentEnabled": false, 407 | "favoritePaymentEnabled": false, 408 | "regularPaymentEnabled": false 409 | } 410 | } 411 | ~~~ 412 | 413 | ~~~python 414 | # wallet number like 79992223344 415 | mylogin = '79999999999' 416 | api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' 417 | 418 | # Transaction ID 11181101215 details 419 | transactionInfo = payment_history_transaction(api_access_token, '11181101215', 'OUT') 420 | 421 | # Transaction number 5 details 422 | lastPayments = payment_history_last(mylogin, api_access_token, '20','','') 423 | last_txn_id = lastPayments['data'][5]['txnId'] 424 | last_txn_type = lastPayments['data'][5]['type'] 425 | 426 | transactionInfo = payment_history_transaction(api_access_token, str(last_txn_id), last_txn_type) 427 | ~~~ 428 | 429 | Successful JSON-response contains [Transaction object](#txnid). 430 | 431 | ## Payment receipt {#payment_receipt} 432 | 433 | Returns electronic receipt for a certain transaction in PDF/JPEG format, either as binary file or via e-mail to specified address. 434 | 435 | ### Receipt file {#receipt_file} 436 | 437 | [Interactive API](https://developer.qiwi.com/sandbox/index.html#!/cheque-controller-v-1/getChequeBytesUsingGET) 438 | 439 |

Request → GET

440 | 441 | ~~~shell 442 | curl "https://edge.qiwi.com/payment-history/v1/transactions/9112223344/cheque/file?type=IN&format=PDF" \ 443 | --header "Accept: application/json" \ 444 | --header "Authorization: Bearer " 445 | ~~~ 446 | 447 | ~~~http 448 | GET /payment-history/v1/transactions/9112223344/cheque/file?type=IN&format=PDF HTTP/1.1 449 | Accept: application/json 450 | Authorization: Bearer YUu2qw048gtdsvlk3iu 451 | Host: edge.qiwi.com 452 | ~~~ 453 | 454 | ~~~python 455 | import requests 456 | 457 | # Get receipt text in file 458 | def payment_history_cheque_file(transaction_id, transaction_type, filename, api_access_token): 459 | s = requests.Session() 460 | s.headers['Accept'] ='application/json' 461 | s.headers['authorization'] = 'Bearer ' + api_access_token 462 | parameters = {'type': transaction_type,'format': 'PDF'} 463 | h = s.get('https://edge.qiwi.com/payment-history/v1/transactions/'+transaction_id+'/cheque/file', params=parameters) 464 | h.status_code 465 | with open(filename + '.pdf', 'wb') as f: 466 | f.write(h.content) 467 | ~~~ 468 | 469 |
    470 |
  • URL /payment-history/v1/transactions/transactionId/cheque/file?type=value&format=value

    471 |
      472 |
    • transactionId - transaction ID from Payments history report (txnId field in Transaction object)
    • 473 |
    • type - transaction type from Payments history report (type field in Transaction object)
    • 474 |
    • format - file type for receipt export. Possible values: JPEG, PDF
    • 475 |
    476 |
  • 477 |
478 | 479 |
    480 |
  • HEADERS

    481 |
      482 |
    • Accept: application/json
    • 483 |
    • Authorization: Bearer ***
    • 484 |
    485 |
  • 486 |
487 | 488 |

Response ←

489 | 490 | ~~~http 491 | HTTP/1.1 200 OK 492 | Content-Type: application/json 493 | 494 | [ 495 | "" 496 | ] 497 | ~~~ 498 | 499 | Successful JSON-response contains binary file. 500 | 501 | ### Receipt sending {#receipt_send} 502 | 503 | [Interactive API](https://developer.qiwi.com/sandbox/index.html#!/cheque-controller-v-1/sendChequeUsingPOST) 504 | 505 |

Request → POST

506 | 507 | ~~~shell 508 | curl -X POST \ 509 | "https://edge.qiwi.com/payment-history/v1/transactions/9112223344/cheque/send?type=IN" \ 510 | --header "Accept: application/json" \ 511 | --header "Content-Type: application/json" \ 512 | --header "Authorization: Bearer " \ 513 | -d '{"email": "my@example.com"}' 514 | ~~~ 515 | 516 | ~~~http 517 | POST /payment-history/v1/transactions/9112223344/cheque/send?type=IN HTTP/1.1 518 | Accept: application/json 519 | Authorization: Bearer YUu2qw048gtdsvlk3iu 520 | Content-type: application/json 521 | Host: edge.qiwi.com 522 | 523 | {"email": "my@example.com"} 524 | ~~~ 525 | 526 | ~~~python 527 | import requests 528 | 529 | # Send receipt to email 530 | def payment_history_cheque_send(transaction_id, transaction_type, email, api_access_token): 531 | s = requests.Session() 532 | s.headers['content-type'] ='application/json' 533 | s.headers['Accept'] ='application/json' 534 | s.headers['authorization'] = 'Bearer ' + api_access_token 535 | postjson = {'email':email} 536 | h = s.post('https://edge.qiwi.com/payment-history/v1/transactions/' + transaction_id + '/cheque/send?type=' + transaction_type, json = postjson) 537 | h.status_code 538 | ~~~ 539 | 540 |
    541 |
  • URL /payment-history/v1/transactions/transactionId/cheque/send?type=value

    542 |
      543 |
    • transactionId - transaction ID from Payments history report (txnId field in Transaction object)
    • 544 |
    • type - transaction type from Payments history report (type field in Transaction object)
    • 545 |
    546 |
  • 547 |
548 | 549 |
    550 |
  • HEADERS

    551 |
      552 |
    • Accept: application/json
    • 553 |
    • Content-type: application/json
    • 554 |
    • Authorization: Bearer ***
    • 555 |
    556 |
  • 557 |
558 | 559 |
    560 |
  • Parameter

    Send this parameter in JSON body of the request: 561 |
  • 562 |
563 | 564 | Name|Type|Description 565 | --------|----|---- 566 | email|String| Email address 567 | 568 |

Response ←

569 | 570 | ~~~http 571 | HTTP/1.1 201 Created 572 | ~~~ 573 | 574 | ~~~python 575 | # wallet number like 79992223344 576 | mylogin = '79999999999' 577 | api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' 578 | 579 | lastPayments = payment_history_last(mylogin, api_access_token, '20','','') 580 | last_txn_id = lastPayments['data'][5]['txnId'] 581 | last_txn_type = lastPayments['data'][5]['type'] 582 | 583 | # Send receipt to email 584 | payment_history_cheque_send(str(last_txn_id), last_txn_type, 'mmd@yandex.ru', api_access_token) 585 | ~~~ 586 | 587 | Successful JSON-response contains HTTP result code of file sending operation. 588 | 589 | ## API data models 590 | 591 | ### PaymentHistoryItem class {#payment-history-item} 592 | 593 | Object contains information about existing QIWI Wallet payment. 594 | 595 | Name| Type | Description 596 | --------|----|------- 597 | txnId | Integer | Transaction ID in QIWI Wallet processing 598 | personId|Integer| Wallet number 599 | 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`) 600 | errorCode|Number(Integer)|[Payment error code](#errorCode) 601 | error| String| Error description 602 | type | String| Payment type. Possible values:
`IN` - top-up,
`OUT` - payment,
`QIWI_CARD` - payment from QIWI card (QVC, QVP). 603 | status|String| Payment status. Possible values:
`WAITING` - payment is processing,
`SUCCESS` - successful payment,
`ERROR` - payment error. 604 | statusText|String | Text description of the status 605 | trmTxnId|String| Transaction's client ID (assigned on the client device) 606 | 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 607 | sum|Object| Payment's amount data. 608 | -----|-----|----- 609 | sum.amount|Number(Decimal)|amount, 610 | sum.currency|Number(3)| currency (ISO-4217) 611 | -----|-----|----- 612 | commission|Object| Payment's commission data 613 | -----|-----|----- 614 | commission.amount|Number(Decimal)|amount, 615 | commission.currency|Number(3)| currency (ISO-4217) 616 | -----|-----|----- 617 | total|Object| Total amount of transaction. 618 | -----|-----|----- 619 | total.amount|Number(Decimal)|amount, it is `sum.amount` plus `commission.amount`, 620 | total.currency|Number(3)| currency (ISO-4217) 621 | -----|-----|----- 622 | provider|Object| Provider's data 623 | -----|-----|----- 624 | provider.id|Integer| Provider ID in QIWI Wallet system, 625 | provider.shortName|String| Provider's short name, 626 | provider.longName|String | Provider's extended name, 627 | provider.logoUrl|String | Provider's logo URL, 628 | provider.description|String | Provider's description (in HTML), 629 | provider.keys|String | Provider's keywords list, 630 | provider.siteUrl|String | Provider's site 631 | -----|-----|----- 632 | comment|String | Comment to the payment 633 | currencyRate|Number(Decimal) | Currency exchange rate (if applied to transaction) 634 | 635 | ### Transaction class {#txnid} 636 | 637 | Object contains information about existing QIWI Wallet transaction. 638 | 639 | Name| Type | Description 640 | --------|----|------- 641 | txnId | Integer | Transaction ID in QIWI Wallet processing 642 | personId|Integer| Wallet number 643 | 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`) 644 | errorCode|Number(Integer)|[Payment error code](#errorCode) 645 | error| String| Error description 646 | type | String| Payment type. Possible values:
`IN` - top-up,
`OUT` - payment,
`QIWI_CARD` - payment from QIWI card (QVC, QVP). 647 | status|String| Payment status. Possible values:
`WAITING` - payment is processing,
`SUCCESS` - successful payment,
`ERROR` - payment error. 648 | statusText|String | Text description of the status 649 | trmTxnId|String| Transaction's client ID (assigned on the client device) 650 | 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 651 | sum|Object| Payment's amount data. 652 | -----|-----|----- 653 | sum.amount|Number(Decimal)|amount, 654 | sum.currency|Number(3)| currency (ISO-4217) 655 | -----|-----|----- 656 | commission|Object| Payment's commission data 657 | -----|-----|----- 658 | commission.amount|Number(Decimal)|amount, 659 | commission.currency|Number(3)| currency (ISO-4217) 660 | -----|-----|----- 661 | total|Object| Total amount of transaction. 662 | -----|-----|----- 663 | total.amount|Number(Decimal)|amount, it is `sum.amount` plus `commission.amount`, 664 | total.currency|Number(3)| currency (ISO-4217) 665 | -----|-----|----- 666 | provider|Object| Provider's data 667 | -----|-----|----- 668 | provider.id|Integer| Provider ID in QIWI Wallet system, 669 | provider.shortName|String| Provider's short name, 670 | provider.longName|String | Provider's extended name, 671 | provider.logoUrl|String | Provider's logo URL, 672 | provider.description|String | Provider's description (in HTML), 673 | provider.keys|String | Provider's keywords list, 674 | provider.siteUrl|String | Provider's site 675 | -----|-----|----- 676 | comment|String | Comment to the payment 677 | currencyRate|Number(Decimal) | Currency exchange rate (if applied to transaction) 678 | paymentExtras|Array of Object | Service information 679 | features|Object|Set of special fields 680 | -----|-----|----- 681 | features.chequeReady| Boolean|Special field 682 | features.bankDocumentReady|Boolean|Special field 683 | features.bankDocumentAvailable|Boolean|Special field 684 | features.repeatPaymentEnabled|Boolean|Special field 685 | features.favoritePaymentEnabled|Boolean|Special field 686 | features.regularPaymentEnabled|Boolean|Special field 687 | features.chatAvailable|Boolean|Special field 688 | features.greetingCardAttached|Boolean|Special field 689 | -----|-----|----- 690 | serviceExtras|Object|Служебная информация 691 | view|Object|Служебная информация 692 | -------------------------------------------------------------------------------- /_payment_history_ru.html.md: -------------------------------------------------------------------------------- 1 | # История платежей {#payments_history} 2 | 3 | ###### [Предложить правки на GitHub](https://github.com/QIWI-API/qiwi-wallet-personal-docs/blob/master/_payment_history_ru.html.md) 4 | 5 | ## Список платежей {#payments_list} 6 | 7 | Запрос выгружает список платежей и пополнений вашего кошелька. Можно использовать фильтр по количеству, ID и дате (интервалу дат) транзакций. 8 | 9 | [Потестировать](https://developer.qiwi.com/sandbox/index.html#!/payment-history-controller-v-2/getPaymentHistoryByUserUsingGET_1) 10 | 11 | 12 | 13 |

Запрос → GET

14 | 15 | >Пример 1. Последние 10 платежей 16 | 17 | ~~~shell 18 | curl "https://edge.qiwi.com/payment-history/v2/persons//payments?rows=10" \ 19 | --header "Accept: application/json" \ 20 | --header "Authorization: Bearer <токен API>" 21 | ~~~ 22 | 23 | > Пример 2. Платежи за 10.05.2017 24 | 25 | ~~~shell 26 | curl "https://edge.qiwi.com/payment-history/v2/persons//payments?rows=50&startDate=2017-05-10T00%3A00%3A00%2B03%3A00&endDate=2017-05-10T23%3A59%3A59%2B03%3A00" \ 27 | --header "Accept: application/json" \ 28 | --header "Authorization: Bearer <токен API>" 29 | ~~~ 30 | 31 | > Пример 3. Продолжение списка платежей (в предыдущем запросе истории возвращены параметры nextTxnId=9103121 и nextTxnDate=2017-05-11T12:35:23+03:00) 32 | 33 | ~~~shell 34 | curl "https://edge.qiwi.com/payment-history/v2/persons//payments?rows=50&nextTxnId=9103121&nextTxnDate=2017-05-11T12%3A35%3A23%2B03%3A00" \ 35 | --header "Accept: application/json" \ 36 | --header "Authorization: Bearer <токен API>" 37 | ~~~ 38 | 39 | > Пример 4. Последние 10 платежей с рублевого баланса и с привязанной карты 40 | 41 | ~~~http 42 | GET /payment-history/v2/persons//payments?rows=10&operation=OUT&sources%5B0%5D=QW_RUB&sources%5B1%5D=CARD HTTP/1.1 43 | Accept: application/json 44 | Authorization: Bearer <токен API> 45 | Host: edge.qiwi.com 46 | ~~~ 47 | 48 | > Пример 5. Платежи за 10.05.2017 с рублевого счета 49 | 50 | ~~~http 51 | GET /payment-history/v2/persons//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 52 | Accept: application/json 53 | Authorization: Bearer <токен API> 54 | Host: edge.qiwi.com 55 | ~~~ 56 | 57 | > Пример 6. Продолжение списка платежей за 10.05.2017 (в Примере 2 возвращены параметры nextTxnId=9103121 и nextTxnDate=2017-05-11T12:35:23+03:00) 58 | 59 | ~~~http 60 | GET /payment-history/v2/persons//payments?rows=50&nextTxnId=9103121&nextTxnDate=2017-05-11T12%3A35%3A23%2B03%3A00 HTTP/1.1 61 | Accept: application/json 62 | Authorization: Bearer <токен API> 63 | Host: edge.qiwi.com 64 | ~~~ 65 | 66 | ~~~python 67 | import requests 68 | 69 | # История платежей - последние и следующие n платежей 70 | def payment_history_last(my_login, api_access_token, rows_num, next_TxnId, next_TxnDate): 71 | s = requests.Session() 72 | s.headers['authorization'] = 'Bearer ' + api_access_token 73 | parameters = {'rows': rows_num, 'nextTxnId': next_TxnId, 'nextTxnDate': next_TxnDate} 74 | h = s.get('https://edge.qiwi.com/payment-history/v2/persons/' + my_login + '/payments', params = parameters) 75 | return h.json() 76 | ~~~ 77 | 78 |
    79 |
  • URL /payment-history/v2/persons/wallet/payments?parameter=value

    80 |
      81 |
    • wallet - номер вашего кошелька без знака "+"
    • 82 |
    83 |
  • 84 |
85 | 86 |
    87 |
  • HEADERS

    88 |
      89 |
    • Accept: application/json
    • 90 |
    • Authorization: Bearer ***
    • 91 |
    92 |
  • 93 |
94 | 95 |
    96 |
  • Параметры

    Данные параметры передаются в строке запроса: 97 |
  • 98 |
99 | 100 | Название|Тип|Описание 101 | --------|----|---- 102 | rows | Integer |Число платежей в ответе, для разбивки отчета на страницы. Целое число от 1 до 50. Запрос возвращает указанное число платежей в обратном хронологическом порядке, начиная от текущей даты или даты в параметре `startDate`. **Обязательный параметр** 103 | operation|String| Тип операций в отчете, для отбора. Допустимые значения:
`ALL` - все операции,
`IN` - только пополнения,
`OUT` - только платежи,
`QIWI_CARD` - только платежи по картам QIWI (QVC, QVP).
По умолчанию `ALL` 104 | sources|Array[String]|Список источников платежа, для фильтра. Каждый источник нумеруется, начиная с нуля (`sources[0]`, `sources[1]` и т.д.). Допустимые значения:
`QW_RUB` - рублевый счет кошелька,
`QW_USD` - счет кошелька в долларах,
`QW_EUR` - счет кошелька в евро,
`CARD` - привязанные и непривязанные к кошельку банковские карты,
`MK` - счет мобильного оператора. Если не указан, учитываются все источники 105 | startDate | DateTime URL-encoded| Начальная дата поиска платежей. **Используется только вместе с `endDate`. Максимальный допустимый интервал между `startDate` и `endDate` - 90 календарных дней.** По умолчанию, равна суточному сдвигу от текущей даты по московскому времени.
Дату можно указать в любой временной зоне `TZD` (формат `ГГГГ-ММ-ДД'T'чч:мм:ссTZD`), однако она должна совпадать с временной зоной в параметре `endDate`. Обозначение временной зоны `TZD`: `+чч:мм` или -`чч:мм` (временной сдвиг от GMT). 106 | endDate | DateTime URL-encoded | Конечная дата поиска платежей. **Используется только вместе со `startDate`. Максимальный допустимый интервал между `startDate` и `endDate` - 90 календарных дней.** По умолчанию, равна текущим дате/времени по московскому времени. Дату можно указать в любой временной зоне `TZD` (формат `ГГГГ-ММ-ДД'T'чч:мм:ссTZD`), однако она должна совпадать с временной зоной в параметре `startDate`. Обозначение временной зоны `TZD`: `+чч:мм` или -`чч:мм` (временной сдвиг от GMT). 107 | nextTxnDate | DateTime URL-encoded| Дата транзакции для начала отчета (должна быть равна параметру `nextTxnDate` в предыдущем списке). Используется для продолжения списка, разбитого на страницы. **Используется только вместе с `nextTxnId`** 108 | nextTxnId | Long | Номер транзакции для начала отчета (должен быть равен параметру `nextTxnId` в предыдущем списке). Используется для продолжения списка, разбитого на страницы. **Используется только вместе с `nextTxnDate`** 109 | 110 |

Ответ ←

111 | 112 | ~~~http 113 | HTTP/1.1 200 OK 114 | Content-Type: application/json 115 | ~~~ 116 | 117 | ~~~json 118 | {"data": 119 | [ 120 | { 121 | "txnId":9309, 122 | "personId":79112223344, 123 | "date":"2017-01-21T11:41:07+03:00", 124 | "errorCode":0, 125 | "error":null, 126 | "status":"SUCCESS", 127 | "type":"OUT", 128 | "statusText":"Успешно", 129 | "trmTxnId":"1489826461807", 130 | "account":"0003***", 131 | "sum":{ 132 | "amount":70, 133 | "currency":643 134 | }, 135 | "commission":{ 136 | "amount":0, 137 | "currency":643 138 | }, 139 | "total":{ 140 | "amount":70, 141 | "currency":643 142 | }, 143 | "provider":{ 144 | ... 145 | }, 146 | "source": {}, 147 | "comment":"", 148 | "currencyRate":1 149 | ], 150 | "nextTxnId":9001, 151 | "nextTxnDate":"2017-01-31T15:24:10+03:00" 152 | } 153 | ~~~ 154 | 155 | ~~~python 156 | mylogin = '79999999999' 157 | api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' 158 | 159 | # последние 20 платежей 160 | lastPayments = payment_history_last(mylogin, api_access_token, '5','','') 161 | 162 | # дата и время следующего платежа 163 | nextTxnDate = lastPayments['nextTxnDate'] 164 | 165 | # id транзакции следующего платежа 166 | nextTxnId = lastPayments['nextTxnId'] 167 | 168 | # История платежей - последние и следующие n платежей 169 | orderedPayments = payment_history_last(mylogin, api_access_token, '5', nextTxnId, nextTxnDate) 170 | ~~~ 171 | 172 | Успешный JSON-ответ содержит список платежей из истории кошелька, соответствующих заданному фильтру: 173 | 174 | 175 | 176 | Поле ответа|Тип|Описание 177 | --------|----|---- 178 | data|Array[Object]|Список [объектов PaymentHistoryItem](#payment-history-item).
Число объектов в списке меньше или равно параметру `rows` из запроса 179 | nextTxnId|Number(Integer)|ID следующего платежа в полном списке 180 | nextTxnDate|DateTime|Дата/время следующего платежа в полном списке, время московское (в формате `ГГГГ-ММ-ДД'T'чч:мм:сс+03:00`) 181 | 182 | ## Статистика платежей {#stat} 183 | 184 | Запрос используется для получения сводной статистики по суммам платежей за указанный период. 185 | 186 | [Потестировать](https://developer.qiwi.com/sandbox/index.html#!/payment-history-controller-v-2/getPaymentHistoryTotalByUserUsingGET_1) 187 | 188 | 189 | 190 |

Запрос → GET

191 | 192 | ~~~shell 193 | curl "https://edge.qiwi.com/payment-history/v2/persons//payments/total?startDate=2017-03-01T00%3A00%3A00%2B03%3A00&endDate=2017-03-31T11%3A44%3A15%2B03%3A00" \ 194 | --header "Accept: application/json" \ 195 | --header "Authorization: Bearer <токен API>" 196 | ~~~ 197 | 198 | ~~~http 199 | GET /payment-history/v2/persons//payments/total?startDate=2017-03-01T00%3A00%3A00%2B03%3A00&endDate=2017-03-31T11%3A44%3A15%2B03%3A00 HTTP/1.1 200 | Accept: application/json 201 | Authorization: Bearer <токен API> 202 | Host: edge.qiwi.com 203 | ~~~ 204 | 205 | ~~~python 206 | import requests 207 | 208 | # История платежей - сумма за диапазон дат 209 | def payment_history_summ_dates(my_login, api_access_token, start_Date, end_Date): 210 | s = requests.Session() 211 | s.headers['authorization'] = 'Bearer ' + api_access_token 212 | parameters = {'startDate': start_Date,'endDate': end_Date} 213 | h = s.get('https://edge.qiwi.com/payment-history/v2/persons/' + my_login + '/payments/total', params = parameters) 214 | return h.json() 215 | ~~~ 216 | 217 |
    218 |
  • URL /payment-history/v2/persons/wallet/payments/total?parameter=value

    219 |
      220 |
    • wallet - номер вашего кошелька без знака "+"
    • 221 |
    222 |
  • 223 |
224 | 225 |
    226 |
  • HEADERS

    227 |
      228 |
    • Accept: application/json
    • 229 |
    • Authorization: Bearer ***
    • 230 |
    231 |
  • 232 |
233 | 234 |
    235 |
  • Параметры

    Данные параметры передаются в строке запроса: 236 |
  • 237 |
238 | 239 | Название|Тип |Описание 240 | --------|----|------- 241 | startDate|DateTime URL-encoded | Начальная дата периода статистики. Дату можно указать в любой временной зоне `TZD` (формат `ГГГГ-ММ-ДД'T'чч:мм:ссTZD`), однако она должна совпадать с временной зоной в параметре `endDate`. Обозначение временной зоны `TZD`: `+чч:мм` или -`чч:мм` (временной сдвиг от GMT). **Обязательный параметр** 242 | endDate|DateTime URL-encoded| Конечная дата периода статистики. Дату можно указать в любой временной зоне `TZD` (формат `ГГГГ-ММ-ДД'T'чч:мм:ссTZD`), однако она должна совпадать с временной зоной в параметре `startDate`. Обозначение временной зоны `TZD`: `+чч:мм` или -`чч:мм` (временной сдвиг от GMT). **Обязательный параметр** 243 | operation|String| Тип операций, учитываемых при подсчете статистики. Допустимые значения:
`ALL` - все операции,
`IN` - только пополнения,
`OUT` - только платежи,
`QIWI_CARD` - только платежи по картам QIWI (QVC, QVP).
По умолчанию `ALL`. 244 | sources|Array[String]|Источники платежа, по которым вернутся данные. Каждый источник нумеруется, начиная с нуля (`sources[0]`, `sources[1]` и т.д.). Допустимые значения:
`QW_RUB` - рублевый счет кошелька,
`QW_USD` - счет кошелька в долларах,
`QW_EUR` - счет кошелька в евро,
`CARD` - привязанные и непривязанные к кошельку банковские карты,
`MK` - счет мобильного оператора. Если не указан, учитываются все источники платежа. 245 | 246 |

Ответ ←

247 | 248 | ~~~http 249 | HTTP/1.1 200 OK 250 | Content-Type: application/json 251 | ~~~ 252 | 253 | ~~~json 254 | { 255 | "incomingTotal":[ 256 | { 257 | "amount":3500, 258 | "currency":643 259 | } 260 | ], 261 | "outgoingTotal":[ 262 | { 263 | "amount":3497.5, 264 | "currency":643 265 | } 266 | ] 267 | } 268 | ~~~ 269 | 270 | ~~~python 271 | mylogin = '79999999999' 272 | api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' 273 | 274 | # История платежей - сумма за диапазон 275 | # не более 90 дней с 12 апреля по 11 июля 2019 года 276 | print(payment_history_summ_dates(mylogin, api_access_token, '2019-04-12T00:00:00Z','2019-07-11T23:59:59Z')) 277 | 278 | {'incomingTotal': [{'amount': 3.33, 'currency': 840}, 279 | {'amount': 3481, 'currency': 643}], 280 | 'outgoingTotal': [{'amount': 3989.98, 'currency': 643}, 281 | {'amount': 3.33, 'currency': 840}]} 282 | ~~~ 283 | 284 | Успешный JSON-ответ содержит статистику платежей за выбранный период: 285 | 286 | Поле ответа|Тип|Описание 287 | --------|----|---- 288 | incomingTotal|Array[Object]|Массив данных о суммах входящих платежей (пополнениях) по каждой валюте 289 | incomingTotal[].amount | Number(Decimal) |Сумма пополнений за период 290 | incomingTotal[].currency|Number(3)|Код валюты пополнений (ISO-4217) 291 | outgoingTotal|Array[Object]|Массив данных о суммах исходящих платежей по каждой валюте 292 | outgoingTotal[].amount | Number(Decimal) |Сумма платежей за период 293 | outgoingTotal[].currency|Number(3)|Код валюты платежей (ISO-4217) 294 | 295 | ## Информация о транзакции {#txn_info} 296 | 297 | Запрос используется для получения информации по определенной транзакции из вашей истории платежей. 298 | 299 | [Потестировать](https://developer.qiwi.com/sandbox/index.html#!/payment-history-controller-v-2/getPaymentHistoryByTransactionUsingGET_1) 300 | 301 |

Запрос → GET

302 | 303 | ~~~shell 304 | curl "https://edge.qiwi.com/payment-history/v2/transactions/9112223344" \ 305 | --header "Accept: application/json" \ 306 | --header "Authorization: Bearer <токен API>" 307 | ~~~ 308 | 309 | ~~~http 310 | GET /payment-history/v2/transactions/9112223344 HTTP/1.1 311 | Accept: application/json 312 | Authorization: Bearer <токен API> 313 | Host: edge.qiwi.com 314 | ~~~ 315 | 316 | ~~~python 317 | import requests 318 | 319 | # История платежей - информация по транзакции 320 | def payment_history_transaction(api_access_token, transaction_id, transaction_type): 321 | s = requests.Session() 322 | s.headers['authorization'] = 'Bearer ' + api_access_token 323 | parameters = {'type': transaction_type} # transaction_type 'IN' 'OUT' 324 | h = s.get('https://edge.qiwi.com/payment-history/v1/transactions/'+transaction_id, params = parameters) 325 | return h.json() 326 | ~~~ 327 | 328 | 336 | 337 |
    338 |
  • HEADERS

    339 |
      340 |
    • Accept: application/json
    • 341 |
    • Authorization: Bearer ***
    • 342 |
    343 |
  • 344 |
345 | 346 |

Ответ ←

347 | 348 | ~~~http 349 | HTTP/1.1 200 OK 350 | Content-Type: application/json 351 | ~~~ 352 | 353 | ~~~json 354 | { 355 | "txnId": 11233344692, 356 | "personId": 79161122331, 357 | "date": "2017-08-30T14:38:09+03:00", 358 | "errorCode": 0, 359 | "error": null, 360 | "status": "WAITING", 361 | "type": "OUT", 362 | "statusText": "Запрос обрабатывается", 363 | "trmTxnId": "11233344691", 364 | "account": "15040930424823121081", 365 | "sum": { 366 | "amount": 1, 367 | "currency": 643 368 | }, 369 | "commission": { 370 | "amount": 0, 371 | "currency": 643 372 | }, 373 | "total": { 374 | "amount": 1, 375 | "currency": 643 376 | }, 377 | "provider": { 378 | "id": 1, 379 | "shortName": "MTS", 380 | "longName": "MTS", 381 | "logoUrl": null, 382 | "description": null, 383 | "keys": null, 384 | "siteUrl": null, 385 | "extras": [] 386 | }, 387 | "source": { 388 | "id": 7, 389 | "shortName": "QIWI Wallet", 390 | "longName": "QIWI Wallet", 391 | "logoUrl": null, 392 | "description": null, 393 | "keys": "мобильный кошелек, кошелек, перевести деньги, личный кабинет, отправить деньги, перевод между пользователями", 394 | "siteUrl": null, 395 | "extras": [] 396 | }, 397 | "comment": "", 398 | "currencyRate": 1, 399 | "extras": [], 400 | "features": { 401 | "chequeReady": false, 402 | "bankDocumentAvailable": false, 403 | "bankDocumentReady": false, 404 | "repeatPaymentEnabled": false, 405 | "favoritePaymentEnabled": false, 406 | "regularPaymentEnabled": false 407 | } 408 | } 409 | ~~~ 410 | 411 | ~~~python 412 | # номер кошелька в формате 79992223344 413 | mylogin = '79999999999' 414 | api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' 415 | 416 | # История платежей - информация по транзакции 417 | transactionInfo = payment_history_transaction(api_access_token, '11181101215', 'OUT') 418 | 419 | # История платежей - информация по транзакции из истории платежей 420 | lastPayments = payment_history_last(mylogin, api_access_token, '20','','') 421 | last_txn_id = lastPayments['data'][5]['txnId'] 422 | last_txn_type = lastPayments['data'][5]['type'] 423 | 424 | transactionInfo = payment_history_transaction(api_access_token, str(last_txn_id), last_txn_type) 425 | ~~~ 426 | 427 | Успешный JSON-ответ содержит [объект Transaction](#txnid) с данными о транзакции. 428 | 429 | ## Квитанция платежа {#payment_receipt} 430 | 431 | Запрос используется для получения электронной квитанции (чека) по определенной транзакции из вашей истории платежей в формате PDF/JPEG в виде файла или почтовым сообщением на указанный e-mail. 432 | 433 | ### Файл квитанции {#receipt_file} 434 | 435 | [Потестировать](https://developer.qiwi.com/sandbox/index.html#!/cheque-controller-v-1/getChequeBytesUsingGET) 436 | 437 |

Запрос → GET

438 | 439 | ~~~shell 440 | curl "https://edge.qiwi.com/payment-history/v1/transactions/9112223344/cheque/file?type=IN&format=PDF" \ 441 | --header "Accept: application/json" \ 442 | --header "Authorization: Bearer <токен API>" 443 | ~~~ 444 | 445 | ~~~http 446 | GET /payment-history/v1/transactions/9112223344/cheque/file?type=IN&format=PDF HTTP/1.1 447 | Accept: application/json 448 | Authorization: Bearer <токен API> 449 | Host: edge.qiwi.com 450 | ~~~ 451 | 452 | ~~~python 453 | import requests 454 | 455 | # История платежей - получение текста чека в файле 456 | def payment_history_cheque_file(transaction_id, transaction_type, filename, api_access_token): 457 | s = requests.Session() 458 | s.headers['Accept'] ='application/json' 459 | s.headers['authorization'] = 'Bearer ' + api_access_token 460 | parameters = {'type': transaction_type,'format': 'PDF'} 461 | h = s.get('https://edge.qiwi.com/payment-history/v1/transactions/'+transaction_id+'/cheque/file', params=parameters) 462 | h.status_code 463 | with open(filename + '.pdf', 'wb') as f: 464 | f.write(h.content) 465 | ~~~ 466 | 467 |
    468 |
  • URL /payment-history/v1/transactions/transactionId/cheque/file?type=value&format=value

    469 |
      470 |
    • transactionId - номер транзакции из истории платежей (параметр data[].txnId в ответе)
    • 471 |
    • type - тип транзакции из истории платежей (параметр data[].type в ответе)
    • 472 |
    • format - тип файла, в который сохраняется квитанция. Допустимые значения: JPEG, PDF
    • 473 |
    474 |
  • 475 |
476 | 477 |
    478 |
  • HEADERS

    479 |
      480 |
    • Accept: application/json
    • 481 |
    • Authorization: Bearer ***
    • 482 |
    483 |
  • 484 |
485 | 486 |

Ответ ←

487 | 488 | ~~~http 489 | HTTP/1.1 200 OK 490 | Content-Type: application/json 491 | 492 | [ 493 | "" 494 | ] 495 | ~~~ 496 | 497 | Успешный JSON-ответ содержит файл выбранного формата в бинарном виде. 498 | 499 | ### Отправка квитанции {#receipt_send} 500 | 501 | [Потестировать](https://developer.qiwi.com/sandbox/index.html#!/cheque-controller-v-1/sendChequeUsingPOST) 502 | 503 |

Запрос → POST

504 | 505 | ~~~shell 506 | curl -X POST \ 507 | "https://edge.qiwi.com/payment-history/v1/transactions/9112223344/cheque/send?type=IN" \ 508 | --header "Accept: application/json" \ 509 | --header "Content-Type: application/json" \ 510 | --header "Authorization: Bearer <токен API>" \ 511 | -d '{"email": "my@example.com"}' 512 | ~~~ 513 | 514 | ~~~http 515 | POST /payment-history/v1/transactions/9112223344/cheque/send?type=IN HTTP/1.1 516 | Accept: application/json 517 | Authorization: Bearer <токен API> 518 | Content-type: application/json 519 | Host: edge.qiwi.com 520 | 521 | {"email": "my@example.com"} 522 | ~~~ 523 | 524 | ~~~python 525 | import requests 526 | 527 | # История платежей - отправить чек на email 528 | def payment_history_cheque_send(transaction_id, transaction_type, email, api_access_token): 529 | s = requests.Session() 530 | s.headers['content-type'] ='application/json' 531 | s.headers['Accept'] ='application/json' 532 | s.headers['authorization'] = 'Bearer ' + api_access_token 533 | postjson = {'email':email} 534 | h = s.post('https://edge.qiwi.com/payment-history/v1/transactions/' + transaction_id + '/cheque/send?type=' + transaction_type, json = postjson) 535 | h.status_code 536 | ~~~ 537 | 538 | 546 | 547 |
    548 |
  • HEADERS

    549 |
      550 |
    • Accept: application/json
    • 551 |
    • Content-type: application/json
    • 552 |
    • Authorization: Bearer ***
    • 553 |
    554 |
  • 555 |
556 | 557 |
    558 |
  • Параметр

    Параметр передается в JSON-теле запроса: 559 |
  • 560 |
561 | 562 | Название|Тип|Описание 563 | --------|----|---- 564 | email|String| Адрес для отправки электронной квитанции 565 | 566 |

Ответ ←

567 | 568 | ~~~http 569 | HTTP/1.1 201 Created 570 | ~~~ 571 | 572 | ~~~python 573 | # номер кошелька в формате 79992223344 574 | mylogin = '79999999999' 575 | api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' 576 | 577 | lastPayments = payment_history_last(mylogin, api_access_token, '20','','') 578 | last_txn_id = lastPayments['data'][5]['txnId'] 579 | last_txn_type = lastPayments['data'][5]['type'] 580 | 581 | # История платежей - отправить чек на email 582 | payment_history_cheque_send(str(last_txn_id), last_txn_type, 'mmd@yandex.ru', api_access_token) 583 | ~~~ 584 | 585 | Успешный JSON-ответ содержит HTTP-код результата операции отправки файла. 586 | 587 | ## Модели данных API {#history-model} 588 | 589 | ### Класс PaymentHistoryItem {#payment-history-item} 590 | 591 | ~~~json 592 | { 593 | "txnId": 11233344692, 594 | "personId": 79161122331, 595 | "date": "2017-08-30T14:38:09+03:00", 596 | "errorCode": 0, 597 | "error": null, 598 | "status": "WAITING", 599 | "type": "OUT", 600 | "statusText": "Запрос обрабатывается", 601 | "trmTxnId": "11233344691", 602 | "account": "15040930424823121081", 603 | "sum": { 604 | "amount": 1, 605 | "currency": 643 606 | }, 607 | "commission": { 608 | "amount": 0, 609 | "currency": 643 610 | }, 611 | "total": { 612 | "amount": 1, 613 | "currency": 643 614 | }, 615 | "provider": { 616 | "id": 1, 617 | "shortName": "MTS", 618 | "longName": "MTS", 619 | "logoUrl": "", 620 | "description": "", 621 | "keys": "", 622 | "siteUrl": "", 623 | "extras": [] 624 | }, 625 | "source": { 626 | "id": 7, 627 | "shortName": "QIWI Wallet", 628 | "longName": "QIWI Wallet", 629 | "logoUrl": "", 630 | "description": "", 631 | "keys": "мобильный кошелек, кошелек, перевести деньги, личный кабинет, отправить деньги, перевод между пользователями", 632 | "siteUrl": "", 633 | "extras": [] 634 | }, 635 | "comment": "", 636 | "currencyRate": 1 637 | } 638 | ~~~ 639 | 640 | Объект, описывающий существующую транзакцию в сервисе QIWI Кошелек. 641 | 642 | Элемент|Тип|Описание 643 | --------|----|---- 644 | txnId | Integer |ID транзакции в сервисе QIWI Кошелек 645 | personId|Integer|Номер кошелька 646 | date|DateTime|Для запросов истории платежей - Дата/время платежа, во временной зоне запроса (см. параметр `startDate`). Формат даты `ГГГГ-ММ-ДД'T'чч:мм:сс+03:00`
Для запросов данных о транзакции - Дата/время платежа, время московское (в формате `ГГГГ-ММ-ДД'T'чч:мм:сс+03:00`) 647 | errorCode|Number(Integer)|[Код ошибки платежа](#errorCode) 648 | error| String| Описание ошибки 649 | type | String| Тип платежа. Возможные значения:
`IN` - пополнение,
`OUT` - платеж,
`QIWI_CARD` - платеж с карты QIWI (QVC, QVP). 650 | status|String|Статус платежа. Возможные значения:
`WAITING` - платеж проводится,
`SUCCESS` - успешный платеж,
`ERROR` - ошибка платежа. 651 | statusText|String |Текстовое описание статуса платежа 652 | trmTxnId|String|Клиентский ID транзакции 653 | account| String|Для платежей — идентификатор получателя (номер счета, телефона, маскированный номер карты и т.д.). Для пополнений — идентификатор отправителя, терминала или название агента пополнения кошелька 654 | sum|Object| Данные о сумме платежа или пополнения. 655 | -----|-----|----- 656 | sum.amount|Number(Decimal)|сумма платежа 657 | sum.currency|Number(3)|валюта платежа (код по ISO-4217) 658 | -----|-----|----- 659 | commission|Object| Данные о комиссии платежа 660 | -----|-----|----- 661 | commission.amount|Number(Decimal)|сумма 662 | commission.currency|Number(3)|валюта (код по ISO-4217) 663 | -----|-----|----- 664 | total|Object| Данные о фактической сумме платежа или пополнения. 665 | -----|-----|----- 666 | total.amount|Number(Decimal)|сумма (равна сумме платежа `sum.amount` и комиссии `commission.amount`) 667 | total.currency|Number(3)|валюта (код по ISO-4217) 668 | -----|-----|----- 669 | provider|Object| Данные о провайдере. 670 | -----|-----|----- 671 | provider.id|Integer|ID провайдера в QIWI Wallet 672 | provider.shortName|String|краткое наименование провайдера 673 | provider.longName|String|развернутое наименование провайдера 674 | provider.logoUrl|String|ссылка на логотип провайдера 675 | provider.description|String|описание провайдера (HTML) 676 | provider.keys|String|список ключевых слов 677 | provider.siteUrl|String|сайт провайдера 678 | -----|-----|----- 679 | source|Object|Служебная информация 680 | comment|String|Комментарий к платежу 681 | currencyRate|Number(Decimal)|Курс конвертации (если применяется в транзакции) 682 | 683 | ### Класс Transaction {#txnid} 684 | 685 | ~~~json 686 | { 687 | "txnId": 11233344692, 688 | "personId": 79161122331, 689 | "date": "2017-08-30T14:38:09+03:00", 690 | "errorCode": 0, 691 | "error": null, 692 | "status": "WAITING", 693 | "type": "OUT", 694 | "statusText": "Запрос обрабатывается", 695 | "trmTxnId": "11233344691", 696 | "account": "15040930424823121081", 697 | "sum": { 698 | "amount": 1, 699 | "currency": 643 700 | }, 701 | "commission": { 702 | "amount": 0, 703 | "currency": 643 704 | }, 705 | "total": { 706 | "amount": 1, 707 | "currency": 643 708 | }, 709 | "provider": { 710 | "id": 1, 711 | "shortName": "MTS", 712 | "longName": "MTS", 713 | "logoUrl": "", 714 | "description": "", 715 | "keys": "", 716 | "siteUrl": "", 717 | "extras": [] 718 | }, 719 | "source": { 720 | "id": 7, 721 | "shortName": "QIWI Wallet", 722 | "longName": "QIWI Wallet", 723 | "logoUrl": "", 724 | "description": "", 725 | "keys": "мобильный кошелек, кошелек, перевести деньги, личный кабинет, отправить деньги, перевод между пользователями", 726 | "siteUrl": "", 727 | "extras": [] 728 | }, 729 | "comment": "", 730 | "currencyRate": 1, 731 | "paymentExtras": [], 732 | "features": { 733 | "chequeReady": false, 734 | "bankDocumentAvailable": false, 735 | "bankDocumentReady": false, 736 | "repeatPaymentEnabled": false, 737 | "favoritePaymentEnabled": false, 738 | "regularPaymentEnabled": false, 739 | "chatAvailable": true, 740 | "greetingCardAttached": true 741 | }, 742 | "serviceExtras": {}, 743 | "view": { 744 | "title": "", 745 | "account": "" 746 | } 747 | } 748 | ~~~ 749 | 750 | Объект, описывающий существующую транзакцию в сервисе QIWI Кошелек. 751 | 752 | Элемент|Тип|Описание 753 | --------|----|---- 754 | txnId | Integer |ID транзакции в сервисе QIWI Кошелек 755 | personId|Integer|Номер кошелька 756 | date|DateTime|Для запросов истории платежей - Дата/время платежа, во временной зоне запроса (см. параметр `startDate`). Формат даты `ГГГГ-ММ-ДД'T'чч:мм:сс+03:00`
Для запросов данных о транзакции - Дата/время платежа, время московское (в формате `ГГГГ-ММ-ДД'T'чч:мм:сс+03:00`) 757 | errorCode|Number(Integer)|[Код ошибки платежа](#errorCode) 758 | error| String| Описание ошибки 759 | type | String| Тип платежа. Возможные значения:
`IN` - пополнение,
`OUT` - платеж,
`QIWI_CARD` - платеж с карты QIWI (QVC, QVP). 760 | status|String|Статус платежа. Возможные значения:
`WAITING` - платеж проводится,
`SUCCESS` - успешный платеж,
`ERROR` - ошибка платежа. 761 | statusText|String |Текстовое описание статуса платежа 762 | trmTxnId|String|Клиентский ID транзакции 763 | account| String|Для платежей — идентификатор получателя (номер счета, телефона, маскированный номер карты и т.д.). Для пополнений — идентификатор отправителя, терминала или название агента пополнения кошелька 764 | sum|Object| Данные о сумме платежа или пополнения. 765 | -----|-----|----- 766 | sum.amount|Number(Decimal)|сумма платежа 767 | sum.currency|Number(3)|валюта платежа (код по ISO-4217) 768 | -----|-----|----- 769 | commission|Object| Данные о комиссии платежа 770 | -----|-----|----- 771 | commission.amount|Number(Decimal)|сумма 772 | commission.currency|Number(3)|валюта (код по ISO-4217) 773 | -----|-----|----- 774 | total|Object| Данные о фактической сумме платежа или пополнения. 775 | -----|-----|----- 776 | total.amount|Number(Decimal)|сумма (равна сумме платежа `sum.amount` и комиссии `commission.amount`) 777 | total.currency|Number(3)|валюта (код по ISO-4217) 778 | -----|-----|----- 779 | provider|Object| Данные о провайдере. 780 | -----|-----|----- 781 | provider.id|Integer|ID провайдера в QIWI Wallet 782 | provider.shortName|String|краткое наименование провайдера 783 | provider.longName|String|развернутое наименование провайдера 784 | provider.logoUrl|String|ссылка на логотип провайдера 785 | provider.description|String|описание провайдера (HTML) 786 | provider.keys|String|список ключевых слов 787 | provider.siteUrl|String|сайт провайдера 788 | -----|-----|----- 789 | source|Object|Служебная информация 790 | comment|String|Комментарий к платежу 791 | currencyRate|Number(Decimal)|Курс конвертации (если применяется в транзакции) 792 | paymentExtras|Array of Objects|Служебная информация 793 | features|Object|Набор специальных полей 794 | -----|-----|----- 795 | features.chequeReady| Boolean|Специальное поле 796 | features.bankDocumentReady|Boolean|Специальное поле 797 | features.bankDocumentAvailable|Boolean|Специальное поле 798 | features.repeatPaymentEnabled|Boolean|Специальное поле 799 | features.favoritePaymentEnabled|Boolean|Специальное поле 800 | features.regularPaymentEnabled|Boolean|Специальное поле 801 | features.chatAvailable|Boolean|Специальное поле 802 | features.greetingCardAttached|Boolean|Специальное поле 803 | -----|-----|----- 804 | serviceExtras|Object|Служебная информация 805 | view|Object|Служебная информация 806 | -------------------------------------------------------------------------------- /_profile_en.html.md: -------------------------------------------------------------------------------- 1 | # User's Profile API {#profile} 2 | 3 | ###### [Edit on GitHub](https://github.com/QIWI-API/qiwi-wallet-personal-docs/blob/master/_profile_en.html.md) 4 | 5 | The API returns information about your profile - a set of user data and settings of your QIWI Wallet. 6 | 7 |

Request → GET

8 | 9 | ~~~shell 10 | curl "https://edge.qiwi.com/person-profile/v1/profile/current?authInfoEnabled=false" \ 11 | --header "Accept: application/json" \ 12 | --header "Authorization: Bearer " 13 | ~~~ 14 | 15 | ~~~http 16 | GET /person-profile/v1/profile/current HTTP/1.1 17 | Accept: application/json 18 | Authorization: Bearer 19 | Host: edge.qiwi.com 20 | ~~~ 21 | 22 | ~~~python 23 | import requests 24 | 25 | # User profile 26 | def get_profile(api_access_token): 27 | s7 = requests.Session() 28 | s7.headers['Accept']= 'application/json' 29 | s7.headers['authorization'] = 'Bearer ' + api_access_token 30 | p = s7.get('https://edge.qiwi.com/person-profile/v1/profile/current?authInfoEnabled=true&contractInfoEnabled=true&userInfoEnabled=true') 31 | return p.json() 32 | ~~~ 33 | 34 | ~~~python 35 | api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' 36 | 37 | # Full info 38 | profile = get_profile(api_access_token) 39 | 40 | # Blocking status 41 | profile['contractInfo']['blocked'] 42 | 43 | # Identification level 44 | profile['contractInfo']['identificationInfo'][0]['identificationLevel'] 45 | 46 | # Linked email 47 | profile['authInfo']['boundEmail'] 48 | ~~~ 49 | 50 | 53 | 54 |
    55 |
  • HEADERS

    56 |
      57 |
    • Accept: application/json
    • 58 |
    • Authorization: Bearer ***
    • 59 |
    60 |
  • 61 |
62 | 63 |
    64 |
  • Parameters

    These options are transmitted in the URL query: 65 |
  • 66 |
67 | 68 | Name|Type |Description 69 | --------|----|------- 70 | authInfoEnabled|Boolean | Flag to get authorization settings.
By default, `true` 71 | contractInfoEnabled|Boolean | Flag to get your QIWI wallet data.
By default, `true` 72 | userInfoEnabled|Boolean | Flag to get other user data.
By default, `true` 73 | 74 |

Response ←

75 | 76 | ~~~http 77 | HTTP/1.1 200 OK 78 | Content-Type: application/json 79 | 80 | { 81 | "authInfo": { 82 | "boundEmail": "m@ya.ru", 83 | "ip": "81.210.201.22", 84 | "lastLoginDate": "2017-07-27T06:51:06.099Z", 85 | "mobilePinInfo": { 86 | "lastMobilePinChange": "2017-07-13T11:22:06.099Z", 87 | "mobilePinUsed": true, 88 | "nextMobilePinChange": "2017-11-27T06:51:06.099Z" 89 | }, 90 | "passInfo": { 91 | "lastPassChange": "2017-07-21T09:25:06.099Z", 92 | "nextPassChange": "2017-08-21T09:25:06.099Z", 93 | "passwordUsed": true 94 | }, 95 | "personId": 79683851815, 96 | "pinInfo": { 97 | "pinUsed": true 98 | }, 99 | "registrationDate": "2017-01-07T16:51:06.100Z" 100 | }, 101 | "contractInfo": { 102 | "blocked": false, 103 | "contractId": 79683851815, 104 | "creationDate": "2017-01-07T16:51:06.100Z", 105 | "features": [ 106 | ... 107 | ], 108 | "identificationInfo": [ 109 | { 110 | "bankAlias": "QIWI", 111 | "identificationLevel": "SIMPLE", 112 | "passportExpired": false 113 | } 114 | ] 115 | }, 116 | "userInfo": { 117 | "defaultPayCurrency": 643, 118 | "defaultPaySource": 7, 119 | "email": null, 120 | "firstTxnId": 10807097143, 121 | "language": "string", 122 | "operator": "Beeline", 123 | "phoneHash": "lgsco87234f0287", 124 | "promoEnabled": null 125 | } 126 | } 127 | ~~~ 128 | 129 | Successful JSON-response has the following fields: 130 | 131 | Field|Type|Description 132 | --------|----|---- 133 | authInfo|Object|Current authorization settings. The object may be missing, depending on the `authInfoEnabled` parameter in the request. 134 | authInfo.personId|Number|Wallet number 135 | authInfo.registrationDate|String|QIWI Wallet date/registration time (via website/mobile app, or otherwise) 136 | authInfo.boundEmail|String| E-mail linked to your QIWI wallet. If not, `null` 137 | authInfo.ip|String|IP address of the last user session 138 | authInfo.lastLoginDate|String|The date/time of the last session in QIWI Wallet service 139 | authInfo.mobilePinInfo|Object|PIN data of the mobile app 140 | mobilePinInfo.mobilePinUsed|Boolean|Flag of using a PIN-code (actually means that the mobile app is being used) 141 | mobilePinInfo.lastMobilePinChange|String|The date/time of the last time of the PIN change in the mobile app 142 | mobilePinInfo.nextMobilePinChange|String|The date/time of the next (planned) change of the PIN in the mobile app 143 | authInfo.passInfo|Object|Password usage data on the qiwi.com site 144 | passInfo.passwordUsed|Boolean|Flag of using password (actually means using the site qiwi.com) 145 | passInfo.lastPassChange|String|The date/time of the last password change on qiwi.com 146 | passInfo.nextPassChange|String|The date/time of the next (planned) password change on qiwi.com 147 | authInfo.pinInfo|Object|PIN usage data to the wallet app on the self-service kiosks 148 | pinInfo.pinUsed|Boolean|Flag of using a PIN for the terminal (actually means using the wallet app on the self-service kiosk) 149 | contractInfo|Object| Information about the wallet. The object may be missing, depending on the `contractInfoEnabled` parameter in the request. 150 | contractInfo.blocked|Boolean|Flag of wallet block 151 | contractInfo.contractId|Number|Wallet number 152 | contractInfo.creationDate|String|The date/time to create a wallet (via website/mobile app, either at first topup or otherwise) 153 | contractInfo.features|Array[Object]|Service info 154 | contractInfo.identificationInfo|Array[Object]|User's [identification data](https://qiwi.com/settings/identification) 155 | identificationInfo[].bankAlias|String|String's acronym of the system, in which the user has received the identification::
`QIWI` - QIWI Wallet. 156 | identificationInfo[].identificationLevel|String|Current level of the wallet identification. Possible values:
`ANONYMOUS` - no identification;
`SIMPLE`, `VERIFIED` - simplified identification;
`FULL` - full identification. 157 | identificationInfo[].passportExpired|Boolean|Validity of passport data of the wallet' owner (`true` means that the passport data is invalid). 158 | userInfo|Object|Other user data. The object may be missing, depending on the `userInfoEnabled` parameter in the request. 159 | userInfo.defaultPayCurrency|Number(3)|Default wallet balance currency code (ISO-4217) 160 | userInfo.defaultPaySource|Number|Service info 161 | userInfo.email|String|User's e-mail 162 | userInfo.firstTxnId|Number|Identifier of the first transaction after registration 163 | userInfo.language|String|Service info 164 | userInfo.operator|String|Name of the mobile operator of the user's number 165 | userInfo.phoneHash|String|Service info 166 | userInfo.promoEnabled|String|Service info 167 | 168 | # Identification API {#identification} 169 | 170 | 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. 171 | 172 | [Identification details (in Russian)](https://qiwi.com/settings/identification#ru) 173 | 174 | ## User identification {#ident} 175 | 176 | This request allows you to start the identification of your QIWI Wallet. 177 | 178 | 179 | 180 | To obtain Main wallet status, you must provide the following data about the owner of the wallet: 181 | 182 | * The name 183 | * Series / Passport No. 184 | * Date of birth 185 | * TIN, SNILS or OMS policy number is optional. 186 | 187 | 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." 188 | 189 |

Request → POST

190 | 191 | ~~~shell 192 | curl -X POST \ 193 | "https://edge.qiwi.com/identification/v1/persons/79111234567/identification" \ 194 | --header "Accept: application/json" \ 195 | --header "Content-Type: application/json" \ 196 | --header "Authorization: Bearer " \ 197 | -d '{ 198 | "birthDate": "1998-02-11", 199 | "firstName": "Иван", 200 | "inn": "", 201 | "lastName": "Иванов", 202 | "middleName": "Иванович", 203 | "oms": "", 204 | "passport": "4400111222", 205 | "snils": "" 206 | }' 207 | ~~~ 208 | 209 | ~~~http 210 | POST /identification/v1/persons/79111234567/identification HTTP/1.1 211 | Accept: application/json 212 | Authorization: Bearer 213 | Content-type: application/json 214 | Host: edge.qiwi.com 215 | 216 | { 217 | "birthDate": "1998-02-11", 218 | "firstName": "Иван", 219 | "inn": "", 220 | "lastName": "Иванов", 221 | "middleName": "Иванович", 222 | "oms": "", 223 | "passport": "4400111222", 224 | "snils": "" 225 | } 226 | ~~~ 227 | 228 | ~~~python 229 | import requests 230 | 231 | def get_identification(api_access_token, my_login): 232 | s = requests.Session() 233 | s.headers['authorization'] = 'Bearer ' + api_access_token 234 | res = s.get('https://edge.qiwi.com/identification/v1/persons/'+my_login+'/identification') 235 | return res.json() 236 | ~~~ 237 | 238 |
    239 |
  • URL /identification/v1/persons/wallet/identification

    240 |
      241 |
    • wallet - number of your QIWI wallet without + sign
    • 242 |
    243 |
  • 244 |
245 | 246 |
    247 |
  • HEADERS

    248 |
      249 |
    • Accept: application/json
    • 250 |
    • Content-type: application/json
    • 251 |
    • Authorization: Bearer ***
    • 252 |
    253 |
  • 254 |
255 | 256 |
    257 |
  • Parameters

    Send in JSON body of the request: 258 |
  • 259 |
260 | 261 | Name|Type|Description 262 | --------|----|---- 263 | birthDate|String| Date of birth (in "YYYY-MM-DD" format) 264 | firstName|String| User's first name 265 | middleName|String| User's surname 266 | lastName|String| User's last name 267 | passport|String| Series / Passport No. (only digits) 268 | inn|String| User's TIN 269 | snils|String| User's SNILS 270 | oms|String| User's medical insurance number (OMS) 271 | 272 |

Response ←

273 | 274 | ~~~http 275 | HTTP/1.1 200 OK 276 | Content-Type: application/json 277 | 278 | { 279 | "birthDate": "1996-03-18", 280 | "firstName": "Иван", 281 | "id": 79111234567, 282 | "inn": "7710000001", 283 | "lastName": "Иванов", 284 | "middleName": "Иванович", 285 | "oms": "", 286 | "passport": "1122333000", 287 | "snils": "", 288 | "type": "VERIFIED" 289 | } 290 | ~~~ 291 | 292 | ~~~python 293 | mylogin = '79999999999' 294 | api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' 295 | print(get_identification(api_access_token, mylogin)) 296 | 297 | {'birthDate': '1984-01-09', 298 | 'firstName': 'Иванов', 299 | 'id': 79262111317, 300 | 'inn': 'xxxxxxx', 301 | 'lastName': 'Иванов', 302 | 'middleName': 'Иванович', 303 | 'oms': None, 304 | 'passport': 'xxxx xxxxxx', 305 | 'snils': None, 306 | 'type': 'FULL'} 307 | ~~~ 308 | 309 | Successful JSON response confirms wallet identification data: 310 | 311 | Response field|Type|Description 312 | --------|----|---- 313 | id| Number | User's QIWI wallet number 314 | 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. 315 | birthDate |String | Date of birth 316 | firstName|String| User's first name 317 | middleName|String| User's surname 318 | lastName|String| User's last name 319 | passport|String| Series / Passport No. (only digits) 320 | inn|String| User's TIN. If the parameter is returned but not present in the original request, then the wallet identification is established 321 | snils|String| User's SNILS 322 | oms|String| User's medical insurance number (OMS) 323 | 324 | ## Identification data {#ident_data} 325 | 326 | Gets masked private data and identification status of your QIWI Wallet. 327 | 328 |

Request → GET

329 | 330 | ~~~shell 331 | curl -X GET \ 332 | "https://edge.qiwi.com/identification/v1/persons/79111234567/identification" \ 333 | --header "Accept: application/json" \ 334 | --header "Authorization: Bearer " 335 | ~~~ 336 | 337 | ~~~http 338 | GET /identification/v1/persons/79111234567/identification HTTP/1.1 339 | Accept: application/json 340 | Authorization: Bearer 341 | Host: edge.qiwi.com 342 | ~~~ 343 | 344 |
    345 |
  • URL /identification/v1/persons/wallet/identification

    346 |
      347 |
    • wallet - your QIWI wallet number without + sign
    • 348 |
    349 |
  • 350 |
351 | 352 |
    353 |
  • URL /qw-limits/v1/persons/personId/actual-limits?parameter=value

  • 354 |
      355 |
    • personId - your QIWI wallet number without + sign
    • 356 |
    357 |
358 | 359 |
    360 |
  • HEADERS

    361 |
      362 |
    • Accept: application/json
    • 363 |
    • Authorization: Bearer ***
    • 364 |
    365 |
  • 366 |
367 | 368 |

Response ←

369 | 370 | ~~~http 371 | HTTP/1.1 200 OK 372 | Content-Type: application/json 373 | 374 | { 375 | "birthDate": "1996-03-18", 376 | "firstName": "Иван", 377 | "id": 79111234567, 378 | "inn": "77***01", 379 | "lastName": "Иванов", 380 | "middleName": "Иванович", 381 | "oms": "", 382 | "passport": "43***11", 383 | "snils": "", 384 | "type": "VERIFIED" 385 | } 386 | ~~~ 387 | 388 | Successful JSON response contains masked data used for the wallet identification: 389 | 390 | Response field|Type|Description 391 | --------|----|---- 392 | id| Number | User's QIWI wallet number 393 | 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. 394 | birthDate |String | Date of birth 395 | firstName|String| User's first name 396 | middleName|String| User's surname 397 | lastName|String| User's last name 398 | passport|String| Series / Passport No. (first and last two digits) 399 | inn|String| User's TIN (first and last two digits) 400 | snils|String| User's SNILS (first and last two digits) 401 | oms|String| User's medical insurance number (OMS) (first and last two digits) 402 | 403 | # QIWI Wallet Limits API {#limits} 404 | 405 | ## Limit levels {#limit-levels} 406 | 407 | By using this API, you can get current limits for operations in your QIWI wallet. Limits apply on accessible amount of the operations. 408 | 409 |

Request → GET

410 | 411 | ~~~shell 412 | curl "https://edge.qiwi.com/qw-limits/v1/persons/79115221133/actual-limits?types%5B0%5D=TURNOVER" \ 413 | --header "Accept: application/json" \ 414 | --header "Authorization: Bearer " 415 | ~~~ 416 | 417 | ~~~http 418 | GET /qw-limits/v1/persons/79115221133/actual-limits?types%5B0%5D=TURNOVER HTTP/1.1 419 | Accept: application/json 420 | Authorization: Bearer 421 | Host: edge.qiwi.com 422 | ~~~ 423 | 424 | ~~~python 425 | import requests 426 | 427 | def limits(login, api_access_token): 428 | types = [ 'TURNOVER', 'REFILL', 'PAYMENTS_P2P', 'PAYMENTS_PROVIDER_INTERNATIONALS', 'PAYMENTS_PROVIDER_PAYOUT', 'WITHDRAW_CASH'] 429 | s = requests.Session() 430 | s.headers['Accept']= 'application/json' 431 | s.headers['Content-Type']= 'application/json' 432 | s.headers['authorization'] = 'Bearer ' + api_access_token 433 | parameters = {} 434 | for i, type in enumerate(types): 435 | parameters['types[' + str(i) + ']'] = type 436 | b = s.get('https://edge.qiwi.com/qw-limits/v1/persons/' + login + '/actual-limits', params = parameters) 437 | return b.json() 438 | ~~~ 439 | 440 |
    441 |
  • URL /qw-limits/v1/persons/personId/actual-limits?parameter=value

    442 |
      443 |
    • personId - your QIWI wallet number without + sign
    • 444 |
    445 |
  • 446 |
447 | 448 |
    449 |
  • HEADERS

    450 |
      451 |
    • Accept: application/json
    • 452 |
    • Authorization: Bearer ***
    • 453 |
    454 |
  • 455 |
456 | 457 |
    458 |
  • Parameters

    Send in the request path: 459 |
  • 460 |
461 | 462 | Name|Type|Description 463 | --------|----|---- 464 | 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. 465 | 466 |

Response ←

467 | 468 | ~~~http 469 | HTTP/1.1 200 OK 470 | Content-Type: application/json 471 | 472 | { 473 | "limits":{ 474 | "RU" :[ 475 | { 476 | "type": "TURNOVER", 477 | "currency": "RUB", 478 | "rest": 200.00, 479 | "max": 40000.00, 480 | "spent": 39800.00, 481 | "interval": { 482 | "dateFrom": "2019-11-01T:00:00", 483 | "dateTill": "2019-12-01T00:00" 484 | } 485 | }, 486 | ... 487 | ] 488 | } 489 | } 490 | ~~~ 491 | 492 | ~~~python 493 | # wallet number like 79992223344 494 | mylogin = '79999999999' 495 | api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' 496 | 497 | # list of all limits 498 | limits = limits(mylogin,api_access_token)['limits']['RU'] 499 | 500 | # turnover limit 501 | turnoverInfo = [x for x in limits if x['type'] == 'TURNOVER'] 502 | turnoverLimit = turnoverInfo[0]['rest'] 503 | ~~~ 504 | 505 | Successful JSON response contains an array of limits for your QIWI wallet operations: 506 | 507 | Response field|Type|Description 508 | --------|----|---- 509 | limits|Object| Limits data 510 | limits[].'RU'|Array[Object]| An array of limits for operations 511 | type | String | Operation type where the limit is applied 512 | currency | String | Currency of the operation 513 | max | String | Value of the limit 514 | spent|String| Amount already spent in the operations 515 | rest|Boolean| The rest of the limit which can be used in the given period (see `interval` field) 516 | interval|Object| Details of the limit's period 517 | interval.dateFrom, interval.dateTill| String| Period's start and end, as `YYYY-MM-DDTHH:MM:SStmz` string 518 | 519 | ## Person-to-person transaction limit {#p2p-limit} 520 | 521 | The API returns the value of the person-to-person transaction number for the current month. 522 | 523 |

Request → GET

524 | 525 | ~~~shell 526 | curl "https://edge.qiwi.com/qw-limits/v1/persons/79999999999/p2p-payment-count-limit" \ 527 | --header "Accept: application/json" \ 528 | --header "Authorization: Bearer " 529 | ~~~ 530 | 531 | ~~~http 532 | GET /qw-limits/v1/persons/79999999999/p2p-payment-count-limit HTTP/1.1 533 | Accept: application/json 534 | Authorization: Bearer 535 | Host: edge.qiwi.com 536 | ~~~ 537 | 538 | ~~~python 539 | import requests 540 | 541 | # Number of person-to-person transactions 542 | def get_p2p_payment_count(login, api_access_token): 543 | s = requests.Session() 544 | s.headers['Accept']= 'application/json' 545 | s.headers['Content-Type']= 'application/json' 546 | s.headers['authorization'] = 'Bearer ' + api_access_token 547 | b = s.get('https://edge.qiwi.com/qw-limits/v1/persons/' + login + '/p2p-payment-count-limit') 548 | return b.json() 549 | ~~~ 550 | 551 |
    552 |
  • URL /qw-limits/v1/persons/personId/p2p-payment-count-limit

    553 |
      554 |
    • personId - your QIWI wallet number without "+"
    • 555 |
    556 |
  • 557 |
558 | 559 |
    560 |
  • HEADERS

    561 |
      562 |
    • Accept: application/json
    • 563 |
    • Authorization: Bearer ***
    • 564 |
    565 |
  • 566 |
567 | 568 |

Response ←

569 | 570 | ~~~http 571 | HTTP/1.1 200 OK 572 | Content-Type: application/json 573 | 574 | { 575 | "p2pPaymentCountLimit": 1 576 | } 577 | ~~~ 578 | 579 | ~~~python 580 | mylogin = '79999999999' 581 | api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' 582 | 583 | # P2p payment count for the current month 584 | print(get_p2p_payment_count(api_access_token, mylogin)) 585 | 586 | {'p2pPaymentCountLimit': 1} 587 | 588 | ~~~ 589 | 590 | Successful JSON response contains an information of your person-to-person transactions: 591 | 592 | Response field|Type|Description 593 | --------|--------|---- 594 | p2pPaymentCountLimit| Number |Person-to-person transaction count per month 595 | -------------------------------------------------------------------------------- /_profile_ru.html.md: -------------------------------------------------------------------------------- 1 | # Профиль пользователя {#profile} 2 | 3 | ###### [Предложить правки на GitHub](https://github.com/QIWI-API/qiwi-wallet-personal-docs/blob/master/_profile_ru.html.md) 4 | 5 | Запрос возвращает информацию о вашем профиле - наборе пользовательских данных и настроек вашего QIWI кошелька. 6 | 7 |

Запрос → GET

8 | 9 | ~~~shell 10 | curl "https://edge.qiwi.com/person-profile/v1/profile/current?authInfoEnabled=false" \ 11 | --header "Accept: application/json" \ 12 | --header "Authorization: Bearer <токен API>" 13 | ~~~ 14 | 15 | ~~~http 16 | GET /person-profile/v1/profile/current HTTP/1.1 17 | Accept: application/json 18 | Authorization: Bearer <токен API> 19 | Host: edge.qiwi.com 20 | ~~~ 21 | 22 | ~~~python 23 | import requests 24 | 25 | # Профиль пользователя 26 | def get_profile(api_access_token): 27 | s7 = requests.Session() 28 | s7.headers['Accept']= 'application/json' 29 | s7.headers['authorization'] = 'Bearer ' + api_access_token 30 | p = s7.get('https://edge.qiwi.com/person-profile/v1/profile/current?authInfoEnabled=true&contractInfoEnabled=true&userInfoEnabled=true') 31 | return p.json() 32 | ~~~ 33 | 34 | ~~~python 35 | api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' 36 | 37 | # Полная информация о профиле пользователя 38 | profile = get_profile(api_access_token) 39 | 40 | # Профиль пользователя 41 | # статус блокировки 42 | profile['contractInfo']['blocked'] 43 | 44 | # Профиль пользователя 45 | # уровень идентификации в Киви Банке 46 | profile['contractInfo']['identificationInfo'][0]['identificationLevel'] 47 | 48 | # привязанный email 49 | profile['authInfo']['boundEmail'] 50 | ~~~ 51 | 52 | 55 | 56 |
    57 |
  • HEADERS

    58 |
      59 |
    • Accept: application/json
    • 60 |
    • Authorization: Bearer ***
    • 61 |
    62 |
  • 63 |
64 | 65 |
    66 |
  • Параметры

    Данные параметры передаются в строке запроса и не являются обязательными: 67 |
  • 68 |
69 | 70 | Название|Тип |Описание 71 | --------|----|------- 72 | authInfoEnabled|Boolean | Логический признак выгрузки настроек авторизации.
По умолчанию `true` 73 | contractInfoEnabled|Boolean | Логический признак выгрузки данных о вашем QIWI кошельке.
По умолчанию `true` 74 | userInfoEnabled|Boolean | Логический признак выгрузки прочих пользовательских данных.
По умолчанию `true` 75 | 76 |

Ответ ←

77 | 78 | ~~~http 79 | HTTP/1.1 200 OK 80 | Content-Type: application/json 81 | 82 | { 83 | "authInfo": { 84 | "boundEmail": "m@ya.ru", 85 | "ip": "81.210.201.22", 86 | "lastLoginDate": "2017-07-27T06:51:06.099Z", 87 | "mobilePinInfo": { 88 | "lastMobilePinChange": "2017-07-13T11:22:06.099Z", 89 | "mobilePinUsed": true, 90 | "nextMobilePinChange": "2017-11-27T06:51:06.099Z" 91 | }, 92 | "passInfo": { 93 | "lastPassChange": "2017-07-21T09:25:06.099Z", 94 | "nextPassChange": "2017-08-21T09:25:06.099Z", 95 | "passwordUsed": true 96 | }, 97 | "personId": 79683851815, 98 | "pinInfo": { 99 | "pinUsed": true 100 | }, 101 | "registrationDate": "2017-01-07T16:51:06.100Z" 102 | }, 103 | "contractInfo": { 104 | "blocked": false, 105 | "contractId": 79683851815, 106 | "creationDate": "2017-01-07T16:51:06.100Z", 107 | "features": [ 108 | ... 109 | ], 110 | "identificationInfo": [ 111 | { 112 | "bankAlias": "QIWI", 113 | "identificationLevel": "SIMPLE", 114 | "passportExpired": false 115 | } 116 | ] 117 | }, 118 | "userInfo": { 119 | "defaultPayCurrency": 643, 120 | "defaultPaySource": 7, 121 | "email": null, 122 | "firstTxnId": 10807097143, 123 | "language": "string", 124 | "operator": "Beeline", 125 | "phoneHash": "lgsco87234f0287", 126 | "promoEnabled": null 127 | } 128 | } 129 | ~~~ 130 | 131 | Успешный JSON-ответ содержит следующие данные: 132 | 133 | Поле ответа|Тип|Описание 134 | --------|----|---- 135 | authInfo|Object|Текущие настройки авторизации. Объект может отсутствовать, в зависимости от признака `authInfoEnabled` в запросе. 136 | authInfo.personId|Number|Номер кошелька 137 | authInfo.registrationDate|String|Дата/время регистрации QIWI Кошелька (через сайт/мобильное приложение, либо другим способом) 138 | authInfo.boundEmail|String|E-mail, привязанный к кошельку. Если отсутствует, то `null` 139 | authInfo.ip|String|IP-адрес последней пользовательской сессии 140 | authInfo.lastLoginDate|String|Дата/время последней сессии в QIWI Кошельке 141 | authInfo.mobilePinInfo|Object|Данные о PIN-коде мобильного приложения QIWI Кошелька 142 | mobilePinInfo.mobilePinUsed|Boolean|Логический признак использования PIN-кода (фактически означает, что мобильное приложение используется) 143 | mobilePinInfo.lastMobilePinChange|String|Дата/время последнего изменения PIN-кода мобильного приложения QIWI Кошелька 144 | mobilePinInfo.nextMobilePinChange|String|Дата/время следующего (планового) изменения PIN-кода мобильного приложения QIWI Кошелька 145 | authInfo.passInfo|Object|Данные об использовании пароля к сайту qiwi.com 146 | passInfo.passwordUsed|Boolean|Логический признак использования пароля (фактически означает использование сайта qiwi.com) 147 | passInfo.lastPassChange|String|Дата/время последнего изменения пароля сайта qiwi.com 148 | passInfo.nextPassChange|String|Дата/время следующего (планового) изменения пароля сайта qiwi.com 149 | authInfo.pinInfo|Object|Данные об использовании PIN-кода к приложению QIWI Кошелька на QIWI терминалах самообслуживания 150 | pinInfo.pinUsed|Boolean|Логический признак использования PIN-кода для терминала (фактически означает факт использования приложения QIWI Кошелька на терминале) 151 | contractInfo|Object| Информация о кошельке. Объект может отсутствовать, в зависимости от признака `contractInfoEnabled` в запросе. 152 | contractInfo.blocked|Boolean|Логический признак блокировки кошелька 153 | contractInfo.contractId|Number|Номер кошелька 154 | contractInfo.creationDate|String|Дата/время создания QIWI Кошелька (через сайт/мобильное приложение, либо при первом пополнении, либо другим способом) 155 | contractInfo.features|Array[Object]|Служебная информация 156 | contractInfo.identificationInfo|Array[Object]|Данные об [идентификации](https://qiwi.com/settings/identification#ru) пользователя. 157 | identificationInfo[].bankAlias|String|Акроним системы, в которой пользователь получил идентификацию:
`QIWI` - QIWI Кошелек. 158 | identificationInfo[].identificationLevel|String|Текущий уровень идентификации кошелька. Возможные значения:
`ANONYMOUS` - без идентификации;
`SIMPLE`, `VERIFIED` - упрощенная идентификация;
`FULL` - полная идентификация. 159 | identificationInfo[].passportExpired|Boolean|Информация об актуальности паспортных данных владельца кошелька (`true` означает, что паспортные данные недействительны). 160 | userInfo|Object|Прочие пользовательские данные. Объект может отсутствовать, в зависимости от признака `userInfoEnabled` в запросе. 161 | userInfo.defaultPayCurrency|Number(3)|Код валюты баланса кошелька по умолчанию (ISO-4217) 162 | userInfo.defaultPaySource|Number|Служебная информация 163 | userInfo.email|String|E-mail пользователя 164 | userInfo.firstTxnId|Number|Номер первой транзакции после регистрации 165 | userInfo.language|String|Служебная информация 166 | userInfo.operator|String|Название мобильного оператора номера пользователя 167 | userInfo.phoneHash|String|Служебная информация 168 | userInfo.promoEnabled|String|Служебная информация 169 | 170 | # Идентификация {#identification} 171 | 172 | [Подробнее об идентификации](https://qiwi.com/settings/identification#ru) 173 | 174 | ## Идентификация пользователя {#ident} 175 | 176 | Запрос позволяет отправить данные для идентификации вашего QIWI кошелька. 177 | 178 | 179 | 180 | Для получения статуса "Основной" необходимо предоставить следующие данные о пользователе-владельце кошелька: 181 | 182 | * ФИО 183 | * Серия / Номер паспорта 184 | * Дата рождения 185 | * ИНН, СНИЛС или номер полиса ОМС - необязательно. 186 | 187 | Для идентификации кошелька вы обязательно должны отправить ФИО, серию/номер паспорта и дату рождения. Если данные прошли проверку, то в ответе будет отображен ваш ИНН и упрощенная идентификация кошелька будет установлена. В случае если данные не прошли проверку, кошелек остается в статусе "Минимальный". 188 | 189 |

Запрос → POST

190 | 191 | ~~~shell 192 | curl -X POST \ 193 | "https://edge.qiwi.com/identification/v1/persons/79111234567/identification" \ 194 | --header "Accept: application/json" \ 195 | --header "Content-Type: application/json" \ 196 | --header "Authorization: Bearer <токен API>" \ 197 | -d '{ 198 | "birthDate": "1998-02-11", 199 | "firstName": "Иван", 200 | "inn": "", 201 | "lastName": "Иванов", 202 | "middleName": "Иванович", 203 | "oms": "", 204 | "passport": "4400111222", 205 | "snils": "" 206 | }' 207 | ~~~ 208 | 209 | ~~~http 210 | POST /identification/v1/persons/79111234567/identification HTTP/1.1 211 | Accept: application/json 212 | Authorization: Bearer <токен API> 213 | Content-type: application/json 214 | Host: edge.qiwi.com 215 | 216 | { 217 | "birthDate": "1998-02-11", 218 | "firstName": "Иван", 219 | "inn": "", 220 | "lastName": "Иванов", 221 | "middleName": "Иванович", 222 | "oms": "", 223 | "passport": "4400111222", 224 | "snils": "" 225 | } 226 | ~~~ 227 | 228 | ~~~python 229 | import requests 230 | 231 | # идентификация 232 | def get_identification(api_access_token, my_login): 233 | s = requests.Session() 234 | s.headers['authorization'] = 'Bearer ' + api_access_token 235 | res = s.get('https://edge.qiwi.com/identification/v1/persons/'+my_login+'/identification') 236 | return res.json() 237 | ~~~ 238 | 239 |
    240 |
  • URL /identification/v1/persons/wallet/identification

    241 |
      242 |
    • wallet - номер вашего кошелька без знака "+"
    • 243 |
    244 |
  • 245 |
246 | 247 |
    248 |
  • HEADERS

    249 |
      250 |
    • Accept: application/json
    • 251 |
    • Content-type: application/json
    • 252 |
    • Authorization: Bearer ***
    • 253 |
    254 |
  • 255 |
256 | 257 |
    258 |
  • Параметры

    Данные параметры передаются в JSON-теле запроса: 259 |
  • 260 |
261 | 262 | 263 | Название|Тип|Описание 264 | --------|----|---- 265 | birthDate|String| Дата рождения пользователя (в формате "ГГГГ-ММ-ДД") 266 | firstName|String|Имя пользователя 267 | middleName|String|Отчество пользователя 268 | lastName|String|Фамилия пользователя 269 | passport|String|Серия и номер паспорта пользователя (только цифры) 270 | inn|String|ИНН пользователя 271 | snils|String|Номер СНИЛС пользователя 272 | oms|String|Номер полиса ОМС пользователя 273 | 274 |

Ответ ←

275 | 276 | ~~~http 277 | HTTP/1.1 200 OK 278 | Content-Type: application/json 279 | 280 | { 281 | "birthDate": "1996-03-18", 282 | "firstName": "Иван", 283 | "id": 79111234567, 284 | "inn": "7710000001", 285 | "lastName": "Иванов", 286 | "middleName": "Иванович", 287 | "oms": "", 288 | "passport": "1122333000", 289 | "snils": "", 290 | "type": "VERIFIED" 291 | } 292 | ~~~ 293 | 294 | ~~~python 295 | mylogin = '79999999999' 296 | api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' 297 | print(get_identification(api_access_token, mylogin)) 298 | 299 | {'birthDate': '1984-01-09', 300 | 'firstName': 'Иванов', 301 | 'id': 79262111317, 302 | 'inn': 'xxxxxxx', 303 | 'lastName': 'Иванов', 304 | 'middleName': 'Иванович', 305 | 'oms': None, 306 | 'passport': 'xxxx xxxxxx', 307 | 'snils': None, 308 | 'type': 'FULL'} 309 | ~~~ 310 | 311 | Успешный ответ в формате JSON содержит подтверждение идентификации кошелька: 312 | 313 | Поле ответа |Тип|Описание 314 | --------|----|---- 315 | id| Number |Номер кошелька пользователя 316 | type | String | Текущий статус кошелька:
`SIMPLE` - "Минимальный".
`VERIFIED` - "Основной" (данные для идентификации успешно прошли проверку).
`FULL` – "Профессиональный", если кошелек уже ранее получал полную идентификацию по данным ФИО, номеру паспорта и дате рождения. 317 | birthDate |String | Дата рождения пользователя 318 | firstName| String | Имя пользователя 319 | middleName | String | Отчество пользователя 320 | lastName| String | Фамилия пользователя 321 | passport | String | Серия и номер паспорта пользователя 322 | inn| String| ИНН пользователя. Если в запросе параметр не заполнен, но присутствует в ответе, то идентификация кошелька выполнена. 323 | snils |String | Номер СНИЛС пользователя 324 | oms| String | Номер полиса ОМС пользователя 325 | 326 | ## Данные идентификации {#ident_data} 327 | 328 | Запрос позволяет выгрузить маскированные данные и статус идентификации своего QIWI кошелька. 329 | 330 |

Запрос → GET

331 | 332 | ~~~shell 333 | curl -X GET \ 334 | "https://edge.qiwi.com/identification/v1/persons/79111234567/identification" \ 335 | --header "Accept: application/json" \ 336 | --header "Authorization: Bearer <токен API>" 337 | ~~~ 338 | 339 | ~~~http 340 | GET /identification/v1/persons/79111234567/identification HTTP/1.1 341 | Accept: application/json 342 | Authorization: Bearer <токен API> 343 | Host: edge.qiwi.com 344 | ~~~ 345 | 346 |
    347 |
  • URL /identification/v1/persons/wallet/identification

    348 |
      349 |
    • wallet - номер вашего кошелька без знака "+"
    • 350 |
    351 |
  • 352 |
353 | 354 |
    355 |
  • HEADERS

    356 |
      357 |
    • Accept: application/json
    • 358 |
    • Authorization: Bearer ***
    • 359 |
    360 |
  • 361 |
362 | 363 |

Ответ ←

364 | 365 | ~~~http 366 | HTTP/1.1 200 OK 367 | Content-Type: application/json 368 | 369 | { 370 | "birthDate": "1996-03-18", 371 | "firstName": "Иван", 372 | "id": 79111234567, 373 | "inn": "77***01", 374 | "lastName": "Иванов", 375 | "middleName": "Иванович", 376 | "oms": "", 377 | "passport": "43***11", 378 | "snils": "", 379 | "type": "VERIFIED" 380 | } 381 | ~~~ 382 | 383 | Успешный ответ в формате JSON содержит маскированные данные идентификации кошелька: 384 | 385 | Поле ответа |Тип|Описание 386 | --------|----|---- 387 | id| Number |Номер кошелька пользователя 388 | type | String | Текущий статус кошелька:
`SIMPLE` - "Минимальный".
`VERIFIED` - "Основной" (данные для идентификации успешно прошли проверку).
`FULL` – "Профессиональный", если кошелек уже ранее получал полную идентификацию по данным ФИО, номеру паспорта и дате рождения. 389 | birthDate |String | Дата рождения пользователя 390 | firstName| String | Имя пользователя 391 | middleName | String | Отчество пользователя 392 | lastName| String | Фамилия пользователя 393 | passport | String | Серия и номер паспорта пользователя (первые и последние 2 цифры) 394 | inn| String| ИНН пользователя (первые и последние 2 цифры) 395 | snils |String | Номер СНИЛС пользователя (первые и последние 2 цифры) 396 | oms| String | Номер полиса ОМС пользователя (первые и последние 2 цифры) 397 | 398 | ## Понижение уровня идентификации {#ident-downgrade} 399 | 400 | Вы можете понизить уровень идентификации вашего QIWI кошелька. 401 | На данный момент понижение доступно только с уровня "Профессиональный" до уровня "Основной". 402 | 403 | Для понижения уровня необходимо сделать 2 запроса: 404 | 405 | * Создание заявки на понижение уровня идентификации. 406 | * Подтверждение заявки на понижение уровня идентификации. 407 | 408 | ### Создание заявки на понижение уровня идентификации {#create-downgrade} 409 | 410 |

Запрос → POST

411 | 412 | ~~~shell 413 | curl -X POST \ 414 | "https://edge.qiwi.com/qw-ident-downgrade-api/v1/persons/79111234567/identification-downgrade/operations" \ 415 | --header "Accept: application/json" \ 416 | --header "Content-Type: application/json" \ 417 | --header "Authorization: Bearer <токен API>" \ 418 | -d '{ 419 | "identificationLevel": "VERIFIED" 420 | }' 421 | ~~~ 422 | 423 | ~~~http 424 | POST /qw-ident-downgrade-api/v1/persons/79111234567/identification-downgrade/operations HTTP/1.1 425 | Accept: application/json 426 | Authorization: Bearer <токен API> 427 | Content-type: application/json 428 | Host: edge.qiwi.com 429 | 430 | { 431 | "identificationLevel": "VERIFIED" 432 | } 433 | ~~~ 434 | 435 |
    436 |
  • URL /qw-ident-downgrade-api/v1/persons/wallet/identification-downgrade/operations

    437 |
      438 |
    • wallet - номер вашего кошелька без знака "+"
    • 439 |
    440 |
  • 441 |
442 | 443 |
    444 |
  • HEADERS

    445 |
      446 |
    • Accept: application/json
    • 447 |
    • Content-type: application/json
    • 448 |
    • Authorization: Bearer ***
    • 449 |
    450 |
  • 451 |
452 | 453 |
    454 |
  • Параметры

    Данные параметры передаются в JSON-теле запроса: 455 |
  • 456 |
457 | 458 | 459 | Название|Тип|Описание 460 | --------|----|---- 461 | identificationLevel|String| Уровень, до которого требуется понизить идентификацию (на данный момент понижение возможно только до статуса "Основной" - `VERIFIED`) 462 | 463 |

Ответ ←

464 | 465 | ~~~http 466 | HTTP/1.1 200 OK 467 | Content-Type: application/json 468 | 469 | { 470 | "downgradeOperationId": "1747ea28-1082-41bc-bde4-72994b3ffeb4" 471 | } 472 | ~~~ 473 | 474 | Успешный ответ в формате JSON содержит ID заявки на понижение уровня идентификации: 475 | 476 | Поле ответа | Тип |Описание 477 | --------|--------|---- 478 | downgradeOperationId| String |ID заявки на понижение уровня идентификации 479 | 480 | ### Подтверждение заявки на понижение уровня идентификации {#confirm-downgrade} 481 | 482 |

Запрос → PUT

483 | 484 | ~~~shell 485 | curl -X PUT \ 486 | https://edge.qiwi.com/qw-ident-downgrade-api/v1/persons/79111234567/identification-downgrade/operations/1747ea28-1082-41bc-bde4-72994b3ffeb4/confirm \ 487 | --header "Accept: application/json" \ 488 | --header "Content-Type: application/json" \ 489 | --header "Authorization: Bearer <токен API>" \ 490 | -d '{}' 491 | ~~~ 492 | 493 | ~~~http 494 | PUT /qw-ident-downgrade-api/v1/persons/79111234567/identification-downgrade/operations/1747ea28-1082-41bc-bde4-72994b3ffeb4/confirm HTTP/1.1 495 | Accept: application/json 496 | Authorization: Bearer <токен API> 497 | Content-type: application/json 498 | Host: edge.qiwi.com 499 | 500 | {} 501 | ~~~ 502 | 503 |
    504 |
  • URL /qw-ident-downgrade-api/v1/persons/wallet/identification-downgrade/operations/downgradeOperationId/confirm

    505 |
      506 |
    • wallet - номер вашего кошелька без знака "+"
    • 507 |
    • downgradeOperationId - ID вашей заявки на понижение уровня идентификации
    • 508 |
    509 |
  • 510 |
511 | 512 |
    513 |
  • HEADERS

    514 |
      515 |
    • Accept: application/json
    • 516 |
    • Content-type: application/json
    • 517 |
    • Authorization: Bearer ***
    • 518 |
    519 |
  • 520 |
521 | 522 |

Ответ ←

523 | 524 | ~~~http 525 | HTTP/1.1 200 OK 526 | Content-Type: application/json 527 | { 528 | "downgradeOperation": { 529 | "downgradeOperationId": "1747ea28-1082-41bc-bde4-72994b3ffeb4", 530 | "status": { 531 | "type": "IN_PROGRESS" 532 | } 533 | } 534 | } 535 | ~~~ 536 | 537 | Успешный ответ в формате JSON содержит информацию о заявке на понижение уровня идентификации: 538 | 539 | Поле ответа | Тип |Описание 540 | --------|--------|---- 541 | downgradeOperation.downgradeOperationId| String |ID заявки на понижение уровня идентификации 542 | downgradeOperation.status.type| String |Статус заявки на понижение уровня идентификации.
`IN_PROGRESS` - Заявка на понижение уровня идентификации в обработке. Вы можете проверять текущий статус заявки отдельным запросом (см. ниже).
`SUCCESS` - Заявка на понижение уровня идентификации успешно обработана.
`FAIL` – Понижение уровня идентификации невозможно. 543 | 544 | ### Запрос статуса заявки на понижение уровня идентификации {#status-downgrade} 545 | 546 |

Запрос → GET

547 | 548 | ~~~shell 549 | curl -X GET \ 550 | https://edge.qiwi.com/qw-ident-downgrade-api/v1/persons/79111234567/identification-downgrade/operations/1747ea28-1082-41bc-bde4-72994b3ffeb4 \ 551 | --header "Accept: application/json" \ 552 | --header "Authorization: Bearer <токен API>" 553 | ~~~ 554 | 555 | ~~~http 556 | GET /qw-ident-downgrade-api/v1/persons/79111234567/identification-downgrade/operations/1747ea28-1082-41bc-bde4-72994b3ffeb4 HTTP/1.1 557 | Accept: application/json 558 | Authorization: Bearer <токен API> 559 | Host: edge.qiwi.com 560 | ~~~ 561 | 562 |
    563 |
  • URL /qw-ident-downgrade-api/v1/persons/wallet/identification-downgrade/operations/downgradeOperationId

    564 |
      565 |
    • wallet - номер вашего кошелька без знака "+"
    • 566 |
    • downgradeOperationId - ID вашей заявки на понижение уровня идентификации
    • 567 |
    568 |
  • 569 |
570 | 571 |
    572 |
  • HEADERS

    573 |
      574 |
    • Accept: application/json
    • 575 |
    • Authorization: Bearer ***
    • 576 |
    577 |
  • 578 |
579 | 580 |

Ответ ←

581 | 582 | ~~~http 583 | HTTP/1.1 200 OK 584 | Content-Type: application/json 585 | { 586 | "downgradeOperation": { 587 | "downgradeOperationId": "1747ea28-1082-41bc-bde4-72994b3ffeb4", 588 | "status": { 589 | "type": "SUCCESS" 590 | } 591 | } 592 | } 593 | ~~~ 594 | 595 | Успешный ответ в формате JSON содержит информацию о заявке на понижение уровня идентификации: 596 | 597 | Поле ответа | Тип |Описание 598 | --------|--------|---- 599 | downgradeOperation.downgradeOperationId| String |ID заявки на понижение уровня идентификации 600 | downgradeOperation.status.type| String |Статус заявки на понижение уровня идентификации.
`IN_PROGRESS` - Заявка на понижение уровня идентификации в обработке.
`SUCCESS` - Заявка на понижение уровня идентификации успешно обработана.
`FAIL` – Понижение уровня идентификации невозможно. 601 | 602 | # Лимиты QIWI Кошелька {#limits} 603 | 604 | ## Уровни лимитов {#limit-levels} 605 | 606 | Запрос возвращает текущие уровни лимитов по операциям в вашем QIWI кошельке. Лимиты действуют как ограничения на сумму определенных операций. 607 | 608 |

Запрос → GET

609 | 610 | ~~~shell 611 | curl "https://edge.qiwi.com/qw-limits/v1/persons/79115221133/actual-limits?types%5B0%5D=TURNOVER" \ 612 | --header "Accept: application/json" \ 613 | --header "Authorization: Bearer <токен API>" 614 | ~~~ 615 | 616 | ~~~http 617 | GET /qw-limits/v1/persons/79115221133/actual-limits?types%5B0%5D=TURNOVER HTTP/1.1 618 | Accept: application/json 619 | Authorization: Bearer <токен API> 620 | Host: edge.qiwi.com 621 | ~~~ 622 | 623 | ~~~python 624 | import requests 625 | 626 | # Все лимиты QIWI Кошелька 627 | def limits(login, api_access_token): 628 | types = [ 'TURNOVER', 'REFILL', 'PAYMENTS_P2P', 'PAYMENTS_PROVIDER_INTERNATIONALS', 'PAYMENTS_PROVIDER_PAYOUT', 'WITHDRAW_CASH'] 629 | s = requests.Session() 630 | s.headers['Accept']= 'application/json' 631 | s.headers['Content-Type']= 'application/json' 632 | s.headers['authorization'] = 'Bearer ' + api_access_token 633 | parameters = {} 634 | for i, type in enumerate(types): 635 | parameters['types[' + str(i) + ']'] = type 636 | b = s.get('https://edge.qiwi.com/qw-limits/v1/persons/' + login + '/actual-limits', params = parameters) 637 | return b.json() 638 | ~~~ 639 | 640 |
    641 |
  • URL /qw-limits/v1/persons/personId/actual-limits?parameter=value

    642 |
      643 |
    • personId - номер вашего кошелька без знака "+"
    • 644 |
    645 |
  • 646 |
647 | 648 |
    649 |
  • HEADERS

    650 |
      651 |
    • Accept: application/json
    • 652 |
    • Authorization: Bearer ***
    • 653 |
    654 |
  • 655 |
656 | 657 |
    658 |
  • Параметры

    Данные параметры передаются в строке запроса: 659 |
  • 660 |
661 | 662 | 663 | Название|Тип|Описание 664 | --------|----|---- 665 | types|Array[String]|Список типов операций, по которым запрашиваются лимиты. Каждый тип нумеруется элементом массива, начиная с нуля (`types[0]`, `types[1]` и т.д.). Допустимые типы операций:
`REFILL` - максимальный допустимый остаток на счёте
`TURNOVER` - оборот в месяц
`PAYMENTS_P2P` - переводы на другие кошельки в месяц
`PAYMENTS_PROVIDER_INTERNATIONALS` - платежи в адрес иностранных компаний в месяц
`PAYMENTS_PROVIDER_PAYOUT` - Переводы на банковские счета и карты, кошельки других систем
`WITHDRAW_CASH` - снятие наличных в месяц. Должен быть указан хотя бы один тип операций. 666 | 667 |

Ответ ←

668 | 669 | ~~~http 670 | HTTP/1.1 200 OK 671 | Content-Type: application/json 672 | 673 | { 674 | "limits":{ 675 | "RU" :[ 676 | { 677 | "type": "TURNOVER", 678 | "currency": "RUB", 679 | "rest": 200.00, 680 | "max": 40000.00, 681 | "spent": 39800.00, 682 | "interval": { 683 | "dateFrom": "2019-11-01T:00:00", 684 | "dateTill": "2019-12-01T00:00" 685 | } 686 | }, 687 | ... 688 | ] 689 | } 690 | } 691 | ~~~ 692 | 693 | ~~~python 694 | # номер кошелька в формате 79992223344 695 | mylogin = '79999999999' 696 | api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' 697 | 698 | # все лимиты (список) 699 | limits = limits(mylogin,api_access_token)['limits']['RU'] 700 | 701 | # лимит оборота 702 | turnoverInfo = [x for x in limits if x['type'] == 'TURNOVER'] 703 | turnoverLimit = turnoverInfo[0]['rest'] 704 | ~~~ 705 | 706 | Успешный ответ содержит JSON-массив лимитов по операциям вашего QIWI Кошелька: 707 | 708 | Поле ответа |Тип|Описание 709 | --------|----|---- 710 | limits|Object|Описание лимитов 711 | limits[].'RU'|Array[Object]| Массив лимитов на операции 712 | type | String |Тип операций, на которые действует этот лимит 713 | currency | String |Валюта операций 714 | max | String |Значение лимита 715 | spent|String|Сумма, потраченная по данным операциям 716 | rest|Boolean|Остаток лимита, который можно потратить в указанный период (период задается в параметре `interval`) 717 | interval|Object|Сведения о периоде действия лимита 718 | interval.dateFrom, interval.dateTill| String| Начало и конец периода, формат даты `ГГГГ-ММ-ДДТЧЧ:ММ:ССtmz` 719 | 720 | ## Лимит по операциям с физлицами {#p2p-limit} 721 | 722 | Запрос возвращает значение количества операций с физлицами за текущий месяц в вашем QIWI кошельке. 723 | 724 |

Запрос → GET

725 | 726 | ~~~shell 727 | curl "https://edge.qiwi.com/qw-limits/v1/persons/79999999999/p2p-payment-count-limit" \ 728 | --header "Accept: application/json" \ 729 | --header "Authorization: Bearer <токен API>" 730 | ~~~ 731 | 732 | ~~~http 733 | GET /qw-limits/v1/persons/79999999999/p2p-payment-count-limit HTTP/1.1 734 | Accept: application/json 735 | Authorization: Bearer <токен API> 736 | Host: edge.qiwi.com 737 | ~~~ 738 | 739 | ~~~python 740 | import requests 741 | 742 | # Количество операций с физлицами 743 | def get_p2p_payment_count(login, api_access_token): 744 | s = requests.Session() 745 | s.headers['Accept']= 'application/json' 746 | s.headers['Content-Type']= 'application/json' 747 | s.headers['authorization'] = 'Bearer ' + api_access_token 748 | b = s.get('https://edge.qiwi.com/qw-limits/v1/persons/' + login + '/p2p-payment-count-limit') 749 | return b.json() 750 | ~~~ 751 | 752 |
    753 |
  • URL /qw-limits/v1/persons/personId/p2p-payment-count-limit

    754 |
      755 |
    • personId - номер вашего кошелька без знака "+"
    • 756 |
    757 |
  • 758 |
759 | 760 |
    761 |
  • HEADERS

    762 |
      763 |
    • Accept: application/json
    • 764 |
    • Authorization: Bearer ***
    • 765 |
    766 |
  • 767 |
768 | 769 |

Ответ ←

770 | 771 | ~~~http 772 | HTTP/1.1 200 OK 773 | Content-Type: application/json 774 | 775 | { 776 | "p2pPaymentCountLimit": 1 777 | } 778 | ~~~ 779 | 780 | ~~~python 781 | mylogin = '79999999999' 782 | api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' 783 | 784 | # Количество операций с физлицами за текущий месяц 785 | print(get_p2p_payment_count(api_access_token, mylogin)) 786 | 787 | {'p2pPaymentCountLimit': 1} 788 | 789 | ~~~ 790 | Успешный ответ в формате JSON содержит информацию по операциям вашего QIWI Кошелька: 791 | 792 | Поле ответа | Тип |Описание 793 | --------|--------|---- 794 | p2pPaymentCountLimit| Number |Kоличество операций с физлицами в месяце 795 | 796 | # Проверка ограничений исходящих платежей с QIWI Кошелька {#restrictions} 797 | 798 | Следующий запрос проверяет, есть ли ограничение на исходящие платежи с QIWI Кошелька. 799 | 800 |

Запрос → GET

801 | 802 | ~~~shell 803 | curl "https://edge.qiwi.com/person-profile/v1/persons/79115221133/status/restrictions" \ 804 | --header "Accept: application/json" \ 805 | --header "Authorization: Bearer <токен API>" 806 | ~~~ 807 | 808 | ~~~http 809 | GET /person-profile/v1/persons/79115221133/status/restrictions HTTP/1.1 810 | Accept: application/json 811 | Authorization: Bearer <токен API> 812 | Host: edge.qiwi.com 813 | ~~~ 814 | 815 | ~~~python 816 | import requests 817 | 818 | # Блокировки 819 | def get_restrictions(api_access_token, mylogin): 820 | s7 = requests.Session() 821 | s7.headers['Accept']= 'application/json' 822 | s7.headers['authorization'] = 'Bearer ' + api_access_token 823 | p = s7.get('https://edge.qiwi.com/person-profile/v1/persons/' + mylogin + '/status/restrictions') 824 | return p.json() 825 | ~~~ 826 | 827 |
    828 |
  • URL /person-profile/v1/persons/personId/status/restrictions

    829 |
      830 |
    • personId - номер вашего кошелька без знака "+"
    • 831 |
    832 |
  • 833 |
834 | 835 |
    836 |
  • HEADERS

    837 |
      838 |
    • Accept: application/json
    • 839 |
    • Authorization: Bearer ***
    • 840 |
    841 |
  • 842 |
843 | 844 |

Ответ ←

845 | 846 | ~~~http 847 | HTTP/1.1 200 OK 848 | Content-Type: application/json 849 | 850 | [ 851 | { 852 | "restrictionCode": "OUTGOING_PAYMENTS", 853 | "restrictionDescription": "Исходящие платежи заблокированы" 854 | } 855 | ] 856 | ~~~ 857 | 858 | ~~~python 859 | mylogin = '79999999999' 860 | api_access_token = '975efd8e8376xxxb95fa7cb213xxx04' 861 | print(get_restrictions(api_access_token, mylogin)) 862 | 863 | [ 864 | { 865 | "restrictionCode": "OUTGOING_PAYMENTS", 866 | "restrictionDescription": "Исходящие платежи заблокированы" 867 | } 868 | ] 869 | ~~~ 870 | 871 | Успешный ответ содержит JSON-массив ограничений кошелька с их описанием: 872 | 873 | Поле ответа |Тип|Описание 874 | --------|----|---- 875 | restrictionCode| String |Код блокировки 876 | restrictionDescription| String |Описание блокировки 877 | 878 | Возможные значения: 879 | 880 | restrictionCode |restrictionDescription 881 | --------|---- 882 | OUTGOING_PAYMENTS| Исходящие платежи заблокированы 883 | 884 | Если ограничений нет, возвращается пустой массив. 885 | -------------------------------------------------------------------------------- /_webhook_en.html.md: -------------------------------------------------------------------------------- 1 | # Callbacks {#webhook} 2 | 3 | ###### [Edit on GitHub](https://github.com/QIWI-API/qiwi-wallet-personal-docs/blob/master/_webhook_en.html.md) 4 | 5 | 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](#hook_format). 6 | 7 | **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.** 8 | 9 | Pools of IP-addresses from which QIWI service sends notifications: 10 | 11 | * 79.142.16.0/20 12 | * 195.189.100.0/22 13 | * 91.232.230.0/23 14 | * 91.213.51.0/24 15 | 16 | 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. 17 | 18 | ## Quick start {#quick_hook} 19 | 20 | 0. Implement web service for [webhook requests](#hook_format). Make sure to implement correctly the digital signature verification. 21 | 1. [Register your service](#hook_reg). **Please note that its URL original length (before URL-encoding) cannot be longer than 100 symbols**. 22 | 2. Request for [signature key](#hook_key). 23 | 3. Test your service with [test request](#hook_test). Empty notification will be sent to your service registered at stage 2. 24 | 25 | To change webhook service URL: 26 | 27 | 1. [Remove current webhook service](#hook_remove). 28 | 2. [Register new webhook service](#hook_reg). **Please note that its URL original length (before URL-encoding) cannot be longer than 100 symbols**. 29 | 3. Request for new [signature key](#hook_key). 30 | 4. Test your service with [test request](#hook_test). Empty notification will be sent to your service registered at stage 2. 31 | 32 | ## Processing notification {#hook_format} 33 | 34 | > Outgoing payments - notification of payment in process 35 | 36 | ~~~http 37 | POST /some-hook.php HTTP/1.1 38 | Accept: application/json 39 | Content-type: application/json 40 | Host: example.com 41 | 42 | {"hash": "50779a03d90c4fa60ac44dfd158dbceec0e9c57fa4cf4f5298450fdde1868945", 43 | "hookId": "f57f95e2-149f-4278-b2cb-4114bc319727", 44 | "messageId": "f9a197a8-26b6-4d42-aac4-d86b789c373c", 45 | "payment": {"account": "myAccount", 46 | "comment": "My comment", 47 | "commission": Null, 48 | "date": "2018-05-18T16:05:15+03:00", 49 | "errorCode": "0", 50 | "personId": 79254914194, 51 | "provider": 25549, 52 | "signFields": "sum.currency,sum.amount,type,account,txnId", 53 | "status": "WAITING", 54 | "sum": {"amount": 1.73, "currency": 643}, 55 | "total": {"amount": 1.73, "currency": 643}, 56 | "txnId": "13117338074", 57 | "type": "OUT"}, 58 | "test": false, 59 | "version": "1.0.0"} 60 | ~~~ 61 | 62 | > Outgoing payment - notification of successful payment 63 | 64 | ~~~http 65 | POST /some-hook.php HTTP/1.1 66 | Accept: application/json 67 | Content-type: application/json 68 | Host: example.com 69 | 70 | {"hash": "50779a03d90c4fa60ac44dfd158dbceec0e9c57fa4cf4f5298450fdde1868945", 71 | "hookId": "f57f95e2-149f-4278-b2cb-4114bc319727", 72 | "messageId": "6e2a0e32-4c8d-4fe2-9eed-fe3b6a726ff4", 73 | "payment": {"account": "thedandod", 74 | "comment": "My comment", 75 | "commission": {"amount": 0.0, "currency": 643}, 76 | "date": "2018-05-18T16:05:15+03:00", 77 | "errorCode": "0", 78 | "personId": 79254914194, 79 | "provider": 25549, 80 | "signFields": "sum.currency,sum.amount,type,account,txnId", 81 | "status": "SUCCESS", 82 | "sum": {"amount": 1.73, "currency": 643}, 83 | "total": {"amount": 1.73, "currency": 643}, 84 | "txnId": "13117338074", 85 | "type": "OUT"}, 86 | "test": false, 87 | "version": "1.0.0"} 88 | ~~~ 89 | 90 | > Outgoing payments - notification of unsuccessful payment 91 | 92 | ~~~http 93 | POST /some-hook.php HTTP/1.1 94 | Accept: application/json 95 | Content-type: application/json 96 | Host: example.com 97 | 98 | {"hash": "0637b07b1018d76585db26b0f8077016b12996006429e22a7dc5b6982710a1ef", 99 | "hookId": "f57f95e2-149f-4278-b2cb-4114bc319727", 100 | "messageId": "1133873b-9bb6-4adb-9bfe-7be3a9aa999f", 101 | "payment": {"account": "borya241203", 102 | "comment": "", 103 | "commission": None, 104 | "date": "2018-05-20T05:19:16+03:00", 105 | "errorCode": "5", 106 | "personId": 79254914194, 107 | "provider": 25549, 108 | "signFields": "sum.currency,sum.amount,type,account,txnId", 109 | "status": "ERROR", 110 | "sum": {"amount": 1.01, "currency": 643}, 111 | "total": {"amount": 1.01, "currency": 643}, 112 | "txnId": "13126423989", 113 | "type": "OUT"}, 114 | "test": false, 115 | "version": "1.0.0"} 116 | ~~~ 117 | 118 | > Incoming payment - notification of successful payment 119 | 120 | ~~~http 121 | POST /some-hook.php HTTP/1.1 122 | Accept: application/json 123 | Content-type: application/json 124 | Host: example.com 125 | 126 | {"hash": "a56ed0090fa3fd2fd0b002ed80f85a120037a6a85f840938888275e1631da96f", 127 | "hookId": "8c79f60d-0272-476b-b120-6e7629467328", 128 | "messageId": "bba24947-ab5f-4b33-881b-738fc3a4c9e1", 129 | "payment": {"account": "79042426915", 130 | "comment": "Replenishing wallet", 131 | "commission": {"amount": 0.0, "currency": 643}, 132 | "date": "2018-03-25T13:16:48+03:00", 133 | "errorCode": "0", 134 | "personId": 79645265240, 135 | "provider": 7, 136 | "signFields": "sum.currency,sum.amount,type,account,txnId", 137 | "status": "SUCCESS", 138 | "sum": {"amount": 1.09, "currency": 643}, 139 | "total": {"amount": 1.09, "currency": 643}, 140 | "txnId": "12565018935", 141 | "type": "IN"}, 142 | "test": false, 143 | "version": "1.0.0"} 144 | ~~~ 145 | 146 | Each notification is an incoming POST-request with single payment data in JSON body. JSON scheme is as followed: 147 | 148 | Field | Type | Description 149 | ----|------|------- 150 | hookId | String (UUID) | Unique webhook id 151 | messageId | String (UUID) | Unique notification id 152 | payment | Object | Payment data 153 | payment.txnId | String | QIWI Wallet transaction ID 154 | payment.account | String | For outgoing payments - recipients account number. For incoming payments - sender number, self-service kiosk number, or top-up agent name 155 | 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) 156 | payment.personId | Integer | Your wallet number 157 | payment.date | String DateTime | Payment date/time, in Moscow time zone, as `YYYY-MM-DD'T'hh:mm:ss+03:00` 158 | payment.errorCode | String | [Payment error code](#errorCode) 159 | payment.type | String | Payment type:
`IN` - wallet top-up,
`OUT` - payment 160 | payment.status|String|Payment status:
`WAITING` - payment in process,
`SUCCESS` - successful payment,
`ERROR` - payment error. 161 | payment.provider | Integer| Provider ID in QIWI Wallet 162 | payment.comment | String | Transaction comment 163 | payment.sum | Object | Payment amount data 164 | ----|----|--- 165 | sum.amount|Number(Decimal)|Amount 166 | sum.currency|Number(3)|Currency code 167 | ----|----|---- 168 | payment.commission|Object| Payment commission 169 | ----|----|---- 170 | commission.amount|Number(Decimal)|Commission amount 171 | commission.currency|Number(3)|Currency code 172 | ----|----|---- 173 | payment.total|Object|Total payment amount 174 | ----|----|---- 175 | total.amount|Number(Decimal)|Amount 176 | total.currency|Number(3)|Currency code 177 | ----|----|---- 178 | test|Boolean|Flag indicating test notification 179 | version|String|Webhook API version 180 | hash|String| Hash of the notification's digital signature 181 | 182 | ### Notification signature verification {#webhook-signature-verification} 183 | 184 | ~~~php 185 | $value) { 208 | if ($name == 'hash') { 209 | $SIGN_REQ = $value; 210 | } 211 | } 212 | return [$reqparams, $SIGN_REQ]; 213 | } 214 | // Resulted data 215 | $Request = getReqParams(); 216 | // Base64 encoded key for decryption (method /hook/{hookId}/key) 217 | $NOTIFY_PWD = "JcyVhjHCvHQwufz+IHXolyqHgEc5MoayBfParl6Guoc="; 218 | // Get SHA-256 hash of the string and encrypt with your webhook key 219 | $reqres = hash_hmac("sha256", $Request[0], base64_decode($NOTIFY_PWD)); 220 | // Verify signature 221 | if (hash_equals($reqres, $Request[1])) { 222 | $error = array('response' => 'OK'); 223 | } 224 | else $error = array('response' => 'error'); 225 | //Response 226 | header('Content-Type: application/json'); 227 | $jsonres = json_encode($error); 228 | echo $jsonres; 229 | error_log('error code' . $jsonres); 230 | ?> 231 | ~~~ 232 | 233 | ~~~python 234 | import base64 235 | import hmac 236 | import hashlib 237 | 238 | # Base64 encoded key (get it with /hook/{hookId}/key request) 239 | webhook_key_base64 = 'JcyVhjHCvHQwufz+IHXolyqHgEc5MoayBfParl6Guoc=' 240 | # notification parameters 241 | data = '643|1|IN|+79161112233|13353941550' 242 | webhook_key = base64.b64decode(bytes(webhook_key_base64,'utf-8')) 243 | print(hmac.new(webhook_key, data.encode('utf-8'), hashlib.sha256).hexdigest()) 244 | ~~~ 245 | 246 | To verify signature of a notification, proceed with the following: 247 | 248 | 1. Take values of fields specified in `payment.signFields` field of the notification JSON (**in the same order**) as Strings. 249 | 2. Join them with `|` separator. 250 | 3. Encode the resulted string with SHA-256 and [signature key](#hook_key). 251 | 4. Compare obtained value with `hash` field of the notification. 252 | 253 | Example of signature verification (see also PHP procedure on the right tab): 254 | 255 | 1. You get [signature key](#hook_key), encoded in Base64: 256 | `JcyVhjHCvHQwufz+IHXolyqHgEc5MoayBfParl6Guoc=` 257 | 2. You get notification: 258 | `{"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}` 259 | 3. Join values of the fields specified in `signFields` field (`sum.currency,sum.amount,type,account,txnId`): 260 | `643|1|IN|+79161112233|13353941550` 261 | 4. The obtained string is encoded with SHA-256 and the Base64-decoded key from step 1: 262 | `f05c4e7bdf00620205d47696d77f924bfd3ba4d02b0398ac8a626e737dc27243` 263 | Result coincides with `hash` field from the notification. The verification is successful. 264 | 265 | ## Webhook service registration {#hook_reg} 266 | 267 |

Request → PUT

268 | 269 | ~~~shell 270 | curl -X PUT \ 271 | "https://edge.qiwi.com/payment-notifier/v1/hooks?hookType=1¶m=http%3A%2F%2Fexample.com%2Fcallbacks%2F&txnType=2" \ 272 | -H "accept: */*" \ 273 | -H "authorization: Bearer " 274 | ~~~ 275 | 276 | ~~~http 277 | PUT /payment-notifier/v1/hooks?hookType=1¶m=http%3A%2F%2Fexample.com%2Fcallbacks%2F&txnType=2 HTTP/1.1 278 | Host: edge.qiwi.com 279 | Authorization: Bearer 280 | User-Agent: **** 281 | ~~~ 282 | 283 | 286 | 287 |
    288 |
  • HEADERS

    289 |
      290 |
    • Authorization: Bearer ***
    • 291 |
    • Accept: application/json
    • 292 |
    293 |
  • 294 |
295 | 296 |
    297 |
  • Parameters

    Send parameters in the request query. All parameters are required. 298 |
  • 299 |
300 | 301 | Name|Type|Description 302 | ----|-----|------ 303 | hookType|Integer|Webhook type. Only `1`. 304 | param|URL-encoded| Service URL. URL original length (before URL-encoding) must be within 100 symbols. **URL must be accessible from the Internet**. 305 | txnType|String| Choose type of transactions for notifications:
0 - only incoming transactions (wallet top-up);
1 - only outgoing transactions (payments);
2 - all transactions 306 | 307 |

Response ←

308 | 309 | ~~~http 310 | HTTP/1.1 200 OK 311 | Content-Type: application/json 312 | 313 | { 314 | "hookId":"d63a8729-f5c8-486f-907d-9fb8758afcfc", 315 | "hookParameters":{ 316 | "url":"http://example.com/callbacks/" 317 | }, 318 | "hookType":"WEB", 319 | "txnType":"BOTH" 320 | } 321 | ~~~ 322 | 323 | Response in JSON. 324 | 325 | Field|Type|Description 326 | -----|------|------ 327 | hookId|String|Webhook service UUID 328 | hookParameters|Object|Webhook service parameters 329 | hookParameters.url|String| Webhook service URL 330 | hookType|String|Webhook type (only `WEB`) 331 | txnType|String|Transactions type for notifications (`IN` - incoming, `OUT` - outgoing, `BOTH` - all) 332 | 333 | ## Remove webhook service registration {#hook_remove} 334 | 335 |

Request → DELETE

336 | 337 | ~~~shell 338 | curl -X DELETE \ 339 | "https://edge.qiwi.com/payment-notifier/v1/hooks/" \ 340 | -H "accept: */*" \ 341 | -H "authorization: Bearer " 342 | ~~~ 343 | 344 | ~~~http 345 | DELETE /payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc HTTP/1.1 346 | Host: edge.qiwi.com 347 | Authorization: Bearer 348 | User-Agent: **** 349 | ~~~ 350 | 351 |
    352 |
  • URL /payment-notifier/v1/hooks/hookId

  • 353 |
      354 |
    • hookId - webhook UUID
    • 355 |
    356 |
357 | 358 |
    359 |
  • HEADERS

    360 |
      361 |
    • Authorization: Bearer ***
    • 362 |
    • Accept: application/json
    • 363 |
    364 |
  • 365 |
366 | 367 |

Response ←

368 | 369 | ~~~http 370 | HTTP/1.1 200 OK 371 | Content-Type: application/json 372 | 373 | { 374 | "response":"Hook deleted" 375 | } 376 | ~~~ 377 | 378 | Response in JSON. 379 | 380 | Field|Type|Description 381 | -----|------|------ 382 | response|String| Operation result 383 | 384 | ## Secret key provision {#hook_key} 385 | 386 | Each notification contains digital signature encoded by secret key. Use this request to get the key. 387 | 388 |

Request → GET

389 | 390 | ~~~shell 391 | curl -X GET \ 392 | "https://edge.qiwi.com/payment-notifier/v1/hooks//key" \ 393 | -H "accept: */*" \ 394 | -H "accept: */*" \ 395 | -H "authorization: Bearer " 396 | ~~~ 397 | 398 | ~~~http 399 | GET /payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc/key HTTP/1.1 400 | Host: edge.qiwi.com 401 | Authorization: Bearer 402 | User-Agent: **** 403 | ~~~ 404 | 405 |
    406 |
  • URL /payment-notifier/v1/hooks/hookId/key

  • 407 |
      408 |
    • hookId — webhook UUID
    • 409 |
    410 |
411 | 412 |
    413 |
  • HEADERS

    414 |
      415 |
    • Authorization: Bearer ***
    • 416 |
    • Accept: application/json
    • 417 |
    418 |
  • 419 |
420 | 421 |

Response ←

422 | 423 | ~~~http 424 | HTTP/1.1 201 Created 425 | Content-Type: application/json 426 | 427 | { 428 | "key":"L8UVF3JkLVUr6r70LiE0A9/5WoGGwWKG2pI/e+l/9fs=" 429 | } 430 | ~~~ 431 | 432 | Response in JSON. 433 | 434 | Field|Type|Description 435 | -----|------|------ 436 | key|String| Base64-encoded key 437 | 438 | ## Secret key change {#hook_secret} 439 | 440 | Changes the secret key for notifications signature. 441 | 442 |

Request → POST

443 | 444 | ~~~shell 445 | curl -X POST \ 446 | "https://edge.qiwi.com/payment-notifier/v1/hooks//newkey" \ 447 | -H "accept: */*" \ 448 | -H "authorization: Bearer " 449 | ~~~ 450 | 451 | ~~~http 452 | POST /payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc/newkey HTTP/1.1 453 | Host: edge.qiwi.com 454 | Authorization: Bearer 455 | User-Agent: **** 456 | ~~~ 457 | 458 |
    459 |
  • URL /payment-notifier/v1/hooks/hookId/newkey

  • 460 |
      461 |
    • hookId - webhook UUID
    • 462 |
    463 |
464 | 465 |
    466 |
  • HEADERS

    467 |
      468 |
    • Authorization: Bearer ***
    • 469 |
    • Accept: application/json
    • 470 |
    471 |
  • 472 |
473 | 474 |

Response ←

475 | 476 | ~~~http 477 | HTTP/1.1 201 Created 478 | Content-Type: application/json 479 | 480 | { 481 | "key":"OikS4/CcIbSf+yYGnLbnOige8RGoYmGxs/LNMwkJy7Q=" 482 | } 483 | ~~~ 484 | 485 | Response in JSON. 486 | 487 | Field|Type|Description 488 | -----|------|------ 489 | key|String|Base64-encoded new key 490 | 491 | ## Webhook service data {#hook_active} 492 | 493 | Gets the active webhook service linked to your wallet. 494 | 495 |

Request → GET

496 | 497 | ~~~shell 498 | curl -X GET \ 499 | "https://edge.qiwi.com/payment-notifier/v1/hooks/active" \ 500 | -H "accept: */*" \ 501 | -H "accept: */*" \ 502 | -H "authorization: Bearer " 503 | ~~~ 504 | 505 | ~~~http 506 | GET /payment-notifier/v1/hooks/active HTTP/1.1 507 | Host: edge.qiwi.com 508 | Authorization: Bearer 509 | User-Agent: **** 510 | ~~~ 511 | 512 |
    513 |
  • URL /payment-notifier/v1/hooks/active

  • 514 |
515 | 516 |
    517 |
  • HEADERS

    518 |
      519 |
    • Authorization: Bearer ***
    • 520 |
    • Accept: application/json
    • 521 |
    522 |
  • 523 |
524 | 525 |

Response ←

526 | 527 | ~~~http 528 | HTTP/1.1 200 OK 529 | Content-Type: application/json 530 | 531 | { 532 | "hookId":"d63a8729-f5c8-486f-907d-9fb8758afcfc", 533 | "hookParameters":{ 534 | "url":"http://example.com/callbacks/" 535 | }, 536 | "hookType":"WEB", 537 | "txnType":"BOTH" 538 | } 539 | ~~~ 540 | 541 | Response in JSON. 542 | 543 | Field|Type|Description 544 | -----|------|------ 545 | hookId|String|Active webhook UUID 546 | hookParameters|Object|Webhook service parameters 547 | hookParameters.url | String| Webhook URL 548 | hookType|String|Webhook type (only `WEB`) 549 | txnType|String|Transactions type for notifications (`IN` - incoming (wallet topup), `OUT` - outgoing (payments), `BOTH` - all) 550 | 551 | ## Test webhook service {#hook_test} 552 | 553 | 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](#hook_active). 554 | 555 |

Request → GET

556 | 557 | ~~~shell 558 | curl -X GET \ 559 | "https://edge.qiwi.com/payment-notifier/v1/hooks/test" \ 560 | -H "accept: */*" \ 561 | -H "authorization: Bearer " 562 | ~~~ 563 | 564 | ~~~http 565 | GET /payment-notifier/v1/hooks/test HTTP/1.1 566 | Host: edge.qiwi.com 567 | Authorization: Bearer 568 | User-Agent: **** 569 | ~~~ 570 | 571 |
    572 |
  • URL /payment-notifier/v1/hooks/test

  • 573 |
574 | 575 |
    576 |
  • HEADERS

    577 |
      578 |
    • Authorization: Bearer ***
    • 579 |
    • Accept: application/json
    • 580 |
    581 |
  • 582 |
583 | 584 |

Response ←

585 | 586 | ~~~http 587 | HTTP/1.1 200 OK 588 | Content-Type: application/json 589 | 590 | { 591 | "response":"Webhook sent" 592 | } 593 | ~~~ 594 | 595 | Response in JSON. 596 | 597 | Field|Type|Description 598 | -----|------|------ 599 | response|String| Notification on the request 600 | -------------------------------------------------------------------------------- /_webhook_ru.html.md: -------------------------------------------------------------------------------- 1 | # Уведомления (вебхуки) {#webhook} 2 | 3 | ###### [Предложить правки на GitHub](https://github.com/QIWI-API/qiwi-wallet-personal-docs/blob/master/_webhook_ru.html.md) 4 | 5 | Хуки или уведомления с данными о событии (платеже/пополнении) отправляются на ваш сервер. В настоящее время поддерживаются только вебхуки (webhook) - сообщения, адресованные веб-сервисам. Для приема вебхуков вам необходимо настроить свой сервер на прием и обработку POST-запросов ([Формат запросов](#hook_format)). 6 | 7 | **От вашего сервера успешный ответ 200 OK на входящий запрос должен поступить в течение 1-2 сек. Не дождавшись ответа, сервис КИВИ отправляет еще одно уведомление через 10 минут, потом еще одно через 1 час.** 8 | 9 | Пулы IP-адресов, с которых сервисы QIWI отправляют webhook: 10 | 11 | * 79.142.16.0/20 12 | * 195.189.100.0/22 13 | * 91.232.230.0/23 14 | * 91.213.51.0/24 15 | 16 | Если ваш сервер обработки вебхуков работает за брандмауэром, необходимо добавить эти IP-адреса в список разрешенных адресов входящих TCP-пакетов. 17 | 18 | ## Быстрый старт {#quick_hook} 19 | 20 | 0. Реализуйте веб-сервис обработки [запросов](#hook_format). Особое внимание обратите на реализацию проверки подписи. 21 | 1. [Зарегистрируйте свой обработчик](#hook_reg). **Внимание! Длина оригинального (не URL-encoded) адреса сервиса обработчика не должна превышать 100 символов.** 22 | 2. Запросите [ключ проверки подписи](#hook_key). 23 | 3. Протестируйте прием запросов вашим обработчиком с помощью [тестового запроса](#hook_test). На зарегистрированный в п.2 сервис придет пустое уведомление. 24 | 25 | Чтобы сменить адрес сервера для обработки вебхуков: 26 | 27 | 1. [Удалите обработчик вебхуков](#hook_remove). 28 | 2. [Зарегистрируйте новый обработчик](#hook_reg). **Внимание! Длина оригинального (не URL-encoded) адреса сервиса обработчика не должна превышать 100 символов.** 29 | 3. Запросите [ключ проверки подписи](#hook_key) для нового обработчика. 30 | 4. Протестируйте прием запросов новым обработчиком с помощью [тестового запроса](#hook_test). На зарегистрированный в п.2 сервис придет пустое уведомление. 31 | 32 | ## Обработка вебхука {#hook_format} 33 | 34 | > Исходящие платежи - платеж в проведении 35 | 36 | ~~~http 37 | POST /some-hook.php HTTP/1.1 38 | Accept: application/json 39 | Content-type: application/json 40 | Host: example.com 41 | 42 | {"hash": "50779a03d90c4fa60ac44dfd158dbceec0e9c57fa4cf4f5298450fdde1868945", 43 | "hookId": "f57f95e2-149f-4278-b2cb-4114bc319727", 44 | "messageId": "f9a197a8-26b6-4d42-aac4-d86b789c373c", 45 | "payment": {"account": "myAccount", 46 | "comment": "Комментарий", 47 | "commission": Null, 48 | "date": "2018-05-18T16:05:15+03:00", 49 | "errorCode": "0", 50 | "personId": 79254914194, 51 | "provider": 25549, 52 | "signFields": "sum.currency,sum.amount,type,account,txnId", 53 | "status": "WAITING", 54 | "sum": {"amount": 1.73, "currency": 643}, 55 | "total": {"amount": 1.73, "currency": 643}, 56 | "txnId": "13117338074", 57 | "type": "OUT"}, 58 | "test": false, 59 | "version": "1.0.0"} 60 | ~~~ 61 | 62 | > Исходящие платежи - успешный платеж 63 | 64 | ~~~http 65 | POST /some-hook.php HTTP/1.1 66 | Accept: application/json 67 | Content-type: application/json 68 | Host: example.com 69 | 70 | {"hash": "50779a03d90c4fa60ac44dfd158dbceec0e9c57fa4cf4f5298450fdde1868945", 71 | "hookId": "f57f95e2-149f-4278-b2cb-4114bc319727", 72 | "messageId": "6e2a0e32-4c8d-4fe2-9eed-fe3b6a726ff4", 73 | "payment": {"account": "masterDre", 74 | "comment": "Комментарий", 75 | "commission": {"amount": 0.0, "currency": 643}, 76 | "date": "2018-05-18T16:05:15+03:00", 77 | "errorCode": "0", 78 | "personId": 79254914194, 79 | "provider": 25549, 80 | "signFields": "sum.currency,sum.amount,type,account,txnId", 81 | "status": "SUCCESS", 82 | "sum": {"amount": 1.73, "currency": 643}, 83 | "total": {"amount": 1.73, "currency": 643}, 84 | "txnId": "13117338074", 85 | "type": "OUT"}, 86 | "test": false, 87 | "version": "1.0.0"} 88 | ~~~ 89 | 90 | > Исходящие платежи - неуспешный платеж 91 | 92 | ~~~http 93 | POST /some-hook.php HTTP/1.1 94 | Accept: application/json 95 | Content-type: application/json 96 | Host: example.com 97 | 98 | {"hash": "0637b07b1018d76585db26b0f8077016b12996006429e22a7dc5b6982710a1ef", 99 | "hookId": "f57f95e2-149f-4278-b2cb-4114bc319727", 100 | "messageId": "1133873b-9bb6-4adb-9bfe-7be3a9aa999f", 101 | "payment": {"account": "borya241203", 102 | "comment": "Комментарий", 103 | "commission": None, 104 | "date": "2018-05-20T05:19:16+03:00", 105 | "errorCode": "5", 106 | "personId": 79254914194, 107 | "provider": 25549, 108 | "signFields": "sum.currency,sum.amount,type,account,txnId", 109 | "status": "ERROR", 110 | "sum": {"amount": 1.01, "currency": 643}, 111 | "total": {"amount": 1.01, "currency": 643}, 112 | "txnId": "13126423989", 113 | "type": "OUT"}, 114 | "test": false, 115 | "version": "1.0.0"} 116 | ~~~ 117 | 118 | > Входящие платежи - успешный платеж 119 | 120 | ~~~http 121 | POST /some-hook.php HTTP/1.1 122 | Accept: application/json 123 | Content-type: application/json 124 | Host: example.com 125 | 126 | {"hash": "a56ed0090fa3fd2fd0b002ed80f85a120037a6a85f840938888275e1631da96f", 127 | "hookId": "8c79f60d-0272-476b-b120-6e7629467328", 128 | "messageId": "bba24947-ab5f-4b33-881b-738fc3a4c9e1", 129 | "payment": {"account": "79042426915", 130 | "comment": "Пополнение кошелька", 131 | "commission": {"amount": 0.0, "currency": 643}, 132 | "date": "2018-03-25T13:16:48+03:00", 133 | "errorCode": "0", 134 | "personId": 79645265240, 135 | "provider": 7, 136 | "signFields": "sum.currency,sum.amount,type,account,txnId", 137 | "status": "SUCCESS", 138 | "sum": {"amount": 1.09, "currency": 643}, 139 | "total": {"amount": 1.09, "currency": 643}, 140 | "txnId": "12565018935", 141 | "type": "IN"}, 142 | "test": false, 143 | "version": "1.0.0"} 144 | ~~~ 145 | 146 | Каждый вебхук посылает уведомления - входящие POST-запросы с JSON-объектом, содержащим данные об одном платеже. Схема объекта: 147 | 148 | Поле | Тип | Описание 149 | ----|------|------- 150 | hookId | String (UUID) | Уникальный id хука 151 | messageId | String (UUID) | Уникальный id уведомления 152 | payment | Object | Данные платежа 153 | payment.txnId | String | ID транзакции в процессинге QIWI Wallet 154 | payment.account | String | Для платежей - номер счета получателя. Для пополнений - номер отправителя, терминала или название агента пополнения кошелька 155 | payment.signFields | String | Список полей объекта `payment` (через `,`), которые хешируются алгоритмом HmacSHA256 для проверки уведомления (см. параметр `hash`) 156 | payment.personId | Integer | Номер кошелька 157 | payment.date | String DateTime | Дата/время платежа, в московской временной зоне. Формат даты `ГГГГ-ММ-ДД'T'чч:мм:сс+03:00` 158 | payment.errorCode | String | [Код ошибки платежа](#errorCode) 159 | payment.type | String | Тип платежа. Возможные значения:
`IN` - пополнение,
`OUT` - платеж 160 | payment.status|String|Статус платежа. Возможные значения:
`WAITING` - платеж проводится,
`SUCCESS` - успешный платеж,
`ERROR` - ошибка платежа. 161 | payment.provider | Integer| ID провайдера QIWI Wallet 162 | payment.comment | String | Комментарий к транзакции 163 | payment.sum | Object | Данные о сумме платежа или пополнения. Параметры: 164 | sum.amount|Number(Decimal)|Сумма 165 | sum.currency|Number(3)|Код валюты 166 | payment.commission|Object| Данные о комиссии для платежа или пополнения. Параметры: 167 | commission.amount|Number(Decimal)|Сумма 168 | commission.currency|Number(3)|Код валюты 169 | payment.total|Object|Данные об итоговой сумме платежа или пополнения. Параметры: 170 | total.amount|Number(Decimal)|Сумма 171 | total.currency|Number(3)|Код валюты 172 | test|Boolean|Признак тестового сообщения 173 | version|String|Версия API 174 | hash|String| Хэш цифровой подписи уведомления 175 | 176 | ### Как проверить подпись уведомления 177 | 178 | ~~~php 179 | $value) { 202 | if ($name == 'hash') { 203 | $SIGN_REQ = $value; 204 | } 205 | } 206 | return [$reqparams, $SIGN_REQ]; 207 | } 208 | 209 | // Список параметров и подпись 210 | $Request = getReqParams(); 211 | // Base64 encoded ключ для дешифровки вебхуков (метод /hook/{hookId}/key) 212 | $NOTIFY_PWD = "JcyVhjHCvHQwufz+IHXolyqHgEc5MoayBfParl6Guoc="; 213 | // Вычисляем хэш SHA-256 строки параметров и шифруем с ключом для веб-хуков 214 | $reqres = hash_hmac("sha256", $Request[0], base64_decode($NOTIFY_PWD)); 215 | // Проверка подписи вебхука 216 | if (hash_equals($reqres, $Request[1])) { 217 | $error = array('response' => 'OK'); 218 | } 219 | else $error = array('response' => 'error'); 220 | //Ответ 221 | header('Content-Type: application/json'); 222 | $jsonres = json_encode($error); 223 | echo $jsonres; 224 | error_log('error code' . $jsonres); 225 | ?> 226 | ~~~ 227 | 228 | ~~~python 229 | import base64 230 | import hmac 231 | import hashlib 232 | import requests 233 | 234 | # Base64 encoded ключ для расшифровки вебхука (/hook/{hookId}/key) 235 | webhook_key_base64 = 'JcyVhjHCvHQwufz+IHXolyqHgEc5MoayBfParl6Guoc=' 236 | # строка параметров из запроса 237 | data = '643|1|IN|+79161112233|13353941550' 238 | # хэш подписи из запроса 239 | sign_hash = 'f05c4e7bdf00620205d47696d77f924bfd3ba4d02b0398ac8a626e737dc27243' 240 | webhook_key = base64.b64decode(bytes(webhook_key_base64,'utf-8')) 241 | print('Signature verified?') 242 | print(hmac.new(webhook_key, data.encode('utf-8'), hashlib.sha256).hexdigest() == sign_hash) 243 | ~~~ 244 | 245 | Реализуйте шаги проверки подписи: 246 | 247 | 1. Возьмите значения полей из списка в `payment.signFields` уведомления (**в том же порядке**) в формате String. 248 | 2. Объедините значения в строку с разделителями `|`. 249 | 3. Зашифруйте строку п.2 алгоритмом SHA-256 с [ключом проверки подписи](#hook_key). 250 | 4. Сравните полученное значение со значением поля `hash` уведомления. 251 | 252 | Пример расшифровки подписи (см. также функцию PHP на вкладке справа): 253 | 254 | 1. По [запросу](#hook_key) пользователь получает ключ вебхука, закодированный в Base64: 255 | `JcyVhjHCvHQwufz+IHXolyqHgEc5MoayBfParl6Guoc=` 256 | 2. Приходит уведомление 257 | `{"messageId":"7814c49d-2d29-4b14-b2dc-36b377c76156","hookId":"5e2027d1-f5f3-4ad1-b409-058b8b8a8c22", 258 | "payment":{"txnId":"13353941550","date":"2018-06-27T13:39:00+03:00","type":"IN","status":"SUCCESS","errorCode":"0","personId":78000008000,"account":"+79161112233","comment":"","provider":7, 259 | "sum":{"amount":1,"currency":643}, 260 | "commission":{"amount":0,"currency":643}, 261 | "total":{"amount":1,"currency":643}, 262 | "signFields":"sum.currency,sum.amount,type,account,txnId"}, 263 | "hash":"76687ffe5c516c793faa46fafba0994e7ca7a6d735966e0e0c0b65eaa43bdca0","version":"1.0.0","test":false}` 264 | 3. Склеиваются требуемые поля платежных данных (указаны в `payment.signFields` - `sum.currency,sum.amount,type,account,txnId`): 265 | `643|1|IN|+79161112233|13353941550` 266 | 4. Поля шифруются методом SHA-256 с Base64-раскодированным ключом из п.1. Результат 267 | `f05c4e7bdf00620205d47696d77f924bfd3ba4d02b0398ac8a626e737dc27243` 268 | совпадает с параметром `hash` из запроса. 269 | 270 | ## Регистрация обработчика вебхуков {#hook_reg} 271 | 272 |

Запрос → PUT

273 | 274 | ~~~shell 275 | curl -X PUT \ 276 | "https://edge.qiwi.com/payment-notifier/v1/hooks?hookType=1¶m=http%3A%2F%2Fexample.com%2Fcallbacks%2F&txnType=2" \ 277 | -H "accept: */*" \ 278 | -H "authorization: Bearer <токен API>" 279 | ~~~ 280 | 281 | ~~~http 282 | PUT /payment-notifier/v1/hooks?hookType=1¶m=http%3A%2F%2Fexample.com%2Fcallbacks%2F&txnType=2 HTTP/1.1 283 | Host: edge.qiwi.com 284 | Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f 285 | User-Agent: **** 286 | ~~~ 287 | 288 | 291 | 292 |
    293 |
  • HEADERS

    294 |
      295 |
    • Authorization: Bearer ***
    • 296 |
    • Accept: application/json
    • 297 |
    298 |
  • 299 |
300 | 301 |
    302 |
  • Параметры

    Параметры передаются в query запроса. Все параметры обязательны. 303 |
  • 304 |
305 | 306 | Название|Тип|Описание 307 | ----|-----|------ 308 | hookType|Integer|Тип хука. Только 1 - вебхук. 309 | param|URL-encoded|Адрес сервера обработки вебхуков. Длина исходного (не URL-encoded) адреса — не более 100 символов. **URL обработчика должен быть доступен из Интернета**. 310 | txnType|String|Тип транзакций, по которым будут включены уведомления. Возможные значения:
0 - только входящие транзакции (пополнения);
1 - только исходящие транзакции (платежи);
2 - все транзакции 311 | 312 |

Ответ ←

313 | 314 | ~~~http 315 | HTTP/1.1 200 OK 316 | Content-Type: application/json 317 | 318 | { 319 | "hookId":"d63a8729-f5c8-486f-907d-9fb8758afcfc", 320 | "hookParameters":{ 321 | "url":"http://example.com/callbacks/" 322 | }, 323 | "hookType":"WEB", 324 | "txnType":"BOTH" 325 | } 326 | ~~~ 327 | 328 | Ответ в формате JSON. 329 | 330 | Название|Тип|Описание 331 | -----|------|------ 332 | hookId|String|UUID созданного вебхука 333 | hookParameters|Object|Набор параметров вебхука (только URL) 334 | hookType|String|Тип вебхука (только WEB) 335 | txnType|String|Тип транзакций, по которым отсылаются уведомления (`IN` - входящие, `OUT` - исходящие, `BOTH` - все) 336 | 337 | ## Удаление обработчика вебхуков {#hook_remove} 338 | 339 |

Запрос → DELETE

340 | 341 | ~~~shell 342 | curl -X DELETE \ 343 | "https://edge.qiwi.com/payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc" \ 344 | -H "accept: */*" \ 345 | -H "authorization: Bearer <токен API>" 346 | ~~~ 347 | 348 | ~~~http 349 | DELETE /payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc HTTP/1.1 350 | Host: edge.qiwi.com 351 | Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f 352 | User-Agent: **** 353 | ~~~ 354 | 355 |
    356 |
  • URL /payment-notifier/v1/hooks/hookId

  • 357 |
      358 |
    • hookId - UUID вебхука
    • 359 |
    360 |
361 | 362 |
    363 |
  • HEADERS

    364 |
      365 |
    • Authorization: Bearer ***
    • 366 |
    • Accept: application/json
    • 367 |
    368 |
  • 369 |
370 | 371 |

Ответ ←

372 | 373 | ~~~http 374 | HTTP/1.1 200 OK 375 | Content-Type: application/json 376 | 377 | { 378 | "response":"Hook deleted" 379 | } 380 | ~~~ 381 | 382 | Формат ответа JSON. 383 | 384 | Название|Тип|Описание 385 | -----|------|------ 386 | response|String|Описание результата операции 387 | 388 | ## Получение секретного ключа {#hook_key} 389 | 390 | Каждое уведомление содержит цифровую подпись сообщения, зашифрованную ключом. Используйте запрос для получения ключа проверки подписи. 391 | 392 |

Запрос → GET

393 | 394 | ~~~shell 395 | curl -X GET \ 396 | "https://edge.qiwi.com/payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc/key" \ 397 | -H "accept: */*" \ 398 | -H "accept: */*" \ 399 | -H "authorization: Bearer <токен API>" 400 | ~~~ 401 | 402 | ~~~http 403 | GET /payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc/key HTTP/1.1 404 | Host: edge.qiwi.com 405 | Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f 406 | User-Agent: **** 407 | ~~~ 408 | 409 |
    410 |
  • URL /payment-notifier/v1/hooks/hookId/key

  • 411 |
      412 |
    • hookId - UUID вебхука
    • 413 |
    414 |
415 | 416 |
    417 |
  • HEADERS

    418 |
      419 |
    • Authorization: Bearer ***
    • 420 |
    • Accept: application/json
    • 421 |
    422 |
  • 423 |
424 | 425 |

Ответ ←

426 | 427 | ~~~http 428 | HTTP/1.1 201 Created 429 | Content-Type: application/json 430 | 431 | { 432 | "key":"L8UVF3JkLVUr6r70LiE0A9/5WoGGwWKG2pI/e+l/9fs=" 433 | } 434 | ~~~ 435 | 436 | Формат ответа JSON. 437 | 438 | Название|Тип|Описание 439 | -----|------|------ 440 | key|String|Base64-закодированный ключ 441 | 442 | ## Изменение секретного ключа {#hook_secret} 443 | 444 | Для смены ключа шифрования уведомлений используйте этот запрос. 445 | 446 |

Запрос → POST

447 | 448 | ~~~shell 449 | curl -X POST \ 450 | "https://edge.qiwi.com/payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc/newkey" \ 451 | -H "accept: */*" \ 452 | -H "authorization: Bearer <токен API>" 453 | ~~~ 454 | 455 | ~~~http 456 | POST /payment-notifier/v1/hooks/d63a8729-f5c8-486f-907d-9fb8758afcfc/newkey HTTP/1.1 457 | Host: edge.qiwi.com 458 | Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f 459 | User-Agent: **** 460 | ~~~ 461 | 462 |
    463 |
  • URL /payment-notifier/v1/hooks/hookId/newkey

  • 464 |
      465 |
    • hookId - UUID вебхука
    • 466 |
    467 |
468 | 469 |
    470 |
  • HEADERS

    471 |
      472 |
    • Authorization: Bearer ***
    • 473 |
    • Accept: application/json
    • 474 |
    475 |
  • 476 |
477 | 478 |

Ответ ←

479 | 480 | ~~~http 481 | HTTP/1.1 201 Created 482 | Content-Type: application/json 483 | 484 | { 485 | "key":"OikS4/CcIbSf+yYGnLbnOige8RGoYmGxs/LNMwkJy7Q=" 486 | } 487 | ~~~ 488 | 489 | Формат ответа JSON. 490 | 491 | Название|Тип|Описание 492 | -----|------|------ 493 | key|String|Base64-закодированный новый ключ 494 | 495 | ## Данные об обработчике уведомлений {#hook_active} 496 | 497 | Список действующих (активных) обработчиков уведомлений, связанных с вашим кошельком, можно получить данным запросом. 498 | 499 | Так как сейчас используется только один тип хука - вебхук, то в ответе содержится только один объект данных. 500 | 501 |

Запрос → GET

502 | 503 | ~~~shell 504 | curl -X GET \ 505 | "https://edge.qiwi.com/payment-notifier/v1/hooks/active" \ 506 | -H "accept: */*" \ 507 | -H "accept: */*" \ 508 | -H "authorization: Bearer <токен API>" 509 | ~~~ 510 | 511 | ~~~http 512 | GET /payment-notifier/v1/hooks/active HTTP/1.1 513 | Host: edge.qiwi.com 514 | Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f 515 | User-Agent: **** 516 | ~~~ 517 | 518 |
    519 |
  • URL /payment-notifier/v1/hooks/active

  • 520 |
521 | 522 |
    523 |
  • HEADERS

    524 |
      525 |
    • Authorization: Bearer ***
    • 526 |
    • Accept: application/json
    • 527 |
    528 |
  • 529 |
530 | 531 |

Ответ ←

532 | 533 | ~~~http 534 | HTTP/1.1 200 OK 535 | Content-Type: application/json 536 | 537 | { 538 | "hookId":"d63a8729-f5c8-486f-907d-9fb8758afcfc", 539 | "hookParameters":{ 540 | "url":"http://example.com/callbacks/" 541 | }, 542 | "hookType":"WEB", 543 | "txnType":"BOTH" 544 | } 545 | ~~~ 546 | 547 | Формат ответа JSON. 548 | 549 | Название|Тип|Описание 550 | -----|------|------ 551 | hookId|String|UUID действующего обработчика вебхуков 552 | hookParameters|Object|Набор параметров обработчика (только URL) 553 | hookType|String|Тип вебхука (только WEB) 554 | txnType|String|Тип транзакций, по которым отсылаются уведомления (`IN` - входящие, `OUT` - исходящие, `BOTH` - все) 555 | 556 | ## Отправка тестового уведомления {#hook_test} 557 | 558 | Для проверки вашего обработчика вебхуков используйте этот запрос. Тестовое уведомление отправляется на адрес, указанный в [параметрах действующего обработчика](#hook_active). 559 | 560 |

Запрос → GET

561 | 562 | ~~~shell 563 | curl -X GET \ 564 | "https://edge.qiwi.com/payment-notifier/v1/hooks/test" \ 565 | -H "accept: */*" \ 566 | -H "authorization: Bearer <токен API>" 567 | ~~~ 568 | 569 | ~~~http 570 | GET /payment-notifier/v1/hooks/test HTTP/1.1 571 | Host: edge.qiwi.com 572 | Authorization: Bearer 3b7beb2044c4dd4a8f4588d4a6b6c93f 573 | User-Agent: **** 574 | ~~~ 575 | 576 |
    577 |
  • URL /payment-notifier/v1/hooks/test

  • 578 |
579 | 580 |
    581 |
  • HEADERS

    582 |
      583 |
    • Authorization: Bearer ***
    • 584 |
    • Accept: application/json
    • 585 |
    586 |
  • 587 |
588 | 589 |

Ответ ←

590 | 591 | ~~~http 592 | HTTP/1.1 200 OK 593 | Content-Type: application/json 594 | 595 | { 596 | "response":"Webhook sent" 597 | } 598 | ~~~ 599 | 600 | Формат ответа JSON. 601 | 602 | Название|Тип|Описание 603 | -----|------|------ 604 | response|String|Результат запроса 605 | -------------------------------------------------------------------------------- /qiwi-wallet-personal_en.html.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: QIWI Wallet API 3 | 4 | search: true 5 | 6 | metatitle: QIWI Wallet API 7 | 8 | metadescription: QIWI Wallet API allows you to access your QIWI Wallet account information and make payment operations as well as get payment reports and many more. 9 | 10 | category: apiqiwiwallet 11 | 12 | language_tabs: 13 | - shell: cURL 14 | - php: PHP 15 | - python: Python 16 | - http: Request/Response 17 | 18 | toc_footers: 19 | - Main page 20 | - Feedback 21 | - P2P-operations support 22 | - Interactive API 23 | 24 | includes: 25 | - qiwi-wallet-personal/profile_en 26 | - qiwi-wallet-personal/payment_history_en 27 | - qiwi-wallet-personal/balance_en 28 | - qiwi-wallet-personal/payment_en 29 | - qiwi-wallet-personal/webhook_en 30 | - qiwi-wallet-personal/error_en 31 | 32 | --- 33 | 34 | *[Token]: String for user authentication in API by OAuth 2.0 standard RFC 6749, RFC 6750. 35 | *[token]: String for user authentication in API by OAuth 2.0 standard, see RFC 6749, RFC 6750. 36 | 37 | # General Information 38 | 39 | ###### [Propose corrections on GitHub](https://github.com/QIWI-API/qiwi-wallet-personal-docs/) 40 | 41 | QIWI Wallet API makes it easy to automate getting info on your account's state in [QIWI Wallet service](https://qiwi.com) and making financial operations. 42 | 43 | API uses HTTPS requests and JSON-formatted responses. 44 | 45 | API methods are accessible after the user is registered in [QIWI Wallet service](https://qiwi.com). 46 | 47 | ## Service data {#auth_param} 48 | 49 |
    50 |
  • Authorization

    51 |
  • 52 |
53 | 54 | Parameter|Description|Type 55 | ---------|--------|--- 56 | token | [Token](#auth_data) to authorize API requests. Token is valid within one month after its [issuing](#auth_data). | String 57 | 58 | # API Access {#api-access} 59 | 60 | We have stopped issuing QIWI OAuth-tokens. 61 | 62 | Main URL address to call API methods (unless explicitly stated): 63 | 64 | `https://edge.qiwi.com` 65 | 66 | To make a successful request of API methods, you need: 67 | 68 | * Correct HTTP headers: `Accept` and `Content-Type`, as designated in a method description. 69 | * URL composed according to the method reference 70 | * OAuth token issued for your QIWI Wallet. Some requests do not require it though. 71 | 72 | # Authorization {#auth_api} 73 | 74 | ## Authorization data {#auth_data} 75 | 76 | We have stopped OAuth token issue. 77 | 78 | QIWI Wallet API implements OAuth 2.0 open authorization protocol specification. A user registers or authenticates on QIWI Wallet site and requests a token with a certain scopes. Token issue is confirmed by SMS code. 79 | 80 | 81 | 82 | ## Authorization example {#auth_ex} 83 | 84 | We have stopped OAuth token issue. 85 | 86 | ~~~shell 87 | curl "server address" \ 88 | --header "Authorization: Bearer jMyN22DQxMjM6NDUzRmRnZDQ0Mw11212e" 89 | ~~~ 90 | 91 | 94 | 95 | * As a result of authentication in [QIWI Wallet site](https://qiwi.com/api), you [got](#auth_data) the token: 96 | 97 | `U1QtOTkwMTAyLWNud3FpdWhmbzg3M` 98 | 99 | * Add the token to `Authorization: Bearer ` HTTP header. 100 | 101 | * The header has to be added to each API request: 102 | 103 | `Authorization: Bearer U1QtOTkwMTAyLWNud3FpdWhmbzg3M` 104 | -------------------------------------------------------------------------------- /qiwi-wallet-personal_ru.html.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: API QIWI Кошелька 3 | 4 | search: true 5 | 6 | metatitle: API QIWI Кошелька 7 | 8 | metadescription: API QIWI Кошелька позволяет автоматизировать выполнение платежей и получение отчетов о платежах, информации о счёте, идентификации. 9 | 10 | category: apiqiwiwallet 11 | 12 | language_tabs: 13 | - http: Запрос/ответ 14 | - shell: cURL 15 | - php: PHP 16 | - python: Python 17 | 18 | toc_footers: 19 | - Список изменений 20 | - На главную 21 | - Обратная связь 22 | - Помощь по P2P-операциям 23 | - Попробовать API 24 | 25 | includes: 26 | - qiwi-wallet-personal/profile_ru 27 | - qiwi-wallet-personal/payment_history_ru 28 | - qiwi-wallet-personal/balance_ru 29 | - qiwi-wallet-personal/master_ru 30 | - qiwi-wallet-personal/payment_ru 31 | - qiwi-wallet-personal/webhook_ru 32 | - qiwi-wallet-personal/error_ru 33 | 34 | --- 35 | 36 | *[Токен]: Символьная строка для аутентификации пользователя в API по стандарту OAuth 2.0 RFC 6749, RFC 6750. 37 | *[токен]: Символьная строка для аутентификации пользователя в API по стандарту OAuth 2.0 RFC 6749, RFC 6750. 38 | *[API]: Application Programming Interface - набор готовых методов, предоставляемых приложением (системой) для использования во внешних программных продуктах. 39 | *[JSON]: JavaScript Object Notation - текстовый формат обмена данными, основанный на *JavaScript*. 40 | 41 | # Общие сведения {#intro} 42 | 43 | ###### [Эта страница на GitHub](https://github.com/QIWI-API/qiwi-wallet-personal-docs) 44 | 45 | API QIWI Кошелька позволяет автоматизировать получение информации о вашем счёте в [сервисе QIWI Кошелек](https://qiwi.com) и проводить операции с его помощью. 46 | 47 | Методы API доступны после регистрации пользователя в [сервисе QIWI Кошелек](https://qiwi.com). 48 | 49 | ## Авторизация запросов {#auth_param} 50 | 51 |
    52 |
  • Авторизация

    53 |
  • 54 |
55 | 56 | Параметр|Описание|Тип 57 | ---------|--------|--- 58 | Bearer token | Токен для доступа к вашему QIWI кошельку по API. Действие токена заканчивается через 180 дней после [выпуска](#auth_data). Одновременно может действовать только один токен. | String 59 | 60 | # Доступ к API {#auth_api} 61 | 62 | Основной URL-адрес для вызова методов API (если не указано иное): 63 | 64 | `https://edge.qiwi.com` 65 | 66 | Для успешного вызова методов API необходимы: 67 | 68 | * Корректные значения HTTP-заголовков `Accept` и `Content-Type` в запросе. API QIWI Кошелька поддерживает только один MIME-тип: `application/json`. Любое другое значение приведет к [ошибке формата данных](#errors). 69 | * URL, составленный согласно требованиям к нужному запросу. 70 | * OAuth-токен, выданный вам для доступа к вашему QIWI кошельку. Для некоторых запросов его не потребуется. 71 | 72 | ## Получение OAuth-токена {#auth_data} 73 | 74 | Мы остановили выпуск OAuth-токенов. Приносим извинения за доставленные неудобства. 75 | 76 | API QIWI Кошелька использует открытый протокол [OAuth 2.0](http://tools.ietf.org/html/rfc6749). Согласно протоколу, пользователь авторизуется или регистрируется на сайте и запрашивает токен OAuth 2.0 Bearer с правом выполнения определённых действий. Выпуск токена подтверждается одноразовым кодом из СМС. 77 | 78 | 79 | 80 | ![block token](/images/apiwallet-apps.png) 81 | 82 | ## Пример вызова API {#auth_ex} 83 | 84 | ~~~shell 85 | curl "адрес сервера" \ 86 | --header "Accept: application/json" \ 87 | --header "Content-Type: application/json" \ 88 | --header "Authorization: Bearer <токен API QIWI Кошелька>" 89 | ~~~ 90 | 91 | Мы остановили выпуск OAuth-токенов. Приносим извинения за доставленные неудобства. 92 | 93 | Передавайте полученный токен в HTTP-заголовке `Authorization` при каждом вызове API, указывая тип токена `Bearer` перед его значением. Пример получения такого заголовка: 94 | 95 | * В результате авторизации на сайте QIWI Кошелек и выпуска токена [получен](#auth_data) токен, представляющий собой строку: 96 | 97 | `U1QtOTkwMTAyLWNud3FpdWhmbzg3M` 98 | 99 | * Токен добавляется в заголовок `Authorization: Bearer ` 100 | 101 | * Итоговый заголовок, добавляемый в каждый запрос к API QIWI Кошелька: 102 | 103 | `Authorization: Bearer U1QtOTkwMTAyLWNud3FpdWhmbzg3M` 104 | --------------------------------------------------------------------------------