What Charles Proxy Does and Why You Need It
Charles Proxy is a tool that sits between your browser and the internet and records every request your browser sends and every response it receives. When you load a webpage, your browser makes dozens of requests — some visible (images, stylesheets) and some hidden (API calls that fetch data in the background). Charles shows you all of them, what data was sent, what came back, and how long it took.
As a web developer, you use Charles to see what your code is actually doing. If a page loads slowly, Charles shows you which requests are taking time. If data isn't appearing on the page, Charles shows you whether the request was sent at all, whether the server responded, and what the response contained. You can also modify requests before they reach the server — change a parameter, add a header, test what happens if the server sends back an error.
Charles works on Windows, Mac, and Linux. It has a free trial that works indefinitely with occasional nag screens, or you can buy a license for around $50 one-time.
Key Takeaways
- Charles Proxy intercepts all traffic between your browser and the internet, showing you every API request, response, and the time each one took.
- You install Charles on your computer, configure your browser to route traffic through it, and then browse normally while Charles records everything in the background.
- The main view shows a list of requests; click any request to see the full details — headers, parameters, response body, and timing breakdown.
- You can modify requests before they reach the server, replay requests, and throttle your connection to test how pages behave on slow networks.
- HTTPS traffic is encrypted by default; to see inside HTTPS requests, you install Charles's certificate in your browser and enable SSL proxying for specific domains.
Installing Charles and Routing Your Browser Through It
read Charles from charlesproxy.com and install it like any other process. When you open Charles, it starts listening on your computer for traffic. By default, Charles listens on port 8888.
Next, configure your browser to send traffic through Charles. In most browsers, this means going to Settings or Preferences, finding the Proxy or Network settings, and entering your computer's IP address (usually 127.0.0.1 for localhost) and port 8888. In Chrome on Windows, proxy settings are in Settings > Advanced > System > Open your computer's proxy settings. In Firefox, they're in Settings > Network Settings > Manual proxy configuration. In Safari on Mac, they're in System Preferences > Network > Advanced > Proxies.
Once configured, open your browser and visit any website. Charles will when ready start showing requests in its main window. You don't need to do anything else — just browse normally. Every request appears in Charles's list as it happens.
Reading the Request List and Finding What You Need
The main Charles window shows a list of all requests, organized by domain. Each row shows the request method (GET, POST, etc.), the path, the response status code (200 for success, 404 for not found, 500 for server error), the response size, and how long it took. Requests are grouped by domain by default, so you can collapse domains you don't care about and focus on the ones you're debugging.
Click any request to open its details panel on the right. The panel has tabs: Request shows what your browser sent (headers, query parameters, request body). Response shows what the server sent back (headers and body). Timing shows a breakdown of how long each phase took — DNS lookup, TCP connection, request time, response time, latency. Overview gives you a quick summary.
If you're looking for a specific request, use the search box at the bottom of the window. Type part of the URL or domain name and Charles filters the list in real time. This is essential when a page makes hundreds of requests and you need to find the one API call that's failing.
Decrypting HTTPS Requests to See What's Inside
By default, Charles can see that an HTTPS request happened and how long it took, but it cannot see inside the request or response because HTTPS is encrypted. To see the actual data, you need to install Charles's SSL certificate in your browser and tell Charles to decrypt traffic for specific domains.
In Charles, go to Help > SSL Proxying > Install Charles Root Certificate. This opens a dialog that walks you through installing the certificate. On Mac, it opens Keychain and asks you to trust the certificate. On Windows, it opens the certificate manager. On Linux, the steps vary by browser.
Once the certificate is installed, go to Proxy > SSL Proxying Settings. Click Add and enter the domain you want to decrypt — for example, api.example.com or * to decrypt everything. Click OK. Now when you make requests to that domain, Charles will show you the full request and response body, not just the encrypted wrapper.
Be aware that installing a root certificate tells your browser to trust Charles as a certificate authority. This is safe for development and testing, but do not do this on a shared computer or a computer you do not control.
Modifying Requests to Test Different Scenarios
One of Charles's most useful features is the ability to change a request before it reaches the server. Right-click any request and select Edit. A dialog opens where you can change the method, path, headers, and body. Make your changes and click Execute. Charles sends the modified request to the server and shows you the response.
This is useful for testing edge cases. If an API endpoint expects a user ID in the request, you can change the ID to test what happens when you request data for a different user. If you want to test what happens when a request times out, you can use Charles's throttling feature (Proxy > Throttle Settings) to slow your connection to a crawl and see how your page behaves.
You can also use the Breakpoints feature to pause a request before it's sent, modify it, and then let it continue. Go to Proxy > Breakpoint Settings, add a rule for the domain or path you want to intercept, and then when that request happens, Charles pauses it and lets you edit it before sending it on.
Replaying Requests and Saving Sessions for Later
If you need to test the same request multiple times, right-click it and select Repeat. Charles sends the exact same request again. You can repeat it as many times as you want without reloading the page or clicking through your process.
Charles also saves all requests in a session file. When you close Charles, it asks whether you want to save the session. If you click Save, Charles writes all the requests and responses to a file. You can open that file later and browse through the requests again, even if the server is offline. This is useful for sharing debugging information with a colleague or for reviewing what happened during a test run.
To save a session, go to File > Save Session As and choose a location. To open a saved session, go to File > Open Session and select the file. The requests appear in the main window as if they had just been captured.
Common Reasons Requests Don't Appear in Charles
If you're browsing but Charles is not showing any requests, the most common cause is that your browser is not actually routing traffic through Charles. Double-check your proxy settings — make sure the IP address and port match what Charles is listening on. In Charles, go to Help > Local IP Address to see what IP address to use.
Another common issue is that some applications bypass the system proxy settings. If you're testing a desktop process or a mobile app, you may need to configure the proxy in that process's settings, not in your operating system settings. For mobile devices, you typically go to WiFi settings, select the network, and enter the proxy manually.
If you see requests but they show as [SSL] or [CONNECT], that means Charles is seeing the HTTPS connection but cannot decrypt it. Install the certificate and add the domain to SSL Proxying Settings as described above.
Frequently Asked Questions
Can I use Charles to see what other people are doing on the internet?
No. Charles only captures traffic from your own computer. It cannot see traffic from other devices on your network unless you explicitly configure them to route through Charles as a proxy, which requires access to their network settings. Charles is a development tool for debugging your own code.
Does Charles slow down my internet?
Slightly. Charles adds a small amount of overhead because every request passes through it. For most development work, the slowdown is not noticeable. If you need to test performance on a fast connection, you can disable Charles temporarily by going to Proxy > Disable Proxy or by changing your browser's proxy settings back to direct connection.
What's the difference between Charles and the browser's built-in developer tools?
The browser's Network tab shows requests made by that browser. Charles shows requests from any process on your computer that routes through it — browsers, mobile apps, desktop applications. Charles also lets you modify requests before they're sent and throttle your connection more precisely. For most web development, the browser's Network tab is enough; Charles is useful when you need to debug traffic from multiple sources or modify requests.
Can I use Charles on my phone?
Yes. Install Charles on your computer, then on your phone, go to WiFi settings, select your network, and enter your computer's IP address and port 8888 as the proxy. All traffic from your phone will route through Charles. You'll need to install Charles's certificate on your phone as well to see HTTPS traffic.
Is Charles free?
Charles has a free trial that works indefinitely with occasional nag screens reminding you to buy a license. The license is a one-time purchase of around $50. For occasional use or learning, the free version is fine. For regular professional use, the license is worth the cost to remove the nag screens.