curl to Python
Convert curl commands to Python code using requests, httpx, or urllib. Supports headers, POST body, auth, and cookies.
Library: requestsMethod: POSTHeaders: 2Input Lines: 4Output Lines: 17Output Bytes: 320
Looks like this contains credentials. They are converted in this tab only — not uploaded, and not included in the link that Share or Copy link produces.
curl to Python requests & httpx
Python's requests and httpx libraries simplify sending HTTP requests. This converter translates curl flags into clean Python code: -H becomes headers dict, -d maps to payload data, and -u maps to HTTP basic auth.
Built and maintained by Meet Shah · Last updated
What this tool is used for
- Converting an API's curl example into requests code for a script.
- Reproducing a captured request inside an existing Python client.
- Getting the auth and header setup right before wrapping it in a function.
- Producing a snippet for a notebook or a one-off task.
- Checking how a form body differs from a JSON body in requests.
Frequently Asked Questions
- Should I use requests or httpx?
- requests is synchronous only and the de-facto standard. httpx has a near-identical API but adds async (await client.get(...)) and HTTP/2. If you are porting a curl command into an existing sync script, requests is the smaller change; if you need concurrency, httpx avoids bolting on threads.
- Why does my request hang forever?
- requests has NO default timeout — omitting the timeout argument means it can block indefinitely, which curl never does. Always pass timeout=(connect, read), e.g. timeout=(3.05, 27). This is the single most common production bug when porting from curl.
- What is the difference between data= and json=?
- data= sends form-encoded key/value pairs (application/x-www-form-urlencoded), matching curl's plain -d. json= serialises the object and sets Content-Type: application/json automatically. If your curl used -H 'Content-Type: application/json' -d '{...}', you want json=.
- How does curl's -k / --insecure translate?
- verify=False, which disables certificate verification and emits an InsecureRequestWarning. Prefer pointing verify at a CA bundle path instead: verify='/path/to/ca.pem'. Disabling verification in production defeats TLS entirely.
- How do I reuse a connection across requests?
- Use a Session: s = requests.Session() then s.get(...). This keeps the underlying TCP/TLS connection alive via urllib3 connection pooling and persists cookies between calls — the equivalent of curl's default behaviour within a single invocation.
- Should the generated code use a Session?
- For more than one request to the same host, yes — a `requests.Session` reuses the TCP connection and carries cookies, which is most of the latency saving. For a single call the plain function is equivalent.
Common errors and gotchas
- Using `data=` for a JSON payload, where `json=` sets the content-type and encodes it for you.
- Copying `-k` into `verify=False`, which disables TLS verification and emits a warning for good reason.
- Making many calls without a `Session`, which discards connection pooling entirely.
- Omitting a timeout, which by default means requests can hang indefinitely.
- Assuming a non-2xx raises, when you must call `raise_for_status()` yourself.
Related Developer Utilities tools
RegExp Tester
Test regular expressions and inspect matches locally.
Regex Visualizer
Visual regex pattern diagram with live match highlighting and capture group annotations.
Subnet Calculator
Compute CIDR subnets, usable hosts, and network ranges.
Cron Parser
Translate cron syntax into plain English.
URL Parser
Break a URL into protocol, host, path, and query parts.
HTML Previewer
Paste HTML and see it rendered live in a safe, sandboxed preview.
HTTP Status Code Reference
Search and look up every HTTP status code and its meaning.
MIME Type Lookup
Find the MIME type for a file extension, or the extensions for a MIME type.