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
| 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
readPOST 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
| Name | Type | Description |
|---|---|---|
| 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 -X POST https://cotlet.dev/api/v1/buildertrend/list_jobs \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("buildertrend", "list_jobs") const result = await cotlet.call('buildertrend', 'list_jobs'); 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"
}
]
} Get schedule
readPOST 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
| Name | Type | Description |
|---|---|---|
| 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 -X POST https://cotlet.dev/api/v1/buildertrend/get_schedule \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("buildertrend", "get_schedule") const result = await cotlet.call('buildertrend', 'get_schedule'); 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"
}
]
} List daily logs
readPOST 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
| Name | Type | Description |
|---|---|---|
| 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 -X POST https://cotlet.dev/api/v1/buildertrend/list_daily_logs \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("buildertrend", "list_daily_logs") const result = await cotlet.call('buildertrend', 'list_daily_logs'); 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."
}
]
} List change orders
readPOST 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
| Name | Type | Description |
|---|---|---|
| job_id required | string | Job ID from list_jobs. |
| approval_status | enum | pending, approved, declined or all. Default: all. |
Request
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"}' result = client.call("buildertrend", "list_change_orders", {"job_id":"job_8c41d2"}) const result = await cotlet.call('buildertrend', 'list_change_orders', {"job_id":"job_8c41d2"}); 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"
}
]
} List selections
readPOST 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
| Name | Type | Description |
|---|---|---|
| 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 -X POST https://cotlet.dev/api/v1/buildertrend/list_selections \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"status":"pending"}' result = client.call("buildertrend", "list_selections", {"status":"pending"}) const result = await cotlet.call('buildertrend', 'list_selections', {"status":"pending"}); 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
readPOST 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
| Name | Type | Description |
|---|---|---|
| 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 -X POST https://cotlet.dev/api/v1/buildertrend/list_tasks \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("buildertrend", "list_tasks") const result = await cotlet.call('buildertrend', 'list_tasks'); 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
}
]
}
]
} 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
| Name | Type | Description |
|---|---|---|
| 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 -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"]}' 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"]}) 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"]}); 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"
} 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
| Name | Type | Description |
|---|---|---|
| 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 -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"}' result = client.call("buildertrend", "create_task", {"job_id":"job_8c41d2","title":"title"}) const result = await cotlet.call('buildertrend', 'create_task', {"job_id":"job_8c41d2","title":"title"}); 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"
} 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
| Name | Type | Description |
|---|---|---|
| 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 -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}' result = client.call("buildertrend", "update_schedule_item", {"schedule_item_id":"90211734","start_date":"2026-10-14","notify_assignees":True}) const result = await cotlet.call('buildertrend', 'update_schedule_item', {"schedule_item_id":"90211734","start_date":"2026-10-14","notify_assignees":true}); 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"
]
} 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
| Name | Type | Description |
|---|---|---|
| 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 -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"}' 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"}) 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"}); 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"
} 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
| Name | Type | Description |
|---|---|---|
| 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 -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"}' result = client.call("buildertrend", "release_change_order", {"change_order_id":"change_order_8c41d2"}) const result = await cotlet.call('buildertrend', 'release_change_order', {"change_order_id":"change_order_8c41d2"}); cotlet call buildertrend release_change_order --data '{"change_order_id":"change_order_8c41d2"}' Example response
{
"change_order_id": "771204",
"released": true,
"approval_status": "pending"
} 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
| Name | Type | Description |
|---|---|---|
| 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 -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"}' result = client.call("buildertrend", "approve_selection_choice", {"selection_id":"selection_8c41d2","choice_id":"choice_8c41d2"}) const result = await cotlet.call('buildertrend', 'approve_selection_choice', {"selection_id":"selection_8c41d2","choice_id":"choice_8c41d2"}); 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
}