export_takeoff
Exports takeoff canvas annotations as an app-importable JSON payload, returning data inline or writing it to a chosen file path.
Instructions
The full "opentakeoff.takeoff_canvas.v1" annotations payload — exactly what the app autosaves, importable by it. Returned inline; pass path to also write it to disk as JSON. Coordinates are image px at render scale 2.0: PDF pt × 2, origin top-left, y down (the browser canvas's native space). Sheet payloads carry dims in both px and pt.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | File path to write the payload to | |
| overwrite | No | Replace the file at path even when it is not an OpenTakeoff export. Off by default: re-exporting over a previous export of your own already overwrites without this, so you only need it to deliberately destroy an unrelated file. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| rfis | No | Live RFI records; withdrawn tombstones are omitted | |
| units | No | Present only for a metric project; absent means imperial — the app's own diff-only convention | |
| schema | Yes | ||
| shapes | Yes | ||
| sheets | Yes | ||
| markups | Yes | ||
| approvals | No | Approval-family records (#176) — the estimator's APPROVED seals and the agent's verdict marks {id, actor, ts, sheet_id, at:[nx,ny], shape_id?, text?}. Present only when any exist (the canvas payload's own convention), so a verdict-free export stays byte-identical | |
| proposals | No | Proposal batches (#365) — present only when any exist. Shapes reference them by origin.proposal_id; the canvas shows one Accept per batch | |
| conditions | Yes | ||
| last_group | Yes | ||
| sheet_tabs | Yes | ||
| client_info | No | Who the proposal is for (client_name, client_address, reference) — present once set_estimate_settings or an import set it | |
| sheet_group | Yes | ||
| bid_proposal | No | The project's proposal layout and text — present once set | |
| project_name | Yes | ||
| sheet_levels | No | Present only when a sheet carries a level label (the app omits it when empty) | |
| estimate_settings | No | The project's markups (tax_pct, overhead_pct, profit_pct, profit_mode) — present once set | |
| condition_edit_proposals | No | Pending condition-edit diffs (#365) — present only when any exist. Nothing on the condition changes until the estimator accepts in the canvas |