Answer a run’s clarification questions
const url = 'https://api.hyperresearch.ai/v1/runs/example/clarify';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"answers":[{"axis":"example","answer":"example"}],"skip":true}'};
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/runs/example/clarify \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "answers": [ { "axis": "example", "answer": "example" } ], "skip": true }'Answers the questions a clarifying run is waiting on, and admits it: the reservation, the trial allowance and the Workflow launch all happen now, against the account as it stands now. Answer by axis, not by position. An answer of you_decide (or an empty string) records that question’s stated assumption as the decision, and skip: true does that for every question at once — which is also what the 30-minute time-box does if nobody comes back. Answering a run that is no longer clarifying is a 409, except when it was admitted a moment ago by a racing click or by the time-box, which answers 202 with the run that won.
Authorizations
Section titled “Authorizations”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters”Request Bodyrequired
Section titled “Request Bodyrequired”object
object
A few words. The literal you_decide (or an empty string) records the stated assumption as the decision instead.
Proceed on every stated assumption without answering. The same thing the 30-minute time-box does.
Examplegenerated
{ "answers": [ { "axis": "example", "answer": "example" } ], "skip": true}Responses
Section titled “ Responses ”Run queued
object
clarifying when the question was ambiguous enough to be worth asking about, or was not a research question at all. The run exists at its final id and is waiting at POST /v1/runs/{id}/clarify; nothing has been reserved or charged, so price_cents is null. aborted is only ever answered by POST /v1/runs/{id}/clarify, for an interview that ran out of rounds without finding a research question: that run started nothing, reserved nothing and claimed no included run.
object
object
The named dimension this question is about (scope, time_window, geography, …). Answer by axis, not by position.
What the run will do if this question is not answered. Shown behind “You decide” and in the skip-all confirmation, and printed in the report’s Assumptions paragraph.
The span of the customer’s own question that prompted this one, when it could be quoted verbatim.
object
The literal you_decide when the customer left this to us; the assumption then records the decision.
Every default this run is proceeding on — verbatim the sentences its report prints.
When an unanswered interview times out; what happens then is on_timeout. Null once the interview is settled.
Present while status is asking: what happens at expires_at if nobody answers. start admits the run on its stated assumptions (or closes it without charge if it cannot be admitted then — spend cap, no payment method); close ends it without starting and without charge, which is what an interview that found nothing to research does.
A sentence about the interview rather than about the question: that the ambiguity assessment could not be made (resolution: "unassessed"), that nothing has started while we ask what to research, or that the time-box closed the run without charge.
Example
{ "id": "run_01J9ZQ7V6H0000000000000000", "status": "queued", "tier": "auto", "clarification": { "status": "asking", "on_timeout": "start", "resolution": "answered" }}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" }}Spend cap exceeded, or no allowance left
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" }}This run is not waiting on clarification
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" }}