Start an analysis
Create one analysis run. Async - poll with GET /api/agent/analyses/. scanType is required and explicit: “starter” costs nothing, “deep” consumes paid account quota. clientRunId is your idempotency key: re-POSTing the same value replays the existing run.
Authorizations
Your API key (prv_...), sent as-is. It is the only credential the API needs - see the Authentication guide.
Body
Every field an analysis request can carry. Nothing is required here - CreateAnalysisRequest and BatchAnalysisItem each add their own required list, because a batch item may inherit scanType from the batch while a standalone create must state it.
Caller-chosen idempotency id. Reusing it replays the existing run.
"starter" costs nothing; "deep" runs the full paid analysis and consumes account quota. "free" is accepted as a legacy alias of "starter".
starter, deep The startup idea, in plain language.
ISO country code, e.g. "US" or "FR".
Where the founder is today. Canonical values: idea, validation, mvp, launched, growth, scaling (free text tolerated). Optional here, but the MCP tools require it for deep scans; it feeds the feasibility analysis.
Budget available to pursue the idea. Canonical values: bootstrap (no outside money), 10k, 50k, 100k, 100kPlus (over $100k), 1mPlus (over $1M); free text tolerated. Optional here, but the MCP tools require it for deep scans; it feeds the feasibility analysis.
"core" also generates the export-required sections; "none" returns the raw completion only.
core, none When true, creates a public share URL for the report.
Response
Run created (or replayed via clientRunId).
Null until the report row is attached, which is why a run that failed before dispatch is retryable under the same clientRunId.
The caller-chosen id from create. Null when the analysis is a dashboard-created report resolved by its report id: no run row exists, so there is no clientRunId to replay.
The batch this run belongs to, or null for a standalone run.
Your request type. Reliable from creation, even while PROCESSING.
starter, deep core, none quick, deep_dive, null Derived from the report. Deep runs read "basic" until deep sections land.
basic, advanced, null PENDING, PROCESSING, COMPLETED, FAILED Free-text pipeline stage while PROCESSING.
Set on a FAILED run. Two internal markers are deliberately rewritten before they leave: an ambiguous dispatch reports TRIGGER_DISPATCH_FAILED and an ambiguous claim refund reports REPORT_CREATE_FAILED.
Present only on a batch item refused by the rolling daily cap; absent, not null, on every other run.
Present only while polling is still useful. Pace by this rather than by a fixed interval.
Present alongside pollAfterSeconds.
Whether GET /export will serve this analysis now. Always false for a report created on the preuve.ai dashboard, whatever state the report is in, because that export answers 403 REPORT_NOT_FROM_AGENT_RUN. Branch on exportable first.
Present, and false, only on a report created on the preuve.ai dashboard. Absent means the ordinary contract applies and readyForExport is the gate. When it is false, no amount of polling or enriching changes it.
Present alongside exportable, naming the refusal.
REPORT_NOT_FROM_AGENT_RUN Present alongside exportable. Relayable prose.
Progress of the core export sections. The four name arrays partition required, so a poller decides what to do next by reading them rather than by parsing status: anything in processing means keep polling, anything in failed means call enrich again, and missing with nothing processing means enrichment was never started for it.
Per-module statuses. Deep reports only; null on free runs.
Null until the report row exists.