Session Result
Poll for the async ResearchResult.
Polling contract (this is the public contract for the CLI, the web app, and any third-party consumer):
- Clients poll this endpoint after
POST /researchreturns{"status": "processing", "poll_url": ...}. - The recommended retry interval is 3 seconds. The CLI uses
3s; the body also surfaces
retry_after_secondsas a hint when we’ve decided a longer back-off is appropriate. - The 425 response IS the documented “still working” signal — it
is NOT an error. A typical 60-second basic-tier session will
emit roughly 20 successive 425 responses before flipping to
200. Operators: those 425s are downgraded to DEBUG in the
access log by
gecko_api.access_log_filter; if you’re seeing them flood INFO logs, that filter isn’t installed. - Stop polling on any of: 200, 4xx, 5xx, 410.
Status code semantics:
- 200 + ResearchResult JSON : workflow complete (terminal)
- 425 Too Early : still processing — retry in
~
retry_after_secondsseconds - 500 + : workflow raised — terminal
- 410 Gone + : session was killed by a container shutdown mid-flight (ECS rolling deploy / autoscale). Re-submit the original request to start a fresh session.
- 404 : session not found / soft-deleted
- 400 : session_id is not a UUID
Path Parameters
Response
Successful Response
Result of a full research() workflow.
basic, pro One-page business plan for the idea.
Quantified validation of the idea.
V1/V2/V3 scoped product requirements document.
S11-VERDICT-01 / S17-TONE-01 / S20-COHERENCE-VERDICT-LABEL-01 — single-token go/no-go signal surfaced to founders.
Derived from the structured gap_classification plus advisor
consensus (when available) plus the pro-tier coherence-flag count.
The typed gap stays as evidence — Verdict is the headline.
Mapping rule (see derive_verdict):
- ≥2 critic/voice flags of
incoherent_premise→KILL(pro-tier only) FullorFalse→PIVOTPartial:pricing/Partial:integrationAND advisor_consensus ≥ 0.8 →GOelse →REFINEPartial:segment | UX | geo→REFINE
S17-TONE-01 — vocabulary softened: KILL → PIVOT (same semantics,
framed as a redirect rather than a kill); BUILD → GO (more
energizing, shorter). REFINE is unchanged.
S20-COHERENCE-VERDICT-LABEL-01 — KILL is RE-INTRODUCED with refined
semantics distinct from the legacy v1 token. The legacy KILL meant
"weak idea, don't build as-is" and was renamed to PIVOT in S17. The
new KILL means "premise is INCOHERENT or unverifiable; no amount of
refinement saves it" — the dog-emotional-AI-blockchain class of idea
where the wedge can't be made real because the components don't
compose. Trigger condition is structural: ≥2 voices in the 5-agent
pro-tier debate flag incoherent_premise. Basic tier never emits
KILL (no debate to count flags from). The _missing_ hook below
maps the LEGACY "KILL" string still present in older
result_json rows / on-disk transcripts to PIVOT (their actual
semantic), NOT to the new KILL — the fresh KILL only ever comes from
the synthesizer's coherence-flag count, never from an upstream string.
The 20260502120000 migration backfills the JSONB rows for clean read
paths; the shim is defense in depth for any row written by an older
deploy mid-rollout or by an external SDK consumer that pinned an
older Verdict value.
PIVOT, REFINE, GO, KILL balanced, single_provider_dominates, thin_diversity greenfield, iterative, unclear high, moderate, unclear 0 <= x <= 1