# NEXUS Hub — API для подключения сайта

Центр управления: https://nexus-hub-one.vercel.app
Задача: сайт отправляет в хаб заказы, заявки, события и сообщения чата. Оператор видит их в кабинете проекта.

## База

- SDK (готовый скрипт): `https://nexus-hub-one.vercel.app/nexus.js`
- API (REST): `https://pbohoyjljoearupyamku.supabase.co/rest/v1/rpc/`
- Заголовок для всех REST-запросов: `apikey: <ANON>` и `Content-Type: application/json`
- ANON (публичный ключ, можно держать в коде сайта):
```
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InBib2hveWpsam9lYXJ1cHlhbWt1Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3ODYwMzg5MjIsImV4cCI6MjEwMTYxNDkyMn0.55HJ-a4mIly88zuNefHCCorMAu0k6n7zfLLQdOzChnw
```
- `PUBLIC_KEY` (`pk_...`) — свой у каждого сайта. Берётся в кабинете: «Сайты и ключи» → открыть сайт → Public key. Он публичный, умеет только ПРИСЫЛАТЬ данные в свой проект.

---

## Вариант A — через готовый SDK (обычный сайт)

Вставить один раз в `<head>` каждой страницы:
```html
<script src="https://nexus-hub-one.vercel.app/nexus.js"></script>
<script>
  NEXUS.init("pk_ВАШ_КЛЮЧ");
  NEXUS.chat.mount({ title: "Название магазина", color: "#6d5efc" }); // виджет чата, по желанию
</script>
```

Вызовы:
```js
// Заказ (из корзины / кнопки «Купить»)
NEXUS.order({
  name: "Иван",
  phone: "+79990001122",
  email: "ivan@mail.ru",            // необязательно
  total: 5400,
  items: [{ t: "Товар", qty: 2, price: 2700 }],
  comment: "побыстрее",             // необязательно
  source: "корзина"                 // необязательно
});

// Заявка / обратный звонок (из формы)
NEXUS.lead({
  name: "Пётр",
  phone: "+79990003344",
  email: "",                        // необязательно
  comment: "перезвоните",
  source: "ads",                    // необязательно
  utm: { utm_source: "yandex", utm_campaign: "shiny" } // необязательно
});

// Событие / аналитика (pageview шлётся сам при init)
NEXUS.track("add_to_cart", "/tovar/123", { sku: "ABC" });
```

---

## Вариант B — напрямую по REST (сервер, бот, любой бэкенд)

### Заказ
```
POST https://pbohoyjljoearupyamku.supabase.co/rest/v1/rpc/nx_ingest_order
apikey: <ANON>
Content-Type: application/json

{
  "pkey": "pk_ВАШ_КЛЮЧ",
  "payload": {
    "name": "Иван",
    "phone": "+79990001122",
    "email": "ivan@mail.ru",
    "total": 5400,
    "items": [{ "t": "Товар", "qty": 2, "price": 2700 }],
    "comment": "побыстрее",
    "source": "site"
  }
}
```
Ответ: `{ "ok": true, "id": "<uuid>", "number": 12 }`

### Заявка
```
POST .../rpc/nx_ingest_lead
{
  "pkey": "pk_ВАШ_КЛЮЧ",
  "payload": {
    "name": "Пётр", "phone": "+79990003344",
    "email": "", "comment": "перезвоните",
    "source": "ads", "utm": { "utm_source": "yandex" }
  }
}
```
Ответ: `{ "ok": true, "id": "<uuid>" }`

### Событие
```
POST .../rpc/nx_track
{ "pkey": "pk_ВАШ_КЛЮЧ", "p_type": "pageview", "p_path": "/catalog", "p_meta": {} }
```

### Чат поддержки (со стороны посетителя)
```
POST .../rpc/nx_chat_start
{ "pkey":"pk_ВАШ_КЛЮЧ", "p_name":"Гость", "p_contact":"+7...", "p_page":"/catalog" }
→ { "ok": true, "chat": "<uuid>", "token": "<token>" }

POST .../rpc/nx_chat_send
{ "p_token":"<token>", "p_body":"Здравствуйте" }

POST .../rpc/nx_chat_poll
{ "p_token":"<token>", "p_since": null }
→ { "ok": true, "status": "open", "messages": [ { "sender":"staff", "body":"...", "at":"..." } ] }
```

---

## Поля

**order.payload:** `name`, `phone`, `email?`, `total` (число), `items?` (массив `{t,qty,price}`), `comment?`, `source?`, `meta?`
**lead.payload:** `name`, `phone`, `email?`, `comment?`, `source?`, `utm?` (объект)

Всё, кроме ключа и способа связи, опционально. Неверный ключ → ошибка `invalid key`.

---

## Обратный звонок / заявки

Любая форма «перезвоните мне» или заявка должна вызывать `NEXUS.lead({ name, phone, comment })`.
Такие заявки появляются в кабинете (раздел «Заявки») и автоматически падают в рабочую
Telegram-группу обратных звонков. Отдельно ничего настраивать не нужно.

## Telegram-уведомления (автоматически)

Бот подключён на уровне всей сети, поэтому с подключённого сайта:
- новый ЗАКАЗ (`NEXUS.order`) приходит в группу «ВЫДАЧА QR» с кнопкой «Оплачено»;
- новая ЗАЯВКА / обратный звонок (`NEXUS.lead`) приходит в группу «ОБРАТНЫЙ ЗВОНОК».
На стороне сайта нужно только корректно вызывать `NEXUS.order` и `NEXUS.lead` — остальное хаб делает сам.

## Для AI-агента (встроить в существующий сайт)

1. Узнать `PUBLIC_KEY` сайта (спросить владельца или взять в кабинете хаба). Не выдумывать ключ.
2. Если у сайта есть общий шаблон/хедер — добавить блок из «Варианта A» туда.
3. Если у сайта свой обработчик заказов/форм (например `api/order.js`) — добавить в него форвард из «Варианта B» (заказ уйдёт и туда, куда уже шёл, и в хаб).
4. Проверить: отправить тестовый заказ и заявку, убедиться, что появились в кабинете проекта.
5. `pk_` публичный — ок в коде. `secret key` из карточки в коде сайта НЕ использовать.
