View as Markdown

Manual intake

Operator tools for taking data in by hand: dropping a bank file where the platform picks it up, admitting a bank's quoted prices for an asset, reading the SIX prices there are for an asset, and writing an asset's dividends. Every route needs the ops:manual-intake scope. The writes take ?dry_run=true and an Idempotency-Key header; the price admission and the dividends are logged in the change history, a dropped file is not. The SIX read stores nothing, so it takes neither. To upload a bank file and follow it as an import, use POST /v1/imports.

Ids are v1 ids: asset_id is an asset's id and custodian_id a bank's id. An id that is not a UUID is a 400; an asset or bank you cannot see is a 404. A JSON body with an unknown field is a 400.


POST/v1/manual-intake/files

Drop a bank file

Lands one bank file (multipart/form-data) in your tenant's intake folder, where the platform picks it up. 201 when the file landed, 200 with "duplicate": true when the same bytes were already there. replaced is true when a different file with the same name, bank and day was replaced. A deployment without an intake folder configured answers 503 service_unavailable. The request body may be at most 100 MiB (413 otherwise), as on POST /v1/imports.

Form fields

custodian_idstring

Required: the bank.

file_typestring

Required: time_data, balance, holding, transaction, merge, contract, contract_holding, private_asset_holding, custodian_asset_identifier or bond_analytics.

file_datedate

Optional, YYYY-MM-DD; today when left out.

filefile

Required: one file part with a filename.

Response
{
  "duplicate": false,
  "replaced": false,
  "custodian_id": "5b0c3e2a-1f4d-4a6b-9c8e-7d6f5e4a3b21",
  "file_type": "holding",
  "file_date": "2026-10-07",
  "byte_count": 18234
}

POST/v1/manual-intake/custodian-price-imports

Admit a bank's prices

Lets the bank's quoted prices for the asset count as its custodian prices, for the prices the bank sent in the window: the bank joins the asset's custodian price list. Leave custodian_id out to admit every bank with a quote in the window. 200 with what was admitted and what was turned down. No price is copied, so price_id is always null. v1 has no monthly lock on prices, so rejected is always empty (rejected_count: 0).

Body parameters

asset_idstring

Required.

from_date, to_datedate

Required, YYYY-MM-DD; to_date not before from_date.

custodian_idstring

Optional: one bank.

Response
{
  "asset_id": "0b9a8c7d-6e5f-4a3b-2c1d-0e9f8a7b6c5d",
  "from_date": "2026-08-01",
  "to_date": "2026-08-31",
  "custodian_id": "5b0c3e2a-1f4d-4a6b-9c8e-7d6f5e4a3b21",
  "result": {
    "inserted_count": 1,
    "inserted": [
      { "price_id": null, "date": "2026-08-03", "value": "101.5", "currency_code": "DKK", "source": "custodian" }
    ],
    "rejected_count": 0,
    "rejected": []
  }
}

POST/v1/manual-intake/six-price-imports

Read SIX prices

Answers the SIX prices there are for the asset in the window; the platform already reads them where they land, so nothing is stored. A row on a date where the asset already has a manual price in that currency is in rejected with date, value, currency_code, reason already_exists and a detail text; v1 has no monthly lock on prices, so no row is rejected for its date. An asset with no SIX series answers an empty result.

Body parameters

asset_idstring

Required.

from_datedate

Required, YYYY-MM-DD.

to_datedate

Optional, YYYY-MM-DD; today when left out. Not before from_date.

Response
{
  "asset_id": "0b9a8c7d-6e5f-4a3b-2c1d-0e9f8a7b6c5d",
  "from_date": "2026-09-01",
  "to_date": "2026-09-03",
  "result": {
    "available_count": 1,
    "available": [
      { "date": "2026-09-02", "value": "98.12", "currency_code": "CHF", "source": "six" }
    ],
    "rejected_count": 0,
    "rejected": []
  }
}

POST/v1/manual-intake/dividend-imports

Write dividends

Writes the asset's dividend per share on each date; a date that already has a dividend is updated. Only shares and mutual funds carry dividends (400 otherwise). 201 when a dividend was created, 200 when only existing ones were changed or none changed. A date given twice with the same amount counts once; with two amounts it is a 400.

Body parameters

asset_idstring

Required.

dividendsarray

Required, not empty: {date, per_share_amount} with date as YYYY-MM-DD and per_share_amount as a decimal string.

Response
{
  "asset_id": "0b9a8c7d-6e5f-4a3b-2c1d-0e9f8a7b6c5d",
  "written_count": 1,
  "dividends": [
    { "date": "2026-02-18", "per_share_amount": "0.77" }
  ]
}