TestBuddy for developers and agents
Everything TestBuddy publishes about admission tests — which exams exist in a market, how each one is built and scored, what preparation costs — is available as JSON, as markdown, and as tools an AI agent can call directly. No API key, no account, nothing to sign.
The public read API
Four GET endpoints, returning the same data the pages render in HTML. Read-only: nothing here writes anything. Please keep request rates reasonable — there is no key, so there is nothing to revoke, only an IP to rate-limit.
Machine-readable specification: /openapi.json (OpenAPI 3.1, also at /.well-known/openapi.json). Every operation carries an operationId, typed parameters and a response schema, so it can be dropped straight into a function-calling setup.
| Operation | Endpoint | What it returns |
|---|---|---|
searchTests | GET /api/tests?q={text}&locale={locale} | Find the admission tests covered for a market. Returns slug, category, and the exam, manual and practice URLs. |
getTest | GET /api/tests?slug={slug} | One exam in full: subjects, questions per subject, timing, marks for correct/wrong/blank, options per question, exam dates and key deadlines. |
getPricing | GET /api/pricing?q={text}&locale={locale} | Subscription plans for 1, 3, 6 and 12 months: total in euro, equivalent monthly cost, what the plan includes. |
searchHelp | GET /api/help?q={question}&locale={locale} | Search the official FAQ. Returns the question, the full answer and the canonical URL. |
Try it
curl "https://testbuddy.ai/api/tests?q=ucat&locale=en-gb" curl "https://testbuddy.ai/api/tests?slug=ucat" curl "https://testbuddy.ai/api/pricing?locale=en-gb" curl "https://testbuddy.ai/api/help?q=early%20access"
locale decides what exists
TestBuddy serves around thirty markets from one catalogue, so the same query returns different exams depending on the locale: en-gb gets UCAT, de gets MedAT and TMS, en-us gets MCAT. Omitting it gives you the US and international default, which may be the wrong catalogue for the person you are answering. Pass the locale of the market you are serving.
Italian-language exams are on another site
TOLC, Semestre Filtro di Medicina, Professioni Sanitarie and the other exams sat in Italian are not in this catalogue and will never be returned here. They are covered on testbuddy.it, which has its own catalogue, prices and app — and its own copy of this API at testbuddy.it/openapi.json. Asking for one of them here returns 404 with the address to go to, rather than data this site does not own.
Errors
Every error is JSON, never an HTML page — including an unknown path under /api. The body carries a stable code, a one-sentence message and a hint saying what to do about it.
Rate limit
120 requests per minute per IP, shared across the endpoints — generous on purpose: the limit is there to stop a runaway loop, not to ration legitimate use. Every response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (seconds until the window resets), so you can self-throttle instead of discovering the ceiling by hitting it. A 429 adds Retry-After with the same number.
One caveat worth stating rather than hiding: the counter lives in the serverless instance, so with several instances warm the real ceiling is higher than the published one — never lower. Stay under 120/minute and you will not be blocked; treat RateLimit-Remaining as a reliable floor rather than an exact balance.
Versioning and deprecation
Every response carries API-Version (currently 1). A breaking change ships as a new version; the previous one keeps answering for at least six months, marked with Deprecation and Sunset response headers (RFC 9745 and RFC 8594) so an integration finds out from the wire rather than from a broken parse. Additive changes — a new field, a new optional parameter — do not bump the version: treat unknown fields as forward-compatible rather than pinning to an exact shape.
Pages as markdown
Append .md to a content URL, or send Accept: text/markdown, and you get the page as clean markdown with no navigation chrome. This follows acceptmarkdown.com: q-values are honoured, responses carry Vary: Accept, and an Accept we cannot satisfy gets a 406 that says what we can serve.
curl -H "Accept: text/markdown" https://testbuddy.ai/ curl https://testbuddy.ai/en/help.md
WebMCP tools for browser agents
An agent running inside the browser finds the same four lookups registered on document.modelContext, so it can call them instead of reading the DOM. They take the locale from the page being viewed.
search_tests— Find the exams covered for the market of the page being viewed.get_test_details— How one exam is built: subjects, timing, scoring, dates.get_pricing— Plans and prices for that market.search_help— The official FAQ, full answers included.
Index for agents
/llms.txt says what TestBuddy is, when to use it, when not to, and lists every route above. Start there if you are landing cold.
Questions
Write to support@testbuddy.ai. If you are building something on this data, tell us what you need — the API exists because the site already had the data, and it grows with what people ask for.