API release notes

What's new in the SecurityTrax API

New endpoints, changes, and fixes for developers building on the SecurityTrax API, newest first.

Looking for platform updates instead? See the SecurityTrax release notes.

Never miss an API change

Get an email when new API release notes are published, or follow the RSS feed.

API v4 Release Notes — September 11, 2026

New

  • Customer communications: create, update, deletecustomer_communications now supports GET (list and by id), POST, PATCH /{id}, and DELETE /{id}. A create links both a customer and a customer_note and needs direction (i or o). type defaults to phone, and user_id is set to the acting user. You get a 422 if the note belongs to a different customer or already has an active communication. To recategorize a contact, PATCH the existing record.

  • At-risk cases: create, update, deletecustomer_at_risks now supports GET (list and by id), POST, PATCH /{id}, and DELETE /{id}. A create needs the customer relationship and a customer_at_risk_reason_id. Resolving and closing work by setting is_resolved / is_closed: the server fills in resolved_at/resolved_by and closed_at/closed_by, which are read-only. A case with is_resolved set must include a customer_at_risk_resolution_id. List filters include is_closed, is_resolved, assigned_user_id, is_assigned, and follow_up_date ranges.

  • At-risk notes: POST /v4/customer_at_risk_notes — Add a follow-up note to an at-risk case. Notes can't be edited or deleted after they're created. communication and note are required. You need Modify on the At Risk permission to create one. Notes are listable, and also come back with GET /v4/customer_at_risks/{id}?include=notes.

  • Lead interactions: POST /v4/lead_contacts — Log a rep interaction on a lead. Interactions can't be edited or deleted after they're created. note is required, and the parent must be a lead (type: leads); a customer returns 422. If you omit user_id, current_lead_type_id, and current_rep_id, they're filled from the acting user and the lead's current state. Creating requires lead-modify access.

  • GET /v4/object_files — Lists customer and lead file metadata. Filters: customer_id (or object_id), service_type, and created_at / updated_at ranges. Sorts on id, object_id, name, created_at, and updated_at. File bytes are still downloaded through v1.

  • 24 more documented, listable resources — Each now has GET /v4/{resource} with filters, sorting, and ?count_only=true, plus a reference page. All are read-only.

    • Customers & leads: message_logs, customer_to_email, consumer_financing_applications, consumer_financing_applicants, customer_equipment_reconcile, customer_billing_to_uses
    • Scheduling: calendar_event_reschedules (reschedule history: old/new start, reason, initiated_by), calendar_events_extended (on-site en-route, arrival and departure status)
    • Billing: customer_accounting_information, invoice_emails, invoice_statements, payment_to_invoice (which payment paid which invoice, and amount_used), accounting_journal_entries, accounting_journal_entry_lines, mmr_to_mmr_items
    • Workflows & e-documents: flows, flow_steps, flow_enrollments, flow_enrollment_steps, electronic_document_envelopes, electronic_document_assignments, electronic_document_assignment_recipients, electronic_document_assignment_events, electronic_document_field_value

    customer_billing_to_uses, calendar_events_extended, and payment_to_invoice have composite keys, so they are list-only with no /{id} route.

Changed

  • ⚠ Breaking: an unrecognized filter value now returns 422. These filters used to ignore a value they didn't recognize and return the list unfiltered:

    • users?active=, locations?active=
    • groups?assignable=
    • user_rep_numbers?domain=
    • customer_payments?cleared=
    • customer_contacts?about=
    • calendar_category on calendar_events, calendar_event_types, and calendar_event_detail_types

    They now return 422 with reason unsupported_value and list the accepted values. Likewise, sending an array for page, per_page, sort, or include (for example ?page[]=2) returns 422 instead of being read as the default.

  • GET /v4/customers can list leads. Add ?record_type=lead to list leads; record_type=customer is still the default. What you see matches the Leads page in SecurityTrax. New filters, which work for both customers and leads: lead_rep_id, lead_type_id, lead_disposition_id, lead_company_id (source), lead_company_campaign_id, and lead_callback_date_from / _to. New sorts: lead_created and lead_callback_date. Sending a customer-only filter (location_id, sale_date_from / _to, cancelled) with record_type=lead returns 422.

  • GET /v4/customers accepts ?rep_id= — Exact sales-rep match within your permitted results. A rep with no customers you can see returns an empty page, not 403.

  • New includes.

    • customers?include=files works on a single record and on the list.
    • customer_invoices?include=invoice_line_items returns the invoice with its active lines, on a single record or the list.
    • users/{id}?include=udfs returns a user's custom-field values.

    On list requests, each row's include is capped at 100 records. When any row hits the cap, the response adds meta.includes_truncated and meta.include_item_limit.

  • customer_id filter aliascustomer_invoices, invoice_recurring, object_tags, object_udfs, and object_files accept customer_id in place of entity_id / object_id. Sending both with different values returns 422.

  • object_udfs covers user custom fields. Pass ?object_type=user, with user_id as an alias for object_id, to list user values. POST /v4/object_udfs/set and /clear accept user fields. Reading user values requires the company-wide Users view permission, and setting or clearing them requires Users modify. Customer values work as before.

  • customer_notes returns follow_up_date on tickets. The ticket due date could already be written but wasn't returned in responses. It is now readable too.

  • Access tokens carry a scope. When you create a token, you choose what it works with. A token without API access now gets 401 unauthenticated on /user/v4/*. Existing tokens are scoped to API access, so current integrations keep working without changes.

Fixed

  • GET /v4/calendar_events left out appointments you could read by id. Users who can assign sales appointments to themselves, and users with lead scheduling access, now see the same appointments in the list that they can open individually.
  • GET /v4/customer_notes totals and pages didn't match the rows returned. Work orders you could see only through the Work Orders permission were missing from the list. Meanwhile, count_only and meta.pagination.total could count notes you couldn't view, so pages came back shorter than per_page. The list and its totals now apply the notes, work-order, and lead-notes permissions separately.

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} and GET /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, and interactive_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 }. Pass user_ids to test specific people, list_mode to pick techs by office location or coverage area, and a start_from/start_to (or start_time/duration) window to also get busy, includes_time_off, and conflicts.
  • 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_id plus a start_from/start_to window are required; the window may not exceed the company's days-per-page setting (capped at 31). Companies not on slot scheduling get 422 slot_scheduler_not_enabled.
  • Query-shaped collection actions — a collection action can now answer with 200 and a non-resource payload in data, instead of 201 and a record. The two calendar lookups above are the first; meta.data is 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, and terms previously returned inactive items too. Add ?active=false for off items only or ?active=all for both; anything else returns 422. GET /{id} is unchanged — an off item still resolves so existing records read. monitoring_plans and lead_companies have no on/off flag and are unaffected.
  • ⚠ Breaking: PATCH /v4/customer_invoices/{id} restricts type changes. The only accepted transition is quoteinvoice. Any other change — invoicequote, for example — now returns 422. Re-sending the current type unchanged still passes.
  • GET /v4/customers accepts ?location_id= — an exact integer match that narrows the already permission-scoped page. A location you cannot view returns an empty page, not 403.
  • New catalog filtersequipment filters on sku, model, manufacturer, and equipment_type_id; invoice_billable_items on code, description, and invoice_billable_item_class_id; dealer_numbers on number; customer_cancel_reasons on dealer_code; equipment_wire_types on abbr; tags on object_context; interactive_services_providers on interactive_services_provider_type_id. Every catalog with an on/off flag also accepts ?active=.
  • Text filters treat % and _ literally. A name= (or other LIKE) filter value containing those characters is now matched as text rather than as a SQL wildcard pattern.
  • customer_payments returns is_parent_rollup — read-only, identifying consolidated parent payments produced by the nightly parent/child billing rollup.
  • message_logs returns resource_id and message_batch_idresource_id is a plain, joinable copy of the related record's primary key (null where the key is composite, such as calendar_events; resource_type_instance_id stays authoritative there). message_batch_id groups every row produced by one physical send, so twelve rows from one consolidated email are distinguishable from twelve separate sends.
  • invoice_recurring normalizes 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_generation and send_on_attempted_processing are accepted on POST/PATCH but persist as false — the response body shows the stored state. Delivery for those invoices is the consolidated parent digest. Standalone customers are unaffected.
  • users title fields moved to their own permission. hierarchy_title_id and hierarchy_title_designation are now in a title section gated by the new User Titles permission; existing Organizational Hierarchy grants were carried over at rollout, so current access is preserved. recruited_by_user_id moved to the HR section and now needs only the HR permission, matching every other surface.
  • POST / PATCH /v4/customers can reject an unlicensed sales rep. For companies that enable the setting, assigning a rep_id whose user lacks the government licenses required for the customer's state, city, or county returns 422 anchored to rep_id. Only a new assignment is checked: any create, or an update that changes rep_id or 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-After header on 429 rate_limited rather 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 Authorization header, and every endpoint are unchanged.

Fixed

  • POST / PATCH / DELETE /v4/customer_equipment no 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.

API v4 Release Notes — August 5, 2026

New

  • Alarm.com provisioning — provision Alarm.com service directly from the API with new actions on customers: discover your dealer's packages (adc_packages, with camera-only filtering), create the Alarm.com customer or commitment, activate a commitment, and change service plans. Customer app credentials are returned once in the create response. Duplicate provisioning is blocked so a customer can't end up with two Alarm.com accounts.
  • Guardian Protection Services provisioning — new guardian_options, guardian_save_account, and guardian_resync actions on customers for creating and syncing Guardian monitoring accounts.
  • ADT order lifecycle — eight new actions on customers cover the full ADT ordering flow: precheck a customer, fetch options and order data, save and submit an order, check order status, and cancel an order.
  • Integration reference pages — the API docs now include a dedicated reference page per integration (Alarm.com, Guardian, ADT) documenting each action's request and response.
  • Credit checks — run a live credit pull via the new run action on customer_credit_checks (all bureau types, with the same per-bureau options as the app), or record a manually obtained score via record. Reads support customer, bureau, and date filters, and credit checks are available as an include on customers. A same-customer, same-bureau pull within 24 hours is rejected as a duplicate unless you explicitly override with force: true.
  • Credit bureau catalog — new read-only credit_bureaus resource so you can discover the tenant's configured bureaus before running a check.
  • File uploads — attach files to customers and leads via the new object_files resource: POST the file bytes base64-encoded to upload (up to 20 MB), GET to read file metadata. Renaming, deleting, and downloading remain on v1 for now.
  • Inline invoice line itemsPOST /customer_invoices now accepts line items embedded in the create request, so an invoice and its lines can be created in one call. The write is all-or-nothing: if any line fails, nothing is saved.

Improved

  • Single-call customer importsPOST /customers now accepts monitoring account numbers (account_num, secondary_account_num, ADT identifiers), install fields (is_installed, install appointment, service flags), confirmation number, receiver number, abort code, and beacon score. Previously these were update-only, forcing a create-then-update round trip when importing already-installed customers.
  • Company-wide user readsGET /users and user_rep_numbers reads now return all users in the company (matching the app and earlier API versions) instead of only users sharing a location with the caller.
  • Company-wide user management — user edits, rep-number changes, and user deletion now follow the same company-wide permissions as the app. Deletion requires the User delete permission.

Fixed

  • Monitoring account numbers rejected on writeaccount_num, secondary_account_num, and the ADT identifier fields on customers could not be created or updated by regular API users even with full customer permissions. They now accept writes with the standard customer create/modify permission.