Sandbox environment. Interpose is not a registered broker-dealer and holds no FINRA approval. Every API documented here is available in a simulated evaluation environment only — no client assets are held, no real trades are executed, and no custody is provided. The calculation engines are the production code paths; fills, custody, settlement and KYC decisioning are simulated. What is real and what is simulated →
The sandbox
The engines are real. So are the prices.
The rebalancing engine, drift calculation, performance math, tax-lot accounting and tax-loss-harvesting logic you exercise here are the production code paths — the actual software, not a walkthrough — and the securities you hold are priced by the real market data feed.
That split is deliberate and it is the point of the environment. You are evaluating whether the numbers are right, and synthetic prices would make that impossible to judge. What is simulated is everything downstream of a trading decision: fills, custody, settlement and identity verification.
What is real and what is simulated
| Capability | Status | Detail |
|---|---|---|
| Rebalancing engine | Real | Production code path — drift triggers, tolerance bands, sleeve and household logic |
| Drift calculation | Real | Multi-dimensional: cash, asset class, sector, risk, factor, sleeve, household |
| Performance (TWR / MWR) | Real | Production calculation engine |
| Tax lots, wash sales, TLH | Real | FIFO/HIFO matching, §1091 wash-sale handling, §1233 short-sale rules |
| Market data | Real | Real securities priced by the live feed, delayed rather than real-time. Your seeded book is invested, so it is marked against real prices from the moment you log in |
| Portfolio models and marketplace | Real | The same model library the product ships with |
| AI intelligence panel | Real | Rebalance, TLH and concentration-risk insights compute live against your book |
| Autonomous AI agents | Off | Agent dispatch skips sandbox events by design — the panel computes, the autonomous layer does not act |
| Order fills | Simulated | Routed to a local FIX 4.2 simulator |
| Custody | Simulated | No assets are held anywhere |
| Settlement | Simulated | No DTCC/NSCC submission occurs from your tenant |
| KYC / identity decisioning | Simulated | Vendor integration in progress; the decision-time figure is a target, not a measurement |
| Money movement (ACH, wires) | Simulated | Funding is a bookkeeping entry |
| Connections to your CRM, notetaker, planning software or mailbox | Off | They would bring real client records into a trial, and none is certified with its vendor yet. They open when you convert |
The boundary is enforced on your tenant, not on the platform
Your tenant's order flow is pinned to the local simulator and to native custody. An account flagged as sandbox cannot dispatch to an external custodian integration, and a request for a correspondent custodian is refused with a 403 naming the constraint — not quietly downgraded. The rule lives in one module every custody-touching path consults, and it keys off the account's own flag — not an environment variable a deploy could flip. Refusing rather than downgrading is a correction. Keeping the requested custodian label while forcing native custody underneath produced accounts labelled DRIVEWEALTH that were not at DriveWealth, and a disclosure screen telling a prospect their SSN had gone to a custodian that never received it.
Precisely: your tenant cannot reach an external custodian. Interpose's own integration testing does run vendor UAT traffic on the same infrastructure, and the isolation between it and your tenant is the same rep-code scoping every firm on the platform runs on.
Your tenant and your seeded book
You are an ordinary advisor to every service on the platform. The alternative — inventing a sandbox role — would have meant auditing roughly 1,265 endpoints across nine services and remembering the new branch in every endpoint written afterwards, which is precisely the shape of failure that produces cross-tenant leaks.
Provisioning creates a book, because an empty tenant demonstrates only that the login works. Read the last row carefully — it is the one that determines what your first few calls return.
| Entity | Count |
|---|---|
| Clients | 20 — 16 advisory clients grouped into households, plus 3 self-directed and 1 in a digital portfolio (managed, no named advisor) |
| Accounts | 43 — two per advisory client, one each for the self-directed and managed clients, one EUR-base, and 6 in aggregated custody at outside custodians |
| Overlay custodians | Schwab, Fidelity and Pershing, or whichever of them you pick at signup (the six accounts split evenly across your choice) — AGGREGATED accounts in the same portfolios as the native book, fed through FILE_IMPORT custodian connections. Feed-latency-bound by design; no order ever routes to them |
| Clients' ages | Your choice of practice at signup: a bit of everything (31–79), pre-retirees and retirees (55–86), or professionals building wealth (28–56). Goals, planning incomes and who owes an RMD follow from age, and every practice keeps one client past RMD age |
| Account types | Rotating — individual, traditional and Roth IRA, joint, trust, custodial (UTMA) |
| Portfolios | 4 — Core Growth, Balanced Income, Conservative Income, Global Diversified; 3 are backed by firm models, one carries direct weights on purpose |
| Firm models | 3 — real PortfolioModel records the portfolios reference, so the models page, the trading desk's by-model grouping and the rebalancing tiles all resolve |
| CRM client records | 20 — one per PERSON, not per account; a two-account client is one row showing their whole book |
| Funding | Drawn per tenant from $72,000 to $5,000,000 (stratified, not laddered) — it straddles the $100K fee-schedule boundary and the $1M/$5M HNW bands |
| Positions | Seeded — the cash is invested by a real rebalancing run, so lots, orders and transactions are the objects a live book holds |
| History | ~3 years, backdated through the real fill path — so lots carry genuine holding periods, and long/short-term, harvestable losses, realised gains in two tax years and a wash sale are all really present |
So /accounts, /portfolios and /positions all return a populated book — and because the trading is backdated, so do performance, realised gains and the tax-lot endpoints. What the history is not is yours; see Current limits.
Trial lifecycle
| State | Meaning |
|---|---|
| PENDING_VERIFICATION | Address submitted, not yet confirmed. Nothing is provisioned. |
| ACTIVE | Tenant exists, login works. 30 days from provisioning. |
| EXPIRED | Login refused. Data is intact. An extension is one update. |
| PURGED | Access revoked across the tenant — see the note below on what this does and does not remove. |
| CONVERTED | You signed. The tenant becomes a live firm. |
Conversion keeps your setup and leaves the demo book. If you go ahead, the firm you explored becomes your live one — its name and branding, your team's logins, the models and strategies you built with their fee schedules, workflow templates and trade parameters. The seeded clients, accounts and three years of history stay behind: they are fictional, and none of it ever becomes a live book. API keys minted during the trial are replaced with new ones. Configuration effort during an evaluation is not wasted.
Reset is authenticated with your own login rather than by email, because an endpoint that re-issued credentials to anyone who knew your address would be a takeover mechanism. Note what it does not do — see Current limits.
Capacity and fair use
This is a small, shared environment. The limits are real and they are published so you can design around them rather than discover them.
| Limit | Value |
|---|---|
| Concurrent active sandbox tenants | 25 platform-wide |
| Accounts per tenant | 100 — exceeding it returns 429. The seeded book uses 43, leaving 57 for your own |
| Trial length | 30 days from provisioning |
| Purge grace after expiry | 15 days |
| API requests | 600/minute per IP (burst 100) |
| Auth requests | 10/minute per IP (burst 5) |
| Signup via the API | Shares the 10/minute auth limit |
| Email domains | Disposable and temp-mail rejected; free-mail accepted |
If signup returns 503 with a JSON body, the platform-wide ceiling is full — email us and we will make room, because that ceiling exists to keep the environment responsive rather than to ration access. A 503 with an HTML body is the edge rate limiter instead; back off and retry.
Sandbox activity never becomes a business figure. Precisely: sandbox portfolios are excluded from billing sweeps (no statement is ever generated — the skip is counted and shown, not silent), sandbox accounts are excluded from GIPS composite membership, sandbox events skip autonomous agent dispatch, and every event a sandbox tenant produces carries an issandbox CloudEvents extension so downstream consumers can filter it. Nothing in a sandbox tenant touches DTCC, a custodian, a transfer agent or a tax form, because none of those integrations are reachable from a sandbox account at all.
Current limits
what is not built yetListed so you do not spend an afternoon proving one of them. We would rather publish this than have you find it one item at a time.
The three years of history are synthetic — proof the engines work, not a track record
The seeder funds 32 accounts and invests them through a real rebalancing run, then backdates roughly three years of trading through the same fill path a live order takes — so lots carry genuine holding periods and the engines classify them the way they will classify a real client's. You get long- and short-term positions, harvestable losses, realised gains in two tax years, a wash sale and a concentrated legacy book without waiting. What it is not is your history: the clients, the trade dates and the sizes are invented, so treat performance and attribution figures as proof the calculation works, not as a track record.
Reset re-issues your password; reseed is what rebuilds the book
Reset changes the credential and restarts the 30-day clock, not the data. For a clean book, call reseed with your own login: it builds a new firm with a fresh cast of clients on the same trial clock and returns a new password, and the old book stops being reachable. Machine credentials minted on the old firm are revoked with it, so mint new ones afterwards. Reseed can run once every ten minutes, and the new book takes a few minutes to fill in — the dashboard shows each stage and says when it is ready. In the portal it is the dashboard's “Rebuild it” link, which can also change the book's practice and custodians and signs you straight into the new build.
Expiry and purge run hourly, so the boundary is approximate
The 30-day and 15-day transitions are performed by a sweep that runs hourly inside the platform, so an expired trial's login can keep working for up to an hour past its expiry. Operators can also run the sweep on demand. Treat the durations as accurate to the hour rather than to the second.
Purge revokes access rather than deleting pillar data
PURGEDmarks the signup purged and deactivates the portal login, rep code, API keys and firm. It does not delete the accounts, portfolios and CRM records held by the pillar services. If you need your data actually removed, emailsupport@interposehq.comand ask for it explicitly; we will do it and confirm.Sandbox webhook delivery is immediate and best-effort by design
Server-Sent Events and WebSocket both work in your tenant and both carry your book only. Webhooks deliver too: your tenant's events POST to registered endpoints, signed with HMAC-SHA256 over
{timestamp}.{body}and markedX-Interpose-Sandbox: trueon every request, with three in-process delivery attempts and a per-webhook attempt log atGET /v1/webhooks/{id}/deliveries. The boundary to know: sandbox delivery is immediate and best-effort (a lost delivery costs a page refresh); a production firm's events go through the durable outbox instead — at-least-once, retries persisted across restarts. The log behind the streams is in-memory and capped at 10,000 events, so it is a live view rather than a replay log — reconcile against REST. Full detail in Events & streaming.Your key works on every pillar, and its permission group is enforced
You can issue your own machine credentials —
POST /api/v1/baas/api-keys/selfwith your portal token, ten active keys per firm — and one key authenticates against every service, not just the one that minted it. Thepermission_groupyou pick is checked on each request, so aread_onlykey is refused a write with a403naming the missing scope. Firm and rep-code scoping still applies underneath and is never widened by a scope; see Authentication.Edge rate limiting returns 503, not 429
The proxy uses its default status and sends no
Retry-After. A client that backs off only on429will hot-loop. The429you will see is application-level — a tenant exceeding its 100-account cap.The SDK base URL differs from the curl base URL
SDKs take
/api/{pillar}; curl takes/api/v1/{pillar}. The clients install from a URL on this domain rather than from PyPI or npm — the commands are on SDKs & tools.