Files
Dmitry f1f336f94f feat(api): портфели, ручные события, правка инструментов и обзор по скоупам
CRUD портфелей (/portfolios), ручные события (POST /events, DELETE только для manual), PATCH /instruments/{id}, GET /analytics/overview — карточка на каждый скоуп одним запросом. Холдинги отдают logo_url и logo_color. openapi.json обновлён.
2026-09-19 22:13:55 +03:00

11000 lines
266 KiB
JSON

{
"components": {
"schemas": {
"AccountBalance": {
"properties": {
"account_id": {
"title": "Account Id",
"type": "integer"
},
"balance": {
"description": "decimal as string",
"title": "Balance",
"type": "string"
},
"balance_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Balance Rub"
},
"currency": {
"title": "Currency",
"type": "string"
},
"name": {
"title": "Name",
"type": "string"
},
"role": {
"$ref": "#/components/schemas/AccountRole"
}
},
"required": [
"account_id",
"name",
"currency",
"role",
"balance",
"balance_rub"
],
"title": "AccountBalance",
"type": "object"
},
"AccountCreate": {
"additionalProperties": false,
"description": "A broker account for report imports. T-Invest accounts come from the sync, not from here.",
"properties": {
"broker": {
"$ref": "#/components/schemas/Broker"
},
"currency": {
"default": "RUB",
"maxLength": 3,
"minLength": 3,
"title": "Currency",
"type": "string"
},
"name": {
"maxLength": 256,
"minLength": 1,
"title": "Name",
"type": "string"
},
"source_id": {
"description": "Agreement number exactly as the broker's report prints it",
"maxLength": 128,
"minLength": 1,
"title": "Source Id",
"type": "string"
}
},
"required": [
"name",
"broker",
"source_id"
],
"title": "AccountCreate",
"type": "object"
},
"AccountKind": {
"enum": [
"zm_cash",
"zm_card",
"zm_checking",
"zm_deposit",
"zm_loan",
"zm_emoney",
"zm_debt",
"broker",
"manual_asset"
],
"title": "AccountKind",
"type": "string"
},
"AccountOut": {
"properties": {
"archived": {
"title": "Archived",
"type": "boolean"
},
"balance": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Balance"
},
"balance_as_of": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"title": "Balance As Of"
},
"broker": {
"anyOf": [
{
"$ref": "#/components/schemas/Broker"
},
{
"type": "null"
}
]
},
"credit_limit": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Credit Limit"
},
"currency": {
"title": "Currency",
"type": "string"
},
"disabled": {
"title": "Disabled",
"type": "boolean"
},
"id": {
"title": "Id",
"type": "integer"
},
"include_in_net_worth": {
"title": "Include In Net Worth",
"type": "boolean"
},
"kind": {
"$ref": "#/components/schemas/AccountKind"
},
"mirror_of_account_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Mirror Of Account Id"
},
"name": {
"title": "Name",
"type": "string"
},
"opened_at": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Opened At"
},
"primary_event_source": {
"anyOf": [
{
"$ref": "#/components/schemas/EventSource"
},
{
"type": "null"
}
]
},
"role": {
"$ref": "#/components/schemas/AccountRole"
},
"source": {
"title": "Source",
"type": "string"
},
"source_id": {
"title": "Source Id",
"type": "string"
},
"start_balance": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Start Balance"
},
"value_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Value Rub"
}
},
"required": [
"id",
"kind",
"source",
"source_id",
"broker",
"name",
"currency",
"role",
"include_in_net_worth",
"mirror_of_account_id",
"primary_event_source",
"archived",
"disabled",
"opened_at",
"balance",
"balance_as_of",
"start_balance",
"credit_limit"
],
"title": "AccountOut",
"type": "object"
},
"AccountPatch": {
"additionalProperties": false,
"description": "Only the fields the user owns: everything else comes from the source on each sync.\n\nUnset fields are left alone; an explicit `null` clears the column.",
"properties": {
"disabled": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Disabled"
},
"include_in_net_worth": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Include In Net Worth"
},
"mirror_of_account_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Mirror Of Account Id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Name"
},
"primary_event_source": {
"anyOf": [
{
"$ref": "#/components/schemas/EventSource"
},
{
"type": "null"
}
]
},
"role": {
"anyOf": [
{
"$ref": "#/components/schemas/AccountRole"
},
{
"type": "null"
}
]
}
},
"title": "AccountPatch",
"type": "object"
},
"AccountRole": {
"enum": [
"liquid",
"savings",
"investment",
"debt"
],
"title": "AccountRole",
"type": "string"
},
"AccountSuggestion": {
"description": "A broker account the user may attach an import to when the report's number matched none.",
"properties": {
"broker": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Broker"
},
"id": {
"title": "Id",
"type": "integer"
},
"name": {
"title": "Name",
"type": "string"
},
"source_id": {
"title": "Source Id",
"type": "string"
}
},
"required": [
"id",
"name",
"broker",
"source_id"
],
"title": "AccountSuggestion",
"type": "object"
},
"AllocationBucket": {
"properties": {
"bucket": {
"title": "Bucket",
"type": "string"
},
"dimension": {
"$ref": "#/components/schemas/AllocationDimension"
},
"holding_count": {
"title": "Holding Count",
"type": "integer"
},
"value_rub": {
"description": "decimal as string",
"title": "Value Rub",
"type": "string"
},
"weight": {
"description": "decimal as string",
"title": "Weight",
"type": "string"
}
},
"required": [
"dimension",
"bucket",
"value_rub",
"weight",
"holding_count"
],
"title": "AllocationBucket",
"type": "object"
},
"AllocationDimension": {
"description": "How a portfolio can be sliced. Every dimension covers the SAME total — securities\nplus cash — so the weights of any one of them add up to 1 and the charts agree.",
"enum": [
"asset_class",
"sector",
"country",
"currency"
],
"title": "AllocationDimension",
"type": "string"
},
"BenchmarkComparison": {
"properties": {
"rows": {
"items": {
"$ref": "#/components/schemas/BenchmarkComparisonOut"
},
"title": "Rows",
"type": "array"
}
},
"required": [
"rows"
],
"title": "BenchmarkComparison",
"type": "object"
},
"BenchmarkComparisonOut": {
"properties": {
"benchmarks": {
"items": {
"$ref": "#/components/schemas/BenchmarkReturnOut"
},
"title": "Benchmarks",
"type": "array"
},
"date_from": {
"format": "date",
"title": "Date From",
"type": "string"
},
"date_to": {
"format": "date",
"title": "Date To",
"type": "string"
},
"period": {
"title": "Period",
"type": "string"
},
"portfolio_days_skipped": {
"title": "Portfolio Days Skipped",
"type": "integer"
},
"portfolio_twr": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Portfolio Twr"
},
"portfolio_twr_annualized": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Portfolio Twr Annualized"
}
},
"required": [
"period",
"date_from",
"date_to",
"portfolio_twr",
"portfolio_twr_annualized",
"portfolio_days_skipped",
"benchmarks"
],
"title": "BenchmarkComparisonOut",
"type": "object"
},
"BenchmarkCreate": {
"properties": {
"code": {
"maxLength": 32,
"minLength": 1,
"title": "Code",
"type": "string"
},
"currency": {
"default": "RUB",
"title": "Currency",
"type": "string"
},
"instrument_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Instrument Id"
},
"is_active": {
"default": true,
"title": "Is Active",
"type": "boolean"
},
"is_default": {
"default": false,
"title": "Is Default",
"type": "boolean"
},
"kind": {
"title": "Kind",
"type": "string"
},
"name": {
"maxLength": 128,
"minLength": 1,
"title": "Name",
"type": "string"
},
"source": {
"default": "moex",
"title": "Source",
"type": "string"
}
},
"required": [
"code",
"name",
"kind"
],
"title": "BenchmarkCreate",
"type": "object"
},
"BenchmarkOut": {
"properties": {
"code": {
"title": "Code",
"type": "string"
},
"currency": {
"title": "Currency",
"type": "string"
},
"history_from": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "History From"
},
"history_to": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "History To"
},
"id": {
"title": "Id",
"type": "integer"
},
"instrument_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Instrument Id"
},
"is_active": {
"title": "Is Active",
"type": "boolean"
},
"is_default": {
"title": "Is Default",
"type": "boolean"
},
"kind": {
"title": "Kind",
"type": "string"
},
"name": {
"title": "Name",
"type": "string"
},
"source": {
"title": "Source",
"type": "string"
}
},
"required": [
"id",
"code",
"name",
"kind",
"source",
"currency",
"is_default",
"is_active",
"instrument_id",
"history_from",
"history_to"
],
"title": "BenchmarkOut",
"type": "object"
},
"BenchmarkPatch": {
"properties": {
"code": {
"anyOf": [
{
"maxLength": 32,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"title": "Code"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Currency"
},
"instrument_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Instrument Id"
},
"is_active": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Is Active"
},
"is_default": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Is Default"
},
"kind": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Kind"
},
"name": {
"anyOf": [
{
"maxLength": 128,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"title": "Name"
},
"source": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Source"
}
},
"title": "BenchmarkPatch",
"type": "object"
},
"BenchmarkReturnOut": {
"properties": {
"benchmark_id": {
"title": "Benchmark Id",
"type": "integer"
},
"code": {
"title": "Code",
"type": "string"
},
"days_skipped": {
"title": "Days Skipped",
"type": "integer"
},
"excess": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Excess"
},
"kind": {
"title": "Kind",
"type": "string"
},
"name": {
"title": "Name",
"type": "string"
},
"twr": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Twr"
},
"twr_annualized": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Twr Annualized"
}
},
"required": [
"benchmark_id",
"code",
"name",
"kind",
"twr",
"twr_annualized",
"days_skipped",
"excess"
],
"title": "BenchmarkReturnOut",
"type": "object"
},
"Body_imports_create": {
"properties": {
"account_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "target account, if known",
"title": "Account Id"
},
"file": {
"contentMediaType": "application/octet-stream",
"description": "the report itself",
"title": "File",
"type": "string"
},
"parser": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "force a parser from registry.names()",
"title": "Parser"
}
},
"required": [
"file"
],
"title": "Body_imports_create",
"type": "object"
},
"Broker": {
"enum": [
"tinvest",
"sber",
"vtb",
"other"
],
"title": "Broker",
"type": "string"
},
"CalendarEntry": {
"properties": {
"amount": {
"description": "decimal as string",
"title": "Amount",
"type": "string"
},
"amount_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Amount Rub"
},
"basis": {
"title": "Basis",
"type": "string"
},
"currency": {
"title": "Currency",
"type": "string"
},
"expected_date": {
"format": "date",
"title": "Expected Date",
"type": "string"
},
"instrument_id": {
"title": "Instrument Id",
"type": "integer"
},
"kind": {
"title": "Kind",
"type": "string"
},
"name": {
"title": "Name",
"type": "string"
},
"per_unit": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Per Unit"
},
"qty": {
"description": "decimal as string",
"title": "Qty",
"type": "string"
},
"record_date": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Record Date"
},
"tax_withheld": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Tax Withheld"
},
"ticker": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Ticker"
}
},
"required": [
"instrument_id",
"ticker",
"name",
"kind",
"expected_date",
"record_date",
"qty",
"per_unit",
"amount",
"currency",
"amount_rub",
"basis",
"tax_withheld"
],
"title": "CalendarEntry",
"type": "object"
},
"CalendarOut": {
"properties": {
"as_of": {
"format": "date",
"title": "As Of",
"type": "string"
},
"by_basis": {
"additionalProperties": {
"description": "decimal as string",
"type": "string"
},
"title": "By Basis",
"type": "object"
},
"currency": {
"title": "Currency",
"type": "string"
},
"entries": {
"items": {
"$ref": "#/components/schemas/CalendarEntry"
},
"title": "Entries",
"type": "array"
},
"total_expected_rub": {
"description": "decimal as string",
"title": "Total Expected Rub",
"type": "string"
}
},
"required": [
"as_of",
"currency",
"total_expected_rub",
"entries",
"by_basis"
],
"title": "CalendarOut",
"type": "object"
},
"CashFlowBrokerMonth": {
"properties": {
"deposits_rub": {
"description": "decimal as string",
"title": "Deposits Rub",
"type": "string"
},
"event_count": {
"title": "Event Count",
"type": "integer"
},
"month": {
"format": "date",
"title": "Month",
"type": "string"
},
"net_rub": {
"description": "decimal as string",
"title": "Net Rub",
"type": "string"
},
"withdrawals_rub": {
"description": "decimal as string",
"title": "Withdrawals Rub",
"type": "string"
}
},
"required": [
"month",
"deposits_rub",
"withdrawals_rub",
"net_rub",
"event_count"
],
"title": "CashFlowBrokerMonth",
"type": "object"
},
"CashFlowMonth": {
"properties": {
"baseline_rub": {
"description": "decimal as string",
"title": "Baseline Rub",
"type": "string"
},
"expense_rub": {
"description": "decimal as string",
"title": "Expense Rub",
"type": "string"
},
"income_rub": {
"description": "decimal as string",
"title": "Income Rub",
"type": "string"
},
"month": {
"format": "date",
"title": "Month",
"type": "string"
},
"one_off_rub": {
"description": "decimal as string",
"title": "One Off Rub",
"type": "string"
},
"savings_rate": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Savings Rate"
},
"savings_transfer_rub": {
"description": "decimal as string",
"title": "Savings Transfer Rub",
"type": "string"
},
"txn_count": {
"title": "Txn Count",
"type": "integer"
}
},
"required": [
"month",
"income_rub",
"expense_rub",
"baseline_rub",
"one_off_rub",
"savings_transfer_rub",
"savings_rate",
"txn_count"
],
"title": "CashFlowMonth",
"type": "object"
},
"CategoryOut": {
"description": "Flat list; the client builds the tree from `parent_id` (ZenMoney nests one level).",
"properties": {
"archived": {
"title": "Archived",
"type": "boolean"
},
"color": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Color"
},
"icon": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Icon"
},
"id": {
"title": "Id",
"type": "integer"
},
"name": {
"title": "Name",
"type": "string"
},
"parent_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Parent Id"
},
"show_income": {
"title": "Show Income",
"type": "boolean"
},
"show_outcome": {
"title": "Show Outcome",
"type": "boolean"
}
},
"required": [
"id",
"parent_id",
"name",
"icon",
"color",
"show_income",
"show_outcome",
"archived"
],
"title": "CategoryOut",
"type": "object"
},
"CommitRequest": {
"properties": {
"account_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Account Id"
},
"confirm_duplicates": {
"default": false,
"title": "Confirm Duplicates",
"type": "boolean"
},
"dry_run": {
"default": false,
"title": "Dry Run",
"type": "boolean"
}
},
"title": "CommitRequest",
"type": "object"
},
"DataQualityRow": {
"properties": {
"check_name": {
"title": "Check Name",
"type": "string"
},
"computed_at": {
"format": "date-time",
"title": "Computed At",
"type": "string"
},
"count": {
"title": "Count",
"type": "integer"
},
"detail": {
"title": "Detail",
"type": "string"
},
"id": {
"title": "Id",
"type": "integer"
},
"ref": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"title": "Ref"
},
"severity": {
"title": "Severity",
"type": "string"
}
},
"required": [
"id",
"check_name",
"severity",
"detail",
"count",
"ref",
"computed_at"
],
"title": "DataQualityRow",
"type": "object"
},
"EventKind": {
"enum": [
"buy",
"sell",
"dividend",
"coupon",
"interest",
"tax",
"tax_refund",
"commission",
"deposit",
"withdrawal",
"transfer_in",
"transfer_out",
"split",
"amortization",
"repayment",
"fx_exchange",
"other"
],
"title": "EventKind",
"type": "string"
},
"EventOut": {
"properties": {
"account_id": {
"title": "Account Id",
"type": "integer"
},
"accrued_interest": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Accrued Interest"
},
"amount": {
"description": "decimal as string",
"title": "Amount",
"type": "string"
},
"amount_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Amount Rub"
},
"currency": {
"title": "Currency",
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Description"
},
"external_flow": {
"title": "External Flow",
"type": "boolean"
},
"fee": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Fee"
},
"id": {
"title": "Id",
"type": "integer"
},
"instrument_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Instrument Id"
},
"kind": {
"$ref": "#/components/schemas/EventKind"
},
"price": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Price"
},
"price_currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Price Currency"
},
"quantity": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Quantity"
},
"source": {
"title": "Source",
"type": "string"
},
"status": {
"$ref": "#/components/schemas/EventStatus"
},
"tax": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Tax"
},
"ticker": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Ticker"
},
"trade_date": {
"format": "date",
"title": "Trade Date",
"type": "string"
},
"ts": {
"format": "date-time",
"title": "Ts",
"type": "string"
}
},
"required": [
"id",
"account_id",
"instrument_id",
"ticker",
"kind",
"status",
"trade_date",
"ts",
"quantity",
"price",
"price_currency",
"amount",
"amount_rub",
"currency",
"fee",
"tax",
"accrued_interest",
"description",
"source",
"external_flow"
],
"title": "EventOut",
"type": "object"
},
"EventPage": {
"properties": {
"items": {
"items": {
"$ref": "#/components/schemas/EventOut"
},
"title": "Items",
"type": "array"
},
"page": {
"title": "Page",
"type": "integer"
},
"page_size": {
"title": "Page Size",
"type": "integer"
},
"total": {
"title": "Total",
"type": "integer"
}
},
"required": [
"items",
"total",
"page",
"page_size"
],
"title": "EventPage",
"type": "object"
},
"EventSource": {
"description": "Which feed is the truth for an account's ledger; others become `shadow` events.",
"enum": [
"tinvest_api",
"report_sber",
"report_vtb",
"csv",
"manual"
],
"title": "EventSource",
"type": "string"
},
"EventStatus": {
"enum": [
"confirmed",
"pending",
"shadow",
"ignored"
],
"title": "EventStatus",
"type": "string"
},
"FlowType": {
"enum": [
"income",
"expense",
"internal_transfer",
"savings_transfer",
"broker_external_flow",
"deleted",
"other"
],
"title": "FlowType",
"type": "string"
},
"ForecastMonth": {
"properties": {
"amount_rub": {
"description": "decimal as string",
"title": "Amount Rub",
"type": "string"
},
"by_basis": {
"additionalProperties": {
"description": "decimal as string",
"type": "string"
},
"title": "By Basis",
"type": "object"
},
"month": {
"format": "date",
"title": "Month",
"type": "string"
}
},
"required": [
"month",
"amount_rub",
"by_basis"
],
"title": "ForecastMonth",
"type": "object"
},
"ForecastOut": {
"properties": {
"annual_yield_on_value": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Annual Yield On Value"
},
"months": {
"items": {
"$ref": "#/components/schemas/ForecastMonth"
},
"title": "Months",
"type": "array"
},
"total_rub": {
"description": "decimal as string",
"title": "Total Rub",
"type": "string"
},
"warnings": {
"items": {
"type": "string"
},
"title": "Warnings",
"type": "array"
}
},
"required": [
"months",
"total_rub",
"annual_yield_on_value",
"warnings"
],
"title": "ForecastOut",
"type": "object"
},
"GoalCreate": {
"additionalProperties": false,
"properties": {
"archived": {
"default": false,
"title": "Archived",
"type": "boolean"
},
"currency": {
"default": "RUB",
"maxLength": 3,
"minLength": 3,
"title": "Currency",
"type": "string"
},
"monthly_contribution": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Monthly Contribution"
},
"name": {
"maxLength": 128,
"minLength": 1,
"title": "Name",
"type": "string"
},
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Note"
},
"scope": {
"default": "all",
"maxLength": 32,
"title": "Scope",
"type": "string"
},
"target_amount": {
"description": "decimal as string",
"title": "Target Amount",
"type": "string"
},
"target_date": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Target Date"
}
},
"required": [
"name",
"target_amount"
],
"title": "GoalCreate",
"type": "object"
},
"GoalOut": {
"properties": {
"archived": {
"title": "Archived",
"type": "boolean"
},
"currency": {
"title": "Currency",
"type": "string"
},
"id": {
"title": "Id",
"type": "integer"
},
"monthly_contribution": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Monthly Contribution"
},
"name": {
"title": "Name",
"type": "string"
},
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Note"
},
"scope": {
"title": "Scope",
"type": "string"
},
"target_amount": {
"description": "decimal as string",
"title": "Target Amount",
"type": "string"
},
"target_date": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Target Date"
}
},
"required": [
"id",
"name",
"scope",
"target_amount",
"currency",
"target_date",
"monthly_contribution",
"note",
"archived"
],
"title": "GoalOut",
"type": "object"
},
"GoalPatch": {
"additionalProperties": false,
"properties": {
"archived": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Archived"
},
"currency": {
"anyOf": [
{
"maxLength": 3,
"minLength": 3,
"type": "string"
},
{
"type": "null"
}
],
"title": "Currency"
},
"monthly_contribution": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Monthly Contribution"
},
"name": {
"anyOf": [
{
"maxLength": 128,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"title": "Name"
},
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Note"
},
"scope": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
],
"title": "Scope"
},
"target_amount": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Target Amount"
},
"target_date": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Target Date"
}
},
"title": "GoalPatch",
"type": "object"
},
"GoalProgressOut": {
"properties": {
"as_of": {
"format": "date",
"title": "As Of",
"type": "string"
},
"assumed_rate": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Assumed Rate"
},
"basis": {
"title": "Basis",
"type": "string"
},
"current_value_rub": {
"description": "decimal as string",
"title": "Current Value Rub",
"type": "string"
},
"goal_id": {
"title": "Goal Id",
"type": "integer"
},
"monthly_needed_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Monthly Needed Rub"
},
"on_track": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "On Track"
},
"progress": {
"description": "decimal as string",
"title": "Progress",
"type": "string"
},
"projected_date": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Projected Date"
},
"target_amount_rub": {
"description": "decimal as string",
"title": "Target Amount Rub",
"type": "string"
}
},
"required": [
"goal_id",
"as_of",
"current_value_rub",
"target_amount_rub",
"progress",
"projected_date",
"basis",
"assumed_rate",
"monthly_needed_rub",
"on_track"
],
"title": "GoalProgressOut",
"type": "object"
},
"Health": {
"properties": {
"database": {
"title": "Database",
"type": "string"
},
"status": {
"title": "Status",
"type": "string"
},
"version": {
"title": "Version",
"type": "string"
}
},
"required": [
"status",
"version",
"database"
],
"title": "Health",
"type": "object"
},
"HistoryOut": {
"properties": {
"rows": {
"items": {
"$ref": "#/components/schemas/HistoryRow"
},
"title": "Rows",
"type": "array"
},
"totals": {
"$ref": "#/components/schemas/HistoryTotals"
}
},
"required": [
"rows",
"totals"
],
"title": "HistoryOut",
"type": "object"
},
"HistoryRow": {
"properties": {
"amount": {
"description": "decimal as string",
"title": "Amount",
"type": "string"
},
"amount_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Amount Rub"
},
"currency": {
"title": "Currency",
"type": "string"
},
"kind": {
"title": "Kind",
"type": "string"
},
"month": {
"format": "date",
"title": "Month",
"type": "string"
},
"payment_count": {
"title": "Payment Count",
"type": "integer"
},
"tax_withheld": {
"description": "decimal as string",
"title": "Tax Withheld",
"type": "string"
}
},
"required": [
"month",
"kind",
"currency",
"amount",
"amount_rub",
"tax_withheld",
"payment_count"
],
"title": "HistoryRow",
"type": "object"
},
"HistoryTotals": {
"properties": {
"amount_rub": {
"description": "decimal as string",
"title": "Amount Rub",
"type": "string"
},
"tax_withheld_rub": {
"description": "decimal as string",
"title": "Tax Withheld Rub",
"type": "string"
}
},
"required": [
"amount_rub",
"tax_withheld_rub"
],
"title": "HistoryTotals",
"type": "object"
},
"HoldingOut": {
"properties": {
"accrued_interest_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Accrued Interest Rub"
},
"asset_class": {
"title": "Asset Class",
"type": "string"
},
"avg_cost": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Avg Cost"
},
"board": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Board"
},
"cost_currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Cost Currency"
},
"cost_total_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Cost Total Rub"
},
"currency": {
"title": "Currency",
"type": "string"
},
"days_held": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Days Held"
},
"first_buy_date": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "First Buy Date"
},
"income_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Income Rub"
},
"instrument_id": {
"title": "Instrument Id",
"type": "integer"
},
"ldv_eligible_qty": {
"description": "decimal as string",
"title": "Ldv Eligible Qty",
"type": "string"
},
"logo_color": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Logo Color"
},
"logo_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Logo Url"
},
"market_price": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Market Price"
},
"name": {
"title": "Name",
"type": "string"
},
"price_currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Price Currency"
},
"price_date": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Price Date"
},
"price_status": {
"title": "Price Status",
"type": "string"
},
"qty": {
"description": "decimal as string",
"title": "Qty",
"type": "string"
},
"realized_pnl_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Realized Pnl Rub"
},
"ticker": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Ticker"
},
"unrealized_pnl_native": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Unrealized Pnl Native"
},
"unrealized_pnl_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Unrealized Pnl Rub"
},
"value_native": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Value Native"
},
"value_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Value Rub"
},
"weight": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Weight"
},
"xirr": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Xirr"
}
},
"required": [
"instrument_id",
"ticker",
"name",
"asset_class",
"board",
"currency",
"qty",
"avg_cost",
"cost_currency",
"cost_total_rub",
"market_price",
"price_currency",
"price_date",
"price_status",
"value_native",
"value_rub",
"accrued_interest_rub",
"unrealized_pnl_native",
"unrealized_pnl_rub",
"realized_pnl_rub",
"income_rub",
"weight",
"xirr",
"first_buy_date",
"days_held",
"ldv_eligible_qty"
],
"title": "HoldingOut",
"type": "object"
},
"ImportCounts": {
"properties": {
"by_kind": {
"additionalProperties": {
"type": "integer"
},
"title": "By Kind",
"type": "object"
},
"events_duplicate": {
"title": "Events Duplicate",
"type": "integer"
},
"events_new": {
"title": "Events New",
"type": "integer"
},
"events_pending": {
"title": "Events Pending",
"type": "integer"
},
"events_shadow": {
"title": "Events Shadow",
"type": "integer"
},
"events_total": {
"title": "Events Total",
"type": "integer"
},
"lines": {
"title": "Lines",
"type": "integer"
}
},
"required": [
"lines",
"events_total",
"events_new",
"events_duplicate",
"events_shadow",
"events_pending",
"by_kind"
],
"title": "ImportCounts",
"type": "object"
},
"ImportPreview": {
"description": "The full preview: `POST /imports` and `GET /imports/{id}` both return this.",
"properties": {
"account_external_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Account External Id"
},
"account_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Account Id"
},
"account_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Account Name"
},
"account_suggestions": {
"items": {
"$ref": "#/components/schemas/AccountSuggestion"
},
"title": "Account Suggestions",
"type": "array"
},
"broker": {
"title": "Broker",
"type": "string"
},
"committed_at": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"title": "Committed At"
},
"counts": {
"$ref": "#/components/schemas/ImportCounts"
},
"duplicate_of_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Duplicate Of Id"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Error"
},
"filename": {
"title": "Filename",
"type": "string"
},
"id": {
"title": "Id",
"type": "integer"
},
"parse_status": {
"title": "Parse Status",
"type": "string"
},
"parser_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Parser Name"
},
"parser_version": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Parser Version"
},
"pending_instruments": {
"items": {
"$ref": "#/components/schemas/PendingInstrumentOut"
},
"title": "Pending Instruments",
"type": "array"
},
"period_from": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Period From"
},
"period_to": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Period To"
},
"reconciliation": {
"$ref": "#/components/schemas/ReconciliationOut"
},
"sample_events": {
"items": {
"$ref": "#/components/schemas/SampleEventOut"
},
"title": "Sample Events",
"type": "array"
},
"sha256": {
"title": "Sha256",
"type": "string"
},
"size_bytes": {
"title": "Size Bytes",
"type": "integer"
},
"uploaded_at": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"title": "Uploaded At"
},
"warnings": {
"items": {
"type": "string"
},
"title": "Warnings",
"type": "array"
}
},
"required": [
"id",
"broker",
"filename",
"sha256",
"size_bytes",
"parse_status",
"counts",
"reconciliation"
],
"title": "ImportPreview",
"type": "object"
},
"ImportResult": {
"properties": {
"committed": {
"title": "Committed",
"type": "boolean"
},
"events_created": {
"title": "Events Created",
"type": "integer"
},
"events_shadow": {
"title": "Events Shadow",
"type": "integer"
},
"events_skipped": {
"title": "Events Skipped",
"type": "integer"
},
"events_updated": {
"title": "Events Updated",
"type": "integer"
},
"import_id": {
"title": "Import Id",
"type": "integer"
},
"metrics_refreshed": {
"title": "Metrics Refreshed",
"type": "boolean"
},
"pending_instruments": {
"title": "Pending Instruments",
"type": "integer"
},
"reconciliation": {
"$ref": "#/components/schemas/ReconciliationOut"
}
},
"required": [
"import_id",
"committed",
"events_created",
"events_updated",
"events_skipped",
"events_shadow",
"pending_instruments",
"reconciliation",
"metrics_refreshed"
],
"title": "ImportResult",
"type": "object"
},
"ImportSummary": {
"description": "One import without the heavy parts — what `GET /imports` lists.",
"properties": {
"account_external_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Account External Id"
},
"account_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Account Id"
},
"account_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Account Name"
},
"broker": {
"title": "Broker",
"type": "string"
},
"committed_at": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"title": "Committed At"
},
"counts": {
"$ref": "#/components/schemas/ImportCounts"
},
"duplicate_of_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Duplicate Of Id"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Error"
},
"filename": {
"title": "Filename",
"type": "string"
},
"id": {
"title": "Id",
"type": "integer"
},
"parse_status": {
"title": "Parse Status",
"type": "string"
},
"parser_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Parser Name"
},
"parser_version": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Parser Version"
},
"period_from": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Period From"
},
"period_to": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Period To"
},
"sha256": {
"title": "Sha256",
"type": "string"
},
"size_bytes": {
"title": "Size Bytes",
"type": "integer"
},
"uploaded_at": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"title": "Uploaded At"
}
},
"required": [
"id",
"broker",
"filename",
"sha256",
"size_bytes",
"parse_status",
"counts"
],
"title": "ImportSummary",
"type": "object"
},
"InstrumentDetail": {
"properties": {
"events": {
"items": {
"$ref": "#/components/schemas/EventOut"
},
"title": "Events",
"type": "array"
},
"holding": {
"anyOf": [
{
"$ref": "#/components/schemas/HoldingOut"
},
{
"type": "null"
}
]
},
"instrument": {
"$ref": "#/components/schemas/InstrumentOut"
},
"lots": {
"items": {
"$ref": "#/components/schemas/LotOut"
},
"title": "Lots",
"type": "array"
},
"prices": {
"items": {
"$ref": "#/components/schemas/PricePoint"
},
"title": "Prices",
"type": "array"
}
},
"required": [
"instrument",
"holding",
"lots",
"events",
"prices"
],
"title": "InstrumentDetail",
"type": "object"
},
"InstrumentOut": {
"properties": {
"asset_class": {
"title": "Asset Class",
"type": "string"
},
"board": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Board"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Country"
},
"currency": {
"title": "Currency",
"type": "string"
},
"exchange": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Exchange"
},
"figi": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Figi"
},
"id": {
"title": "Id",
"type": "integer"
},
"is_active": {
"title": "Is Active",
"type": "boolean"
},
"isin": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Isin"
},
"issuer": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Issuer"
},
"logo_color": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Logo Color"
},
"logo_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Logo Url"
},
"lot": {
"title": "Lot",
"type": "integer"
},
"maturity_date": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Maturity Date"
},
"name": {
"title": "Name",
"type": "string"
},
"nominal": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Nominal"
},
"nominal_currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Nominal Currency"
},
"sector": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Sector"
},
"ticker": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Ticker"
}
},
"required": [
"id",
"asset_class",
"isin",
"figi",
"ticker",
"board",
"exchange",
"name",
"issuer",
"currency",
"lot",
"nominal",
"nominal_currency",
"maturity_date",
"sector",
"country",
"is_active"
],
"title": "InstrumentOut",
"type": "object"
},
"InstrumentPatch": {
"additionalProperties": false,
"description": "The fields a person may correct by hand. Unset fields are left alone; an explicit `null`\nclears the nullable ones (`board`, `sector`).",
"properties": {
"asset_class": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Asset Class"
},
"board": {
"anyOf": [
{
"maxLength": 16,
"type": "string"
},
{
"type": "null"
}
],
"title": "Board"
},
"lot": {
"anyOf": [
{
"minimum": 1.0,
"type": "integer"
},
{
"type": "null"
}
],
"title": "Lot"
},
"name": {
"anyOf": [
{
"maxLength": 256,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"title": "Name"
},
"sector": {
"anyOf": [
{
"maxLength": 64,
"type": "string"
},
{
"type": "null"
}
],
"title": "Sector"
}
},
"title": "InstrumentPatch",
"type": "object"
},
"JobStatus": {
"enum": [
"queued",
"running",
"done",
"error"
],
"title": "JobStatus",
"type": "string"
},
"LinkCreate": {
"properties": {
"cash_txn_id": {
"title": "Cash Txn Id",
"type": "integer"
},
"event_id": {
"title": "Event Id",
"type": "integer"
}
},
"required": [
"cash_txn_id",
"event_id"
],
"title": "LinkCreate",
"type": "object"
},
"LinkOut": {
"properties": {
"amount_delta": {
"description": "decimal as string",
"title": "Amount Delta",
"type": "string"
},
"cash_txn_id": {
"title": "Cash Txn Id",
"type": "integer"
},
"confidence": {
"description": "decimal as string",
"title": "Confidence",
"type": "string"
},
"currency": {
"title": "Currency",
"type": "string"
},
"day_gap": {
"title": "Day Gap",
"type": "integer"
},
"event_id": {
"title": "Event Id",
"type": "integer"
},
"id": {
"title": "Id",
"type": "integer"
},
"kind": {
"title": "Kind",
"type": "string"
},
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Note"
}
},
"required": [
"id",
"cash_txn_id",
"event_id",
"kind",
"confidence",
"amount_delta",
"currency",
"day_gap",
"note"
],
"title": "LinkOut",
"type": "object"
},
"LoginRequest": {
"properties": {
"email": {
"format": "email",
"title": "Email",
"type": "string"
},
"password": {
"maxLength": 1024,
"minLength": 1,
"title": "Password",
"type": "string"
}
},
"required": [
"email",
"password"
],
"title": "LoginRequest",
"type": "object"
},
"LotOut": {
"properties": {
"account_id": {
"title": "Account Id",
"type": "integer"
},
"closed_at": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Closed At"
},
"cost_currency": {
"title": "Cost Currency",
"type": "string"
},
"cost_per_unit": {
"description": "decimal as string",
"title": "Cost Per Unit",
"type": "string"
},
"cost_total_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Cost Total Rub"
},
"id": {
"title": "Id",
"type": "integer"
},
"open_date": {
"format": "date",
"title": "Open Date",
"type": "string"
},
"qty_open": {
"description": "decimal as string",
"title": "Qty Open",
"type": "string"
},
"qty_remaining": {
"description": "decimal as string",
"title": "Qty Remaining",
"type": "string"
}
},
"required": [
"id",
"account_id",
"open_date",
"qty_open",
"qty_remaining",
"cost_per_unit",
"cost_currency",
"cost_total_rub",
"closed_at"
],
"title": "LotOut",
"type": "object"
},
"ManualEventCreate": {
"additionalProperties": false,
"properties": {
"account_id": {
"title": "Account Id",
"type": "integer"
},
"accrued_interest": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Accrued Interest"
},
"amount": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Amount"
},
"currency": {
"anyOf": [
{
"maxLength": 3,
"minLength": 3,
"type": "string"
},
{
"type": "null"
}
],
"title": "Currency"
},
"description": {
"anyOf": [
{
"maxLength": 500,
"type": "string"
},
{
"type": "null"
}
],
"title": "Description"
},
"fee": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Fee"
},
"instrument_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Instrument Id"
},
"kind": {
"$ref": "#/components/schemas/EventKind"
},
"price": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Price"
},
"quantity": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Quantity"
},
"trade_date": {
"format": "date",
"title": "Trade Date",
"type": "string"
}
},
"required": [
"account_id",
"kind",
"trade_date"
],
"title": "ManualEventCreate",
"type": "object"
},
"MetricsStatusOut": {
"properties": {
"consistent": {
"title": "Consistent",
"type": "boolean"
},
"last_refresh": {
"anyOf": [
{
"$ref": "#/components/schemas/RefreshLogOut"
},
{
"type": "null"
}
]
},
"refreshing": {
"title": "Refreshing",
"type": "boolean"
}
},
"required": [
"last_refresh",
"consistent",
"refreshing"
],
"title": "MetricsStatusOut",
"type": "object"
},
"NetWorthBreakdown": {
"properties": {
"accounts": {
"items": {
"$ref": "#/components/schemas/AccountBalance"
},
"title": "Accounts",
"type": "array"
},
"by_currency": {
"additionalProperties": {
"type": "string"
},
"title": "By Currency",
"type": "object"
},
"d": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "D"
},
"debt_rub": {
"description": "decimal as string",
"title": "Debt Rub",
"type": "string"
},
"investment_rub": {
"description": "decimal as string",
"title": "Investment Rub",
"type": "string"
},
"liquid_rub": {
"description": "decimal as string",
"title": "Liquid Rub",
"type": "string"
},
"missing_fx_count": {
"title": "Missing Fx Count",
"type": "integer"
},
"savings_rub": {
"description": "decimal as string",
"title": "Savings Rub",
"type": "string"
},
"total_rub": {
"description": "decimal as string",
"title": "Total Rub",
"type": "string"
}
},
"required": [
"d",
"total_rub",
"liquid_rub",
"savings_rub",
"investment_rub",
"debt_rub",
"by_currency",
"missing_fx_count",
"accounts"
],
"title": "NetWorthBreakdown",
"type": "object"
},
"NetWorthDay": {
"properties": {
"by_currency": {
"additionalProperties": {
"type": "string"
},
"title": "By Currency",
"type": "object"
},
"d": {
"format": "date",
"title": "D",
"type": "string"
},
"debt_rub": {
"description": "decimal as string",
"title": "Debt Rub",
"type": "string"
},
"investment_rub": {
"description": "decimal as string",
"title": "Investment Rub",
"type": "string"
},
"liquid_rub": {
"description": "decimal as string",
"title": "Liquid Rub",
"type": "string"
},
"missing_fx_count": {
"title": "Missing Fx Count",
"type": "integer"
},
"savings_rub": {
"description": "decimal as string",
"title": "Savings Rub",
"type": "string"
},
"total_rub": {
"description": "decimal as string",
"title": "Total Rub",
"type": "string"
}
},
"required": [
"d",
"total_rub",
"liquid_rub",
"savings_rub",
"investment_rub",
"debt_rub",
"by_currency",
"missing_fx_count"
],
"title": "NetWorthDay",
"type": "object"
},
"NewInstrument": {
"description": "The instrument to create from a report's own data (`action = \"create\"`).",
"properties": {
"asset_class": {
"title": "Asset Class",
"type": "string"
},
"board": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Board"
},
"currency": {
"default": "RUB",
"title": "Currency",
"type": "string"
},
"isin": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Isin"
},
"lot": {
"default": 1,
"title": "Lot",
"type": "integer"
},
"name": {
"title": "Name",
"type": "string"
},
"ticker": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Ticker"
}
},
"required": [
"asset_class",
"name"
],
"title": "NewInstrument",
"type": "object"
},
"PendingInstrumentOut": {
"properties": {
"asset_class_hint": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Asset Class Hint"
},
"board": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Board"
},
"created_at": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"title": "Created At"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Currency"
},
"first_seen_file_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "First Seen File Id"
},
"id": {
"title": "Id",
"type": "integer"
},
"instrument_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Instrument Id"
},
"isin": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Isin"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Name"
},
"occurrences": {
"title": "Occurrences",
"type": "integer"
},
"sample_price": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Sample Price"
},
"sample_quantity": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Sample Quantity"
},
"source": {
"title": "Source",
"type": "string"
},
"source_key": {
"title": "Source Key",
"type": "string"
},
"status": {
"title": "Status",
"type": "string"
},
"ticker": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Ticker"
}
},
"required": [
"id",
"source",
"source_key",
"occurrences",
"status"
],
"title": "PendingInstrumentOut",
"type": "object"
},
"PendingResolveRequest": {
"properties": {
"action": {
"enum": [
"link",
"create",
"ignore"
],
"title": "Action",
"type": "string"
},
"instrument": {
"anyOf": [
{
"$ref": "#/components/schemas/NewInstrument"
},
{
"type": "null"
}
]
},
"instrument_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Instrument Id"
}
},
"required": [
"action"
],
"title": "PendingResolveRequest",
"type": "object"
},
"PendingResolveResult": {
"properties": {
"alias_created": {
"title": "Alias Created",
"type": "boolean"
},
"events_bound": {
"title": "Events Bound",
"type": "integer"
},
"id": {
"title": "Id",
"type": "integer"
},
"instrument_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Instrument Id"
},
"metrics_refreshed": {
"title": "Metrics Refreshed",
"type": "boolean"
},
"status": {
"title": "Status",
"type": "string"
}
},
"required": [
"id",
"status",
"events_bound",
"alias_created",
"metrics_refreshed"
],
"title": "PendingResolveResult",
"type": "object"
},
"PortfolioAccountsIn": {
"additionalProperties": false,
"description": "The complete set: accounts not listed are removed from the portfolio.",
"properties": {
"account_ids": {
"items": {
"type": "integer"
},
"title": "Account Ids",
"type": "array"
}
},
"required": [
"account_ids"
],
"title": "PortfolioAccountsIn",
"type": "object"
},
"PortfolioCreate": {
"additionalProperties": false,
"properties": {
"account_ids": {
"items": {
"type": "integer"
},
"title": "Account Ids",
"type": "array"
},
"name": {
"maxLength": 128,
"minLength": 1,
"title": "Name",
"type": "string"
}
},
"required": [
"name"
],
"title": "PortfolioCreate",
"type": "object"
},
"PortfolioOut": {
"properties": {
"account_ids": {
"items": {
"type": "integer"
},
"title": "Account Ids",
"type": "array"
},
"base_currency": {
"title": "Base Currency",
"type": "string"
},
"id": {
"title": "Id",
"type": "integer"
},
"name": {
"title": "Name",
"type": "string"
}
},
"required": [
"id",
"name",
"base_currency",
"account_ids"
],
"title": "PortfolioOut",
"type": "object"
},
"PortfolioPatch": {
"additionalProperties": false,
"properties": {
"name": {
"maxLength": 128,
"minLength": 1,
"title": "Name",
"type": "string"
}
},
"required": [
"name"
],
"title": "PortfolioPatch",
"type": "object"
},
"PriceManualIn": {
"properties": {
"currency": {
"title": "Currency",
"type": "string"
},
"d": {
"format": "date",
"title": "D",
"type": "string"
},
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Note"
},
"price": {
"description": "decimal as string",
"title": "Price",
"type": "string"
}
},
"required": [
"d",
"price",
"currency"
],
"title": "PriceManualIn",
"type": "object"
},
"PriceManualOut": {
"properties": {
"currency": {
"title": "Currency",
"type": "string"
},
"d": {
"format": "date",
"title": "D",
"type": "string"
},
"id": {
"title": "Id",
"type": "integer"
},
"instrument_id": {
"title": "Instrument Id",
"type": "integer"
},
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Note"
},
"price": {
"description": "decimal as string",
"title": "Price",
"type": "string"
}
},
"required": [
"id",
"instrument_id",
"d",
"price",
"currency",
"note"
],
"title": "PriceManualOut",
"type": "object"
},
"PricePoint": {
"properties": {
"accrued_interest": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Accrued Interest"
},
"close": {
"description": "decimal as string",
"title": "Close",
"type": "string"
},
"currency": {
"title": "Currency",
"type": "string"
},
"d": {
"format": "date",
"title": "D",
"type": "string"
},
"source": {
"default": "daily",
"title": "Source",
"type": "string"
}
},
"required": [
"d",
"close",
"currency",
"accrued_interest"
],
"title": "PricePoint",
"type": "object"
},
"Problem": {
"description": "RFC 7807 error body (application/problem+json)",
"properties": {
"detail": {
"type": "string"
},
"errors": {
"items": {},
"type": "array"
},
"status": {
"type": "integer"
},
"title": {
"type": "string"
}
},
"required": [
"status",
"title"
],
"title": "Problem",
"type": "object"
},
"RebalanceBucketOut": {
"properties": {
"bucket": {
"title": "Bucket",
"type": "string"
},
"current_value_rub": {
"description": "decimal as string",
"title": "Current Value Rub",
"type": "string"
},
"current_weight": {
"description": "decimal as string",
"title": "Current Weight",
"type": "string"
},
"delta_value_rub": {
"description": "decimal as string",
"title": "Delta Value Rub",
"type": "string"
},
"drift": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Drift"
},
"target_weight": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Target Weight"
},
"trades": {
"items": {
"$ref": "#/components/schemas/TradeOut"
},
"title": "Trades",
"type": "array"
},
"within_band": {
"title": "Within Band",
"type": "boolean"
}
},
"required": [
"bucket",
"current_value_rub",
"current_weight",
"target_weight",
"drift",
"within_band",
"delta_value_rub",
"trades"
],
"title": "RebalanceBucketOut",
"type": "object"
},
"RebalanceOut": {
"properties": {
"as_of": {
"format": "date",
"title": "As Of",
"type": "string"
},
"buckets": {
"items": {
"$ref": "#/components/schemas/RebalanceBucketOut"
},
"title": "Buckets",
"type": "array"
},
"cash_available_rub": {
"description": "decimal as string",
"title": "Cash Available Rub",
"type": "string"
},
"dimension": {
"title": "Dimension",
"type": "string"
},
"portfolio_id": {
"title": "Portfolio Id",
"type": "integer"
},
"total_value_rub": {
"description": "decimal as string",
"title": "Total Value Rub",
"type": "string"
},
"warnings": {
"items": {
"type": "string"
},
"title": "Warnings",
"type": "array"
}
},
"required": [
"portfolio_id",
"dimension",
"as_of",
"total_value_rub",
"cash_available_rub",
"buckets",
"warnings"
],
"title": "RebalanceOut",
"type": "object"
},
"ReconciliationCash": {
"properties": {
"balance_derived": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Balance Derived"
},
"balance_report": {
"description": "decimal as string",
"title": "Balance Report",
"type": "string"
},
"currency": {
"title": "Currency",
"type": "string"
},
"delta": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Delta"
},
"matches": {
"title": "Matches",
"type": "boolean"
}
},
"required": [
"currency",
"balance_report",
"balance_derived",
"delta",
"matches"
],
"title": "ReconciliationCash",
"type": "object"
},
"ReconciliationOut": {
"properties": {
"as_of": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "As Of"
},
"cash": {
"items": {
"$ref": "#/components/schemas/ReconciliationCash"
},
"title": "Cash",
"type": "array"
},
"matches": {
"default": true,
"title": "Matches",
"type": "boolean"
},
"positions": {
"items": {
"$ref": "#/components/schemas/ReconciliationPosition"
},
"title": "Positions",
"type": "array"
}
},
"required": [
"as_of"
],
"title": "ReconciliationOut",
"type": "object"
},
"ReconciliationPosition": {
"properties": {
"instrument_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Instrument Id"
},
"instrument_name": {
"title": "Instrument Name",
"type": "string"
},
"isin": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Isin"
},
"matches": {
"title": "Matches",
"type": "boolean"
},
"qty_delta": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Qty Delta"
},
"qty_derived": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Qty Derived"
},
"qty_report": {
"description": "decimal as string",
"title": "Qty Report",
"type": "string"
},
"ticker": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Ticker"
}
},
"required": [
"instrument_id",
"instrument_name",
"ticker",
"isin",
"qty_report",
"qty_derived",
"qty_delta",
"matches"
],
"title": "ReconciliationPosition",
"type": "object"
},
"RefreshLogOut": {
"properties": {
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Error"
},
"failed_step": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Failed Step"
},
"finished_at": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"title": "Finished At"
},
"id": {
"title": "Id",
"type": "integer"
},
"started_at": {
"format": "date-time",
"title": "Started At",
"type": "string"
},
"step_timings": {
"anyOf": [
{
"additionalProperties": {
"type": "number"
},
"type": "object"
},
{
"type": "null"
}
],
"title": "Step Timings"
},
"trigger": {
"title": "Trigger",
"type": "string"
}
},
"required": [
"id",
"started_at",
"finished_at",
"trigger",
"error",
"failed_step",
"step_timings"
],
"title": "RefreshLogOut",
"type": "object"
},
"RefreshRequest": {
"properties": {
"refresh_token": {
"minLength": 1,
"title": "Refresh Token",
"type": "string"
}
},
"required": [
"refresh_token"
],
"title": "RefreshRequest",
"type": "object"
},
"ReturnsOut": {
"properties": {
"abs_pnl_rub": {
"description": "decimal as string",
"title": "Abs Pnl Rub",
"type": "string"
},
"date_from": {
"format": "date",
"title": "Date From",
"type": "string"
},
"date_to": {
"format": "date",
"title": "Date To",
"type": "string"
},
"external_flow_rub": {
"description": "decimal as string",
"title": "External Flow Rub",
"type": "string"
},
"period": {
"title": "Period",
"type": "string"
},
"twr": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Twr"
},
"twr_annualized": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Twr Annualized"
},
"twr_days_skipped": {
"title": "Twr Days Skipped",
"type": "integer"
},
"value_end_rub": {
"description": "decimal as string",
"title": "Value End Rub",
"type": "string"
},
"value_start_rub": {
"description": "decimal as string",
"title": "Value Start Rub",
"type": "string"
},
"xirr": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Xirr"
}
},
"required": [
"period",
"date_from",
"date_to",
"value_start_rub",
"value_end_rub",
"external_flow_rub",
"abs_pnl_rub",
"xirr",
"twr",
"twr_annualized",
"twr_days_skipped"
],
"title": "ReturnsOut",
"type": "object"
},
"RuleCreate": {
"additionalProperties": false,
"properties": {
"enabled": {
"default": true,
"title": "Enabled",
"type": "boolean"
},
"kind": {
"$ref": "#/components/schemas/RuleKind"
},
"match_type": {
"$ref": "#/components/schemas/RuleMatchType"
},
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Note"
},
"pattern": {
"maxLength": 512,
"minLength": 1,
"title": "Pattern",
"type": "string"
},
"priority": {
"default": 100,
"title": "Priority",
"type": "integer"
},
"value": {
"anyOf": [
{
"maxLength": 512,
"type": "string"
},
{
"type": "null"
}
],
"title": "Value"
}
},
"required": [
"kind",
"match_type",
"pattern"
],
"title": "RuleCreate",
"type": "object"
},
"RuleKind": {
"enum": [
"savings",
"one_off",
"category",
"payee",
"broker_target",
"ignore"
],
"title": "RuleKind",
"type": "string"
},
"RuleMatchType": {
"enum": [
"id",
"payee",
"comment",
"category",
"mcc",
"account"
],
"title": "RuleMatchType",
"type": "string"
},
"RuleOut": {
"properties": {
"enabled": {
"title": "Enabled",
"type": "boolean"
},
"id": {
"title": "Id",
"type": "integer"
},
"kind": {
"$ref": "#/components/schemas/RuleKind"
},
"last_matched_at": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"title": "Last Matched At"
},
"match_count": {
"title": "Match Count",
"type": "integer"
},
"match_type": {
"$ref": "#/components/schemas/RuleMatchType"
},
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Note"
},
"pattern": {
"title": "Pattern",
"type": "string"
},
"priority": {
"title": "Priority",
"type": "integer"
},
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Value"
}
},
"required": [
"id",
"kind",
"match_type",
"pattern",
"value",
"note",
"enabled",
"priority",
"last_matched_at",
"match_count"
],
"title": "RuleOut",
"type": "object"
},
"RulePatch": {
"additionalProperties": false,
"properties": {
"enabled": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Enabled"
},
"kind": {
"anyOf": [
{
"$ref": "#/components/schemas/RuleKind"
},
{
"type": "null"
}
]
},
"match_type": {
"anyOf": [
{
"$ref": "#/components/schemas/RuleMatchType"
},
{
"type": "null"
}
]
},
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Note"
},
"pattern": {
"anyOf": [
{
"maxLength": 512,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"title": "Pattern"
},
"priority": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Priority"
},
"value": {
"anyOf": [
{
"maxLength": 512,
"type": "string"
},
{
"type": "null"
}
],
"title": "Value"
}
},
"title": "RulePatch",
"type": "object"
},
"RunStatus": {
"enum": [
"running",
"ok",
"error"
],
"title": "RunStatus",
"type": "string"
},
"RunwayOut": {
"properties": {
"as_of": {
"format": "date",
"title": "As Of",
"type": "string"
},
"avg_baseline_3m_rub": {
"description": "decimal as string",
"title": "Avg Baseline 3M Rub",
"type": "string"
},
"liquid_reserve_rub": {
"description": "decimal as string",
"title": "Liquid Reserve Rub",
"type": "string"
},
"runway_months": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Runway Months"
}
},
"required": [
"as_of",
"liquid_reserve_rub",
"avg_baseline_3m_rub",
"runway_months"
],
"title": "RunwayOut",
"type": "object"
},
"SampleEventOut": {
"properties": {
"amount": {
"description": "decimal as string",
"title": "Amount",
"type": "string"
},
"currency": {
"title": "Currency",
"type": "string"
},
"dedupe_key": {
"title": "Dedupe Key",
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Description"
},
"fee": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Fee"
},
"instrument_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Instrument Id"
},
"instrument_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Instrument Key"
},
"instrument_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Instrument Name"
},
"is_duplicate": {
"title": "Is Duplicate",
"type": "boolean"
},
"kind": {
"title": "Kind",
"type": "string"
},
"line_no": {
"title": "Line No",
"type": "integer"
},
"price": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Price"
},
"quantity": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Quantity"
},
"settle_date": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Settle Date"
},
"trade_date": {
"format": "date",
"title": "Trade Date",
"type": "string"
},
"trade_no": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Trade No"
}
},
"required": [
"line_no",
"kind",
"trade_date",
"amount",
"currency",
"dedupe_key",
"is_duplicate"
],
"title": "SampleEventOut",
"type": "object"
},
"ScopeCardOut": {
"description": "One tile of the home screen: a scope with what a glance needs, from the metric tables.",
"properties": {
"as_of": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "As Of"
},
"day_change_pct": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Day Change Pct"
},
"day_change_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Day Change Rub"
},
"income_year_pct": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Income Year Pct"
},
"income_year_rub": {
"description": "decimal as string",
"title": "Income Year Rub",
"type": "string"
},
"invested_rub": {
"description": "decimal as string",
"title": "Invested Rub",
"type": "string"
},
"kind": {
"title": "Kind",
"type": "string"
},
"name": {
"title": "Name",
"type": "string"
},
"pnl_pct": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Pnl Pct"
},
"pnl_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Pnl Rub"
},
"scope": {
"title": "Scope",
"type": "string"
},
"total_rub": {
"description": "decimal as string",
"title": "Total Rub",
"type": "string"
},
"xirr": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Xirr"
}
},
"required": [
"scope",
"name",
"kind",
"as_of",
"total_rub",
"invested_rub",
"pnl_rub",
"pnl_pct",
"day_change_rub",
"day_change_pct",
"xirr",
"income_year_rub",
"income_year_pct"
],
"title": "ScopeCardOut",
"type": "object"
},
"ScopeOut": {
"description": "One reportable set of accounts: `all`, `account:<id>` or `portfolio:<id>`.",
"properties": {
"account_ids": {
"items": {
"type": "integer"
},
"title": "Account Ids",
"type": "array"
},
"name": {
"title": "Name",
"type": "string"
},
"scope": {
"title": "Scope",
"type": "string"
}
},
"required": [
"scope",
"name",
"account_ids"
],
"title": "ScopeOut",
"type": "object"
},
"SourceStatus": {
"properties": {
"cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Cursor"
},
"last_run_at": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"title": "Last Run At"
},
"last_run_status": {
"anyOf": [
{
"$ref": "#/components/schemas/RunStatus"
},
{
"type": "null"
}
]
},
"last_success_at": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"title": "Last Success At"
},
"queued": {
"title": "Queued",
"type": "boolean"
},
"source": {
"title": "Source",
"type": "string"
}
},
"required": [
"source",
"cursor",
"last_run_at",
"last_success_at",
"last_run_status",
"queued"
],
"title": "SourceStatus",
"type": "object"
},
"SpendingRow": {
"properties": {
"amount_rub": {
"description": "decimal as string",
"title": "Amount Rub",
"type": "string"
},
"category_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Category Id"
},
"category_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Category Name"
},
"month": {
"format": "date",
"title": "Month",
"type": "string"
},
"root_category_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Root Category Id"
},
"root_category_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Root Category Name"
},
"txn_count": {
"title": "Txn Count",
"type": "integer"
}
},
"required": [
"month",
"category_id",
"category_name",
"root_category_id",
"root_category_name",
"amount_rub",
"txn_count"
],
"title": "SpendingRow",
"type": "object"
},
"SummaryOut": {
"description": "The dashboard's one-screen answer for a scope.",
"properties": {
"as_of": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "As Of"
},
"cash_rub": {
"description": "decimal as string",
"title": "Cash Rub",
"type": "string"
},
"computed_at": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"title": "Computed At"
},
"holding_count": {
"title": "Holding Count",
"type": "integer"
},
"income_rub": {
"description": "decimal as string",
"title": "Income Rub",
"type": "string"
},
"invested_net_rub": {
"description": "decimal as string",
"title": "Invested Net Rub",
"type": "string"
},
"market_value_rub": {
"description": "decimal as string",
"title": "Market Value Rub",
"type": "string"
},
"pnl_total_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Pnl Total Rub"
},
"realized_pnl_rub": {
"description": "decimal as string",
"title": "Realized Pnl Rub",
"type": "string"
},
"returns": {
"items": {
"$ref": "#/components/schemas/ReturnsOut"
},
"title": "Returns",
"type": "array"
},
"scope": {
"title": "Scope",
"type": "string"
},
"stale_count": {
"title": "Stale Count",
"type": "integer"
},
"total_rub": {
"description": "decimal as string",
"title": "Total Rub",
"type": "string"
},
"unpriced_count": {
"title": "Unpriced Count",
"type": "integer"
}
},
"required": [
"scope",
"as_of",
"computed_at",
"market_value_rub",
"cash_rub",
"total_rub",
"invested_net_rub",
"pnl_total_rub",
"realized_pnl_rub",
"income_rub",
"holding_count",
"unpriced_count",
"stale_count",
"returns"
],
"title": "SummaryOut",
"type": "object"
},
"SyncJobOut": {
"properties": {
"id": {
"format": "uuid",
"title": "Id",
"type": "string"
},
"requested_at": {
"format": "date-time",
"title": "Requested At",
"type": "string"
},
"source": {
"title": "Source",
"type": "string"
},
"status": {
"$ref": "#/components/schemas/JobStatus"
}
},
"required": [
"id",
"source",
"status",
"requested_at"
],
"title": "SyncJobOut",
"type": "object"
},
"SyncRunOut": {
"properties": {
"counts": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"title": "Counts"
},
"cursor_after": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Cursor After"
},
"cursor_before": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Cursor Before"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Error"
},
"finished_at": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"title": "Finished At"
},
"id": {
"format": "uuid",
"title": "Id",
"type": "string"
},
"source": {
"title": "Source",
"type": "string"
},
"started_at": {
"format": "date-time",
"title": "Started At",
"type": "string"
},
"status": {
"$ref": "#/components/schemas/RunStatus"
},
"triggered_by": {
"title": "Triggered By",
"type": "string"
},
"warnings": {
"anyOf": [
{
"items": {},
"type": "array"
},
{
"type": "null"
}
],
"title": "Warnings"
}
},
"required": [
"id",
"source",
"status",
"triggered_by",
"started_at",
"finished_at",
"cursor_before",
"cursor_after",
"counts",
"warnings",
"error"
],
"title": "SyncRunOut",
"type": "object"
},
"TargetIn": {
"additionalProperties": false,
"properties": {
"band": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Band"
},
"bucket": {
"maxLength": 64,
"minLength": 1,
"title": "Bucket",
"type": "string"
},
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Note"
},
"target_weight": {
"description": "decimal as string",
"title": "Target Weight",
"type": "string"
}
},
"required": [
"bucket",
"target_weight"
],
"title": "TargetIn",
"type": "object"
},
"TargetOut": {
"properties": {
"band": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Band"
},
"bucket": {
"title": "Bucket",
"type": "string"
},
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Note"
},
"target_weight": {
"description": "decimal as string",
"title": "Target Weight",
"type": "string"
}
},
"required": [
"bucket",
"target_weight",
"band",
"note"
],
"title": "TargetOut",
"type": "object"
},
"TargetsIn": {
"additionalProperties": false,
"description": "A complete set for one dimension. Partial updates are not supported: weights only\nmean anything together, and a half-written set could not be checked against 1.",
"properties": {
"dimension": {
"description": "asset_class | sector | country | currency",
"title": "Dimension",
"type": "string"
},
"targets": {
"items": {
"$ref": "#/components/schemas/TargetIn"
},
"title": "Targets",
"type": "array"
}
},
"required": [
"dimension",
"targets"
],
"title": "TargetsIn",
"type": "object"
},
"TargetsOut": {
"properties": {
"dimension": {
"title": "Dimension",
"type": "string"
},
"portfolio_id": {
"title": "Portfolio Id",
"type": "integer"
},
"targets": {
"items": {
"$ref": "#/components/schemas/TargetOut"
},
"title": "Targets",
"type": "array"
},
"weights_sum": {
"description": "decimal as string",
"title": "Weights Sum",
"type": "string"
}
},
"required": [
"portfolio_id",
"dimension",
"targets",
"weights_sum"
],
"title": "TargetsOut",
"type": "object"
},
"TaxAccountOut": {
"properties": {
"account_id": {
"title": "Account Id",
"type": "integer"
},
"account_name": {
"title": "Account Name",
"type": "string"
},
"coupons_gross_rub": {
"description": "decimal as string",
"title": "Coupons Gross Rub",
"type": "string"
},
"dividends_gross_rub": {
"description": "decimal as string",
"title": "Dividends Gross Rub",
"type": "string"
},
"estimated_tax_rub": {
"description": "decimal as string",
"title": "Estimated Tax Rub",
"type": "string"
},
"ldv_exempt_rub": {
"description": "decimal as string",
"title": "Ldv Exempt Rub",
"type": "string"
},
"realized_gain_rub": {
"description": "decimal as string",
"title": "Realized Gain Rub",
"type": "string"
},
"realized_loss_rub": {
"description": "decimal as string",
"title": "Realized Loss Rub",
"type": "string"
},
"tax_withheld_rub": {
"description": "decimal as string",
"title": "Tax Withheld Rub",
"type": "string"
},
"taxable_base_rub": {
"description": "decimal as string",
"title": "Taxable Base Rub",
"type": "string"
}
},
"required": [
"dividends_gross_rub",
"coupons_gross_rub",
"tax_withheld_rub",
"realized_gain_rub",
"realized_loss_rub",
"ldv_exempt_rub",
"taxable_base_rub",
"estimated_tax_rub",
"account_id",
"account_name"
],
"title": "TaxAccountOut",
"type": "object"
},
"TaxLotOut": {
"properties": {
"account_id": {
"title": "Account Id",
"type": "integer"
},
"account_name": {
"title": "Account Name",
"type": "string"
},
"cost_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Cost Rub"
},
"days_to_ldv": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Days To Ldv"
},
"instrument_id": {
"title": "Instrument Id",
"type": "integer"
},
"ldv_date": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Ldv Date"
},
"ldv_eligible": {
"title": "Ldv Eligible",
"type": "boolean"
},
"lot_id": {
"title": "Lot Id",
"type": "integer"
},
"market_value_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Market Value Rub"
},
"name": {
"title": "Name",
"type": "string"
},
"open_date": {
"format": "date",
"title": "Open Date",
"type": "string"
},
"qty_remaining": {
"description": "decimal as string",
"title": "Qty Remaining",
"type": "string"
},
"tax_if_sold_now_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Tax If Sold Now Rub"
},
"ticker": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Ticker"
},
"unrealized_gain_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Unrealized Gain Rub"
}
},
"required": [
"lot_id",
"instrument_id",
"ticker",
"name",
"account_id",
"account_name",
"open_date",
"qty_remaining",
"cost_rub",
"market_value_rub",
"unrealized_gain_rub",
"ldv_eligible",
"ldv_date",
"days_to_ldv",
"tax_if_sold_now_rub"
],
"title": "TaxLotOut",
"type": "object"
},
"TaxLotsOut": {
"properties": {
"as_of": {
"format": "date",
"title": "As Of",
"type": "string"
},
"disclaimer": {
"title": "Disclaimer",
"type": "string"
},
"estimated": {
"default": true,
"title": "Estimated",
"type": "boolean"
},
"lots": {
"items": {
"$ref": "#/components/schemas/TaxLotOut"
},
"title": "Lots",
"type": "array"
},
"tax_rate": {
"description": "decimal as string",
"title": "Tax Rate",
"type": "string"
},
"year": {
"title": "Year",
"type": "integer"
}
},
"required": [
"year",
"as_of",
"tax_rate",
"lots",
"disclaimer"
],
"title": "TaxLotsOut",
"type": "object"
},
"TaxTotals": {
"properties": {
"coupons_gross_rub": {
"description": "decimal as string",
"title": "Coupons Gross Rub",
"type": "string"
},
"dividends_gross_rub": {
"description": "decimal as string",
"title": "Dividends Gross Rub",
"type": "string"
},
"estimated_tax_rub": {
"description": "decimal as string",
"title": "Estimated Tax Rub",
"type": "string"
},
"ldv_exempt_rub": {
"description": "decimal as string",
"title": "Ldv Exempt Rub",
"type": "string"
},
"realized_gain_rub": {
"description": "decimal as string",
"title": "Realized Gain Rub",
"type": "string"
},
"realized_loss_rub": {
"description": "decimal as string",
"title": "Realized Loss Rub",
"type": "string"
},
"tax_withheld_rub": {
"description": "decimal as string",
"title": "Tax Withheld Rub",
"type": "string"
},
"taxable_base_rub": {
"description": "decimal as string",
"title": "Taxable Base Rub",
"type": "string"
}
},
"required": [
"dividends_gross_rub",
"coupons_gross_rub",
"tax_withheld_rub",
"realized_gain_rub",
"realized_loss_rub",
"ldv_exempt_rub",
"taxable_base_rub",
"estimated_tax_rub"
],
"title": "TaxTotals",
"type": "object"
},
"TaxYearOut": {
"properties": {
"accounts": {
"items": {
"$ref": "#/components/schemas/TaxAccountOut"
},
"title": "Accounts",
"type": "array"
},
"disclaimer": {
"title": "Disclaimer",
"type": "string"
},
"estimated": {
"default": true,
"title": "Estimated",
"type": "boolean"
},
"tax_rate": {
"description": "decimal as string",
"title": "Tax Rate",
"type": "string"
},
"totals": {
"$ref": "#/components/schemas/TaxTotals"
},
"year": {
"title": "Year",
"type": "integer"
}
},
"required": [
"year",
"tax_rate",
"accounts",
"totals",
"disclaimer"
],
"title": "TaxYearOut",
"type": "object"
},
"TokenPair": {
"properties": {
"access_token": {
"title": "Access Token",
"type": "string"
},
"expires_in": {
"title": "Expires In",
"type": "integer"
},
"refresh_token": {
"title": "Refresh Token",
"type": "string"
},
"token_type": {
"default": "bearer",
"title": "Token Type",
"type": "string"
}
},
"required": [
"access_token",
"refresh_token",
"expires_in"
],
"title": "TokenPair",
"type": "object"
},
"TradeOut": {
"properties": {
"action": {
"title": "Action",
"type": "string"
},
"amount_rub": {
"description": "decimal as string",
"title": "Amount Rub",
"type": "string"
},
"blocked_by_cash": {
"title": "Blocked By Cash",
"type": "boolean"
},
"instrument_id": {
"title": "Instrument Id",
"type": "integer"
},
"lot": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Lot"
},
"name": {
"title": "Name",
"type": "string"
},
"price": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Price"
},
"price_currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Price Currency"
},
"suggested_qty": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Suggested Qty"
},
"ticker": {
"title": "Ticker",
"type": "string"
}
},
"required": [
"instrument_id",
"ticker",
"name",
"action",
"suggested_qty",
"lot",
"price",
"price_currency",
"amount_rub",
"blocked_by_cash"
],
"title": "TradeOut",
"type": "object"
},
"TransactionOut": {
"properties": {
"category_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Category Id"
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Comment"
},
"date": {
"format": "date",
"title": "Date",
"type": "string"
},
"deleted": {
"title": "Deleted",
"type": "boolean"
},
"flow_type": {
"$ref": "#/components/schemas/FlowType"
},
"hold": {
"title": "Hold",
"type": "boolean"
},
"id": {
"title": "Id",
"type": "integer"
},
"income": {
"description": "decimal as string",
"title": "Income",
"type": "string"
},
"income_account_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Income Account Id"
},
"income_currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Income Currency"
},
"income_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Income Rub"
},
"is_one_off": {
"title": "Is One Off",
"type": "boolean"
},
"mcc": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Mcc"
},
"outcome": {
"description": "decimal as string",
"title": "Outcome",
"type": "string"
},
"outcome_account_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Outcome Account Id"
},
"outcome_currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Outcome Currency"
},
"outcome_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Outcome Rub"
},
"payee": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Payee"
},
"payee_canonical": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Payee Canonical"
},
"source_id": {
"title": "Source Id",
"type": "string"
},
"tags": {
"items": {
"type": "integer"
},
"title": "Tags",
"type": "array"
},
"trip_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Trip Id"
},
"ts": {
"format": "date-time",
"title": "Ts",
"type": "string"
}
},
"required": [
"id",
"source_id",
"ts",
"date",
"income",
"income_currency",
"income_account_id",
"income_rub",
"outcome",
"outcome_currency",
"outcome_account_id",
"outcome_rub",
"payee",
"payee_canonical",
"comment",
"mcc",
"hold",
"deleted",
"flow_type",
"category_id",
"is_one_off",
"trip_id",
"tags"
],
"title": "TransactionOut",
"type": "object"
},
"TransactionPage": {
"properties": {
"items": {
"items": {
"$ref": "#/components/schemas/TransactionOut"
},
"title": "Items",
"type": "array"
},
"page": {
"title": "Page",
"type": "integer"
},
"page_size": {
"title": "Page Size",
"type": "integer"
},
"total": {
"title": "Total",
"type": "integer"
}
},
"required": [
"items",
"total",
"page",
"page_size"
],
"title": "TransactionPage",
"type": "object"
},
"UnmatchedBrokerOut": {
"properties": {
"account_id": {
"title": "Account Id",
"type": "integer"
},
"amount": {
"description": "decimal as string",
"title": "Amount",
"type": "string"
},
"currency": {
"title": "Currency",
"type": "string"
},
"date": {
"format": "date",
"title": "Date",
"type": "string"
},
"direction": {
"title": "Direction",
"type": "string"
},
"event_id": {
"title": "Event Id",
"type": "integer"
}
},
"required": [
"event_id",
"account_id",
"date",
"amount",
"currency",
"direction"
],
"title": "UnmatchedBrokerOut",
"type": "object"
},
"UnmatchedOut": {
"properties": {
"broker": {
"items": {
"$ref": "#/components/schemas/UnmatchedBrokerOut"
},
"title": "Broker",
"type": "array"
},
"zm": {
"items": {
"$ref": "#/components/schemas/UnmatchedZmOut"
},
"title": "Zm",
"type": "array"
}
},
"required": [
"zm",
"broker"
],
"title": "UnmatchedOut",
"type": "object"
},
"UnmatchedZmOut": {
"properties": {
"amount": {
"description": "decimal as string",
"title": "Amount",
"type": "string"
},
"broker_account_id": {
"title": "Broker Account Id",
"type": "integer"
},
"cash_txn_id": {
"title": "Cash Txn Id",
"type": "integer"
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Comment"
},
"currency": {
"title": "Currency",
"type": "string"
},
"date": {
"format": "date",
"title": "Date",
"type": "string"
},
"direction": {
"title": "Direction",
"type": "string"
},
"payee": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Payee"
},
"route": {
"title": "Route",
"type": "string"
}
},
"required": [
"cash_txn_id",
"date",
"amount",
"currency",
"direction",
"broker_account_id",
"route",
"payee",
"comment"
],
"title": "UnmatchedZmOut",
"type": "object"
},
"UserOut": {
"properties": {
"email": {
"title": "Email",
"type": "string"
},
"id": {
"title": "Id",
"type": "integer"
}
},
"required": [
"id",
"email"
],
"title": "UserOut",
"type": "object"
},
"ValueDay": {
"properties": {
"accrued_interest_rub": {
"description": "decimal as string",
"title": "Accrued Interest Rub",
"type": "string"
},
"cash_rub": {
"description": "decimal as string",
"title": "Cash Rub",
"type": "string"
},
"d": {
"format": "date",
"title": "D",
"type": "string"
},
"external_flow_rub": {
"description": "decimal as string",
"title": "External Flow Rub",
"type": "string"
},
"invested_net_rub": {
"description": "decimal as string",
"title": "Invested Net Rub",
"type": "string"
},
"market_value_rub": {
"description": "decimal as string",
"title": "Market Value Rub",
"type": "string"
},
"missing_fx_count": {
"title": "Missing Fx Count",
"type": "integer"
},
"missing_price_count": {
"title": "Missing Price Count",
"type": "integer"
},
"pnl_total_rub": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Pnl Total Rub"
},
"stale_price_count": {
"title": "Stale Price Count",
"type": "integer"
},
"total_rub": {
"description": "decimal as string",
"title": "Total Rub",
"type": "string"
}
},
"required": [
"d",
"market_value_rub",
"accrued_interest_rub",
"cash_rub",
"total_rub",
"external_flow_rub",
"invested_net_rub",
"pnl_total_rub",
"stale_price_count",
"missing_price_count",
"missing_fx_count"
],
"title": "ValueDay",
"type": "object"
}
},
"securitySchemes": {
"HTTPBearer": {
"scheme": "bearer",
"type": "http"
}
}
},
"info": {
"title": "fin-tracker",
"version": "0.1.0"
},
"openapi": "3.1.0",
"paths": {
"/api/v1/accounts": {
"get": {
"description": "Every account, archived ones included — the client decides what to show.",
"operationId": "accounts_list",
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/AccountOut"
},
"title": "Response Accounts List",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "List",
"tags": [
"accounts"
]
},
"post": {
"description": "Create the broker account a report import will write into.\n\n`source_id` is the agreement number the report prints: it is how the import finds the\naccount on its own the next time.",
"operationId": "accounts_create",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AccountCreate"
}
}
},
"required": true
},
"responses": {
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AccountOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Create",
"tags": [
"accounts"
]
}
},
"/api/v1/accounts/{account_id}": {
"patch": {
"description": "Update the user-owned fields. Everything else is overwritten by the next sync.",
"operationId": "accounts_patch",
"parameters": [
{
"in": "path",
"name": "account_id",
"required": true,
"schema": {
"title": "Account Id",
"type": "integer"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AccountPatch"
}
}
},
"required": true
},
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AccountOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Patch",
"tags": [
"accounts"
]
}
},
"/api/v1/analytics/allocation": {
"get": {
"description": "Buckets of one dimension (or all four), largest first.",
"operationId": "analytics_allocation",
"parameters": [
{
"description": "all | account:<id> | portfolio:<id>",
"in": "query",
"name": "scope",
"required": false,
"schema": {
"default": "all",
"description": "all | account:<id> | portfolio:<id>",
"title": "Scope",
"type": "string"
}
},
{
"in": "query",
"name": "dimension",
"required": false,
"schema": {
"anyOf": [
{
"$ref": "#/components/schemas/AllocationDimension"
},
{
"type": "null"
}
],
"title": "Dimension"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/AllocationBucket"
},
"title": "Response Analytics Allocation",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Allocation",
"tags": [
"analytics"
]
}
},
"/api/v1/analytics/benchmarks": {
"get": {
"description": "The portfolio's TWR beside each benchmark's, on the same grid of days.\n\n`days_skipped` is returned on both sides and is not cosmetic: a non-zero value on either\nmeans the two chains did not cover the same days, and the difference is then an\napproximation of an excess return rather than one.",
"operationId": "benchmarks_benchmarks",
"parameters": [
{
"description": "all | account:<id> | portfolio:<id>",
"in": "query",
"name": "scope",
"required": false,
"schema": {
"default": "all",
"description": "all | account:<id> | portfolio:<id>",
"title": "Scope",
"type": "string"
}
},
{
"description": "repeatable: 1m 3m 6m ytd 1y 3y all",
"in": "query",
"name": "period",
"required": false,
"schema": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"description": "repeatable: 1m 3m 6m ytd 1y 3y all",
"title": "Period"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/BenchmarkComparison"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Benchmarks",
"tags": [
"benchmarks"
]
}
},
"/api/v1/analytics/cashflow-broker": {
"get": {
"description": "Money moved across the brokerage boundary, by month: the other half of cash flow\nthat `metric_cash_flow_monthly` (ZenMoney spending) does not cover.",
"operationId": "analytics_cashflow_broker",
"parameters": [
{
"description": "all | account:<id> | portfolio:<id>",
"in": "query",
"name": "scope",
"required": false,
"schema": {
"default": "all",
"description": "all | account:<id> | portfolio:<id>",
"title": "Scope",
"type": "string"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/CashFlowBrokerMonth"
},
"title": "Response Analytics Cashflow Broker",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Cashflow Broker",
"tags": [
"analytics"
]
}
},
"/api/v1/analytics/holdings": {
"get": {
"description": "Open positions, most valuable first; unpriced ones last with null values.",
"operationId": "analytics_holdings",
"parameters": [
{
"description": "all | account:<id> | portfolio:<id>",
"in": "query",
"name": "scope",
"required": false,
"schema": {
"default": "all",
"description": "all | account:<id> | portfolio:<id>",
"title": "Scope",
"type": "string"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/HoldingOut"
},
"title": "Response Analytics Holdings",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Holdings",
"tags": [
"analytics"
]
}
},
"/api/v1/analytics/overview": {
"get": {
"description": "One card per scope for the home screen, in a single round trip.\n\n`all` first, then the portfolios, then the accounts by value. A scope holding nothing at\nall is left out: a card of zeros is noise, not an answer.",
"operationId": "analytics_overview",
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/ScopeCardOut"
},
"title": "Response Analytics Overview",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Overview",
"tags": [
"analytics"
]
}
},
"/api/v1/analytics/returns": {
"get": {
"description": "XIRR and TWR per period, shortest first.",
"operationId": "analytics_returns",
"parameters": [
{
"description": "all | account:<id> | portfolio:<id>",
"in": "query",
"name": "scope",
"required": false,
"schema": {
"default": "all",
"description": "all | account:<id> | portfolio:<id>",
"title": "Scope",
"type": "string"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/ReturnsOut"
},
"title": "Response Analytics Returns",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Returns",
"tags": [
"analytics"
]
}
},
"/api/v1/analytics/scopes": {
"get": {
"description": "Every set of accounts the metrics were built for.",
"operationId": "analytics_scopes",
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/ScopeOut"
},
"title": "Response Analytics Scopes",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Scopes",
"tags": [
"analytics"
]
}
},
"/api/v1/analytics/summary": {
"get": {
"description": "One screen's worth: the latest day, the totals it adds up to, and the returns.",
"operationId": "analytics_summary",
"parameters": [
{
"description": "all | account:<id> | portfolio:<id>",
"in": "query",
"name": "scope",
"required": false,
"schema": {
"default": "all",
"description": "all | account:<id> | portfolio:<id>",
"title": "Scope",
"type": "string"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SummaryOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Summary",
"tags": [
"analytics"
]
}
},
"/api/v1/analytics/value-series": {
"get": {
"description": "Daily portfolio value; defaults to the last 365 days.",
"operationId": "analytics_value_series",
"parameters": [
{
"description": "all | account:<id> | portfolio:<id>",
"in": "query",
"name": "scope",
"required": false,
"schema": {
"default": "all",
"description": "all | account:<id> | portfolio:<id>",
"title": "Scope",
"type": "string"
}
},
{
"in": "query",
"name": "from",
"required": false,
"schema": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "From"
}
},
{
"in": "query",
"name": "to",
"required": false,
"schema": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "To"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/ValueDay"
},
"title": "Response Analytics Value Series",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Value Series",
"tags": [
"analytics"
]
}
},
"/api/v1/auth/login": {
"post": {
"operationId": "auth_login",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/LoginRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TokenPair"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"summary": "Login",
"tags": [
"auth"
]
}
},
"/api/v1/auth/logout": {
"post": {
"operationId": "auth_logout",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RefreshRequest"
}
}
},
"required": true
},
"responses": {
"204": {
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"summary": "Logout",
"tags": [
"auth"
]
}
},
"/api/v1/auth/me": {
"get": {
"operationId": "auth_me",
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UserOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Me",
"tags": [
"auth"
]
}
},
"/api/v1/auth/refresh": {
"post": {
"operationId": "auth_refresh",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RefreshRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TokenPair"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"summary": "Refresh",
"tags": [
"auth"
]
}
},
"/api/v1/benchmarks": {
"get": {
"description": "Every benchmark, defaults first — the order the comparison block shows them in.",
"operationId": "benchmarks_list",
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/BenchmarkOut"
},
"title": "Response Benchmarks List",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "List",
"tags": [
"benchmarks"
]
},
"post": {
"operationId": "benchmarks_create",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/BenchmarkCreate"
}
}
},
"required": true
},
"responses": {
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/BenchmarkOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Create",
"tags": [
"benchmarks"
]
}
},
"/api/v1/benchmarks/{benchmark_id}": {
"delete": {
"operationId": "benchmarks_delete",
"parameters": [
{
"in": "path",
"name": "benchmark_id",
"required": true,
"schema": {
"title": "Benchmark Id",
"type": "integer"
}
}
],
"responses": {
"204": {
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Delete",
"tags": [
"benchmarks"
]
},
"patch": {
"operationId": "benchmarks_patch",
"parameters": [
{
"in": "path",
"name": "benchmark_id",
"required": true,
"schema": {
"title": "Benchmark Id",
"type": "integer"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/BenchmarkPatch"
}
}
},
"required": true
},
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/BenchmarkOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Patch",
"tags": [
"benchmarks"
]
}
},
"/api/v1/cashflow/monthly": {
"get": {
"description": "The last `months` months, oldest first.",
"operationId": "cashflow_monthly",
"parameters": [
{
"in": "query",
"name": "months",
"required": false,
"schema": {
"default": 12,
"maximum": 120,
"minimum": 1,
"title": "Months",
"type": "integer"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/CashFlowMonth"
},
"title": "Response Cashflow Monthly",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Monthly",
"tags": [
"cashflow"
]
}
},
"/api/v1/categories": {
"get": {
"description": "Flat list of the ZenMoney tag tree; the client nests it by `parent_id`.",
"operationId": "categories_list",
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/CategoryOut"
},
"title": "Response Categories List",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "List",
"tags": [
"categories"
]
}
},
"/api/v1/data-quality": {
"get": {
"description": "Findings of the latest refresh, most serious first.",
"operationId": "metrics_data_quality",
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/DataQualityRow"
},
"title": "Response Metrics Data Quality",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Data Quality",
"tags": [
"metrics"
]
}
},
"/api/v1/events": {
"get": {
"description": "One page of ledger events, newest first, with RUB amounts at each own date's rate.",
"operationId": "events_list",
"parameters": [
{
"in": "query",
"name": "from",
"required": false,
"schema": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "From"
}
},
{
"in": "query",
"name": "to",
"required": false,
"schema": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "To"
}
},
{
"in": "query",
"name": "account_id",
"required": false,
"schema": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Account Id"
}
},
{
"in": "query",
"name": "instrument_id",
"required": false,
"schema": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Instrument Id"
}
},
{
"in": "query",
"name": "kind",
"required": false,
"schema": {
"anyOf": [
{
"$ref": "#/components/schemas/EventKind"
},
{
"type": "null"
}
],
"title": "Kind"
}
},
{
"in": "query",
"name": "status",
"required": false,
"schema": {
"anyOf": [
{
"$ref": "#/components/schemas/EventStatus"
},
{
"type": "null"
}
],
"title": "Status"
}
},
{
"description": "only the events XIRR reads as boundary flows",
"in": "query",
"name": "external_flow",
"required": false,
"schema": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "only the events XIRR reads as boundary flows",
"title": "External Flow"
}
},
{
"description": "substring of description or ticker",
"in": "query",
"name": "q",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "substring of description or ticker",
"title": "Q"
}
},
{
"in": "query",
"name": "page",
"required": false,
"schema": {
"default": 1,
"minimum": 1,
"title": "Page",
"type": "integer"
}
},
{
"in": "query",
"name": "page_size",
"required": false,
"schema": {
"default": 50,
"maximum": 500,
"minimum": 1,
"title": "Page Size",
"type": "integer"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/EventPage"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "List",
"tags": [
"events"
]
},
"post": {
"description": "Enter an event by hand. It is `confirmed` at once: it is the user's own statement, so\nit is never shadowed by the account's primary feed.",
"operationId": "events_create",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ManualEventCreate"
}
}
},
"required": true
},
"responses": {
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/EventOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Create",
"tags": [
"events"
]
}
},
"/api/v1/events/{event_id}": {
"delete": {
"description": "Delete an event that was entered by hand. Broker events are evidence, not ours to erase:\nthe next sync or import would bring them straight back.",
"operationId": "events_delete",
"parameters": [
{
"in": "path",
"name": "event_id",
"required": true,
"schema": {
"title": "Event Id",
"type": "integer"
}
}
],
"responses": {
"204": {
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Delete",
"tags": [
"events"
]
}
},
"/api/v1/goals": {
"get": {
"operationId": "goals_list",
"parameters": [
{
"in": "query",
"name": "include_archived",
"required": false,
"schema": {
"default": false,
"title": "Include Archived",
"type": "boolean"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/GoalOut"
},
"title": "Response Goals List",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "List",
"tags": [
"goals"
]
},
"post": {
"operationId": "goals_create",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GoalCreate"
}
}
},
"required": true
},
"responses": {
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GoalOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Create",
"tags": [
"goals"
]
}
},
"/api/v1/goals/{goal_id}": {
"delete": {
"operationId": "goals_delete",
"parameters": [
{
"in": "path",
"name": "goal_id",
"required": true,
"schema": {
"title": "Goal Id",
"type": "integer"
}
}
],
"responses": {
"204": {
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Delete",
"tags": [
"goals"
]
},
"patch": {
"operationId": "goals_patch",
"parameters": [
{
"in": "path",
"name": "goal_id",
"required": true,
"schema": {
"title": "Goal Id",
"type": "integer"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GoalPatch"
}
}
},
"required": true
},
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GoalOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Patch",
"tags": [
"goals"
]
}
},
"/api/v1/goals/{goal_id}/progress": {
"get": {
"operationId": "goals_progress",
"parameters": [
{
"in": "path",
"name": "goal_id",
"required": true,
"schema": {
"title": "Goal Id",
"type": "integer"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GoalProgressOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Progress",
"tags": [
"goals"
]
}
},
"/api/v1/health": {
"get": {
"description": "503 when the database cannot be reached, so a container healthcheck can trust the code.",
"operationId": "health_check",
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Health"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"summary": "Check",
"tags": [
"health"
]
}
},
"/api/v1/imports": {
"get": {
"description": "Newest imports first, with the counters each was committed with.",
"operationId": "imports_list",
"parameters": [
{
"description": "uploaded | parsed | committed | failed",
"in": "query",
"name": "status",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "uploaded | parsed | committed | failed",
"title": "Status"
}
},
{
"in": "query",
"name": "limit",
"required": false,
"schema": {
"default": 50,
"maximum": 200,
"minimum": 1,
"title": "Limit",
"type": "integer"
}
},
{
"in": "query",
"name": "offset",
"required": false,
"schema": {
"default": 0,
"minimum": 0,
"title": "Offset",
"type": "integer"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/ImportSummary"
},
"title": "Response Imports List",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "List",
"tags": [
"imports"
]
},
"post": {
"description": "Upload a report, parse it and show what committing it would do. Writes no event.",
"operationId": "imports_create",
"requestBody": {
"content": {
"multipart/form-data": {
"schema": {
"$ref": "#/components/schemas/Body_imports_create"
}
}
},
"required": true
},
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ImportPreview"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Create",
"tags": [
"imports"
]
}
},
"/api/v1/imports/{import_id}": {
"delete": {
"description": "Drop an uncommitted import. A committed one stays: `raw_*` is append-only.",
"operationId": "imports_delete",
"parameters": [
{
"in": "path",
"name": "import_id",
"required": true,
"schema": {
"title": "Import Id",
"type": "integer"
}
}
],
"responses": {
"204": {
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Delete",
"tags": [
"imports"
]
},
"get": {
"description": "The preview again — recomputed for an uncommitted import, replayed for a committed one.",
"operationId": "imports_get",
"parameters": [
{
"in": "path",
"name": "import_id",
"required": true,
"schema": {
"title": "Import Id",
"type": "integer"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ImportPreview"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Get",
"tags": [
"imports"
]
}
},
"/api/v1/imports/{import_id}/commit": {
"post": {
"description": "Write the file's events into the ledger and rebuild every metric.",
"operationId": "imports_commit",
"parameters": [
{
"in": "path",
"name": "import_id",
"required": true,
"schema": {
"title": "Import Id",
"type": "integer"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CommitRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ImportResult"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Commit",
"tags": [
"imports"
]
}
},
"/api/v1/income/calendar": {
"get": {
"description": "Payments in a window, one row each; defaults to the next 12 months, forecast only.",
"operationId": "income_calendar",
"parameters": [
{
"description": "all | account:<id> | portfolio:<id>",
"in": "query",
"name": "scope",
"required": false,
"schema": {
"default": "all",
"description": "all | account:<id> | portfolio:<id>",
"title": "Scope",
"type": "string"
}
},
{
"in": "query",
"name": "date_from",
"required": false,
"schema": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Date From"
}
},
{
"in": "query",
"name": "date_to",
"required": false,
"schema": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Date To"
}
},
{
"in": "query",
"name": "include_paid",
"required": false,
"schema": {
"default": false,
"title": "Include Paid",
"type": "boolean"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CalendarOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Calendar",
"tags": [
"income"
]
}
},
"/api/v1/income/forecast": {
"get": {
"description": "Expected income per month, split by basis, plus the yield it implies.",
"operationId": "income_forecast",
"parameters": [
{
"description": "all | account:<id> | portfolio:<id>",
"in": "query",
"name": "scope",
"required": false,
"schema": {
"default": "all",
"description": "all | account:<id> | portfolio:<id>",
"title": "Scope",
"type": "string"
}
},
{
"in": "query",
"name": "months",
"required": false,
"schema": {
"default": 12,
"maximum": 36,
"minimum": 1,
"title": "Months",
"type": "integer"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ForecastOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Forecast",
"tags": [
"income"
]
}
},
"/api/v1/income/history": {
"get": {
"description": "Income actually received, grouped by month, kind and currency.\n\n`group` exists for the contract's sake and accepts only `month`: the table is stored\nmonthly, and a finer grouping would have to re-read the ledger, which is what the\ncalendar's `paid` rows already do per payment.",
"operationId": "income_history",
"parameters": [
{
"description": "all | account:<id> | portfolio:<id>",
"in": "query",
"name": "scope",
"required": false,
"schema": {
"default": "all",
"description": "all | account:<id> | portfolio:<id>",
"title": "Scope",
"type": "string"
}
},
{
"description": "month",
"in": "query",
"name": "group",
"required": false,
"schema": {
"default": "month",
"description": "month",
"title": "Group",
"type": "string"
}
},
{
"in": "query",
"name": "date_from",
"required": false,
"schema": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Date From"
}
},
{
"in": "query",
"name": "date_to",
"required": false,
"schema": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Date To"
}
},
{
"description": "dividend | coupon | …",
"in": "query",
"name": "kind",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "dividend | coupon | …",
"title": "Kind"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HistoryOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "History",
"tags": [
"income"
]
}
},
"/api/v1/instruments": {
"get": {
"operationId": "instruments_list",
"parameters": [
{
"description": "substring of ticker, name or ISIN",
"in": "query",
"name": "q",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "substring of ticker, name or ISIN",
"title": "Q"
}
},
{
"description": "share | bond | etf | fund | currency | index | …",
"in": "query",
"name": "asset_class",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "share | bond | etf | fund | currency | index | …",
"title": "Asset Class"
}
},
{
"description": "only instruments with an open lot",
"in": "query",
"name": "held_only",
"required": false,
"schema": {
"default": false,
"description": "only instruments with an open lot",
"title": "Held Only",
"type": "boolean"
}
},
{
"in": "query",
"name": "limit",
"required": false,
"schema": {
"default": 100,
"maximum": 500,
"minimum": 1,
"title": "Limit",
"type": "integer"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/InstrumentOut"
},
"title": "Response Instruments List",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "List",
"tags": [
"instruments"
]
}
},
"/api/v1/instruments/pending": {
"get": {
"description": "Instruments a report named that nothing in the master resolves to.",
"operationId": "instruments_pending",
"parameters": [
{
"description": "pending | resolved | ignored | all",
"in": "query",
"name": "status",
"required": false,
"schema": {
"default": "pending",
"description": "pending | resolved | ignored | all",
"title": "Status",
"type": "string"
}
},
{
"in": "query",
"name": "limit",
"required": false,
"schema": {
"default": 100,
"maximum": 500,
"minimum": 1,
"title": "Limit",
"type": "integer"
}
},
{
"in": "query",
"name": "offset",
"required": false,
"schema": {
"default": 0,
"minimum": 0,
"title": "Offset",
"type": "integer"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/PendingInstrumentOut"
},
"title": "Response Instruments Pending",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Pending",
"tags": [
"instruments"
]
}
},
"/api/v1/instruments/pending/{pending_id}/resolve": {
"post": {
"description": "Link, create or ignore — then bind the events that were waiting and rebuild the lots.",
"operationId": "instruments_pending_resolve",
"parameters": [
{
"in": "path",
"name": "pending_id",
"required": true,
"schema": {
"title": "Pending Id",
"type": "integer"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PendingResolveRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PendingResolveResult"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Pending Resolve",
"tags": [
"instruments"
]
}
},
"/api/v1/instruments/{instrument_id}": {
"get": {
"description": "One instrument with its position, open lots, events and price history.",
"operationId": "instruments_get",
"parameters": [
{
"in": "path",
"name": "instrument_id",
"required": true,
"schema": {
"title": "Instrument Id",
"type": "integer"
}
},
{
"description": "all | account:<id> | portfolio:<id>",
"in": "query",
"name": "scope",
"required": false,
"schema": {
"default": "all",
"description": "all | account:<id> | portfolio:<id>",
"title": "Scope",
"type": "string"
}
},
{
"in": "query",
"name": "prices_from",
"required": false,
"schema": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "Prices From"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/InstrumentDetail"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Get",
"tags": [
"instruments"
]
},
"patch": {
"description": "Correct an instrument by hand: name, board, lot, asset class, sector.\n\nThe lot only rounds the quantities the rebalancing suggests; the asset class decides the\nbucket it lands in. Neither is refreshed here — call `POST /metrics/refresh` after, same\nas `/rules/apply`.",
"operationId": "instruments_patch",
"parameters": [
{
"in": "path",
"name": "instrument_id",
"required": true,
"schema": {
"title": "Instrument Id",
"type": "integer"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/InstrumentPatch"
}
}
},
"required": true
},
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/InstrumentOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Patch",
"tags": [
"instruments"
]
}
},
"/api/v1/instruments/{instrument_id}/prices": {
"post": {
"description": "Set (or replace) the manual price of `instrument_id` on `body.d`.\n\nFor what no exchange quotes: real estate, crypto, a custom holding, an OTC bond nobody\nlists. One row per (instrument, day) — a second call for the same day replaces it rather\nthan piling up duplicates the price series would then have to pick between. Does not\nitself refresh `metric_*`; call `POST /metrics/refresh` after, same as `/rules/apply`.",
"operationId": "instruments_set_manual_price",
"parameters": [
{
"in": "path",
"name": "instrument_id",
"required": true,
"schema": {
"title": "Instrument Id",
"type": "integer"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PriceManualIn"
}
}
},
"required": true
},
"responses": {
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PriceManualOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Set Manual Price",
"tags": [
"instruments"
]
}
},
"/api/v1/links": {
"post": {
"description": "Confirm a pairing the matcher missed. Never touched by the automatic rebuild afterwards.",
"operationId": "links_create",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/LinkCreate"
}
}
},
"required": true
},
"responses": {
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/LinkOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Create",
"tags": [
"links"
]
}
},
"/api/v1/links/unmatched": {
"get": {
"description": "Every candidate that survives matching without a link, on either side.",
"operationId": "links_unmatched",
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UnmatchedOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Unmatched",
"tags": [
"links"
]
}
},
"/api/v1/links/{link_id}": {
"delete": {
"description": "Undo a link, manual or automatic. `flow_type` reverts on the next `POST /metrics/refresh`,\nwhen `classify` rebuilds it from the rules and `matching` no longer overwrites it.",
"operationId": "links_delete",
"parameters": [
{
"in": "path",
"name": "link_id",
"required": true,
"schema": {
"title": "Link Id",
"type": "integer"
}
}
],
"responses": {
"204": {
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Delete",
"tags": [
"links"
]
}
},
"/api/v1/metrics/refresh": {
"post": {
"description": "Queue a rebuild of every metric_* table; the worker runs it. Poll `/metrics/status`\nuntil `refreshing` is false.\n\nA request while one is already waiting shares it. One that arrives while a rebuild is\nRUNNING queues another, because the running one may have read the data before the change\nthat prompted this call.",
"operationId": "metrics_refresh",
"responses": {
"202": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SyncJobOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Refresh",
"tags": [
"metrics"
]
}
},
"/api/v1/metrics/status": {
"get": {
"description": "When the metric tables were last rebuilt, whether they are one consistent snapshot,\nand whether another rebuild is on its way.",
"operationId": "metrics_status",
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MetricsStatusOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Status",
"tags": [
"metrics"
]
}
},
"/api/v1/networth/breakdown": {
"get": {
"description": "The latest day's buckets, plus every account's current balance native and in RUB.",
"operationId": "networth_breakdown",
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/NetWorthBreakdown"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Breakdown",
"tags": [
"networth"
]
}
},
"/api/v1/networth/series": {
"get": {
"description": "Daily net worth; defaults to the last 365 days.",
"operationId": "networth_series",
"parameters": [
{
"in": "query",
"name": "from",
"required": false,
"schema": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "From"
}
},
{
"in": "query",
"name": "to",
"required": false,
"schema": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "To"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/NetWorthDay"
},
"title": "Response Networth Series",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Series",
"tags": [
"networth"
]
}
},
"/api/v1/portfolios": {
"get": {
"operationId": "portfolios_list",
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/PortfolioOut"
},
"title": "Response Portfolios List",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "List",
"tags": [
"portfolios"
]
},
"post": {
"operationId": "portfolios_create",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PortfolioCreate"
}
}
},
"required": true
},
"responses": {
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PortfolioOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Create",
"tags": [
"portfolios"
]
}
},
"/api/v1/portfolios/{portfolio_id}": {
"delete": {
"operationId": "portfolios_delete",
"parameters": [
{
"in": "path",
"name": "portfolio_id",
"required": true,
"schema": {
"title": "Portfolio Id",
"type": "integer"
}
}
],
"responses": {
"204": {
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Delete",
"tags": [
"portfolios"
]
},
"patch": {
"operationId": "portfolios_patch",
"parameters": [
{
"in": "path",
"name": "portfolio_id",
"required": true,
"schema": {
"title": "Portfolio Id",
"type": "integer"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PortfolioPatch"
}
}
},
"required": true
},
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PortfolioOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Patch",
"tags": [
"portfolios"
]
}
},
"/api/v1/portfolios/{portfolio_id}/accounts": {
"put": {
"operationId": "portfolios_set_accounts",
"parameters": [
{
"in": "path",
"name": "portfolio_id",
"required": true,
"schema": {
"title": "Portfolio Id",
"type": "integer"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PortfolioAccountsIn"
}
}
},
"required": true
},
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PortfolioOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Set Accounts",
"tags": [
"portfolios"
]
}
},
"/api/v1/portfolios/{portfolio_id}/rebalance": {
"get": {
"operationId": "rebalance_rebalance",
"parameters": [
{
"in": "path",
"name": "portfolio_id",
"required": true,
"schema": {
"title": "Portfolio Id",
"type": "integer"
}
},
{
"description": "asset_class | sector | country | currency",
"in": "query",
"name": "dimension",
"required": false,
"schema": {
"default": "asset_class",
"description": "asset_class | sector | country | currency",
"title": "Dimension",
"type": "string"
}
},
{
"description": "переопределяет остаток на счетах для what-if",
"in": "query",
"name": "cash_available",
"required": false,
"schema": {
"anyOf": [
{
"description": "decimal as string",
"type": "string"
},
{
"type": "null"
}
],
"title": "Cash Available"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RebalanceOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Rebalance",
"tags": [
"rebalance"
]
}
},
"/api/v1/portfolios/{portfolio_id}/targets": {
"get": {
"operationId": "rebalance_targets",
"parameters": [
{
"in": "path",
"name": "portfolio_id",
"required": true,
"schema": {
"title": "Portfolio Id",
"type": "integer"
}
},
{
"description": "asset_class | sector | country | currency",
"in": "query",
"name": "dimension",
"required": false,
"schema": {
"default": "asset_class",
"description": "asset_class | sector | country | currency",
"title": "Dimension",
"type": "string"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TargetsOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Targets",
"tags": [
"rebalance"
]
},
"put": {
"description": "Replace the whole set for one dimension.\n\nThe weights must add up to 1 within `WEIGHT_TOLERANCE`; otherwise the request is\nrefused with the actual sum in the message, so the user can see by how much the plan\nmisses rather than being handed a silently rescaled one.",
"operationId": "rebalance_set_targets",
"parameters": [
{
"in": "path",
"name": "portfolio_id",
"required": true,
"schema": {
"title": "Portfolio Id",
"type": "integer"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TargetsIn"
}
}
},
"required": true
},
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TargetsOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Set Targets",
"tags": [
"rebalance"
]
}
},
"/api/v1/rules": {
"get": {
"operationId": "rules_list",
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/RuleOut"
},
"title": "Response Rules List",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "List",
"tags": [
"rules"
]
},
"post": {
"operationId": "rules_create",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RuleCreate"
}
}
},
"required": true
},
"responses": {
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RuleOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Create",
"tags": [
"rules"
]
}
},
"/api/v1/rules/apply": {
"post": {
"description": "Re-run the whole metric refresh so edited rules take effect everywhere at once.",
"operationId": "rules_apply",
"responses": {
"202": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RefreshLogOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Apply",
"tags": [
"rules"
]
}
},
"/api/v1/rules/stale": {
"get": {
"description": "Enabled rules that matched nothing in the latest refresh: the payee was renamed,\nor the transaction was re-categorised in ZenMoney.",
"operationId": "rules_stale",
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/RuleOut"
},
"title": "Response Rules Stale",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Stale",
"tags": [
"rules"
]
}
},
"/api/v1/rules/{rule_id}": {
"delete": {
"operationId": "rules_delete",
"parameters": [
{
"in": "path",
"name": "rule_id",
"required": true,
"schema": {
"title": "Rule Id",
"type": "integer"
}
}
],
"responses": {
"204": {
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Delete",
"tags": [
"rules"
]
},
"patch": {
"operationId": "rules_patch",
"parameters": [
{
"in": "path",
"name": "rule_id",
"required": true,
"schema": {
"title": "Rule Id",
"type": "integer"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RulePatch"
}
}
},
"required": true
},
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RuleOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Patch",
"tags": [
"rules"
]
}
},
"/api/v1/runway": {
"get": {
"description": "How many months the liquid reserve covers; null before the first refresh.",
"operationId": "cashflow_runway",
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"anyOf": [
{
"$ref": "#/components/schemas/RunwayOut"
},
{
"type": "null"
}
],
"title": "Response Cashflow Runway"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Runway",
"tags": [
"cashflow"
]
}
},
"/api/v1/spending/categories": {
"get": {
"description": "Expenses of one month by category, largest first.",
"operationId": "cashflow_spending",
"parameters": [
{
"description": "YYYY-MM; defaults to the latest month",
"in": "query",
"name": "month",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "YYYY-MM; defaults to the latest month",
"title": "Month"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/SpendingRow"
},
"title": "Response Cashflow Spending",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Spending",
"tags": [
"cashflow"
]
}
},
"/api/v1/sync/runs": {
"get": {
"operationId": "sync_runs",
"parameters": [
{
"in": "query",
"name": "source",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Source"
}
},
{
"in": "query",
"name": "limit",
"required": false,
"schema": {
"default": 20,
"maximum": 200,
"minimum": 1,
"title": "Limit",
"type": "integer"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/SyncRunOut"
},
"title": "Response Sync Runs",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Runs",
"tags": [
"sync"
]
}
},
"/api/v1/sync/status": {
"get": {
"operationId": "sync_status",
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/SourceStatus"
},
"title": "Response Sync Status",
"type": "array"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Status",
"tags": [
"sync"
]
}
},
"/api/v1/sync/{source}": {
"post": {
"operationId": "sync_trigger",
"parameters": [
{
"in": "path",
"name": "source",
"required": true,
"schema": {
"title": "Source",
"type": "string"
}
}
],
"responses": {
"202": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SyncJobOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Trigger",
"tags": [
"sync"
]
}
},
"/api/v1/tax": {
"get": {
"description": "The year's estimated tax position, per account and in total.",
"operationId": "tax_summary",
"parameters": [
{
"in": "query",
"name": "year",
"required": false,
"schema": {
"anyOf": [
{
"maximum": 2200,
"minimum": 1990,
"type": "integer"
},
{
"type": "null"
}
],
"title": "Year"
}
},
{
"in": "query",
"name": "account_id",
"required": false,
"schema": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Account Id"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TaxYearOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Summary",
"tags": [
"tax"
]
}
},
"/api/v1/tax/lots": {
"get": {
"description": "Open lots with the date after which a sale falls under the long-term exemption.\n\n`year` selects the rate the \"what if I sold today\" figure is computed at; the lots\nthemselves are always the ones open right now. `lot` is rebuilt from the ledger on every\nrefresh and holds today's state only, so there is no honest way to answer \"which lots\nwere open on 31 December two years ago\" — and inventing one would be worse than the\nlimitation.",
"operationId": "tax_lots",
"parameters": [
{
"in": "query",
"name": "year",
"required": false,
"schema": {
"anyOf": [
{
"maximum": 2200,
"minimum": 1990,
"type": "integer"
},
{
"type": "null"
}
],
"title": "Year"
}
},
{
"in": "query",
"name": "account_id",
"required": false,
"schema": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Account Id"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TaxLotsOut"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "Lots",
"tags": [
"tax"
]
}
},
"/api/v1/transactions": {
"get": {
"description": "One page of transactions, newest first, with RUB amounts at each own date's rate.",
"operationId": "transactions_list",
"parameters": [
{
"in": "query",
"name": "from",
"required": false,
"schema": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "From"
}
},
{
"in": "query",
"name": "to",
"required": false,
"schema": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"title": "To"
}
},
{
"in": "query",
"name": "account_id",
"required": false,
"schema": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Account Id"
}
},
{
"in": "query",
"name": "category_id",
"required": false,
"schema": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Category Id"
}
},
{
"in": "query",
"name": "flow_type",
"required": false,
"schema": {
"anyOf": [
{
"$ref": "#/components/schemas/FlowType"
},
{
"type": "null"
}
],
"title": "Flow Type"
}
},
{
"description": "substring of payee or comment",
"in": "query",
"name": "q",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "substring of payee or comment",
"title": "Q"
}
},
{
"in": "query",
"name": "include_deleted",
"required": false,
"schema": {
"default": false,
"title": "Include Deleted",
"type": "boolean"
}
},
{
"in": "query",
"name": "page",
"required": false,
"schema": {
"default": 1,
"minimum": 1,
"title": "Page",
"type": "integer"
}
},
{
"in": "query",
"name": "page_size",
"required": false,
"schema": {
"default": 50,
"maximum": 500,
"minimum": 1,
"title": "Page Size",
"type": "integer"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TransactionPage"
}
}
},
"description": "Successful Response"
},
"default": {
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
},
"description": "Error"
}
},
"security": [
{
"HTTPBearer": []
}
],
"summary": "List",
"tags": [
"transactions"
]
}
}
},
"servers": [
{
"url": "/"
}
]
}