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 →

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:

install
pip install https://interposehq.com/sdk/interpose_sdk-0.1.0-py3-none-any.whl

npm install https://interposehq.com/sdk/interpose-pm-sdk-0.3.0.tgz
npm install https://interposehq.com/sdk/interpose-baas-sdk-0.2.0.tgz

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.

ClientBase URLProduces
curl / raw HTTP…/api/v1/baas/api/v1/baas/accounts
Official SDKs…/api/baas/api/baas/v1/accounts
BaasClient(base_url="https://interposehq.com/api/baas",    access_token=token)  # right
BaasClient(base_url="https://interposehq.com/api/v1/baas", access_token=token)  # 404 — doubled /v1
BaasClient(base_url="http://localhost:8002",               access_token=token)  # right, direct origin

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.

from interpose_sdk import BaasClient, PmClient

baas = BaasClient(base_url="https://interposehq.com/api/baas", access_token=my_jwt)
pm   = PmClient(base_url="https://interposehq.com/api/pm",     access_token=my_jwt)

Authentication coverage

ModeConstructor argumentBaaSPM
Bearer tokenaccess_token=yesyes
OAuth client credentialsapi_key_id=, api_key_secret=yesyes
HMAC request signinghmac_key_id=, hmac_key_secret=noyes

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

PillarPythonTypeScriptNotes
BaaSyesyesThe more complete of the two
Portfolio ManagementyesyesSee the caveat below

Current limits

what is not built yet

The 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-sdk and npm install @interpose/baas-sdk still 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. Page with .iter_all() exists on exactly two resources — baas.accounts and baas.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. notional is 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.