InterposeInvest

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 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

CapabilityStatusDetail
Rebalancing engineRealProduction code path — drift triggers, tolerance bands, sleeve and household logic
Drift calculationRealMulti-dimensional: cash, asset class, sector, risk, factor, sleeve, household
Performance (TWR / MWR)RealProduction calculation engine
Tax lots, wash sales, TLHRealFIFO/HIFO matching, §1091 wash-sale handling, §1233 short-sale rules
Market dataRealReal 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 marketplaceRealThe same model library the product ships with
AI intelligence panelRealRebalance, TLH and concentration-risk insights compute live against your book
Autonomous AI agentsOffAgent dispatch skips sandbox events by design — the panel computes, the autonomous layer does not act
Order fillsSimulatedRouted to a local FIX 4.2 simulator
CustodySimulatedNo assets are held anywhere
SettlementSimulatedNo DTCC/NSCC submission occurs from your tenant
KYC / identity decisioningSimulatedVendor integration in progress; the decision-time figure is a target, not a measurement
Money movement (ACH, wires)SimulatedFunding is a bookkeeping entry
Connections to your CRM, notetaker, planning software or mailboxOffThey 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

firm         SBX{n}              flagged is_sandbox
  └── branch MAIN
        └── rep code SBX{n}R01
              └── portal user   role = advisor, scoped to that rep code

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.

EntityCount
Clients20 — 16 advisory clients grouped into households, plus 3 self-directed and 1 in a digital portfolio (managed, no named advisor)
Accounts43 — 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 custodiansSchwab, 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' agesYour 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 typesRotating — individual, traditional and Roth IRA, joint, trust, custodial (UTMA)
Portfolios4 — Core Growth, Balanced Income, Conservative Income, Global Diversified; 3 are backed by firm models, one carries direct weights on purpose
Firm models3 — 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 records20 — one per PERSON, not per account; a two-account client is one row showing their whole book
FundingDrawn 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
PositionsSeeded — 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

signup ──► PENDING_VERIFICATION ──verify──► ACTIVE ──30d──► EXPIRED ──15d──► PURGED
                                               │
                                               └── deal closed ──► CONVERTED
StateMeaning
PENDING_VERIFICATIONAddress submitted, not yet confirmed. Nothing is provisioned.
ACTIVETenant exists, login works. 30 days from provisioning.
EXPIREDLogin refused. Data is intact. An extension is one update.
PURGEDAccess revoked across the tenant — see the note below on what this does and does not remove.
CONVERTEDYou 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.

GET/api/v1/auth/sandbox/me
POST/api/v1/auth/sandbox/reset
POST/api/v1/auth/sandbox/reseed

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.

LimitValue
Concurrent active sandbox tenants25 platform-wide
Accounts per tenant100 — exceeding it returns 429. The seeded book uses 43, leaving 57 for your own
Trial length30 days from provisioning
Purge grace after expiry15 days
API requests600/minute per IP (burst 100)
Auth requests10/minute per IP (burst 5)
Signup via the APIShares the 10/minute auth limit
Email domainsDisposable 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 yet

Listed 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

    PURGED marks 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, email support@interposehq.com and 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 marked X-Interpose-Sandbox: true on every request, with three in-process delivery attempts and a per-webhook attempt log at GET /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/self with your portal token, ten active keys per firm — and one key authenticates against every service, not just the one that minted it. The permission_group you pick is checked on each request, so a read_only key is refused a write with a 403 naming 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 on 429 will hot-loop. The 429 you 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.