# Python SDK [View original](https://ittybit.com/sdks/python) ## Usage Instantiate and use the ittybit client with the following: ```python from ittybit import Ittybit ittybit = Ittybit( token="ITTYBIT_API_KEY", ) ittybit.automations.create() ``` *** ## Async Client The SDK also exports an `async` client so that you can make non-blocking calls to our API. ```python import asyncio from ittybit import AsyncIttybit ittybit = AsyncIttybit( token="ITTYBIT_API_KEY", ) async def main() -> None: await ittybit.automations.create() 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 ittybit.core.api_error import ApiError try: ittybit.automations.create(...) except ApiError as e: print(e.status_code) print(e.body) ``` *** ## 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 ittybit import Ittybit ittybit = Ittybit( ..., ) response = ittybit.automations.with_raw_response.create(...) print(response.headers) # access the response headers 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). A request is deemed retryable when any of the following HTTP status codes is returned: * [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout) * [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/500) (Internal Server Errors) Use the `max_retries` request option to configure this behavior. ```python ittybit.automations.create(..., 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 ittybit import Ittybit ittybit = Ittybit( ..., timeout=20.0, ) # Override timeout for a specific method ittybit.automations.create(..., request_options={ "timeout_in_seconds": 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 ittybit import Ittybit ittybit = Ittybit( ..., httpx_client=httpx.Client( proxies="http://my.test.proxy.example.com", transport=httpx.HTTPTransport(local_address="0.0.0.0"), ), ) ```