Skip to main content
This page documents the data structures and conventions used across all V1 API endpoints.

Common Conventions

IDs

All entity identifiers are UUIDs (RFC 4122):

Timestamps

Timestamp conventions differ between the unified entity endpoints and the policy / task / file endpoints:
  • Unified entity endpoints (exposure, event, quote, submission, person, organization) return createdAt / updatedAt as epoch-second integers inside the entity envelope:
  • Policy versions/transactions, tasks, files, and reporting return timestamps such as transactionTimestamp, createdAt, and deadline as ISO 8601 strings in UTC:
Each entity’s overview page documents its exact response shape.

Dates

Endpoint-level date parameters such as startDate, endDate, and effectiveDate use ISO 8601 date strings ("2026-01-15"). Values in fields typed Date use the canonical object described below, including policy policyStartDate and policyEndDate fields.

Nullable Fields

Fields that may be absent are typed as T | null. For example, policyId: string | null means the field is always present in the response but may be null.

Pagination

Pagination differs between the unified entity list endpoints and the notes / tasks / files list endpoints.

Unified entity list endpoints

The entity list endpoints (exposure, event, quote, submission, person, organization) return:
Query parameters:

Notes, tasks, and files

The notes, tasks, and company-files list endpoints use 1-based page / pageSize query parameters (page=1 is the first page). See each endpoint’s reference for its exact response shape.

fieldModelV1Data

Most V1 entities store their custom field data in a fieldModelV1Data object. The shape of this object is defined by your company’s field configuration — call the entity’s /configuration endpoint to discover available fields, types, and validation rules. Keys in fieldModelV1Data are field reference IDs (the stable identifiers you define when configuring fields).

Field Value Types

Date Fields

Date fields are one canonical object — a calendar day pinned to an IANA time zone:
Endpoint-level date parameters (such as a transaction’s effectiveDate, or a cancellation’s cancellationDate) are plain ISO 8601 date strings ("2026-01-15"), not the object. The object is the shape of every field typed Date inside field data — including the policy term dates policyStartDate / policyEndDate.

Option Set Fields

Option set values are stored as string keys (not labels). Use the /configuration endpoint to map keys to human-readable labels. Single-select:
Multi-select:
The configuration schema uses oneOf to enumerate valid options:

Configuration Schema

All entity types have a /configuration endpoint that returns a JSON Schema (Draft 2020-12) describing valid field data, wrapped under a top-level fields key:
For entities that embed exposures (Quote), the embedded exposure schema is nested under the corresponding join field (e.g. exposures) within the same fields schema, not returned as a separate top-level key. Calculated values, server-populated fields, and lifecycle fields are excluded.

Schema Type Shapes

The configuration response publishes the actual JSON shape of each field. Text, Phone, URL, and Email fields are strings; Number fields are numbers; Boolean fields are booleans; and Percentage fields are scaled integers. Date, Address, AddressV2, and custom-object fields publish their nested object properties. Option-set fields are strings with oneOf entries and an x-optionSetName; list cardinality wraps the field shape in an array. Join fields use a format such as entity:exposure and contain an entity ID (or an array of IDs for a list join). For a Date field, the nested date string carries format: date; the Date field itself remains the canonical object. The response schema requires both date and timezone because those are always present in stored and returned values. On API writes, timezone may still be omitted and defaults to America/New_York.

Entities

Entity envelope

The unified entity endpoints (exposure, event, quote, submission, person, organization) all return the same generic envelope. All entity-specific field values live inside fieldModelV1Data, keyed by field referenceId — there is no top-level companyId, policyId, or submissionId. See the Entities overview for the parametric CRUD surface shared by every entity type (exposures, events, quotes, submissions, persons, organizations), and discover each type’s caller-required fields via its configuration endpoint — the keys you must send on a create, because nothing in the pipeline produces them.
Cross-entity links are expressed as Join fields inside fieldModelV1Data (for example quoteSubmission on a quote, or eventPolicy on an event), not as separate top-level keys. Calculated and lifecycle fields (e.g. quoteStatus, quoteNumber, submissionNumber) are resolver-populated and cannot be set via the API.
The /configuration response shape is documented under Configuration Schema above.

Directory entities (Persons & Organizations) and custom objects

Persons and Organizations are built-in Directory entities backed by the custom-object model; both use the entity envelope above and the company.fmv1_custom_object:* permission family. Configurable relationships between objects use these cardinality values: Relationship cardinality values: one_to_one, one_to_many, many_to_one, many_to_many

Policy Model

Policies use a transaction-based, temporally-versioned data model. Rather than directly editing policy fields, you submit transactions (new business, endorsement, cancellation, etc.) that produce immutable versions. For a deep dive, see Policy Concepts.

Policy Version

Each transaction produces a new policy version containing one or more segments — date ranges where the policy state is identical.

Pricing Contract

fullTermPricingInfo: null means no policy pricing and is supported on both policies and quotes. A present fullTermPricingInfo object is the policy’s price for the whole term. It is invariant across every segment, and it appears both hoisted at the response root and inside each segment’s data. A present object always contains the component array and all four numeric rollups. An empty array produces zero for every rollup, which is distinct from outer null. Legacy API input with missing or null pricingComponents inside a present object is normalized to [] before stamping; reads return the required array. Lifecycle request omission retains each operation’s existing inherit/derive semantics and does not clear pricing. All four rollups are computed by the platform on every write and are always present on a non-null pricing response; a value you send is ignored and recomputed. Each registry entry names the rollup its classification reports into, which is how a component finds its rollup. Retired rollups. The brokerCommission and programCommission rollups are retired: commission is money owed by the carrier, not part of the policy’s price, so it belongs to the Billing Aggregate, not the pricing contract. The platform no longer computes them, and they were never writable. A policy version stored before the retirement may still return the two keys until the per-tenant data sweeps — treat them as historical output and do not rely on their presence.

Pricing Component

Every component you submit must carry a classification naming a live entry in your company’s classification registry — unconditionally, for every company. A component without one is rejected with a 400. The retired legacy fields (group / kind / earningBasis) are ignored and discarded on input: never validated, never stored on a newly written component. A stored component that still echoes them can be posted back unchanged (echo tolerance). See Pricing Component Identity for the defaults and the refusals. A component’s identity is the pair <classification, qualifier>, unique within one contract.

Billing Aggregate

fullTermBillingInfo is the policy’s term-level billing channel: what is owed, per line item, free of invoices. Like the pricing contract it is invariant across segments and hoisted onto responses, and it carries no classification and no rollup. You author it, except on a cancel or reinstate, where the platform derives it when you omit it.

Billing Line

Identity is the pair <invoiceType, lineItem>, unique within one container. Structure is validated on every request; a stated aggregate must also satisfy the receivable checksum (the receivable amounts sum to fullTermPricingInfo.total) and per-line vocabulary and direction (each <invoiceType, lineItem> names a live invoice type and line item type, and direction matches how that line item is configured). See The Billing Aggregate.

Policy Segment

A segment is a date range within the policy term where the policy state is constant. Segments are derived from final state — they are not one-per-transaction.

Policy Transaction

Transactions are the immutable record of changes to a policy. Transaction action values: NEW_BUSINESS, ENDORSE, CANCEL, REINSTATE, RENEW

Transaction Delta

Deltas describe the field-level changes a transaction made within a date range.

Policy List Item

List endpoints return a summary with optional segment detail:

Bordereau Row

Bordereau export provides a flat row per policy transaction for reporting.

Entity Relationships