Skip to main content
GET
Poll 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.

Path Parameters

id
string<uuid>
required

Run id (returned by create) or report id. What resolves differs per route: the poll also accepts any personal starter or deep report the account owns, including dashboard-created ones (the UUID in /app/results?id=...), while export and enrich serve analyses this API started. See each operation.

Response

Current run state.

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