HKUDS/Vibe-Trading · error · Trading212APIError
Trading 212 request failed: {exc}
Error message
Trading 212 request failed: {exc} What it means
Raised by _request when the underlying requests HTTP call raises RequestException — DNS failure, connection refused, timeout (config.timeout), TLS errors, etc. The original exception is chained for diagnosis.
Source
Thrown at agent/src/trading/connectors/trading212/sdk.py:427
url = urljoin(f"{config.base_url.rstrip('/')}/", path.lstrip("/"))
headers = {"Accept": "application/json"}
auth = None
if config.api_secret:
auth = (config.api_key, config.api_secret)
else:
headers["Authorization"] = config.api_key
try:
response = requests.request(
method.upper(),
url,
headers=headers,
auth=auth,
params=dict(params or {}),
timeout=config.timeout,
)
except requests.RequestException as exc:
raise Trading212APIError(f"Trading 212 request failed: {exc}") from exc
if response.status_code in (401, 403):
raise Trading212APIError("Trading 212 API authentication failed: check api_key/api_secret.")
if response.status_code >= 400:
raise Trading212APIError(f"Trading 212 API returned HTTP {response.status_code}: {_error_message(response)}")
if not response.content:
return None
try:
return response.json()
except ValueError as exc:
raise Trading212APIError("Trading 212 API returned invalid JSON.") from exc
def _error_message(response: requests.Response) -> str:
try:
payload = response.json()
except ValueError:
return response.text.strip() or response.reason or "request failed"View on GitHub (pinned to 80ffdda44c)
Solutions
- Check the chained exception message for the concrete cause (DNS, refused, timeout)
- Verify config.base_url is correct and reachable (curl it from the same host)
- Increase config.timeout if the cause is a timeout
- Fix proxy/firewall/VPN rules if connectivity is blocked; add retry with backoff for transient failures
Example fix
# before config = load_config() # base_url = "https://api.trading212.example" # after: set the correct base_url and a larger timeout config = replace(config, base_url="https://api.trading212.com", timeout=30) save_config(config)
Defensive patterns
Strategy: retry
Validate before calling
import socket
from urllib.parse import urlsplit
def base_url_reachable(base_url: str, timeout: float = 5.0) -> bool:
parts = urlsplit(base_url)
try:
socket.create_connection((parts.hostname, parts.port or 443), timeout=timeout).close()
except OSError:
return False
return True Try / catch
try:
data = get_account_snapshot(config)
except Trading212APIError as exc:
if not str(exc).startswith("Trading 212 request failed"):
raise # not a transport error
logger.warning("transport error, retrying: %s", exc)
data = get_account_snapshot(config) # or backoff loop Prevention
- Set a realistic config.timeout for slow endpoints
- Wrap polling loops with exponential backoff on transport errors
- Validate base_url format and reachability during connector setup
When it happens
Trigger: Any _get call when config.base_url is unreachable or wrong (DNS failure, wrong host, https vs http mismatch), the network is down, a proxy blocks the request, or the server takes longer than config.timeout to respond.
Common situations: Typo in base_url in the saved config; corporate proxy/VPN blocking api.trading212.com; sandbox vs production URL mix-up; timeout too small for slow account endpoints; intermittent connectivity in CI.
Related errors
- Slack Socket Mode WebSocket connect timed out
- network error: {last_exc}
- Trading 212 API returned HTTP {response.status_code}: {_erro
- Trading 212 API returned invalid JSON.
- signal-cli daemon check returned status {response.status_cod
AI-assisted analysis of HKUDS/Vibe-Trading@80ffdda44c (2026-08-28).
Data as JSON: /api/errors/17a0bc0621075cfa.
Report an issue: GitHub.