> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbitflare.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Аутентификация в Apex

> Аутентифицируйтесь в OrbitFlare Apex через заголовок x-api-key или параметр запроса api-key по HTTP либо через клиентский сертификат, производный от вашего ключа, по QUIC.

## Получите API-ключ

Apex находится в бета-версии и доступен только по приглашениям. Когда ваш аккаунт будет активирован, откройте [панель управления OrbitFlare](https://orbitflare.com/dashboard) и перейдите в раздел **Dashboard > Apex**, чтобы создать ключ. Каждый ключ относится к тарифу, а тариф задаёт ваш минимум чаевых и лимит запросов.

<Warning>
  Обращайтесь с ключом как с паролем. Любой, у кого он есть, может отправлять транзакции в счёт вашего лимита запросов. Потратить ваши средства он не может: транзакции по-прежнему подписываются вашей собственной ключевой парой.
</Warning>

## HTTP: заголовок или параметр запроса

По HTTP ключ передаётся с каждым запросом. Передать его можно двумя способами:

| Способ                                    | Пример                                                | Примечания                                                            |
| ----------------------------------------- | ----------------------------------------------------- | --------------------------------------------------------------------- |
| **Заголовок `x-api-key`** (рекомендуется) | `x-api-key: YOUR_API_KEY`                             | Ключ не попадает в URL, логи и историю браузера                       |
| **Параметр запроса `api-key`**            | `http://fra.apex.orbitflare.com?api-key=YOUR_API_KEY` | Для инструментов, которые принимают только URL, например поле RPC URL |

<CodeGroup>
  ```bash Header theme={null}
  curl -s http://fra.apex.orbitflare.com \
    -H "Content-Type: application/json" \
    -H "x-api-key: $APEX_API_KEY" \
    -d '{"jsonrpc":"2.0","id":1,"method":"getTipAccounts","params":[]}'
  ```

  ```bash Query parameter theme={null}
  curl -s "http://fra.apex.orbitflare.com?api-key=$APEX_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc":"2.0","id":1,"method":"getTipAccounts","params":[]}'
  ```
</CodeGroup>

Те же два варианта работают на простых HTTP-маршрутах (`/send`, `/send-bin`, `/send-batch`, `/send-bundle`).

<Warning>
  HTTP-маршруты не шифруются, как и у других отправителей Solana: ваш API-ключ и транзакции может прочитать любой, кто находится на сетевом пути. Предпочитайте QUIC, где ключ не покидает вашу машину, или отправляйте по HTTP только из доверенной сети. Если считаете, что ключ был раскрыт, перевыпустите его в панели управления.
</Warning>

`getTipAccounts`, `getVersion`, `health` и `GET /ping` не требуют ключа. Всё, что отправляет транзакцию, требует.

При отсутствующем или недействительном ключе возвращается ошибка JSON-RPC `-32001` или HTTP `401` на простых маршрутах. См. [Ошибки и лимиты запросов](/ru/apex/errors-and-rate-limits).

## QUIC: клиентский сертификат

В QUIC отдельные запросы не аутентифицируются, и **ваш API-ключ никогда не передаётся по сети**. Вместо этого:

1. Ваш клиент выводит ключевую пару ed25519 из API-ключа.
2. Он предъявляет этот публичный ключ в своём клиентском TLS-сертификате во время QUIC-рукопожатия.
3. Эндпоинт Apex сопоставляет публичный ключ с вашим аккаунтом. С этого момента каждый поток в этом соединении принадлежит вам.

Крейт Rust [`apex-sender-client`](/ru/apex/rust-client) делает всё это за вас. Для других языков вывод ключа выглядит так:

```text theme={null}
seed    = HKDF-SHA256(ikm = api_key bytes, salt = "apex-sender", info = "apex-sender-client-cert", L = 32)
keypair = ed25519 keypair from seed
```

Оберните публичный ключ в фиктивный сертификат X.509 Solana, в том же формате, который валидаторы используют для TPU QUIC (`new_dummy_x509_certificate` в крейте `solana-tls-utils`). Эндпоинт проверяет только ключ внутри сертификата. Остальные поля сертификата игнорируются.

**Тестовый вектор:** из API-ключа `test-api-key` выводится публичный ключ `ANPhYB8kmb2puLauuJKSX5orMk3rVT87gBWWy94F68hU`.

Если рукопожатие не удалось, эндпоинт закрывает соединение с кодом ошибки приложения:

| Код закрытия | Значение                                                                            |
| ------------ | ----------------------------------------------------------------------------------- |
| `1`          | Клиентский сертификат не был предъявлен                                             |
| `2`          | Ключ сертификата не соответствует ни одному API-ключу                               |
| `3`          | Слишком много соединений: не более 128 на API-ключ и 64 на адрес. Достаточно одного |

### Проверьте свой выведенный ключ

Панель управления показывает клиентский публичный ключ рядом с каждым API-ключом. Если ваше QUIC-соединение отклоняется, сравните эти два ключа. С помощью крейта Rust:

```rust theme={null}
use apex_sender_client::client_pubkey;

fn main() {
    let api_key = std::env::var("APEX_API_KEY").expect("APEX_API_KEY is required");
    // Prints the certificate key only, never the API key itself.
    println!("{}", client_pubkey(&api_key));
}
```

Несовпадение означает, что ключ был скопирован неправильно.

## Браузеры

Каждый HTTP-ответ содержит `Access-Control-Allow-Origin: *`, а на предварительные запросы `OPTIONS` даётся ответ, поэтому вы можете обращаться к эндпоинту Apex из браузерного кода.

<Warning>
  API-ключ, встроенный в публичную веб-страницу, виден каждому посетителю. Для публичных фронтендов отправляйте через собственный бэкенд или используйте ключ, который вы готовы заменить.
</Warning>

Эндпоинты Apex обслуживаются по обычному HTTP на порту 80. Страница, которая сама загружена по HTTPS, подпадает под правила браузера о смешанном содержимом, поэтому тестируйте в той среде, в которой планируете выпускать продукт.
