REST API reference

Buildertrend API

12 endpoints for Buildertrend. Each one is a POST with a JSON body, called with your API key.

Base URL
https://cotlet.dev/api/v1/buildertrend
Connects with
Your own Buildertrend company user account (the role decides which jobs and actions you see)
Integration page
Buildertrend
Buildertrend Endpoints
Endpoint Access Description
list_jobs read Jobs in your company with status, address, project manager and dates.
get_schedule read Schedule items with start and end dates, assignees, predecessors and status.
list_daily_logs read Daily logs, newest first, with notes, author and who they are shared with.
list_change_orders read Change orders with title, amount, line items and approval status.
list_selections read Selections with options, allowance and approval status.
list_tasks read Tasks with assignees, deadline, checklist and status.
create_daily_log write New daily log with notes for a job. Internal unless you share it.
create_task write New task on a job with assignees, deadline and checklist.
update_schedule_item write Move or resize a schedule item and optionally notify its assignees.
create_change_order write New change order with line items, saved unreleased. The client sees nothing yet.
release_change_order write Send a change order to the client to approve or decline in their portal.
approve_selection_choice write Approve a choice on the client's behalf, with a comment.

List jobs

read

POST https://cotlet.dev/api/v1/buildertrend/list_jobs

Returns the jobs your account can see, with status, address and project manager. Use job_id from each item in the other tools. Status filters open, closed or presale jobs; the default is open. Search matches job name, address or client name.

Parameters

Parameters: list_jobs
NameTypeDescription
status enum open, closed, presale or all. Default: open.
search string Match job name, address or client name.
limit integer 1 to 100. Default: 50.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/buildertrend/list_jobs \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("buildertrend", "list_jobs")
Node.js
const result = await cotlet.call('buildertrend', 'list_jobs');
CLI
cotlet call buildertrend list_jobs

Example response

{
  "jobs": [
    {
      "job_id": "4815162",
      "name": "Maple Street Addition",
      "status": "open",
      "address": "214 Maple St, Austin, TX",
      "project_manager": "Dana Ortiz",
      "start_date": "2026-08-17"
    },
    {
      "job_id": "4815390",
      "name": "Hargrove Kitchen Remodel",
      "status": "open",
      "address": "88 Hargrove Ln, Austin, TX",
      "project_manager": "Dana Ortiz",
      "start_date": "2026-09-14"
    }
  ]
}

POST https://cotlet.dev/api/v1/buildertrend/get_schedule

Returns schedule items in date order for one job, or for all open jobs when job_id is empty. Each item lists its assignees and predecessors, so your agent sees what follows a slipped item. The window defaults to today through 14 days ahead.

Parameters

Parameters: get_schedule
NameTypeDescription
job_id string One job, ID from list_jobs. Leave empty for all open jobs.
from date Items ending on or after this date. Default: today.
to date Items starting on or before this date. Default: 14 days ahead.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/buildertrend/get_schedule \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("buildertrend", "get_schedule")
Node.js
const result = await cotlet.call('buildertrend', 'get_schedule');
CLI
cotlet call buildertrend get_schedule

Example response

{
  "items": [
    {
      "schedule_item_id": "90211734",
      "job_id": "4815390",
      "title": "Drywall hang",
      "start_date": "2026-10-12",
      "end_date": "2026-10-14",
      "assignees": [
        "Lone Star Drywall"
      ],
      "predecessors": [
        "Insulation"
      ],
      "status": "scheduled"
    }
  ]
}

POST https://cotlet.dev/api/v1/buildertrend/list_daily_logs

Returns daily logs newest first for one job, or for all open jobs. Each log shows its notes, author and visibility. Visibility is internal, subs and vendors, or client; private logs of other users are not returned.

Parameters

Parameters: list_daily_logs
NameTypeDescription
job_id string One job, ID from list_jobs. Leave empty for all open jobs.
since date Logs dated on or after this date.
limit integer 1 to 100. Default: 20.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/buildertrend/list_daily_logs \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("buildertrend", "list_daily_logs")
Node.js
const result = await cotlet.call('buildertrend', 'list_daily_logs');
CLI
cotlet call buildertrend list_daily_logs

Example response

{
  "daily_logs": [
    {
      "daily_log_id": "23094417",
      "job_id": "4815162",
      "date": "2026-10-09",
      "title": "Framing, second floor",
      "author": "Sam Reyes",
      "shared_with": [
        "internal"
      ],
      "notes": "Second floor walls framed and sheathed."
    }
  ]
}

POST https://cotlet.dev/api/v1/buildertrend/list_change_orders

Returns the change orders of one job with their line items, total and approval status. Filter by pending, approved or declined to see what still waits on the client.

Parameters

Parameters: list_change_orders
NameTypeDescription
job_id required string Job ID from list_jobs.
approval_status enum pending, approved, declined or all. Default: all.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/buildertrend/list_change_orders \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"job_id":"job_8c41d2"}'
Python
result = client.call("buildertrend", "list_change_orders", {"job_id":"job_8c41d2"})
Node.js
const result = await cotlet.call('buildertrend', 'list_change_orders', {"job_id":"job_8c41d2"});
CLI
cotlet call buildertrend list_change_orders --data '{"job_id":"job_8c41d2"}'

Example response

{
  "change_orders": [
    {
      "change_order_id": "771204",
      "job_id": "4815162",
      "title": "Added kitchen outlets",
      "total": 640,
      "approval_status": "pending",
      "released": true,
      "deadline": "2026-10-20"
    }
  ]
}

POST https://cotlet.dev/api/v1/buildertrend/list_selections

Returns selections for one job, or for all open jobs when job_id is empty. Each selection lists its options, the allowance and its status. Status defaults to pending, the selections still waiting on the client.

Parameters

Parameters: list_selections
NameTypeDescription
job_id string One job, ID from list_jobs. Leave empty for all open jobs.
status enum pending, approved, declined or all. Default: pending.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/buildertrend/list_selections \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status":"pending"}'
Python
result = client.call("buildertrend", "list_selections", {"status":"pending"})
Node.js
const result = await cotlet.call('buildertrend', 'list_selections', {"status":"pending"});
CLI
cotlet call buildertrend list_selections --data '{"status":"pending"}'

Example response

{
  "selections": [
    {
      "selection_id": "55120",
      "job_id": "4815390",
      "title": "Kitchen backsplash tile",
      "allowance": 1800,
      "status": "pending",
      "options": [
        {
          "choice_id": "o_1",
          "title": "White subway 3x6"
        },
        {
          "choice_id": "o_2",
          "title": "Green zellige"
        }
      ]
    }
  ]
}

List tasks

read

POST https://cotlet.dev/api/v1/buildertrend/list_tasks

Returns tasks for one job or for all jobs, with assignees, deadline and checklist. Status defaults to open. Set assigned_to_me to see only your own.

Parameters

Parameters: list_tasks
NameTypeDescription
job_id string One job. Leave empty for all jobs.
status enum open, completed or all. Default: open.
assigned_to_me boolean Only tasks assigned to you.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/buildertrend/list_tasks \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("buildertrend", "list_tasks")
Node.js
const result = await cotlet.call('buildertrend', 'list_tasks');
CLI
cotlet call buildertrend list_tasks

Example response

{
  "tasks": [
    {
      "task_id": "338810",
      "job_id": "4815162",
      "title": "Order window units",
      "assignees": [
        "Dana Ortiz"
      ],
      "deadline": "2026-10-16T17:00:00-05:00",
      "status": "open",
      "checklist": [
        {
          "item": "Confirm sizes",
          "done": true
        },
        {
          "item": "Place order",
          "done": false
        }
      ]
    }
  ]
}

Create daily log

write Confirm

POST https://cotlet.dev/api/v1/buildertrend/create_daily_log

Creates a daily log on one job under your name. Visibility defaults to internal only; add subs or client to share it. Sharing reaches other people, which is why you confirm by default. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: create_daily_log
NameTypeDescription
job_id required string Job ID from list_jobs.
date date Log date. Default: today.
title string Short title for the log.
notes required string Work completed, site conditions and issues.
share_with string[] Any of internal, subs, client. Default: internal.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/buildertrend/create_daily_log \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"job_id":"4815162","date":"2026-10-09","title":"Framing, second floor","notes":"Second floor walls framed and sheathed. Window rough openings checked against plans.","share_with":["internal"]}'
Python
result = client.call("buildertrend", "create_daily_log", {"job_id":"4815162","date":"2026-10-09","title":"Framing, second floor","notes":"Second floor walls framed and sheathed. Window rough openings checked against plans.","share_with":["internal"]})
Node.js
const result = await cotlet.call('buildertrend', 'create_daily_log', {"job_id":"4815162","date":"2026-10-09","title":"Framing, second floor","notes":"Second floor walls framed and sheathed. Window rough openings checked against plans.","share_with":["internal"]});
CLI
cotlet call buildertrend create_daily_log --data '{"job_id":"4815162","date":"2026-10-09","title":"Framing, second floor","notes":"Second floor walls framed and sheathed. Window rough openings checked against plans.","share_with":["internal"]}'

Example response

{
  "daily_log_id": "23094417",
  "job_id": "4815162",
  "date": "2026-10-09",
  "title": "Framing, second floor",
  "shared_with": [
    "internal"
  ],
  "url": "https://buildertrend.net/app/DailyLogs/23094417"
}

Create task

write Confirm

POST https://cotlet.dev/api/v1/buildertrend/create_task

Creates a task on one job. Assignees, deadline and checklist are optional. A task assigned to other people reaches them, so you confirm by default. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: create_task
NameTypeDescription
job_id required string Job ID from list_jobs.
title required string What needs doing.
assignee_ids string[] Internal users or subs to assign.
deadline datetime ISO 8601 with time zone.
checklist string[] Checklist items, in order.
notes string Details for the assignees.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/buildertrend/create_task \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"job_id":"job_8c41d2","title":"title"}'
Python
result = client.call("buildertrend", "create_task", {"job_id":"job_8c41d2","title":"title"})
Node.js
const result = await cotlet.call('buildertrend', 'create_task', {"job_id":"job_8c41d2","title":"title"});
CLI
cotlet call buildertrend create_task --data '{"job_id":"job_8c41d2","title":"title"}'

Example response

{
  "task_id": "338811",
  "job_id": "4815162",
  "title": "Order window units",
  "assignees": [
    "Dana Ortiz"
  ],
  "deadline": "2026-10-16T17:00:00-05:00",
  "status": "open"
}

Update schedule item

write Confirm

POST https://cotlet.dev/api/v1/buildertrend/update_schedule_item

Changes the start date or duration of one schedule item. With notify_assignees on, Buildertrend notifies the assigned users and subs, and only does so when the schedule is Online. Items that depend on it follow the schedule rules of the job. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: update_schedule_item
NameTypeDescription
schedule_item_id required string Schedule item ID from get_schedule.
start_date date New start date.
duration_days integer New duration in working days.
notify_assignees boolean Notify the assigned users and subs. Default: true.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/buildertrend/update_schedule_item \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"schedule_item_id":"90211734","start_date":"2026-10-14","notify_assignees":true}'
Python
result = client.call("buildertrend", "update_schedule_item", {"schedule_item_id":"90211734","start_date":"2026-10-14","notify_assignees":True})
Node.js
const result = await cotlet.call('buildertrend', 'update_schedule_item', {"schedule_item_id":"90211734","start_date":"2026-10-14","notify_assignees":true});
CLI
cotlet call buildertrend update_schedule_item --data '{"schedule_item_id":"90211734","start_date":"2026-10-14","notify_assignees":true}'

Example response

{
  "schedule_item_id": "90211734",
  "start_date": "2026-10-14",
  "end_date": "2026-10-16",
  "notified": [
    "Lone Star Drywall"
  ]
}

Create change order

write Confirm

POST https://cotlet.dev/api/v1/buildertrend/create_change_order

Creates a change order on one job and leaves it unreleased, so the client sees nothing until release_change_order. The total is the sum of the line items: quantity times unit cost, plus markup percent. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: create_change_order
NameTypeDescription
job_id required string Job ID from list_jobs.
title required string Change order title.
description string Scope of the change, shown to the client.
line_items required object List of { description, cost_code, quantity, unit_cost, markup_percent }.
deadline date Date by which the client should respond.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/buildertrend/create_change_order \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"job_id":"4815162","title":"Added kitchen outlets","description":"Eight added outlets along the kitchen island and back wall.","line_items":[{"description":"Add 8 outlets, kitchen","cost_code":"16-100","quantity":8,"unit_cost":80,"markup_percent":0}],"deadline":"2026-10-20"}'
Python
result = client.call("buildertrend", "create_change_order", {"job_id":"4815162","title":"Added kitchen outlets","description":"Eight added outlets along the kitchen island and back wall.","line_items":[{"description":"Add 8 outlets, kitchen","cost_code":"16-100","quantity":8,"unit_cost":80,"markup_percent":0}],"deadline":"2026-10-20"})
Node.js
const result = await cotlet.call('buildertrend', 'create_change_order', {"job_id":"4815162","title":"Added kitchen outlets","description":"Eight added outlets along the kitchen island and back wall.","line_items":[{"description":"Add 8 outlets, kitchen","cost_code":"16-100","quantity":8,"unit_cost":80,"markup_percent":0}],"deadline":"2026-10-20"});
CLI
cotlet call buildertrend create_change_order --data '{"job_id":"4815162","title":"Added kitchen outlets","description":"Eight added outlets along the kitchen island and back wall.","line_items":[{"description":"Add 8 outlets, kitchen","cost_code":"16-100","quantity":8,"unit_cost":80,"markup_percent":0}],"deadline":"2026-10-20"}'

Example response

{
  "change_order_id": "771204",
  "job_id": "4815162",
  "title": "Added kitchen outlets",
  "total": 640,
  "released": false,
  "deadline": "2026-10-20"
}

Release change order

write Confirm

POST https://cotlet.dev/api/v1/buildertrend/release_change_order

Releases one change order, so the client can approve or decline it in the Buildertrend portal. It reaches the client and involves money. Use list_change_orders to see the decision. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: release_change_order
NameTypeDescription
change_order_id required string Change order ID from create_change_order or list_change_orders.
message string Note to the client with the release.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/buildertrend/release_change_order \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"change_order_id":"change_order_8c41d2"}'
Python
result = client.call("buildertrend", "release_change_order", {"change_order_id":"change_order_8c41d2"})
Node.js
const result = await cotlet.call('buildertrend', 'release_change_order', {"change_order_id":"change_order_8c41d2"});
CLI
cotlet call buildertrend release_change_order --data '{"change_order_id":"change_order_8c41d2"}'

Example response

{
  "change_order_id": "771204",
  "released": true,
  "approval_status": "pending"
}

Approve selection choice

write Confirm

POST https://cotlet.dev/api/v1/buildertrend/approve_selection_choice

Approves one option of a selection for the client, the way Buildertrend lets a builder approve when a client cannot. A comment records why. It affects orders and costs, so you confirm by default. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: approve_selection_choice
NameTypeDescription
selection_id required string Selection ID from list_selections.
choice_id required string Choice to approve.
comments string Why you approve for the client, e.g. verbal OK on site.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/buildertrend/approve_selection_choice \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"selection_id":"selection_8c41d2","choice_id":"choice_8c41d2"}'
Python
result = client.call("buildertrend", "approve_selection_choice", {"selection_id":"selection_8c41d2","choice_id":"choice_8c41d2"})
Node.js
const result = await cotlet.call('buildertrend', 'approve_selection_choice', {"selection_id":"selection_8c41d2","choice_id":"choice_8c41d2"});
CLI
cotlet call buildertrend approve_selection_choice --data '{"selection_id":"selection_8c41d2","choice_id":"choice_8c41d2"}'

Example response

{
  "selection_id": "55120",
  "choice_id": "o_1",
  "status": "approved",
  "approved_on_behalf": true
}