<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Anuj Kulkarni</title>
    <description>The latest articles on DEV Community by Anuj Kulkarni (@anuj_kulkarni_bcd7394c089).</description>
    <link>https://dev.to/anuj_kulkarni_bcd7394c089</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4104783%2F98413db9-bc50-4a59-9dfc-03383e6a563e.png</url>
      <title>DEV Community: Anuj Kulkarni</title>
      <link>https://dev.to/anuj_kulkarni_bcd7394c089</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anuj_kulkarni_bcd7394c089"/>
    <language>en</language>
    <item>
      <title>Does ChatGPT Send Your Entire Prompt? I Checked the Network Tab</title>
      <dc:creator>Anuj Kulkarni</dc:creator>
      <pubDate>Wed, 02 Sep 2026 13:30:00 +0000</pubDate>
      <link>https://dev.to/anuj_kulkarni_bcd7394c089/does-chatgpt-send-your-entire-prompt-i-checked-the-network-tab-25ac</link>
      <guid>https://dev.to/anuj_kulkarni_bcd7394c089/does-chatgpt-send-your-entire-prompt-i-checked-the-network-tab-25ac</guid>
      <description>&lt;p&gt;I kept seeing browser extensions claim they “protect your prompts before they reach ChatGPT.”&lt;/p&gt;

&lt;p&gt;But changing the text visible in the chat box does not prove that anything was protected.&lt;/p&gt;

&lt;p&gt;The important question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What did the browser actually send?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I tested a live ChatGPT request using synthetic data and inspected the outgoing payload.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why visual masking is not enough
&lt;/h2&gt;

&lt;p&gt;Imagine entering this into ChatGPT:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OPENAI_API_KEY=sk-proj-EXAMPLE1234567890abcdefghijkl
CUSTOMER_EMAIL=jane.qa@example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both values are fake and were created specifically for this test.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fogo7auq5jcg7uqhhaywu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fogo7auq5jcg7uqhhaywu.png" alt="Synthetic API key and email entered into ChatGPT before sending" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A privacy extension might blur these values, replace them in the interface, or display a warning.&lt;/p&gt;

&lt;p&gt;That looks reassuring, but it does not prove that the original text was removed from the outgoing request.&lt;/p&gt;

&lt;p&gt;The browser’s Network panel provides a better way to check.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Never use a live credential for this experiment. Use an unmistakably synthetic value that cannot access a real account.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How to inspect the request
&lt;/h2&gt;

&lt;p&gt;Open a fresh ChatGPT conversation and follow these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Chrome DevTools with &lt;code&gt;F12&lt;/code&gt; or &lt;code&gt;Ctrl + Shift + I&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;Network&lt;/strong&gt; panel.&lt;/li&gt;
&lt;li&gt;Filter the requests using &lt;strong&gt;Fetch/XHR&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Keep DevTools open before sending the message.&lt;/li&gt;
&lt;li&gt;Enter a prompt containing your unique fake value.&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;Send&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Open the new conversation or message request.&lt;/li&gt;
&lt;li&gt;Inspect its &lt;strong&gt;Payload&lt;/strong&gt; or &lt;strong&gt;Request data&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Search for the fake marker you entered.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ChatGPT’s endpoints and request formats change, so the exact request name may differ. You are looking for the request created when the message is submitted.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens without masking
&lt;/h2&gt;

&lt;p&gt;If the outgoing request contains the original value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sk-proj-EXAMPLE1234567890abcdefghijkl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then that value was transmitted by the browser.&lt;/p&gt;

&lt;p&gt;Deleting the message afterwards does not change what was already present in the request.&lt;/p&gt;

&lt;p&gt;This is expected behavior: ChatGPT needs to receive a prompt before it can answer. The problem is that logs, configuration files, stack traces, and support messages often contain information we did not intend to share.&lt;/p&gt;

&lt;h2&gt;
  
  
  What send-time masking looks like
&lt;/h2&gt;

&lt;p&gt;With OmniShield active, the message sent to ChatGPT contained placeholders instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OPENAI_API_KEY=[OMNI_MASK_OPENAI_KEY_...]
CUSTOMER_EMAIL=[OMNI_MASK_EMAIL_...]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is the actual result from the live test:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpwwk1hk26pmc8t98355p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpwwk1hk26pmc8t98355p.png" alt="ChatGPT received masked placeholders instead of the synthetic API key and email" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ChatGPT could still understand that the prompt contained an API key and a customer email. It did not need the original values to explain the configuration.&lt;/p&gt;

&lt;p&gt;That distinction matters:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Changing what appears after submission is cosmetic. Changing the outgoing payload is protection.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Checking the outgoing request
&lt;/h2&gt;

&lt;p&gt;I also captured the browser request created during the same test.&lt;/p&gt;

&lt;p&gt;The request was sent to ChatGPT’s conversation endpoint. I checked its decoded payload against the exact synthetic API key and email entered earlier.&lt;/p&gt;

&lt;p&gt;Neither raw value was present. The OmniShield placeholders were present.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5clqttfq0ugakqrh0j31.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5clqttfq0ugakqrh0j31.png" alt="Captured outgoing ChatGPT request confirming the raw test values were absent" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The evidence above was generated from the real browser request captured during the test. It is not a manually invented example or a screenshot containing a live credential.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test typed text too
&lt;/h2&gt;

&lt;p&gt;Many privacy tools focus exclusively on paste events.&lt;/p&gt;

&lt;p&gt;That works when someone pastes an entire log or configuration file. But users also:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Type sensitive values manually&lt;/li&gt;
&lt;li&gt;Edit pasted content inside the composer&lt;/li&gt;
&lt;li&gt;Combine text from multiple sources&lt;/li&gt;
&lt;li&gt;Submit using Enter instead of clicking Send&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A useful test should cover all these workflows.&lt;/p&gt;

&lt;p&gt;I recommend checking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A pasted fake API key&lt;/li&gt;
&lt;li&gt;A manually typed fake key&lt;/li&gt;
&lt;li&gt;Submission with Enter&lt;/li&gt;
&lt;li&gt;Submission with the Send button&lt;/li&gt;
&lt;li&gt;Multiple sensitive-data types in one prompt&lt;/li&gt;
&lt;li&gt;Ordinary text that should not be modified&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last test is important. A security tool that constantly masks harmless identifiers will become frustrating very quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run a negative control
&lt;/h2&gt;

&lt;p&gt;Disable the extension and repeat the same experiment.&lt;/p&gt;

&lt;p&gt;The raw synthetic marker should now appear in the outgoing request.&lt;/p&gt;

&lt;p&gt;If the request looks identical with protection enabled and disabled, one of three things may be happening:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You inspected the wrong request.&lt;/li&gt;
&lt;li&gt;The synthetic value did not match a detector.&lt;/li&gt;
&lt;li&gt;That submission path is not protected.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is why testing matters more than trusting a feature list.&lt;/p&gt;

&lt;h2&gt;
  
  
  “Runs locally” does not answer everything
&lt;/h2&gt;

&lt;p&gt;Local processing is a valuable privacy property. It means the extension does not need to upload your prompt to its own server for classification.&lt;/p&gt;

&lt;p&gt;But “local” does not explain when protection happens.&lt;/p&gt;

&lt;p&gt;A local tool might:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sanitize text only after clicking a separate button&lt;/li&gt;
&lt;li&gt;Scan clipboard paste events&lt;/li&gt;
&lt;li&gt;Display a warning without changing the message&lt;/li&gt;
&lt;li&gt;Block submission completely&lt;/li&gt;
&lt;li&gt;Replace sensitive values when the message is submitted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are different workflows.&lt;/p&gt;

&lt;p&gt;None is automatically right for everyone. A company may prefer blocking and manual approval. An individual developer may prefer automatic masking with readable placeholders.&lt;/p&gt;

&lt;p&gt;The important thing is understanding which behavior you are getting.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this experiment does not prove
&lt;/h2&gt;

&lt;p&gt;This test shows what was present in the specific request I captured.&lt;/p&gt;

&lt;p&gt;It does not prove that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every submission path is protected&lt;/li&gt;
&lt;li&gt;Every sensitive-data pattern will be detected&lt;/li&gt;
&lt;li&gt;The extension itself has no vulnerabilities&lt;/li&gt;
&lt;li&gt;A supported website will never change&lt;/li&gt;
&lt;li&gt;The AI provider handles received data in a particular way&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Browser extensions depend on websites that evolve constantly. A test that passes today should be repeated after significant interface or request changes.&lt;/p&gt;

&lt;p&gt;Still, inspecting the outgoing request turns a vague privacy promise into a concrete question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Is my fake secret in the payload or not?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why I ran this test
&lt;/h2&gt;

&lt;p&gt;I’m building &lt;a href="https://omnishield.app" rel="noopener noreferrer"&gt;OmniShield&lt;/a&gt;, a Chrome extension that masks API keys, credentials, and PII locally before supported AI-chat requests are sent.&lt;/p&gt;

&lt;p&gt;That gives me an obvious bias.&lt;/p&gt;

&lt;p&gt;So do not trust the marketing copy—including mine. Use synthetic data, open DevTools, and verify the behavior yourself.&lt;/p&gt;

&lt;p&gt;I published the complete walkthrough here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://omnishield.app/blog/chatgpt-network-request-secret-proof" rel="noopener noreferrer"&gt;Does ChatGPT Send Your Entire Prompt? Check the Network Tab&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also try the &lt;a href="https://omnishield.app/tools/secret-scrubber" rel="noopener noreferrer"&gt;free browser-based prompt sanitizer&lt;/a&gt; without installing anything.&lt;/p&gt;

&lt;p&gt;If you test this with another privacy extension, I’d be interested to hear what appears in the outgoing request.&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>webdev</category>
      <category>privacy</category>
    </item>
  </channel>
</rss>
