If you are not interested in response from the server(fire and forget) then you can use an async library for this. But I must warn you, you cannot mix sync and async code(actually you can but it's not worth dealing with it) so most of your codes must be changed.
Another approach is using threads, they can call the url
seperately wait for the response without affecting rest of your code.
Something like this will help:
def request_task(url, json, headers):
requests.post(url, json=data, headers=headers)
def fire_and_forget(url, json, headers):
threading.Thread(target=request_task, args=(url, json, headers)).start()
...
fire_and_forget(url, json=data, headers=headers)
Brief info about threads
Threads are seperate flow of execution. Multiple threads run concurrently so when a thread is started it runs seperately from current execution. After starting a thread, your program just continue to execute next instructions while the instructions of thread also executes concurrently. For more info, I recommend realpython introduction to threads.