Skip to main content
Address, AddressV2, Date and StringOrNumber each define their own JSON value shape. These shapes are shared across companies; a tenant configuration selects a field’s type and does not redefine that type’s members. Read a field’s typeInfo.kind from its configuration before writing its value. The API validates values against that declared field type on create and update, including values nested in custom objects and policy transactions. Invalid values receive a 400 response with the affected field path. Address and AddressV2 are independent field types with different shapes. A company may configure both. Custom objects such as NumberLimit instead define their members in the tenant’s objects configuration.

Address

Structured postal address as a single flat set of components. Used wherever a property, mailing, or risk location appears in your field model. Address is a permanent field type with its own flat storage contract. It is not an alternate input shape for AddressV2. Required sub-fields: none. A partial address (e.g. street + city, no county) is valid — Address sub-fields are all optional, so partial address values are accepted. (Whether an address must exist at all is governed by the embedding field’s own required condition.)
zipCode must be a JSON string, never a number. JSON numbers cannot represent leading zeros — 02140 parses as 2140, silently corrupting the ZIP. The API rejects numeric zipCode values with 400:
This is the most common failure when payloads are generated from spreadsheets, OpenAPI codegen with the wrong type, or LLMs that “helpfully” unquote numeric-looking strings — always quote ZIP codes in your payload.

AddressV2

A postal address modelled as an authoritative entered address plus an optional geocode computed from it. AddressV2 is not a superset of Address — the sub-fields are renamed and re-nested. A payload written for Address is not a valid AddressV2, and vice versa. Check the field’s configured type before writing it; see the warning at the top of this page. Read one half or the other, never a blend. enteredAddress is what a person typed or confirmed, and is the half to render as the address. geocode carries provider output only — county, coordinates, precision. There is deliberately no county in enteredAddress and no street text in geocode. Required sub-fields: none at the top level; all three are optional, as is every sub-field of enteredAddress. The one requiredness rule sits inside geocode: if you send a geocode object at all, status and source must both be present and non-empty.

enteredAddress

There is no county here. County is provider output and lives on geocode.

geocode

Never typed or edited by a user. null when no geocode has been recorded. granularity, most precise first:

Writing an AddressV2 field

Send enteredAddress. The platform geocodes server-side on save and fills geocode for you:
Reading the same field back returns the geocode alongside it:
Four behaviours worth knowing before you write one:
  • Geocoding never gates the write. A provider miss or outage is recorded as an "unmatched" or "failed" geocode, not a 4xx or 5xx on your save.
  • You can supply your own geocode. Send it with source: "provided" and it is stored as given, with no provider lookup. A geocode sent with any other source is discarded and replaced by the platform’s own result.
  • An unchanged entered address keeps its geocode verbatim. address2 is excluded from the components the geocode is computed from, so adding a suite number to an already-matched address does not re-geocode it or lose its match.
  • Only top-level AddressV2 fields are geocoded on save. An AddressV2 value nested inside a custom object is stored as you send it.
zipCode must be a JSON string, never a number — same reason as on Address. JSON numbers cannot represent leading zeros, so 02140 parses as 2140 and silently corrupts the ZIP. On AddressV2 the path is enteredAddress.zipCode, and a numeric value is rejected with 400 as an ordinary shape violation:

Date

A calendar day pinned to an IANA time zone — the day a person wrote on the policy, not an instant. One canonical form, stored and returned as-is. Required sub-field: date. timezone is optional on a write (it defaults to America/New_York) and is always present in a response.
This shape is accepted on every FMV1 write path — entity CRUD (exposures, events, quotes, custom objects) and policy transactions alike — and responses always use it. The policy term dates are no exception: the root policyStartDate / policyEndDate on policy transactions are ordinary Date fields and accept this canonical object. See the policy transaction endpoints. The policy endorsement deltas channel stores each value exactly as sent, so for a Date field it accepts only this shape, with both sub-fields stated — see the API changelog entry of 2026-09-04.

StringOrNumber

A discriminated value that is either a string or a number, chosen per-row. The two typed slots are mutually exclusive — the inactive one is null. Required sub-fields: kind. The text / number slots are optional (the inactive slot is null).

Cardinality

Any of these field types can appear as a single value or as a list, depending on how the field is configured. List-cardinality fields enforce the same field-type validation per array element — each item must satisfy its type’s value contract.

  • V1 API Changelog — the strict-validation rule was rolled out on 2026-04-28 and corrected to field-type requiredness on 2026-06-26.