Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.4.0"
".": "0.5.0"
}
8 changes: 4 additions & 4 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 56
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/clear-street/clear-street-34c7e461556ec9324dd20c95ce4fea1fbfcc4de83b3d15365c51fdb9d8e56073.yml
openapi_spec_hash: 3477d6986fdb7b3c9d638b3557fc1ed7
config_hash: 66e3fd0a8171a922070c46769ac48c06
configured_endpoints: 61
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/clear-street/clear-street-778aab5bcb35ad542557833d9198158fff69771421393843317778f90be2c9f6.yml
openapi_spec_hash: b5584a424c4072680789ee9f9b09d531
config_hash: 3823311a3577c4e3cd71a1ea4ace533d
31 changes: 31 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,36 @@
# Changelog

## 0.5.0 (2026-06-29)

Full Changelog: [v0.4.0...v0.5.0](https://github.com/clear-street/clear-street-python/compare/v0.4.0...v0.5.0)

### Features

* **api:** api update ([4e9e0d6](https://github.com/clear-street/clear-street-python/commit/4e9e0d6bfa18839d6e00e058aa5bde5fda712ef4))
* **api:** api update ([7fec209](https://github.com/clear-street/clear-street-python/commit/7fec2098683e7a75b88ac22516ad9f02f1235876))
* **api:** api update ([d7fe7bd](https://github.com/clear-street/clear-street-python/commit/d7fe7bd078725b52a5d487f108d166c2e094d857))
* **api:** api update ([fd825b3](https://github.com/clear-street/clear-street-python/commit/fd825b3695251ab7cef1b2c707627d1af5f413de))
* **api:** api update ([881f865](https://github.com/clear-street/clear-street-python/commit/881f8659babbbd7edb28314c063f092852dcdcbe))
* **api:** api update ([a7117ea](https://github.com/clear-street/clear-street-python/commit/a7117ead2ee04ffea823132513c9743d0625b2ac))
* **api:** api update ([ab1fa34](https://github.com/clear-street/clear-street-python/commit/ab1fa346992ca1272d61daff8ec6c7cd5bd0e3d3))
* **api:** api update ([89aa53d](https://github.com/clear-street/clear-street-python/commit/89aa53da64d0beb64000d934f06c76359960680f))
* **api:** api update ([c028e36](https://github.com/clear-street/clear-street-python/commit/c028e3648bad482c76f1c7b99d9e489d2bb3f3a4))
* **api:** api update ([b6be99d](https://github.com/clear-street/clear-street-python/commit/b6be99d2969f71762f16778ed010138b8a3e5575))
* **api:** api update ([e0defc0](https://github.com/clear-street/clear-street-python/commit/e0defc0df81917094232686332fde1a3104ddd70))
* **api:** api update ([41d649c](https://github.com/clear-street/clear-street-python/commit/41d649c2743ac28ddc718ba93166368f5aff1511))
* **api:** api update ([9471e67](https://github.com/clear-street/clear-street-python/commit/9471e675875066bf04ae7cfa9cb8b079e8effda7))
* **api:** api update ([bc03dfb](https://github.com/clear-street/clear-street-python/commit/bc03dfbfc16e87f25f7a65b684e2ccbd1c9d5a5a))
* **api:** api update ([8bf96af](https://github.com/clear-street/clear-street-python/commit/8bf96af2ca6af690ae3a1c636b13b5cd3f919128))
* **api:** api update ([f7a2d31](https://github.com/clear-street/clear-street-python/commit/f7a2d313bf82857fd86c0a9a46b52fe36d3452a7))
* **api:** api update ([044a398](https://github.com/clear-street/clear-street-python/commit/044a3988e0d20af44e74100b56f9c037d4399932))
* **api:** api update ([2c07783](https://github.com/clear-street/clear-street-python/commit/2c0778360f628ec7f8adf6ebe7359e8de81928d5))
* **api:** api update ([8a4d9e0](https://github.com/clear-street/clear-street-python/commit/8a4d9e0ac7ac8e3862516c0476b269897e64cfe2))


### Chores

* update SDK settings ([179c874](https://github.com/clear-street/clear-street-python/commit/179c874ede8056c6bace730f80232744d3ba1bc8))

## 0.4.0 (2026-06-03)

Full Changelog: [v0.3.0...v0.4.0](https://github.com/clear-street/clear-street-python/compare/v0.3.0...v0.4.0)
Expand Down
6 changes: 6 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,12 @@ $ pip install ./path-to-wheel-file.whl

## Running tests

Most tests require you to [set up a mock server](https://github.com/dgellow/steady) against the OpenAPI spec to run the tests.

```sh
$ ./scripts/mock
```

```sh
$ ./scripts/test
```
Expand Down
52 changes: 44 additions & 8 deletions api.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ from clearstreet.types import APIError, BaseResponse, ResponseMetadata
Types:

```python
from clearstreet.types import SecurityType
from clearstreet.types import SecurityType, SortDirection
```

## Accounts
Expand All @@ -28,6 +28,7 @@ from clearstreet.types.v1 import (
AccountType,
MarginDetails,
MarginDetailsUsage,
MarginSessionDetails,
MarginTopContributor,
MarginType,
PortfolioHistoryResponse,
Expand Down Expand Up @@ -229,7 +230,6 @@ from clearstreet.types.v1 import (
PrefillNewOrderAction,
PrefillOrderAction,
PromptButtonAction,
ScreenerFilter,
StructuredAction,
StructuredActionButtonAction,
SuggestedActionsPayload,
Expand Down Expand Up @@ -407,6 +407,48 @@ Methods:
- <code title="get /v1/accounts/{account_id}/positions">client.v1.positions.<a href="./src/clearstreet/resources/v1/positions.py">get_positions</a>(account_id, \*\*<a href="src/clearstreet/types/v1/position_get_positions_params.py">params</a>) -> <a href="./src/clearstreet/types/v1/position_get_positions_response.py">PositionGetPositionsResponse</a></code>
- <code title="post /v1/accounts/{account_id}/positions/instructions">client.v1.positions.<a href="./src/clearstreet/resources/v1/positions.py">submit_position_instructions</a>(account_id, \*\*<a href="src/clearstreet/types/v1/position_submit_position_instructions_params.py">params</a>) -> <a href="./src/clearstreet/types/v1/position_submit_position_instructions_response.py">PositionSubmitPositionInstructionsResponse</a></code>

## Screener

Types:

```python
from clearstreet.types.v1 import (
FieldLookback,
FieldPeriod,
FieldRef,
FieldType,
FilterOpSpec,
FilterOperator,
FilterValue,
Modifier,
ModifierOp,
OperatorArg,
ScreenerColumn,
ScreenerEntry,
ScreenerEntryList,
ScreenerFilter,
ScreenerRow,
ScreenerRowList,
SearchFilter,
SortSpec,
Variable,
ScreenerCreateScreenerResponse,
ScreenerGetScreenerByIDResponse,
ScreenerGetScreenersResponse,
ScreenerReplaceScreenerResponse,
ScreenerSearchScreenerResponse,
)
```

Methods:

- <code title="post /v1/saved-screeners">client.v1.screener.<a href="./src/clearstreet/resources/v1/screener.py">create_screener</a>(\*\*<a href="src/clearstreet/types/v1/screener_create_screener_params.py">params</a>) -> <a href="./src/clearstreet/types/v1/screener_create_screener_response.py">ScreenerCreateScreenerResponse</a></code>
- <code title="delete /v1/saved-screeners/{screener_id}">client.v1.screener.<a href="./src/clearstreet/resources/v1/screener.py">delete_screener</a>(screener_id) -> None</code>
- <code title="get /v1/saved-screeners/{screener_id}">client.v1.screener.<a href="./src/clearstreet/resources/v1/screener.py">get_screener_by_id</a>(screener_id) -> <a href="./src/clearstreet/types/v1/screener_get_screener_by_id_response.py">ScreenerGetScreenerByIDResponse</a></code>
- <code title="get /v1/saved-screeners">client.v1.screener.<a href="./src/clearstreet/resources/v1/screener.py">get_screeners</a>() -> <a href="./src/clearstreet/types/v1/screener_get_screeners_response.py">ScreenerGetScreenersResponse</a></code>
- <code title="put /v1/saved-screeners/{screener_id}">client.v1.screener.<a href="./src/clearstreet/resources/v1/screener.py">replace_screener</a>(screener_id, \*\*<a href="src/clearstreet/types/v1/screener_replace_screener_params.py">params</a>) -> <a href="./src/clearstreet/types/v1/screener_replace_screener_response.py">ScreenerReplaceScreenerResponse</a></code>
- <code title="post /v1/screener">client.v1.screener.<a href="./src/clearstreet/resources/v1/screener.py">search_screener</a>(\*\*<a href="src/clearstreet/types/v1/screener_search_screener_params.py">params</a>) -> <a href="./src/clearstreet/types/v1/screener_search_screener_response.py">ScreenerSearchScreenerResponse</a></code>

## Watchlist

Types:
Expand Down Expand Up @@ -435,9 +477,3 @@ Methods:
- <code title="delete /v1/watchlists/{watchlist_id}/items/{item_id}">client.v1.watchlist.<a href="./src/clearstreet/resources/v1/watchlist.py">delete_watchlist_item</a>(item_id, \*, watchlist_id) -> <a href="./src/clearstreet/types/v1/watchlist_delete_watchlist_item_response.py">WatchlistDeleteWatchlistItemResponse</a></code>
- <code title="get /v1/watchlists/{watchlist_id}">client.v1.watchlist.<a href="./src/clearstreet/resources/v1/watchlist.py">get_watchlist_by_id</a>(watchlist_id) -> <a href="./src/clearstreet/types/v1/watchlist_get_watchlist_by_id_response.py">WatchlistGetWatchlistByIDResponse</a></code>
- <code title="get /v1/watchlists">client.v1.watchlist.<a href="./src/clearstreet/resources/v1/watchlist.py">get_watchlists</a>(\*\*<a href="src/clearstreet/types/v1/watchlist_get_watchlists_params.py">params</a>) -> <a href="./src/clearstreet/types/v1/watchlist_get_watchlists_response.py">WatchlistGetWatchlistsResponse</a></code>

## Websocket

Methods:

- <code title="get /v1/ws">client.v1.websocket.<a href="./src/clearstreet/resources/v1/websocket.py">websocket_handler</a>() -> None</code>
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "clearstreet"
version = "0.4.0"
version = "0.5.0"
description = "The official Python library for the clear-street API"
dynamic = ["readme"]
license = "Apache-2.0"
Expand Down
52 changes: 52 additions & 0 deletions scripts/mock
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#!/usr/bin/env bash

set -e

cd "$(dirname "$0")/.."

if [[ -n "$1" && "$1" != '--'* ]]; then
URL="$1"
shift
else
URL="$(grep 'openapi_spec_url' .stats.yml | cut -d' ' -f2)"
fi

# Check if the URL is empty
if [ -z "$URL" ]; then
echo "Error: No OpenAPI spec path/url provided or found in .stats.yml"
exit 1
fi

echo "==> Starting mock server with URL ${URL}"

# Run steady mock on the given spec
if [ "$1" == "--daemon" ]; then
# Pre-install the package so the download doesn't eat into the startup timeout
npm exec --package=@stdy/cli@0.22.1 -- steady --version

npm exec --package=@stdy/cli@0.22.1 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=comma --validator-form-array-format=comma --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" &> .stdy.log &

# Wait for server to come online via health endpoint (max 30s)
echo -n "Waiting for server"
attempts=0
while ! curl --silent --fail "http://127.0.0.1:4010/_x-steady/health" >/dev/null 2>&1; do
if ! kill -0 $! 2>/dev/null; then
echo
cat .stdy.log
exit 1
fi
attempts=$((attempts + 1))
if [ "$attempts" -ge 300 ]; then
echo
echo "Timed out waiting for Steady server to start"
cat .stdy.log
exit 1
fi
echo -n "."
sleep 0.1
done

echo
else
npm exec --package=@stdy/cli@0.22.1 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=comma --validator-form-array-format=comma --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL"
fi
46 changes: 46 additions & 0 deletions scripts/test
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,53 @@ set -e

cd "$(dirname "$0")/.."

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # No Color

function steady_is_running() {
curl --silent "http://127.0.0.1:4010/_x-steady/health" >/dev/null 2>&1
}

kill_server_on_port() {
pids=$(lsof -t -i tcp:"$1" || echo "")
if [ "$pids" != "" ]; then
kill "$pids"
echo "Stopped $pids."
fi
}

function is_overriding_api_base_url() {
[ -n "$TEST_API_BASE_URL" ]
}

if ! is_overriding_api_base_url && ! steady_is_running ; then
# When we exit this script, make sure to kill the background mock server process
trap 'kill_server_on_port 4010' EXIT

# Start the dev server
./scripts/mock --daemon
fi

if is_overriding_api_base_url ; then
echo -e "${GREEN}✔ Running tests against ${TEST_API_BASE_URL}${NC}"
echo
elif ! steady_is_running ; then
echo -e "${RED}ERROR:${NC} The test suite will not run without a mock Steady server"
echo -e "running against your OpenAPI spec."
echo
echo -e "To run the server, pass in the path or url of your OpenAPI"
echo -e "spec to the steady command:"
echo
echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.22.1 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=comma --validator-form-array-format=comma --validator-query-object-format=brackets --validator-form-object-format=brackets${NC}"
echo

exit 1
else
echo -e "${GREEN}✔ Mock steady server is running with your OpenAPI spec${NC}"
echo
fi

export DEFER_PYDANTIC_BUILD=false

Expand Down
2 changes: 1 addition & 1 deletion src/clearstreet/_version.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

__title__ = "clearstreet"
__version__ = "0.4.0" # x-release-please-version
__version__ = "0.5.0" # x-release-please-version
28 changes: 14 additions & 14 deletions src/clearstreet/resources/v1/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,14 @@
CalendarResourceWithStreamingResponse,
AsyncCalendarResourceWithStreamingResponse,
)
from .screener import (
ScreenerResource,
AsyncScreenerResource,
ScreenerResourceWithRawResponse,
AsyncScreenerResourceWithRawResponse,
ScreenerResourceWithStreamingResponse,
AsyncScreenerResourceWithStreamingResponse,
)
from .positions import (
PositionsResource,
AsyncPositionsResource,
Expand All @@ -56,14 +64,6 @@
WatchlistResourceWithStreamingResponse,
AsyncWatchlistResourceWithStreamingResponse,
)
from .websocket import (
WebsocketResource,
AsyncWebsocketResource,
WebsocketResourceWithRawResponse,
AsyncWebsocketResourceWithRawResponse,
WebsocketResourceWithStreamingResponse,
AsyncWebsocketResourceWithStreamingResponse,
)
from .api_version import (
APIVersionResource,
AsyncAPIVersionResource,
Expand Down Expand Up @@ -138,18 +138,18 @@
"AsyncPositionsResourceWithRawResponse",
"PositionsResourceWithStreamingResponse",
"AsyncPositionsResourceWithStreamingResponse",
"ScreenerResource",
"AsyncScreenerResource",
"ScreenerResourceWithRawResponse",
"AsyncScreenerResourceWithRawResponse",
"ScreenerResourceWithStreamingResponse",
"AsyncScreenerResourceWithStreamingResponse",
"WatchlistResource",
"AsyncWatchlistResource",
"WatchlistResourceWithRawResponse",
"AsyncWatchlistResourceWithRawResponse",
"WatchlistResourceWithStreamingResponse",
"AsyncWatchlistResourceWithStreamingResponse",
"WebsocketResource",
"AsyncWebsocketResource",
"WebsocketResourceWithRawResponse",
"AsyncWebsocketResourceWithRawResponse",
"WebsocketResourceWithStreamingResponse",
"AsyncWebsocketResourceWithStreamingResponse",
"V1Resource",
"AsyncV1Resource",
"V1ResourceWithRawResponse",
Expand Down
Loading
Loading