Integration Overview

What a distribution platform builds on Monark's Omnibus platform, the order in which to build it, and the conventions that apply to every call.

Monark's Omnibus platform enables distribution and model portfolio platforms to programatically trade evergreen funds: interval funds, tender offer funds, non-traded REITs, and non-traded BDCs. Your platform owns the investor and advisor experience, and your clients' accounts are held with their custodians. Monark supplies the fund catalogue, evaluates each fund's disclosure and suitability requirements, accepts orders, and maintains positions and distributions for every account.

These guides walk through each surface of a typical integration in the order you would build it. Every guide lists the endpoints it uses, maps API fields to UI elements, and shows a reference implementation.

What You Will Build

SurfaceWhat the user doesGuide
AccountsSelects the client account to invest forAccounts & Eligibility
MarketplaceBrowses, searches, and filters the fund catalogueFund Marketplace
Fund detailReviews terms, share classes, NAV, fees, and documentsFund Detail
RequirementsCompletes disclosures, e-signatures, and questionnairesPre-Order Requirements
SubscriptionInvests a dollar amount into a share classSubscriptions (Buy Orders)
Model ordersAllocates many accounts to a fund in one submissionModel Orders
RebalancingRebalances model portfolios that hold evergreen fundsRebalancing Guide
RedemptionSells shares out of a positionRedemptions (Sell Orders)
PortfolioTracks positions, orders, and distributionsPortfolio & Positions

How an Investment Flows

  1. Identify the account. Every order is placed for an accountId. Create the account and its owners once, then reuse it.
  2. Present the catalogue. List the available funds, with the entry minimum of each.
  3. Present the fund. Show terms, liquidity, share classes, NAV history, fees, and documents so the user can make an informed decision.
  4. Evaluate requirements. Ask Monark which disclosures, signatures, and questionnaires apply to this account, advisor, fund, share class, and side.
  5. Complete requirements. Collect each acknowledgement or answer in your UI and report it to Monark.
  6. Submit the order. Send a Buy order in dollars, or a Sell order in shares. Inspect the status of the response.
  7. Track to settlement. Follow the order until it reaches Settled, at which point it is reflected in the account's positions.

Model portfolio platforms follow the same sequence, but evaluate requirements and submit orders for many accounts at once. See Model Orders and the Rebalancing Guide.

Before You Begin

RequirementDetail
API keyKeys are issued per environment. See Getting Started.
CustodiansEach client account is held at a custodian that Monark sets up for your platform as a Financial Institution. Its financialInstitutionId is required when you create persons, entities, accounts, and model orders, and it filters order and position queries. List yours with Get all Financial Institutions.
Fund entitlementsFunds are enabled per custodian. An order for a fund that the account's custodian is not enabled for is rejected with FinancialInstitutionFundAccessDenied. Contact Monark to enable funds.
AccountsEach investing client needs an account with its owners and a current accreditation. See Accounts & Eligibility.
AdvisorsAdvisor-led platforms need a financialAdvisorId for each advisor who places orders. See Create a Financial Advisor.

Environments & Conventions

Omnibus is a JSON REST API. Fund, order and position endpoints sit under /primary/v1/omnibus, and account, document and webhook endpoints are shared with Monark's other products.

ItemDetail
Sandboxhttps://sandbox-api.monark-markets.com
ProductionBase URL provided by Monark at go-live
AuthenticationAPI key in the Authorization header on every request. Request one at [email protected]
VersionGET /primary/v1/version. These guides reflect API version 1.5.26. Order netting requires API version 1.6.0 or later
FormatsJSON. Timestamps are UTC (fields ending in AtUtc), amounts are USD
ErrorsOrder endpoints return status, statusReasonCode and message in their own response body. Validation failures return 400 with an errors map keyed by field. Other errors return problem details with status and detail. See Errors & Reason Codes

Pagination. List endpoints accept page (default 1) and pageSize (default 25, maximum 1000), and return an items array alongside a pagination object:

{
  "items": [],
  "pagination": { "totalRecords": 65, "totalPages": 3, "currentPage": 1 }
}

Duplicate protection. Every order and model order needs a referenceId that is unique across your platform. Resubmitting a referenceId that has already been used is refused with 409 (DuplicateReferenceId), so retrying a timed-out request with the same referenceId can never create a second order. The later model order steps are just as safe to retry: a batch of lines that was already added is refused with DuplicateOrderReferenceId, and a model order that was already completed with ModelOrderNotDraft. POST requests also accept an optional IdempotencyKey header, valid for 24 hours, but it is best-effort. Rely on referenceId.

Webhooks. Order, funding and distribution events are delivered by webhook, so your platform does not need to poll for status changes. See Webhooks.

Units. Buy orders are denominated in dollars (notionalAmount, up to 2 decimal places). Sell orders are denominated in shares (quantity, up to 6 decimal places). Only USD is supported.

Enumerations. Send enum values exactly as documented: Buy and Sell, Cash and Drip, and FIFO, LIFO, HCFO, or LCFO. Responses always use these spellings.

Identifiers

FieldSet onPurpose
idEvery objectMonark's identifier. Use it in request paths. Orders and model orders also carry an externalId
referenceIdPersons, orders, model orders, and each model order lineYour identifier for the record. Order and model order references must be unique across your platform
externalAccountNumberAccountsThe custodian's account number for the client. Stored trimmed and upper-cased, unique per custodian, and returned on every order for the account
modelIdOrders and model ordersYour identifier for the model or rebalance that produced the order

Data Model

Every client account belongs to one custodian, which the API calls a Financial Institution. Orders, positions and dividends all hang off the account.

flowchart LR
    P[Partner] --> FI[Financial Institution<br/>custodian]
    FI --> A[Account]
    A --> OW[Person or Entity<br/>owners]
    A --> ORD[Order]
    MO[Model order] --> ORD
    ORD --> SC[Share class]
    F[Fund] --> SC
    F --> FEE[Fee structure]
    SC --> NAV[NAV report]
    A --> POS[Position]
    POS --> LOT[Lot]
    LOT --> DIV[Dividend]

Arrows point from parent to child. A model order's lines become individual orders, one per client account.

ObjectEndpointNotes
Financial Institution/primary/v1/financial-institutionOne per custodian, set up by Monark, which also sets the custodian's custody model for each fund and share class. You can add your own reference with PUT /primary/v1/financial-institution/reference
Person, Entity/primary/v2/person, /primary/v2/entityAccount owners, with identity and tax details
Account/primary/v2/accountBelongs to one Financial Institution. Carries registration type and accreditation, which every account needs before it can order
Financial advisor/primary/v1/financial-advisorThe advisor acting for the account, where there is one. Requirements are evaluated for the account and advisor together
Fund, Share class/primary/v1/omnibus/fund, /primary/v1/omnibus/share-classRead only. A fund carries terms, liquidity cadence and investor eligibility; a share class is what orders trade, with its own minimums, NAV and fees. Add includeDocuments=true to a fund request for its prospectus, fact card and other documents, or use GET /primary/v2/document?omnibusFundId=<fund id>
NAV report, Fee structure/primary/v1/omnibus/nav-report, /primary/v1/omnibus/fee-structureRead only. Each fee belongs to either a fund or a share class
Order action/primary/v1/omnibus/order-actionDisclosures, acknowledgements, e-signatures and questionnaires checked before an order is created, and actions attached after
Order, Model order/primary/v1/omnibus/order, /primary/v1/omnibus/model-orderAn order is a single Buy or Sell for one account. A model order groups one order per account, all for the same fund, share class and side. Each order carries its fills and settlement items
Position, Lot/primary/v1/omnibus/positionsOne position per account, share class and distribution election. Add includeLots=true for lots
Dividend/primary/v1/omnibus/dividendsOne row per lot per distribution

Order Lifecycle

StatusMeaningTerminal
DraftA model order that is still taking lines (model orders only). A draft that is not completed by 1:00 AM Eastern is cancelled with DraftExpired.No
ProcessingA completed model order that Monark is checking. It moves to Received, or to Rejected or Failed, and a webhook is sent (model orders only).No
ReceivedThe order passed Monark's checks and was recorded. It has not yet been accepted for execution.No
PendingActionsThe order exists, but order actions must be completed before it is processed (individual orders only).No
PendingExecutionThe order was accepted for execution and is waiting for Monark's cutoff or the netting queue. A partly netted order stays here until its remainder goes to the transfer agent or expires.No
ExecutedThe order has been sent to the transfer agent and is awaiting its confirmation. Nothing more is filled until then, though a netting order may already have netting fills.No
SettledThe transfer agent has confirmed the order, or it was filled in the netting queue. Fills are recorded and the order is reflected in positions. A gated redemption, or a netting order whose remainder expired, can settle with a remaining amount.Yes
CancelledThe order was cancelled before Monark's cutoff, or it was a netting order that reached its deadline with nothing filled.Yes
RejectedThe order was refused, either at submission or later by the transfer agent. See statusReasonCode.Yes
FailedThe order could not be processed. See statusReasonCode.Yes

Important: An HTTP 201 from an order endpoint means the request was processed, not that the order was accepted. A refused order can be returned as 201 with a status of Rejected. Always branch on status, and show the returned message to the user.

When you're ready to go live, work through the Go-Live Checklist.


Did this page help you?