Search sources
const url = 'https://api.hyperresearch.ai/v1/answers/search';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"query":"example","max_results":10,"mode":"standard"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.hyperresearch.ai/v1/answers/search \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "query": "example", "max_results": 10, "mode": "standard" }'Search the web and the structured sources (filings, statistics, registers, scholarly, books). Ranked raw sources with verbatim passages, no synthesis. Billed per call from the prepaid wallet: standard 5¢, max 15¢ (mode). A search that fails is free; one that finds nothing is free unless it was expensive to run (then 1.5x our cost, at most the mode price). Honours Idempotency-Key.
Authorizations
Section titled “Authorizations”Parameters
Section titled “ Parameters ”Header Parameters
Section titled “Header Parameters”Retry safely: the same key and body replay the first call with one charge.
Retry safely: the same key and body replay the first call with one charge.
Request Bodyrequired
Section titled “Request Bodyrequired”object
Standard 5¢ (web indexes and structured sources, the top pages read live; ~10-20 s) · max 15¢ (every provider, PDF tables; ~20-45 s) per call. A search that fails is free; one that completes with no results is free unless it was expensive to run (then 1.5x our cost, at most the mode price).
Responses
Section titled “ Responses ”Ranked sources with verbatim passages, and what the call cost
object
object
1 is the best match.
The page date (ISO 8601) when a source dated it.
web for the open web, or the structured source the record came from (for example edgar, openalex, worldbank).
web a web page, record a structured-source record, data rows of a dataset.
A short lead (up to ~300 characters). The passages carry the full text.
object
Text from the page that matches the query: a 1-3k-character cut that keeps the rows of a table together. Plain text, no Markdown links.
True when the passage was cut from the live page we fetched (word for word); false when it is the excerpt the search index returned.
ms (engine time), mode, reranked, fetched (pages read live), and errors (one { kind: "source_unavailable" } per source that failed).
object
Example
{ "results": [ { "kind": "web" } ], "status": "ok", "mode": "standard"}Headers
Section titled “Headers”Example
"reads";q=60;w=60The quota policy this request was counted against (draft-ietf-httpapi-ratelimit-headers): "<bucket>";q=<requests>;w=<window seconds>, e.g. "reads";q=60;w=60. Buckets: reads 60/min, status 600/min, creates 10/min, writes 20/min per credential; public 300/min per network on keyless routes.
Example
"reads";r=57;t=41Remaining quota in the current window: "<bucket>";r=<remaining>;t=<seconds until reset>, e.g. "reads";r=57;t=41.
Requests allowed per window in this bucket (legacy form of RateLimit-Policy).
Requests left in this window (legacy form of RateLimit).
Unix time (seconds) when the window resets.
Which bucket counted the request: reads, status, creates, writes or public.
Invalid request
object
object
Example
{ "error": { "type": "invalid_request", "code": "missing_api_key", "request_id": "req_01J9ZQ7V6H0000000000000000" }}Authentication failed
object
object
Example
{ "error": { "type": "invalid_request", "code": "missing_api_key", "request_id": "req_01J9ZQ7V6H0000000000000000" }}insufficient_balance (with topup_url, price_cents, balance_cents) or wallet_frozen
object
object
Example
{ "error": { "type": "invalid_request", "code": "missing_api_key", "request_id": "req_01J9ZQ7V6H0000000000000000" }}Insufficient scope or plan
object
object
Example
{ "error": { "type": "invalid_request", "code": "missing_api_key", "request_id": "req_01J9ZQ7V6H0000000000000000" }}Not found
object
object
Example
{ "error": { "type": "invalid_request", "code": "missing_api_key", "request_id": "req_01J9ZQ7V6H0000000000000000" }}idempotency_key_reuse or idempotency_in_flight
object
object
Example
{ "error": { "type": "invalid_request", "code": "missing_api_key", "request_id": "req_01J9ZQ7V6H0000000000000000" }}Rate limited or over quota
object
object
Example
{ "error": { "type": "invalid_request", "code": "missing_api_key", "request_id": "req_01J9ZQ7V6H0000000000000000" }}Headers
Section titled “Headers”Seconds to wait before retrying. Always present on a 429.
Example
"reads";q=60;w=60The quota policy this request was counted against (draft-ietf-httpapi-ratelimit-headers): "<bucket>";q=<requests>;w=<window seconds>, e.g. "reads";q=60;w=60. Buckets: reads 60/min, status 600/min, creates 10/min, writes 20/min per credential; public 300/min per network on keyless routes.
Example
"reads";r=57;t=41Remaining quota in the current window: "<bucket>";r=<remaining>;t=<seconds until reset>, e.g. "reads";r=57;t=41.
Requests allowed per window in this bucket (legacy form of RateLimit-Policy).
Requests left in this window (legacy form of RateLimit).
Unix time (seconds) when the window resets.
Which bucket counted the request: reads, status, creates, writes or public.
Internal error
object
object
Example
{ "error": { "type": "invalid_request", "code": "missing_api_key", "request_id": "req_01J9ZQ7V6H0000000000000000" }}