Аккаунт
Методов в разделе: 4. Все методы
GET /me Доступно
#Кто я
Возвращает арендатора, интеграцию, ключ с действующими областями, пределы частоты и состояние кошелька. Областей не требует: нужен лишь действующий ключ. Удобно для проверки подключения и для выбора ячейки.
- Области
- не требуются, нужен действующий ключ
- Предел частоты
- чтение
- Идемпотентность
- не требуется
- Успешный ответ
200 Описание ключа и аккаунта.
Тело ответа
| Поле | Тип | Описание |
|---|
tenant | object обязательное | Арендатор — владелец ключа. |
tenant.id | string обязательное | |
tenant.name | string обязательное | |
cell | string обязательное | Ячейка платформы: ru, en или id. Значения: ru en id |
base_url | string обязательное | Базовый адрес API этой ячейки. |
integration | object обязательное | Интеграция (служебная учётная запись), которой принадлежит ключ. |
integration.id | string обязательное | |
integration.name | string обязательное | |
channel_id | string обязательное, может быть null | Канал "api" интеграции; null — канал ещё не создан. |
key | object обязательное | |
key.key_id | string обязательное | Публичный идентификатор ключа (не секрет). |
key.mode | string обязательное | Значения: live test |
key.scopes | array<string> обязательное | Действующие области: область интеграции ∩ текущие права владельца ∩ лицензия. Значения: conversations:read conversations:write ai_seller:invoke leads:read leads:write leads:score analytics:read analytics:write dashboards:read articles:read articles:write articles:generate strategist:read strategist:write strategist:chat webhooks:manage channels:read channels:write cards:read cards:write |
key.expires_at | string обязательное | Срок действия ключа, ISO 8601 UTC. |
key.ip_allowlist | array<string> обязательное, может быть null | Разрешённые адреса и сети (CIDR); null — любой адрес. |
limits | object обязательное | Пределы частоты запросов и платных операций. |
limits.read_per_min | integer обязательное | |
limits.write_per_min | integer обязательное | |
limits.paid_per_min | integer обязательное | |
limits.paid_concurrency | integer обязательное | Одновременных платных операций ИИ на интеграцию; сверх — 429 concurrency_limit. |
limits.max_operation_cost | Money обязательное, может быть null | Максимум стоимости одной платной операции в валюте кошелька (оценка выше — 402 spend_limit_reached); null — не удалось прочитать. |
wallet | object обязательное | Кошелёк арендатора (ИИ-операции). |
wallet.balance | Money обязательное, может быть null | Остаток кошелька в рублях; null — состояние неизвестно или арендатор не тарифицируется. |
wallet.state | string обязательное | ok — достаточно; low — мало средств; negative — остаток ниже нуля; blocked — кошелёк заблокирован; unknown — состояние получить не удалось. Подробности — GET /wallet. Значения: ok low negative blocked unknown |
wallet.exchange | string обязательное | suspended при negative и blocked: все маршруты, кроме /me и /wallet, отвечают 402 wallet_suspended. Значения: active suspended |
wallet.topup_url | string обязательное | Адрес кабинета, где пополняется кошелёк. |
wallet.daily_spend | object обязательное, может быть null | Суточные траты интеграции; null — посчитать не удалось. |
wallet.daily_spend.limit | Money обязательное, может быть null | Суточный предел трат интеграции; null — не задан. |
wallet.daily_spend.used | Money обязательное | Списано за платные операции интеграции с начала местных суток ячейки. |
crm_mode | string обязательное | Режим CRM арендатора: "internal" (наша CRM) или внешняя система. |
pii_encryption | PiiEncryption необязательное, может быть null | Только ячейки EN и ID: формат JWE полей с персональными данными; null — настройку прочитать не удалось. На ячейке RU поля нет. |
Примеры
Запрос
curl -X GET 'https://wfacademy.id/api/public/v1/me' \
-H 'Authorization: Bearer '"$API_KEY"
Ответ 200
{
"tenant": {
"id": "EXAMPLE_ID",
"name": "string"
},
"cell": "ru",
"base_url": "https://example.com/hooks/sapport",
"integration": {
"id": "EXAMPLE_ID",
"name": "string"
},
"channel_id": "EXAMPLE_ID",
"key": {
"key_id": "EXAMPLE_ID",
"mode": "live",
"scopes": [
"conversations:read"
],
"expires_at": "2026-10-11T09:00:00Z",
"ip_allowlist": [
"string"
]
},
"limits": {
"read_per_min": 0,
"write_per_min": 0,
"paid_per_min": 0,
"paid_concurrency": 0,
"max_operation_cost": {
"amount": null,
"currency": null
}
},
"wallet": {
"balance": {
"amount": null,
"currency": null
},
"state": "ok",
"exchange": "active",
"topup_url": "https://example.com/hooks/sapport",
"daily_spend": {
"limit": null,
"used": null
}
},
"crm_mode": "string",
"pii_encryption": {
"mode": "off",
"key": null,
"previous_key": null,
"accepted": null
}
}
Пример ошибки
{
"type": "https://wfacademy.id/developers/errors#invalid_api_key",
"title": "Invalid API key",
"status": 401,
"code": "invalid_api_key",
"detail": "EXAMPLE",
"request_id": "req_EXAMPLE"
}
Примеры иллюстративны: ключ в них условный (EXAMPLE), значения полей выдуманы.
Возможные ошибки
invalid_api_key wrong_cell integration_inactive tenant_inactive ip_not_allowed feature_not_in_plan rate_limited service_unavailable internal_error
PUT /me/encryption-key Доступно
#Открытый ключ для формата JWE
Только ячейки EN и ID; на RU — 404. Регистрирует или меняет открытый ключ получателя (JWK), на который формируются значения полей с персональными данными в формате JWE (RFC 7516). Ключевую пару создаёте вы и храните закрытый ключ у себя; закрытые части JWK отклоняются. EN: ECDH-ES+A256KW (P-256, P-384, X25519) или RSA-OAEP-256 (от 2048 бит). ID: ECDH-ES+A256KW (P-384, X25519) или RSA-OAEP-256 / RSA-OAEP-384 (от 3072 бит). enc — A256GCM. Тот же ключ повторно — changed: false. Новый ключ действует сразу; прежний ещё 7 суток можно запросить заголовком Encryption-Key-Id. Регистрация переводит режим off в optional; режим required меняется только в кабинете.
- Области
webhooks:manage
- Предел частоты
- запись
- Идемпотентность
- не требуется
- Успешный ответ
200 Настройка после регистрации.
Тело запроса Открытый ключ получателя.
| Поле | Тип | Описание |
|---|
jwk | object обязательное | Открытый ключ получателя (JWK) с полем alg. Закрытые части (d, p, q, dp, dq, qi, k) не принимаются. |
Тело ответа
| Поле | Тип | Описание |
|---|
mode | string обязательное | off — поля с персональными данными выдаются как есть; optional — в формате JWE, если ключ зарегистрирован; required — только в формате JWE (без ключа — 409 encryption_key_required). Режим меняется в кабинете. Значения: off optional required |
key | object обязательное, может быть null | Действующий открытый ключ получателя; null — не зарегистрирован. |
key.kid | string обязательное | Идентификатор ключа (из JWK или отпечаток RFC 7638). |
key.alg | string обязательное | Алгоритм согласования ключа: ECDH-ES+A256KW, RSA-OAEP-256 или RSA-OAEP-384. |
key.kty | string обязательное | Значения: EC OKP RSA |
key.crv | string обязательное, может быть null | Кривая (EC/OKP); null у RSA. |
key.rsa_bits | integer обязательное, может быть null | Длина модуля RSA, бит; null у EC/OKP. |
key.thumbprint | string обязательное | Отпечаток открытого ключа (RFC 7638, SHA-256). |
key.created_at | string обязательное | Когда ключ зарегистрирован, ISO 8601 UTC. |
previous_key | object обязательное, может быть null | Прежний ключ после смены: его ещё можно запросить заголовком Encryption-Key-Id до expires_at (7 суток). |
previous_key.kid | string обязательное | Идентификатор ключа (из JWK или отпечаток RFC 7638). |
previous_key.alg | string обязательное | Алгоритм согласования ключа: ECDH-ES+A256KW, RSA-OAEP-256 или RSA-OAEP-384. |
previous_key.kty | string обязательное | Значения: EC OKP RSA |
previous_key.crv | string обязательное, может быть null | Кривая (EC/OKP); null у RSA. |
previous_key.rsa_bits | integer обязательное, может быть null | Длина модуля RSA, бит; null у EC/OKP. |
previous_key.thumbprint | string обязательное | Отпечаток открытого ключа (RFC 7638, SHA-256). |
previous_key.created_at | string обязательное | Когда ключ зарегистрирован, ISO 8601 UTC. |
previous_key.expires_at | string обязательное, может быть null | |
accepted | object обязательное, может быть null | Какие ключи принимает эта ячейка. |
accepted.alg | array<string> обязательное | |
accepted.crv | array<string> обязательное | |
accepted.min_rsa_bits | integer обязательное | |
accepted.enc | string обязательное | |
changed | boolean обязательное | false — этот же ключ уже был зарегистрирован. |
Примеры
Запрос
curl -X PUT 'https://wfacademy.id/api/public/v1/me/encryption-key' \
-H 'Authorization: Bearer '"$API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"jwk": {}
}'
Ответ 200
{
"mode": "off",
"key": {
"kid": "string",
"alg": "string",
"kty": "EC",
"crv": "string",
"rsa_bits": 0,
"thumbprint": "string",
"created_at": "2026-10-11T09:00:00Z"
},
"previous_key": {
"kid": "string",
"alg": "string",
"kty": "EC",
"crv": "string",
"rsa_bits": 0,
"thumbprint": "string",
"created_at": "2026-10-11T09:00:00Z",
"expires_at": "2026-10-11T09:00:00Z"
},
"accepted": {
"alg": [
"string"
],
"crv": [
"string"
],
"min_rsa_bits": 0,
"enc": "string"
},
"changed": false
}
Пример ошибки
{
"type": "https://wfacademy.id/developers/errors#scope_missing",
"title": "Scope is missing",
"status": 403,
"code": "scope_missing",
"detail": "EXAMPLE",
"request_id": "req_EXAMPLE"
}
Примеры иллюстративны: ключ в них условный (EXAMPLE), значения полей выдуманы.
Возможные ошибки
invalid_api_key wrong_cell integration_inactive tenant_inactive ip_not_allowed feature_not_in_plan rate_limited wallet_suspended service_unavailable internal_error scope_missing not_found bad_request validation_failed payload_too_large invalid_state
GET /wallet Доступно
#Кошелёк и состояние обмена
Возвращает остаток кошелька арендатора, его состояние (ok, low, negative, blocked, unknown), признак остановки обмена и адрес пополнения. Областей не требует и работает даже при остановленном обмене: именно здесь видно, почему остальные маршруты отвечают 402 wallet_suspended. Остаток меньше нуля или заблокированный кошелёк останавливают обмен; после пополнения он возобновляется сам в течение 30 секунд.
- Области
- не требуются, нужен действующий ключ
- Предел частоты
- чтение
- Идемпотентность
- не требуется
- Успешный ответ
200 Состояние кошелька.
Тело ответа
| Поле | Тип | Описание |
|---|
balance | Money обязательное, может быть null | Остаток кошелька в рублях (кошелёк ведётся в RUB на любой ячейке); null — состояние неизвестно или арендатор не тарифицируется. |
state | string обязательное | ok — достаточно; low — мало средств (обмен идёт); negative — остаток ниже нуля; blocked — кошелёк заблокирован; unknown — состояние получить не удалось. Значения: ok low negative blocked unknown |
exchange | string обязательное | suspended при negative и blocked: все маршруты, кроме /me и /wallet, отвечают 402 wallet_suspended, вебхуки откладываются. При unknown остаётся active: бесплатное чтение идёт с заголовком Wallet-State: unknown, платные операции закрыты (503). Значения: active suspended |
topup_url | string обязательное | Адрес кабинета, где пополняется кошелёк (нужен вход сотрудника с правом пополнения). |
daily_spend | object обязательное, может быть null | Суточные траты интеграции: списания за её платные операции с начала местных суток ячейки; null — посчитать не удалось. |
daily_spend.limit | Money обязательное, может быть null | Суточный предел трат интеграции; null — не задан. |
daily_spend.used | Money обязательное | Списано с начала местных суток ячейки. |
Примеры
Запрос
curl -X GET 'https://wfacademy.id/api/public/v1/wallet' \
-H 'Authorization: Bearer '"$API_KEY"
Ответ 200
{
"balance": {
"amount": "123.45",
"currency": "IDR"
},
"state": "ok",
"exchange": "active",
"topup_url": "https://example.com/hooks/sapport",
"daily_spend": {
"limit": null,
"used": {
"amount": null,
"currency": null
}
}
}
Пример ошибки
{
"type": "https://wfacademy.id/developers/errors#invalid_api_key",
"title": "Invalid API key",
"status": 401,
"code": "invalid_api_key",
"detail": "EXAMPLE",
"request_id": "req_EXAMPLE"
}
Примеры иллюстративны: ключ в них условный (EXAMPLE), значения полей выдуманы.
Возможные ошибки
invalid_api_key wrong_cell integration_inactive tenant_inactive ip_not_allowed feature_not_in_plan rate_limited service_unavailable internal_error
GET /operations/{id} Доступно
#Состояние операции
Возвращает асинхронную операцию, созданную вашей интеграцией (ответ 202 с конвертом operation): состояние queued, running, succeeded, failed или canceled, ресурс результата и стоимость для платных операций. Отдельной области маршрут не требует: нужна та же область, что и у создавшего операцию запроса (например, ai_seller:invoke для ответа ИИ-продажника). Операция другой интеграции или другого арендатора — 404. Вместо частого опроса подпишитесь на событие operation.completed.
- Области
- не требуются, нужен действующий ключ
- Предел частоты
- чтение
- Идемпотентность
- не требуется
- Успешный ответ
200 Операция.
Параметры
| Поле | Тип | Описание |
|---|
id | string обязательное | Где: path. Идентификатор операции (uuid) из конверта operation. |
Тело ответа
| Поле | Тип | Описание |
|---|
operation | Operation обязательное | |
Примеры
Запрос
curl -X GET 'https://wfacademy.id/api/public/v1/operations/EXAMPLE_ID' \
-H 'Authorization: Bearer '"$API_KEY"
Ответ 200
{
"operation": {
"id": "EXAMPLE_ID",
"type": "string",
"status": "queued",
"created_at": "2026-10-11T09:00:00Z",
"completed_at": "2026-10-11T09:00:00Z",
"resource": {
"type": "string",
"id": "EXAMPLE_ID"
},
"error": {
"code": "string",
"message": "string"
},
"usage": {
"cost": null,
"model": null
}
}
}
Пример ошибки
{
"type": "https://wfacademy.id/developers/errors#invalid_api_key",
"title": "Invalid API key",
"status": 401,
"code": "invalid_api_key",
"detail": "EXAMPLE",
"request_id": "req_EXAMPLE"
}
Примеры иллюстративны: ключ в них условный (EXAMPLE), значения полей выдуманы.
Возможные ошибки
invalid_api_key wrong_cell integration_inactive tenant_inactive ip_not_allowed feature_not_in_plan rate_limited wallet_suspended service_unavailable internal_error scope_missing pii_transfer_not_allowed not_found