materials.add
Record a material used on a job (optionally on one of its visits): from the price book (pricebook_item_id; its name, unit, price, cost and taxable are copied as they are now) or typed in (name, unit, and optionally the price and cost per unit). Any worker of the shop can record materials, including one who may not see prices.
| Who | Agents can call this |
| REST | POST /v1/materials |
| MCP tool | materials_add |
| Writes | yes, send an Idempotency-Key |
| Area | Field work (checklists, forms, time, notes, change orders, subcontractors) |
When to use it
Record what went into a job: materials.add from the price book (pricebook_item_id; its name, unit, price, cost and taxable are copied as they are today) or typed in, optionally on one visit. Afterwards only the quantity, visit and notes change (materials.update); for anything else remove it (materials.remove keeps it in history with who and why) and add it again.
What to tell the owner
Say what you did in plain words and what happens next.
Input
| Field | Type | Required |
|---|---|---|
job_id | string (uuid) | yes |
visit_id | string (uuid) | no |
pricebook_item_id | string (uuid) | no |
name | string | no |
unit | string | no |
quantity | number | yes |
unit_price_minor | integer | no |
unit_cost_minor | integer | no |
taxable | boolean | no |
notes | string | no |
Example
POST https://doingwork.work/v1/materials
content-type: application/json
Idempotency-Key: 3f1c...
{
"job_id": "00000000-0000-4000-8000-000000000000",
"quantity": "..."
}Output
JSON. The response shape isn't published yet; read the fields you need and ignore the rest. Errors are {code, message, status}.
Errors
| Code | Status | What to do |
|---|---|---|
invalid_input, invalid_token, rate_limited | Can happen on any call. See errors. |