We don't bolt a chatbot onto Flex and call it AI. We make Flex easy for your tools to operate — an MCP server, a documented API, signed webhooks — and we're honest about what's shipped, what's next, and what we do with your data.
app.flexonthejob.com/mcp — 139 tools, 13 ready-made prompts (reorder, receiving, cycle counts, van restock, invoicing, dispatch, collections, approvals) and 2 resources covering customers and their locations, jobs, schedule and crews, items, categories, custom fields and individual stock units, reorder points and low stock, stock locations, transfers and their routes, vendors, purchase orders, sales orders from edits to returns, invoices, users and the API activity log.A three-truck HVAC shop doesn't want to evaluate our model choice; it wants "what's on Truck 3?" answered in whatever assistant it already uses. Standards — OpenAPI, MCP, webhooks — get you that without a lock-in, and let you switch agents without switching inventory systems.
For everyone else, the first-party Assistant is now live — opt-in per organization, built on Anthropic's Claude — so the two coexist: bring your own agent, or turn ours on.
The Flex Assistant is a first-party assistant inside the app, for the shops that don't want to wire up their own tooling. It's an opt-in paid module, enabled per organization — and it coexists with bring-your-own-agent, it doesn't replace it.
$70/month, including $35 of usage. If you run past the included usage, top-ups are automatic through Stripe (from $10) and the balance resets each month.
Enabling it is an explicit admin choice. Using the Assistant sends the relevant business records to Anthropic to answer your request, so turning the module on takes an admin acknowledgment. The Anthropic API does not train on your data.
Prefer your own tools? Nothing here is required — the MCP server, API and webhooks are still yours to build on.
Agents and scripts are first-class users of the API and MCP server. The same terms apply as for a person, plus these specifics.
429 and Retry-After. The limits are generous for a business; they exist so one runaway loop can't slow down the crew in the field.Idempotency-Key. It's required on writes precisely so an agent's retry never creates a second invoice./docs, /openapi/v1.json, /llms.txt and /llms-full.txt need no key and aren't rate-limited. Crawl them.sandbox.flexonthejob.com serves the same API and MCP server against a demo organization (Copperline Heating & Air, a fictional HVAC company); a public read-only key and a public write key are on the developer page. The write key can run every published write, REST or MCP, the demo data is reset every night at 08:00 UTC, and nothing there reaches a real person.Your data → your agent. When you connect an assistant over MCP, whatever it reads goes to the provider you chose under your agreement with them. Flex is not a party to that. Prefer read-only keys for exploration and add write permissions deliberately.
Our staff. Flex support accesses an organization's data only to resolve a request you made, and that access is by named, individually-accountable administrator accounts.
Aggregate product metrics (how many jobs are created per day across all customers, which pages are slow) are used to run the service. They are never per-customer benchmarks and never leave us.
Full detail in the privacy policy and on the security page.
Dates are targets, not promises; order is the commitment. Anything here can be pulled forward by a customer who needs it.
Customers, jobs, schedule, items, transfers, purchase and sales orders, invoices, users and roles. API keys with per-key permissions and rate limits, idempotent writes, ETags, RFC 7807 errors, OpenAPI + Scalar reference + llms.txt.
Twenty-one signed events with retry and delivery log, including transfer.completed, inventory.low_stock, item.updated, invoice.sent, purchase_order.status_changed, sales_order.status_changed and vendor.created. Streamable-HTTP MCP server with 139 tools, 13 prompts and 2 resources under the same keys.
Phone and tablet app for the office side, with camera barcode scanning.
updatedSince on every list endpoint for delta pulls, so a nightly sync fetches only what changed.
CSV on every list endpoint (Accept: text/csv or ?format=csv, next-page cursor in X-Next-Cursor) and a documented recipe for a scheduled nightly delta export, with webhooks covering the moments in between.
Authenticator-app codes with single-use recovery codes, per user — and an admin switch that requires it for everyone in the organization. Checked by our server for the web, desktop, phone and office apps and for device registration; no key is kept on a device.
Vendors and purchase orders from draft to received over the API and MCP, and up to 100 stock adjustments and moves in one all-or-nothing call.
Settings → Export All Data: every table of your organization as JSON and CSV in one zip, with a manifest. No email request needed.
Standalone transfers from create to complete, sales orders from pick to delivery or cancel, users and roles, crews (schedule groups), customer locations and item custom fields — all over the API and MCP, through the same code the app uses.
Every API and MCP request — including the tool an agent called — viewable, filterable and downloadable per key; keys can expire and be limited to an IP allow-list.
The full export, daily or weekly, to SFTP, an S3-compatible bucket or an emailed link — and a public data dictionary of every table and column in it.
Thirteen MCP prompts that walk an agent through reordering, receiving, cycle counts, van restocks, invoicing, dispatch, collections, approvals and more — confirming before every write.
Reorder points and a low-stock list, each item's preferred vendor and part number, category properties, per-unit values, transfer routes (scan, per-line picking, waypoint arrive/deliver/depart/skip, redirects) and sales-order edits, picking and returns — all over the API and MCP. Invoices can be finalized from MCP, and calculated fields recompute on every write.
An Organization Admin can only be demoted or deactivated with their approval or 14 days' contestable notice, and never the last one — enforced on the server for the app, the API and agents alike.
An opt-in, per-organization paid module built on Anthropic's Claude (auto-tiered) and on the same MCP tools any external agent uses — so it can never do more than your own permissions allow, and every write is confirmed in the chat first. Coexists with bring-your-own-agent.
Both apps are built on the existing webhooks and write API — instant triggers, Create Customer / Create Job actions and a customer search. Open beta: anyone can add the Zapier app with its public invite link; the Make app is available on request. Catalog listings follow once the apps have the usage those marketplaces require.
Invoices and payments pushed automatically, replacing today's CSV export.
Google and Microsoft accounts.
The technician-side phone app: today's job, parts used, photos and signatures, working offline and syncing back.
The full dated history, with an Atom feed, is at /changelog. Recent entries:
Additive changes are listed here as they ship; anything deprecated gets a dated notice at least 12 months ahead. Subscribe by watching llms.txt — it carries the same notices.
create_role, update_role, delete_role (ManageRoles), update_customer, delete_customer, void_invoice and deactivate_item, plus the job-photo tools — 138 tools. Every /api/v1 operation now has an MCP equivalent except webhook subscriptions, which stay REST-only because creating one returns its signing secret.POST /categories, PATCH / DELETE /categories/{id} (no cycles, names unique under a parent, children block a delete); an item's categories at GET /items/{id}/categories with POST / DELETE …/categories/{categoryId}; MCP create_category, update_category, delete_category, get_item_categories, assign_item_category, remove_item_category — 114 tools.GET /reorder-points (paged, CSV, updatedSince) and DELETE /reorder-points/{id}; MCP list_reorder_points, delete_reorder_point — 108 tools.GET /users/removal-requests, POST /users/{id}/removal-requests, …/approve, /contest, /cancel — approval or 14 days' contestable notice, never the last admin; PATCH /users/{id} and update_user refuse removing an admin directly; MCP list_admin_removal_requests, request_admin_removal, approve_admin_removal, contest_admin_removal, cancel_admin_removal — 106 tools.GET /categories, /categories/{id}/properties with add, change and delete; GET /items/{id}/units and PUT …/units/{unitId}/properties/{name}; PUT /schedule-groups/{id}/members, POST /schedule-groups/reorder; item.updated now fires for custom-field changes (changedProperties, changedUnitProperties); 9 new MCP tools — 101 tools.PATCH /sales-orders/{id}, /lines add/change/remove, …/picked-quantity, …/pick, /lines/pick-all, /scan, /transfers, /returnable-items, /returns; 8 new MCP tools — 92 tools.POST /transfers/{id}/submit, per-line pick / unpick / quantity, /scan, waypoint arrive / deliver / depart / skip, line redirect; GET /transfers/{id} lists waypoints; 6 new MCP tools — 84 tools.GET /items/low-stock, GET/PUT /items/{id}/reorder-points; preferredVendorId and vendorPartNumber on items; MCP list_low_stock, get_reorder_points, set_reorder_point, mark_invoice_sent — 78 tools. Calculated custom fields recompute on every value write, and property deletes reach synced devices.GET/PATCH /items/{id}/properties, per-property value, revert, add, rename/retype and delete, with typed validation; MCP get_item_properties, set_item_property, set_item_properties, revert_item_property, add_item_property, update_item_property, delete_item_property — 72 tools.POST/PATCH/DELETE /schedule-groups, members by PUT/DELETE …/members/{userId}) and customer-location writes (POST/PATCH/DELETE /customers/{id}/locations); MCP list_schedule_groups, create_schedule_group, update_schedule_group, delete_schedule_group, set_schedule_group_member, remove_schedule_group_member, list_customer_locations, create_customer_location, update_customer_location, delete_customer_location — 65 tools.GET/PATCH /users/{id}, POST /users, /deactivate, /reactivate, GET/POST /roles, GET/PATCH /roles/{id}, with rank and grant limits; MCP list_roles, create_user, update_user — 55 tools.POST /sales-orders/{id}/pick, /complete-pick, /ship, /deliver, /complete, /cancel; MCP advance_sales_order — 52 tools.POST /transfers, /{id}/pick, /start, /complete (with failed lines), /fail; /cancel now covers standalone transfers; MCP create_transfer, pick_transfer, start_transfer, complete_transfer, fail_transfer — 51 tools.reorder_below_minimum, receive_delivery, cycle_count, restock_vans, invoice_completed_jobs, morning_dispatch_summary, customer_balance_followup, review_pending_transfers.data-dictionary.json; browsable at /data-dictionary. Scheduled export to SFTP, S3-compatible storage or an emailed 7-day link. No API change.401) and be limited to an IP allow-list (403), on /api/v1 and /mcp. GET /activity (CSV too) and MCP list_api_activity read the request log, now with the MCP method and tool per call — 46 tools.POST /purchase-orders (draft with lines), /{id}/lines, /{id}/mark-ordered · /mark-shipped · /mark-delivered · /cancel, and GET/POST /vendors, GET/PATCH /vendors/{id}; MCP create_purchase_order, add_purchase_order_line, advance_purchase_order, list_vendors, create_vendor, update_vendor.POST /items/stock/batch — up to 100 stock adjustments and moves in one all-or-nothing call; MCP apply_stock_batch. 45 tools.GET /sales-orders (filter by status, customerId, updatedSince; CSV too), GET /sales-orders/{id}, POST /sales-orders (create an order with its lines — same numbering, tax and payment-terms defaults as the New Sales Order page; lines for the same item merge, totals computed) and POST /sales-orders/{id}/fulfill (the Begin Fulfillment button: creates the pick transfer; status becomes Picking or stays Pending when stock does not cover every line; calling it again only tops up what is still uncovered, and is refused with 409 once every line is covered — picking, shipping and delivery stay in the app); MCP list_sales_orders, get_sales_order, create_sales_order, fulfill_sales_order — 38 tools. Reads need ViewSalesOrders, writes ManageSalesOrders.GET /purchase-orders (filter by status, vendorId, updatedSince; CSV too), GET /purchase-orders/{id} (lines with received and remaining quantities) and POST /purchase-orders/{id}/receive (same rules as receiving in the app: only delivered or partly received orders, per-line quantity and destination location, every line checked first, over-receipt refused, stock created with cost from the order); MCP list_purchase_orders, get_purchase_order, receive_purchase_order — 34 tools. Reads need ViewPurchaseOrders, receiving ManagePurchaseOrders.POST /jobs/{id}/transfer (create the job-site transfer — same stock auto-selection as the Job Details button), GET /transfers (filter by status or approvalStatus; CSV too), GET /transfers/{id}, POST /transfers/{id}/cancel (job-site transfers; releases the stock), /approve, /reject (pending approvals only); webhooks transfer.created, transfer.cancelled; MCP list_transfers, get_transfer, create_job_transfer, cancel_transfer, approve_transfer, reject_transfer — 31 tools. All need ManageTransfers.GET /health now also returns build — the short git commit the running binary was published from (-dirty suffix when published with uncommitted changes; dev for local builds) — alongside version; existing fields unchanged. Ships as v1.0.0-beta.33.POST /items (create a catalog item, same defaults as the app) and PATCH /items/{id} (name, description, category, price, cost; If-Match → 412; fires item.updated); MCP create_item, update_item — 25 tools.POST /jobs/{id}/finalize (publish a draft estimate, same rules as the Publish Estimate button) and publishImmediately on POST /jobs (unpublishable jobs are still created as drafts with a warning); MCP finalize_estimate — 23 tools.Accept: text/csv or ?format=csv; same filters and paging, next-page cursor in X-Next-Cursor / Link rel="next"; advertised in OpenAPI and llms.txt.POST /invoices (standalone invoice from lines, same defaults as the New Invoice page) and POST /invoices/{id}/payments (record a payment or apply store credit, same rules as the Record Payment dialog); MCP create_invoice, record_payment — 22 tools.POST /items/{id}/stock/adjust and /stock/move (same rules as Add inventory, Delete and Quick move; write-offs are soft deletes), GET /locations; MCP adjust_stock, move_stock, list_locations, cancel_job — 20 tools.DELETE /customers/{id} (soft delete, refused while work is open), DELETE /items/{id} (deactivate, ?cascadeChildren=true for groups) and POST /invoices/{id}/void — same rules as the web app, all idempotent.X-RateLimit-Limit / -Remaining / -Reset on every API and MCP response; OpenAPI info contact, terms, license and servers[]; /health; public status page; /changelog and /dpa published.x-webhooks.invoice.sent, transfer.completed, inventory.low_stock, item.updated. Additive — existing subscriptions are unchanged until you tick the new events./api, /docs, /openapi.json and /developers on either host now redirect to the right place. robots.txt and security.txt published on both hosts./mcp (16 tools, 2 resources). Webhooks: job.created, job.status_changed, job.scheduled, job.assigned, job.completed, invoice.created, invoice.paid, customer.created; X-Flex-Signature HMAC-SHA256./modules, /customers (read, create, update, locations), /items, /invoices (read, from-job, mark-sent), /jobs (read, create, status, assignees, reschedule, cancel), /schedule, /schedule-groups, /users. API keys with per-key permissions and rate limits; cursor paging; updatedSince on list endpoints; ETags; Idempotency-Key required on writes; RFC 7807 errors; /docs, /openapi/v1.json, /llms.txt, /llms-full.txt.Tell us what you're building. Customers set the order.