# POST Partner

Создание или обновление sandbox-профиля партнера.

## POST /api/sandbox/partner

> Создает или обновляет sandbox-профиль партнера для текущего API-ключа.\
> \
> Если партнер еще не создан, можно передать \`invite\_code\`, чтобы привязать его к вышестоящему sandbox-партнеру. Максимальная глубина сети — 5 уровней; при превышении API вернет \`409 FLOW\_CONFLICT\`.\
> \
> Для POST обязательно передавайте \`Idempotency-Key\`, чтобы retry не создал дублирующую операцию.

```json
{"openapi":"3.0.3","info":{"title":"Fundora API","version":"0.3.0"},"tags":[{"name":"post-partner","description":"Создание или обновление sandbox-профиля партнера."}],"servers":[{"url":"https://partner.fundora.capital","description":"Production-домен партнерского API"}],"security":[{"SandboxBearer":[]}],"components":{"securitySchemes":{"SandboxBearer":{"type":"http","scheme":"bearer","bearerFormat":"sk_sandbox"}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":true,"description":"Обязательный уникальный ключ POST-операции, обычно UUID. Повтор того же POST с тем же endpoint-ом и телом вернет сохраненный результат с idempotency_replayed=true. Тот же ключ с другим телом или endpoint-ом вернет IDEMPOTENCY_KEY_CONFLICT. Отсутствующий ключ вернет IDEMPOTENCY_KEY_REQUIRED.","schema":{"type":"string","maxLength":255}}},"schemas":{"UpsertSandboxPartnerRequest":{"type":"object","properties":{"display_name":{"type":"string","description":"Отображаемое имя партнера."},"fixed_margin_percent":{"type":"number","description":"Устаревшее поле, сейчас не используется для расчета Sandbox-ссылки."},"dynamic_margin_percent":{"type":"number","description":"Устаревшее поле, сейчас не используется для расчета Sandbox-ссылки."},"phone":{"type":"string","nullable":true,"description":"Телефон партнера."},"invite_code":{"type":"string","nullable":true,"description":"Invite code вышестоящего sandbox-партнера для построения сети."}},"description":"Тело создания или обновления sandbox-партнера."},"SandboxPartnerResponse":{"type":"object","properties":{"request_id":{"type":"string","description":"Идентификатор запроса для поддержки и поиска в Logs."},"idempotency_replayed":{"type":"boolean","description":"true, если POST-ответ возвращен из кеша Idempotency-Key. Для GET отсутствует."},"success":{"type":"boolean","description":"Признак успешного ответа."},"partner":{"$ref":"#/components/schemas/SandboxPartnerProfile"},"rewards":{"$ref":"#/components/schemas/SandboxPartnerRewards"},"subpartners":{"type":"array","description":"Прямые subpartners текущего партнера.","items":{"$ref":"#/components/schemas/SandboxSubpartner"}},"links":{"type":"array","description":"Партнерские ссылки текущего партнера.","items":{"$ref":"#/components/schemas/SandboxPartnerLink"}}},"required":["request_id","success"]},"SandboxPartnerProfile":{"type":"object","nullable":true,"properties":{"id":{"type":"string","description":"ID sandbox-партнера."},"displayName":{"type":"string","description":"Отображаемое имя партнера."},"phone":{"type":"string","nullable":true,"description":"Телефон партнера, если передан."},"inviteCode":{"type":"string","description":"Invite code для подключения subpartners."},"partnerLevel":{"type":"integer","description":"Уровень партнера в sandbox-сети."},"parentPartnerId":{"type":"string","nullable":true,"description":"ID вышестоящего партнера."},"status":{"type":"string","description":"Статус партнера."},"defaultLink":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SandboxPartnerLink"}],"description":"Основная партнерская ссылка."},"createdAt":{"type":"string","format":"date-time","description":"Время создания партнера."}}},"SandboxPartnerLink":{"type":"object","properties":{"id":{"type":"string","description":"ID партнерской ссылки."},"slug":{"type":"string","description":"Slug ссылки, который можно передать как partner_link_slug при создании займа."},"label":{"type":"string","description":"Название ссылки."},"marginPercent":{"type":"number","description":"Партнерская маржа/ставка ссылки в процентах. В Sandbox по умолчанию 4%."},"disabledAt":{"type":"string","nullable":true,"format":"date-time","description":"Когда ссылка была отключена."},"createdAt":{"type":"string","format":"date-time","description":"Когда ссылка была создана."}}},"SandboxPartnerRewards":{"type":"object","properties":{"totalUsd":{"type":"number","description":"Общие sandbox-вознаграждения в USD."},"directUsd":{"type":"number","description":"Прямые вознаграждения в USD."},"networkUsd":{"type":"number","description":"Сетевые вознаграждения в USD."}}},"SandboxSubpartner":{"type":"object","properties":{"id":{"type":"string","description":"ID subpartner."},"displayName":{"type":"string","description":"Имя subpartner."},"inviteCode":{"type":"string","description":"Invite code subpartner."},"partnerLevel":{"type":"integer","description":"Уровень subpartner."},"rewardUsd":{"type":"number","description":"Вознаграждение от этого subpartner в USD."},"createdAt":{"type":"string","format":"date-time","description":"Время создания subpartner."}}},"ErrorResponse":{"type":"object","properties":{"request_id":{"type":"string","description":"Идентификатор запроса для поддержки и поиска в Logs."},"error_code":{"type":"string","description":"Формализованный код ошибки для интеграционной логики.","enum":["SANDBOX_API_KEY_REQUIRED","SANDBOX_API_KEY_INVALID","SANDBOX_API_KEY_DATABASE_REQUIRED","SANDBOX_SESSION_REQUIRED","SANDBOX_RATE_LIMIT_EXCEEDED","INVALID_REQUEST","INVALID_ACTION","INVALID_SCOPE","LOAN_NOT_FOUND","WALLET_NOT_FOUND","FLOW_CONFLICT","LIMIT_EXCEEDED","INSUFFICIENT_BALANCE","IDEMPOTENCY_KEY_REQUIRED","IDEMPOTENCY_KEY_CONFLICT","IDEMPOTENCY_KEY_IN_PROGRESS","DATABASE_UNAVAILABLE","INTERNAL_ERROR"]},"error":{"type":"string","description":"Человекочитаемое описание ошибки. Не используйте его для интеграционной логики, для этого есть error_code."}},"required":["request_id","error_code","error"]}},"responses":{"BadRequest":{"description":"Некорректный запрос: неверное тело, отсутствует Idempotency-Key для POST, неизвестное действие или невалидная сумма","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Unauthorized":{"description":"Sandbox API-ключ отсутствует или недействителен","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Conflict":{"description":"Flow нельзя продолжить из текущего состояния, не хватает баланса/лимита или конфликтует Idempotency-Key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"TooManyRequests":{"description":"Превышен Sandbox API rate limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"paths":{"/api/sandbox/partner":{"post":{"operationId":"upsertSandboxPartner","tags":["post-partner"],"summary":"POST /api/sandbox/partner","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertSandboxPartnerRequest"}}}},"responses":{"200":{"description":"Состояние sandbox-партнера","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxPartnerResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"description":"Создает или обновляет sandbox-профиль партнера для текущего API-ключа.\n\nЕсли партнер еще не создан, можно передать `invite_code`, чтобы привязать его к вышестоящему sandbox-партнеру. Максимальная глубина сети — 5 уровней; при превышении API вернет `409 FLOW_CONFLICT`.\n\nДля POST обязательно передавайте `Idempotency-Key`, чтобы retry не создал дублирующую операцию."}}}}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.fundora.capital/api-sandbox/post-partner.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
