# API-ключи (/docs/dashboard/api-keys)
API-ключ нужен, чтобы пользоваться Fingprint: без него SDK и API не примут запрос. Ключ связывает запросы вашего проекта с группой в кабинете. При создании вы получаете пару ключей:
* **Публичный ключ** передаётся при настройке браузерного SDK и регистрации Telegram-визитов. По нему Fingprint API определяет проект.
* **Приватный ключ** хранится только на вашем сервере. Им Fingprint подписывает [webhooks](./webhooks), а ваш сервер проверяет подпись. Этим же ключом ваш сервер подписывает запросы на получение данных визитов и профилей через API Fingprint.
Ключи принадлежат группе, которая выбрана в боковом меню. Для каждого проекта или окружения удобно создать отдельный ключ: так события и webhooks будет проще разделять.
## Создание ключа [#создание-ключа]
Чтобы создать новую пару API-ключей откройте [**API-ключи**](https://gusyrooms.com/dashboard/api-keys) и нажмите **Новый ключ**. Укажите **Название** — оно обязательно — и при необходимости **Описание**. Нажмите **Создать API-ключ**.
После успешного создания откроется окно "API-ключ создан" с публичным и приватным ключами, скопируйте и сохраните оба значения. Публичный ключ вы всегда сможете посмотреть на странице [**API-ключи**](https://gusyrooms.com/dashboard/api-keys).
Сохраните приватный ключ сразу, например в менеджере секретов. Кабинет показывает его только один
раз. Если ключ потерян, создайте новую пару.
Новый ключ появится в таблице со статусом **Активен**. Передайте публичный ключ в параметр `apiKey` SDK — см. [быстрый старт](../getting-started/quickstart).
## Использование ключа [#использование-ключа]
В таблице **API-ключи** для каждого ключа видны:
| Столбец | Что показывает |
| --------------------------- | ---------------------------------------------------------------------------- |
| **API-ключ** | Публичный ключ. |
| **Последнее использование** | Время последнего запроса с этим ключом. |
| **Использование (24 часа)** | Число запросов за последние сутки. Значение обновляется с задержкой до часа. |
| **Статус** | **Активен** или **Отключён**. |
## Отправка запроса с приватным ключом [#отправка-запроса-с-приватным-ключом]
Приватным ключом подписывайте запросы на получение данных визитов и профилей — например, сохранённого профиля посетителя. Для регистрации [Telegram-визита](../integrations/telegram-bots) достаточно публичного ключа.
Передайте публичный ключ в заголовке `X-Public-Key`, а в заголовке `X-Signature` — подпись: HMAC-SHA256 от исходного тела запроса, посчитанный с приватным ключом в качестве секрета, в шестнадцатеричном виде. Сам приватный ключ в запросе не передаётся.
Для браузерного профиля используйте `POST /api/v1/fingerprint/visitor/profile`, для [Telegram-профиля](../integrations/telegram-bots#получите-данные-визита-или-профиль) — `POST /api/v1/fingerprint/visitor/profile/telegram`. В обоих случаях передайте в JSON поле `visitor_fp_hash` и подпишите отправляемое тело. Параметр `sdk` не требуется.
Пример запроса `POST /api/v1/fingerprint/visitor/profile` на Node.js. В `visitor_fp_hash` передайте значение `user`, которое вернул [`agent.get()`](../reference/agent-api#agentgetoptions) в браузере:
```ts
import crypto from 'node:crypto'
const publicKey = 'pk_live_example'
const privateKey = process.env.FINGPRINT_PRIVATE_KEY!
const body = JSON.stringify({ visitor_fp_hash: 'a1b2c3d4e5f6' })
const signature = crypto.createHmac('sha256', privateKey).update(body).digest('hex')
const response = await fetch('https://gusyrooms.com/api/v1/fingerprint/visitor/profile', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Public-Key': publicKey,
'X-Signature': signature,
},
body,
})
const profile = await response.json()
```
Fingprint ответит сохранённым профилем посетителя: `risk.level` — уровень риска (`no`, `low`, `medium` или `high`), статистика визитов в `statistics` и данные последнего визита и VPN в `latest_visit` и `latest_vpn`.
## Отключение ключа [#отключение-ключа]
Отключите ключ, если нужно временно остановить приём запросов, но сохранить его настройки. Откройте меню в строке ключа, выберите **Редактировать**, в поле **Статус ключа** выберите **Отключён** и нажмите **Сохранить**.
Запросы с отключённым ключом Fingprint API отклоняет со статусом `403`. SDK вернёт ошибку `API_HTTP_ERROR`, а `error.status` будет равен `403`. Чтобы снова принимать запросы, выберите статус **Активен**.
## Удаление ключа [#удаление-ключа]
Откройте меню в строке ключа, выберите **Удалить** и подтвердите действие. Удаление необратимо.
Вместе с ключом удаляются все webhooks, привязанные к нему. Перед удалением убедитесь, что ключ
больше не используется в коде: запросы с удалённым ключом будут отклоняться.
# Группы (/docs/dashboard/groups)
Группы помогают организовать проекты в личном кабинете Fingprint. Каждая группа объединяет API-ключи: по ним в кабинете отбираются визиты, аналитика и webhooks. При регистрации аккаунта создаётся группа **По умолчанию** — вы можете начать с неё или создать свою.
## Решите, какие проекты объединить [#решите-какие-проекты-объединить]
При поиске посетителя Fingprint API учитывает визиты, полученные через все API-ключи одной группы. Поэтому, объединив несколько проектов в группу, вы сможете находить одного и того же посетителя по его визитам в этих проектах.
Например, вы можете объединить ключи основного сайта и его приложения в одну группу. Для тестового окружения удобно создать отдельную группу, чтобы просматривать его визиты и аналитику отдельно от рабочего проекта.
Само объединение ключей не гарантирует, что Fingprint API вернёт одинаковый идентификатор посетителя на разных сайтах. Результат зависит от данных запроса и условий поиска.
## Выберите группу в кабинете [#выберите-группу-в-кабинете]
Выберите нужную группу в боковом меню перед работой с её данными. От выбранной группы зависят:
| Данные | Что вы увидите |
| ------------- | -------------------------------------- |
| **API-ключи** | Ключи, которые принадлежат группе. |
| **Визиты** | Визиты, полученные через ключи группы. |
| **Аналитика** | Показатели по ключам группы. |
| **Webhooks** | Webhooks, привязанные к ключам группы. |
Если ожидаемого ключа, визита или webhook нет в списке, сначала проверьте выбранную группу.
Переключение группы меняет данные, которые вы просматриваете в кабинете. Запросы SDK продолжают поступать с публичным ключом, указанным в его настройках. Fingprint API определяет группу запроса по этому ключу.
## Создайте группу [#создайте-группу]
В кабинете откройте управление группами и создайте новую группу. Она появится в списке со случайным номером. Название и описание можно изменить после создания.
Новая группа пустая: API-ключи в ней нужно создать отдельно.
## Добавьте API-ключ и проверьте визит [#добавьте-api-ключ-и-проверьте-визит]
Выберите новую группу в боковом меню, затем откройте **API-ключи** и [создайте ключ](./api-keys#создание-ключа). Он будет принадлежать выбранной группе.
В группе может быть до **50 API-ключей**. Отключённые ключи тоже учитываются в этом ограничении. Если лимит достигнут, перед созданием нового ключа удалите ненужный или создайте другую группу.
Передайте публичный ключ в параметр `apiKey` SDK и выполните первый запрос по [быстрому старту](../getting-started/quickstart). Затем выберите эту же группу в кабинете и откройте **Идентификация**: там должен появиться визит, отправленный с новым ключом.
Для настройки доставки событий на ваш сервер перейдите к [webhooks](./webhooks). При создании webhook выбирайте ключ нужной группы.
## Удалите ненужную группу [#удалите-ненужную-группу]
Перед удалением проверьте API-ключи группы и убедитесь, что ваши проекты больше их не используют. Затем удалите группу через управление группами в кабинете.
Вместе с группой удаляются все её API-ключи и привязанные к ним webhooks. Запросы с удалёнными
ключами больше не принимаются. Если проект должен продолжить работу, заранее создайте ключ в
другой группе, обновите настройки SDK и настройте webhooks для нового ключа.
Если удалена выбранная группа, кабинет использует самую новую из оставшихся групп. Проверьте выбор в боковом меню перед дальнейшей работой.
# Поддомены (/docs/dashboard/subdomains)
По умолчанию SDK загружает скрипт и отправляет запросы на адреса Fingprint. Блокировщики рекламы могут их блокировать, и тогда запрос идентификации не выполнится. Если подключить свой поддомен, например `metrics.example.com`, SDK будет обращаться к Fingprint через ваш домен.
Список поддоменов общий для аккаунта и не зависит от выбранной группы.
## Что понадобится [#что-понадобится]
* Свободный поддомен вашего сайта: на нём не должно быть других DNS-записей.
* Доступ к настройкам DNS домена.
## 1. Добавьте поддомен [#1-добавьте-поддомен]
Откройте **Поддомены** и нажмите **Добавить поддомен**. В поле **Адрес поддомена** укажите полное имя, например `metrics.example.com`, и нажмите **Создать**.
Поддомен появится в таблице со статусом **Ожидает верификации**, и откроется окно **Данные поддомена** с DNS-записями для подтверждения.
## 2. Добавьте DNS-записи [#2-добавьте-dns-записи]
В блоке **Верификация** указаны две записи. Скопируйте значения полей **Имя** и **Значение** и создайте записи у своего DNS-провайдера:
| Тип | Имя | Значение |
| ----- | --------------------------------------------- | --------------------------------------------------------- |
| CNAME | Имя поддомена без основного домена: `metrics` | Адрес Fingprint из поля **Значение**. |
| TXT | `_fingerprint-verify.metrics.example.com` | `fingerprint-domain-verification=…` из поля **Значение**. |
CNAME направляет запросы к поддомену в Fingprint. TXT подтверждает, что домен принадлежит вам.
Кабинет показывает имя CNAME-записи относительно домена второго уровня: для `metrics.example.com` это `metrics`. Если ваша DNS-зона устроена иначе, например `example.co.uk`, укажите имя относительно своей зоны. Для TXT-записи кабинет показывает полное имя. Если DNS-провайдер сам дописывает домен зоны, укажите только часть до него: `_fingerprint-verify.metrics`.
Чтобы снова открыть записи, в строке поддомена откройте меню и выберите **Детали**.
## 3. Дождитесь подтверждения [#3-дождитесь-подтверждения]
Fingprint проверяет ожидающие поддомены примерно раз в 5 минут. Обновление DNS у провайдера обычно занимает от нескольких минут до нескольких часов, а в редких случаях — до 24–48 часов: срок зависит от TTL записей и конкретного провайдера.
Когда обе записи найдены, статус в таблице меняется на **Активен**.
После подтверждения Fingprint выпускает TLS-сертификат для поддомена, поэтому HTTPS на нём может заработать не сразу после смены статуса.
## 4. Укажите поддомен в SDK [#4-укажите-поддомен-в-sdk]
Передайте адрес поддомена в параметр `endpoint`. Укажите только протокол и домен, без пути:
```ts
import { start } from '@fingerru/agent'
const agent = start({
apiKey: 'pk_live_example',
endpoint: 'https://metrics.example.com',
})
```
SDK загрузит скрипт с `https://metrics.example.com` и отправит запрос на `https://metrics.example.com/api/visit`. Остальные параметры описаны в [справочнике SDK](../reference/agent-api#endpoint).
## 5. Проверьте запрос [#5-проверьте-запрос]
Откройте сайт, вызовите `agent.get()` и во вкладке **Network** инструментов разработчика найдите запрос к `/api/visit`. Он должен уходить на ваш поддомен и завершаться успешным статусом. Затем найдите событие в кабинете в **Идентификация → События идентификации**.
Если SDK вернул ошибку, проверьте её код на странице [Ошибки SDK](../reference/errors). Чаще всего причина — поддомен ещё не в статусе **Активен** или в `endpoint` указан путь.
## Статусы поддомена [#статусы-поддомена]
| Статус | Что означает |
| ----------------------- | -------------------------------------------------------------------------- |
| **Ожидает верификации** | Записи ещё не найдены. Проверьте их у DNS-провайдера и дождитесь проверки. |
| **Активен** | Записи подтверждены, поддомен можно указывать в `endpoint`. |
| **Неактивен** | Поддомен был подтверждён, но при повторной проверке записи не найдены. |
Не удаляйте CNAME- и TXT-записи, пока используете поддомен: без них статус сменится на **Неактивен**. Если записи вернуть, статус снова станет **Активен** после следующей проверки.
# Webhooks (/docs/dashboard/webhooks)
Webhook — это HTTP POST-запрос, который Fingprint отправляет на ваш сервер, когда по посетителю появляется оценка риска. Так сервер узнаёт о потенциально опасном посетителе без отдельного запроса к API.
Webhook привязан к одному API-ключу и получает события только по запросам с этим ключом. К одному ключу можно привязать несколько webhooks.
## Что понадобится [#что-понадобится]
* [API-ключ](./api-keys) в выбранной группе и его приватный ключ. Если не сохранили приватный ключ, можете создать новую пару ключей.
* Адрес на вашем сервере, который принимает POST-запросы. Адрес должен использовать HTTPS и разрешаться в публичный IP-адрес. Адреса в локальной или частной сети не подходят.
## Подготовьте обработчик [#подготовьте-обработчик]
Fingprint отправляет JSON в теле запроса и подпись в заголовке `Authorization`. Подпись — это HMAC-SHA256 от исходного тела запроса, где секрет — приватный ключ. Значение передаётся в шестнадцатеричном виде, без префикса.
Проверяйте подпись по исходным байтам тела, до разбора JSON: после повторной сериализации подпись может не совпасть. Пример на Node.js с Express:
```ts
import crypto from 'node:crypto'
import express from 'express'
const app = express()
const privateKey = process.env.FINGPRINT_PRIVATE_KEY!
app.post('/webhooks/fingprint', express.raw({ type: '*/*' }), (req, res) => {
const expected = crypto.createHmac('sha256', privateKey).update(req.body).digest('hex')
const received = req.get('Authorization') ?? ''
const isValid =
Buffer.byteLength(received) === Buffer.byteLength(expected) &&
crypto.timingSafeEqual(Buffer.from(received), Buffer.from(expected))
if (!isValid) {
return res.sendStatus(401)
}
const event = JSON.parse(req.body.toString('utf8'))
if (event.event === 'webhook.verification') {
return res.status(200).json({ challenge: event.data.challenge })
}
console.log(event.event, event.data.visitor_id)
res.sendStatus(200)
})
app.listen(3000)
```
На событие `webhook.verification` ответьте кодом `2xx` и JSON с полученным значением `challenge`. Так Fingprint проверяет, что обработчик готов принимать запросы. Для событий риска достаточно ответа `2xx` после проверки подписи. Долгую обработку выполняйте после ответа: Fingprint ждёт ответ не больше 10 секунд.
## Создайте webhook [#создайте-webhook]
Откройте [**Webhooks**](https://gusyrooms.com/dashboard/webhooks) и нажмите **Новый Webhook**. Заполните поля:
* **URL** — адрес обработчика, например `https://example.com/webhooks/fingprint`;
* API-ключ — выберите ключ, по запросам которого нужно получать события;
* **Описание** — необязательно. Опишите для чего предназначен конкретный Webhook.
Нажмите **Создать Webhook**. Fingprint отправит проверочный запрос `webhook.verification`. Пока идёт проверка, события риска не отправляются. После ответа с правильным `challenge` webhook станет активным.
Если в группе ещё нет ключей, в поле выбора ключа нажмите **Создать API-ключ**. После создания сохраните приватный ключ — он будет показан один раз. Затем вы вернётесь к форме webhook: введённые данные сохранятся, а новый ключ будет выбран.
Привязанный ключ у существующего webhook изменить нельзя. Чтобы получать события по другому ключу, создайте новый webhook.
## Проверьте подтверждение адреса [#проверьте-подтверждение-адреса]
В списке **Webhooks** проверьте, что созданный webhook стал активным. Если проверка не прошла, откройте **Журнал** и проверьте ответ обработчика на `webhook.verification`: в JSON ответа должно быть поле `challenge` с тем же значением, что в запросе. Значение действует 15 минут.
Проверочный запрос отправляется один раз, без автоматических повторов. Исправьте обработчик и запустите повторную проверку в кабинете.
При изменении URL webhook нужно подтвердить новый адрес. До подтверждения события риска не отправляются. Ранее подтверждённый webhook можно отключить и снова включить без новой проверки, если URL не изменился.
## Проверьте доставку [#проверьте-доставку]
Убедитесь, что webhook активен, и выполните запрос идентификации с привязанным ключом. Затем в таблице **Webhooks** нажмите **Журнал** в строке webhook.
**Журнал доставки** показывает каждую попытку отправки: время, событие, **Visitor ID**, код ответа вашего сервера и время ответа. Если код ответа пустой, сервер не ответил: например, соединение не установилось.
Над таблицей видны сводные показатели за последние 24 часа: **Доставлено за 24 ч**, **Сбоев за 24 ч** и **Ср. время ответа**. Сбоем считается ответ с ошибкой или отсутствие ответа.
Не каждый запрос идентификации приводит к webhook. Событие `visitor.risk_snapshot_update`
отправляется, только когда меняется оценка риска посетителя. Если в журнале нет доставок, это не
всегда означает ошибку.
## События [#события]
Тип события указан в поле `event`.
| Событие | В кабинете | Когда отправляется |
| ------------------------------ | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `visitor.risk_snapshot_update` | Обновление снимка риска | Только после запроса идентификации, при котором изменилась оценка риска посетителя. Для нового посетителя — только если обнаружен риск: уровень риска выше `no`, режим инкогнито, опасный браузер или VPN. |
| `webhook.verification` | Проверка адреса | При создании webhook, изменении URL или запуске повторной проверки. В ответ нужно вернуть полученный `challenge`. |
## Формат запроса [#формат-запроса]
Тело запроса содержит общие поля и данные события в `data`:
| Поле | Описание |
| ----------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `id` | UUID запроса. При повторной попытке генерируется заново. |
| `timestamp` | Время отправки в формате ISO 8601. |
| `event` | Тип события. |
| `data` | Данные события. У события риска поле `data.visitor_id` совпадает со значением `user` из SDK. У проверочного события здесь только `challenge`. |
### webhook.verification [#webhookverification]
```json
{
"id": "0f8b6f2e-5d7a-4c1e-9b3a-2a6c1d4e8f90",
"timestamp": "2026-10-07T10:15:30.000000Z",
"event": "webhook.verification",
"data": {
"challenge": "c7a12e9f4b6038d25a91f0c6e3d847b2a56c09e18f3b7d4a6205c8e9f1a3b6d0"
}
}
```
После проверки подписи верните HTTP `200` с JSON:
```json
{
"challenge": "c7a12e9f4b6038d25a91f0c6e3d847b2a56c09e18f3b7d4a6205c8e9f1a3b6d0"
}
```
### visitor.risk_snapshot_update [#visitorrisk_snapshot_update]
```json
{
"id": "0f8b6f2e-5d7a-4c1e-9b3a-2a6c1d4e8f90",
"timestamp": "2026-09-29T10:15:30.000000Z",
"event": "visitor.risk_snapshot_update",
"data": {
"visitor_id": "a1b2c3d4e5f6",
"risk": {
"level": "medium",
"has_incognito": false,
"has_telegram_browser": false,
"has_vpn": true,
"has_danger_browser": false
},
"statistics": {
"visits_count": 12,
"incognito_visits_count": 0,
"vpn_visits_count": 3,
"unique_ip_count": 4,
"unique_location_count": 2,
"unique_device_count": 1
},
"latest_visit": {
"at": "2026-09-29T10:15:28.000000Z",
"ip_address": "203.0.113.10",
"browser": "Chrome",
"os": "Windows",
"location": { "country_code": "RU", "city": "Москва" }
},
"latest_vpn": {
"ip_address": "203.0.113.10",
"detected_at": "2026-09-29T10:15:28.000000Z"
},
"updated_at": "2026-09-29T10:15:29.000000Z"
}
}
```
`risk.level` принимает значения `no`, `low`, `medium` или `high`. Поля `latest_visit`, `latest_visit.location` и `latest_vpn` могут быть `null`, если данных нет.
# О продукте (/docs/getting-started/about)
Fingprint помогает узнавать повторных посетителей сайта и выявлять подозрительные визиты для аналитики аудитории и защиты от злоупотреблений.
## Узнавайте повторных посетителей [#узнавайте-повторных-посетителей]
Очистка cookies или режим инкогнито могут сделать возвращающегося посетителя новым для обычной аналитики. Fingprint помогает распознавать повторные визиты, даже когда сохранённый идентификатор недоступен. Так вы можете отличать новую аудиторию от возвращающейся.
## Выявляйте подозрительные визиты [#выявляйте-подозрительные-визиты]
Fingprint предоставляет оценку риска и признаки использования VPN, прокси и Tor. Эти данные помогают обнаруживать подозрительную активность и принимать решения о дополнительной проверке посетителей. Оценка риска и профиль посетителя доступны через [серверный API](../reference/external-api).
## Как это работает [#как-это-работает]
После подключения к сайту Fingprint анализирует характеристики браузера, устройства и сети посетителя и сопоставляет их с предыдущими визитами. При совпадении посещения связываются с одним идентификатором и складываются в историю визитов. Возможность сопоставления зависит от того, насколько совпадают эти характеристики и сетевые параметры.
## Основные понятия [#основные-понятия]
* **Посетитель** — сущность, которой Fingprint API возвращает идентификатор `user`.
* **Публичный API-ключ** — ключ проекта, который передаётся в браузер при настройке SDK. Он нужен Fingprint API, чтобы определить, к какому проекту относится запрос.
* **SDK** — JavaScript-библиотека Fingprint. Она собирает данные браузера, отправляет запрос в API и возвращает результат приложению.
Чтобы пройти путь от получения ключа до проверки первого запроса в кабинете, следуйте [быстрому старту](./quickstart).
# Быстрый старт (/docs/getting-started/quickstart)
Выполните четыре шага, чтобы получить идентификатор посетителя и проверить запрос в кабинете Fingprint.
## 1. Получите публичный API-ключ [#1-получите-публичный-api-ключ]
Войдите в кабинет Fingprint и выберите группу проекта. В боковом меню откройте **API-ключи** и нажмите **Новый ключ**. Укажите название и нажмите **Создать API-ключ**.
После создания скопируйте значение из поля **Публичный ключ**. JavaScript SDK использует публичный ключ в браузере. Приватный ключ ему не нужен.
Если ключ уже создан, скопируйте его из столбца **API-ключ** на странице **API-ключи**.
## 2. Установите пакет [#2-установите-пакет]
В каталоге JavaScript-проекта выберите пакетный менеджер, который используете:
```bash
npm install @fingerru/agent
```
```bash
yarn add @fingerru/agent
```
```bash
pnpm add @fingerru/agent
```
## 3. Отправьте первый запрос [#3-отправьте-первый-запрос]
В клиентском коде создайте агента и вызовите `agent.get()`. Замените `pk_live_example` на публичный ключ проекта.
```ts
import { start } from '@fingerru/agent'
const agent = start({ apiKey: 'pk_live_example' })
const visitor = await agent.get()
console.log(visitor.user)
```
В консоли появится идентификатор посетителя из поля `visitor.user`.
### Если запрос завершился ошибкой [#если-запрос-завершился-ошибкой]
Обработайте `FingprintAgentError` и выведите её код из поля `code`:
```ts
import { FingprintAgentError, start } from '@fingerru/agent'
const agent = start({ apiKey: 'pk_live_example' })
try {
const visitor = await agent.get()
console.log(visitor.user)
} catch (error) {
if (error instanceof FingprintAgentError) {
console.error('Не удалось получить идентификатор:', error.code)
} else {
console.error('Неожиданная ошибка:', error)
}
}
```
## 4. Проверьте событие в кабинете [#4-проверьте-событие-в-кабинете]
Перейдите в кабинете в **Идентификация → События идентификации**. Найдите запись по значению `visitor.user` в столбце **Visitor ID**. По умолчанию таблица показывает события за сегодня.
На снимке показана запись события идентификации. После вызова `agent.get()` обновите страницу. Если новое событие не появилось, проверьте выбранную группу и период, активность ключа и результат запроса.
# JavaScript (/docs/integrations/javascript)
Используйте `@fingerru/agent` в приложении на JavaScript или подключите SDK через CDN в HTML. Для работы понадобится публичный API-ключ проекта. В [быстром старте](../getting-started/quickstart) показано, как получить ключ и проверить запрос.
## Установите пакет [#установите-пакет]
```bash
npm install @fingerru/agent
```
```bash
yarn add @fingerru/agent
```
```bash
pnpm add @fingerru/agent
```
Создайте агента с публичным ключом и вызовите `get()`, когда понадобится идентификатор:
```js
import { start } from '@fingerru/agent'
const agent = start({ apiKey: 'pk_live_example' })
const visitor = await agent.get()
console.log(visitor.user)
```
Замените `pk_live_example` на публичный ключ своего проекта.
## Подключите через CDN [#подключите-через-cdn]
Если вы подключаете скрипты напрямую в HTML, добавьте SDK перед закрывающим тегом `