[{"data":1,"prerenderedAt":36},["ShallowReactive",2],{"post-data-leaked-openai-or-anthropic-api-key-what-to-do-in-the-first-hour":3},{"post":4,"relatedPosts":20},{"id":5,"title":6,"content":7,"hashtags":8,"coverImage":16,"createdAt":17,"seoTitle":18,"seoDescription":19},"gtj8ZGB9xnib2Od06Alb","Leaked OpenAI or Anthropic API Key? What to Do in the First Hour","\u003Ch1 class=\"western\">Leaked OpenAI or Anthropic API Key? What to Do in the First Hour\u003C\u002Fh1>\n\u003Cp>\u003Cstrong>Short answer:\u003C\u002Fstrong> revoke the key in the provider's console first. Removing it from a commit, a \u003Cspan style=\"font-family: Liberation Mono, monospace;\">.env\u003C\u002Fspan> file or a third-party tool leaves it valid for anyone who already copied it. Then issue a new key for each app that needs one, check usage for the leak window, set a spend limit that blocks requests, and only after that clean up git history and other copies.\u003C\u002Fp>\n\u003Cp>This guide covers what to do with a leaked API key from OpenAI, Anthropic or Google Gemini. Every console path and quote below was checked against the cited source on October 20, 2026. The trigger for writing it was the OpenCode Console breach, disclosed on October 17, 2026: provider keys that users had saved in the tool may have been exposed, and several users reported drained balances.\u003C\u002Fp>\n\u003Cp>A note on words. \u003Cstrong>Revoke\u003C\u002Fstrong> here means making the key unusable at the provider: OpenAI and Anthropic call this deleting the key, Google calls it disabling or deleting. \u003Cstrong>Remove\u003C\u002Fstrong> means deleting your copy of the key from a file, a repository or a tool. Only revoking stops abuse.\u003C\u002Fp>\n\u003Ch2 class=\"western\">What should you do first when an API key leaks?\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Short answer:\u003C\u002Fstrong> revoke the old key at the provider, then replace it, then measure the damage, then cap spending, then clean up. Any other order leaves the key usable while you investigate.\u003C\u002Fp>\n\u003Col>\n\u003Cli>\n\u003Cp>\u003Cstrong>Revoke the key at the provider.\u003C\u002Fstrong> Use the provider's console, because the tool or repository where the key leaked has no say over whether it still works.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Create replacement keys, one per app or environment.\u003C\u002Fstrong> If one shared key powered five services, issue five keys so the next incident can be contained to one of them.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Deploy the new keys\u003C\u002Fstrong> and confirm each service works.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Review usage for the leak window\u003C\u002Fstrong> and save what you find: requests, models, cost per key.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Set a hard spend limit\u003C\u002Fstrong>, if you do not have one. Alerts only notify you.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Contact provider support\u003C\u002Fstrong> if you see charges you did not make.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Remove the key from every place it was copied to\u003C\u002Fstrong>: git history, CI variables, chat logs, third-party tools.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>The \u003Ca href=\"https:\u002F\u002Fcheatsheetseries.owasp.org\u002Fcheatsheets\u002FSecrets_Management_Cheat_Sheet.html\">OWASP Secrets Management Cheat Sheet\u003C\u002Fa> also starts with revocation, then rotation, then removing copies:\u003C\u002Fp>\n\u003Cblockquote>\"Keys that were exposed should undergo immediate revocation.\"\u003C\u002Fblockquote>\n\u003Cp>How fast leaked keys get used is well documented for cloud credentials. In a 2023 honeypot by \u003Ca href=\"https:\u002F\u002Funit42.paloaltonetworks.com\u002Fmalicious-operations-of-exposed-iam-keys-cryptojacking\u002F\">Palo Alto Networks Unit 42\u003C\u002Fa>, an attacker found and used AWS keys pushed to GitHub within five minutes. Those were AWS keys, and while preparing this guide we found no comparable primary measurement for OpenAI or Anthropic keys in public sources. Assume the clock starts at the moment of exposure.\u003C\u002Fp>\n\u003Ch2 class=\"western\">How do you revoke a leaked OpenAI API key?\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Short answer:\u003C\u002Fstrong> delete the key on the API keys page of the OpenAI platform (platform.openai.com\u002Fapi-keys). For project keys, open organization settings, select the project and go to API Keys. Then review usage and contact OpenAI support.\u003C\u002Fp>\n\u003Cp>Under the heading \"Revoke an exposed API key\", \u003Ca href=\"https:\u002F\u002Fhelp.openai.com\u002Fen\u002Farticles\u002F8304786-how-can-i-keep-my-openai-accounts-secure\">OpenAI's help center\u003C\u002Fa> lists three steps:\u003C\u002Fp>\n\u003Cblockquote>\"1. Delete the affected key through the API key dashboard. 2. Review your API usage for unexpected activity and keep the details. 3. Contact OpenAI Support.\"\u003C\u002Fblockquote>\n\u003Cp>During an incident, three details matter:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Cstrong>Find the right key.\u003C\u002Fstrong> OpenAI projects have two kinds of keys: user keys and service account keys. Service account keys belong to the project, so removing a person from the organization does not revoke them. Check both lists.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Check whether OpenAI already disabled it.\u003C\u002Fstrong> According to OpenAI, \"when OpenAI detects an API key on the public internet, or leaked inside an app in an app store, the API key is disabled immediately.\" That covers public leaks. A key stolen from a vendor's database does not show up in public scanning, so revoke it yourself.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Restrict new long-lived keys.\u003C\u002Fstrong> In the API key governance settings, admins can allow only service account keys, only user-owned project keys, or disable new key creation. These settings apply only to new keys, so existing keys still have to be revoked one by one.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 class=\"western\">How do you revoke a leaked Anthropic API key?\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Short answer:\u003C\u002Fstrong> go to platform.claude.com\u002Fsettings\u002Fkeys, open the menu next to the key and select \"Delete API key\". To switch a key off through automation, the Admin API can set its status to inactive.\u003C\u002Fp>\n\u003Cp>The \u003Ca href=\"https:\u002F\u002Fsupport.claude.com\u002Fen\u002Farticles\u002F9767949-api-key-best-practices-keep-your-keys-safe-and-secure\">Anthropic help center\u003C\u002Fa> describes the console path:\u003C\u002Fp>\n\u003Cblockquote>\"If you suspect that your API key may be compromised, we recommend revoking the key immediately ... going to the API keys page (platform.claude.com\u002Fsettings\u002Fkeys), clicking the menu (i.e. the three horizontal dots) next to the key in question, and selecting 'Delete API key.'\"\u003C\u002Fblockquote>\n\u003Cp>When you do not know which key leaked, two Anthropic features help:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Cstrong>Workspaces.\u003C\u002Fstrong> Keys can be scoped to a single workspace. Archiving a workspace archives every API key created for it within seconds. Anthropic warns that this cannot be undone, so treat it as an emergency switch for a whole team or product.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Service accounts.\u003C\u002Fstrong> Anthropic documents that a service account key keeps working even after the user who created it is removed. If the leak came from someone's laptop, offboarding that person does not cover these keys. Check the service accounts list separately.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>In the OpenCode Console breach, Anthropic also acted on its side. Lydia Hallie from Anthropic wrote on October 17: \"We've been working with OpenCode on yesterday's breach and have revoked Claude API keys we believe were affected\" (\u003Ca href=\"https:\u002F\u002Fx.com\u002Flydiahallie\u002Fstatus\u002F2111563956666110287\">post on X\u003C\u002Fa>). She advised anyone who had saved a key in OpenCode to create a new one.\u003C\u002Fp>\n\u003Ch2 class=\"western\">How do you handle a leaked Gemini API key?\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Short answer:\u003C\u002Fstrong> generate a new key, deploy it, then disable the leaked key in the Google Cloud console and audit usage. Google orders the steps this way to avoid downtime. If the key is being abused right now, disable it first.\u003C\u002Fp>\n\u003Cp>The \u003Ca href=\"https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Fapi-key\">Gemini API documentation\u003C\u002Fa> gives this checklist:\u003C\u002Fp>\n\u003Cblockquote>\"1. Generate a new key ... 2. Update your application ... 3. Disable or delete the compromised key: Disable the leaked key in the Cloud console once the new key is verified. Do not delete the old key until the new key is fully active to avoid application downtime. 4. Audit usage.\"\u003C\u002Fblockquote>\n\u003Cp>Gemini keys differ from OpenAI and Anthropic keys in three ways:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Cstrong>GitHub does not block them on push.\u003C\u002Fstrong> In GitHub's list of supported secret patterns, \u003Cspan style=\"font-family: Liberation Mono, monospace;\">google_gemini_api_key\u003C\u002Fspan> has user alerts only, with no partner reporting and no push protection. Standard Gemini keys share the format of other Google API keys, and GitHub's \u003Cspan style=\"font-family: Liberation Mono, monospace;\">google_api_key\u003C\u002Fspan> pattern is reported to Google, but it has no push protection either. A Gemini key can reach a public repository without being stopped at push time.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Old Google Cloud API keys can be Gemini keys.\u003C\u002Fstrong> \u003Ca href=\"https:\u002F\u002Ftrufflesecurity.com\u002Fblog\u002Fgoogle-api-keys-werent-secrets-but-then-gemini-changed-the-rules\">Truffle Security reported in February 2026\u003C\u002Fa> that enabling the Gemini API on a Google Cloud project can give existing API keys in that project access to Gemini endpoints. A Maps or Firebase key embedded in a web page years ago could then call Gemini. Google now rejects unrestricted standard keys on the Gemini API, but a restricted key whose allowed APIs include Gemini still works, so check the restrictions on old keys.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Google blocks known leaked keys.\u003C\u002Fstrong> Requests with such a key fail with \"Your API key was reported as leaked. Please use another API key.\" Since May 28, 2026, new keys created in Google AI Studio are authorization keys, which Google describes as having \"fast-acting leaked key enforcement.\"\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Restrict every key you keep: in AI Studio, add a restriction to the Gemini API only. In the Cloud console, restrictions are under APIs &amp; Services, Credentials.\u003C\u002Fp>\n\u003Cblockquote>\u003Cstrong>Know where every copy of a key lives.\u003C\u002Fstrong> A key that sits in a dozen \u003Cspan style=\"font-family: Liberation Mono, monospace;\">.env\u003C\u002Fspan> files, chat threads and CI variables can take hours to rotate. \u003Ca href=\"https:\u002F\u002Fapp.ennote.io\u002F?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=leaked-ai-api-key-what-to-do&amp;utm_content=inline\">Ennote\u003C\u002Fa> keeps passwords, environment variables and API keys in one place with role-based access, so replacing a key means updating it in one place. Every access to a secret in Ennote is written to an audit log, with retention depending on the plan. The Developer plan is free.\u003C\u002Fblockquote>\n\u003Ch2 class=\"western\">Should you revoke now or create the new key first?\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Short answer:\u003C\u002Fstrong> if there are signs of abuse, or the key was public, revoke now and accept a short outage. If the exposure is contained, for example a key that appeared in a private log, create and deploy the replacement first, then revoke within minutes.\u003C\u002Fp>\n\u003Cp>OpenAI and Anthropic say revoke immediately. Google says replace first, then disable. The right order depends on the situation:\u003C\u002Fp>\n\u003Ctable width=\"100%\" cellspacing=\"0\" cellpadding=\"4\">\u003Ccolgroup>\u003Ccol width=\"85*\">\u003Ccol width=\"85*\">\u003Ccol width=\"85*\">\u003C\u002Fcolgroup>\n\u003Cthead>\n\u003Ctr valign=\"top\">\n\u003Cth style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0.04in 0in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Situation\u003C\u002Fp>\n\u003C\u002Fth>\n\u003Cth style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0.04in 0in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Order\u003C\u002Fp>\n\u003C\u002Fth>\n\u003Cth style=\"border: 1px solid #000000; padding: 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Why\u003C\u002Fp>\n\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr valign=\"top\">\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Key is in a public repo, a client-side bundle or a breached third-party tool\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Revoke first, then replace\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding: 0in 0.04in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Every minute of exposure can be billed to you\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr valign=\"top\">\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Usage graph shows requests you did not make\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Revoke first, then replace\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding: 0in 0.04in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Abuse is already happening\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr valign=\"top\">\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Key appeared in a private log or internal chat, no unusual usage\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Replace first, revoke right after deploy\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding: 0in 0.04in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Low exposure; downtime costs more\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr valign=\"top\">\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Key is shared by many services and you do not know all of them\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Revoke first\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding: 0in 0.04in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Waiting until you find every consumer can take hours\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Cbr>\u003Cbr>\u003C\u002Fp>\n\u003Cp>The last row needs preparation. If you cannot list every service that uses a key, that list is the first thing to fix after the incident. Anthropic recommends separate keys per environment and use case, so that you can \"quickly disable just that use case.\"\u003C\u002Fp>\n\u003Ch2 class=\"western\">How do you find out what the leaked key cost you?\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Short answer:\u003C\u002Fstrong> open the provider's usage page for the period since the key leaked, filter by key or project where possible, and export what you see before you talk to support.\u003C\u002Fp>\n\u003Ctable width=\"100%\" cellspacing=\"0\" cellpadding=\"4\">\u003Ccolgroup>\u003Ccol width=\"85*\">\u003Ccol width=\"85*\">\u003Ccol width=\"85*\">\u003C\u002Fcolgroup>\n\u003Cthead>\n\u003Ctr valign=\"top\">\n\u003Cth style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0.04in 0in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Provider\u003C\u002Fp>\n\u003C\u002Fth>\n\u003Cth style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0.04in 0in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Where to look\u003C\u002Fp>\n\u003C\u002Fth>\n\u003Cth style=\"border: 1px solid #000000; padding: 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Useful detail\u003C\u002Fp>\n\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr valign=\"top\">\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">OpenAI\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">platform.openai.com\u002Fusage\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding: 0in 0.04in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Keys created before December 20, 2023 may show usage as \"Untracked\" unless tracking was enabled\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr valign=\"top\">\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Anthropic\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">platform.claude.com\u002Fusage, \u002Fcost and \u002Flogs\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding: 0in 0.04in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">The Usage and Cost Admin API filters by API key, workspace and model; it is not available for individual accounts\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr valign=\"top\">\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Google\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Cloud Billing reports for the project\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding: 0in 0.04in 0.04in 0.04in;\" width=\"33%\">\n\u003Cp align=\"left\">Google notes that actual costs can take more than 24 hours to appear\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Cbr>\u003Cbr>\u003C\u002Fp>\n\u003Cp>What to save for support: the key name or ID (never the key itself), when it was created, when it leaked, when you revoked it, and the requests or costs you do not recognize.\u003C\u002Fp>\n\u003Cp>Report unrecognized charges to the provider's support with that evidence. Any refund is the provider's decision. After the OpenCode Console breach, users publicly reported unauthorized charges from under 200 to about 1,700 dollars per account (\u003Ca href=\"https:\u002F\u002Fdealroom.co\u002Fnews\u002F163473-opencode-breach-drains-users-ai-keys-as-platforms-holding-customer-crede\u002F\">Dealroom\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fnews.ycombinator.com\u002Fitem?id=50141661\">Hacker News\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ch2 class=\"western\">How do you cap spending before the next leak?\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Short answer:\u003C\u002Fstrong> set a hard limit. On OpenAI that is \"Enforce a hard limit\" in organization or project limits. On Anthropic it is a spend limit on the Billing page. On Google Cloud it is a spend cap budget, which is separate from a regular budget.\u003C\u002Fp>\n\u003Cp>An alert is easy to mistake for a cap. \u003Ca href=\"https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fspend-limits\">OpenAI's documentation\u003C\u002Fa> says it directly: \"Spend alerts do not enforce a cap.\" Google's regular budgets are alerts-only too.\u003C\u002Fp>\n\u003Ctable width=\"100%\" cellspacing=\"0\" cellpadding=\"4\">\u003Ccolgroup>\u003Ccol width=\"64*\">\u003Ccol width=\"64*\">\u003Ccol width=\"64*\">\u003Ccol width=\"64*\">\u003C\u002Fcolgroup>\n\u003Cthead>\n\u003Ctr valign=\"top\">\n\u003Cth style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0.04in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">Provider\u003C\u002Fp>\n\u003C\u002Fth>\n\u003Cth style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0.04in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">Setting that blocks requests\u003C\u002Fp>\n\u003C\u002Fth>\n\u003Cth style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0.04in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">What happens at the limit\u003C\u002Fp>\n\u003C\u002Fth>\n\u003Cth style=\"border: 1px solid #000000; padding: 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">Caveat\u003C\u002Fp>\n\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr valign=\"top\">\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">OpenAI\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">Settings, Organization, Limits: Edit spend limit, Enforce a hard limit; also per project\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp>HTTP 429 \u003Cspan style=\"font-family: Liberation Mono, monospace;\">organization_spend_limit_exceeded\u003C\u002Fspan> or \u003Cspan style=\"font-family: Liberation Mono, monospace;\">project_spend_limit_exceeded\u003C\u002Fspan>\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding: 0in 0.04in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">\"Enforcement is not instantaneous,\" so spend can slightly exceed the limit\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr valign=\"top\">\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">Anthropic\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">platform.claude.com\u002Fsettings\u002Fbilling, Spend limits\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp>HTTP 400 \u003Cspan style=\"font-family: Liberation Mono, monospace;\">invalid_request_error\u003C\u002Fspan>, \"You have reached your specified API usage limits\"\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding: 0in 0.04in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">You cannot set a spend limit on the default workspace\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr valign=\"top\">\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">Google Cloud\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">Spend cap budget for the Gemini API or Vertex AI\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">New usage for that service in that project is paused\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding: 0in 0.04in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">One project and one service per cap; enforcement is not instantaneous and overage stays your responsibility\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Cbr>\u003Cbr>\u003C\u002Fp>\n\u003Cp>You still have to revoke the leaked key. The limit caps what the next leak can cost before anyone notices it.\u003C\u002Fp>\n\u003Ch2 class=\"western\">Does the provider revoke a leaked key automatically?\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Short answer:\u003C\u002Fstrong> sometimes. OpenAI and Anthropic disable keys they detect in public places, including through GitHub's secret scanning partner program. Gemini keys are not blocked on push. A key stolen from a private system, such as a vendor's database, is not found by public scanning, so you revoke it yourself.\u003C\u002Fp>\n\u003Ctable width=\"100%\" cellspacing=\"0\" cellpadding=\"4\">\u003Ccolgroup>\u003Ccol width=\"64*\">\u003Ccol width=\"64*\">\u003Ccol width=\"64*\">\u003Ccol width=\"64*\">\u003C\u002Fcolgroup>\n\u003Cthead>\n\u003Ctr valign=\"top\">\n\u003Cth style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0.04in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">Where the key leaked\u003C\u002Fp>\n\u003C\u002Fth>\n\u003Cth style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0.04in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">OpenAI\u003C\u002Fp>\n\u003C\u002Fth>\n\u003Cth style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0.04in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">Anthropic\u003C\u002Fp>\n\u003C\u002Fth>\n\u003Cth style=\"border: 1px solid #000000; padding: 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">Google Gemini\u003C\u002Fp>\n\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr valign=\"top\">\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">Public GitHub repo\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">Partner pattern; OpenAI disables publicly exposed keys\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">Partner pattern; Anthropic deactivates the key and emails the user\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding: 0in 0.04in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">No Gemini-specific partner pattern; standard keys match the Google API key pattern, which is reported to Google\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr valign=\"top\">\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">Push to GitHub\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp>Push protection blocks \u003Cspan style=\"font-family: Liberation Mono, monospace;\">openai_api_key\u003C\u002Fspan>\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">Push protection blocks Anthropic keys, including the newer service and user key types since October 13, 2026\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding: 0in 0.04in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">No push protection for Gemini or Google API keys\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr valign=\"top\">\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">Breached third-party tool or private server\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">You revoke\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding: 0in 0in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">You revoke (Anthropic revoked affected keys after the OpenCode breach)\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003Ctd style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding: 0in 0.04in 0.04in 0.04in;\" width=\"25%\">\n\u003Cp align=\"left\">You revoke\u003C\u002Fp>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Cbr>\u003Cbr>\u003C\u002Fp>\n\u003Cp>For the public-repo case, Anthropic's help center is explicit:\u003C\u002Fp>\n\u003Cblockquote>\"To prevent potential abuse, Anthropic automatically deactivates the exposed API key.\"\u003C\u002Fblockquote>\n\u003Cp>Automatic revocation is a safety net with gaps. The provider makes the call. \u003Ca href=\"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcode-security\u002Fconcepts\u002Fsecret-security\u002Fsecret-scanning-for-partners\">GitHub's partner program documentation\u003C\u002Fa> says partners decide \"whether they should revoke the secret, issue a new secret, or contact you directly\". In September 2026, \u003Ca href=\"https:\u002F\u002Ftrufflesecurity.com\u002Fblog\u002Fgithub-repos-exposed-543699-credentials-nobody-revoked-them\">Truffle Security reported\u003C\u002Fa> that 543,699 credentials exposed in public GitHub repos were still live when tested in July 2026.\u003C\u002Fp>\n\u003Ch2 class=\"western\">Is deleting the commit enough?\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Short answer:\u003C\u002Fstrong> no. Revoke the key first. A rewritten history still leaves the key in clones, forks, cached commit views and pull requests.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fauthentication\u002Fkeeping-your-account-and-data-secure\u002Fremoving-sensitive-data-from-a-repository\">GitHub's guide to removing sensitive data\u003C\u002Fa> starts with revocation:\u003C\u002Fp>\n\u003Cblockquote>\"if the sensitive data you need to remove is a secret ... then as a first step you need to revoke and\u002For rotate that secret. Once the secret is revoked or rotated, it can no longer be used for access, and that may be sufficient to solve your problem.\"\u003C\u002Fblockquote>\n\u003Cp>After rewriting history, commits can still be reached \"in any clones or forks of your repository,\" directly via SHA-1 in cached views on GitHub, and through pull requests that reference them. If you still want the history clean, GitHub recommends \u003Cspan style=\"font-family: Liberation Mono, monospace;\">git-filter-repo\u003C\u002Fspan> with the sensitive data removal option:\u003C\u002Fp>\n\u003Cpre style=\"margin-bottom: 0.2in; background: #e1e1e1;\"># Requires git-filter-repo 2.47 or later. Rewrites history: coordinate with your team first.\u003Cbr>\ngit filter-repo --sensitive-data-removal --replace-text expressions.txt\u003C\u002Fpre>\n\u003Cp>\u003Cspan style=\"font-family: Liberation Mono, monospace;\">expressions.txt\u003C\u002Fspan> lists the strings to replace, one per line. After a force push, everyone with a local clone has to re-clone or rebase, or the key comes back with their next push.\u003C\u002Fp>\n\u003Ch2 class=\"western\">Why are third-party AI tools a leak path?\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Short answer:\u003C\u002Fstrong> any tool that stores your provider key becomes another place it can leak from. Removing the key from that tool deletes the tool's copy; the key stays valid until you revoke it at the provider.\u003C\u002Fp>\n\u003Cp>The OpenCode Console stored workspace keys so team members could use models without seeing the keys. OpenCode's email to affected users was \u003Ca href=\"https:\u002F\u002Fnews.ycombinator.com\u002Fitem?id=50133412\">quoted on Hacker News\u003C\u002Fa>. It says attackers accessed \"a legacy system that we were in the process of decommissioning\". It also says that \"third party provider keys (eg OpenAI, Anthropic) saved in your workspace may have been exposed.\" OpenCode asked users to \"revoke and replace those keys through the relevant provider's dashboard.\"\u003C\u002Fp>\n\u003Cp>The same applies to any tool that asks for your provider key:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Cstrong>Revoke at the source\u003C\u002Fstrong> when the tool reports an incident, even if you already removed the key from its settings.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Give each tool its own key.\u003C\u002Fstrong> A key used only by one tool can be revoked without touching your production services, and its usage graph shows exactly what that tool did.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Anthropic lists third-party tools among the most frequent causes of key leaks, and OpenAI's help center advises caution \"with third-party libraries, frameworks, and tools that request access to your API key.\"\u003C\u002Fp>\n\u003Ch2 class=\"western\">How do you stop the next key from leaking?\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Short answer:\u003C\u002Fstrong> one key per app and environment, no keys in client-side code or committed files, short-lived credentials where the provider supports them, and a single store for secrets with access control and an audit log.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Cstrong>One key per app, per environment, per tool.\u003C\u002Fstrong> Revocation then breaks one thing, and usage per key tells you where abuse came from.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>No keys in browsers or mobile apps.\u003C\u002Fstrong> A \u003Cspan style=\"font-family: Liberation Mono, monospace;\">VITE_\u003C\u002Fspan> or \u003Cspan style=\"font-family: Liberation Mono, monospace;\">NEXT_PUBLIC_\u003C\u002Fspan> variable ends up in the JavaScript bundle. Call the provider from your server.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>No keys in committed files.\u003C\u002Fstrong> Keep \u003Cspan style=\"font-family: Liberation Mono, monospace;\">.env\u003C\u002Fspan> out of git. Push protection for users is on by default and blocks pushes of supported secrets to public repositories. Push protection for a repository, which also covers private repositories, requires GitHub Secret Protection and stays off until an admin enables it.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Shorter lifetimes.\u003C\u002Fstrong> OpenAI supports expiring project keys and workload identity federation instead of long-lived keys. Anthropic suggests rotating keys every 90 days.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Hard spend limits\u003C\u002Fstrong> on every organization and project.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>One place where secrets live.\u003C\u002Fstrong> Keys copied between laptops, chats and CI variables are hard to rotate because nobody knows every copy. A secret manager with role-based access, version history and an audit log turns rotation into one change in one place.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Before you close the incident, check four things:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\n\u003Cp>The old key is deleted or disabled in the provider console.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>Every service runs on its own new key.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>A hard spend limit is set.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>No copy of the old key is left in git, CI variables, chats or tools.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>For the habits that cause these leaks in the first place, see \u003Ca href=\"https:\u002F\u002Fennote.io\u002Fblog\u002F5-risky-ways-your-team-shares-secrets-and-how-to-stop-them\">5 risky ways your team shares secrets\u003C\u002Fa>. For long-lived tokens in pipelines, see \u003Ca href=\"https:\u002F\u002Fennote.io\u002Fblog\u002Fpersonal-access-tokens-headless-ci-cd-and-the-30-day-hard-limit\">Personal access tokens, headless CI\u002FCD and the 30-day hard limit\u003C\u002Fa>. To hand a new key to a contractor, use a \u003Ca href=\"https:\u002F\u002Fennote.io\u002Fblog\u002Fonetime-share-zero-knowledge-secret-sharing\">one-time link\u003C\u002Fa> instead of a chat message.\u003C\u002Fp>\n\u003Ch2 class=\"western\">Sources\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\n\u003Cp>OpenAI Help Center: \u003Ca href=\"https:\u002F\u002Fhelp.openai.com\u002Fen\u002Farticles\u002F8304786-how-can-i-keep-my-openai-accounts-secure\">Keeping your OpenAI account secure\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fhelp.openai.com\u002Fen\u002Farticles\u002F5112595-best-practices-for-api-key-safety\">Best practices for API key safety\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fhelp.openai.com\u002Fen\u002Farticles\u002F9186755-managing-your-work-in-the-api-platform-with-projects\">Managing projects\u003C\u002Fa>\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>OpenAI API docs: \u003Ca href=\"https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fspend-limits\">Spend limits\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fproduction-best-practices\">Production best practices\u003C\u002Fa>\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>Anthropic: \u003Ca href=\"https:\u002F\u002Fsupport.claude.com\u002Fen\u002Farticles\u002F9767949-api-key-best-practices-keep-your-keys-safe-and-secure\">API key best practices\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fapi\u002Frate-limits\">Rate limits and spend limits\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fmanage-claude\u002Fworkspaces\">Workspaces\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fmanage-claude\u002Fusage-cost-api\">Usage and Cost API\u003C\u002Fa>\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>Google: \u003Ca href=\"https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Fapi-key\">Using Gemini API keys\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Ftroubleshooting\">Gemini API troubleshooting\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fdocs.cloud.google.com\u002Fbilling\u002Fdocs\u002Fhow-to\u002Fbudgets-spend-caps\">Spend cap budgets\u003C\u002Fa>\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>GitHub: \u003Ca href=\"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcode-security\u002Freference\u002Fsecret-security\u002Fsupported-secret-scanning-patterns\">Supported secret scanning patterns\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcode-security\u002Fconcepts\u002Fsecret-security\u002Fsecret-scanning-for-partners\">Secret scanning for partners\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcode-security\u002Fconcepts\u002Fsecret-security\u002Fpush-protection\">Push protection\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fauthentication\u002Fkeeping-your-account-and-data-secure\u002Fremoving-sensitive-data-from-a-repository\">Removing sensitive data from a repository\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fgithub.blog\u002Fchangelog\u002F2026-10-13-secret-scanning-blocks-anthropic-keys-by-default-adds-salesforce\u002F\">Changelog, October 13, 2026\u003C\u002Fa>\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fcheatsheetseries.owasp.org\u002Fcheatsheets\u002FSecrets_Management_Cheat_Sheet.html\">OWASP Secrets Management Cheat Sheet\u003C\u002Fa>\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>Truffle Security: \u003Ca href=\"https:\u002F\u002Ftrufflesecurity.com\u002Fblog\u002Fgoogle-api-keys-werent-secrets-but-then-gemini-changed-the-rules\">Google API keys weren't secrets. But then Gemini changed the rules\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Ftrufflesecurity.com\u002Fblog\u002Fgithub-repos-exposed-543699-credentials-nobody-revoked-them\">GitHub repos exposed 543,699 credentials. Nobody revoked them\u003C\u002Fa>\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>Palo Alto Networks Unit 42: \u003Ca href=\"https:\u002F\u002Funit42.paloaltonetworks.com\u002Fmalicious-operations-of-exposed-iam-keys-cryptojacking\u002F\">CloudKeys in the Air\u003C\u002Fa>\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>OpenCode incident: \u003Ca href=\"https:\u002F\u002Fx.com\u002Fopencode\u002Fstatus\u002F2111516673953935833\">OpenCode on X\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fthehackernews.com\u002F2026\u002F10\u002Fopencode-console-breach-may-have.html\">The Hacker News\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fnews.ycombinator.com\u002Fitem?id=50133412\">OpenCode's email quoted on Hacker News\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fdealroom.co\u002Fnews\u002F163473-opencode-breach-drains-users-ai-keys-as-platforms-holding-customer-crede\u002F\">Dealroom\u003C\u002Fa>\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Cp>\u003Cstrong>Put your API keys where you can rotate them.\u003C\u002Fstrong> Ennote stores passwords, API keys and environment variables with role-based access, version history and an audit log of every access, and syncs them to Kubernetes. \u003Ca href=\"https:\u002F\u002Fapp.ennote.io\u002F?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=leaked-ai-api-key-what-to-do&amp;utm_content=footer\">Start for free\u003C\u002Fa> on the Developer plan.\u003C\u002Fp>\n\u003Cp>\u003Cbr>\u003Cbr>\u003C\u002Fp>",[9,10,11,12,13,14,15],"APIKeyLeak","OpenAI","Anthropic","Gemini","Cybersecurity","SecretManagement","DevSecOps","https:\u002F\u002Ffirebasestorage.googleapis.com\u002Fv0\u002Fb\u002Fblog-01-c712e.firebasestorage.app\u002Fo\u002Fblog-covers%2F1792527353735_Gemini_Generated_Image_7x1k9s7x1k9s7x1k.jpeg?alt=media&token=8e958068-07d7-4576-b3e6-39c99075e9ef",1792527355392,"Leaked OpenAI or Anthropic API Key? What to Do First","Revoke the key at the provider, replace it per app, check usage and set a hard spend cap. Verified steps for OpenAI, Anthropic and Gemini keys",[21,26,31],{"title":22,"slug":23,"coverImage":24,"createdAt":25},"The Evolution of Kubernetes Secret Delivery (And Why Polling is Dead)","the-evolution-of-kubernetes-secret-delivery-and-why-polling-is-dead","https:\u002F\u002Ffirebasestorage.googleapis.com\u002Fv0\u002Fb\u002Fblog-01-c712e.firebasestorage.app\u002Fo\u002Fblog-covers%2F1777523487463_diagramm%20(2).jpg?alt=media&token=5b01f974-cfe5-4890-b68f-5e178b422c6e",1777523490608,{"title":27,"slug":28,"coverImage":29,"createdAt":30},"The Identity-Driven Cryptography Behind Ennote's Zero-Persistence Vault","the-identity-driven-cryptography-behind-ennote-s-zero-persistence-vault","https:\u002F\u002Ffirebasestorage.googleapis.com\u002Fv0\u002Fb\u002Fblog-01-c712e.firebasestorage.app\u002Fo\u002Fblog-covers%2F1778396426354_og-image.png?alt=media&token=4bd31d6a-d525-443b-8879-5178a80b5335",1778396428194,{"title":32,"slug":33,"coverImage":34,"createdAt":35},"Announcing the Ennote Certified Partner Network: Eliminate the Overhead of Legacy Infrastructure","certified-partner-network-launch","https:\u002F\u002Ffirebasestorage.googleapis.com\u002Fv0\u002Fb\u002Fblog-01-c712e.firebasestorage.app\u002Fo\u002Fblog-covers%2F1780035988445_wmremove-transformed%20(5)%20(2).png?alt=media&token=fdd2726b-b636-4356-b22d-a40eaf67949d",1780035990138,1792527706762]