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 →
SDKs & tools
A Python client and two TypeScript clients.
The Python client covers both pillars this section documents — Brokerage-as-a-Service and Portfolio Management — and performs the OAuth exchange and token refresh for you. Two scoped TypeScript packages cover the same ground, one per pillar.
They are pre-1.0 and install from a URL on this domain rather than from PyPI or npm. Both package managers take a URL, so this is a one-line install and not a source checkout:
https://interposehq.com/sdk/index.json carries the same list in machine-readable form, with the current filename and version for each client, if you would rather pin from that than from this page. For a quick evaluation a plain HTTP client is still a reasonable choice — everything in this section is reachable with curl, and the conventions page is written so you can build a client directly from it.
The SDK base URL is not the curl base URL
The SDKs append their own /v1. The curl path already contains one. So the two take different base URLs, and mixing them produces a doubled version segment and a 404.
| Client | Base URL | Produces |
|---|---|---|
| curl / raw HTTP | …/api/v1/baas | /api/v1/baas/accounts |
| Official SDKs | …/api/baas | /api/baas/v1/accounts |
The rule to remember: /api/{pillar} for SDKs, /api/v1/{pillar} for curl. A 404 on a path containing /v1/v1/ is always this. Older published examples configuring an SDK with the curl-shaped base URL are wrong.
Python client
interpose-sdk, version 0.1.0. Requires Python 3.10+. Synchronous only — there is no async client today.
Authentication coverage
| Mode | Constructor argument | BaaS | PM |
|---|---|---|---|
| Bearer token | access_token= | yes | yes |
| OAuth client credentials | api_key_id=, api_key_secret= | yes | yes |
| HMAC request signing | hmac_key_id=, hmac_key_secret= | no | yes |
The client performs the OAuth exchange and token refresh for you on both. For list endpoints, apply the defensive list accessor — helper pagination is not available on most of them.
TypeScript clients
One scoped package per pillar — @interpose/baas-sdk and @interpose/pm-sdk. There is no unified meta-package. index.json is the current list of what is downloadable, with checksums.
Request fields are snake_case on the wire
It is account_id, not accountId — the TypeScript clients do not camel-case the payload for you. What they cover and what they leave to raw HTTP is under Current limits.
Coverage and gaps
| Pillar | Python | TypeScript | Notes |
|---|---|---|---|
| BaaS | yes | yes | The more complete of the two |
| Portfolio Management | yes | yes | See the caveat below |
Current limits
what is not built yetThe clients are real and in use. These are the gaps to plan around while they get to 1.0.
The packages are not on PyPI or npm
pip install interpose-sdkandnpm install @interpose/baas-sdkstill fail, and you will see those commands in older material. Install from the URLs at the top of this page instead — the package names themselves are unchanged, so only the registry lookup is missing.Registry publication is a target, not a done thing: the release workflow is staged and runs on manual dispatch, and we do not yet hold the publishing credentials. Until it ships, a lockfile records the URL rather than a version range, and upgrading means changing the URL.
The Python client is synchronous only
There is no async client today.
Pagewith.iter_all()exists on exactly two resources —baas.accountsandbaas.orders. Every other list method returns the decoded body as-is.The TypeScript clients do less than the Python one
They implement neither the OAuth exchange nor HMAC signing — those are Python-only — and take a bearer JWT you have already obtained in a field named
apiKey. Request fields are snake_case on the wire.notionalis not modelled, so dollar-based orders need Python or raw HTTP.pm-sdk's rebalancing and drift resources do not work
Its rebalancing resource targets a path shape the service does not serve, and it has no drift resource at all. Use raw HTTP for both — the endpoint reference has the correct paths.
Coverage gaps
There is no unified meta-package — one client per pillar, imported separately. No published AsyncAPI document exists for the event streams; the shapes are documented on Events & streaming instead.
Specifications
The Brokerage-as-a-Service and Portfolio Management specifications are rendered in full at /developers/baas and /developers/pm, and the raw documents are at /api-specs/baas.yaml and /api-specs/pm.yaml if you would rather generate a client than use ours.
They are hand-maintained and describe roughly 180 operations between them. The two services expose around 800, so where a specification is silent the endpoint may still exist — ask us rather than assuming it does not. The endpoint reference lists only routes confirmed against the running services.
If you find an AsyncAPI document referencing Confluent Cloud broker URLs, those are placeholders from a previous hosting arrangement, not connection details. Ask support for the real ones.