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

# POST /v1/transfer/to-personal

Перевести средства с бизнес‑кошелька мерчанта на **личный** кошелёк владельца аккаунта.

**Зачем это.** Метод забирает прибыль владельца из общего котла магазинов и переводит её на его
личный кошелёк. Сам вывод с личного кошелька наружу — отдельная операция, доступная только в
кабинете под 2FA (на API‑ключе её нет).

**URL:** `https://api.oblodai.com/v1/transfer/to-personal` · **Аутентификация:** обязательна · **Идемпотентность:** заголовок `Idempotency-Key` и/или `order_id`.

<Note>
  Примеры используют хелпер `call()` и переменные `$SECRET`/`$PUBLIC_ID` — их определение см. в
  [Как подписать запрос](/guides/signing-requests). Проще не писать подпись руками, а взять
  [SDK](/sdk/overview).
</Note>

### Заголовки

<ParamField header="Idempotency-Key">
  Любое уникальное значение (≤255 символов), одинаковое во всех повторах одного перевода. Повтор вернёт тот же ответ и заголовок `Idempotent-Replayed: true`. → [Идемпотентность](/reference/basics-idempotency)
</ParamField>

***

## Параметры запроса

<ParamField body="amount" type="string" required>
  Сумма перевода в `currency`.
</ParamField>

<ParamField body="currency" type="string" required>
  Код валюты.
</ParamField>

<ParamField body="order_id" type="string">
  Ключ идемпотентности. Повтор — no‑op. **Настоятельно передавайте всегда** (см. ниже).
</ParamField>

***

## Пример запроса

<CodeGroup>
  ```bash cURL theme={null}
  BODY='{"amount":"50","currency":"USDT","order_id":"transfer-1"}'
  TS=$(date +%s)
  SIG=$(printf '%s\n%s\n%s\n%s' "$TS" 'POST' '/v1/transfer/to-personal' "$BODY" \
    | openssl dgst -sha256 -hmac "$SECRET" -hex | sed 's/^.* //')
  curl -s https://api.oblodai.com/v1/transfer/to-personal \
    -X POST -H 'Content-Type: application/json' \
    -H "X-Public-Id: $PUBLIC_ID" -H "X-Timestamp: $TS" -H "X-Signature: $SIG" \
    -d "$BODY"
  ```

  ```python Python theme={null}
  call("/v1/transfer/to-personal", {"amount": "50", "currency": "USDT", "order_id": "transfer-1"})
  ```

  ```js Node.js theme={null}
  await call("/v1/transfer/to-personal", { amount: "50", currency: "USDT", order_id: "transfer-1" });
  ```
</CodeGroup>

***

## Пример ответа

```json theme={null}
{
  "state": 0,
  "result": { "currency": "USDT", "amount": "50", "direction": "to_personal", "personal_balance": "150" }
}
```

***

## Коды ошибок

| Код                               | Значение                                             |
| --------------------------------- | ---------------------------------------------------- |
| `400 transfer.no_personal_wallet` | У мерчанта нет привязанного владельца.               |
| `400 transfer.unknown_currency`   | Неизвестная валюта.                                  |
| `400 transfer.bad_amount`         | Некорректная сумма.                                  |
| `400 personal.amount_invalid`     | Сумма перевода некорректна (≤0 или неверный формат). |
| `400 personal.insufficient`       | Недостаточно средств на балансе для перевода.        |
| `400 request.bad_json`            | Тело не парсится.                                    |

***

## Нюансы

* **Всегда передавайте `order_id`.** Формально поле необязательное, но без него повтор запроса при
  сетевом таймауте создаст **второй перевод**. С `order_id` повтор гарантированно no‑op.
* Перевод **вводит средства В личный кошелёк**. Обратная операция и **вывод из личного кошелька
  доступны только в кабинете под 2FA** — на API‑ключе их намеренно нет.
* Личный кошелёк **общий** для всех магазинов владельца.

***

## Связанные страницы

<CardGroup cols={2}>
  <Card title="POST /v1/balance" href="/reference/balance" icon="arrow-right" horizontal />

  <Card title="Безопасность в проде" href="/guides/production-security" icon="arrow-right" horizontal />
</CardGroup>
