# Data Provider Endpoint Migration Guide ## Overview All data provider API endpoints have been centralized in the `config` crate to enable environment-specific configurations and eliminate hardcoded URLs. ## Environment Detection The system automatically detects the environment from the `FOXHUNT_ENV` environment variable: - `development` or unset: Development environment (default) - `staging` or `stage`: Staging environment - `production` or `prod`: Production environment ```bash export FOXHUNT_ENV=production ``` ## Environment Variables ### Databento Configuration | Variable | Default (Dev/Prod) | Default (Staging) | Description | |----------|-------------------|-------------------|-------------| | `DATABENTO_WS_URL` | `wss://gateway.databento.com/v0/subscribe` | `wss://staging-gateway.databento.com/v0/subscribe` | WebSocket endpoint | | `DATABENTO_HTTP_URL` | `https://hist.databento.com` | `https://staging-hist.databento.com` | Historical data API | | `DATABENTO_API_KEY` | - | - | API key for authentication | ### Benzinga Configuration | Variable | Default (Dev/Prod) | Default (Staging) | Description | |----------|-------------------|-------------------|-------------| | `BENZINGA_WS_URL` | `wss://api.benzinga.com/api/v1/stream` | `wss://staging-api.benzinga.com/api/v1/stream` | WebSocket endpoint | | `BENZINGA_API_URL` | `https://api.benzinga.com/api/v2` | `https://staging-api.benzinga.com/api/v2` | REST API base URL | | `BENZINGA_API_KEY` | - | - | API key for authentication | ### Alpaca Configuration | Variable | Default (Dev/Staging) | Default (Prod) | Description | |----------|----------------------|----------------|-------------| | `ALPACA_TRADING_URL` | `https://paper-api.alpaca.markets` | `https://api.alpaca.markets` | Trading API | | `ALPACA_DATA_URL` | `https://data.alpaca.markets` | `https://data.alpaca.markets` | Market data API | ### Interactive Brokers Gateway Configuration | Variable | Default (Dev/Staging) | Default (Prod) | Description | |----------|----------------------|----------------|-------------| | `IB_GATEWAY_HOST` | `127.0.0.1` | `127.0.0.1` | Gateway host | | `IB_GATEWAY_PORT` | `7497` | `7496` | Gateway port (7497=paper, 7496=live) | | `IB_CLIENT_ID` | `1` | `1` | Client identifier | | `IB_ACCOUNT_ID` | `DU123456` | `DU123456` | Account ID | ## Example Environment Configurations ### Development (.env.dev) ```bash FOXHUNT_ENV=development DATABENTO_API_KEY=your_dev_key BENZINGA_API_KEY=your_dev_key IB_GATEWAY_PORT=7497 # Paper trading ``` ### Staging (.env.staging) ```bash FOXHUNT_ENV=staging DATABENTO_WS_URL=wss://staging-gateway.databento.com/v0/subscribe DATABENTO_HTTP_URL=https://staging-hist.databento.com DATABENTO_API_KEY=your_staging_key BENZINGA_API_KEY=your_staging_key IB_GATEWAY_PORT=7497 # Paper trading ``` ### Production (.env.prod) ```bash FOXHUNT_ENV=production DATABENTO_API_KEY=your_prod_key BENZINGA_API_KEY=your_prod_key IB_GATEWAY_PORT=7496 # Live trading ``` ## Code Migration ### Before (Hardcoded) ```rust // Old approach with hardcoded endpoint let config = BenzingaStreamingConfig { api_key: env::var("BENZINGA_API_KEY").unwrap(), websocket_url: "wss://api.benzinga.com/api/v1/stream".to_string(), // ... other config }; ``` ### After (Config-Based) ```rust // New approach using config crate use config::BenzingaEndpoints; let config = BenzingaStreamingConfig { api_key: env::var("BENZINGA_API_KEY").unwrap(), websocket_url: BenzingaEndpoints::default().websocket_url, // ... other config }; // Or use Default trait which automatically uses config let config = BenzingaStreamingConfig::default(); ``` ## Programmatic Configuration You can also configure endpoints programmatically without environment variables: ```rust use config::{DataProviderConfig, DataProviderEnvironment}; // Create configuration for specific environment let config = DataProviderConfig::for_environment( DataProviderEnvironment::Production ); // Access specific endpoints println!("Databento WS: {}", config.databento.websocket_url); println!("Benzinga API: {}", config.benzinga.api_base_url); println!("Alpaca Trading: {}", config.alpaca.trading_base_url); println!("IB Gateway: {}:{}", config.ib_gateway.host, config.ib_gateway.port); ``` ## Testing with Custom Endpoints For testing, you can override any endpoint: ```bash # Use custom test endpoints export DATABENTO_WS_URL=wss://test.example.com/ws export DATABENTO_HTTP_URL=https://test.example.com/api export BENZINGA_WS_URL=wss://mock.benzinga.test/stream ``` ## Benefits 1. **Environment Separation**: Easy switching between dev/staging/prod 2. **No Hardcoded URLs**: All endpoints configurable 3. **Sensible Defaults**: Production-ready defaults out of the box 4. **Type Safety**: Configuration errors caught at compile time 5. **Centralized Management**: Single source of truth for all endpoints 6. **Easy Testing**: Override endpoints for integration tests ## Verification Verify your configuration is working: ```rust use config::DataProviderConfig; let config = DataProviderConfig::default(); println!("Environment: {:?}", config.environment); println!("Databento WebSocket: {}", config.databento.websocket_url); println!("Benzinga WebSocket: {}", config.benzinga.websocket_url); println!("Alpaca Trading: {}", config.alpaca.trading_base_url); ``` ## Troubleshooting ### Issue: Wrong Environment Detected **Solution**: Explicitly set `FOXHUNT_ENV`: ```bash export FOXHUNT_ENV=production ``` ### Issue: Using Wrong Endpoints **Solution**: Check environment variables are loaded: ```bash env | grep -E "DATABENTO|BENZINGA|ALPACA|IB_" ``` ### Issue: Port Conflicts (IB Gateway) **Solution**: Ensure correct port for environment: - Development/Staging: Port 7497 (paper trading) - Production: Port 7496 (live trading) ## Migration Checklist - [ ] Set `FOXHUNT_ENV` environment variable - [ ] Configure API keys for each provider - [ ] Verify endpoint URLs match your environment - [ ] Test connection to each data provider - [ ] Update deployment scripts with new environment variables - [ ] Document custom endpoints if using non-standard URLs - [ ] Run integration tests to verify connectivity ## Support For issues or questions about endpoint configuration, refer to: - `config/src/data_providers.rs` - Source configuration code - `CLAUDE.md` - Architecture documentation - Configuration test suite: `cargo test -p config data_providers`