Private preview of the new site. Not live.

changes.list

A job's change orders and its money picture: signed quotes (contract_minor) + approved change orders = revised_total_minor; pending (sent, not yet signed); invoiced on live invoices; unbilled; and approved change orders not on an invoice yet.

WhoAgents can call this
RESTGET /v1/change-orders
MCP toolchanges_list
Writesno
AreaField work (checklists, forms, time, notes, change orders, subcontractors)

When to use it

A change order is a priced change to a job's scope: extra work, or a credit for work taken out. A worker writes the lines (changes.create; never fill prices in yourself).

What to tell the owner

Tell them what you found in plain words. Don't read back raw fields.

Input

FieldTypeRequired
job_idstring (uuid)yes

Example

GET https://doingwork.work/v1/change-orders?job_id=00000000-0000-4000-8000-000000000000

Output

FieldTypeAlways there
job_idstring (uuid)yes
currencystringyes
contract_minorintegeryes
approved_changes_minorintegeryes
revised_total_minorintegeryes
pending_changes_minorintegeryes
invoiced_minorintegeryes
unbilled_minorintegeryes
unbilled_changes_minorintegeryes
unbilled_change_ordersintegeryes
itemsarrayyes
items[].change_order_idstring (uuid)yes
items[].shop_idstring (uuid)yes
items[].job_idstring (uuid)yes
items[].numberintegeryes
items[].titlestringyes
items[].description['string', 'null']yes
items[].currencystringyes
items[].subtotal_minorintegeryes
items[].taxable_minorintegeryes
items[].tax_rate_id['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')']yes
items[].tax_name['string', 'null']yes
items[].tax_rate_bps['integer', 'null']yes
items[].tax_minorintegeryes
items[].total_minorintegeryes
items[].statusstringyes
items[].signature_request_id['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')']yes
items[].signature_id['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')']yes
items[].sent_at['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')']yes
items[].approved_at['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')']yes
items[].cancelled_at['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')']yes
items[].cancel_reason['string', 'null']yes
items[].invoice_id['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')']yes
items[].invoicedbooleanyes
items[].created_bystring (uuid)yes
items[].created_atstring (date-time)yes
{
  "job_id": "00000000-0000-4000-8000-000000000000",
  "currency": "...",
  "contract_minor": 50000,
  "approved_changes_minor": 50000,
  "revised_total_minor": 50000,
  "pending_changes_minor": 50000,
  "invoiced_minor": 50000,
  "unbilled_minor": 50000,
  "unbilled_changes_minor": 50000,
  "unbilled_change_orders": 1,
  "items": [
    {
      "change_order_id": "00000000-0000-4000-8000-000000000000",
      "shop_id": "00000000-0000-4000-8000-000000000000",
      "job_id": "00000000-0000-4000-8000-000000000000",
      "number": 1,
      "title": "...",
      "description": "40 gallon gas heater, installed",
      "currency": "...",
      "subtotal_minor": 50000,
      "taxable_minor": 50000,
      "tax_rate_id": "00000000-0000-4000-8000-000000000000",
      "tax_name": "...",
      "tax_rate_bps": "...",
      "tax_minor": 50000,
      "total_minor": 50000,
      "status": "...",
      "signature_request_id": "00000000-0000-4000-8000-000000000000",
      "signature_id": "00000000-0000-4000-8000-000000000000",
      "sent_at": "...",
      "approved_at": "...",
      "cancelled_at": "...",
      "cancel_reason": "...",
      "invoice_id": "00000000-0000-4000-8000-000000000000",
      "invoiced": true,
      "created_by": "00000000-0000-4000-8000-000000000000",
      "created_at": "..."
    }
  ]
}

Errors

CodeStatusWhat to do
invalid_input, invalid_token, rate_limitedCan happen on any call. See errors.