Skip to main content
POST
Start an analysis

Authorizations

x-preuve-key
string
header
required

Your API key (prv_...), sent as-is. It is the only credential the API needs - see the Authentication guide.

Body

application/json

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.

clientRunId
string
required

Caller-chosen idempotency id. Reusing it replays the existing run.

scanType
enum<string>
required

"starter" costs nothing; "deep" runs the full paid analysis and consumes account quota. "free" is accepted as a legacy alias of "starter".

Available options:
starter,
deep
idea
string
required

The startup idea, in plain language.

targetMarket
string
targetCountry
string

ISO country code, e.g. "US" or "FR".

title
string
stage
string

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
string

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.

language
string
default:en
enrichmentMode
enum<string>
default:core

"core" also generates the export-required sections; "none" returns the raw completion only.

Available options:
core,
none
publish
boolean

When true, creates a public share URL for the report.

Response

Run created (or replayed via clientRunId).

id
string<uuid>
reportId
string<uuid> | null

Null until the report row is attached, which is why a run that failed before dispatch is retryable under the same clientRunId.

clientRunId
string | null

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.

batchId
string<uuid> | null

The batch this run belongs to, or null for a standalone run.

scanType
enum<string>

Your request type. Reliable from creation, even while PROCESSING.

Available options:
starter,
deep
enrichmentMode
enum<string>
Available options:
core,
none
publish
boolean
reportType
enum<string> | null
Available options:
quick,
deep_dive,
null
analysisTier
enum<string> | null

Derived from the report. Deep runs read "basic" until deep sections land.

Available options:
basic,
advanced,
null
status
enum<string>
Available options:
PENDING,
PROCESSING,
COMPLETED,
FAILED
progressStep
string | null

Free-text pipeline stage while PROCESSING.

errorCode
string | null

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.

errorMessage
string | null
resetAt
string<date-time>

Present only on a batch item refused by the rolling daily cap; absent, not null, on every other run.

pollAfterSeconds
integer

Present only while polling is still useful. Pace by this rather than by a fixed interval.

pollHint
string

Present alongside pollAfterSeconds.

createdAt
string<date-time>
updatedAt
string<date-time>
readyForExport
boolean

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.

exportable
boolean

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.

exportBlockedCode
enum<string>

Present alongside exportable, naming the refusal.

Available options:
REPORT_NOT_FROM_AGENT_RUN
exportBlockedHint
string

Present alongside exportable. Relayable prose.

enrichment
object

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.

modules
object | null

Per-module statuses. Deep reports only; null on free runs.

reportUrl
string<uri> | null

Null until the report row exists.

shareUrl
string<uri> | null