ChatGPT 5.4 Has Hidden Fan-Out Queries. You Can Still Get Them Via The API (Python Script Included)

Hey all, quick update here! After browsing LinkedIn this morning, I saw a lot of messages saying that the updated version of ChatGPT 5.4 has now hidden fan-out queries from the console.

I took a look this morning and this 100% right. When you try the old method of digging around the ChatGPT conversation files, there are no fan-out queries to be found.

That means the extensions/tools that scraped the results from conversations will no longer work and you can’t easily find the data with Google DevTools anymore.

However, hope is not lost. My guy Jerome Salomon did some digging and found that fan-out queries ARE still available via the API!!

So the data is still there, just way less accessible. Now you have to use a bit of Python to find these queries. I actually recommend that you use Claude Code to create the solution for you but I used to create a quick Python file that will help you access the data yourself. The best workflow is probably feeding this script into Claude Code and having it run it end to end.

You’ll need to define both your OpenAI API + the query text that you want to use:

#!/usr/bin/env python3
“””
OpenAI Responses API – Single File Query Runner

Usage:
./fanout.py “your query here”
or
python3 fanout.py “your query here”
“””

from openai import OpenAI
import json
import sys
from datetime import datetime

# Initialize OpenAI client with API key
client = OpenAI(api_key=’Your_API_Key’)

def run_query(query_text, save_json=True):
“””
Run a single fanout query.

Args:
query_text: The query to search for
save_json: Whether to save the raw response to a JSON file
“””
print(f”\n{‘=’*100}”)
print(f”RUNNING QUERY”)
print(f”{‘=’*100}”)
print(f”\nQuery: {query_text}\n”)
print(“⏳ Executing fanout query (this may take 10-30 seconds)…\n”)

try:
# Make the API call
response = client.responses.create(
model=”gpt-5.4″,
tools=[{“type”: “web_search”}],
tool_choice=”auto”,
input=query_text
)

# Display results
print(f”{‘=’*100}”)
print(f”RESULTS”)
print(f”{‘=’*100}\n”)

print(f”Response ID: {response.id}”)
print(f”Model: {response.model if hasattr(response, ‘model’) else ‘gpt-5.4’}”)
print(f”Created: {datetime.fromtimestamp(response.created_at).strftime(‘%Y-%m-%d %H:%M:%S’)}\n”)

# Extract and display content
if hasattr(response, ‘output’) and response.output:
print(f”{‘─’*100}”)
print(“RESPONSE:”)
print(f”{‘─’*100}\n”)

for item in response.output:
if hasattr(item, ‘text’) and item.text:
print(item.text)
print()
elif hasattr(item, ‘content’) and item.content:
print(item.content)
print()

# Extract and display citations
citations = []
if hasattr(response, ‘output’) and response.output:
for item in response.output:
if hasattr(item, ‘annotations’):
for annotation in item.annotations:
if hasattr(annotation, ‘type’) and annotation.type == ‘url_citation’:
citations.append({
‘title’: annotation.title,
‘url’: annotation.url,
‘start’: annotation.start_index,
‘end’: annotation.end_index
})

if citations:
print(f”\n{‘─’*100}”)
print(f”CITATIONS ({len(citations)} sources):”)
print(f”{‘─’*100}\n”)
for i, citation in enumerate(citations, 1):
print(f”{i}. {citation[‘title’]}”)
print(f” {citation[‘url’]}\n”)

# Save to JSON if requested
if save_json:
timestamp = datetime.now().strftime(‘%Y%m%d_%H%M%S’)
filename = f”query_result_{timestamp}.json”
with open(filename, ‘w’) as f:
json.dump(response.model_dump(), f, indent=2, default=str)
print(f”\n✓ Full response saved to: {filename}”)

print(f”\n{‘=’*100}\n”)
return response

except Exception as e:
print(f”\n❌ ERROR: {e}\n”)
print(“Troubleshooting:”)
print(“1. Check that your API key is valid”)
print(“2. Verify you have access to the Responses API”)
print(“3. Confirm you have access to the gpt-5.4 model”)
print(“4. Ensure web search tools are available in your API plan\n”)
return None

def main():
# Check if query was provided as command line argument
if len(sys.argv) > 1:
query = ‘ ‘.join(sys.argv[1:])
else:
# Prompt for query
print(“\n” + “=”*100)
print(“OpenAI Responses API – Query Runner”)
print(“=”*100)
query = input(“\nEnter your query: “)

if not query.strip():
print(“Error: No query provided”)
print(“\nUsage: ./fanout.py \”besteproject management tools\””)
return

# Run the query
run_query(query)

if __name__ == “__main__”:
main()

In the terminal, you’ll navigate to the folder it’s in and then use the “./run_query “Your Prompt“. The tool will then extract the fan-out data + citations from OpenAI’s API.

As a result, you should get new JSON files that return ChatGPT’s fan-outs in the response.