Operations API

Jobs and time

Scheduling, timesheets, expenses and the org profile that lands on every document.

Contents
GET/jobs
POST/jobs
GET/jobs/{jid}
PATCH/jobs/{jid}
DELETE/jobs/{jid}
FieldTypeNotes
namestringRequired.
job_number, client, job_sitestring
descriptionstring
statusstringDefaults to "scheduled".
scheduled_start, scheduled_endstring
assigned_tostring
Jobs use PATCH, the database uses PUT

The inconsistency is real and worth knowing rather than discovering. On /jobs/{jid} every field is optional and an omitted field is left alone. On /db/* the update is a replacement and an omitted field is cleared. Check which one you are calling before you send a partial body.

Time entries#

GET/time
POST/time
POST/time/{tid}/submit-bfs

Required: date, job_number, hours_regular. Optional: job_site, hours_overtime, task_desc, clock_in, clock_out.

Expenses#

GET/expenses
POST/expenses/receiptmultipart
POST/expenses/manual
POST/expenses/batch-submitowner / admin

/expenses/receipt takes a photograph and extracts the fields; /expenses/manual takes them directly: date, vendor, amount, category, and optionally tax, description, job_number.

Organization profile#

The letterhead and company details that every generated document inherits. Upload a header image once and it replaces the platform band on every report page.

GET/org/profile
PUT/org/profile
POST/org/report-headermultipart
DELETE/org/report-header