Subscriptions (Buy Orders)
Build the order ticket, submit a dollar-denominated Buy order, interpret the response, and track the order through to settlement.
A subscription into an evergreen fund is a Buy order for one account. Buy orders are placed in dollars. The number of shares the account receives is determined later, when the fund strikes the NAV that the order fills at.
This guide covers the single-account order flow used by self-directed platforms and by advisors placing one order at a time. To invest many accounts in one submission, see Model Orders.
Endpoints used
| Method | Endpoint | Purpose |
|---|---|---|
POST | /primary/v1/omnibus/order | Submit an order |
GET | /primary/v1/omnibus/order/{id} | Retrieve an order, with its fills and settlement items |
GET | /primary/v1/omnibus/order | List orders |
PUT | /primary/v1/omnibus/order/{id} | Request a change to an open order |
POST | /primary/v1/omnibus/order/{id}/cancel | Request cancellation of an open order |
GET | /primary/v1/omnibus/order-action/order/{orderId} | List the actions outstanding on an order |
PUT | /primary/v1/omnibus/order-action/{id}/complete | Complete one order action |
PUT | /primary/v1/omnibus/order-action/order/{orderId}/complete-all | Complete every action on an order |
Before you begin
- The account exists and is eligible for the fund. See Accounts & Eligibility.
- The user has chosen a share class. See Fund Detail.
- Requirements for this account, advisor, fund, share class, and side evaluate to
allSatisfied: true. See Pre-Order Requirements.
Workflow
- Collect the amount and elections on an order ticket, and validate the amount against the share class minimums.
- Confirm that pre-order requirements are satisfied.
- Show a review step that restates exactly what will be submitted.
- Submit the order with a unique
referenceId. AnIdempotencyKeyheader is optional. - Branch on the
statusof the response: confirm, collect outstanding actions, or show the rejection. - Track the order until it settles.
Order ticket
| UI element | Source | Notes |
|---|---|---|
| Fund | Fund.name | |
| Share class | ShareClass.symbol, falling back to ShareClass.series | Becomes omnibusShareClassId. |
| Amount | User input | Becomes notionalAmount. Dollars, up to 2 decimal places. |
| Distributions | User choice | Becomes distributionElection: Cash or Drip. |
| Tax lot method | User choice | Becomes taxLotElection: FIFO, LIFO, HCFO, or LCFO. |
| Current NAV | Most recent NAVReport.nav for the share class | Show its reportDate. |
| Minimum | ShareClass.initialMinimumInvestment or ShareClass.subsequentMinimumInvestment | See Validate the amount, below. |
| Estimated shares | (Amount − any order fee) ÷ current NAV | An estimate only. |
Distribution election. Cash pays the fund's distributions out in cash. Drip reinvests them into additional shares. The election is part of the identity of the resulting position: an account that holds the same share class under both elections has two separate positions.
Tax lot election. This sets the order in which tax lots are relieved when shares are later sold. See Redemptions (Sell Orders) for what each method means. Platforms that apply a firm-wide or account-level default can set it without asking the user.
Validate the amount
| Situation | Rule |
|---|---|
| The account holds no position in the share class | Amount ≥ initialMinimumInvestment |
| The account already holds the share class | Amount ≥ subsequentMinimumInvestment |
| The applicable minimum is null | No minimum applies |
Check for an existing holding with GET /primary/v1/omnibus/positions?accountId={accountId}&omnibusShareClassId={shareClassId}.
Review step
Restate the order before the user commits to it: fund, share class, account, amount, distribution election, and tax lot method. Repeat the share estimate, labelled as an estimate, and remind the user of the fund's subscription and redemption schedule.
Submit the order
POST /primary/v1/omnibus/order
IdempotencyKey: 6f1c1a0e-7d1b-4f57-9d0a-2f3b8a1c9e44
{
"referenceId": "ORD-2026-000184",
"accountId": "b2d4e6f8-0000-4000-8000-000000000021",
"financialAdvisorId": "c3e5a7b9-0000-4000-8000-000000000031",
"omnibusFundId": "d4f6b8c0-0000-4000-8000-0000000000f1",
"omnibusShareClassId": "e5a7c9d1-0000-4000-8000-0000000000c1",
"side": "Buy",
"notionalAmount": 25000,
"currency": "USD",
"distributionElection": "Drip",
"taxLotElection": "FIFO"
}| Field | Required | Description |
|---|---|---|
referenceId | Yes | Your identifier for the order. Must be unique per partner. |
accountId | Yes | The account the order is placed for. |
omnibusFundId | Yes | The fund being traded. |
omnibusShareClassId | Yes | The share class being traded. Must belong to the fund. |
side | Yes | Buy. |
notionalAmount | Yes, for Buy | The dollar amount. Omit quantity on a Buy order. |
distributionElection | Yes | Cash or Drip. |
taxLotElection | Yes | FIFO, LIFO, HCFO, or LCFO. |
currency | No | USD is the only supported currency. |
financialAdvisorId | Conditional | The advisor placing the order. Must match the advisor used to evaluate requirements. |
modelId | No | Your identifier for the model or rebalance that produced the order. |
routeInstruction | No | TransferAgent (the default) or IntraCustodianNetting. See Route to the netting queue, below. |
unnettedOrderRoute, nettingTif, nettingTifDate | No | Netting orders only. Sending them on a TransferAgent order, or without a routeInstruction, returns 400. |
A referenceId that you can trace back to your own order management system makes reconciliation straightforward: you can look an order up with GET /primary/v1/omnibus/order?referenceId={referenceId} even if you never received the response to the original request.
Route to the netting queue
Send routeInstruction: IntraCustodianNetting to net the order against opposite orders from the same custodian, in the same fund, share class and distribution election, at the fund's NAV. Monark enables netting for each custodian, fund and share class. Where it isn't enabled, the order is rejected with OrderNettingCapabilityMissing rather than sent to the transfer agent. The older values OrderNetting and DirectToTa are still accepted and are returned as sent, and CrossCustodianNetting is not yet supported.
{
"routeInstruction": "IntraCustodianNetting",
"unnettedOrderRoute": "Cancel",
"nettingTif": "EOM"
}| Field | Values | Rules |
|---|---|---|
unnettedOrderRoute | TransferAgent (default) or Cancel | What happens to any part of the order that is not netted. TransferAgent sends it to the transfer agent at Monark's next cutoff, at its fee-net amount with no second fee. Cancel cancels it at the order's netting deadline. |
nettingTif | Cutoff (default), EOD, EOM, EOQ, or Custom | The netting deadline. Anything other than Cutoff requires unnettedOrderRoute: Cancel. EOD nets until today's session, and EOM and EOQ until the last business day of the month or quarter, never later than Monark's next cutoff. EOD must be sent on a business day, and an EOD order sent after that day's netting order cutoff is cancelled without netting. EOD, EOM, EOQ and a Custom date need a netting schedule for the share class, or the order is rejected with InvalidNettingInstructions. |
nettingTifDate | A date | Custom only. Moved back to a business day if needed, and must not be in the past. Without it, Custom nets until Monark's cutoff. |
A netting order can fill in part, across several daily netting sessions, and against several other orders. Each fill is priced at that day's NAV for a daily-NAV fund, or at the last published NAV for a monthly-NAV fund, and creates its own tax lot. A netting order can be changed or cancelled only while it is PendingActions. One with no outstanding actions goes straight to the netting queue and can't be changed or cancelled, so use unnettedOrderRoute: Cancel and a nettingTif to limit how long it waits. See the Omnibus Product Flow Overview for how netting sessions work.
Interpret the response
{
"id": "0ed24676-0000-4000-8000-0000000000e1",
"externalId": "01a0b58aa55207f9d70f",
"referenceId": "ORD-2026-000184",
"status": "Received",
"submittedAtUtc": "2026-09-18T17:22:37.516Z",
"requestedRouteInstruction": null,
"routeInstruction": "TransferAgent",
"statusReasonCode": null,
"message": null,
"fieldErrors": []
}The create endpoint returns this body for 201, 403, 404, 409 and 503. Request-validation 400s return a validation problem with an errors map instead. Branch on status first. requestedRouteInstruction is the route you sent, or null if you omitted it, and routeInstruction is the route Monark applied. fieldErrors is currently always empty.
status | Meaning | What to show |
|---|---|---|
Received | The order was created and submitted. It moves to PendingExecution when OmnibusOrderAccepted arrives. | A confirmation, with the order id, your referenceId, and the fund's subscription schedule. |
PendingActions | The order exists, but actions are outstanding. | The outstanding actions. See Complete order actions, below. |
Rejected | The order was refused. | message, in place, with the ticket still editable. |
Failed | The order could not be handed to settlement (503, SettlementPublishFailed). | message. Do not resubmit automatically: look the order up by referenceId, then resubmit with a new referenceId. |
Other statuses can be returned. Treat any status you do not recognise as "submitted, pending confirmation" and rely on order tracking.
A rejected order:
{
"id": "0ed24676-0000-4000-8000-0000000000e2",
"referenceId": "ORD-2026-000184",
"status": "Rejected",
"statusReasonCode": "FinancialInstitutionFundAccessDenied",
"message": "The investor's financial institution does not have access to the omnibus fund.",
"fieldErrors": []
}Important: A rejection can be returned with HTTP
201. Do not treat a2xxresponse as an accepted order. Orders rejected with201are retained, and are returned by the order endpoints with astatusofRejected. Rejections returned with a4xxcode are not stored. Neither sends a webhook.
Complete order actions
An order returned as PendingActions is not processed until its actions are complete. This is uncommon when pre-order requirements were satisfied first, but your integration should handle it.
- List the actions with
GET /primary/v1/omnibus/order-action/order/{orderId}. - Present each action whose
statusisPending. Order actions carry the samename,type,responsibleParty,actionText,markdownText, anddataIdfields as pre-order requirements, so you can reuse the same components. - Complete each one with
PUT /primary/v1/omnibus/order-action/{id}/complete. Each call returns204 No Content. For aQuestionnaireaction, submit the answers first (see Pre-Order Requirements), then call complete. Completing an action that is notPendingreturns400.
When every action is Complete, the order moves to Received and is submitted, and any order fee is recalculated at that point. It becomes PendingExecution when OmnibusOrderAccepted arrives. PUT /primary/v1/omnibus/order-action/order/{orderId}/complete-all completes every action in one call. Use it only where the user has reviewed every action.
Track the order
GET /primary/v1/omnibus/order/{id}
| UI element | Source | Notes |
|---|---|---|
| Status | Order.status | See the order lifecycle in the Integration Overview. |
| Amount ordered | Order.notionalAmount | |
| Amount filled | Order.filledNotionalAmount, Order.filledQuantity | Populated as the order fills in the netting queue, or when the transfer agent confirms the trade at settlement. |
| Amount remaining | Order.remainingNotionalAmount | Amount still to be invested, net of fees. Starts at effectiveNotionalAmount. |
| Fees | Order.feeAmount, Order.effectiveNotionalAmount | The dollar fee on the order, and the amount used to purchase shares. |
| Execution price | Order.fills[].executionPrice, Order.fills[].tradeDate | The NAV the order filled at. A netting order can have several fills. For a netting fill on a monthly-NAV fund, this is the last published NAV, which can be dated before tradeDate. |
| Fill source | Order.fills[].source | OrderNetting for a fill in the netting queue, whose status is Executed, or SettlementService for a fill confirmed by the transfer agent. |
| Settled | Order.settledNotionalAmount, Order.settledQuantity | Includes fills in the netting queue. |
| Rejection reason | Order.statusReasonCode, Order.rejectedStatusReasonMessage |
An order appears in the account's positions only after it reaches Settled, except that each fill in the netting queue updates the position as it happens. Until then, show it as an open order. See Portfolio & Positions.
Note: Funding for a subscription moves through the account's custodian, which wires the amount after Monark's cutoff. If the custodian is in the MMM Securities master omnibus, it wires MMM Securities, Monark's broker-dealer subsidiary, which forwards the cash to the fund's transfer agent. Otherwise it wires the transfer agent directly, and Monark does not hold or move the cash. Keep the cash available at the custodian until the order settles. See Custody Models.
Status notifications
Orders change state after the create response is returned - when they are accepted, sent to the transfer agent, and settled. Subscribe to order webhooks instead of polling, and use GET /primary/v1/omnibus/order/{id} to reconcile. See Webhooks for how to register an endpoint and handle each event.
| Event | Sent when |
|---|---|
OmnibusOrderCreated | The order is created. Can arrive while the order is still PendingActions. |
OmnibusOrderAccepted | The order is accepted for execution. Status becomes PendingExecution. |
OmnibusOrderRejected | The order is rejected after it was created, for example by the transfer agent. Status becomes Rejected, with reason fields populated. Rejections returned in the create response do not send this event. |
OmnibusOrderSent | The order has been sent to the transfer agent. Status becomes Executed. It can no longer be cancelled. |
OmnibusOrderPartiallyFilled | Retired and never sent. Fills in the netting queue don't send an event of their own, so read them with GET /primary/v1/omnibus/order/{id}. |
OmnibusOrderSettled | The transfer agent has confirmed the order. Fills and tax lots are recorded. Also sent when a netting order with unnettedOrderRoute: Cancel reaches its deadline part-filled. Not sent when an order fills completely in the netting queue: it moves to Settled silently, so read it with GET. |
OmnibusOrderFailed | The order failed in processing. Status becomes Failed. |
OmnibusOrderUpdated, OmnibusOrderUpdateRejected | An update request was applied, or refused. |
OmnibusOrderCancelled, OmnibusOrderCancelRejected | A cancellation request was applied, or refused. OmnibusOrderCancelled is also sent when a netting order with unnettedOrderRoute: Cancel reaches its deadline with nothing filled. |
Each event carries the current order, in the same shape as the order endpoint returns.
Update or cancel
An order can be changed or cancelled until Monark's cutoff for the fund's next dealing date. An order routed to the netting queue can be changed or cancelled only while it is PendingActions; an order with no outstanding actions goes straight to the netting queue. Otherwise, requests are refused with 409 and OrderNettingUpdateUnsupported or OrderNettingCancellationUnsupported.
PUT /primary/v1/omnibus/order/{id}
{
"notionalAmount": 30000,
"reason": "Client increased allocation"
}POST /primary/v1/omnibus/order/{id}/cancel
Both are requests that are processed asynchronously. The response tells you whether the request was taken, not whether the order has changed:
{
"cancelRequestId": "4b7a1d90-0000-4000-8000-0000000000b1",
"orderId": "0ed24676-0000-4000-8000-0000000000e1",
"status": "Pending",
"reasonCode": null,
"message": null,
"createdAtUtc": "2026-09-18T18:02:11.000Z",
"updatedAtUtc": "2026-09-18T18:02:11.000Z"
}Request status | Meaning |
|---|---|
Accepted | The request was applied. |
Pending | The request is being processed. The order has not changed yet. |
Rejected | The request was refused. See reasonCode and message. |
After a Pending response, wait for the OmnibusOrderCancelled or OmnibusOrderUpdated event, or retrieve the order again, before you tell the user the change is done. Orders that belong to a Model Order are cancelled through the Model Order. See Model Orders.
Handling errors
| HTTP | statusReasonCode | Cause | What to do |
|---|---|---|---|
201 | FinancialInstitutionFundAccessDenied | The account's custodian is not enabled for the fund. status is Rejected. | Remove the fund for accounts at that custodian, or contact Monark. |
201 | FinancialAdvisorInvalid | The advisor is at a different custodian from the account. status is Rejected. | Correct the advisor ID. |
201 | OrderNettingCapabilityMissing | The order was routed to the netting queue, but netting isn't enabled for this custodian, fund, and share class. status is Rejected. | Resubmit with routeInstruction: TransferAgent, or contact Monark. |
201 | InvalidNettingInstructions | The netting deadline can't be set, for example a nettingTifDate in the past. status is Rejected. | Choose a different nettingTif or date. |
400 | AccountInvalid | The account cannot trade - for example, an entity account with no active individual. | Complete the account setup. See Accounts & Eligibility. |
403 | AccountAccreditationInvalid | The account's accreditation is missing, more than 12 months old, or NOT_APPLICABLE. | Update the accreditation. See Accounts & Eligibility. |
404 | FinancialAdvisorNotFound | The financialAdvisorId does not exist. | Correct the advisor ID. |
201 | - | status is PendingActions: requirements were outstanding when the order was submitted. | Complete the order's actions. See Complete order actions, above. |
409 | DuplicateReferenceId | The referenceId has already been used. | Retrieve the original order by referenceId instead of resubmitting. |
409 | AccountInvalid | The account is closed. | Choose an active account. |
400 | - | Validation failed. The body is a validation problem whose errors map lists the messages for each field. | Highlight the fields, and show each message. |
The reason codes above are the most common. The set is not exhaustive, so display message for any code that you do not handle explicitly. Branch on the reason code, not only on the HTTP status. See Errors & Reason Codes for the full list.
Next steps
- Show the order in the account's portfolio: Portfolio & Positions
- Submit orders for many accounts at once: Model Orders
Updated 27 days ago