File exports
Get any file the TruTec app can download (proposal PDFs, estimate and catalog workbooks, work orders, payroll, job costing, invoices, assessment reports, takeoff maps and KMZ, customer and job lists, management reports) as a 24-hour link.
View as MarkdownEvery download in the TruTec app is available through one call. POST /v1/exports names what you want, and the response is a link that opens or downloads the file for 24 hours, with no API key. Hand the link to a person, or fetch it yourself.
- The app's own file. The link runs the same code as the app's Download button, so the PDF, spreadsheet or map is the one your team would get.
- Made when opened. Nothing is made or stored up front. Each time the link is opened, the file is made from the data as it is at that moment.
- The app's rules. The export acts as the person who created the API key. Their role and your workspace's products decide what they may export, exactly as in the app.
- Built for assistants. An AI assistant can't hand you a file, but it can give you a link. The MCP tool
export_filedoes this (see AI assistants).
For whole tables of data for a warehouse, the bulk export streams JSON Lines; workspace_data below gives a link to the same streams.
Get a link#
curl -X POST https://trutec.ai/api/v1/exports \
-H "X-API-Key: sk_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"kind": "proposal", "id": 512}'
{
"data": {
"kind": "proposal",
"title": "Proposal PDF",
"format": "pdf",
"id": 512,
"options": {},
"filename": "Northgate-Plaza-Sealcoat.pdf",
"content_type": "application/pdf",
"url": "https://trutec.ai/api/v1/export-files/eyJ2IjoxLCJrIjoicHJvcG9zYWwifQ.ZxY1aQ.k3j9/Northgate-Plaza-Sealcoat.pdf",
"expires_at": "2026-10-14T15:04:11Z"
}
}
| Field | |
|---|---|
kind |
What to export. Required. See Kinds |
format |
One of the kind's formats. Leave out for its default (listed first) |
id |
The record, for kinds that export one record. Kinds that cover the workspace take no id |
options |
Kind-specific settings, such as a date range. Unknown options are refused |
firm_id |
Partner keys only: the workspace to act on |
A few kinds let an option stand in for id: job_id picks the job's newest work order, warranty or certificate, and estimate_id picks an estimate's proposal. The response's id is the record it picked.
Payroll for a week, as a spreadsheet:
curl -X POST https://trutec.ai/api/v1/exports \
-H "X-API-Key: sk_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"kind": "time_entries", "format": "xlsx", "options": {"from": "2026-10-05", "to": "2026-10-11"}}'
A takeoff's shapes for Google Earth:
curl -X POST https://trutec.ai/api/v1/exports \
-H "X-API-Key: sk_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"kind": "takeoff_geometry", "id": 90311, "format": "kmz"}'
GET /v1/export-kinds lists every kind with its formats, what id names, its options and what it needs, so a script or assistant can discover them.
Open the link#
Open url in a browser, or GET it. PDFs and images open in the browser tab; spreadsheets, CSV, zip and map files download. The response carries the file name in Content-Disposition.
- Lasts 24 hours. After that, or if anything below changes, the link returns
404. Ask for a new link. - Checked every time. Each open checks that the key is still active, that your workspace still has API access, that the key's creator is still in the workspace and still allowed this export, and that the record is still there. Revoking the key stops every link it made.
- Big files take a moment. A file still being made returns
503withRetry-After(seconds). In a browser, the page says so and reloads by itself. Takeoff maps are drawn once and reused. HEADis free. AHEADrequest returns the content type and file name without making the file, so link previews don't build it.- Treat the link like a password. Anyone with it can open the file until it expires, and files can hold prices, pay and customer details. Share it only with the person who asked.
Each open makes the file again, the same as clicking Download in the app. Payroll exports are logged the same way the app logs them.
Kinds#
Permission: Read jobs, except the takeoff kinds, which need Read measurements. Needs is what the app requires of your workspace and of the key's creator.
Estimating & proposals#
| kind | Formats | id |
Options | Needs |
|---|---|---|---|---|
proposal |
proposal, or estimate_id |
estimate_id |
Estimating Pro, pricing access | |
estimate_workbook |
xlsx | estimate | Estimating Pro, estimator or admin | |
estimate_cost_codes |
csv | estimate | Estimating Pro, estimator or admin, estimate won | |
catalog |
xlsx | Estimating Pro, estimator or admin | ||
work_order |
work-order sheet, or job_id |
job_id |
Estimating Pro |
proposal: the customer proposal, the file from Download PDF in the proposal builder.estimate_workbook: the estimate's lines and prices as Excel (Share › Download Excel).estimate_cost_codes: a won estimate's cost and price by cost code, for QuickBooks.catalog: the whole catalog as Excel (Catalog › Download Excel).work_order: the printable work order a crew takes to the job (Work orders › Print / PDF).
Operations#
| kind | Formats | id |
Options | Needs |
|---|---|---|---|---|
change_order |
pdf, csv | change order | Operations; pricing access for csv | |
daily_report |
daily report | Operations | ||
daily_log |
daily log, or job_id + date |
job_id, date |
Operations | |
schedule |
week |
Operations | ||
warranty |
warranty, or job_id |
job_id |
Operations | |
warranty_certificate |
warranty certificate, or job_id |
job_id |
||
payroll |
csv | from, to, include_unapproved |
Operations, payroll permission | |
time_entries |
xlsx, csv | from, to, include_unapproved |
Operations, payroll permission | |
payroll_hours |
xlsx, csv | from, to, include_unapproved |
Operations, payroll permission | |
equipment_entries |
xlsx, csv | from, to |
Operations, Estimating Pro, pricing access | |
materials_used |
xlsx, csv | from, to, include_unapproved |
Operations | |
billing_worksheet |
xlsx | week |
Operations, Estimating Pro, pricing access |
change_order: the PDF, or the CSV for accounting (header plus lines by cost code).daily_log: one visit's field log (idfromGET /v1/daily-logs), or every visit on a job that day.schedule: the printable week of the crew schedule. Money columns show only for people with pricing access.payroll: closed time entries with an overtime summary per worker-week (Timesheets › Export payroll). Approved time only unlessinclude_unapproved.time_entries,equipment_entries,billing_worksheet: the Accounting reports.payroll_hours,materials_used: the field log exports (hours only; quantities only).- Payroll permission is Approve and export payroll in Settings › Team › Roles (owners have it).
Money#
| kind | Formats | id |
Options | Needs |
|---|---|---|---|---|
job_costing |
xlsx, csv | job_id, from, to |
Operations, Estimating Pro, pricing access | |
job_cost_out |
xlsx | job_id (required), from, to |
Operations, Estimating Pro, pricing access | |
month_end_job_cost |
xlsx, csv | month |
Operations, Estimating Pro, pricing access | |
invoice |
invoice | with_lien_waiver, disputed_amount |
pricing access |
job_costing: budget against actual by category and the cost ledger for one job (job_id), or every costed job in the workspace (xlsx takesfromandto).job_cost_out: one job's cost-out workbook for accounting.month_end_job_cost: the Accounting › Month-end report: every job with revenue or cost in the month, with revenue invoiced, direct cost by type, gross profit and GP %, plus job to date. The same numbers asGET /v1/reports/month-end-job-cost. Withoutmonth, last month (pinned when the link is made).invoice: the invoice as the customer sees it.with_lien_waiveradds the conditional lien waiver as the last page; the waiver must be turned on in Settings › Payments & Invoicing.
Jobs & field#
| kind | Formats | id |
Options | Needs |
|---|---|---|---|---|
site_assessment |
site assessment, or job_id |
job_id |
||
job_photos |
zip | job_id (required) |
||
company_portfolio |
customer |
site_assessment: the branded report: every observation, photo and video, and the aerial with the pins.job_photos: every photo on the job, full size, in one zip (up to 500).company_portfolio: a customer's 11x17 paving portfolio: every site and takeoff map, with areas.
Takeoffs#
| kind | Formats | id |
Options | Needs |
|---|---|---|---|---|
takeoff_map |
pdf, png, jpg | measurement | style |
Read measurements |
takeoff_quantities |
xlsx, csv | measurement | Read measurements | |
takeoff_geometry |
kmz, kml, geojson | measurement | Read measurements |
takeoff_map: the map export: the takeoff drawn on the aerial with its legend and logo.style: "aerial"gives the clean imagery instead.takeoff_quantities: every quantity the takeoff provides with units, the numbers an estimate pulls from it (the same asGET /v1/measurements/{id}/items).takeoff_geometry: the drawn shapes (areas, lines and counted items) with their type, phase and spec, for Google Earth or GIS. GeoJSON coordinates are longitude, latitude.- The map and shape kinds need a takeoff drawn on the aerial; plan-sheet takeoffs return
422.
Sales & CRM#
| kind | Formats | id |
Options | Needs |
|---|---|---|---|---|
customers |
csv | q, include_archived |
||
contacts |
csv | q, include_archived |
||
sites |
csv | q, type, include_archived |
||
jobs |
xlsx, csv | status, updated_after |
||
capital_plan |
xlsx, csv | client_account_id, location_id |
capital plans turned on |
customers,contacts,sites: the Companies, Contacts and Locations list exports.customersholds up to 5,000 companies.jobs: status, customer, contact, address, type, value, salesperson and dates for the jobs the key's creator can see (up to 20,000, most recently changed first). Value is left out for people without pricing access.capital_plan: multi-year plan items by site and year: scope, status, PASER rating and estimated cost.
Reports and the whole workspace#
| kind | Formats | id |
Options | Needs |
|---|---|---|---|---|
management_report |
xlsx, csv, pdf, docx | report (required), from, to |
owner, or a member allowed management reports; pricing access | |
workspace_data |
jsonl.gz, jsonl | dataset (required), updated_after |
management_report: one of the Reports › Management reports:weekly-summary,week-glance,receivables,cash-forecast,top-customers,zip-code,bid-vs-actual,material-usage,completed-work,bid-schedule,lead-pipeline,win-loss,win-loss-graph,brochure-scans,work-type,market-analysis,data-dump,estimate-totals,item-history,material-history,resource-utilization,sub-utilization,vendor-utilization,minority,weekly-sales,kpi.workspace_data: one dataset of the bulk export (customers,properties,jobs,estimates,estimate_lines,change_orders,invoices,job_costs,work_orders,time_entries,allocations,events) as JSON Lines.
Options#
| Option | Type | |
|---|---|---|
job_id |
integer | A job. For kinds that otherwise take id, picks that job's newest record |
estimate_id |
integer | proposal: that estimate's proposal |
client_account_id, location_id |
integer | capital_plan: only this customer or site |
date |
date | daily_log with job_id: the day |
from, to |
date | The date range. Default this week (management_report: January 1 to today) |
week |
date | Any day in the week. Default this week |
month |
string | month_end_job_cost: the month, YYYY-MM. Default last month |
include_unapproved |
boolean | Also time not yet approved for payroll |
include_archived |
boolean | Also archived records |
with_lien_waiver |
boolean | invoice: add the lien waiver page |
disputed_amount |
number | invoice with the waiver: dollars of disputed claims |
style |
annotated or aerial |
takeoff_map |
report |
string | management_report: which report |
dataset |
string | workspace_data: which dataset |
updated_after |
date-time | jobs, workspace_data: only records changed since |
status |
string | jobs: one pipeline status |
q |
string | customers, contacts, sites: search text |
type |
string | sites: one building type |
Dates are YYYY-MM-DD in your workspace's time zone. Date-times are ISO 8601.
Finding the id#
| kind | Where the id comes from |
|---|---|
proposal |
GET /v1/proposals (Proposals) |
estimate_workbook, estimate_cost_codes |
GET /v1/estimates |
work_order |
GET /v1/work-order-sheets?job_id= |
change_order |
GET /v1/change-orders (Change orders) |
daily_report, daily_log |
GET /v1/daily-reports, GET /v1/daily-logs (Daily logs) |
warranty |
GET /v1/warranties?job_id= |
warranty_certificate |
GET /v1/warranty-certificates?job_id= |
invoice |
GET /v1/invoices (Invoices & payments) |
site_assessment |
GET /v1/site-assessments (Site assessments) |
company_portfolio, capital_plan |
GET /v1/client-accounts (Customers & sites) |
| takeoff kinds | GET /v1/measurements (Measurements) |
/v1/work-order-sheets, /v1/warranties and /v1/warranty-certificates list a job's printable documents (newest first; filter by job_id and status; paged with limit and offset). A work-order sheet is the document a crew takes to the job; /v1/work-orders is the crew schedule.
Errors#
| Status | When |
|---|---|
400 |
Unknown kind, format, option or field; id or a required option missing |
403 |
The key lacks Read jobs (or Read measurements), the key's creator is no longer in the workspace, or the app does not allow this export for them. message is the app's reason, for example a role without the payroll permission |
404 |
The record is not in this workspace |
409 |
The record can't be exported as it is: the estimate isn't won, the lien waiver is off |
413 |
Too big for one file: a job with more than 500 photos |
422 |
Nothing to export: a takeoff with no mapped shapes, a job with no photos |
On the link itself, refusals are a page (or plain text for scripts) with the same reason, and anything that makes the link invalid is 404.
Not available as links#
- Uploaded files (plans, contracts, signed documents):
GET /v1/files/{id}already returns a download link (Photos & files). - Exports built in the takeoff editor from what's on screen: image templates, the export wizard's custom layouts, the legend export, resident notices and earthwork reports.
takeoff_map,takeoff_quantitiesandtakeoff_geometrycover the saved takeoff. - Estimating Expert documents, RoofTrace and landscape reports, and the older proposal builder from before Estimating Pro.