Submit an Order
Create the transaction that commits an investor's dollars to an SPV, and handle every rule that can refuse it.
Integrating through Apex AscendOS?The product guidance on this page applies to you. The endpoints, fields and statuses are Monark's; use the AscendOS equivalents listed in Building on Apex AscendOS.
A subscription to an SPV is created as a transaction. This page covers the request, the rules that govern it, and the refusals your UI has to explain.
Creating the transaction is not the commitment. The investor is not bound until every required action is complete — see Transaction Actions.
Monark endpoints used
| Method | Endpoint | Purpose |
|---|---|---|
POST | /primary/v2/transaction | Create the subscription |
GET | /primary/v2/transaction/{id} | Read it back |
GET | /primary/v2/transaction/investor/{investorId} | List an investor's transactions |
POST | /primary/v2/transaction/{id}/reject | Cancel, while it is still Pending |
Before you submit
Two responsibilities sit with your platform, because Monark cannot see either of them:
- Check the cash and reserve it. Confirm the investor's balance covers the amount, and lock or debit it so the subscription is funded when the SPV closes. Monark never holds investor cash.
- Check eligibility. Regulation D offerings are for accredited investors. A Regulation S offering excludes US investors. Filter at the point of presentation, not at the point of order.
Create the transaction
POST /primary/v2/transaction{
"targetAssetType": "PreIPOCompanySPV",
"targetId": "0194f0a1-0000-7000-8000-00000000001f",
"side": "Subscription",
"investorId": "0194f1a0-0000-7000-8000-000000000007",
"amountReservedDollars": 25000,
"referenceId": "ord_8f21c40a"
}Send an IdempotencyKey header. Keys are cached for 24 hours, so a retry after a timeout returns the original response instead of creating a second subscription.
Expect 201. The response is the Transaction; its id is what the rest of the flow keys on, and its status will be Pending.
Request fields
| Field | Required | Notes |
|---|---|---|
targetAssetType | Yes | PreIPOCompanySPV for an SPV subscription |
targetId | Yes | The SPV's id |
side | Yes | Subscription. Case-sensitive — not SUBSCRIPTION |
investorId or accountId | Yes | Exactly one. Sending both, or neither, is refused |
amountReservedDollars | Yes | Dollars, greater than zero, at most 2 decimal places |
referenceId | No | Your own order identifier. Maximum 100 characters, and filterable on reads |
externalAccountNumber | No | Your account number. Valid only alongside investorId |
financialAdvisorId | No | The advisor on the transaction, where there is one |
Note: An SPV transaction can only ever be a
Subscription.RedemptionandTransferare supported for registered funds, not for SPVs.
Which identity to send
Send accountId when the investor holds more than one account — otherwise the request is refused with "The investor has multiple accounts. Supply AccountId through the v2 endpoint." For a single-account investor either works.
Joint and retirement accounts cannot subscribe to an SPV at all. Filter them out of the private markets experience rather than surfacing a refusal at the order form.
The amount rules
Three rules govern the amount, and each returns a message worth showing the investor verbatim.
| Rule | Refusal |
|---|---|
| At least the minimum | Investment amount is lower than the minimum commitment amount. Min amount - {min} |
| Not more than what remains | Investment amount is greater than the remaining dollar allocation. Remaining - {remaining} |
| Seats available | No seats remaining for the SPV. |
The exception worth building for. When less than the minimum is left in the raise, the minimum no longer applies — but the last investor must take exactly what remains:
if (remainingDollarAllocation < minCommitmentAmount) {
amount must === remainingDollarAllocation
} else {
amount >= minCommitmentAmount && amount <= remainingDollarAllocation
}Getting this wrong means the last slice of every raise is unsellable through your platform. Validate it client-side from minCommitmentAmount and remainingDollarAllocation on the SPV, and pre-fill the exact remainder when the condition holds.
The seat limit is the 99-investors-per-SPV cap that US private fund rules impose. An SPV can be seat-closed while dollars remain, so remainingDollarAllocation > 0 does not mean investable. numberOfSeatsRemaining lets you anticipate it; treat the response as authoritative and present a seat-closed SPV as closed rather than as an error.
Estimating shares
Divide the amount by the SPV's allInPricePerShare. That is the price the subscription fills at, and it already includes the one-time management fee and the pro-rata share of the per-SPV admin expense.
Label it as an estimate. SPV interests are fractional, so there is no rounding to a whole share, but the final allocation is Monark's to compute.
Everything that can refuse the request
Checked in this order. The first failure is returned.
| # | Check | Refusal |
|---|---|---|
| 1 | The SPV exists | Failed to create Investor Subscription as the SPV does not exist |
| 2 | The investor exists and is yours | Failed to create Investor Subscription as the investor doesnt exist |
| 3 | Registration type is supported | {type} investors are not supported for PreIPO SPV subscriptions. |
| 4 | The account resolves | Account not found. / The investor does not have an account. / The investor has multiple accounts. Supply AccountId through the v2 endpoint. / The account is closed. |
| 5 | The advisor is valid for the investor | varies |
| 6 | The investor is active and accredited | Investor is not active / Accreditation not set / Accreditation has expired / Investor is not accredited |
| 7 | Regulation S and a US investor | Cannot create subscription as the SPV is exempt from accredited investor requirements and the investor is US based |
| 8 | Accreditation valid for the registration | … the accreditation status of the investor is not valid … |
| 9 | Your platform has approved the SPV | Failed to create Investor Subscription as the Partner has not approved this SPV |
| 10 | The investor's institution has access | … the FinancialInstitution not permitted access to SPV |
| 11 | No existing live subscription | Active subscription already exists for this SPV and Investor (409) |
| 12 | Stage, amount, minimum, seats | The subscription was not valid as … |
| 13 | The SPV has a price | Cannot create subscription as Spv does not have an AllInPricePerShare set |
Important: Check 11 catches most integrations out. One live subscription per investor per SPV. To change an amount, update or cancel the existing transaction — do not create a second one.
There are no machine-readable reason codes on these responses. The HTTP status and the detail string are what you have, which is why the strings above are quoted exactly.
Cancelling
POST /primary/v2/transaction/{id}/reject?targetAssetType=PreIPOCompanySPVA partner can cancel only while the transaction is Pending. Once it reaches Processing the commitment is binding and only Monark can reverse it — a partner attempt is refused with "Cannot reject subscription in Processing state".
Tell the investor this before they complete their final action, not after. The moment of no return is the last acknowledgement, and it does not look like one.
The SPV must also still be in PRIMARY_FUNDRAISE or PRE_CLOSE_REVIEW for a cancellation to be accepted.
After creation
A Pending transaction reserves nothing. Allocation and seats are consumed at Processing, not at creation, so two investors can both hold pending orders that together exceed what is left. The race resolves when each is signed, and the loser fails.
That is why a subscription accepted at creation can still be refused later. Handle the late failure: the transaction lands in Failed, and the cash you reserved has to be released.
Follow the transaction by webhook rather than polling. See Webhooks.
Next steps
- Complete the required actions: Transaction Actions
- Every status the transaction can reach: Transactions
Updated 12 days ago