curl --request GET \
--url 'https://api.gurubase.io/api/v1/{guru_slug}/answer-progress/?external_user_id=end-user-123' \
--header 'x-api-key: YOUR_API_KEY'
import requests
url = "https://api.gurubase.io/api/v1/{guru_slug}/answer-progress/"
params = {"external_user_id": "end-user-123"}
headers = {"x-api-key": "YOUR_API_KEY"}
response = requests.get(url, params=params, headers=headers)
print(response.json())
{
"status_text": "Searching the knowledge base...",
"updated_at": 1755846130.482
}
{
"status_text": "",
"updated_at": null
}
{
"msg": "external_user_id is required"
}
{
"msg": "Invalid API key"
}
{
"msg": "Guru type {guru_slug} not found"
}
{
"msg": "Request was throttled. Expected available in 56 seconds."
}
Endpoints
Answer Progress
Read the live progress line for an in-flight answer
GET
/
{guru_slug}
/
answer-progress
/
curl --request GET \
--url 'https://api.gurubase.io/api/v1/{guru_slug}/answer-progress/?external_user_id=end-user-123' \
--header 'x-api-key: YOUR_API_KEY'
import requests
url = "https://api.gurubase.io/api/v1/{guru_slug}/answer-progress/"
params = {"external_user_id": "end-user-123"}
headers = {"x-api-key": "YOUR_API_KEY"}
response = requests.get(url, params=params, headers=headers)
print(response.json())
{
"status_text": "Searching the knowledge base...",
"updated_at": 1755846130.482
}
{
"status_text": "",
"updated_at": null
}
{
"msg": "external_user_id is required"
}
{
"msg": "Invalid API key"
}
{
"msg": "Guru type {guru_slug} not found"
}
{
"msg": "Request was throttled. Expected available in 56 seconds."
}
The streaming Ask Question call holds one
connection, so a client that wants to show what the Guru is doing right now
(retrieval, which tool is running) polls this endpoint instead of guessing from
elapsed time.
Each end user gets their own progress line, keyed by the
external_user_id you
pass. Poll while the answer stream is open and stop as soon as the stream ends.
Polls count against the same per-end-user rate limit as Ask Question, so poll
no more than every 1 to 2 seconds.
Progress text is generated from the pipeline stages. Only the argument values an
Agentic Action declares as an
enum are echoed into the line.
Treat the line as a status hint, not as content to store.Path Parameters
string
required
The slug of the Guru whose in-flight answer is being polled.
Headers
string
required
Your API key for authentication. You can obtain your API key from the Gurubase dashboard.
Query Parameters
string
required
The same
external_user_id you passed to the Ask Question call whose progress you want to read.Response
string
A short human-readable line describing what the pipeline is doing right now
(for example
Gathering context..., Searching the knowledge base...,
Using: search_orders, Writing the answer...). Empty string when nothing has
been reported yet or the line has expired (about 2 minutes after its last
update). The last line (Writing the answer...) stays after the stream ends
until it expires.number | null
Unix timestamp (seconds, float) of when
status_text was last written. null
when nothing has been reported yet or the line has expired. Compare it against the time you started
the answer request to discard a stale line left over from a previous question
on the same external_user_id.curl --request GET \
--url 'https://api.gurubase.io/api/v1/{guru_slug}/answer-progress/?external_user_id=end-user-123' \
--header 'x-api-key: YOUR_API_KEY'
import requests
url = "https://api.gurubase.io/api/v1/{guru_slug}/answer-progress/"
params = {"external_user_id": "end-user-123"}
headers = {"x-api-key": "YOUR_API_KEY"}
response = requests.get(url, params=params, headers=headers)
print(response.json())
{
"status_text": "Searching the knowledge base...",
"updated_at": 1755846130.482
}
{
"status_text": "",
"updated_at": null
}
{
"msg": "external_user_id is required"
}
{
"msg": "Invalid API key"
}
{
"msg": "Guru type {guru_slug} not found"
}
{
"msg": "Request was throttled. Expected available in 56 seconds."
}
Was this page helpful?