add_catalog_rate
ChatGPTAdd a rate item to a catalog (POST /catalogs/{id}/rates). Use this when the user wants a priced item added to a rate catalog.
add_estimate_group
ChatGPTAdd a section (app: 'group') to an estimate (POST /estimates/{id}/sections). Use this when the user wants a new group of line items in an estimate (the app calls it a group).
add_estimate_item
ChatGPTAdd a line item to an estimate (POST /estimates/{id}/items). Use this when the user wants one line item added to a draft estimate. Use it for one line item at a time..
add_estimate_markup
ChatGPTAdd a below-the-line markup (POST /estimates/{id}/below-the-line-markups). Use this when the user wants overhead, profit or a fee added below the line of an estimate.
add_estimate_section
ChatGPTAdd a room (app: 'section') to an estimate (POST /estimates/{id}/rooms). Use this when the user wants a new section (e.g. a room or area) in an estimate (the app calls it a section).
add_payment_schedule_entry
ChatGPTAdd a payment schedule entry (POST /estimates/{id}/payment-schedule/entries). Use this when the user wants a deposit or milestone payment added to an estimate's payment schedule.
add_schedule_phase
ChatGPTAdd a schedule phase (POST /projects/{id}/schedule/phases). Use this when the user wants a phase added to a project's schedule.
archive_cost_code
ChatGPTArchive a cost code (POST /cost-codes/{id}/archive). Use this when the user wants a cost code archived.
cancel_proposal
ChatGPTCancel a proposal (POST /proposals/{id}/cancel). Use this when the user wants a sent proposal withdrawn.
check_invoices_and_payments
ChatGPTLists the user's Handoff invoice payment requests with amounts due, due dates, and payment status, and totals what is outstanding and overdue. Use this when the user asks about money owed or received, e.g. "Who still owes me money?", "What's overdue?", or "Has the Johnson invoice been paid?". Do not use it to create, send, or record invoices or payments. Defaults to unpaid requests, overdue and failed payments first, then by due date. Filter by projectId or projectName (a case-insensitive match on the project or client name). Amounts are in US dollars and match the Handoff app's invoice calculations. Results only include projects the user's role can see.
clear_estimate_discount
ChatGPTClear the estimate discount (DELETE /estimates/{id}/discount). Use this when the user wants an estimate's discount removed.
create_catalog
ChatGPTCreate a rate catalog (POST /catalogs). Use this when the user wants a new rate catalog.
create_change_order
ChatGPTCreate a change order from an estimate (POST /estimates/{id}/change-orders). Use this when the user wants a change order on an approved estimate.
create_construction_estimate
ChatGPTStarts a new construction estimate generated by Handoff AI from a scope of work, plans, or photos, priced with the user's own catalogs, pricing defaults, and location. Use this when the user wants a new estimate, e.g. "Make an estimate for this kitchen remodel", "Estimate a 400 sq ft deck", or "Price out these plans". Do not use it to edit, re-price, or add lines to an existing estimate, or to import exact line items the user already has. Generation is asynchronous and returns a jobId, not a finished estimate. get_estimate with that jobId reports GENERATING until the estimate is ready, typically in 2–3 minutes. Calling this tool again starts a second estimate unless the same idempotencyKey is reused. Provide scope, fileIds, or both. Without a project it creates a new project for the estimate.
create_contact
ChatGPTCreate a contact (POST /contacts). Use this when the user wants to add a client, vendor or other contact.
create_cost_code
ChatGPTCreate a cost code (POST /cost-codes). Use this when the user wants a new cost code.
create_daily_log
ChatGPTCreate a daily log (POST /daily-logs). Use this when the user wants a site daily log written for a project.
create_document
ChatGPTCreate a document (POST /documents). Use this when the user wants a new written document on a project.
create_estimate
ChatGPTCreate an estimate (blank, or AI-generated from scope/photos/PDFs) (POST /estimates). Use this when the user wants a blank estimate with just a name, optionally on a project. Do not use it for an AI-generated estimate from scope, plans or photos; use create_construction_estimate.
create_expense
ChatGPTCreate an expense (POST /expenses). Use this when the user wants a cost recorded against a project.
create_file_upload_urls
ChatGPTGet presigned upload URLs (direct-to-S3) (POST /files/upload-urls). Use this when you need to upload local files to Handoff; it returns presigned URLs to upload to.
create_invoice_from_estimate
ChatGPTCreate an invoice from an estimate (POST /invoices/from-estimate). Use this when the user wants to bill an approved estimate.
create_project
ChatGPTCreates a new project (job) in the user's Handoff account, optionally with a new or existing client. Use this when the user wants to start tracking a new job, e.g. "Start a new job for the Lees" or "Create a project for the Smith bathroom remodel". Do not use it to update or look up an existing project, or to create an estimate; create_construction_estimate creates its own project when none is given. Each call creates another project, so a retry after an unclear failure can leave a duplicate. A client email that matches an existing client links that client instead of creating a new one. The site address can be added later in Handoff.
create_project_with_document
ChatGPTCreate a project with an attached document (synchronous) (POST /projects/with-document). Use this when the user wants a new project created together with a written document, photos or files. Do not use it for a plain new project; use create_project.
create_proposal
ChatGPTCreate a proposal (POST /proposals). Use this when the user wants a client proposal drafted from an estimate.
create_task
ChatGPTCreate task (POST /tasks). Use this when the user wants a to-do created, optionally assigned.
create_time_entry
ChatGPTCreate a time entry (POST /time-entries). Use this when the user wants hours logged for a person on a project.
delete_catalog_rate
ChatGPTDelete a catalog rate item (DELETE /catalog-rates/{id}). Use this when the user wants a rate item removed from a catalog.
delete_contact
ChatGPTDelete a contact (DELETE /contacts/{id}). Use this when the user wants a contact deleted.
delete_daily_log
ChatGPTDelete a daily log (DELETE /daily-logs/{id}). Use this when the user wants a daily log deleted.
delete_document
ChatGPTDelete a document (DELETE /documents/{id}). Use this when the user wants a document deleted.
delete_estimate
ChatGPTDelete an estimate (DELETE /estimates/{id}). Use this when the user wants an estimate deleted.
delete_estimate_group
ChatGPTDelete an estimate section (app: 'group') and its items (DELETE /estimate-sections/{id}). Use this when the user wants a group and all its line items removed.
delete_estimate_item
ChatGPTDelete an estimate line item (DELETE /estimate-items/{id}). Use this when the user wants a line item removed from a draft estimate. Use it for one line item at a time..
delete_estimate_markup
ChatGPTRemove a below-the-line markup (DELETE /estimates/{id}/below-the-line-markups/{markupId}). Use this when the user wants a below-the-line markup removed from an estimate.
delete_estimate_section
ChatGPTDelete an estimate room (app: 'section') with its sections and items (DELETE /estimate-rooms/{id}). Use this when the user wants a section with all its groups and line items removed.
delete_file
ChatGPTRemove a file (DELETE /files/{id}). Use this when the user wants a file removed.
delete_payment_schedule_entry
ChatGPTDelete a payment schedule entry (DELETE /payment-schedule-entries/{id}). Use this when the user wants a payment schedule entry removed.
delete_project
ChatGPTDelete a project (DELETE /projects/{id}). Use this when the user wants a project deleted.
delete_schedule_phase
ChatGPTRemove a schedule phase (DELETE /schedule-phases/{id}). Use this when the user wants a schedule phase removed.
export_document
ChatGPTExport a document (PDF) (POST /documents/{id}/export). Use this when the user wants a PDF of a document.
export_estimate
ChatGPTExport an estimate (PDF/CSV) (POST /estimates/{id}/export). Use this when the user wants a PDF or CSV of an estimate.
export_invoice
ChatGPTExport an invoice (PDF) (POST /invoices/{id}/export). Use this when the user wants a PDF of an invoice or receipt.
export_project_schedule
ChatGPTExport the project schedule (CSV) (POST /projects/{id}/schedule/export). Use this when the user wants a CSV of a project's schedule.
export_proposal
ChatGPTExport a proposal (PDF) (POST /proposals/{id}/export). Use this when the user wants a PDF of a proposal.
find_project_files
ChatGPTFinds files stored in the user's Handoff projects, such as plans, photos, permits, and documents, and returns a short-lived download link for one file. Use this when the user asks for project documents, e.g. "Pull up the plans for the Lee job", "Find the permit PDF", or to get fileIds for create_construction_estimate or run_takeoff. Do not use it to upload or delete files. Filter by projectId or projectName (a case-insensitive match on the project or client name) and by fileName. Newest first, up to 100 per page; pass nextCursor for more. Pass fileId for a download link that expires shortly after it is returned.
generate_estimate_group_summary
ChatGPTGenerate a section summary with AI (POST /estimate-sections/{id}/summary/generate). Use this when the user wants Handoff AI to write a group's proposal summary.
get_activity
ChatGPTGet an activity (GET /activities/{id}). Use this when you have an activity id and need its details.
get_business_advisor_schema
ChatGPTGet the Business Advisor semantic schema (GET /business-advisor/schema). Use this when you are about to run run_business_advisor_query and need the tables and recipes it accepts.
get_contact
ChatGPTGet a contact (GET /contacts/{id}). Use this when you have a contact id and need its details.
get_cost_code
ChatGPTGet a cost code (GET /cost-codes/{id}). Use this when you have a cost code id and need its details.
get_custom_domain
ChatGPTGet the custom domain (GET /custom-domain). Use this when you need the account's custom client-portal domain.
get_daily_log
ChatGPTGet a daily log (GET /daily-logs/{id}). Use this when you have a daily log id and need its content.
get_document
ChatGPTGet a document (GET /documents/{id}). Use this when you have a document id and need its content.
get_estimate
ChatGPTShows one of the user's Handoff estimates: its name, project, client, status, and client total, and optionally its line items. Use this when the user asks what is in an estimate or what it totals, e.g. "What's in the Smith estimate and what's the total?", "Show me the lines of the kitchen remodel estimate", or to check on an estimate that create_construction_estimate is generating (pass its jobId). Do not use it to change an estimate; it only reads. Identify the estimate with estimateId, or with estimateName (a case-insensitive match on the estimate, project, or client name). When several estimates match, it returns status AMBIGUOUS with candidates and no estimate. With jobId it returns GENERATING while Handoff AI is still working (typically 2–3 minutes), GENERATION_FAILED with the error, or the finished estimate. detail "lines" returns up to 100 lines per page in display order; pass nextCursor to read the next page. Amounts are in US dollars.
get_estimate_catalog_rematch_status
ChatGPTPoll the estimate catalog re-match (GET /estimates/{id}/catalogs/rematch-status). Use this when set_estimate_catalogs started a re-match and you need its progress.
get_estimate_catalogs
ChatGPTGet the catalogs applied to an estimate (GET /estimates/{id}/catalogs). Use this when you need which rate catalogs and suppliers an estimate prices from.
get_estimate_details
ChatGPTGet an estimate (GET /estimates/{id}). Use this when you need the estimate record itself (status, client, totals, settings) by id. Do not use it for reading line items; use list_estimate_rows or get_estimate.
get_estimate_discount
ChatGPTGet the estimate discount and totals (GET /estimates/{id}/discount). Use this when you need an estimate's discount and resulting totals.
get_estimate_generation_status
ChatGPTPoll AI estimate-generation status (GET /estimate-generations/{jobId}). Use this when create_estimate or create_construction_estimate returned a generation jobId and you need its progress.
get_estimate_payment_schedule
ChatGPTGet an estimate's payment schedule (GET /estimates/{id}/payment-schedule). Use this when you need the payment schedule entries (deposits, milestones) of an estimate.
get_expense
ChatGPTGet an expense (GET /expenses/{id}). Use this when you have an expense id and need its details.
get_file
ChatGPTGet a file (GET /files/{id}). Use this when you have a file id and need its details or processing status.
get_file_download_url
ChatGPTGet a download URL for a file (GET /files/{id}/download-url). Use this when the user wants to open or download a file you have the id of.
get_invoice
ChatGPTGet an invoice (GET /invoices/{id}). Use this when you have an invoice id and need its details.
get_invoice_payment
ChatGPTGet an invoice payment (GET /invoice-payments/{id}). Use this when you have a payment id and need its details.
get_project
ChatGPTGet a project (GET /projects/{id}). Use this when you have a project id and need its details.
get_project_schedule
ChatGPTGet a project's schedule (GET /projects/{id}/schedule). Use this when you need a project's schedule phases with dates and status.
get_project_status
ChatGPTSummarizes where one of the user's Handoff projects stands: status, client, contract value, billed, collected, and outstanding amounts, its estimates, upcoming schedule phases, and recent activity. Use this when the user asks how a job is going, e.g. "Where are we on the Johnson job?", "How much have we billed on the Lee project?", or "What's next on the schedule for the bathroom remodel?". Do not use it to list every project or to change a project; it reads one project. Identify the project with projectId, or with projectName (a case-insensitive match on the project or client name). When several projects match, it returns status AMBIGUOUS with candidates. Amounts are in US dollars. Sections the user's role cannot view are listed in unavailable instead of failing the whole call.
get_proposal
ChatGPTGet a proposal (GET /proposals/{id}). Use this when you have a proposal id and need its details or status.
get_takeoff
ChatGPTShows the progress and results of a Handoff AI takeoff: its stage, measured quantity totals by unit and category, and the measured items. Use this when the user asks about a takeoff that run_takeoff started, e.g. "Is the takeoff done?" or "What quantities did the takeoff find?". Do not use it to start a takeoff. A takeoff usually takes 30–120 minutes; while it runs, status is processing. Once complete, items are paginated up to 100 per page with nextCursor, and estimateId names the estimate the quantities were placed in (readable with get_estimate).
get_takeoff_credits
ChatGPTGet AI takeoff credits (GET /takeoff-credits). Use this when you need how many AI takeoff credits remain before run_takeoff.
get_template
ChatGPTGet a template (GET /templates/{id}). Use this when you have a template id and need its content.
get_time_tracking_settings
ChatGPTGet time tracking settings (GET /time-tracking/settings). Use this when you need the account's time tracking settings.
get_vendor_portal
ChatGPTGet a project's vendor portal (GET /projects/{id}/vendor-portal). Use this when you need which subcontractors and vendors can see a project and what is shared with them.
handoff_action
ChatGPTPerforms destructive or irreversible Handoff actions that the user explicitly requested, such as deleting, sending, approving, rejecting, revoking access, or rematching a catalog. Rejects reads and reversible writes. Destructive execution requires confirm:true. Handoff destructive or irreversible action commands. • call <tool> <json-args> Run a destructive catalog operation. • api <METHOD> <path> [<json>] Run a destructive endpoint directly. Deletes, proposal and invoice actions, vendor-portal access changes, time-entry approval/rejection, task creation/updates that can grant project access, and estimate-catalog rematching require "confirm": true in the args.
handoff_read
ChatGPTThe user's Handoff account data. Handoff is a construction estimating & project-management product; this tool reads the user's own Handoff projects, estimates, proposals, invoices, contacts, daily logs, documents, tasks, and expenses, and discovers available operations. Finds, lists, or summarizes the user's Handoff business records. It does not access issue trackers, code repositories, or engineering project boards. Supports operation discovery with context and search, read-only catalog calls with call, and direct read-only Handoff API requests with api. Features: • activities (2) • business-advisor (2) • catalog-rates (2) • catalogs (6) • comments (4) • contacts (6) • cost-codes (8) • custom-domain (1) • daily-logs (6) • documents (7) • estimate-generations (1) • estimates (24) • expenses (4) • files (7) • hooks (3) • invoice-payments (3) • invoices (10) • me (1) • projects (22) • proposals (1) • schedule-phases (2) • suppliers (5) • tasks (7) • templates (2) • time-tracking (8) • triggers (6) --- Handoff read and discovery commands. The feature overview is always above — no need to fetch it. • context <feature> List a feature's tools, each with its arg summary. e.g. context estimates • search <regex> Find a tool by name/description across features. e.g. search invoice • call <tool> <json-args> Run a read-only catalog tool. Args: {pathParams?, query?} e.g. call get_projects_by_id {"pathParams":{"id":"<uuid>"}} • api <METHOD> <path> [<json>] Run a read-only endpoint directly. json: {query?, body?} e.g. api GET /contacts {"query":{"limit":5}}
handoff_write
ChatGPTCreates or updates Handoff business records when the operation is reversible. Rejects reads and destructive or irreversible actions. Handoff reversible write commands. • call <tool> <json-args> Run a non-destructive create or update operation. • api <METHOD> <path> [<json>] Run an endpoint that changes state but is not destructive.
invite_vendor_portal_contact
ChatGPTInvite a contact to the vendor portal (POST /projects/{id}/vendor-portal/contacts/{contactId}/invite). Use this when the user wants a subcontractor or vendor invited to a project's vendor portal.
list_active_time_entries
ChatGPTList running time entries (GET /time-tracking/active). Use this when you need who is clocked in right now.
list_activities
ChatGPTList activities (feed) (GET /activities). Use this when you need the recent activity feed of the account or of one project.
list_catalog_rates
ChatGPTList a catalog's rate items (GET /catalogs/{id}/rates). Use this when you need the rate items (prices) inside a rate catalog.
list_catalogs
ChatGPTList rate catalogs (GET /catalogs). Use this when you need the account's rate catalogs and their ids.
list_contact_changes
ChatGPTContact delta (sync feed) (GET /contacts/delta). Use this when you are syncing contacts and need what changed since a cursor.
list_contacts
ChatGPTList contacts (GET /contacts). Use this when you need clients, vendors or other contacts and their ids.
list_cost_codes
ChatGPTList cost codes (GET /cost-codes). Use this when you need the account's cost codes and their ids.
list_daily_logs
ChatGPTList daily logs (GET /daily-logs). Use this when you need site daily logs of the account or a project.
list_document_changes
ChatGPTDocument delta (sync feed) (GET /documents/delta). Use this when you are syncing documents and need what changed since a cursor.
list_documents
ChatGPTList documents (GET /documents). Use this when you need written documents (contracts, notes) and their ids.
list_estimate_changes
ChatGPTEstimate delta (sync feed) (GET /estimates/delta). Use this when you are syncing estimates and need what changed since a cursor.
list_estimate_markups
ChatGPTList the estimate's below-the-line markups (GET /estimates/{id}/below-the-line-markups). Use this when you need the markups (overhead, profit, fees) applied below the line of an estimate.
list_estimate_rows
ChatGPTList an estimate's line items & sections (GET /estimates/{id}/rows). Use this when you need every line item, group and section of an estimate with ids, quantities and prices, e.g. before editing items. Do not use it for a summary of an estimate; use get_estimate.
list_estimates
ChatGPTList estimates (GET /estimates). Use this when you need the estimates of the account or of one project (projectId), or an estimate id by name.
list_expenses
ChatGPTList expenses (GET /expenses). Use this when you need recorded expenses (costs) of the account or a project.
list_file_changes
ChatGPTFile delta (sync feed) (GET /files/delta). Use this when you are syncing files and need what changed since a cursor.
list_files
ChatGPTList files (GET /files). Use this when you need uploaded files (plans, photos, documents) and their ids, optionally for one project. Do not use it for questions like "find the plans for this job"; use find_project_files.
list_invoice_changes
ChatGPTInvoice delta (sync feed) (GET /invoices/delta). Use this when you are syncing invoices and need what changed since a cursor.
list_invoice_payments
ChatGPTList invoice payments (GET /invoices/{id}/payments). Use this when you need the payments recorded on one invoice.
list_invoices
ChatGPTList invoices (GET /invoices). Use this when you need the invoices of the account or of one project. Do not use it for a summary of money owed or received; use check_invoices_and_payments.
list_project_budget_lines
ChatGPTList a project's assignable budget lines and actual costs (GET /projects/{id}/budget-lines). Use this when you need a project's budget lines and actual costs, e.g. to assign an expense.
list_project_changes
ChatGPTProject delta (sync feed) (GET /projects/delta). Use this when you are syncing projects and need what changed since a cursor.
list_project_members
ChatGPTList a project's team members (GET /projects/{id}/members). Use this when you need who works on a project.
list_projects
ChatGPTList projects (GET /projects). Use this when the user asks which jobs they have or names a project you need the id of, e.g. "show my projects" or "find the Lee kitchen job". Filter with search; page with starting_after. Do not use it for how one job is going overall; use get_project_status.
list_proposal_layouts
ChatGPTList proposal layouts (GET /proposal-layouts). Use this when you need the available proposal layouts.
list_proposals
ChatGPTList proposals (GET /proposals). Use this when you need proposals of the account or of one project.
list_supplier_connections
ChatGPTList supplier connections (GET /supplier-connections). Use this when you need which supplier catalogs (e.g. Home Depot) are connected.
list_suppliers
ChatGPTList suppliers (GET /suppliers). Use this when you need the suppliers Handoff can price from.
list_takeoff_items
ChatGPTList measured takeoff items (GET /takeoffs/{id}/items). Use this when you need every measured quantity of a finished AI takeoff. Do not use it for takeoff progress or totals; use get_takeoff.
list_takeoffs
ChatGPTList AI takeoffs for a project or estimate (GET /takeoffs). Use this when you need the AI takeoffs of a project or estimate.
list_task_assignee_options
ChatGPTList eligible task assignees (GET /tasks/assignee-options). Use this when you need who a task can be assigned to.
list_task_categories
ChatGPTList task categories (GET /task-categories). Use this when you need task categories and their ids.
list_task_lists
ChatGPTList task destinations (GET /task-lists). Use this when you need where tasks can be filed (task lists and projects).
list_tasks
ChatGPTList tasks (GET /tasks). Use this when you need to-dos, optionally filtered by project, assignee, status or due date.
list_templates
ChatGPTList templates (GET /templates). Use this when you need estimate or document templates and their ids.
list_time_entries
ChatGPTList time entries (GET /time-entries). Use this when you need clocked hours, optionally filtered by user, project, status or date.
move_estimate_group
ChatGPTMove or reorder an estimate section (app: 'group') (POST /estimate-sections/{id}/move). Use this when the user wants a group moved to another section or reordered.
move_estimate_item
ChatGPTMove or reorder an estimate line item (POST /estimate-items/{id}/move). Use this when the user wants a line item moved to another group or reordered.
move_estimate_section
ChatGPTReorder an estimate room (app: 'section') (POST /estimate-rooms/{id}/move). Use this when the user wants a section moved before another one.
record_invoice_payment
ChatGPTLog a manual payment on an invoice (mark paid) (POST /invoices/{id}/payments). Use this when the user received a payment outside Handoff (cash, check) and wants the invoice marked paid.
rename_estimate_group
ChatGPTRename an estimate section (app: 'group') (PATCH /estimate-sections/{id}). Use this when the user wants to rename a group of line items.
rename_estimate_section
ChatGPTRename an estimate room (app: 'section') (PATCH /estimate-rooms/{id}). Use this when the user wants to rename a section of an estimate.
restore_estimate_group
ChatGPTRestore a deleted estimate section (app: 'group') (POST /estimate-sections/{id}/restore). Use this when the user wants a deleted group brought back.
restore_estimate_item
ChatGPTRestore a deleted estimate line item (POST /estimate-items/{id}/restore). Use this when the user wants a deleted line item brought back.
restore_estimate_section
ChatGPTRestore a deleted estimate room (app: 'section') (POST /estimate-rooms/{id}/restore). Use this when the user wants a deleted section brought back.
run_business_advisor_query
ChatGPTRun a Business Advisor analysis (POST /business-advisor/query). Use this when the user asks an analytical question across jobs (profit, margins, revenue by period); read get_business_advisor_schema first. Do not use it for invoice and payment status questions; use check_invoices_and_payments.
run_takeoff
ChatGPTStarts a Handoff AI takeoff that measures quantities (areas, lengths, counts) from construction plans and places them in an estimate. Use this when the user asks to measure plans, e.g. "Do a takeoff from these plans" or "How many square feet of flooring are on these drawings?". Do not use it to check on a takeoff that is already running (get_takeoff does that) or to estimate from a scope description. Each run spends one AI takeoff credit and cannot be undone. Without confirm:true it starts nothing and returns NEEDS_CONFIRMATION with the credits remaining, so the user can decide; with confirm:true it starts and returns a takeoffId. It returns NO_CREDITS when none remain. A takeoff usually takes 30–120 minutes. Calling again with confirm:true starts and charges another takeoff unless the same idempotencyKey is reused.
send_invoice
ChatGPTSend an invoice to the client (POST /invoices/{id}/send). Use this when the user explicitly asks to email or text an invoice to the client. Pass confirm: true only after the user approves. It is not executed unless confirm is true.
send_proposal
ChatGPTSend a proposal (POST /proposals/{id}/send). Use this when the user explicitly asks to email or text a proposal to the client. Pass either recipients, each with its own methods, or methods for the proposal's saved recipients, not both. Pass confirm: true only after the user approves the recipients. It is not executed unless confirm is true.
set_estimate_catalogs
ChatGPTSet estimate catalog exclusions (triggers AI re-match) (PUT /estimates/{id}/catalogs). Use this when the user wants to change which catalogs or suppliers an estimate prices from; it re-prices the estimate.
set_estimate_discount
ChatGPTSet the estimate discount (PUT /estimates/{id}/discount). Use this when the user wants a percentage or fixed discount on an estimate; it replaces any existing discount.
set_estimate_group_summary
ChatGPTSet a section's proposal summary (PUT /estimate-sections/{id}/summary). Use this when the user wants to write the summary text a group shows on the proposal.
set_estimate_item_client_choice
ChatGPTSet a line item's options or add-on (PUT /estimate-items/{id}/client-choice). Use this when the user wants a line item offered to the client as options or as an optional add-on.
set_supplier_catalog_enabled
ChatGPTEnable or disable a supplier catalog (PATCH /supplier-connections/{slug}/catalog). Use this when the user wants a supplier's catalog turned on or off for pricing.
share_with_vendor_portal_contact
ChatGPTShare resources through the vendor portal (POST /projects/{id}/vendor-portal/contacts/{contactId}/shares). Use this when the user wants files, estimates or schedule shared with a subcontractor or vendor through the vendor portal.
update_catalog
ChatGPTUpdate a rate catalog (PATCH /catalogs/{id}). Use this when the user wants a rate catalog renamed or described.
update_catalog_rate
ChatGPTUpdate a catalog rate item (PATCH /catalog-rates/{id}). Use this when the user wants a rate item's price, unit or details changed.
update_contact
ChatGPTUpdate a contact (PATCH /contacts/{id}). Use this when the user wants to change a contact's details.
update_daily_log
ChatGPTUpdate a daily log (PATCH /daily-logs/{id}). Use this when the user wants a daily log's content or date changed.
update_document
ChatGPTUpdate a document (PATCH /documents/{id}). Use this when the user wants a document's content changed.
update_estimate
ChatGPTUpdate an estimate (PATCH /estimates/{id}). Use this when the user wants to rename an estimate or change its client, project, notes or proposal settings.
update_estimate_item
ChatGPTUpdate an estimate line item (PATCH /estimate-items/{id}). Use this when the user wants to change a line item's label, description, quantity, rate, unit, cost code or category. Use it for one line item at a time..
update_estimate_markup
ChatGPTUpdate a below-the-line markup (PATCH /estimates/{id}/below-the-line-markups/{markupId}). Use this when the user wants a below-the-line markup's title or amount changed.
update_expense
ChatGPTEdit an expense (PATCH /expenses/{id}). Use this when the user wants a recorded expense corrected.
update_invoice
ChatGPTUpdate an invoice (PATCH /invoices/{id}). Use this when the user wants an invoice's title, client, terms or due date changed.
update_invoice_payment
ChatGPTEdit a manual payment (PATCH /invoice-payments/{id}). Use this when the user wants a recorded manual payment corrected.
update_payment_schedule_entry
ChatGPTUpdate a payment schedule entry (PATCH /payment-schedule-entries/{id}). Use this when the user wants a payment schedule entry's amount, name or due date changed.
update_project
ChatGPTUpdate a project (PATCH /projects/{id}). Use this when the user wants to rename a project or change its status, client, address or assigned user.
update_schedule_phase
ChatGPTEdit a schedule phase (PATCH /schedule-phases/{id}). Use this when the user wants a schedule phase's name, dates, status or color changed.
update_task
ChatGPTUpdate, complete, reopen or assign task (PATCH /tasks/{id}). Use this when the user wants a task edited, completed, reopened or reassigned.
upload_file_from_url
ChatGPTUpload a file by URL (POST /files). Use this when the user gives a public https URL of a file to add to Handoff.
void_invoice
ChatGPTDelete (void) an invoice (DELETE /invoices/{id}). Use this when the user wants an invoice voided.
handoff_action
Claudehandoff_read
Claudehandoff_write
Claude