Справочник: сайты
Здесь эндпоинты /sites… с параметрами, ответами и отказами; свой домен — /sites/{id}/custom-domain — на странице Домены; как создать сайт и подключить домен по шагам — на страницах «Сайты и домены» и «Свой домен».
Во всех примерах API — https://onpress.pro/api/v2, SITE — id сайта (SITE_ID), OP_TOKEN — токен op_XXXX. Как получить токен и в какой форме приходят отказы — на странице «Доступ и токен».
Как адресуется сайт
Эндпоинты /sites… пишутся без префикса /site/$SITE: сайт задаёт {id} в пути — site_id сайта или полный домен (example.com). Вы работаете только со своими сайтами: на чужой и на несуществующий сайт API отвечает одинаково — 404 site_not_found, поэтому перебором id нельзя узнать, какие сайты есть на платформе.
GET /sites
Отдаёт список ваших сайтов — тех, где вы администратор, как в консоли в разделе «Сайты». Сайт, где вы только участник, в список не попадает. Например, все сайты в эфире:
curl -s "$API/sites" -H "Authorization: Bearer $OP_TOKEN"
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
status | string | active | active — сайты в эфире; trash — сайты в архиве после DELETE /sites/{id}, их можно вернуть; all — и те и другие |
{
"success": true,
"status": "active",
"total": 1,
"sites": [
{ "site_id": "x9HTLHECq", "domain": "test.onpress.pro", "name": "Test", "role": "administrator", "url": "https://test.onpress.pro", "status": "active" }
]
}
site_id — id для адресов /site/$SITE/…, name — название сайта (домен, если названия нет), role — ваша роль на сайте, status — active или trash. Список отсортирован по названию.
| Код | Статус | Когда | Что делать |
|---|---|---|---|
invalid_status | 400 | status не active, trash или all | исправьте параметр |
GET /sites/{id}
Отдаёт карточку сайта: site_id для адресов /site/$SITE/…, домен, видимость, тему, главную страницу, языки и объём содержимого. Кроме site_id и домена, {id} может быть коротким именем: поддоменом onpress.pro (mysite от mysite.onpress.pro) или первой меткой своего домена (example от example.com). Короткое имя ищется только среди ваших сайтов и только после точного совпадения. Например, карточка тестового сайта:
curl -s "$API/sites/test.onpress.pro" -H "Authorization: Bearer $OP_TOKEN"
{
"success": true,
"site_id": "x9HTLHECq",
"blog_id": 233,
"is_super_admin": false,
"realm": "prod",
"instance_realm": "prod",
"domain": "test.onpress.pro",
"path": "/",
"public": 1,
"blog_public": 1,
"archived": 0,
"deleted": 0,
"registered": "2026-09-12T17:37:06.000Z",
"last_updated": "2026-10-27T16:23:51.000Z",
"blogname": "Test",
"blogdescription": "",
"home": "https://test.onpress.pro",
"theme": { "template": "onpress-v2", "stylesheet": "onpress-v2", "current_theme": "onpress-v2" },
"show_on_front": "page",
"page_on_front": 5776,
"site_icon": 4827,
"languages": { "default": "en", "list": ["en", "ru"] },
"counts": { "post_types": { "page": 108, "attachment": 67, "…": "…" }, "pages": 108, "menus": 14, "frames": 34, "datasets": 15 }
}
| Поле | Описание |
|---|---|
site_id | id сайта для адресов /site/$SITE/… |
blog_id | внутренний номер сайта |
realm, instance_realm | чей это сайт и какой экземпляр API ответил; при расхождении запись отклоняется 409 wrong_realm — подробно в «Контурах» |
public, blog_public | открыт ли сайт поисковикам: 1 — да, 0 — нет |
archived, deleted | 1 — сайт удалён в архив |
blogname, blogdescription | название и подзаголовок сайта |
home | адрес главной |
show_on_front, page_on_front | page и id главной страницы или posts |
site_icon | id картинки иконки сайта, 0 — нет |
languages | язык по умолчанию и список языков; null — сайт одноязычный |
counts | число записей по типам, страниц, меню, фреймов и наборов данных |
| Код | Статус | Когда | Что делать |
|---|---|---|---|
site_not_found | 404 | сайта нет или он не ваш | проверьте {id}; список своих сайтов — в консоли |
site_ambiguous | 409 | короткое имя подходит к нескольким вашим сайтам, они в candidates | адресуйте сайт полным доменом, site_id или номером |
GET /sites/plans
Отдаёт тарифы, по которым вы можете создать сайт: plan — код для POST /sites, price — рубли за период period_months, recurring: true — оплата списывается каждый период, free: true — сайт бесплатный и создаётся сразу. У тарифа с несколькими периодами код годового — имя тарифа (simple), месячного — с окончанием -monthly (simple-monthly). Если у вас уже есть сайт, вместо simple в списке приходит additional — следующий сайт. Например:
curl -s "$API/sites/plans" -H "Authorization: Bearer $OP_TOKEN"
{
"success": true,
"plans": [
{ "plan": "simple", "product": "simple", "name": "Simple", "description": "Onpress: создание сайта", "price": 12000, "currency": "RUB", "period_months": 12, "recurring": true, "free": false },
{ "plan": "simple-monthly", "product": "simple", "name": "Simple", "description": "Onpress: создание сайта", "price": 1400, "currency": "RUB", "period_months": 1, "recurring": true, "free": false },
{ "plan": "helper", "product": "helper", "name": "Helper", "description": "Onpress: создание сайта с ассистентом", "price": 12000, "currency": "RUB", "period_months": 12, "recurring": true, "free": false }
]
}
POST /sites
Создаёт сайт по тарифу. Бесплатный тариф или уже оплаченный заказ этого тарифа — сайт создаётся сразу, до 300 секунд, и ответ приходит со статусом 201. Платный тариф — POST /sites заводит заказ и отвечает 402 payment_required со ссылкой на оплату. Например, заказ сайта mysite.onpress.pro по годовому тарифу:
curl -s -X POST "$API/sites" \
-H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
-d '{"name": "mysite", "title": "Мой сайт", "plan": "simple"}'
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
name | string | — | поддомен: латиница, цифры и -, до 50 символов, без дефиса в начале и в конце, заглавные приводятся к строчным; заняты www, api, admin, mail, ftp, cdn, static, app, apps, stage, test. Сайт получит адрес <name>.onpress.pro |
plan | string | — | код тарифа из GET /sites/plans |
title | string | name | название сайта |
empty | bool | false | сайт без демо-контента: оформление без демо-страниц, меню и данных |
keep_frames | array | [] | слаги или id фреймов, которые остаются при empty: true |
public | bool | true | видимость для поисковиков; false — закрыть сайт до запуска |
{
"success": false,
"error": "payment_required",
"message": "the plan is paid: open payment_url in a browser and pay, then poll GET /sites/orders/{order_id}",
"order_id": 123,
"status": "pending",
"plan": "simple",
"amount": 12000,
"currency": "RUB",
"payment_url": "https://onpress.pro/order-pay/?order=123&t=0f3c…"
}
Откройте payment_url в браузере и оплатите картой. Страница оплаты открывается без входа в аккаунт и годится только для этого заказа, поэтому отдавайте ссылку только тому, кто платит. После оплаты сайт создаётся сам, обычно за одну-две минуты, — статус показывает GET /sites/orders/{order_id}. Повторный POST /sites с тем же тарифом до оплаты вернёт тот же заказ и ту же ссылку. Если имя заняли, пока заказ ждал оплаты, сайт получит его с двузначным окончанием: mysite-42. Ответ 201 несёт site_id, blog_id, domain, realm, order_id, plan, public и author.
| Код | Статус | Когда | Что делать |
|---|---|---|---|
plan_required | 400 | нет plan | возьмите код из GET /sites/plans |
invalid_name | 400 | name не подходит: не те символы, длиннее 50, дефис по краям или имя из занятых | выберите другое имя |
invalid_keep_frames | 400 | keep_frames не массив строк или передан без empty: true | исправьте поле |
unknown_field | 400 | в теле поле, которого нет в таблице выше; имена — в fields | уберите поле |
payment_required | 402 | тариф платный: заказ заведён, в ответе order_id, payment_url, amount, currency | оплатите по ссылке и следите за заказом |
plan_not_available | 403 | тариф вам недоступен | выберите другой тариф |
plan_not_found | 404 | такого кода нет среди ваших тарифов; доступные — в plans | возьмите код из plans |
site_exists | 409 | сайт domain уже есть | выберите другое имя |
order_in_progress | 409 | сайт по этому тарифу уже создаётся, номер в order_id | следите за заказом |
site_create_failed | 502 | сайт не создался | напишите в поддержку и укажите order_id |
GET /sites/orders/{order_id}
Отдаёт статус заказа сайта. Заказ видит только его владелец, заказы из консоли видны здесь же по номеру. Например, заказ после оплаты:
curl -s "$API/sites/orders/123" -H "Authorization: Bearer $OP_TOKEN"
{ "success": true, "order_id": 123, "status": "site_created", "plan": "simple", "name": "mysite", "blog_id": 279, "site_id": "R4wPE3dwq", "domain": "mysite.onpress.pro" }
status | Описание |
|---|---|
pending | не оплачен; в ответе снова payment_url |
paid | оплачен, сайт создаётся |
site_created | готово: site_id, blog_id, domain |
failed | сайт не создался |
Если сайт заказа уже удалён насовсем, в ответе site_removed: true и site_id: null.
| Код | Статус | Когда | Что делать |
|---|---|---|---|
order_not_found | 404 | заказа нет или он не ваш | проверьте номер |
DELETE /sites/{id}
Удаляет сайт. По умолчанию — в архив: посетители и поисковики сайт больше не видят, а страницы, файлы и настройки остаются, вернуть сайт можно через POST /sites/{id}/restore. С "mode": "purge" сайт удаляется насовсем, без возможности вернуть. Например, сначала посмотреть план удаления:
curl -s -X DELETE "$API/sites/$SITE" \
-H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
-d '{"dry_run": true}'
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
mode | string | archive | archive — в архив; purge — удалить всё |
dry_run | bool | false | вернуть план, ничего не меняя |
confirm | string | — | домен сайта; нужен для purge непустого сайта, точная строка — в plan.confirm_with |
План (plan): exists, domain, hosts, tables_count, tables_bytes, files, content, users (members, orphans), empty, confirm_required, confirm_with. archive отвечает {mode, blog_id, domain, before, removed, plan}, purge — план плюс tables (planned, by_core, swept), dirs и users. Сайт в архиве виден в GET /sites?status=trash.
| Код | Статус | Когда | Что делать |
|---|---|---|---|
invalid_mode | 400 | mode не archive и не purge | исправьте поле |
unknown_field | 400 | в теле лишнее поле | — |
site_not_found | 404 | сайта нет или он не ваш | проверьте {id} |
site_already_gone | 409 | сайт уже удалён | — |
confirmation_required | 428 | purge непустого сайта без confirm; в ответе confirm_with и plan | повторите с confirm |
POST /sites/{id}/restore
Возвращает сайт из архива: сайт снова открывается посетителям, видимость для поисковиков становится прежней. Тело не читается. Сайты в архиве — в GET /sites?status=trash. Например:
curl -s -X POST "$API/sites/$SITE/restore" -H "Authorization: Bearer $OP_TOKEN"
Ответ: blog_id, domain, archived, deleted, public, blog_public, restored_from, static_rebake_needed, rebake, warnings. Сайт, удалённый с purge, не вернуть — 404 site_not_found.