Store your OpenAI / Anthropic / Bedrock credentials once, then forward them server-side on every request
A Provider Key is an upstream LLM credential (e.g. sk-... for OpenAI, sk-ant-... for Anthropic) that you store with PromptGuard once. The gateway then attaches it as the Authorization header when forwarding to the provider, replacing whatever your app sends.This is the single biggest reason teams use PromptGuard in front of their LLM provider: your application code never embeds a vendor key, your CI never leaks one, and key rotation is a one-click operation in the dashboard instead of a multi-service deploy.
You’re proxying through /api/v1/proxy/... endpoints (PromptGuard forwards to the upstream provider on your behalf).
You want a single rotation point for your vendor credential.
You don’t want browser/mobile clients to ever see the upstream key.
You’re running multi-tenant inference and want PromptGuard to pick the right key per project.
You’re only calling /api/v1/guard to evaluate prompts before/after your own LLM call. PromptGuard never touches the upstream — there’s nothing to forward.
You’re using a self-hosted model (vLLM, Ollama) where the credential is provided by the network layer.
You call Bedrock with an AWS SDK and your own IAM credentials — use auto-instrumentation instead of the proxy.
Open Dashboard → Gateway → Provider Keys → Add Provider Key, pick the provider, paste the key, give it a name. The key is encrypted at rest and the plaintext is never written to logs. Provider keys are stored reversibly because the proxy has to present the real credential to OpenAI or Anthropic on your behalf — unlike your PromptGuard API keys, which are stored as a one-way digest and shown only once, since we never need to read them back.
# Or via the API:curl -X POST https://api.promptguard.co/dashboard/provider-keys \ -H "Authorization: Bearer $DASHBOARD_TOKEN" \ -H "X-CSRF-Token: $CSRF" \ -H "Content-Type: application/json" \ -d '{ "provider": "openai", "name": "Production OpenAI", "key": "sk-proj-..." }'
openai, anthropic, gemini, mistral, azure_openai, cohere, huggingface,
bedrock, openai_compatible.bedrock and openai_compatible keys carry the host they may be sent to in
base_url, and it is required for both: for bedrock it is the AWS region
the key is for (see AWS Bedrock),
for openai_compatible the service’s endpoint (see OpenAI-compatible
hosts). A key without one could
never be sent anywhere, so it is refused with a 400 — on creation, and on a
PATCH that sets base_url to an empty string. The dashboard form asks for it
when you pick either provider, as AWS region or Base URL. On
PromptGuard Cloud an openai_compatible host must be on the public internet;
OpenAI-compatible hosts
says what is refused, and where private hosts are allowed.One more value is accepted that is not an LLM provider: pagerduty, for the
Events API v2 integration key a PagerDuty alert
destination authenticates with. It is stored
the same way — encrypted, prefix-only afterwards — and is never used to
forward a request; the destination references it by id. A base_url is
refused for it.
google is accepted on input as a deprecated alias for gemini and is normalised before storage, so a key you stored as google reads back as gemini. Use gemini in new code. Any other value is rejected — the list exists so a provider name the proxy cannot resolve never reaches a row.
The response carries the plaintext key this once, with the key’s id, its base_url and the masked prefix (the first 7 and last 4 characters) that lists show from then on. To see the plaintext again use the reveal endpoint — the action is audit-logged.
Returns the decrypted plaintext key. This action writes an audit-log entry (provider_key.reveal) recording the actor, IP, and timestamp. Use it for break-glass recovery, not as a runtime fetch path — fetching the plaintext on every request defeats the purpose of having PromptGuard hold it for you.
Create a new Provider Key in the dashboard for the same provider.
Mark the old one inactive (PATCH /dashboard/provider-keys/{old_id} with is_active=false) — don’t delete it yet. New traffic will pick up the new key on the next request thanks to step 1 of resolution order.
Watch the dashboard for failed upstream calls for one rotation cycle.
Delete the old key. The audit log retains the deletion event for your retention period.
No application redeploy required.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"PromptGuard","description":"AI security firewall. Protect LLM applications from prompt injection, data leaks, jailbreaks, and PII exposure.","colors":{"primary":"#3B82F6","light":"#60A5FA","dark":"#1D4ED8"},"logo":{"light":"https://mintcdn.com/promptguard/sBVZPqZYn263LC-L/logo/light.svg?fit=max\u0026auto=format\u0026n=sBVZPqZYn263LC-L\u0026q=85\u0026s=8bf0b3b1f4e6fcd571bd4fefce2cda92","dark":"https://mintcdn.com/promptguard/sBVZPqZYn263LC-L/logo/dark.svg?fit=max\u0026auto=format\u0026n=sBVZPqZYn263LC-L\u0026q=85\u0026s=5448b21f857c43e1208ae10e3d2b09e7","href":"https://promptguard.co"},"favicon":{"light":"https://mintcdn.com/promptguard/spb60-yqv9beaOFS/favicon.ico?fit=max\u0026auto=format\u0026n=spb60-yqv9beaOFS\u0026q=85\u0026s=ccf87036090bd89bb275dd47d8e66cac","dark":"https://mintcdn.com/promptguard/spb60-yqv9beaOFS/favicon.ico?fit=max\u0026auto=format\u0026n=spb60-yqv9beaOFS\u0026q=85\u0026s=ccf87036090bd89bb275dd47d8e66cac"},"api":{"playground":{"display":"interactive"},"mdx":{"server":"https://api.promptguard.co"}},"background":{"decoration":"gradient"},"navbar":{"links":[{"href":"https://promptguard.co/contact","label":"Support"}],"primary":{"type":"button","label":"Get API Key","href":"https://app.promptguard.co"}},"footer":{"socials":{"twitter":"https://x.com/PromptGuardco","linkedin":"https://www.linkedin.com/company/promptguardco"},"links":[{"items":[{"label":"Dashboard","href":"https://app.promptguard.co"},{"label":"Pricing","href":"https://promptguard.co/pricing"},{"label":"Changelog","href":"/changelog"}]},{"items":[{"label":"Quick Start","href":"/quickstart"},{"label":"API Reference","href":"/api-reference/introduction"},{"label":"Python SDK","href":"/guides/python-sdk"},{"label":"Node.js SDK","href":"/guides/node-sdk"},{"label":"CLI","href":"/tools/cli"}]},{"items":[{"label":"Blog","href":"https://promptguard.co/blog"},{"label":"Support","href":"https://promptguard.co/contact"},{"label":"Terms","href":"https://promptguard.co/terms"},{"label":"Privacy","href":"https://promptguard.co/privacy"}]},{"items":[{"label":"llms.txt","href":"https://docs.promptguard.co/llms.txt"},{"label":"llms-full.txt","href":"https://docs.promptguard.co/llms-full.txt"}]}]},"search":{},"seo":{"metatags":{"og:type":"website","og:site_name":"PromptGuard Docs"},"indexing":"navigable"},"styling":{"eyebrows":"breadcrumbs","codeblocks":"system","latex":true},"contextual":{"options":["copy","chatgpt","claude","perplexity","add-mcp","cursor","vscode"],"display":"header"},"interaction":{"drilldown":true},"metadata":{"timestamp":false},"navigation":{"global":{"anchors":[{"anchor":"Dashboard","icon":"rectangle-terminal","href":"https://app.promptguard.co"},{"anchor":"Blog","icon":"newspaper","href":"https://promptguard.co/blog"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"promptguard","hasAudioNarration":false,"actualSubdomain":"promptguard","customDomains":["docs.promptguard.co"],"gitSource":{"type":"github","owner":"acebot712","repo":"promptguard","deployBranch":"main","contentDirectory":"apps/docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adc5ac3ec11231861735a76","collectionId":"1d0ed9ca-1c95-451b-936b-235c7929f8ee","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adc5ac3ec11231861735a76"},"entitlements":{},"buildId":"6adc5ac3ec11231861735a76","clientVersion":"0.0.3990","searchFilterCounts":[{"language":"default","tag":"Documentation","count":98},{"language":"default","tag":"API Reference","count":70},{"language":"default","tag":"Integrations","count":22},{"language":"default","tag":"LLM Providers","count":13},{"language":"default","tag":"Shadow AI","count":13},{"language":"default","tag":"Core Concepts","count":12},{"language":"default","tag":"Gateway","count":9},{"language":"default","tag":"Guides","count":9},{"language":"default","tag":"Platform","count":9},{"language":"default","tag":"agent","count":9}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"#banner{background:linear-gradient(135deg,#1e3a5f 0,#1d4ed8 50%,#3b82f6 100%)}#banner a{color:#93c5fd;text-decoration:underline;text-underline-offset:2px}#banner a:hover{color:#bfdbfe}"}],"page":{"pagePath":"gateway/provider-keys","slug":"/gateway/provider-keys","pageMetadata":{"title":"Provider Keys","description":"Store your OpenAI / Anthropic / Bedrock credentials once, then forward them server-side on every request","href":"/gateway/provider-keys"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Store your OpenAI / Anthropic / Bedrock credentials once, then forward them server-side on every request\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Note,Tab,Tabs}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`A `,_jsx(_components.strong,{children:`Provider Key`}),` is an upstream LLM credential (e.g. `,_jsx(_components.code,{children:`sk-...`}),` for OpenAI, `,_jsx(_components.code,{children:`sk-ant-...`}),` for Anthropic) that you store with PromptGuard once. The gateway then attaches it as the `,_jsx(_components.code,{children:`Authorization`}),` header when forwarding to the provider, replacing whatever your app sends.`]}),`\n`,_jsx(_components.p,{children:`This is the single biggest reason teams use PromptGuard in front of their LLM provider: your application code never embeds a vendor key, your CI never leaks one, and key rotation is a one-click operation in the dashboard instead of a multi-service deploy.`}),`\n`,_jsx(Heading,{level:`2`,id:`when-you-need-this-vs-when-you-don’t`,children:`When you need this vs. when you don’t`}),`\n`,_jsxs(Tabs,{children:[_jsx(Tab,{title:`Use Provider Keys`,id:`use-provider-keys`,children:_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`You’re proxying through `,_jsx(_components.code,{children:`/api/v1/proxy/...`}),` endpoints (PromptGuard forwards to the upstream provider on your behalf).`]}),`\n`,_jsx(_components.li,{children:`You want a single rotation point for your vendor credential.`}),`\n`,_jsx(_components.li,{children:`You don’t want browser/mobile clients to ever see the upstream key.`}),`\n`,_jsx(_components.li,{children:`You’re running multi-tenant inference and want PromptGuard to pick the right key per project.`}),`\n`]})}),_jsx(Tab,{title:`Skip Provider Keys`,id:`skip-provider-keys`,children:_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`You’re only calling `,_jsx(_components.code,{children:`/api/v1/guard`}),` to evaluate prompts before/after your own LLM call. PromptGuard never touches the upstream — there’s nothing to forward.`]}),`\n`,_jsx(_components.li,{children:`You’re using a self-hosted model (vLLM, Ollama) where the credential is provided by the network layer.`}),`\n`,_jsxs(_components.li,{children:[`You call Bedrock with an AWS SDK and your own IAM credentials — use `,_jsx(_components.a,{href:`/integrations/providers/bedrock`,children:`auto-instrumentation`}),` instead of the proxy.`]}),`\n`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`storing-a-key`,children:`Storing a key`}),`\n`,_jsxs(_components.p,{children:[`Open `,_jsx(_components.strong,{children:`Dashboard → Gateway → Provider Keys → Add Provider Key`}),`, pick the provider, paste the key, give it a name. The key is encrypted at rest and the plaintext is never written to logs. Provider keys are stored reversibly because the proxy has to present the real credential to OpenAI or Anthropic on your behalf — unlike your PromptGuard API keys, which are stored as a one-way digest and shown only once, since we never need to read them back.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`10`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`10`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Or via the API:`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://api.promptguard.co/dashboard/provider-keys`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$DASHBOARD_TOKEN`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"X-CSRF-Token: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$CSRF`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"provider\": \"openai\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"name\": \"Production OpenAI\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"key\": \"sk-proj-...\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` }'`})}),`\n`]})})}),`\n`,_jsxs(Heading,{level:`3`,id:`accepted-provider-values`,children:[`Accepted `,_jsx(_components.code,{children:`provider`}),` values`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`openai`}),`, `,_jsx(_components.code,{children:`anthropic`}),`, `,_jsx(_components.code,{children:`gemini`}),`, `,_jsx(_components.code,{children:`mistral`}),`, `,_jsx(_components.code,{children:`azure_openai`}),`, `,_jsx(_components.code,{children:`cohere`}),`, `,_jsx(_components.code,{children:`huggingface`}),`,\n`,_jsx(_components.code,{children:`bedrock`}),`, `,_jsx(_components.code,{children:`openai_compatible`}),`.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`bedrock`}),` and `,_jsx(_components.code,{children:`openai_compatible`}),` keys carry the host they may be sent to in\n`,_jsx(_components.code,{children:`base_url`}),`, and it is required for both: for `,_jsx(_components.code,{children:`bedrock`}),` it is the AWS region\nthe key is for (see `,_jsx(_components.a,{href:`/integrations/providers/bedrock#through-the-proxy`,children:`AWS Bedrock`}),`),\nfor `,_jsx(_components.code,{children:`openai_compatible`}),` the service’s endpoint (see `,_jsx(_components.a,{href:`/integrations/providers/openai-compatible`,children:`OpenAI-compatible\nhosts`}),`). A key without one could\nnever be sent anywhere, so it is refused with a `,_jsx(_components.code,{children:`400`}),` — on creation, and on a\n`,_jsx(_components.code,{children:`PATCH`}),` that sets `,_jsx(_components.code,{children:`base_url`}),` to an empty string. The dashboard form asks for it\nwhen you pick either provider, as `,_jsx(_components.strong,{children:`AWS region`}),` or `,_jsx(_components.strong,{children:`Base URL`}),`. On\nPromptGuard Cloud an `,_jsx(_components.code,{children:`openai_compatible`}),` host must be on the public internet;\n`,_jsx(_components.a,{href:`/integrations/providers/openai-compatible#1-store-the-key-with-its-host`,children:`OpenAI-compatible hosts`}),`\nsays what is refused, and where private hosts are allowed.`]}),`\n`,_jsxs(_components.p,{children:[`One more value is accepted that is not an LLM provider: `,_jsx(_components.code,{children:`pagerduty`}),`, for the\nEvents API v2 integration key a `,_jsx(_components.a,{href:`/platform/webhooks#pagerduty`,children:`PagerDuty alert\ndestination`}),` authenticates with. It is stored\nthe same way — encrypted, prefix-only afterwards — and is never used to\nforward a request; the destination references it by `,_jsx(_components.code,{children:`id`}),`. A `,_jsx(_components.code,{children:`base_url`}),` is\nrefused for it.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`google`}),` is accepted on input as a `,_jsx(_components.strong,{children:`deprecated alias`}),` for `,_jsx(_components.code,{children:`gemini`}),` and is normalised before storage, so a key you stored as `,_jsx(_components.code,{children:`google`}),` reads back as `,_jsx(_components.code,{children:`gemini`}),`. Use `,_jsx(_components.code,{children:`gemini`}),` in new code. Any other value is rejected — the list exists so a provider name the proxy cannot resolve never reaches a row.`]})}),`\n`,_jsxs(_components.p,{children:[`The response carries the plaintext `,_jsx(_components.code,{children:`key`}),` this once, with the key’s `,_jsx(_components.code,{children:`id`}),`, its `,_jsx(_components.code,{children:`base_url`}),` and the masked `,_jsx(_components.code,{children:`prefix`}),` (the first 7 and last 4 characters) that lists show from then on. To see the plaintext again use the `,_jsx(_components.a,{href:`#revealing-an-existing-key`,children:`reveal endpoint`}),` — the action is audit-logged.`]}),`\n`,_jsx(Heading,{level:`2`,id:`resolution-order`,children:`Resolution order`}),`\n`,_jsx(_components.p,{children:`When PromptGuard needs to forward a proxy request, it picks a Provider Key in this priority:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`The most recently created `,_jsx(_components.strong,{children:`active`}),` key for the request’s project + provider.`]}),`\n`,_jsxs(_components.li,{children:[`If no project-scoped key exists, the most recently created active key for the `,_jsx(_components.strong,{children:`user`}),` + provider.`]}),`\n`,_jsxs(_components.li,{children:[`If neither exists, the request’s own `,_jsx(_components.code,{children:`Authorization`}),` header is forwarded as-is.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`This matches the access-list scoping model: project rules win, user-wide rules are the safety net.`}),`\n`,_jsx(Heading,{level:`2`,id:`revealing-an-existing-key`,children:`Revealing an existing key`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://api.promptguard.co/dashboard/provider-keys/`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$KEY_ID`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/reveal`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$DASHBOARD_TOKEN`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Returns the decrypted plaintext key. This action writes an audit-log entry (`,_jsx(_components.code,{children:`provider_key.reveal`}),`) recording the actor, IP, and timestamp. Use it for break-glass recovery, not as a runtime fetch path — fetching the plaintext on every request defeats the purpose of having PromptGuard hold it for you.`]}),`\n`,_jsx(Heading,{level:`2`,id:`rotation`,children:`Rotation`}),`\n`,_jsx(_components.p,{children:`Rotation is a four-line workflow:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Create a new Provider Key in the dashboard for the same provider.`}),`\n`,_jsxs(_components.li,{children:[`Mark the old one inactive (`,_jsx(_components.code,{children:`PATCH /dashboard/provider-keys/{old_id}`}),` with `,_jsx(_components.code,{children:`is_active=false`}),`) — `,_jsx(_components.em,{children:`don’t delete it yet`}),`. New traffic will pick up the new key on the next request thanks to step 1 of resolution order.`]}),`\n`,_jsx(_components.li,{children:`Watch the dashboard for failed upstream calls for one rotation cycle.`}),`\n`,_jsx(_components.li,{children:`Delete the old key. The audit log retains the deletion event for your retention period.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`No application redeploy required.`})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"system","config":{},"pageMetadata":{"title":"Provider Keys","description":"Store your OpenAI / Anthropic / Bedrock credentials once, then forward them server-side on every request","href":"/gateway/provider-keys"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"When you need this vs. when you don’t","slug":"when-you-need-this-vs-when-you-don’t","depth":2,"children":[]},{"title":"Storing a key","slug":"storing-a-key","depth":2,"children":[{"title":"Accepted provider values","slug":"accepted-provider-values","depth":3,"children":[]}]},{"title":"Resolution order","slug":"resolution-order","depth":2,"children":[]},{"title":"Revealing an existing key","slug":"revealing-an-existing-key","depth":2,"children":[]},{"title":"Rotation","slug":"rotation","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"promptguard","siteName":"PromptGuard","title":"Provider Keys - PromptGuard","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-18T10:00:48.546Z","originalFileLocation":"gateway/provider-keys.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Store your OpenAI / Anthropic / Bedrock credentials once, then forward them server-side on every request\">\u003cmeta data-mint-head name=\"application-name\" content=\"PromptGuard\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/promptguard/qMghc8kofYAB8Q5A/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/promptguard/qMghc8kofYAB8Q5A/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/promptguard/qMghc8kofYAB8Q5A/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/promptguard/qMghc8kofYAB8Q5A/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/promptguard/qMghc8kofYAB8Q5A/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/promptguard/qMghc8kofYAB8Q5A/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/promptguard/qMghc8kofYAB8Q5A/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/promptguard/qMghc8kofYAB8Q5A/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/promptguard/qMghc8kofYAB8Q5A/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Provider Keys - PromptGuard\">\u003cmeta data-mint-head property=\"og:description\" content=\"Store your OpenAI / Anthropic / Bedrock credentials once, then forward them server-side on every request\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"PromptGuard Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.promptguard.co/gateway/provider-keys\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://promptguard.mintlify.app/_mintlify/api/og/v2?division=Gateway\u0026amp;title=Provider+Keys\u0026amp;description=Store+your+OpenAI+%2F+Anthropic+%2F+Bedrock+credentials+once%2C+then+forward+them+server-side+on+every+request\u0026amp;theme=ce8c95952c632da2fc78e486\u0026amp;signature=40c2b360d96f2e8c039d71201473be05d6a5bf7c74d887817e09a76ebdd7d184\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Provider Keys - PromptGuard\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Store your OpenAI / Anthropic / Bedrock credentials once, then forward them server-side on every request\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://promptguard.mintlify.app/_mintlify/api/og/v2?division=Gateway\u0026amp;title=Provider+Keys\u0026amp;description=Store+your+OpenAI+%2F+Anthropic+%2F+Bedrock+credentials+once%2C+then+forward+them+server-side+on+every+request\u0026amp;theme=ce8c95952c632da2fc78e486\u0026amp;signature=40c2b360d96f2e8c039d71201473be05d6a5bf7c74d887817e09a76ebdd7d184\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/promptguard/qMghc8kofYAB8Q5A/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"PromptGuard\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#3B82F6\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.promptguard.co/gateway/provider-keys\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/gateway/provider-keys.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.promptguard.co/#organization\",\"name\":\"PromptGuard\",\"url\":\"https://docs.promptguard.co\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/promptguard/sBVZPqZYn263LC-L/logo/light.svg?fit=max\u0026auto=format\u0026n=sBVZPqZYn263LC-L\u0026q=85\u0026s=8bf0b3b1f4e6fcd571bd4fefce2cda92\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.promptguard.co#website\",\"name\":\"PromptGuard\",\"url\":\"https://docs.promptguard.co\",\"publisher\":{\"@id\":\"https://docs.promptguard.co/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.promptguard.co/gateway/provider-keys#webpage\",\"url\":\"https://docs.promptguard.co/gateway/provider-keys\",\"name\":\"Provider Keys\",\"description\":\"Store your OpenAI / Anthropic / Bedrock credentials once, then forward them server-side on every request\",\"dateModified\":\"2026-10-18T10:00:48.546Z\",\"isPartOf\":{\"@id\":\"https://docs.promptguard.co#website\"},\"breadcrumb\":{\"@id\":\"https://docs.promptguard.co/gateway/provider-keys#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.promptguard.co/gateway/provider-keys#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Gateway\",\"item\":\"https://docs.promptguard.co/gateway/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Provider Keys\",\"item\":\"https://docs.promptguard.co/gateway/provider-keys\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.promptguard.co/gateway/provider-keys#article\",\"headline\":\"Provider Keys\",\"name\":\"Provider Keys\",\"description\":\"Store your OpenAI / Anthropic / Bedrock credentials once, then forward them server-side on every request\",\"url\":\"https://docs.promptguard.co/gateway/provider-keys\",\"mainEntityOfPage\":{\"@id\":\"https://docs.promptguard.co/gateway/provider-keys#webpage\"},\"dateModified\":\"2026-10-18T10:00:48.546Z\",\"publisher\":{\"@id\":\"https://docs.promptguard.co/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.promptguard.co#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"PromptGuard\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"PromptGuard","nav":{"global":{"anchors":[{"anchor":"Dashboard","icon":"rectangle-terminal","href":"https://app.promptguard.co"},{"anchor":"Blog","icon":"newspaper","href":"https://promptguard.co/blog"}]},"tabs":[{"tab":"Documentation","icon":"book-open","groups":[{"group":"Get Started","icon":"rocket","pages":[{"title":"PromptGuard","mode":"wide","href":""},{"title":"Why PromptGuard?","href":"/why-promptguard"},{"title":"Quickstart","mode":"wide","href":"/quickstart"}]},{"group":"Core Concepts","icon":"lightbulb","pages":[{"title":"Security Overview","mode":"wide","href":"/security/overview"},{"title":"What Detection Can and Cannot Do","href":"/security/detection-limits"},{"title":"Threat Detection","href":"/security/threat-detection"},{"group":"Security Policies","pages":[{"title":"Policy Presets","href":"/security/policy-presets"},{"title":"Custom Security Rules","href":"/security/custom-rules"},{"title":"Policy-as-Code","href":"/security/policy-as-code"},{"title":"When a Policy Change Takes Effect","href":"/security/policy-changes"}]},{"title":"MCP Server Security","href":"/security/mcp-security"},{"title":"Agent Trace Analysis","href":"/security/agent-traces"},{"title":"Capability Containment","href":"/security/capability-containment"},{"title":"Untrusted Content Marking","href":"/security/untrusted-content-marking"},{"title":"Agent Memory Scanning","href":"/security/memory-scanning"}]},{"group":"Gateway","icon":"shield-halved","pages":[{"title":"Gateway Overview","description":"How PromptGuard sits in front of your LLM provider and what it does on every request","href":"/gateway/overview"},{"title":"Provider Keys","href":"/gateway/provider-keys"},{"title":"Allow \u0026 Block Lists","description":"Reject or whitelist requests by source IP, CIDR block, end-user ID, or country before they hit your policy engine","href":"/gateway/access-lists"},{"title":"Routing Rules","href":"/gateway/routing-rules"},{"title":"End-User Attribution","href":"/gateway/end-users"},{"title":"Request Tags","href":"/gateway/request-tags"},{"title":"Spend Caps","href":"/gateway/spend-caps"},{"title":"Response Caching","href":"/gateway/caching"},{"title":"Fallback Models","href":"/gateway/fallback-models"}]},{"group":"Integrations","icon":"plug","pages":[{"title":"Integrations","href":"/integrations/overview"},{"title":"Auto-instrumentation","href":"/integrations/auto-instrumentation"},{"title":"SIEM export","href":"/integrations/siem-export"},{"group":"LLM Providers","pages":[{"title":"OpenAI","href":"/integrations/providers/openai"},{"title":"Anthropic","href":"/integrations/providers/anthropic"},{"title":"Google Gemini","href":"/integrations/providers/gemini"},{"title":"Azure OpenAI","href":"/integrations/providers/azure-openai"},{"title":"AWS Bedrock","href":"/integrations/providers/bedrock"},{"title":"Mistral AI","href":"/integrations/providers/mistral"},{"title":"Groq","href":"/integrations/providers/groq"},{"title":"DeepSeek","href":"/integrations/providers/deepseek"},{"title":"Cohere","href":"/integrations/providers/cohere"},{"title":"Hugging Face","href":"/integrations/providers/huggingface"},{"title":"OpenAI-compatible hosts","href":"/integrations/providers/openai-compatible"},{"title":"Ollama","href":"/integrations/providers/ollama"},{"title":"vLLM","href":"/integrations/providers/vllm"}]},{"group":"Frameworks","pages":[{"title":"LangChain","href":"/integrations/frameworks/langchain"},{"title":"LangGraph","href":"/integrations/frameworks/langgraph"},{"title":"LlamaIndex","href":"/integrations/frameworks/llamaindex"},{"title":"CrewAI","href":"/integrations/frameworks/crewai"},{"title":"FastAPI and ASGI","href":"/integrations/frameworks/fastapi"},{"title":"Vercel AI SDK","href":"/integrations/frameworks/vercel-ai"}]}]},{"group":"Shadow AI","icon":"user-shield","pages":[{"title":"Shadow AI","href":"/shadow-ai/overview"},{"title":"Get Started","href":"/shadow-ai/quickstart"},{"title":"Test It Yourself","href":"/shadow-ai/test-drive"},{"title":"Desktop Agent","href":"/shadow-ai/desktop-agent"},{"title":"Browser Extension","href":"/shadow-ai/browser-extension"},{"title":"Fleet Enrollment","href":"/shadow-ai/fleet-enrollment"},{"title":"Deployment Modes","href":"/shadow-ai/deployment-modes"},{"title":"Privacy \u0026 Data Handling","href":"/shadow-ai/privacy-data-handling"},{"title":"What Each Part of a Request Is Checked For","href":"/shadow-ai/what-is-scanned"},{"title":"Customise What Shadow AI Detects","href":"/shadow-ai/customise-policies"},{"title":"Known Limitations","href":"/shadow-ai/known-limitations"},{"title":"Troubleshooting","href":"/shadow-ai/troubleshooting"},{"title":"Uninstall \u0026 Offboarding","href":"/shadow-ai/uninstall"}]},{"group":"Guides","icon":"compass","pages":[{"title":"Python SDK","href":"/guides/python-sdk"},{"title":"Node.js SDK","href":"/guides/node-sdk"},{"title":"Streaming","href":"/guides/streaming"},{"title":"Migration from OpenAI","href":"/guides/migration-from-openai"},{"title":"MCP Server","href":"/tools/mcp"},{"title":"CLI Tool","href":"/tools/cli"},{"title":"VS Code Extension","href":"/tools/vscode"},{"title":"Cursor Plugin","href":"/tools/cursor"},{"title":"GitHub Code Scanner","href":"/tools/github-scanner"}]},{"group":"Cookbooks","icon":"book","pages":[{"title":"Chatbot Protection","href":"/cookbooks/chatbot-protection"},{"title":"Content Moderation","href":"/cookbooks/content-moderation"},{"title":"Data Privacy Protection","href":"/cookbooks/data-privacy"},{"title":"LangChain Agents","href":"/cookbooks/langchain-agents"},{"title":"RAG with PII Redaction","href":"/cookbooks/rag-pii-redaction"},{"title":"Streaming with Protection","href":"/cookbooks/streaming-protection"}]},{"group":"Platform","icon":"chart-line","pages":[{"title":"Managing Projects","href":"/platform/projects"},{"title":"Monitoring Dashboard","href":"/platform/dashboard"},{"title":"Analytics Cookbook","href":"/platform/analytics-cookbook"},{"title":"Usage Tracking","href":"/platform/usage-tracking"},{"title":"Webhooks","href":"/platform/webhooks"},{"title":"Audit Logs","href":"/platform/audit-logs"},{"title":"Organizations \u0026 Teams","href":"/platform/organizations"},{"title":"Single Sign-On (SSO)","href":"/platform/sso"},{"title":"Directory Sync (SCIM)","href":"/platform/scim"}]},{"group":"Going to Production","icon":"server","pages":[{"title":"Best Practices","href":"/production/best-practices"},{"title":"Reliability \u0026 Status","href":"/production/reliability"},{"title":"Rate Limits \u0026 Quotas","href":"/production/rate-limits"},{"title":"Latency Budgets","href":"/production/latency-budgets"},{"title":"Error Handling","href":"/production/error-handling"},{"title":"Enterprise Setup","href":"/production/enterprise-setup"},{"title":"Self-Host vs Cloud","href":"/production/self-host-vs-cloud"},{"title":"Troubleshooting","href":"/production/troubleshooting"}]},{"group":"Resources","icon":"file-lines","pages":[{"title":"Glossary","href":"/glossary"},{"title":"Compliance \u0026 Security","href":"/security/compliance"},{"title":"Third-Party Models","href":"/security/third-party-models"},{"title":"Extended Threat Coverage","href":"/security/ai-agent-traps"},{"title":"Plans \u0026 Limits","href":"/pricing"},{"title":"Changelog","href":"/changelog"}]},{"group":"Roadmap / Preview","icon":"flask","pages":[{"title":"CI/CD Security Gate","href":"/tools/ci-cd-security-gate"}]}]},{"tab":"API Reference","icon":"square-terminal","pages":[{"title":"API Reference","href":"/api-reference/introduction"}]}]},"title":"Provider Keys - PromptGuard","buildId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","deploymentId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","dynamics":[],"chunks":[]}