finatic-server-python


Namefinatic-server-python JSON
Version 0.1.2 PyPI version JSON
download
home_pageNone
SummaryPython SDK for Finatic Server API
upload_time2025-08-31 16:46:49
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8.1
licenseMIT
keywords finatic trading finance api sdk
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Finatic Server Python SDK

A Python SDK for integrating with Finatic's server-side trading and portfolio management APIs.

## Installation

```bash
pip install finatic-server-python
```

## Quick Start

```python
import asyncio
from finatic_server import FinaticServerClient

async def main():
    # Initialize with API key
    client = FinaticServerClient("your-api-key")
    
    # Option 1: Portal Authentication
    await client.start_session()
    portal_url = await client.get_portal_url()
    print(f"User should visit: {portal_url}")
    
    # After user completes authentication in portal, get user info
    user_info = await client.get_session_user()
    print(f"Authenticated user: {user_info['user_id']}")
    
    # Option 2: Direct Authentication (if you know the user ID)
    # client = FinaticServerClient("your-api-key", user_id="user123")
    # await client.start_session()
    
    # Now you can access broker data
    brokers = await client.get_broker_list()
    print(f"Available brokers: {len(brokers)}")
    
    # Get all orders across all pages
    all_orders = await client.get_all_broker_orders()
    print(f"Total orders: {len(all_orders)}")

# Run the example
asyncio.run(main())
```

## Authentication Flow

The SDK supports two authentication methods:

### 1. Portal Authentication (User completes auth in browser)

```python
client = FinaticServerClient("your-api-key")

# Start session
await client.start_session()

# Get portal URL for user authentication
portal_url = await client.get_portal_url()
print(f"User should visit: {portal_url}")

# After user completes authentication in portal
user_info = await client.get_session_user()
print(f"User ID: {user_info['user_id']}")
print(f"Access Token: {user_info['access_token']}")

# Now you can make authenticated requests
brokers = await client.get_broker_list()
```

### 2. Direct Authentication (Server-side with known user ID)

```python
client = FinaticServerClient("your-api-key", user_id="user123")

# Start session (automatically authenticates with user ID)
await client.start_session()

# Now you can make authenticated requests immediately
brokers = await client.get_broker_list()
```

## Core Features

- **API Key Authentication**: Secure server-side authentication
- **Portal Integration**: Get portal URLs for user authentication
- **Automatic Token Management**: Handles access/refresh tokens automatically
- **Pagination Support**: Built-in pagination for large datasets
- **Type-safe API**: Full Pydantic model support
- **Async/await Support**: Non-blocking operations
- **Comprehensive Error Handling**: Detailed error types

## API Reference

### Initialization

```python
client = FinaticServerClient(
    api_key="your-api-key",
    user_id="user123",                    # Optional - for direct authentication
)
```

### Authentication Methods

- `start_session()` - Start a new session (authenticates directly if user_id provided)
- `get_portal_url()` - Get portal URL for user authentication (portal flow only)
- `get_session_user()` - Get user info and tokens after portal completion (portal flow only)

### Broker Data Methods

#### Basic Methods (with pagination support)
- `get_broker_list()` - Get list of available brokers
- `get_broker_connections()` - Get broker connections
- `get_broker_accounts(page=1, per_page=100, options=None, filters=None)` - Get broker accounts
- `get_broker_orders(page=1, per_page=100, options=None, filters=None)` - Get broker orders
- `get_broker_positions(page=1, per_page=100, options=None, filters=None)` - Get broker positions

#### Get All Methods (automatically handles pagination)
- `get_all_broker_accounts(options=None, filters=None)` - Get all broker accounts across all pages
- `get_all_broker_orders(options=None, filters=None)` - Get all broker orders across all pages
- `get_all_broker_positions(options=None, filters=None)` - Get all broker positions across all pages

### Filter Options

```python
from finatic_server.types.broker import BrokerDataOptions, OrdersFilter, PositionsFilter, AccountsFilter

# Basic filtering
options = BrokerDataOptions(
    broker_name="robinhood",
    account_id="123456",
    symbol="AAPL"
)

# Advanced filtering for orders
order_filters = OrdersFilter(
    status="filled",
    side="buy",
    asset_type="stock",
    created_after="2024-01-01T00:00:00Z"
)

# Advanced filtering for positions
position_filters = PositionsFilter(
    symbol="AAPL",
    side="long",
    asset_type="stock"
)

# Advanced filtering for accounts
account_filters = AccountsFilter(
    account_type="margin",
    status="active",
    currency="USD"
)
```

## Usage Examples

### Get All Orders with Filtering

```python
# Get all filled orders for a specific symbol
all_filled_orders = await client.get_all_broker_orders(
    filters=OrdersFilter(
        status="filled",
        symbol="AAPL"
    )
)
print(f"Found {len(all_filled_orders)} filled AAPL orders")
```

### Pagination Example

```python
# Get first page of 10 orders
first_page = await client.get_broker_orders(page=1, per_page=10)
print(f"First page: {len(first_page)} orders")

# Get second page
second_page = await client.get_broker_orders(page=2, per_page=10)
print(f"Second page: {len(second_page)} orders")
```

### Get All Data for Analysis

```python
# Get all accounts, orders, and positions
all_accounts = await client.get_all_broker_accounts()
all_orders = await client.get_all_broker_orders()
all_positions = await client.get_all_broker_positions()

print(f"Total accounts: {len(all_accounts)}")
print(f"Total orders: {len(all_orders)}")
print(f"Total positions: {len(all_positions)}")
```

### Filter by Broker

```python
# Get all orders from Robinhood
robinhood_orders = await client.get_all_broker_orders(
    options=BrokerDataOptions(broker_name="robinhood")
)

# Get all positions from Tasty Trade
tasty_positions = await client.get_all_broker_positions(
    options=BrokerDataOptions(broker_name="tasty_trade")
)
```

## Error Handling

The SDK provides comprehensive error handling:

```python
from finatic_server import AuthenticationError, ApiError, NetworkError

try:
    orders = await client.get_broker_orders()
except AuthenticationError as e:
    print(f"Authentication failed: {e}")
except NetworkError as e:
    print(f"Network error: {e}")
except ApiError as e:
    print(f"API error: {e}")
```

## Complete Example

```python
import asyncio
from finatic_server import FinaticServerClient
from finatic_server.types.broker import OrdersFilter, BrokerDataOptions

async def main():
    # Option 1: Portal Authentication (user completes auth in browser)
    client = FinaticServerClient("your-api-key")
    
    try:
        # Start session
        await client.start_session()
        
        # Get portal URL
        portal_url = await client.get_portal_url()
        print(f"Please visit: {portal_url}")
        
        # Wait for user to complete authentication
        input("Press Enter after completing authentication...")
        
        # Get user info
        user_info = await client.get_session_user()
        print(f"Authenticated as: {user_info['user_id']}")
        
        # Option 2: Direct Authentication (if you know the user ID)
        # client = FinaticServerClient("your-api-key", user_id="user123")
        # await client.start_session()
        # print("Directly authenticated!")
        
        # Get broker information
        brokers = await client.get_broker_list()
        print(f"Available brokers: {[b.name for b in brokers]}")
        
        # Get all filled orders
        filled_orders = await client.get_all_broker_orders(
            filters=OrdersFilter(status="filled")
        )
        print(f"Total filled orders: {len(filled_orders)}")
        
        # Get all positions
        positions = await client.get_all_broker_positions()
        print(f"Total positions: {len(positions)}")
        
        # Get accounts with cash balance
        accounts = await client.get_all_broker_accounts()
        for account in accounts:
            cash = account.cash_balance or 0.0
            print(f"{account.account_name}: ${cash:,.2f}")
            
    except Exception as e:
        print(f"Error: {e}")
    finally:
        await client.close()

if __name__ == "__main__":
    asyncio.run(main())
```

## License

MIT License - see [LICENSE](LICENSE) file for details. 

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "finatic-server-python",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8.1",
    "maintainer_email": null,
    "keywords": "finatic, trading, finance, api, sdk",
    "author": null,
    "author_email": "Finatic <support@finatic.dev>",
    "download_url": "https://files.pythonhosted.org/packages/93/ff/75b7c983b792680bf0f67208054464ec1f8dd543b5898b61b985ed4485d1/finatic_server_python-0.1.2.tar.gz",
    "platform": null,
    "description": "# Finatic Server Python SDK\n\nA Python SDK for integrating with Finatic's server-side trading and portfolio management APIs.\n\n## Installation\n\n```bash\npip install finatic-server-python\n```\n\n## Quick Start\n\n```python\nimport asyncio\nfrom finatic_server import FinaticServerClient\n\nasync def main():\n    # Initialize with API key\n    client = FinaticServerClient(\"your-api-key\")\n    \n    # Option 1: Portal Authentication\n    await client.start_session()\n    portal_url = await client.get_portal_url()\n    print(f\"User should visit: {portal_url}\")\n    \n    # After user completes authentication in portal, get user info\n    user_info = await client.get_session_user()\n    print(f\"Authenticated user: {user_info['user_id']}\")\n    \n    # Option 2: Direct Authentication (if you know the user ID)\n    # client = FinaticServerClient(\"your-api-key\", user_id=\"user123\")\n    # await client.start_session()\n    \n    # Now you can access broker data\n    brokers = await client.get_broker_list()\n    print(f\"Available brokers: {len(brokers)}\")\n    \n    # Get all orders across all pages\n    all_orders = await client.get_all_broker_orders()\n    print(f\"Total orders: {len(all_orders)}\")\n\n# Run the example\nasyncio.run(main())\n```\n\n## Authentication Flow\n\nThe SDK supports two authentication methods:\n\n### 1. Portal Authentication (User completes auth in browser)\n\n```python\nclient = FinaticServerClient(\"your-api-key\")\n\n# Start session\nawait client.start_session()\n\n# Get portal URL for user authentication\nportal_url = await client.get_portal_url()\nprint(f\"User should visit: {portal_url}\")\n\n# After user completes authentication in portal\nuser_info = await client.get_session_user()\nprint(f\"User ID: {user_info['user_id']}\")\nprint(f\"Access Token: {user_info['access_token']}\")\n\n# Now you can make authenticated requests\nbrokers = await client.get_broker_list()\n```\n\n### 2. Direct Authentication (Server-side with known user ID)\n\n```python\nclient = FinaticServerClient(\"your-api-key\", user_id=\"user123\")\n\n# Start session (automatically authenticates with user ID)\nawait client.start_session()\n\n# Now you can make authenticated requests immediately\nbrokers = await client.get_broker_list()\n```\n\n## Core Features\n\n- **API Key Authentication**: Secure server-side authentication\n- **Portal Integration**: Get portal URLs for user authentication\n- **Automatic Token Management**: Handles access/refresh tokens automatically\n- **Pagination Support**: Built-in pagination for large datasets\n- **Type-safe API**: Full Pydantic model support\n- **Async/await Support**: Non-blocking operations\n- **Comprehensive Error Handling**: Detailed error types\n\n## API Reference\n\n### Initialization\n\n```python\nclient = FinaticServerClient(\n    api_key=\"your-api-key\",\n    user_id=\"user123\",                    # Optional - for direct authentication\n)\n```\n\n### Authentication Methods\n\n- `start_session()` - Start a new session (authenticates directly if user_id provided)\n- `get_portal_url()` - Get portal URL for user authentication (portal flow only)\n- `get_session_user()` - Get user info and tokens after portal completion (portal flow only)\n\n### Broker Data Methods\n\n#### Basic Methods (with pagination support)\n- `get_broker_list()` - Get list of available brokers\n- `get_broker_connections()` - Get broker connections\n- `get_broker_accounts(page=1, per_page=100, options=None, filters=None)` - Get broker accounts\n- `get_broker_orders(page=1, per_page=100, options=None, filters=None)` - Get broker orders\n- `get_broker_positions(page=1, per_page=100, options=None, filters=None)` - Get broker positions\n\n#### Get All Methods (automatically handles pagination)\n- `get_all_broker_accounts(options=None, filters=None)` - Get all broker accounts across all pages\n- `get_all_broker_orders(options=None, filters=None)` - Get all broker orders across all pages\n- `get_all_broker_positions(options=None, filters=None)` - Get all broker positions across all pages\n\n### Filter Options\n\n```python\nfrom finatic_server.types.broker import BrokerDataOptions, OrdersFilter, PositionsFilter, AccountsFilter\n\n# Basic filtering\noptions = BrokerDataOptions(\n    broker_name=\"robinhood\",\n    account_id=\"123456\",\n    symbol=\"AAPL\"\n)\n\n# Advanced filtering for orders\norder_filters = OrdersFilter(\n    status=\"filled\",\n    side=\"buy\",\n    asset_type=\"stock\",\n    created_after=\"2024-01-01T00:00:00Z\"\n)\n\n# Advanced filtering for positions\nposition_filters = PositionsFilter(\n    symbol=\"AAPL\",\n    side=\"long\",\n    asset_type=\"stock\"\n)\n\n# Advanced filtering for accounts\naccount_filters = AccountsFilter(\n    account_type=\"margin\",\n    status=\"active\",\n    currency=\"USD\"\n)\n```\n\n## Usage Examples\n\n### Get All Orders with Filtering\n\n```python\n# Get all filled orders for a specific symbol\nall_filled_orders = await client.get_all_broker_orders(\n    filters=OrdersFilter(\n        status=\"filled\",\n        symbol=\"AAPL\"\n    )\n)\nprint(f\"Found {len(all_filled_orders)} filled AAPL orders\")\n```\n\n### Pagination Example\n\n```python\n# Get first page of 10 orders\nfirst_page = await client.get_broker_orders(page=1, per_page=10)\nprint(f\"First page: {len(first_page)} orders\")\n\n# Get second page\nsecond_page = await client.get_broker_orders(page=2, per_page=10)\nprint(f\"Second page: {len(second_page)} orders\")\n```\n\n### Get All Data for Analysis\n\n```python\n# Get all accounts, orders, and positions\nall_accounts = await client.get_all_broker_accounts()\nall_orders = await client.get_all_broker_orders()\nall_positions = await client.get_all_broker_positions()\n\nprint(f\"Total accounts: {len(all_accounts)}\")\nprint(f\"Total orders: {len(all_orders)}\")\nprint(f\"Total positions: {len(all_positions)}\")\n```\n\n### Filter by Broker\n\n```python\n# Get all orders from Robinhood\nrobinhood_orders = await client.get_all_broker_orders(\n    options=BrokerDataOptions(broker_name=\"robinhood\")\n)\n\n# Get all positions from Tasty Trade\ntasty_positions = await client.get_all_broker_positions(\n    options=BrokerDataOptions(broker_name=\"tasty_trade\")\n)\n```\n\n## Error Handling\n\nThe SDK provides comprehensive error handling:\n\n```python\nfrom finatic_server import AuthenticationError, ApiError, NetworkError\n\ntry:\n    orders = await client.get_broker_orders()\nexcept AuthenticationError as e:\n    print(f\"Authentication failed: {e}\")\nexcept NetworkError as e:\n    print(f\"Network error: {e}\")\nexcept ApiError as e:\n    print(f\"API error: {e}\")\n```\n\n## Complete Example\n\n```python\nimport asyncio\nfrom finatic_server import FinaticServerClient\nfrom finatic_server.types.broker import OrdersFilter, BrokerDataOptions\n\nasync def main():\n    # Option 1: Portal Authentication (user completes auth in browser)\n    client = FinaticServerClient(\"your-api-key\")\n    \n    try:\n        # Start session\n        await client.start_session()\n        \n        # Get portal URL\n        portal_url = await client.get_portal_url()\n        print(f\"Please visit: {portal_url}\")\n        \n        # Wait for user to complete authentication\n        input(\"Press Enter after completing authentication...\")\n        \n        # Get user info\n        user_info = await client.get_session_user()\n        print(f\"Authenticated as: {user_info['user_id']}\")\n        \n        # Option 2: Direct Authentication (if you know the user ID)\n        # client = FinaticServerClient(\"your-api-key\", user_id=\"user123\")\n        # await client.start_session()\n        # print(\"Directly authenticated!\")\n        \n        # Get broker information\n        brokers = await client.get_broker_list()\n        print(f\"Available brokers: {[b.name for b in brokers]}\")\n        \n        # Get all filled orders\n        filled_orders = await client.get_all_broker_orders(\n            filters=OrdersFilter(status=\"filled\")\n        )\n        print(f\"Total filled orders: {len(filled_orders)}\")\n        \n        # Get all positions\n        positions = await client.get_all_broker_positions()\n        print(f\"Total positions: {len(positions)}\")\n        \n        # Get accounts with cash balance\n        accounts = await client.get_all_broker_accounts()\n        for account in accounts:\n            cash = account.cash_balance or 0.0\n            print(f\"{account.account_name}: ${cash:,.2f}\")\n            \n    except Exception as e:\n        print(f\"Error: {e}\")\n    finally:\n        await client.close()\n\nif __name__ == \"__main__\":\n    asyncio.run(main())\n```\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details. \n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Python SDK for Finatic Server API",
    "version": "0.1.2",
    "project_urls": {
        "Documentation": "https://docs.finatic.com/python",
        "Homepage": "https://github.com/finatic/finatic-server-python",
        "Issues": "https://github.com/finatic/finatic-server-python/issues",
        "Repository": "https://github.com/finatic/finatic-server-python"
    },
    "split_keywords": [
        "finatic",
        " trading",
        " finance",
        " api",
        " sdk"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d58d36ae6c3e6fa0bc2fa42ba27a5b189076bf0aa2dd50a211ceca8e09129596",
                "md5": "9f3367211bebe8fba1d7439b0a32ddc6",
                "sha256": "b60aa111f9210c345c160f699e283310ca88b60e3f62038a4a27a3343d1b0266"
            },
            "downloads": -1,
            "filename": "finatic_server_python-0.1.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "9f3367211bebe8fba1d7439b0a32ddc6",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8.1",
            "size": 27416,
            "upload_time": "2025-08-31T16:46:48",
            "upload_time_iso_8601": "2025-08-31T16:46:48.674636Z",
            "url": "https://files.pythonhosted.org/packages/d5/8d/36ae6c3e6fa0bc2fa42ba27a5b189076bf0aa2dd50a211ceca8e09129596/finatic_server_python-0.1.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "93ff75b7c983b792680bf0f67208054464ec1f8dd543b5898b61b985ed4485d1",
                "md5": "879096f93c65377ec7f5647d854c35d8",
                "sha256": "4f6cea29cf2f16830f7410d1844ae9ad6abdd570e6f9d962dd73e68a687d2a41"
            },
            "downloads": -1,
            "filename": "finatic_server_python-0.1.2.tar.gz",
            "has_sig": false,
            "md5_digest": "879096f93c65377ec7f5647d854c35d8",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8.1",
            "size": 26496,
            "upload_time": "2025-08-31T16:46:49",
            "upload_time_iso_8601": "2025-08-31T16:46:49.842065Z",
            "url": "https://files.pythonhosted.org/packages/93/ff/75b7c983b792680bf0f67208054464ec1f8dd543b5898b61b985ed4485d1/finatic_server_python-0.1.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-31 16:46:49",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "finatic",
    "github_project": "finatic-server-python",
    "github_not_found": true,
    "lcname": "finatic-server-python"
}
        
Elapsed time: 1.32512s