# PayKeeper: Сверить платежи за период

Сценарий из mcp-everything. Актуально на 2026-10-24.

Ежедневная сверка с учётной системой: какие платежи прошли, отменены или возвращены.

1. Запроси реестр: GET /info/payments/bydate/ с start и end (YYYY-MM-DD), status[] (например, success, canceled, refunded), payment_system_id[], from и limit — все параметры обязательны.
2. Листай через from, пока не получишь меньше limit записей.
3. Для счетов есть отдельная история: GET /info/invoice/list/ с status[] и датами, а данные одного счёта — GET /info/invoice/byid/.

```bash
curl -G -u "$AUTH" "$PK/info/payments/bydate/" \
  -d start=2026-10-01 -d end=2026-10-24 \
  -d 'status[]=success' -d 'status[]=refunded' \
  -d 'payment_system_id[]=<id платёжной системы>' \
  -d from=0 -d limit=100
```

## Базовые URL

- Боевой: `https://<адрес вашего сервера PayKeeper>`

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

Тип: Basic Auth

Каждый запрос отправляется с заголовком `Authorization: Basic` — логин и пароль от личного кабинета PayKeeper в base64. Запросы на чтение выполняются GET, изменения — POST с заголовком `Content-Type: application/x-www-form-urlencoded`. Каждый POST-запрос дополнительно должен содержать параметр `token` — токен безопасности, полученный методом `/info/settings/token/`.

## Методы сценария

### GET /info/invoice/byid/ — Данные счёта

Статусы счёта: `created`, `sent`, `paid`, `expired`.

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `id` | query | string | да | Номер счёта |

Пример ответа:

```json
[
      {
      "id"                : "20110115085347329",
      "clientid"          : "Ivanov Ivan Ivanovich",
       "orderid"          : "1337",
       "paymentid"        : "7331",
       "service_name"     : "Document delivery",
       "client_email"     : "ivanov@ivan.ivanovich.com",
       "client_phone"     : "+79254973590",
       "created_datetime" : "2011-01-15 08:53:47",
       "paid_datetime"    : "2011-01-16 14:12:00",
       "expiry_datetime"  : "2011-01-19 00:00:00",
       "pay_amount"       : "1205.98",
       "status"           : "paid",
       "user_id"           : 9
       }
]
```

### GET /info/invoice/list/ — История счетов за период

Счета выводятся от новых к старым.

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `status[]` | query | string | нет | Статусы: sent, paid, expired |
| `start_date` | query | string | нет | Счета, выставленные после даты YYYY-MM-DD |
| `end_date` | query | string | нет | Счета, выставленные до даты YYYY-MM-DD |
| `from` | query | integer | нет | Пропустить N результатов |
| `limit` | query | integer | нет | Не более N результатов |

### GET /info/payments/bydate/ — Реестр платежей за период

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `start` | query | string | да | Начало периода YYYY-MM-DD |
| `end` | query | string | да | Конец периода YYYY-MM-DD |
| `payment_system_id[]` | query | integer | да | Идентификатор платёжной системы |
| `status[]` | query | string | да | Статусы: pending, obtained, canceled, success, failed, stuck, refunded, refunding, partially_refunded |
| `from` | query | integer | да | Пропустить первые N значений |
| `limit` | query | integer | да | Количество возвращаемых значений |

Пример запроса:

```
/info/payments/bydate/?limit=100&from=0&start=2016-04-14&end=2017-03-14&status[]=success&status[]=canceled&status[]=failed&payment_system_id[]=9&payment_system_id[]=1
```

## Нюансы

- Параметр `token` обязателен в каждом POST-запросе, хотя в описании методов его часто не упоминают; токен меняется раз в 24 часа.
- В `partial` передавайте именно `true`/`false` — значения 1/0 система не воспринимает.
- Возврат выполняется асинхронно: успешный ответ означает только постановку в очередь. Результат проверяют через `/info/refunds/bypaymentid/` или реестр платежей со статусом `refunding`, обычно через несколько минут.
- При ответе `status = queued` на capture (Промсвязьбанк) запрос лишь принят банком; итог проверяют через несколько минут.
- POST-оповещение о платеже содержит `id`, `sum`, `clientid`, `orderid`, `key` и доп. поля. `key` — md5 от конкатенации id, sum (2 знака после точки), clientid, orderid и секретного слова из личного кабинета.
- На оповещение нужно ответить строкой `OK <md5(id + секретное слово)>`. Без корректного ответа PayKeeper повторяет запрос каждую минуту, по умолчанию до 50 раз, после чего платёж получает статус «Совершён без оповещения».
- Оповещение может прийти несколько раз — обработчик должен защищаться от повторного зачисления по `id` платежа.
- К ссылке счёта можно добавить `?pstype=sbp_default`, чтобы показать QR-код СБП, и `&returnFormat=json`, чтобы получить содержимое QR-кода.

## Другие сценарии

- [Выставить счёт и получить ссылку на оплату](https://mcp-everything.ru/integrations/paykeeper/scenarios/vystavit-schet-i-poluchit-ssylku.md)
- [Принять оповещение об оплате](https://mcp-everything.ru/integrations/paykeeper/scenarios/prinyat-opoveschenie-ob-oplate.md)
- [Вернуть деньги покупателю](https://mcp-everything.ru/integrations/paykeeper/scenarios/vernut-dengi-pokupatelyu.md)
- [Списать заблокированные деньги](https://mcp-everything.ru/integrations/paykeeper/scenarios/spisat-zablokirovannye-dengi.md)

---

Если этого недостаточно — официальная документация: https://docs.paykeeper.ru/dokumentatsiya-json-api/
Вся интеграция одним документом: https://mcp-everything.ru/integrations/paykeeper.md
