{"record":{"id":"7dc5e8140940f010","repo":"BerriAI/litellm","slug":"integration-token-must-be-provided-for-vantage-des","errorCode":null,"errorMessage":"integration_token must be provided for Vantage destination (set VANTAGE_INTEGRATION_TOKEN env var or pass in destination_config)","messagePattern":"integration_token must be provided for Vantage destination \\(set VANTAGE_INTEGRATION_TOKEN env var or pass in destination_config\\)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"litellm/integrations/focus/destinations/vantage_destination.py","lineNumber":108,"sourceCode":"class FocusVantageDestination(FocusDestination):\n    \"\"\"Upload FOCUS CSV exports to the Vantage cost-import API.\"\"\"\n\n    def __init__(\n        self,\n        *,\n        prefix: str,\n        config: dict[str, Any] | None = None,\n    ) -> None:\n        config = config or {}\n        api_key: Final = config.get(\"api_key\")\n        integration_token: Final = config.get(\"integration_token\")\n        if not api_key:\n            raise ValueError(\n                \"api_key must be provided for Vantage destination \"\n                \"(set VANTAGE_API_KEY env var or pass in destination_config)\"\n            )\n        if not integration_token:\n            raise ValueError(\n                \"integration_token must be provided for Vantage destination \"\n                \"(set VANTAGE_INTEGRATION_TOKEN env var or pass in destination_config)\"\n            )\n        self.api_key = api_key\n        self.integration_token = integration_token\n        self.base_url = config.get(\"base_url\", \"https://api.vantage.sh\")\n        self.prefix = prefix\n\n    async def deliver(\n        self,\n        *,\n        content: bytes,\n        time_window: FocusTimeWindow,\n        filename: str,\n    ) -> None:\n        \"\"\"Upload CSV content to the Vantage API, batching if needed.\"\"\"\n        if not content:\n            verbose_logger.debug(\"Vantage destination: empty content, skipping upload\")","sourceCodeStart":90,"sourceCodeEnd":126,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/integrations/focus/destinations/vantage_destination.py#L90-L126","documentation":"FocusVantageDestination.__init__ raises this ValueError after the api_key check passes but the config dict has no integration_token. The Vantage destination needs two credentials: an api_key (VANTAGE_API_KEY) and an integration_token (VANTAGE_INTEGRATION_TOKEN). The factory resolves the token from overrides or the VANTAGE_INTEGRATION_TOKEN environment variable.","triggerScenarios":"Configuring a 'vantage' FOCUS destination with VANTAGE_API_KEY set but VANTAGE_INTEGRATION_TOKEN unset; passing only api_key in destination_config; a deployment where only one of the two secrets was added to the secret store.","commonSituations":"Following a tutorial that only mentions the API key; the integration token is a separate value generated in the Vantage UI for cost-import integrations, so it's commonly overlooked; partial secret rotation leaves only one credential set.","solutions":["Export VANTAGE_INTEGRATION_TOKEN alongside VANTAGE_API_KEY in the proxy environment.","Pass integration_token in destination_config: {'api_key': '...', 'integration_token': '...'}.","Fetch the integration token from your Vantage account (cost-import/integration settings) if you only generated the API key.","Verify neither value is an empty string before starting the proxy."],"exampleFix":"# before\ndestination_config = {'api_key': 'vt_...'}  # missing token -> ValueError\n\n# after\ndestination_config = {'api_key': 'vt_...', 'integration_token': 'it_...'}","handlingStrategy":"validation","validationCode":"import os\n\ntoken = overrides.get('integration_token') or os.getenv('VANTAGE_INTEGRATION_TOKEN')\nif not token:\n    raise SystemExit('VANTAGE_INTEGRATION_TOKEN (or integration_token override) is required for Vantage FOCUS exports')","typeGuard":"def has_vantage_credentials(config: dict) -> bool:\n    return all([\n        config.get('api_key') or os.getenv('VANTAGE_API_KEY'),\n        config.get('integration_token') or os.getenv('VANTAGE_INTEGRATION_TOKEN'),\n    ])","tryCatchPattern":null,"preventionTips":["Treat api_key + integration_token as one unit in config templates; validate both at startup.","Store both in the same secret manager path to avoid partial rotation.","Document where the integration token is generated in Vantage so on-call engineers can recover quickly."],"tags":["vantage","focus-export","credentials","configuration"],"backgroundTag":"missing-credentials","analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}