Question bank
Real interview questions, searchable by company, topic and difficulty.

A read-only library of questions companies actually ask, plus anything your organisation has added privately. Use it to build practice sets, seed your own screening flow, or show candidates what a company tends to ask.
It costs no credit. It is reference data, not an assessment, so nothing here creates a session, schedules anything, or records a result.
What is in it
Two sources. leetcode questions carry a public url and an acceptance rate.
curated questions are ours, and cover the ground LeetCode does not: aptitude,
HR and behavioral, finance, management, and the core engineering streams.
Every question carries a statement_html we wrote, marked
statement_source: "ai". It is a problem description, approach, complexity and
edge cases, not a copy of the original text. Check statement_available before
rendering it, and fall back to url when it is false.
Browsing
Four list endpoints, all filters for the fifth.
curl https://prep-api.experthire.cloud/v1/question-bank/companies \
-H "Authorization: Bearer $EH_SECRET_KEY"
Still a placeholder: $EH_SECRET_KEY. Add it under Your values above.
{
"object": "list",
"data": [
{
"id": "c31b90ab-a0fc-40d5-b2c0-cee99f465b84",
"name": "Accenture",
"slug": "accenture",
"question_count": 92
}
],
"has_more": false,
"total_count": 61
}
categories and topics return plain strings rather than objects, since there
is nothing else to say about them:
curl https://prep-api.experthire.cloud/v1/question-bank/categories \
-H "Authorization: Bearer $EH_SECRET_KEY"
Still a placeholder: $EH_SECRET_KEY. Add it under Your values above.
{
"object": "list",
"data": [
"Aptitude", "Arts/Humanities", "Civil", "Electrical/EEE",
"Finance & Commerce", "HR/Behavioral", "Management (MBA)",
"Mechanical", "Software/Coding"
],
"total_count": 9
}
A category is the stream. A topic is the tag on an individual question
(Array, Dynamic Programming, Accounting). There are far more topics than
categories, and a question carries several.
Searching
curl -G https://prep-api.experthire.cloud/v1/question-bank/questions \
-H "Authorization: Bearer $EH_SECRET_KEY" \
--data-urlencode "company=accenture" \
--data-urlencode "difficulty=medium" \
--data-urlencode "sort=frequency" \
--data-urlencode "limit=20"
Still a placeholder: $EH_SECRET_KEY. Add it under Your values above.
| Parameter | Values |
|---|---|
company | Company slug, from the companies list |
category | Exact category string |
topic | A single topic tag |
difficulty | easy, medium, hard |
time_bucket | 30d, 90d, 180d, all (default) |
search | Substring of the title |
sort | frequency (default), difficulty, acceptance |
time_bucket only means something alongside company: it selects how recently
that company was seen asking the question. frequency sorts by the same signal.
Each row carries company_name and company_slug for the company that asks it
most in the selected window, so a list is renderable without a second call.
Fetching one
curl https://prep-api.experthire.cloud/v1/question-bank/questions/$QUESTION_ID \
-H "Authorization: Bearer $EH_SECRET_KEY"
Still a placeholder: $QUESTION_ID, $EH_SECRET_KEY. Add them under Your values above.
The detail response is the question without the company columns, since a question can belong to several.
Paging
Follow next_cursor while has_more is true, the same as everywhere else.
This cursor is offset-backed, unlike the one on interviews. Questions are
ordered by frequency and acceptance, which are not unique and shift when the
bank refreshes, so a page taken during a refresh can repeat or miss a row. It
does not matter for browsing. If you are exporting the bank, pin sort and
accept that a refresh mid-export means rerunning it.
Access
Gated on the question_bank module. If it is off you get 403 with code
module_not_enabled, and GET /v1/usage reports it false. Nothing here
touches credits in either environment, and sandbox returns the same bank as
live.