Metadata-Version: 2.4
Name: bloomberg-enterprise-orders
Version: 1.3.1
Summary: 
License-Expression: Apache-2.0
License-File: LICENSE
Author: Bloomberg L.P.
Requires-Python: >=3.11,<4.0
Classifier: Intended Audience :: Developers
Classifier: Operating System :: MacOS
Classifier: Operating System :: Microsoft :: Windows
Classifier: Operating System :: OS Independent
Classifier: Operating System :: POSIX
Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: 3.15
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Provides-Extra: aiohttp
Requires-Dist: aiohttp (>=3.14.1,<4) ; (python_version >= "3.11") and (extra == "aiohttp")
Requires-Dist: httpx (>=0.21.2)
Requires-Dist: httpx-aiohttp (>=0.1.8,<0.2.0) ; (python_version >= "3.11") and (extra == "aiohttp")
Requires-Dist: pydantic (>=1.9.2)
Requires-Dist: pydantic-core (>=2.18.2,<3.0.0)
Requires-Dist: typing_extensions (>=4.0.0)
Description-Content-Type: text/markdown

# Bloomberg Enterprise Orders Python Library


The Bloomberg Enterprise Orders Python library provides convenient access to the Bloomberg Enterprise Orders APIs from Python.

## Table of Contents

- [Installation](#installation)
- [Usage](#usage)
- [Environments](#environments)
- [Async Client](#async-client)
- [Exception Handling](#exception-handling)
- [Oauth Token Override](#oauth-token-override)
- [Advanced](#advanced)
  - [Access Raw Response Data](#access-raw-response-data)
  - [Retries](#retries)
  - [Timeouts](#timeouts)
  - [Custom Client](#custom-client)

## Installation

```sh
pip install bloomberg-enterprise-orders
```

## Usage

Instantiate and use the client with the following:

```python
from bloomberg.enterprise.orders import Orders, InstrumentSymbol, QuantityTypeCode, SideTypeCode, OrderType_Limit, TimeInForceType_Day, PreAllocation, Parties

client = Orders(
    client_id="<clientId>",
    client_secret="<clientSecret>",
)

client.orders.compliance_order_what_if(
    idempotency_key="3fa85f64-5717-4562-b3fc-2c963f66afa6",
    instrument=InstrumentSymbol(
        symbol="AAPL US Equity",
    ),
    quantity=500,
    quantity_type=QuantityTypeCode.UNITS,
    side=SideTypeCode.BUY,
    order_type=OrderType_Limit(
        limit_price=281.82,
    ),
    time_in_force=TimeInForceType_Day(),
    pre_allocations=[
        PreAllocation(
            quantity=500,
            account_code="EQ1",
            custom_allocation_id="ALLOC-EQ-001",
        )
    ],
    parties=Parties(
        portfolio_manager_uuid=7829341,
        trader_uuid=5610284,
        trading_desk="EQTY-US",
    ),
    custom_order_id="WI-EQ-AAPL-001",
)
```

## Environments

This SDK allows you to configure different environments for API requests.

```python
from bloomberg.enterprise.orders import Orders
from bloomberg.enterprise.orders.environment import OrdersEnvironment

client = Orders(
    environment=OrdersEnvironment.PRODUCTION,
)
```

## Async Client

The SDK also exports an `async` client so that you can make non-blocking calls to our API. Note that if you are constructing an Async httpx client class to pass into this client, use `httpx.AsyncClient()` instead of `httpx.Client()` (e.g. for the `httpx_client` parameter of this client).

```python
import asyncio

from bloomberg.enterprise.orders import AsyncOrders, InstrumentSymbol, QuantityTypeCode, SideTypeCode, OrderType_Limit, TimeInForceType_Day, PreAllocation, Parties

client = AsyncOrders(
    client_id="<clientId>",
    client_secret="<clientSecret>",
)


async def main() -> None:
    await client.orders.compliance_order_what_if(
        idempotency_key="3fa85f64-5717-4562-b3fc-2c963f66afa6",
        instrument=InstrumentSymbol(
            symbol="AAPL US Equity",
        ),
        quantity=500,
        quantity_type=QuantityTypeCode.UNITS,
        side=SideTypeCode.BUY,
        order_type=OrderType_Limit(
            limit_price=281.82,
        ),
        time_in_force=TimeInForceType_Day(),
        pre_allocations=[
            PreAllocation(
                quantity=500,
                account_code="EQ1",
                custom_allocation_id="ALLOC-EQ-001",
            )
        ],
        parties=Parties(
            portfolio_manager_uuid=7829341,
            trader_uuid=5610284,
            trading_desk="EQTY-US",
        ),
        custom_order_id="WI-EQ-AAPL-001",
    )


asyncio.run(main())
```

## Exception Handling

When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error
will be thrown.

```python
from bloomberg.enterprise.orders.core.api_error import ApiError

try:
    client.orders.compliance_order_what_if(...)
except ApiError as e:
    print(e.status_code)
    print(e.body)
```

## Oauth Token Override

This SDK supports two authentication methods: OAuth client credentials flow (automatic token management) or direct bearer token authentication. You can choose between these options when initializing the client:

```python
from bloomberg.enterprise.orders import Orders

# Option 1: Direct bearer token (bypass OAuth flow)
client = Orders(
    ...,
    token="my-pre-generated-bearer-token",
)

# Option 2: OAuth client credentials flow (automatic token management)
client = Orders(
    ...,
    client_id="your-client-id",
    client_secret="your-client-secret",
)
```

## Advanced

### Access Raw Response Data

The SDK provides access to raw response data, including headers, through the `.with_raw_response` property.
The `.with_raw_response` property returns a "raw" client that can be used to access the `.headers` and `.data` attributes.

```python
from bloomberg.enterprise.orders import Orders

client = Orders(...)
response = client.orders.with_raw_response.compliance_order_what_if(...)
print(response.headers)  # access the response headers
print(response.status_code)  # access the response status code
print(response.data)  # access the underlying object
```

### Retries

The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long
as the request is deemed retryable and the number of retry attempts has not grown larger than the configured
retry limit (default: 2).

Which status codes are retried depends on the `retryStatusCodes` generator configuration:

**`legacy`** (current default): retries on
- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout)
- [409](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409) (Conflict)
- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests)
- [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#server_error_responses) (All server errors, including 500)

**`recommended`**: retries on
- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout)
- [409](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409) (Conflict)
- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests)
- [502](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/502) (Bad Gateway)
- [503](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/503) (Service Unavailable)
- [504](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504) (Gateway Timeout)

Use the `max_retries` request option to configure this behavior.

```python
client.orders.compliance_order_what_if(..., request_options={
    "max_retries": 1
})
```

### Timeouts

The SDK defaults to a 60 second timeout. You can configure this with a timeout option at the client or request level.

```python
from bloomberg.enterprise.orders import Orders

client = Orders(..., timeout=20.0)

# Override timeout for a specific method
client.orders.compliance_order_what_if(..., request_options={
    "timeout": 1
})
```

### Custom Client

You can override the `httpx` client to customize it for your use-case. Some common use-cases include support for proxies
and transports.

```python
import httpx
from bloomberg.enterprise.orders import Orders

client = Orders(
    ...,
    httpx_client=httpx.Client(
        proxy="http://my.test.proxy.example.com",
        transport=httpx.HTTPTransport(local_address="0.0.0.0"),
    ),
)
```


