Regulatory Compliance
SEC regulations, accreditation enforcement, and resale restrictions
Liquidity.io LLC is a registered broker-dealer operating under SEC regulations. All secondary trading of private securities requires compliance with the Securities Act of 1933 and applicable state "blue sky" laws.
Reference document: Secondary Private Resale Disclosure and Investor Acknowledgment
Accreditation Enforcement
Primary Market (BUY orders)
Asset accreditationType | Requirement | Verification |
|---|---|---|
506c (Reg D) | Verified accredited ONLY | Simplici third-party verification, accreditationStatus === 'completed' |
506b (Reg D) | Self-certified accredited | Self-certification via Simplici, accreditationStatus === 'completed' |
Retail / null | No accreditation needed | -- |
Code Enforcement Points
All order creation paths are gated:
| Path | Service | File |
|---|---|---|
| Standard orders | exchange.api | src/services/orders/service.ts -- create() |
| Order modifications | exchange.api | src/services/orders/service.ts -- update() |
| Pre-IPO orders | exchange.api | src/services/pre-ipo-orders/service.ts -- create() |
| Bulk orders | exchange.api | Routed through orders.create() |
Fail-closed: If buyer details cannot be fetched, the order is rejected. Per Disclosure 1.2: "the Firm may decline to participate in any transaction if such information is not provided to its satisfaction."
Implementation Detail
// Asset-level accreditation gate (orders/service.ts)
const ACCREDITED_ASSET_TYPES = ['506b', '506c'];
const assetAccrType = assetExists?.accreditationType;
if (assetAccrType && ACCREDITED_ASSET_TYPES.includes(assetAccrType)) {
const buyerDetails = await RegCFBuyerEligibility.fetchBuyerDetails(userId, requestId, req);
const isAccredited =
ACCREDITED_ASSET_TYPES.includes(buyerDetails?.accreditationType ?? '') &&
buyerDetails?.accreditationStatus === 'completed';
if (!isAccredited) {
return new BadRequest(
`This asset requires ${assetAccrType} accreditation.`
);
}
}Resale Restrictions
Default 12-Month Hold
Securities issued under Reg D and Reg CF are subject to a 12-month holding period.
Enforced via restriction_end_date on sell order lots (FIFO tracking).
Resale Exemptions
| Regulation | Exemption | Status |
|---|---|---|
| Reg D 506(b/c) | Unsolicited sale to accredited investors within 1 year | Enforced -- restricted lots require accredited buyer |
| Reg CF | Non-accredited can sell to accredited within 1 year | Enforced -- isRestrictedOrder=true requires accredited buyer |
| Reg CF | Family member exemption (estate, gift, divorce) | Not yet implemented |
| Reg S | Free trading among non-US investors | Not yet implemented -- no geofencing |
| Reg S | Block US investor purchases during 1-year distribution | Not yet implemented -- no geofencing |
RegCF Investment Limits
Non-accredited investors are subject to SEC Reg CF investment caps:
- Maximum of the greater of $2,500 or 5% of annual income/net worth
- Accredited investors have no investment limit
- Enforced via
RegCFBuyerEligibility.checkInvestmentLimit()
Disclosure Requirements
Currently Enforced
- Accredited investor verification at each transaction (Disclosure 1.1)
- Fail-closed on verification failure (Disclosure 1.2)
- Transfer restriction enforcement via restriction dates (Disclosure 2.2)
- Portfolio ownership validation for sellers (Disclosure 9.1)
Future Implementation Needed
- Signed disclosure acknowledgment before each secondary trade (Disclosure 11.1)
- ROFR / issuer consent check at order creation time (Disclosure 5.2)
- Reg S geofencing -- US vs non-US investor determination
- Investor sophistication assessment beyond KYC
Bug History
Accreditation Bypass (Fixed 2026-03-18)
- Root cause: Check only ran for RegCF offering type; RegD 506b/506c assets unguarded
- Fix: Independent asset-level gate on all offering types
- PRs: #2862 (dev), #2863+#2865 (alpha), #2864+#2866 (next)
Dividend Mislabeling (Fixed 2026-03-18)
- Root cause: Disbursements used fortress
ledger(INTERNAL) instead ofdisbursement-ledger(DISBURSEMENT) - Fix: Route through
disbursement-ledgerwithDISBURSEMENT_TRANSFERsignal
Pre-IPO Bypass (Fixed 2026-03-18)
- Root cause: pre-ipo-orders endpoint had zero accreditation validation
- Fix: Added same accreditation gate before Order.create()
E2E Test Coverage
| Test | File | What it validates |
|---|---|---|
| Accreditation gate (API) | universe/e2e/23-accreditation-guard.spec.ts | Unaccredited BUY on 506b/506c -- rejected |
| Pre-IPO gate (API) | Same file | Unaccredited pre-IPO BUY -- rejected |
| Dividend labels (API) | universe/e2e/24-dividend-labels.spec.ts | No INTERNAL transactions with DISBURSEMENT metadata |
| Dividend labels (UI) | Same file | Wallet shows "Dividend" label |
Run:
E2E_BASE_URL=https://exchange.next.satschel.com npx playwright test e2e/23 e2e/24