Skip to content
TruTecDevelopers
Get an API key

TruTec API · v1

Build on TruTec

A REST API, webhooks, bulk export and a hosted MCP server for your TruTec workspace. Measure sites from aerial imagery and keep customers, sites, jobs and estimates in sync with your own systems.

View as Markdown

The TruTec API gives your own systems the same data your team sees in the app. Everything is JSON over HTTPS, authenticated with a workspace API key, and versioned under /v1.

The basics#

Base URL https://trutec.ai/api/v1
Auth Your API key in the X-API-Key header (Authentication)
Format JSON request and response bodies, UTF-8. Send Content-Type: application/json on POST and PATCH
Transport HTTPS only
Versioning Breaking changes only ship in a new version (Versioning & changes)
Where to call from Your servers. Keys are secrets and must never ship in browser or mobile code
Machine-readable OpenAPI 3.1 spec · llms.txt for AI tools

Quick start#

1. Create a key. A workspace owner opens Settings › API keys in TruTec and creates a key. Copy it right away: it is shown once.

2. Check the connection. /v1/health needs no key, so it tells you the API is reachable:

curl https://trutec.ai/api/v1/health
{"status": "ok", "version": "v1"}

3. Make an authenticated call. List the jobs in your workspace:

curl https://trutec.ai/api/v1/jobs \
  -H "X-API-Key: sk_your_api_key_here"

4. Measure a site. Start a measurement from an address, then poll for the result:

curl -X POST https://trutec.ai/api/v1/detect/address \
  -H "X-API-Key: sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{"address": "1200 Commerce Dr, Austin, TX 78701"}'

The full flow, with polling and the result format, is in Measure a site.

What's in the API#

Area What you can do
Measure a site AI takeoff from aerial imagery: pavement, stalls, striping, crosswalks, markings
Saved measurements & imagery Read takeoffs as your team saved them in the app, plus their imagery
Condition ratings PASER and PCI pavement condition ratings from one image
Customers & sites Customer companies and the properties you work on
Jobs Create, read and update jobs, with photos, change orders and proposal maps
Estimates & proposals Estimates with line items, totals, versions and revisions
Job costing Costs, labor, invoices and allocation per job
Webhooks & events Change notifications and a replayable event feed
Bulk data export Your workspace data in bulk files
AI assistants (MCP) A hosted MCP server over the same API
Partner API For software platforms that offer TruTec to their own customers

Required fields by object#

A create call without a required field is a 400 whose message names what is missing.

Object Create endpoint Required Notes
Customer (client account) POST /v1/client-accounts name Takes external_ref. A repeat that matches a customer by external_ref, then by name, returns it (200, created: false) and only fills its blank fields; an archived match is restored.
Site (location) POST /v1/locations address Takes external_ref. A repeat that matches a site by external_ref, then by address, returns it (200, created: false). When the workspace requires a company on sites, a new site also needs client_account_id (422 without it).
Contact POST /v1/contacts At least one of name, company, email, phone (a client_account_id counts as the company) No external_ref: each call adds a person.
Job POST /v1/jobs name Takes external_ref: a job already carrying it is updated with the PATCH rules (200, created: false), and name can then be left out. Otherwise a job with the same name is a 409 with duplicate_job_id, unless allow_duplicate_name is true. A workspace can require more fields on new jobs (422 with missing_fields).
Task (job follow-up) POST /v1/tasks job_id, title Each call adds a follow-up.
Account task (customer follow-up) POST /v1/account-tasks client_account_id title defaults to the follow-up type and customer name.
Note or logged call POST /v1/jobs/{job_id}/notes, /v1/contacts/{contact_id}/notes, /v1/client-accounts/{account_id}/notes content type call, email or meeting logs an interaction instead of a note. Each call adds one.
Estimate POST /v1/estimates job_id
Change order POST /v1/change-orders job_id, plus title when kind is quick (the default) A change-order estimate can also start from an estimate with POST /v1/estimates/{estimate_id}/change-orders (nothing required).
Invoice POST /v1/invoices job_id, line_items (at least one, each with description and an amount above 0) Creates a draft; nothing is emailed.
Webhook subscription POST /v1/webhooks target_url event_type defaults to job_status_changed. Each call adds a subscription.
Activity (call, text, email, meeting from another system) POST /v1/activities type, body (or subject; a call may send only outcome), and at least one of associations.job_id, associations.job_external_ref, associations.client_account_id, associations.client_account_external_ref, associations.contact_id, associations.lead_id Idempotent on source + external_id: a repeat returns 200 with created: false and updates the first one.

Help#

Email [email protected] with the endpoint, the time of the call and the response body. Never send your full API key; the first 11 characters (sk_ plus 8) are enough for us to find it. Live uptime is on our status page.