JSON output
Every conversion can also return the estimate as structured JSON —
the estimate-v1 schema. It contains exactly what the ESX
contains: claim header, section tree with dimensions, line items with
pricing, and notes, in the same order.
Requesting JSON
Add "json" to the output_formats field on
POST /v1/conversions.
It's a repeatable form field — send it once per format:
curl -s -X POST https://est.anterotrail.com/v1/conversions \
-H "X-API-Key: at_test_xxxxxxxxxxxxxxxxxxxxxxxx" \
-F "file=@estimate.pdf;type=application/pdf" \
-F "price_list=FLTA8X_02MAY26" \
-F "output_formats=esx" \
-F "output_formats=json"
On success, the job resource —
and the identical webhook body — carries
an artifacts array listing every output of the job, each with
its own time-limited signed URL:
{
"job_id": "b3f1...",
"status": "succeeded",
"artifacts": [
{ "type": "esx", "url": "https://.../job.esx?sig=...", "expired": false },
{ "type": "json", "url": "https://.../job.json?sig=...", "expired": false }
]
}
One conversion is one conversion. A job is metered once regardless of
which formats it produces — requesting json,
esx, or both costs the same single credit.
Conventions
- Money is always a string with two decimals (e.g.
"1234.56"), never a float. Parse with a decimal type, not floating point. - Quantities are numbers, with a
unitstring alongside. - Absent values omit the key — no
nulls. Code defensively around missing optional keys. - Ordering is meaningful: sections and line items appear in the same order as in the ESX.
- Versioning is additive-only within the 1.x line: new
optional keys may appear over time; existing keys never change
type or meaning, and required keys never disappear. A breaking change
would ship as a new major
schema_version.
Accuracy and source fidelity
The source PDF is the only source of truth available to the converter. Output accuracy means fidelity to the PDF, not to whatever estimate file originally produced it.
-
unit_price,tax, andrcvare the values as printed in the source.rcvincludes tax and overhead & profit as printed, so it is not necessarilyquantity × unit_price. The sum of linercvequalstotals.rcv, which matches the ESX grand total. - Repricing. Xactimate reprices catalog items against the selected price list on import. Printed unit prices in this output are source values, not a prediction of post-import pricing. Bid items retain their own pricing.
-
*REVIEW*convention. Descriptions may carry a*REVIEW*prefix where the converter emitted a source line it could not confidently map to a catalog code. These lines are written as bid items, preserve the source text verbatim, and are intended for adjuster review after import. - No source warranty. The converter faithfully represents the PDF. It cannot detect or reverse edits, overrides, or omissions made before the PDF was printed — no converter can.
Top level
| Key | Type | Required | Notes |
|---|---|---|---|
schema_version | string | Yes | "1.0" |
claim | object | Yes | Claim/estimate header. |
sections | array | Yes | Rooms/areas ("sections"), in estimate order. |
totals | object | No | Estimate-level totals. |
claim
| Key | Type | Required | Notes |
|---|---|---|---|
estimate_name | string | Yes | The project name as it appears in the ESX (uppercase, ≤20 chars). |
claim_number | string | No | |
policy_number | string | No | |
insured_name | string | No | |
property_address | object | No | { "street", "city", "state", "zip" } — each optional. |
date_of_loss | string | No | ISO YYYY-MM-DD when the source carried a parseable date. |
type_of_loss | string | No | e.g. "Water", "Wind", "Flood". |
price_list | string | No | Xactimate price-list code, e.g. FLTA8X_02MAY26. |
sections[]
| Key | Type | Required | Notes |
|---|---|---|---|
name | string | Yes | Display name, e.g. "Master Bathroom". |
path | string[] | No | Folder tree, outermost container first, ending with the section itself — e.g. ["Main Level", "Master Bathroom"]. |
dimensions | object | No | Only keys the estimate actually carries (see below). |
notes | array | No | Section-level notes: [{ "text": "..." }]. |
line_items | array | Yes | In estimate order. |
sections[].dimensions
All values are numbers. Any subset may be present:
floor_sf, ceiling_sf, wall_sf,
wall_and_ceiling_sf, floor_perimeter_lf,
ceiling_perimeter_lf, roof_surface_sf,
roof_squares, height_ft, length_ft,
width_ft
sections[].line_items[]
| Key | Type | Required | Notes |
|---|---|---|---|
cat | string | No | Xactimate category code, e.g. "DRY". |
sel | string | No | Xactimate selector code, e.g. "1/2-". |
description | string | Yes | The line description as it appears in the ESX. |
quantity | number | Yes | |
unit | string | Yes | SF, LF, EA, SQ, HR, ... |
activity | string | No | Xactimate action: + (replace), - (remove), & (remove & replace), R (reset), M (material), I (install). |
unit_price | money string | No | Per-unit price from the source estimate. |
tax | money string | No | The line's tax amount from the source estimate. |
rcv | money string | No | The line's replacement-cost value from the source estimate (includes tax and O&P as printed). |
notes | array | No | Line-level notes: [{ "text": "..." }]. |
totals
| Key | Type | Required | Notes |
|---|---|---|---|
rcv | money string | No | Sum of line RCVs — matches the ESX grand total. |
Sample payload
{
"schema_version": "1.0",
"claim": {
"estimate_name": "SMITH_J",
"claim_number": "CLM-2026-04581",
"policy_number": "HO3-99120",
"insured_name": "John Smith",
"property_address": {
"street": "12 Oak St",
"city": "Tampa",
"state": "FL",
"zip": "33601"
},
"date_of_loss": "2026-05-01",
"type_of_loss": "Water",
"price_list": "FLTA8X_02MAY26"
},
"sections": [
{
"name": "Master Bathroom",
"path": ["Main Level", "Master Bathroom"],
"dimensions": {
"floor_sf": 96.0,
"ceiling_sf": 96.0,
"wall_sf": 320.0,
"floor_perimeter_lf": 40.0,
"height_ft": 8.0
},
"notes": [{ "text": "Flooring" }],
"line_items": [
{
"cat": "DRY",
"sel": "1/2-",
"description": "1/2\" drywall - hung, taped, floated, ready for paint",
"quantity": 320.0,
"unit": "SF",
"activity": "+",
"unit_price": "2.15",
"tax": "9.87",
"rcv": "688.00",
"notes": [{ "text": "Water damage to lower 2 feet" }]
}
]
}
],
"totals": { "rcv": "688.00" }
}
A machine-readable JSON Schema (draft-07) is available at
estimate-v1.schema.json
— validate every payload against it in your integration tests.