Query Fan-Out API: expand and rank the sub-queries behind AI answers
The Fan-Out API returns the sub-questions an AI engine derives from a prompt before it answers, with how often each one occurs across every stored response. Each fan-out comes with its share of the total and whether the brand appeared in the answers that used it, so a team can see which questions it already covers.
Updated
- ChatGPT
- Perplexity
- Google AI Mode
- Claude
- Microsoft Copilot
- Grok
Playground
One seed prompt expands into 8 fan-outs, and the brand covers 3 of them
The Fan-Out API groups the sub-questions behind every stored answer and ranks them by occurrence. For the sample prompt on ChatGPT, client approval workflows top the list with 284 occurrences, and the brand appears in answers to 3 of the 8 questions. Raise the minimum occurrence to trim the tail, or switch the model to see how each engine expands the same prompt.
POST /v1/fan-outs/top
model
- Unique fan-outs
- 8
- Avg per response
- 4.7
- Brand covered
- 3 / 8
curl -X POST https://api.apiforgeo.com/v1/fan-outs/top \ -H "Authorization: Bearer $API_FOR_GEO_KEY" \ -H "x-project-id: $PROJECT_ID" \ -H "Content-Type: application/json" \ -d '{ "queryText": "best project management tool for creative agencies", "models": [ "chatgpt" ] }'
import os, requests API = "https://api.apiforgeo.com/v1" H = {"Authorization": f"Bearer {os.environ['API_FOR_GEO_KEY']}", "x-project-id": os.environ["PROJECT_ID"]} r = requests.post(f"{API}/fan-outs/top", headers=H, json={ "queryText": "best project management tool for creative agencies", "models": [ "chatgpt" ] }, timeout=30) print(r.json())
const API = "https://api.apiforgeo.com/v1"; const headers = { Authorization: `Bearer ${process.env.API_FOR_GEO_KEY}`, "x-project-id": process.env.PROJECT_ID, "Content-Type": "application/json", }; const post = (path, body) => fetch(API + path, { method: "POST", headers, body: JSON.stringify(body) }).then((r) => r.json()); console.log(await post("/fan-outs/top", { "queryText": "best project management tool for creative agencies", "models": [ "chatgpt" ] }));
| Fan-out question | Occurrences | Share | Brand present |
|---|---|---|---|
| which project management tools have client approval workflows | 284 | 21% | yes |
| how much does project management software cost per seat | 231 | 17.1% | yes |
| best pm tool for agencies with under 20 people | 198 | 14.6% | no |
| does it integrate with design and proofing tools | 176 | 13% | yes |
| project management software with built-in time tracking | 154 | 11.4% | no |
| loopwork vs cadence for creative teams | 141 | 10.4% | no |
| can clients comment without a paid seat | 96 | 7.1% | no |
| which tools support retainer and utilisation reporting | 74 | 5.5% | no |
{
"scope": {
"queryText": "best project management tool for creative agencies",
"models": [
"chatgpt"
]
},
"overview": {
"totalFanOuts": 1354,
"uniqueFanOuts": 8,
"avgPerResponse": 4.7
},
"results": [
{
"text": "which project management tools have client approval workflows",
"occurrences": 284,
"share": 21,
"brandPresent": true,
"queryIds": [
"q_4f1a2b"
]
},
{
"text": "how much does project management software cost per seat",
"occurrences": 231,
"share": 17.1,
"brandPresent": true,
"queryIds": [
"q_4f1a2b"
]
},
{
"text": "best pm tool for agencies with under 20 people",
"occurrences": 198,
"share": 14.6,
"brandPresent": false,
"queryIds": [
"q_4f1a2b"
]
},
{
"text": "does it integrate with design and proofing tools",
"occurrences": 176,
"share": 13,
"brandPresent": true,
"queryIds": [
"q_4f1a2b"
]
},
{
"text": "project management software with built-in time tracking",
"occurrences": 154,
"share": 11.4,
"brandPresent": false,
"queryIds": [
"q_4f1a2b"
]
},
{
"text": "loopwork vs cadence for creative teams",
"occurrences": 141,
"share": 10.4,
"brandPresent": false,
"queryIds": [
"q_4f1a2b"
]
},
{
"text": "can clients comment without a paid seat",
"occurrences": 96,
"share": 7.1,
"brandPresent": false,
"queryIds": [
"q_4f1a2b"
]
},
{
"text": "which tools support retainer and utilisation reporting",
"occurrences": 74,
"share": 5.5,
"brandPresent": false,
"queryIds": [
"q_4f1a2b"
]
}
]
} | Field | Type | Description |
|---|---|---|
text | string | The fan-out question, as the engine phrased it. |
occurrences | int | How many in-scope responses generated this fan-out. |
share | float | Occurrences ÷ total fan-outs in scope. |
brandPresent | boolean | Whether the brand was mentioned in answers containing this fan-out. |
queryIds[] | array | The tracked prompts that produced it, to join back to prompt tracking. |
| Field | Type | Description |
|---|---|---|
totalFanOuts | int | Total fan-outs in scope. |
uniqueFanOuts | int | Distinct fan-out questions in scope. |
avgPerResponse | float | Average fan-outs generated per AI response. |
Per prompt
The per-prompt variant returns the 4 fan-outs behind one tracked prompt
The Fan-Out API also reads one tracked prompt at a time through POST /v1/fan-outs/by-query/{queryId}. The id in the path names the prompt, which suits a prompt detail page or a content brief built around a single question. The response carries the same fields as the full list, for that prompt only.
POST /v1/fan-outs/by-query/{queryId}
curl -X POST https://api.apiforgeo.com/v1/fan-outs/by-query/q_7d20e4b1 \ -H "Authorization: Bearer $API_FOR_GEO_KEY" \ -H "x-project-id: $PROJECT_ID" \ -H "Content-Type: application/json" \ -d '{ "models": [ "chatgpt" ] }'
import os, requests API = "https://api.apiforgeo.com/v1" H = {"Authorization": f"Bearer {os.environ['API_FOR_GEO_KEY']}", "x-project-id": os.environ["PROJECT_ID"]} r = requests.post(f"{API}/fan-outs/by-query/q_7d20e4b1", headers=H, json={ "models": [ "chatgpt" ] }, timeout=30) print(r.json())
const API = "https://api.apiforgeo.com/v1"; const headers = { Authorization: `Bearer ${process.env.API_FOR_GEO_KEY}`, "x-project-id": process.env.PROJECT_ID, "Content-Type": "application/json", }; const post = (path, body) => fetch(API + path, { method: "POST", headers, body: JSON.stringify(body) }).then((r) => r.json()); console.log(await post("/fan-outs/by-query/q_7d20e4b1", { "models": [ "chatgpt" ] }));
200 OK
{
"scope": {
"queryId": "q_7d20e4b1",
"models": [
"chatgpt"
]
},
"results": [
{
"text": "which client portal tools allow comments without a seat",
"occurrences": 96,
"share": 31.1,
"brandPresent": false
},
{
"text": "how do client portals handle file approvals",
"occurrences": 88,
"share": 28.5,
"brandPresent": true
},
{
"text": "client portal project software for agencies",
"occurrences": 71,
"share": 23,
"brandPresent": true
},
{
"text": "can clients see project timelines in the portal",
"occurrences": 54,
"share": 17.5,
"brandPresent": false
}
]
} | Field | Type | Description |
|---|---|---|
text | string | The fan-out question, as the engine phrased it. |
occurrences | int | How many responses to this prompt generated it. |
share | float | Occurrences ÷ all fan-outs of this prompt. |
brandPresent | boolean | Whether the brand was mentioned in answers containing this fan-out. |
Get started
Four setup steps put the first fan-outs in your project
The Fan-Out API reads questions captured during normal executions, so it needs no job of its own. Once the project exists, its key is generated in the app and its prompts are imported, the first execution fills the fan-out tables, and reading them is not billed.
-
Step 1
Create a project
Create an organisation and a project, one project per brand or per client.
-
Step 2
Generate a key
Generate an API key in the app; keys are managed there, never through the API.
-
Step 3
Import your prompts
Import your prompts and tags with a single POST /v1/queries.
-
Step 4
Run and read
Trigger an execution, poll the job, then read any analytics endpoint.
Comparison
Only 1 of 4 approaches returns fan-outs ranked and ready to use
The Fan-Out API returns the follow-up questions as ranked data, with occurrences and brand presence. An AI scraping API returns the final answer without them, a GEO dashboard tool rarely exposes them, and an in-house build has to capture and count them per engine, then keep up whenever an engine changes how it composes answers.
| Capability | API for GEO | AI scraping API | GEO dashboard tool | In-house build |
|---|---|---|---|---|
| Fan-out follow-up questions | Yes | No | Rare | Build it |
| Raw answer text | Yes | Yes | Sometimes | Build it |
| Ongoing maintenance when engines change | Ours | Partly theirs | Theirs | Yours |
Use cases
Fan-outs feed 3 deliverables: briefs, prompt sets and gap reports
The Fan-Out API turns the questions engines ask themselves into work items. Agencies build content briefs from the top questions, platforms expand their customers' prompt sets with the ones that keep coming back, and brands look for questions where competitors are cited and they are not. Each card opens the matching pattern.
Prompt sets that grow themselves
Promote high-occurrence fan-outs into tracked prompts, so visibility is measured where the demand actually sits. The queryIds field links each question back to its source prompt.
AgenciesContent briefs in the engine's words
Turn the top 20 fan-outs of a topic into H2s and FAQ entries, phrased the way the engine already phrases them. Coverage of those questions is what gets a page retrieved.
E-commerce & brandsGaps where competitors get cited
Cross fan-outs with the citation layer to find questions where a competitor is cited and the brand is not. Each gap becomes a page to write or a source to win.
Pricing
Query Fan-Out API pricing runs from $0.013 to $0.007 per credit
The Fan-Out API adds no charge of its own: fan-outs are captured while prompts run, and reading them is not billed. The credits are the executions themselves, one per prompt, per model, per locale, priced by the month's total volume with no commitment needed to reach a lower tier.
Price per credit, set by the month's total volume.
200 prompts × 3 models × 30 runs = 18,000 credits a month, $234 at $0.013
FAQ
Fan-out data, answered
What does the ranked list return?
The Fan-Out API returns each sub-question as the engine phrased it, with its occurrences, its share of all fan-outs in scope, whether the brand appeared alongside it and the tracked prompts that produced it. The overview call adds the totals for the scope: total fan-outs, unique fan-outs and the average per response.
How stable are fan-outs between runs?
The Fan-Out API counts occurrences across every stored response because single expansions vary from one run to the next. The most frequent questions change slowly while the rare ones churn, so a monthly brief built on the twenty most frequent questions stays valid.
Do fan-outs cost extra credits?
The Fan-Out API bills nothing beyond the executions themselves. Fan-outs are captured as part of each enriched run, and every read of the ranked list, the overview or a single prompt's variant is unmetered, so exploring the data does not change the monthly bill.
Can I turn a fan-out into a tracked prompt?
The Fan-Out API returns the queryIds behind each fan-out, so a frequent question can join the prompt set with one POST /v1/queries. Tracking it from then on measures visibility on the question the engine actually asked itself, next to the prompt it came from.
Can I resell fan-out data?
The Fan-Out API allows resale and white-label use, like every endpoint family. The payload carries no branding and each client can sit in an isolated project, so an agency can ship fan-out briefs under its own name or a platform can show the ranked questions inside its product.
Related GEO APIs
Prompt Tracking API →
Promote a fan-out into a tracked prompt in one call.
APIAI Visibility API →
Check whether the brand shows up once the fan-out is covered.
APIAI Model Comparison API →
See which engines name the brand once the questions are covered.
Same topic: Query fan-out tool · Query fan-out guide