Short answer
This is because params sends the parameters as part of the http POST request, while data sends them as part of the body of the request. In your case: just call the api using params and you're fine. This is absolutely normal (and expected) behaviour.

Demonstration
Just start two commandlines. On the first, run netcat: nc -l 8888. On the other commandline, run python:

>>> import requests
>>> requests.post('http://localhost:8888',data={'a':1,'b':'2'})

At the netcat-side, we see the following request:

POST / HTTP/1.1
Host: localhost:8888
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.18.1
Content-Length: 7
Content-Type: application/x-www-form-urlencoded

a=1&b=2

Next, try the params way:

>>> requests.post('http://localhost:8888',params={'a':1,'b':'2'})

Netcat reports:

POST /?a=1&b=2 HTTP/1.1
Host: localhost:8888
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.18.1
Content-Length: 0

Note the differences in the first and last line.

As you can read from the documentation (italic emphasis is mine):

params -- (optional) Dictionary or bytes to be sent in the query string for the Request.
data -- (optional) Dictionary or list of tuples [(key, value)] (will be form-encoded), bytes, or file-like object to send in the body of the Request.

Answer from agtoever on Stack Overflow
🌐
W3Schools
w3schools.com › python › ref_requests_post.asp
Python Requests post Method
Python Examples Python Compiler ... Q&A Python Bootcamp Python Training · ❮ Requests Module · Make a POST request to a web page, and return the response text: import requests url = 'https://www.w3schools.com/python/demopage.php' ...
🌐
Requests
requests.readthedocs.io › en › latest › user › quickstart
Quickstart — Requests 2.34.2 documentation
1 month ago - Requests’ simple API means that all forms of HTTP request are as obvious. For example, this is how you make an HTTP POST request:
People also ask

Does the Python requests library support asynchronous POST requests?

Unfortunately, the requests library does not support asynchronous requests. However, the httpx library is an alternative that provides async capabilities, making it suitable for applications requiring concurrency. See our guide to Python httpx for details.

🌐
scrapfly.io
scrapfly.io › blog › posts › how-to-python-requests-post
Guide to Python requests POST method
How can I include custom headers in using Python requests?

Pass headers as a dictionary using the headers parameter. Note that requests automatically generates some headers like User-Agent, Content-Length and Content-Type, so be cautious when overriding them.

🌐
scrapfly.io
scrapfly.io › blog › posts › how-to-python-requests-post
Guide to Python requests POST method
What is the difference between data and json parameters in Python requests?

data is for form-encoded (default) or raw data (when Content-Type header is overriden). While json is specifically for JSON format data and automatically sets Content-Type to application/json.

🌐
scrapfly.io
scrapfly.io › blog › posts › how-to-python-requests-post
Guide to Python requests POST method
🌐
Scrapfly
scrapfly.io › blog › posts › how-to-python-requests-post
Guide to Python requests POST method
April 18, 2026 - The requests.post() function is your primary tool for sending POST requests in Python. It allows for customizable and straightforward data sending by specifying the URL, headers, and the data itself.
🌐
ReqBin
reqbin.com › code › python › ighnykth › python-requests-post-example
How do I send a POST request using Python Requests Library?
To send a POST request using the Python Requests Library, you should call the requests.post() method and pass the target URL as the first parameter and the POST data with the data= parameter.
Find elsewhere
🌐
GeeksforGeeks
geeksforgeeks.org › python › post-method-python-requests
POST method - Python requests - GeeksforGeeks
July 12, 2025 - It is often used when uploading a file or when submitting a completed web form. Python's requests module provides in-built method called post() for making a POST request to a specified URI.
🌐
datagy
datagy.io › home › python requests › python requests: post request explained
Python requests: POST Request Explained • datagy
December 30, 2022 - In this tutorial, you’ll learn ... the complexities in making HTTP requests. The requests.post() function allows you to post data to a web resource....
🌐
ScrapeOps
scrapeops.io › home › python web scraping playbook › python requests post requests
Python Requests - How to Send POST Requests | ScrapeOps
April 12, 2023 - To send POST requests with Python Requests use the requests.post() method and add the POST body and Content-Type using the body and headers parameters.
🌐
PyPI
pypi.org › project › requests
requests · PyPI
May 14, 2026 - There’s no need to manually add query strings to your URLs, or to form-encode your PUT & POST data — but nowadays, just use the json method! Requests is one of the most downloaded Python packages today, pulling in around 300M downloads / week — according to GitHub, Requests is currently ...
      » pip install requests
    
Published   May 14, 2026
Version   2.34.2
🌐
Medium
techkamar.medium.com › sending-form-data-post-using-python-requests-library-55850c7a93d5
Sending FORM data POST using Python Requests library - tech kamar - Medium
June 26, 2024 - import requests url = "http://localhost:8080/login" form_data = {"username":"johndoe", "password": "user@1234"} resp = requests.post(url, data=form_data)
🌐
GeeksforGeeks
geeksforgeeks.org › python › python-requests-post-request-with-headers-and-body
Python requests - POST request with headers and body - GeeksforGeeks
July 23, 2025 - import requests url = "https://httpbin.org/post" data = { "id": 1001, "name": "geek", "passion": "coding", } response = requests.post(url, json=data) print("Status Code", response.status_code) print("JSON Response ", response.json())
🌐
Apidog
apidog.com › blog › python-post-request
How to send POST Request in python?
February 2, 2026 - The requests.post method is used to send the POST request, and then we print out the status code and response content from the server. Please note that to run this code, you’ll need to have the requests library installed.
🌐
Apidog
apidog.com › blog › python-requests-post-json
Python Requests: How to POST JSON Data with Ease in 2026
February 4, 2026 - The requests.post() method is used to send the request, and the response status code and content are printed to the console. Now that we have a basic understanding of what Python Requests and JSON are, let’s dive into how to use Python Requests ...
🌐
GeeksforGeeks
geeksforgeeks.org › python › get-post-requests-using-python
GET and POST Requests Using Python - GeeksforGeeks
July 17, 2025 - This post discusses two HTTP (Hypertext Transfer Protocol) request methods GET and POST requests in Python and their implementation in Python.
🌐
Leapcell
leapcell.io › blog › how-to-use-python-requests-for-post-requests
How to Use Python `requests` for POST Requests | Leapcell
July 25, 2025 - The requests.post() method simplifies sending form and JSON data. You can easily upload files and set custom headers. Handling the response object properly is crucial for robust applications.
🌐
ScrapingDog
scrapingdog.com › blog › send-post-python-requests
How To Send A Post Requests in Python?
October 2, 2024 - Learn how to send POST requests using Python’s Requests library. Includes step-by-step examples and code snippets.
🌐
Tutorialspoint
tutorialspoint.com › python › python_requests_post_method.htm
Python Requests post() Method
The Python Requests post() method is used to send HTTP POST requests to a specified URL. It allows sending data to the server which is typically used for submitting forms or uploading files.
🌐
iO Flood
ioflood.com › blog › python-requests-post
Python Requests Library for 'POST' Requests
February 6, 2024 - It abstracts the complexities of making requests behind a beautiful, simple API, allowing you to send HTTP/1.1 requests with various methods like GET, POST, and others. With it, you can add content like headers, form data, multipart files, and parameters to HTTP requests via simple Python libraries to HTTP requests. In the context of making POST requests, the requests library provides the requests.post() function.
🌐
ScrapingBee
scrapingbee.com › blog › how-to-send-post-python-requests
How to send a POST with Python Requests? | ScrapingBee
January 11, 2026 - This sends a POST request without any data. Some endpoints work this way: you trigger some action by simply calling an endpoint. If the site you're interacting with rate-limits requests, blocks direct traffic, or needs proxy rotation, you can run the same request through ScrapingBee. The pattern is still Python send POST request, only the request goes to ScrapingBee and you tell it which site to forward to: