Walker Formulation Academy для разработчиков Справочник API Каталог ошибок OpenAPI
Разделы

Аккаунт

Методов в разделе: 4. Все методы

МетодПутьОписаниеОбластиСтатус
GET/meКто я—Доступно
PUT/me/encryption-keyОткрытый ключ для формата JWEwebhooks:manageДоступно
GET/walletКошелёк и состояние обмена—Доступно
GET/operations/{id}Состояние операции—Доступно
GET /me Доступно

#Кто я

Возвращает арендатора, интеграцию, ключ с действующими областями, пределы частоты и состояние кошелька. Областей не требует: нужен лишь действующий ключ. Удобно для проверки подключения и для выбора ячейки.

Области
не требуются, нужен действующий ключ
Предел частоты
чтение
Идемпотентность
не требуется
Успешный ответ
200 Описание ключа и аккаунта.

Тело ответа

ПолеТипОписание
tenantobject
обязательное
Арендатор — владелец ключа.
tenant.idstring
обязательное
tenant.namestring
обязательное
cellstring
обязательное
Ячейка платформы: ru, en или id.
Значения: ru en id
base_urlstring
обязательное
Базовый адрес API этой ячейки.
integrationobject
обязательное
Интеграция (служебная учётная запись), которой принадлежит ключ.
integration.idstring
обязательное
integration.namestring
обязательное
channel_idstring
обязательное, может быть null
Канал "api" интеграции; null — канал ещё не создан.
keyobject
обязательное
key.key_idstring
обязательное
Публичный идентификатор ключа (не секрет).
key.modestring
обязательное

Значения: live test
key.scopesarray<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_atstring
обязательное
Срок действия ключа, ISO 8601 UTC.
key.ip_allowlistarray<string>
обязательное, может быть null
Разрешённые адреса и сети (CIDR); null — любой адрес.
limitsobject
обязательное
Пределы частоты запросов и платных операций.
limits.read_per_mininteger
обязательное
limits.write_per_mininteger
обязательное
limits.paid_per_mininteger
обязательное
limits.paid_concurrencyinteger
обязательное
Одновременных платных операций ИИ на интеграцию; сверх — 429 concurrency_limit.
limits.max_operation_costMoney
обязательное, может быть null
Максимум стоимости одной платной операции в валюте кошелька (оценка выше — 402 spend_limit_reached); null — не удалось прочитать.
walletobject
обязательное
Кошелёк арендатора (ИИ-операции).
wallet.balanceMoney
обязательное, может быть null
Остаток кошелька в рублях; null — состояние неизвестно или арендатор не тарифицируется.
wallet.statestring
обязательное
ok — достаточно; low — мало средств; negative — остаток ниже нуля; blocked — кошелёк заблокирован; unknown — состояние получить не удалось. Подробности — GET /wallet.
Значения: ok low negative blocked unknown
wallet.exchangestring
обязательное
suspended при negative и blocked: все маршруты, кроме /me и /wallet, отвечают 402 wallet_suspended.
Значения: active suspended
wallet.topup_urlstring
обязательное
Адрес кабинета, где пополняется кошелёк.
wallet.daily_spendobject
обязательное, может быть null
Суточные траты интеграции; null — посчитать не удалось.
wallet.daily_spend.limitMoney
обязательное, может быть null
Суточный предел трат интеграции; null — не задан.
wallet.daily_spend.usedMoney
обязательное
Списано за платные операции интеграции с начала местных суток ячейки.
crm_modestring
обязательное
Режим CRM арендатора: "internal" (наша CRM) или внешняя система.
pii_encryptionPiiEncryption
необязательное, может быть 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 Настройка после регистрации.

Тело запроса Открытый ключ получателя.

ПолеТипОписание
jwkobject
обязательное
Открытый ключ получателя (JWK) с полем alg. Закрытые части (d, p, q, dp, dq, qi, k) не принимаются.

Тело ответа

ПолеТипОписание
modestring
обязательное
off — поля с персональными данными выдаются как есть; optional — в формате JWE, если ключ зарегистрирован; required — только в формате JWE (без ключа — 409 encryption_key_required). Режим меняется в кабинете.
Значения: off optional required
keyobject
обязательное, может быть null
Действующий открытый ключ получателя; null — не зарегистрирован.
key.kidstring
обязательное
Идентификатор ключа (из JWK или отпечаток RFC 7638).
key.algstring
обязательное
Алгоритм согласования ключа: ECDH-ES+A256KW, RSA-OAEP-256 или RSA-OAEP-384.
key.ktystring
обязательное

Значения: EC OKP RSA
key.crvstring
обязательное, может быть null
Кривая (EC/OKP); null у RSA.
key.rsa_bitsinteger
обязательное, может быть null
Длина модуля RSA, бит; null у EC/OKP.
key.thumbprintstring
обязательное
Отпечаток открытого ключа (RFC 7638, SHA-256).
key.created_atstring
обязательное
Когда ключ зарегистрирован, ISO 8601 UTC.
previous_keyobject
обязательное, может быть null
Прежний ключ после смены: его ещё можно запросить заголовком Encryption-Key-Id до expires_at (7 суток).
previous_key.kidstring
обязательное
Идентификатор ключа (из JWK или отпечаток RFC 7638).
previous_key.algstring
обязательное
Алгоритм согласования ключа: ECDH-ES+A256KW, RSA-OAEP-256 или RSA-OAEP-384.
previous_key.ktystring
обязательное

Значения: EC OKP RSA
previous_key.crvstring
обязательное, может быть null
Кривая (EC/OKP); null у RSA.
previous_key.rsa_bitsinteger
обязательное, может быть null
Длина модуля RSA, бит; null у EC/OKP.
previous_key.thumbprintstring
обязательное
Отпечаток открытого ключа (RFC 7638, SHA-256).
previous_key.created_atstring
обязательное
Когда ключ зарегистрирован, ISO 8601 UTC.
previous_key.expires_atstring
обязательное, может быть null
acceptedobject
обязательное, может быть null
Какие ключи принимает эта ячейка.
accepted.algarray<string>
обязательное
accepted.crvarray<string>
обязательное
accepted.min_rsa_bitsinteger
обязательное
accepted.encstring
обязательное
changedboolean
обязательное
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 Состояние кошелька.

Тело ответа

ПолеТипОписание
balanceMoney
обязательное, может быть null
Остаток кошелька в рублях (кошелёк ведётся в RUB на любой ячейке); null — состояние неизвестно или арендатор не тарифицируется.
statestring
обязательное
ok — достаточно; low — мало средств (обмен идёт); negative — остаток ниже нуля; blocked — кошелёк заблокирован; unknown — состояние получить не удалось.
Значения: ok low negative blocked unknown
exchangestring
обязательное
suspended при negative и blocked: все маршруты, кроме /me и /wallet, отвечают 402 wallet_suspended, вебхуки откладываются. При unknown остаётся active: бесплатное чтение идёт с заголовком Wallet-State: unknown, платные операции закрыты (503).
Значения: active suspended
topup_urlstring
обязательное
Адрес кабинета, где пополняется кошелёк (нужен вход сотрудника с правом пополнения).
daily_spendobject
обязательное, может быть null
Суточные траты интеграции: списания за её платные операции с начала местных суток ячейки; null — посчитать не удалось.
daily_spend.limitMoney
обязательное, может быть null
Суточный предел трат интеграции; null — не задан.
daily_spend.usedMoney
обязательное
Списано с начала местных суток ячейки.

Примеры

Запрос
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 Операция.

Параметры

ПолеТипОписание
idstring
обязательное
Где: path. Идентификатор операции (uuid) из конверта operation.

Тело ответа

ПолеТипОписание
operationOperation
обязательное

Примеры

Запрос
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