Skip to main content
POST
Start Data Validation Run

Authorizations

Authorization
string
header
required

User-principal OAuth 2.0 Bearer authentication. Send a user-scoped Auth0 access token (audience = the app API audience) as Authorization: Bearer <jwt>. The request resolves to the user's identity and is authorized by their Role on the {companyId} in the path — the same role-based permissions the web app enforces. This is the path the MCP connector uses to act on a user's behalf; endpoints that accept it list both BearerAuth and ApiKeyAuth.

Path Parameters

companyId
string<uuid>
required

Company identifier

Query Parameters

force
boolean
default:false

When true, start a new run even if a run is already in flight for this company scanning the same configuration — i.e. skip the duplicate check and always mint a fresh run. Any value other than true (including omission) is treated as false.

This does not raise the limit of 3 runs in flight per company: a ?force=true request past that limit still gets a 429.

Unlike force on import, this needs no additional permission and destroys nothing — the only cost of forcing is a redundant scan.

Body

application/json

OPTIONAL. Omit the body entirely to scan the company's live configuration — that is the documented way to ask for a live scan, and no query flag is needed for it.

When a body IS sent it must be a COMPLETE configuration document matching the schema below, and the run scans that candidate configuration instead; nothing is persisted. A delta/patch body is rejected with a 400, and so is a body that cannot be read as JSON.

Accepts either the existing split definitions or unified customObjects and optionSets. Do not mix formats. Both inputs produce the same stored configuration; exports return unified definitions.

fields
object[]
required

Field definitions, keyed by entity + reference id.

One top-level field definition, keyed by entity + reference id. Declare its type with structured typeInfo. Legacy type and string-encoded typeArgs remain accepted; when both representations are supplied they must agree semantically. A conflict is rejected with the field identity. Exports use typeInfo without the legacy duplicate properties.

pages
object[]
required

Page definitions.

cards
object[]
required

Card definitions.

cardPageRelationships
object[]
required

Placements of cards onto pages.

optionSetTypes
object[]
required

Option-set type declarations.

objectTypes
object[]
required

Custom-object type declarations.

optionSets
object[]
required

Option sets and their options.

objects
object[]
required

Custom-object sub-field definitions, joined to object types.

fieldLocations
object[]
required

Field placements (the layout) onto cards.

ratingWorkflows
object[]
required

Rating workflow definitions.

entityInvariants
object[]
required

Per-entity invariant conditions enforced on every write.

formLogicRules
object[]

Forms-logic rules (quote-flow auto-add rules). Optional — existing payloads predate the "Forms" tab; absent ⇒ no rules.

smartTags
object[]

Smart tags — the named values resolved into generated documents. Optional: existing payloads predate the slice, and absent ⇒ no smart tags, which is also how a company that has not yet moved to this format is recognised.

Omitted from an export when the company has none, rather than emitted as an empty array.

exportSurfaces
object[]

Declared export columns — the tenant-facing column set of each export surface (the seven entity exports plus the bordereau). Optional: existing payloads predate the slice, and absent ⇒ no declared columns, which is also how a surface that still offers every configured field is recognised.

Activation is per surface: a surface with at least one row here resolves its whole tenant column set through those rows, in the order they appear; a surface with none behaves exactly as it did before this section existed.

Omitted from an export when the company has declared none, rather than emitted as an empty array.

One declared export column — a tenant-facing column on one export surface. Mirrors the ExportSurfaceRowDefinition shape.

A surface is one column set: each of the seven entity exports, plus the bordereau. bordereau reads Policy fields like the policy surface does, but it is a separate report with its own fixed columns, so it is its own surface.

A column's identity is the (surface, key) PAIR: there is one row per surface, so the same key on two surfaces is two independent columns that may disagree about everything else. Labels are therefore unique within a surface, not company-wide.

Columns are explicitly declared. A surface with no declarations exports only its platform columns. An optional rowSource makes a declaration available when exporting one row per item of that saved Object/List field.

COLUMN ORDER IS CANONICAL, not authored: the stored configuration sorts this section by (surface, key), so the order rows appear in a request body does not survive the round trip. Read a column's position off its key, never off its position here.

A row must carry spreadsheetType, or both valueType and cardinality.

listColumns
object[]

Declared list columns — the complete tenant-facing column set of each entity list page. Optional: existing payloads predate the slice, and absent ⇒ no declared tenant columns, so each list renders only its platform/system columns.

Rows declare membership, not order or default visibility. The platform's per-page defaults and each user's saved view own those choices; the stored configuration sorts rows canonically by (surface, key).

Omitted from an export when the company has declared none, rather than emitted as an empty array.

listFilters
object[]

Tenant-defined list filters, one per (surface, key). Together with page-owned system filters, these rows are the complete user-visible filter catalog. listColumns contributes no filters.

Optional for wire compatibility with payloads that predate the slice. Absent or empty means that each entity list offers only its page-owned system filters. Omitted from an export when the company has none.

conversionRules
object[]

Explicitly authored rules determine which values move between Policy and Quote, their destinations, and transformations. Authors maintain each direction and transaction scope independently. Matching field names imply no mapping; an absent optional mapping is valid and causes no conversion write to that destination. A rule may directly assign a source value or transform it, including writing to a differently named destination.

Each rule is identified by its (direction, transactionType, destinationPath) triple; duplicates are rejected. The stored configuration sorts the section canonically by that triple. Import validates explicit rules and requires all framework-pinned rows, including on first import. Omitting or emptying the section is invalid, even with force enabled. Preserve the authored slice through whole-configuration imports. Field edits require reviewing affected rules against business intent.

retirementIdentities
object[]

Server-derived memory for retired data addresses. Records have exactly one of three kinds: top-level field, custom-object subfield, or option-set value. A submitted copy is accepted for export/import round trips but is non-authoritative; the server derives the next set from the previous immutable configuration version. Omitted when empty.

exportPlatformColumns
object[]

Spreadsheet types for built-in (platform) export columns, one per (surface, column). Optional: absent or empty means platform columns keep their built-in formatting. column must name a built-in column of the surface (checked by name at import). Omitted from an export when empty.

Response

The run to poll. outcome: "enqueued" means a new scan was started; outcome: "duplicate" means runId is a run already in flight scanning this same configuration and no second scan was started.

The run to poll after starting a data-validation run. outcome is a policy verdict delivered as a successful 200, not an error: duplicate means a run scanning this same configuration was already in flight, so runId is that run and no second scan was started.

runId
string<uuid>
required

The run to poll via GET /api/v1/companies/{companyId}/configuration/data-validation-runs/{runId}

outcome
enum<string>
required

enqueued when a new scan was started; duplicate when a run already in flight was scanning this same configuration (pass ?force=true to start a new run anyway)

Available options:
enqueued,
duplicate