Extract questions
Buried inside a rambling support ticket or a forty-minute call transcript is usually a short list of things the customer actually wants answered — the rest is context, venting or small talk. This question extraction endpoint reads a document and returns only the questions it contains, so you can see, at a glance, what someone actually asked without rereading everything they said around it.
Run it online
Run this on our servers with your account. Free tools run in your browser; this one bills your KIT balance per the price above.
What counts as a question here
A question mark is the easy case, but plenty of real questions in natural speech never get one: 'not sure if this plan covers overages' or 'wondering whether the refund already went through' are questions in every functional sense despite lacking the punctuation. This endpoint reads for intent rather than punctuation alone, which is the difference between a tool that finds literal question marks and one that finds the actual questions people are asking.
The volume problem it's built for
A support inbox handling hundreds of tickets a day, a forum thread with two hundred replies, or a stack of customer interview transcripts all bury genuine questions inside far more text that isn't a question at all. Nobody reads all of it end to end looking for the handful of lines that need a direct answer; this endpoint does that first pass automatically so a human only has to review the shortlist.
How the response is structured
POST /text/extract-questions returns each detected question as a separate entry, preserving the original wording rather than paraphrasing it, so the output can be handed directly to a support agent or an FAQ curator without losing nuance. Where a passage contains a rhetorical question that clearly doesn't expect an answer — 'who wouldn't want that?' — the extraction leans toward excluding it, favoring questions that genuinely seek information.
Where this sits in a support or research workflow
Teams building an FAQ page from real customer language, researchers coding open-ended interview transcripts, and community managers trying to surface unanswered questions in a busy forum thread all do the same manual task today: scroll and highlight. Automating that first pass doesn't replace the judgment call of how to answer a question, but it removes the tedious part of finding them in the first place.
Fitting into an automated pipeline
The call runs asynchronously — submit text, receive a task_id immediately, and get the extracted questions by signed webhook the moment they're ready or via a signed link valid for 24 hours. Pricing is per request plus a small per-word rate, so scanning a short chat transcript costs a fraction of processing a lengthy interview, and a task that fails after its retries is never billed.
What you can do with it
Building an FAQ from real support tickets
Run a quarter's worth of closed tickets through the endpoint to surface the actual questions customers ask most, in their own words, rather than guessing what belongs on an FAQ page.
Mining unanswered forum questions
Scan a long community thread to flag genuine questions that never got a reply, so a moderator can follow up instead of scrolling through hundreds of comments.
Coding open-ended interview transcripts
Pull every question a moderator asked out of a user-research transcript to separate the interviewer's prompts from the participant's answers during analysis.
Triaging inbound sales emails
Extract the specific questions inside a lengthy inbound email so a sales rep can answer each one directly instead of composing a reply from scratch.
FAQ
How do I extract questions from text using the API?
Send text to POST /text/extract-questions, get a task_id back immediately, and receive the list of extracted questions by webhook or a signed link once the task finishes.
Does it only find sentences ending in a question mark?
No — it also picks up implicit questions phrased as statements, like uncertainty about whether something happened, because those function as questions even without the punctuation.
Does it filter out rhetorical questions?
It leans toward excluding questions that clearly don't seek a real answer, prioritizing genuine information-seeking questions in the output.
Is there a free trial available?
There's no free tier — free tiers get abused and slow everyone down. Access runs on a prepaid ForHosting KIT balance: top up from $10.00 (it never expires) and each request is charged at its published price, so a call with no balance returns HTTP 402. No subscription, no tokens, no invented credits, and a failed task is never charged.
What does the question extraction API cost?
It's $0.003 per request plus $0.0135 per 1,000 words processed, and billing only applies to tasks that complete successfully.
Can I run this on call transcripts, not just written text?
Yes, as long as the audio has already been transcribed to text, the endpoint reads it the same way it reads any other document.
Can I process a large batch of tickets or transcripts?
Yes, each document is submitted as an independent asynchronous task, so you can queue as many as needed and collect results as each webhook arrives.
Does the output rephrase the questions or keep the original wording?
Extracted questions are returned in their original wording rather than paraphrased, which matters when the exact phrasing is useful for an FAQ or a direct quote.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, and soon from our app, email and Telegram.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/text/extract-questions \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"…"}'const res = await fetch("https://api.kit.forhosting.com/text/extract-questions", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "…"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/extract-questions",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "…"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/extract-questions", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"…"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"…"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/extract-questions", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"text": "…"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.extract_questions",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_tokens | 20000 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
422 | task_failed | The task failed after 3 retries. You are never charged for it. |