{"record":{"id":"7909966927004b87","repo":"BerriAI/litellm","slug":"vantage-integration-token-must-be-provided-for-van","errorCode":null,"errorMessage":"VANTAGE_INTEGRATION_TOKEN must be provided for Vantage exports","messagePattern":"VANTAGE_INTEGRATION_TOKEN must be provided for Vantage exports","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"litellm/integrations/focus/destinations/factory.py","lineNumber":65,"sourceCode":"                \"region_name\": overrides.get(\"region_name\") or os.getenv(\"FOCUS_S3_REGION_NAME\"),\n                \"endpoint_url\": overrides.get(\"endpoint_url\") or os.getenv(\"FOCUS_S3_ENDPOINT_URL\"),\n                \"aws_access_key_id\": overrides.get(\"aws_access_key_id\") or os.getenv(\"FOCUS_S3_ACCESS_KEY\"),\n                \"aws_secret_access_key\": overrides.get(\"aws_secret_access_key\") or os.getenv(\"FOCUS_S3_SECRET_KEY\"),\n                \"aws_session_token\": overrides.get(\"aws_session_token\") or os.getenv(\"FOCUS_S3_SESSION_TOKEN\"),\n            }\n            if not resolved.get(\"bucket_name\"):\n                raise ValueError(\"FOCUS_S3_BUCKET_NAME must be provided for S3 exports\")\n            return {k: v for k, v in resolved.items() if v is not None}\n        if provider == \"vantage\":\n            resolved = {\n                \"api_key\": overrides.get(\"api_key\") or os.getenv(\"VANTAGE_API_KEY\"),\n                \"integration_token\": overrides.get(\"integration_token\") or os.getenv(\"VANTAGE_INTEGRATION_TOKEN\"),\n                \"base_url\": overrides.get(\"base_url\") or os.getenv(\"VANTAGE_BASE_URL\", \"https://api.vantage.sh\"),\n            }\n            if not resolved.get(\"api_key\"):\n                raise ValueError(\"VANTAGE_API_KEY must be provided for Vantage exports\")\n            if not resolved.get(\"integration_token\"):\n                raise ValueError(\"VANTAGE_INTEGRATION_TOKEN must be provided for Vantage exports\")\n            return {k: v for k, v in resolved.items() if v is not None}\n        if provider == \"gcs\":\n            resolved = {\n                \"bucket_name\": overrides.get(\"bucket_name\") or os.getenv(\"FOCUS_GCS_BUCKET_NAME\"),\n                \"service_account_json\": overrides.get(\"service_account_json\")\n                or os.getenv(\"FOCUS_GCS_PATH_SERVICE_ACCOUNT\"),\n            }\n            if not resolved.get(\"bucket_name\"):\n                raise ValueError(\"FOCUS_GCS_BUCKET_NAME must be provided for GCS exports\")\n            return {k: v for k, v in resolved.items() if v is not None}\n        if provider == \"mavvrik\":\n            resolved = {\n                \"api_key\": overrides.get(\"api_key\") or os.getenv(\"MAVVRIK_API_KEY\"),\n                \"api_endpoint\": overrides.get(\"api_endpoint\") or os.getenv(\"MAVVRIK_API_ENDPOINT\"),\n                \"connection_id\": overrides.get(\"connection_id\") or os.getenv(\"MAVVRIK_CONNECTION_ID\"),\n            }\n            return {k: v for k, v in resolved.items() if v is not None}\n        raise NotImplementedError(f\"Provider '{provider}' not supported for Focus export configuration\")","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/BerriAI/litellm/blob/6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d/litellm/integrations/focus/destinations/factory.py#L47-L83","documentation":"For provider=\"vantage\", after the api_key check the factory also requires an integration token (resolved from overrides or VANTAGE_INTEGRATION_TOKEN). The token identifies the Vantage integration that receives the FOCUS export, so it cannot be omitted. Note it is validated after VANTAGE_API_KEY, so if both are missing you see error 401 first.","triggerScenarios":"Creating a vantage Focus destination where api_key resolves successfully but integration_token is absent from both overrides and the environment.","commonSituations":"Only VANTAGE_API_KEY was configured in deployment; the integration token was regenerated/rotated in the Vantage dashboard and the old env var removed; copy-paste of docs that only show the API key; typo VANTAGE_INTEGRATION_TOKEN vs VANTAGE_INTEGRATIONTOKEN.","solutions":["Set VANTAGE_INTEGRATION_TOKEN to the token generated for your Vantage integration.","Or pass integration_token in the destination config overrides.","Pair it with VANTAGE_API_KEY in the same secret/env block so they stay in sync."],"exampleFix":"# before\noverrides = {\"api_key\": key}  # integration_token missing\n\n# after\noverrides = {\"api_key\": key, \"integration_token\": os.environ[\"VANTAGE_INTEGRATION_TOKEN\"]}","handlingStrategy":"validation","validationCode":"import os\n\nif not (overrides.get(\"integration_token\") or os.getenv(\"VANTAGE_INTEGRATION_TOKEN\")):\n    raise SystemExit(\"VANTAGE_INTEGRATION_TOKEN missing: generate one in the Vantage dashboard\")","typeGuard":null,"tryCatchPattern":"try:\n    cfg = focus_destination_config(provider=\"vantage\", overrides=overrides)\nexcept ValueError as e:\n    if \"VANTAGE_INTEGRATION_TOKEN\" in str(e):\n        log_config_error(\"vantage\", missing=[\"integration_token\"])\n    raise","preventionTips":["Treat api_key and integration_token as one unit: validate both in a single pre-flight check.","When rotating Vantage credentials, update both env vars before restarting the exporter."],"tags":["focus","vantage","configuration","env-var","validation"],"backgroundTag":null,"analyzedSha":"6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d","analyzedAt":"2026-08-15T07:12:03.035Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}