From 88c9f50371cbeb9093cb52555b01265e755b870e Mon Sep 17 00:00:00 2001 From: Celes Renata Date: Thu, 16 Apr 2026 01:33:35 +0000 Subject: [PATCH] fix: treat 404 on Alpaca positions endpoint as empty result Alpaca returns 404 when you don't hold a position in a ticker. The ingestion worker was logging this as an error and incrementing the failure count. Now returns an empty items list instead, since 'no position' is a valid state, not an error. --- services/adapters/broker_adapter.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/services/adapters/broker_adapter.py b/services/adapters/broker_adapter.py index d70a53c..8641022 100644 --- a/services/adapters/broker_adapter.py +++ b/services/adapters/broker_adapter.py @@ -364,6 +364,19 @@ class AlpacaBrokerAdapter(BrokerDataAdapter): ) except httpx.HTTPStatusError as e: elapsed_ms = (time.monotonic() - t0) * 1000 + # 404 on positions endpoint means no position held — not an error + if e.response is not None and e.response.status_code == 404 and endpoint == "positions": + return AdapterResult( + source_type="broker", + ticker=ticker, + items=[], + raw_payload=b"[]", + content_hash=hashlib.sha256(b"[]").hexdigest(), + fetched_at=datetime.now(timezone.utc), + http_status=404, + response_time_ms=round(elapsed_ms, 1), + metadata={"provider": "alpaca", "mode": self._mode.value, "endpoint": endpoint}, + ) logger.error("Alpaca HTTP error for %s: %s", ticker, e) return self._error_result( ticker, str(e), elapsed_ms,