Кредиты
API кредитов позволяет получить баланс и историю операций, создать счет на пополнение и проверить его статус. Профиль и доступ к сайту — в гайде «Пользователи», отправка страниц за кредиты — в гайде «Индексация».
| Метод | Путь | Действие |
|---|---|---|
GET | /me/credits | Получить баланс кредитов |
GET | /me/credits/transactions | Получить операции с кредитами |
POST | /me/credits/topup | Создать счет на пополнение |
GET | /me/credits/topups/{id} | Получить статус пополнения |
Во всех примерах API — https://onpress.pro/api/v2, OP_TOKEN — токен op_XXXX. Эндпоинты /me/credits… работают без /site/$SITE: баланс ваш, а не сайта. Токен и права описаны на странице «Авторизация», форма отказа — на странице «Ошибки».
Цена и списание
1 кредит = 1 ₽. Баланс принадлежит пользователю, а не сайту: один баланс тратится на все сайты, где вы администратор, и в каждом списании записан сайт. Новый пользователь начинает с нулевого баланса. Ничего платного не уходит без подтверждения цены там, где ее заранее не видно: публикация релизов GitHub через ИИ просит confirm и expected_cost, новость стоит ровно столько, сколько показывает GET /news/auto.
Резерв, потом списание. Перед работой действие резервирует свою цену. Не хватает доступного остатка — отказ сразу, до всякой работы: 402 insufficient_credits с required (сколько нужно), available (сколько свободно), action и quantity. После успеха резерв списывается, при сбое снимается целиком. Доступный остаток — баланс минус открытые резервы. Если кредиты на сервере не настроены, любой эндпоинт /me/credits… отвечает 503 credits_not_configured.
Прайс
| Действие | Ключ | Кредитов |
|---|---|---|
| Запись чейнджлога через ИИ | github_ai | 5 |
| Новость без картинки | news | 5 |
| Новость с картинкой 16:9 | news_image | 20 |
| Съем одной позиции в выдаче | serp_position | 1 |
| Отправка одной страницы на индексацию | index_submit | 2 |
Позиции и отправка на индексацию описаны в справочнике SEO, здесь только их цена.
Получить баланс кредитов
GET /me/credits
Отдает баланс, прайс, пределы пополнения и последние 10 движений. Например:
curl -s "$API/me/credits" -H "Authorization: Bearer $OP_TOKEN"
Параметры пути. У операции нет собственных параметров пути.
Параметры строки запроса. Дополнительных параметров нет.
Тело запроса. Не требуется.
Ответ
{
"success": true,
"balance": 20,
"held": 0,
"available": 20,
"prices": { "github_ai": 5, "news": 5, "news_image": 20, "serp_position": 1, "index_submit": 2 },
"transactions": [ { "id": 31, "type": "spend", "delta": -20, "balance_after": 5, "action": "news_image", "site_id": "x9HTLHECq", "site_domain": "example.com", "job_id": 15, "note": "news_image", "created_at": "2026-10-02T11:42:04Z" } ],
"packages": [
{ "id": "pack_100", "credits": 100, "price_rub": 100, "title": "100 кредитов" },
{ "id": "pack_500", "credits": 500, "price_rub": 500, "title": "500 кредитов", "popular": true },
{ "id": "pack_1000", "credits": 1000, "price_rub": 1000, "title": "1000 кредитов" },
{ "id": "pack_5000", "credits": 5000, "price_rub": 5000, "title": "5000 кредитов" }
],
"topup": { "min": 100, "max": 100000, "rub_per_credit": 1, "suggested": [100, 500, 1000, 5000] }
}
| Поле | Описание |
|---|---|
balance | все начисленное минус списанное |
held | открытые резервы |
available | сколько можно потратить сейчас |
prices | прайс |
topup | пределы пополнения: min и max в кредитах, rub_per_credit — рублей за кредит, suggested — суммы для быстрого выбора |
packages | фиксированные пакеты кредитов; popular: true — пакет, который консоль выделяет |
Ошибки
| Код | HTTP | Когда | Что делать |
|---|---|---|---|
credits_not_configured | 503 | сервис кредитов недоступен | обратитесь в поддержку |
Получить операции с кредитами
GET /me/credits/transactions
Отдает историю движений, свежие сверху. Например, только списания:
curl -s "$API/me/credits/transactions?limit=2&direction=out" -H "Authorization: Bearer $OP_TOKEN"
Параметры пути. У операции нет собственных параметров пути.
Параметры строки запроса
| Параметр | Тип | Обязателен | По умолчанию | Описание |
|---|---|---|---|---|
limit | int | нет | 50 | от 1 до 200 |
before | int | нет | — | следующая порция: next из прошлого ответа |
direction | string | нет | all | in — только начисления, out — только списания, all — все; со следующей порцией передавайте тот же |
Тело запроса. Не требуется.
Ответ
{
"success": true,
"transactions": [
{ "id": 31, "type": "spend", "delta": -20, "balance_after": 5, "action": "news_image", "site_id": "x9HTLHECq", "site_domain": "example.com", "job_id": 15, "note": "news_image", "created_at": "2026-10-02T11:42:04Z" }
],
"next": 31
}
| Поле | Описание |
|---|---|
type | bonus — бонус платформы, topup — оплата пополнения, grant и adjust — начисление и коррекция поддержкой, spend — списание за действие, refund — возврат |
delta | изменение баланса: начисление больше нуля, списание меньше |
balance_after | баланс сразу после записи, без учета резервов, открытых в тот момент |
action | ключ действия из прайса; у начислений null |
site_id, site_domain | сайт, за который списано; у начислений null |
job_id | задача ИИ, если списание за задачу |
next | id для следующей порции; null — дальше пусто |
Ошибки
| Код | HTTP | Когда | Что делать |
|---|---|---|---|
invalid_direction | 400 | direction не all, in и не out | исправьте параметр |
Создать счет на пополнение
POST /me/credits/topup
Создает заказ на пополнение; деньги по этому вызову не двигаются. К оплате amount × rub_per_credit рублей. Кредиты зачисляются, когда платежный сервис подтвердил платеж, повторное уведомление о том же платеже ничего не удваивает; ждать зачисления — опросом GET /me/credits/topups/{id}. Способ оплаты задает flow: widget — окно CloudPayments поверх своей страницы, без перехода; link — ссылка на страницу оплаты CloudPayments в payment_url. Например, 500 кредитов виджетом:
curl -s -X POST "$API/me/credits/topup" \
-H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
-d '{"amount": 500, "flow": "widget"}'
Параметры пути. У операции нет собственных параметров пути.
Параметры строки запроса. Дополнительных параметров нет.
Параметры тела
| Поле | Тип | Обязателен | По умолчанию | Описание |
|---|---|---|---|---|
amount | int | amount или package | — | кредитов, от topup.min до topup.max из GET /me/credits, сейчас от 100 до 100 000 |
package | string | package или amount | — | id пакета из packages; если переданы оба поля, берется amount |
flow | string | нет | link | widget или link |
return_path | string | нет | /settings/credits | для link: путь консоли без хоста, куда человек вернется после оплаты с ?topup=ID, после неуспешной — еще и с topup_failed=1 |
Ответ
{
"success": true, "topup_id": 41, "invoice_id": "cr_41", "credits": 500, "price_rub": 500,
"widget": {
"public_id": "pk_XXXX", "invoice_id": "cr_41", "amount": 500, "currency": "RUB",
"description": "OnPress: 500 кредитов", "account_id": "user@example.com", "email": "user@example.com",
"data": { "kind": "credits", "topup_id": 41, "package": "custom" }
}
}
widget — все, что нужно передать виджету cp.CloudPayments().pay('charge', …): public_id в publicId, invoice_id в invoiceId, amount, currency, description, account_id в accountId, email, data. Номер счета менять нельзя: по нему платеж находит заказ. Со "flow": "link" вместо widget приходит payment_url.
Ошибки
| Код | HTTP | Когда | Что делать |
|---|---|---|---|
invalid_amount | 400 | amount не целое или вне пределов; пределы в min и max | исправьте сумму |
unknown_package | 400 | нет amount, а пакета нет в списке; допустимые — в packages | передайте amount |
payment_link_failed | 502 | платежный сервис не выдал ссылку (только link) | повторите позже |
payments_not_configured | 503 | оплата на сервере не подключена | напишите в поддержку |
Получить статус пополнения
GET /me/credits/topups/{id}
Отдает состояние своего заказа на пополнение. Опрашивайте раз в 2–3 секунды; обычно зачисление занимает несколько секунд. Например:
curl -s "$API/me/credits/topups/41?verify=1" -H "Authorization: Bearer $OP_TOKEN"
Параметры пути
| Параметр | Тип | Обязателен | По умолчанию | Описание |
|---|---|---|---|---|
id | integer | да | — | положительный id записи |
Параметры строки запроса
| Параметр | Тип | Обязателен | По умолчанию | Описание |
|---|---|---|---|---|
verify | string | нет | — | 1 — неоплаченный заказ младше 48 часов сверяется с платежным сервисом напрямую, не дожидаясь его уведомления; прошедший платеж зачисляется тут же. Не чаще раза в 4 секунды на заказ, чаще — ответ без provider |
Тело запроса. Не требуется.
Ответ
{ "success": true, "topup_id": 41, "invoice_id": "cr_41", "status": "new", "credits": 500, "price_rub": 500,
"created_at": "2026-10-06T09:22:05.000Z", "paid_at": null,
"provider": { "status": "Declined", "reason": "InsufficientFunds", "message": "Недостаточно средств на карте", "credited": 0 } }
| Поле | Описание |
|---|---|
status | new — не оплачен или подтверждение еще не пришло, paid — кредиты зачислены, failed — ссылку создать не удалось |
paid_at | когда зачислено |
provider | только с verify=1: что платежный сервис знает о последней попытке — status (Completed, Declined, NotFound и другие статусы CloudPayments), reason, message — причина отказа банка для человека, credited |
Ошибки
| Код | HTTP | Когда | Что делать |
|---|---|---|---|
topup_not_found | 404 | заказа нет или он чужой | проверьте {id} |
payment_mismatch | 409 | сумма или счет оплаты не совпали с заказом, зачисления нет | напишите в поддержку |