← All API release notes
API v4 Release Notes — August 28, 2026
New
- Lookup catalogs for the ids a create requires — 18 new read-only resources, each with
GET /v4/{resource}andGET /v4/{resource}/{id}, so you can resolve ids instead of hardcoding them:note_types,ticket_types,work_order_types,work_order_actions,equipment,equipment_statuses,equipment_wire_types,invoice_billable_items,invoice_terms,customer_payment_types,billing_types,tags,dealer_numbers,discount_affiliates,customer_cancel_reasons,funder_reasons,adt_monitoring_system_types, andinteractive_services_providers. Each is gated by the permission for the write it feeds, and every resource page now links the catalog behind each id field. POST /v4/calendar_events/available_users— returns the techs or sales reps who can be assigned an appointment for a customer, as{ user_id, name, fname, lname, eligible }. Passuser_idsto test specific people,list_modeto pick techs by office location or coverage area, and astart_from/start_to(orstart_time/duration) window to also getbusy,includes_time_off, andconflicts.POST /v4/calendar_events/available_slots— returns the configured tech time slots that are open for a customer, for companies using time-slot scheduling.customer_idplus astart_from/start_towindow are required; the window may not exceed the company's days-per-page setting (capped at 31). Companies not on slot scheduling get422slot_scheduler_not_enabled.- Query-shaped collection actions — a collection action can now answer with
200and a non-resource payload indata, instead of201and a record. The two calendar lookups above are the first;meta.datais unchanged for record actions.
Changed
- ⚠ Breaking: catalog lists now return only items that are turned on.
GET /v4/account_classes,activation_fee,customer_warranties,funders,lead_company_campaigns,lead_dispositions,lead_types,mmrs,monitoring_companies, andtermspreviously returned inactive items too. Add?active=falsefor off items only or?active=allfor both; anything else returns422.GET /{id}is unchanged — an off item still resolves so existing records read.monitoring_plansandlead_companieshave no on/off flag and are unaffected. - ⚠ Breaking:
PATCH /v4/customer_invoices/{id}restrictstypechanges. The only accepted transition isquote→invoice. Any other change —invoice→quote, for example — now returns422. Re-sending the currenttypeunchanged still passes. GET /v4/customersaccepts?location_id=— an exact integer match that narrows the already permission-scoped page. A location you cannot view returns an empty page, not403.- New catalog filters —
equipmentfilters onsku,model,manufacturer, andequipment_type_id;invoice_billable_itemsoncode,description, andinvoice_billable_item_class_id;dealer_numbersonnumber;customer_cancel_reasonsondealer_code;equipment_wire_typesonabbr;tagsonobject_context;interactive_services_providersoninteractive_services_provider_type_id. Every catalog with an on/off flag also accepts?active=. - Text filters treat
%and_literally. Aname=(or other LIKE) filter value containing those characters is now matched as text rather than as a SQL wildcard pattern. customer_paymentsreturnsis_parent_rollup— read-only, identifying consolidated parent payments produced by the nightly parent/child billing rollup.message_logsreturnsresource_idandmessage_batch_id—resource_idis a plain, joinable copy of the related record's primary key (null where the key is composite, such ascalendar_events;resource_type_instance_idstays authoritative there).message_batch_idgroups every row produced by one physical send, so twelve rows from one consolidated email are distinguishable from twelve separate sends.invoice_recurringnormalizes per-child email flags on rolled-up rows. When the customer is a sub-customer linked by parent/child billing (bill_with_parent = 1),send_on_generationandsend_on_attempted_processingare accepted onPOST/PATCHbut persist asfalse— the response body shows the stored state. Delivery for those invoices is the consolidated parent digest. Standalone customers are unaffected.userstitle fields moved to their own permission.hierarchy_title_idandhierarchy_title_designationare now in atitlesection gated by the new User Titles permission; existing Organizational Hierarchy grants were carried over at rollout, so current access is preserved.recruited_by_user_idmoved to the HR section and now needs only the HR permission, matching every other surface.POST/PATCH /v4/customerscan reject an unlicensed sales rep. For companies that enable the setting, assigning arep_idwhose user lacks the government licenses required for the customer's state, city, or county returns422anchored torep_id. Only a new assignment is checked: any create, or an update that changesrep_idor converts a lead to a customer.- API usage is metered. API requests draw SecurityTrax Tokens from your company's token wallet. Creating customers and leads (
POST /v4/customers) is included with your subscription and never draws tokens; your administrators can review the published rate in SecurityTrax. - Rate-limit thresholds are no longer published. The three levels — per IP address, per API access token, and per company — still apply, but the specific numbers have been removed from the reference because they differ per deployment, are adjusted per company, and change over time. Build against the
Retry-Afterheader on429rate_limitedrather than a rate you inferred. - Tokens are now called "API access tokens." Renamed from "personal access token" across the documentation and the SecurityTrax UI. The token format, the
Authorizationheader, and every endpoint are unchanged.
Fixed
POST/PATCH/DELETE /v4/customer_equipmentno longer double-deducts or double-credits technician inventory. For companies using the install-status-required adjustment mode, stock now moves only while the row's install status is installed or removed — a row at needs install with a technician assigned is pre-allocated, not deducted. Deleting a row credits the technician only when stock was actually out with them.
Never miss an API change
Get an email when new API release notes are published, or follow the RSS feed.