Skip to main content

Managed Investments

One side provides the capital, the other provides the work. Profit is split by an agreed ratio. Loss falls on the capital.

The asymmetry is the point. The manager who loses the venture's money loses the work put into it and walks away owing nothing; the investor loses the money. Neither outcome is a penalty — it is the division of risk the two sides actually agreed to. The API enforces it: record_loss never touches the manager's side of the ledger, and the manager's profit share is not a fee that survives a bad year.

Base path: /api/v1/pfp/managed-investments · Religious reading: Mudaraba


Two mandates

mandate_typeThe manager may
restricted (default)Only invest within the declared field, and within business_restrictions
unrestrictedInvest at its own discretion

business_restrictions is a list of strings and is taken into account when the mandate is restricted. It is a record of the agreement, not an enforcement mechanism — the platform stores it and reports on it; it does not vet individual investments against it.


Statuses

draft ──submit──> under_review ──review──> review_passed
│ │ │
│ └──reject──> rejected │
│ │
└──────────────── fund ───────────────────────┘

v
funded ──activate──> active
│ │
└────── complete ────┴──> completed

loss wipes out │ current_value
v
liquidated
StatusMeaning
draftTerms recorded
under_reviewSubmitted for approval
review_passedA conclusion is attached
rejectedTerminal. Requires a reason
fundedCapital handed to the manager
activeThe manager is running the venture; profit and loss can be recorded
completedSettled at term
liquidatedThe capital was wiped out

completed and liquidated are deliberately distinct. A venture that lost its capital is not the same event as one that ran its term and settled, and collapsing the two would make a failed contract indistinguishable from a successful one in any report built on status.

There is no liquidate endpoint: the platform sets liquidated itself, the moment a recorded loss drives current_value to zero. actual_end_date is set at the same time.

In the secular reading fund is reachable from draft as well as review_passed.


Create a contract

POST /api/v1/pfp/managed-investments
{
"customer_id": "8f2a1c44-0b6e-4d51-9a3f-1c8e5b7d2a90",
"region": "RU",
"currency": "RUB",
"capital_amount": "2000000000",
"business_type": "Wholesale distribution of building materials",
"business_description": "Regional distribution across Tatarstan and Mari El",
"mandate_type": "restricted",
"business_restrictions": ["No trade financing", "No FX positions"],
"profit_sharing_ratio": { "bank": 30, "customer": 70 },
"term_months": 24,
"reporting_frequency": "quarterly"
}
FieldTypeRequiredNotes
customer_iduuidThe manager
regionstringContract region
currencystringISO 4217
capital_amountstringMinor units. Provided by the bank side
business_typestringThe venture the manager will run
profit_sharing_ratioobject{"bank": n, "customer": m}, whole percent, must sum to 100
term_monthsinteger1–120
mandate_typeenumrestricted (default) | unrestricted
business_restrictionsarrayStrings
business_descriptionstringFree text
reporting_frequencyenummonthly | quarterly | semi_annually | annually
metadataobjectReturned untouched

Note the ratio in the example: the manager takes 70 % of profit while contributing no capital. That is normal for this product — the manager's contribution is the work, and it is priced in the profit share.


Lifecycle transitions

POST /api/v1/pfp/managed-investments/{id}/submit     # no body
POST /api/v1/pfp/managed-investments/{id}/review # approved_by required
POST /api/v1/pfp/managed-investments/{id}/reject # reason required
POST /api/v1/pfp/managed-investments/{id}/fund # no body
POST /api/v1/pfp/managed-investments/{id}/activate # no body

fund records that the capital has been handed over. activate records that the manager has started trading — profit and loss are accepted only from active.


Profit

POST /api/v1/pfp/managed-investments/{id}/profit
{
"gross_profit": "180000000",
"period_end_date": "2026-12-31"
}

Both fields are required. The gross profit is split by profit_sharing_ratio and the manager's share is moved to it by a ledger posting dated period_end_date. It is not an accrual on paper.

Each distribution appends to the history:

{
"profit_distributions": [
{
"date": "2026-12-31",
"gross_profit": "180000000",
"bank_share": "54000000",
"customer_share": "126000000"
}
]
}

current_value — the investor's position — grows by the investor's share, not by the gross.

Zero is a legitimate report. A period that earned nothing still closes: send "0" and the reporting date advances. A negative gross profit is refused — a loss is a different transition with different arithmetic.


Loss

POST /api/v1/pfp/managed-investments/{id}/loss
{
"amount": "40000000",
"period_end_date": "2027-03-31"
}

The loss is applied to current_value — the capital at risk — and capped at it. You cannot lose more than was invested. A loss larger than the remaining value is recorded at the value that actually existed, and current_value goes to zero rather than negative.

The manager's side is untouched. There is no clawback of previously distributed profit shares and no debt created against the manager.

The history goes into metadata.losses — not into a field of its own, unlike profit_distributions:

{
"metadata": {
"losses": [
{ "date": "2027-03-31", "loss_amount": "40000000", "new_value": "1960000000" }
]
}
}

Unlike profit, a loss of zero is refused: there is nothing to record.

A loss also advances the reporting date, exactly as a profit distribution does. A period closed at a loss is still a period reported.


Settle at term

POST /api/v1/pfp/managed-investments/{id}/complete
{ "final_value": "2200000000" }

Reachable from funded and active. Sets actual_end_date, writes current_value to final_value, and records the settlement in metadata.final_settlement:

{
"final_settlement": {
"returned_to_bank": "2014000000",
"total_profit": "180000000",
"total_loss": "40000000"
}
}

returned_to_bank is capital_amount + bank_profit_share − total_loss — the capital back, plus the investor's accumulated profit share, less the losses borne.


List and read

GET /api/v1/pfp/managed-investments
Query parameterValues
statusany status above
regioncontract region
typerestricted | unrestricted
customer_iduuid
envtest | prod
GET /api/v1/pfp/managed-investments/{id}