AddedChangedFixedMCP
MCP server now speaks protocol revision 2026-07-28, with tool safety hints and clearer argument errors. Existing clients keep working.
The Alvys MCP server now implements MCP protocol revision 2026-07-28 — the largest revision of the protocol since it launched. Older revisions are still accepted, so no action is required for existing clients.
Nothing to configure. MCP clients and servers negotiate the protocol revision automatically on connect. The server URL, the tool catalog, and the scopes are identical across revisions — the negotiated revision changes protocol mechanics, not what your agent can do.
Protocol revision support
If a client fails to connect, the protocol revision is very unlikely to be the cause — check authentication and organization selection first.
Added
- Tool safety hints. Every tool now advertises MCP
annotations—readOnlyHint,destructiveHint,idempotentHint, andopenWorldHint— derived from the same Read/Write/Destructive classification the server enforces, so the advertised hint always matches the enforced policy. Clients use these to decide when to ask a human before running a tool. The beta surface is read-only, so every currently visible tool is markedreadOnlyHint: trueanddestructiveHint: false; the hints matter once write tools are enabled, and are in place ahead of that. - Server usage guidance. The server publishes natural-language
instructionsdescribing how to use the surface — that tool visibility is fixed per deployment, that unknown parameters are rejected rather than ignored, and that searches are 0-based and paginated. Clients that surface server instructions will pass this to the model automatically.
Changed
- Stable tool ordering.
tools/listandprompts/listreturn entries sorted by name, so the catalog no longer varies between requests. This makes client-side caching reliable and improves prompt-cache hit rates when the tool list is included in model context. GETandDELETEon/mcpreturn405 Method Not Allowed. These were the legacy session verbs —GETopened a server-to-client stream andDELETEended a session. Revision2026-07-28is sessionless, so neither is offered. They now answer405(a capability signal) rather than400or401, so a client probing for session support gets an unambiguous answer without a token.offline_accessis no longer advertised inscopes_supported. A refresh token is not a requirement of this resource, so the protected-resource metadata no longer lists it. Clients that want a refresh token still request it from the authorization server as before. This shortens the consent screen.
Fixed
- Argument errors are actionable instead of generic. A missing required argument, or one of the wrong type (for example
page: "not-an-int"), previously returnedAn error occurred.— indistinguishable from a server fault. These now return a structured[invalid_params]error naming the parameter, so an agent can correct the call and retry. This covers both tools and prompts. - Prompt argument errors.
prompts/getwith a missing required argument returned the same generic error. It now returnsinvalid_paramsnaming the argument. - Malformed requests return a proper error body. A malformed JSON-RPC request now returns
400with a JSON-RPC error rather than an empty500.
What Changed?
Requests to a Public API path that does not exist — for example a typo’d controller name or a retired endpoint — return 404 Not Found. They do not return 401 Unauthorized.401 Unauthorized continues to mean the access token is missing or invalid. See Response Codes.What Should I Do?
No client changes are required if you already treat unknown paths as 404. If you recently treated unexpected 401s on bad URLs as credential failures, verify the request path against the API reference first.AddedChangedFixedMCP
MCP tool catalog: stop-status write split into three tools, new trucks_events_search, discovery and authorization fixes
MCP tools
- Added
trips_record_arrival(Write ·stop:update) — record an arrival event on a trip stop. WrapsPUT /api/p/v1/trips/{tripId}/stops/{stopId}/arrival. - Added
trips_record_departure(Write ·stop:update) — record a departure event on a trip stop. The server enforces that an arrival must exist first. WrapsPUT /api/p/v1/trips/{tripId}/stops/{stopId}/departure. - Added
trips_update_stop_appointment(Write ·stop:update) — update the appointment (or FCFS window) on a trip stop.scheduleTypemust beAPPTorFCFS;appointmentDateis required whenscheduleType=APPT, andwindowBeginis required whenscheduleType=FCFS. WrapsPUT /api/p/v1/trips/{tripId}/stops/{stopId}/appointment. - Removed
trips_update_stop_status— the single combined tool is replaced by the three purpose-built tools above. Callers should migrate to the specific tool for the action they want to take. - Added
trucks_events_search(Read ·truck:read) — fetch truck events (maintenance, schedule, availability) for one or more trucks over a date range, mirroringdrivers_events_search. PasstruckIds(Alvys truck ids, not unit numbers) and astartDate;endDateis optional. Returns a flat event list, not paged — an empty list means no events in the range.
Fixed
- Browser-based MCP clients can complete discovery. The protected-resource metadata endpoints and
/mcpnow answer cross-origin requests and OPTIONS preflights, so a client that runs guided OAuth in a browser (for example MCP Inspector) can finish the handshake instead of failing on preflight. - Consistent authorization for settlement-statement-only tokens. A user token carrying only settlement-statement permissions no longer passes the
carriers_*anddrivers_*read tools at the MCP edge only to be rejected by the Public API downstream. Those tools now require the same carrier and driver read permissions their underlying endpoints enforce, so both sides agree on the outcome.
The underlying Public API endpoints are unchanged — what moved is the MCP tool catalog and the MCP server’s own authorization and discovery behavior.
The Alvys MCP server is now stricter about tool arguments and aligns paging and filter shapes with the Public API, so calls port 1:1 between the two. Two of these are breaking for anyone who scripted against the previous MCP facade.
What changed
- 0-based paging on every search tool.
pagedefaults to0and responses echo the requestpageback so agents can drive their own pager.pageSizestill defaults to25(max100). - Strict argument validation. Unknown keys — at the top level or nested inside a date-range object or array element — return
[invalid_params]naming the offending keys and the tool’s full valid-parameter list. - Array filters, matching the Public API. Filters that map to
/searcharray fields are now declared as arrays on the tool so you can pass one or many values in a single call. - Structured date-range objects. Date-range filters are now single
{ start, end }objects using the same parameter names the Public API uses. Anendwithout astartis rejected up front.invoices_searchstill requires at least one non-date filter alongside a range (matching the Public API);trips_searchaccepts a range as its only filter.
Tools affected
Migration
- Rename any renamed parameters. In particular:
unitNumber→truckNumber/trailerNumber(ontrucks_search/trailers_search),truckId→truckNumber(onfuel_transactions_search), and singularmcNumber/dotNumber/loadNumber/orderNumber/tripNumber/driverId→ their plural array forms on the search tools listed above. - Wrap single-value filters in an array.
status: "Active"→status: ["Active"],mcNumber: "12345"→mcNumbers: ["12345"], and so on. - Collapse date pairs into
{ start, end }objects using the new parameter names (createdDateRange,pickupDateRange,deliveryDateRange,invoicedDateRange,paidDateRange,transactionRange). - Shift
pagedown by one.page=1(old first page) →page=0. If your code computespagefrom a UI index, subtract1at the call site. - Drop any unrecognized keys. If a call now returns
[invalid_params], the error message lists both the rejected keys and the valid parameter set — align on that list.
carrier_onboarding_v1, settlement_reconciliation_v1) have been updated to reference the new parameter names. Read tool coverage, permissions, and endpoints are otherwise unchanged.See Available MCP Tools for the full conventions and an example [invalid_params] payload.API credentials can now be scoped to specific subsidiaries. A scoped credential’s access token is limited to the data of the subsidiaries it was issued for — across every read and write endpoint of the Public API, including webhooks.The claim is added automatically when the token is issued and restricts the credential’s access to only the subsidiaries it has been granted. It is evaluated on every API request, with no additional configuration required.Scope rules:
What changed
Previously, every API credential had tenant-wide access: any token could read and modify data belonging to any subsidiary in your company. Subsidiary selections made during credential creation were stored but not enforced.Now, when a credential is created with one or more subsidiaries selected, that scope is embedded in the access token and enforced on every request.How token scope works
When you request an access token, Alvys adds a new claim to the token:What a scoped token can see and do
Reads — search and list endpoints return only records belonging to the credential’s subsidiaries, plus records that have no subsidiary assignment (tenant-level data). Get-by-ID requests for a record outside the scope return404 Not Found, exactly as if the record did not exist.Writes — a scoped token cannot create, update, or delete records outside its subsidiaries. Out-of-scope writes return 404 Not Found — the same response as a nonexistent record, so a scoped credential cannot probe for the existence of another subsidiary’s data. This covers load updates, notes and documents, trip assignment/dispatch, stop arrivals/departures/appointments, check calls, customer updates and deletes, deductions, invoice payments and financing, and asset document uploads.Webhooks — webhook subscriptions are subsidiary-bound. A scoped credential can only create, list, manage, and read delivery logs for webhooks belonging to its own subsidiaries, and can only subscribe to events of those subsidiaries.Scoped entities
Subsidiary scope applies to: Loads, Trips (including stops and check calls), Invoices, Customers, Deductions, Fuel transactions, Tolls, Drivers, Trucks, Trailers, Driver Settlement Statements, Carrier Settlement Statements, and Webhooks. Carriers and Tenders are not subsidiary-scoped.Response code changes
One response code changed as part of this work:POST /api/p/v{version}/trips/{tripId}/assign with an unknown trip ID now returns 404 Not Found (previously 400 Bad Request). This aligns assign with the other trip endpoints and is required for the no-existence-leak guarantee above. No other status codes changed.Backward compatibility
Existing credentials and integrations are unaffected. Tokens issued from credentials without a subsidiary selection — including all credentials created before this release — remain tenant-wide. Scoping only applies when you explicitly select subsidiaries on a credential.Creating a scoped credential
- Navigate to Settings → API Keys
- Click New credential
- Select permissions and choose the subsidiaries the credential may access — up to 3 specific subsidiaries, or All subsidiaries for tenant-wide access
- Click Generate and store the Client ID and Secret securely
AddedFixedDriver Settlement StatementsAuthenticationMCP
Escrow transaction type on driver settlement statements, user-token read access
Public API + MCP: user-token access to read endpoints
- Fixed interactive (user-PKCE) tokens failing
load:read,stop:read,trip:read,visibility:read, andcarrier:readon the Public API and MCP for otherwise-privileged users. These endpoints were checking for internal permissions (ViewLoads, baseCarrier) that no real user record carries. Any authenticated tenant user now passes the user-token half of those read checks, matching the in-app role gating. Machine-to-machine tokens are unchanged — they still require the corresponding OAuth scope. Every write endpoint keeps its real permission check.
POST /api/p/v{version}/driver-settlement-statements/search and GET /api/p/v{version}/driver-settlement-statements/{number}
- Added
TransactionTypeon the responseLineItems[]. Populated only whenCategoryisEscrow;nullfor every other line item."Deposit"— money moved into the driver’s escrow account. Appears as a negativeAmount."Withdrawal"— money moved out of the escrow account. Appears as a positiveAmount.
- Additive and non-breaking. Existing consumers see one new nullable field. Totals and every other field are unchanged. This is the only Public API surface that returns escrow line items today;
POST /api/p/v{version}/deductions/searchdoes not.
POST /api/p/v{version}/invoices/carrier-payments
- Removed
MarkAsPaidfrom the request body. The field only existed to force aPaidtrip status, which Alvys does not use. Existing callers that still sendmarkAsPaidare unaffected — the field is ignored. - Fixed trip status in the response: when recorded payments fully cover the carrier payable, the trip now transitions to
Completedinstead ofPaid. Partial payments leave the trip status unchanged. - The response
Statusfield reflects the trip’s current status after the payment is applied.
MCP: invoices_record_carrier_payment
- Removed the
markAsPaidparameter (same behavior as the Public API change above).
Historical trips may still carry a
Paid status from before this fix. A one-time data backfill is planned separately.Load & trip webhooks can now tell you exactly what changed.
load.changed and trip.changed events carry an optional data.diff — a list of domain-named change kinds (e.g. StatusChanged, RateChanged, AppointmentChanged) and, opt-in, the previous values of every changed field. React to the exact change that matters and apply just the delta, instead of diffing full snapshots yourself.What’s New?load.changed and trip.changed webhooks now carry an optional data.diff node that tells you what changed on the record — and, if you opt in, what the value was before. You no longer have to diff successive snapshots yourself to react to a change.What Changed?Previously, load.changed and trip.changed delivered only the full current snapshot in data. Consumers had to cache the prior payload and compute their own delta to know whether a change was relevant. Each event can now include data.diff with two independent parts:data.diff.changes— an array of domain-named change kinds (e.g.StatusChanged,RateChanged,StopReordered,AppointmentChanged). Delivered to every subscriber whenever something meaningful changed. Sub-entity changes carry atarget—{ "type": "Stop" | "Field", "id": "<stableId>" }.data.diff.previousAttributes— the previous value of every changed field visible on the public response, keyed 1:1 with the snapshot. Keyed collections (stops, references, charge lines) diff by stableid. Opt-in per subscription.
data.diff is present only on load.changed / trip.changed — never on *.status.changed, and it is omitted on the first (create) event where there is no prior state.How to Enable Previous Valuesdata.diff.changes is delivered automatically. data.diff.previousAttributes is opt-in:-
Dashboard: turn on Include previous values on the webhook.

-
API: set
IncludePreviousAttributes: truewhen creating or updating the subscription (defaults tofalse).
POST /p/v1.0/webhooks and PUT /p/v1.0/webhooks/{id} accept the new IncludePreviousAttributes flag. Event delivery on existing load.changed / trip.changed subscriptions is backward compatible — data.diff is additive.Why?State-mirroring integrators can now apply just the delta instead of re-importing the whole record on every event — lower processing cost, cleaner audit trails, and the ability to filter on the exact business change that matters.What’s New?
Check calls — driver status updates recorded against a trip — can now be read and logged through the Public API. Tracking platforms and visibility providers can push location updates into Alvys and read back the full check-call history without manual entry.What Changed?
Previously, check calls were only visible and editable inside the Alvys platform.Now, the Public API includes two new endpoints:- List trip check calls — returns every check call recorded on the trip.
- Log a trip check call — records a new check call with a required
descriptionplus optionalactivity,driverId, structuredlocation(coordinates included), and reefersetpointTemperature/returnTemperature.
Response Body Includes
- Core:
Id,LoadNumber,TripId,TripNumber,Description - Status:
Activity,ResponseType,DriverName - Location: structured address with coordinates
- Reefer:
SetpointTemperature,ReturnTemperature - Audit:
CreatedAt,CreatedBy
null (not empty strings), so consumers can distinguish “not provided” from “explicitly empty”.Why?
Check calls are the heartbeat of in-transit visibility. Exposing them via the Public API lets tracking integrations write status updates directly to the trip and lets downstream systems consume a single, consistent history.We’ve added Public API support for finalized driver, owner-operator, and carrier settlement statements. Partners can now pull statement headers, totals, and full line-item detail programmatically — making it easier to build custom reporting and reconciliation workflows without manually exporting the “Statements List and Items” report.
What’s New
- Search finalized driver and owner-operator settlement statements with paging, line items, and totals.
- Search finalized carrier settlement statements with paging, per-trip breakdowns, line items, payments, and totals.
- Fetch a single driver, owner-operator, or carrier settlement statement by statement number.
- Filter statement searches by statement-date range, driver type, carrier, and subsidiary.
What Changes
- This release is additive and backward compatible.
- Only finalized statements from the Statements tab are returned. Open and Draft statements are excluded.
-
Driver settlement statements may include
Failedstatements; these are identified through theStatusfield. -
Carrier settlement statements exclude
FailedandDeletedstatements. -
StatementDateRangeis required for search requests. BothStartandEndmust be provided and are interpreted as inclusive UTC calendar days. -
The driver
DriverTypefilter acceptsCOMPANY,OWNER_OPERATOR, orCONTRACTOR, case-insensitive, matching the/driversendpoint. -
Monetary values are returned as
{ Amount, Currency }objects. -
Access uses existing scopes:
driver:readfor driver settlement statementscarrier:readfor carrier settlement statements
Endpoints Affected
POST /p/v1.0/driver-settlement-statements/search(new) — search finalized driver and owner-operator settlement statements.GET /p/v1.0/driver-settlement-statements/{number}(new) — fetch a single driver or owner-operator settlement statement by statement number.POST /p/v1.0/carrier-settlement-statements/search(new) — search finalized carrier settlement statements.GET /p/v1.0/carrier-settlement-statements/{number}(new) — fetch a single carrier settlement statement by statement number.
We’ve added Public API support for assigning carriers to trips, dispatching trips, searching trips by assigned equipment, updating carrier status, and reading carrier contacts — so partners can run more of the dispatch and carrier workflow programmatically.
What’s New
- Assign a carrier to a trip — assign a carrier, and optionally a driver, truck, and trailer, to a trip.
- Dispatch a trip — dispatch a covered trip so dispatch can be triggered from your own workflow.
- Filter trips by driver, truck, or trailer — narrow trip search to a specific driver or piece of equipment.
- Update a carrier’s status — set a carrier’s status (e.g. Active, Do Not Load) to keep records in sync with your compliance and vetting systems.
- Carrier contacts in the carrier response — read carrier contact details without extra calls.
What Changes
- All changes are additive and backward compatible.
- The new trip filters (
driverId,truckId,trailerId) are optional. Each is valid on its own or alongside existing search parameters;driverIdmatches primary, secondary, and owner-operator assignments. - Carrier responses now include a
Contactscollection (name, email, phone, mobile, title, and a primary-contact flag) on both the get-by-id and search responses. - Assigning a carrier requires
carrierIdanddispatcherId;driver2Idcannot be sent withoutdriver1Id. Assets are referenced by id — resolve them via their search endpoints first. - Dispatch requires the trip to be Covered (carrier and assets assigned); otherwise the request is rejected.
- Updating carrier status supports optimistic concurrency via the
If-Matchheader and returns a freshETagfor the next update.
Endpoints Affected
POST /p/v1.0/trips/{tripId}/assign(new) — assign a carrier and optional assets; returns the updated trip.POST /p/v1.0/trips/{tripId}/dispatch(new) — dispatch a covered trip; returns the updated trip.POST /p/v1.0/trips/search(updated) — now acceptsdriverId,truckId, andtrailerIdfilters.PATCH /p/v1.0/carriers/{carrierId}/status(new) — update a carrier’s status; returns204 No Contentwith a freshETag.GET /p/v1.0/carriers/{id}andPOST /p/v1.0/carriers/search(updated) — responses now includeContacts.
Release Date: November 2025 (tender ingest), June 19, 2026 (public availability)
What’s New?
The Public API now includes a full set of Tender endpoints, covering the complete tender lifecycle — create, update, cancel, search, and respond (accept / reject). Originally introduced as an EDI-focused add-on, the Tenders API is now part of the standard public Swagger group and available to all Public API consumers.What Changed?
Previously, tender operations were only available through EDI integrations or as a restricted add-on.Now, the Public API includes:- Search & get — query tenders and retrieve full tender detail.
- Create / update / cancel — ingest load tenders (including EDI 204-originated tenders) programmatically.
- Accept / reject — respond to a tender; accepting creates the corresponding load in Alvys.
- Accept updates / accept cancellation — apply an inbound tender update or cancellation to the linked load.
tender.received, tender.updated, tender.cancelled, and related events) announced separately — subscribe to webhooks for real-time notification, then act on the tender via these endpoints.Why?
Tendering is the front door of the load lifecycle. Exposing it in the Public API lets brokers, shippers, and integration platforms route freight into Alvys — and respond to it — without requiring a traditional EDI pipeline.What’s New?
We’ve added aPATCH /p/v1.0/loads/{loadNumber} endpoint to the Public API. Partners running an external system of record (e.g. AS400) can now write their generated identifier back onto an Alvys load as the Order Number (Shipment ID) — programmatically, with no human in the loop.The endpoint is a partial update: only the fields you send are modified, leaving everything else untouched. It’s shaped so additional writable load fields can be added later without breaking the contract. In this first iteration, orderNumber is the only writable field.What Changed?
Previously, a load’s Order Number could only be set in the UI — there was no public write path. Now you can update it directly:200 OK with the updated load representation and a fresh ETag.Preventing Accidental Overwrites
To help prevent one update from accidentally overwriting another, this endpoint requires the latest record version when making changes.When you retrieve or update a record, the response includes anETag. Send that value in the If-Match request header when making your next update.If you receive
412 Precondition Failed, retrieve the record again to get the latest ETag, then retry the update.After a successful update, the new ETag is returned in both the response body and the ETag response header, so you can use it for the next update without making another GET request.Validation & History
- A blank or empty Order Number is rejected with
400 Bad Request— the same rule as the internal Order Number update. - Every change is written to the load’s history (the same audit trail as the UI path).
- EDI-originated loads are rejected. The Order Number on an EDI load is locked to the value received on the inbound tender and cannot be changed through this endpoint.
Endpoints Affected
PATCH /p/v1.0/loads/{loadNumber} is new and updates a load’s Order Number.No request or response shapes were changed for existing endpoints. This update is fully backward compatible.Response Codes
Release Date: June 3, 2026 (server), June 18, 2026 (prompts & write tools), July 3, 2026 (user sign-in)
What’s New?
Alvys now ships a remote Model Context Protocol (MCP) server that exposes the Public API to AI agents — Claude, Cursor, and your own custom agents. Instead of hand-wiring HTTP calls, an agent connects to one governed endpoint and discovers Alvys tools automatically.What Changed?
Previously, integrating an AI agent with Alvys meant holding a raw Public API token and calling REST endpoints directly.Now, agents connect to the Alvys MCP server and get:- Read tools across core entities — loads, trips, carriers, customers, drivers, trucks, trailers, invoices, deductions, fuel transactions, tenders, visibility history, and documents.
- Write tools (opt-in) — create/accept/reject tenders, record carrier and customer payments, record financing, assign and dispatch trips, update carrier status, upload documents, record stop arrivals/departures, and update stop appointments.
- Curated prompts (v1) — guided multi-step workflows such as
find_and_cover_load,dispatch_driver,carrier_onboarding,settlement_reconciliation, andtrack_shipment.
Authentication
Two ways to connect:- Machine-to-machine — Auth0 client-credentials tokens, same as the Public API.
- User sign-in — OAuth 2.1 with PKCE per the MCP specification, including protected-resource discovery (RFC 9728) and resource indicators (RFC 8707), so interactive clients like Claude can sign in as a user.
Governance & Safety
- Tenant isolation is enforced from the token — never from the request body.
- Every tool is classified Read / Write / Destructive with runtime gates; write tools are disabled unless explicitly enabled.
- Each tool requires a matching granular API permission (e.g.
tender:read,invoice:update). - All calls are rate-limited, size-capped, and audit-logged.
Why?
AI agents are becoming a first-class way to operate a TMS. The MCP server gives them a discoverable, audited, tenant-isolated surface — one choke point with tool-level authorization instead of raw API tokens spread across agents.The Public API now supports writes on the Returns Returns Returns
No. Your existing Client Credentials works — just add the
Customer resource. Partners can create new customers, update existing ones, and soft-delete them directly through the API — no more read-only ceiling.This release is purely additive. The existing GET reads and POST /api/p/v1.0/customers/search are unchanged.What’s new
Applies to both business-company types:
Customer and Broker/3PL.Why it matters
- Real-time CRM sync — push customer records straight into Alvys from your TMS, ERP, or CRM instead of entering them by hand.
- Conflict-safe edits —
ETag/If-Matchoptimistic concurrency means two concurrent edits never silently overwrite each other.
Create
201 Created with a Response body. The ETag is returned both in the body and on the response header. Name and Type are required on create; Type must be Customer or Broker/3PL.Update (partial)
200 OK. PATCH is a true partial update (RFC 7396 JSON Merge Patch) — omit any field to leave it unchanged.Delete
204 No Content. The record moves to Status: Inactive (soft-delete) and its CompanyNumber stays reserved to prevent reuse.Supported writable fields
The following fields can be created or updated through the Customer write endpoints:Name, Type, CompanyNumber, Status, BillingAddress, Email, Phone, Fax, ExternalId.All other fields are read-only or managed by Alvys, including SalesAgentId, Contacts, Notes, InvoicingInformation, Id, DateCreated, and DateModified.Unsupported or read-only fields included in the request body are ignored.Field validation
Request behavior
PATCH and DELETE require the If-Match header.If If-Match is missing, the API returns 428 Precondition Required. If the ETag is outdated, the API returns 412 Precondition Failed. Retrieve the customer again to get the latest ETag, then retry.Duplicate CompanyNumber, ExternalId, or Name + billing ZIP code returns 409 Conflict. The response identifies the conflicting field and existing customerId.If customer writes are temporarily unavailable, the API returns 503 Service Unavailable with Retry-After: 3600 and the EndpointDisabled problem type. Customer read endpoints remain available.Write and read responses
SuccessfulPOST and PATCH requests return CustomerWriteResponse.The write response includes:Id, ETag, Name, CompanyNumber, Type, Status, BillingAddress, Email, Phone, Fax, DateCreated, DateModified, InvoicingInformation, ExternalId.For write responses, ETag is returned in both the response body and response header.Existing GET and search endpoints are unchanged. They continue to return CustomerResponse, with Status as Active or Inactive and ETag in the response header only.Access
Use your existing Client Credentials and add the scopes you need:customer:read—GET/searchcustomer:create—POSTcustomer:update—PATCHcustomer:delete—DELETE
FAQ
Do I need a new credential or OAuth client?No. Your existing Client Credentials works — just add the
customer:create / customer:update / customer:delete scopes you need. customer:read is unchanged.How do I get the ETag for an update or delete?
It’s returned on the response header of any GET, POST, or PATCH, and additionally in the body of POST / PATCH. Use it as If-Match on your next mutation. On a 412, re-GET for the fresh value.What happens if two callers update the same customer at once?
The first PATCH wins (200); the second sees a stale If-Match and gets 412. Re-GET, reapply, retry. No silent overwrite.Does DELETE actually remove the record?
No — it’s a soft-delete. Status goes to Inactive and the CompanyNumber stays reserved (a duplicate POST with that number returns 409). To restore, PATCH with { "Status": "Active" }.What happens if I send an unsupported field like Notes in the body?
It’s silently ignored. Only the writable fields listed above are applied.Does this change the existing GET or search response shape?
No. The read surface is unchanged; this release is purely additive.When do I see 404 vs 412?
404 = the id does not exist in your tenant (ids in another tenant also return 404). 412 = the id exists in your tenant but your If-Match is stale — re-GET for the current ETag.What’s New?
We’ve added two new webhook event types to the Public API:load.changed and trip.changed. Whenever an operational field (such as rates, appointments, stops, or carrier assignments) is updated on a load or trip, Alvys now pushes a real-time webhook to every active subscription that selected those events.What Changed?
Previously, detecting load- and trip-level updates required pollingGET /loads and GET /trips on a schedule. Now, the following event types are available alongside the existing events and can be selected when creating or editing a webhook subscription:load.changedtrip.changed
GET /p/v1.0/webhooks/event-typesEvent Envelope
All webhook deliveries share the standard Alvys envelope. The new event types reuse it with a specific ID suffix for idempotency:id is unique per event and should be used as the idempotency key on the consumer side. Note: General changes end in a -0 suffix, while status changes end in -1.load.changed
Triggered when a load document is created or updated. The payload carries a full Public-API load snapshot - the same shape returned byGET /p/v1.0/loads/{loadNumber}.trip.changed
Triggered when a trip document is created or updated. The payload carries a full Public-API trip snapshot - the same shape returned byGET /p/v1.0/trips/{tripId}.Endpoints Affected
GET /p/v1.0/webhooks/event-typesnow returnsload.changedandtrip.changed.POST /p/v1.0/webhooks/PUT /p/v1.0/webhooks/{id}accept the new event type values in theeventTypesarray.
Why?
These events let API partners and integrations:- React to load and trip operational changes in real time, without polling.
- Reduce overall API call volume on
/loadsand/trips. - Drive downstream automations (factoring, tracking, billing) the moment an operational state changes.
- Keep audit trails consistent through the existing webhook Delivery Logs UI.
AddedWebhooksCarriers
Per-Entity Document Webhooks for Loads, Trips, Drivers, Carriers, Trucks & Trailers
What’s New?
Twelve new webhook event types are now available on the Public API — two for each parent entity that exposes documents through the API. Whenever a document is uploaded or removed in Alvys, the platform emits a webhook to every active subscription that selected the corresponding event.Events fire regardless of write source — UI uploads, Public API uploads, mobile-app uploads, EDI document ingestion, or third-party integrations all produce the same deliveries.Every
*.document.uploaded event ships with a short-lived pre-signed download URL (≤ 15-minute TTL) so partners can pull the file directly without an additional API call.What Changed?
Subscribing
In Settings → API → Webhooks → Create / Edit subscription, select any combination of the new event types. The full list is also returned byGET /p/v1.0/webhooks/event-types for programmatic configuration.Envelope (general structure)
All document webhook deliveries share the standard envelope used bytender.*, load.status.changed, and trip.status.changed. id is the deterministic idempotency key ({documentId}-{etag}); etag is also exposed as its own top-level envelope field so consumers can detect out-of-order replays for the same documentId.*.document.uploaded payload (general structure)
Real production sample (trip.document.uploaded):data.tripIdis the trip GUID (the natural public identifier returned byGET /p/v1.0/trips/{tripId}).data.document.parentIdon a trip document is the load number ("1000000") — matching how trip documents are stored internally and returned byGET /loads/{loadNumber}/documents.attachmentTypeis a human-readable Alvys document type (e.g."Bill of Lading","Proof of Delivery","Rate Confirmation") — same value returned by the document Public API endpoints.uploadedByis the user id (GUID) of the uploader.
data always contains the parent’s natural public identifier (loadNumber, tripId, driverId, carrierId, truckId, or trailerId) plus a document block. For example, driver.document.uploaded swaps tripId for driverId; the document block is identical.*.document.deleted payload (general structure)
downloadUrl and expiresAt are omitted on delete events — the document is logically gone, so consumers should not pull bytes.Behavior notes
- An event fires only when a document is created or soft-deleted — rename, retype, and other metadata-only edits do not generate deliveries.
- Pre-signed
downloadUrlis short-lived (≤ 15 minutes). Pull the file promptly, or fall back toGET /p/v1.0/{parent}/{parentId}/documents/{documentId}if it expires.
Endpoints Affected
Webhook subscription management
These existing endpoints now accept the twelve new event types in theireventTypes array:GET /p/v1.0/webhooks/event-types— returns the full catalog including the new document event types.POST /p/v1.0/webhooks— create a subscription that selects any combination of the new events.PUT /p/v1.0/webhooks/{id}— update an existing subscription to add or remove document events.GET /p/v1.0/webhooks/{id}— inspect which events a subscription is selecting.GET /p/v1.0/webhooks/{id}/deliveries— delivery history for the new events flows through the same logs surface astender.*and*.status.changed.
Document endpoints driving the events
Any write to the following document sub-resources will fire the corresponding webhook for active subscribers. No request or response shape has changed on these endpoints — they are listed here so you can correlate which API actions produce which events.UI uploads, mobile-app uploads, EDI ingestion, and third-party integrations also produce the same events even though they don’t go through the Public API endpoints above.
Fallback retrieval (if a downloadUrl expires)
If the 15-minute pre-signed downloadUrl expires before you fetch the file, retrieve the document through the standard authenticated endpoint:Why?
Until now, retrieving newly uploaded documents required polling the document sub-resource on each parent —/loads/{loadNumber}/documents, /drivers/{driverId}/documents, and four more. With these events in place:- ⚡ Real-time document automation — POD-driven invoice automation, factoring, document management, and EDI 210 invoice validation no longer wait on a poll loop.
- 🔁 Lower API load — eliminates polling traffic against six different parent endpoints.
- 🎯 Subscribe narrowly — events are scoped per entity (
load.*vsdriver.*vscarrier.*…). A factoring integration that only cares about load-side documents won’t receive driver med-card updates. - 🧾 Built-in audit trail — every delivery attempt is recorded and visible in the Webhook details page.
- 🔗 Direct download — every
*.uploadedevent carries a pre-signed download URL.
Who has access?
All Public API consumers with an active webhook subscription that selects any of the new event types. Subscription management requires Partner Admin / Admin / Support role under Settings → API → Webhooks.Frequently Asked Questions (FAQ)
Q: Do I need a new credential or scope to receive these events? A: No. Existing webhook subscriptions can opt in by selecting the new event types.Q: Is thedownloadUrl reusable? A: It’s a single short-lived pre-signed Azure Blob SAS — valid for up to 15 minutes from emission. If it expires, retrieve the document through the standard Public API endpoint instead.Q: Are events ordered? A: Deliveries are best-effort ordered per document. Consumers should be idempotent and use the envelope id ({documentId}-{_etag}) as the idempotency key.Q: Can I see delivery history for these events? A: Yes — the existing Logs sidebar on the webhook detail page shows every delivery attempt for these event types, with the same filtering, pagination, and CSV/JSON export as tender.* and status-change events.Q: Are document update / rename events available? A: Not in this release. Today we emit on upload and soft-delete only. Update events may be added later as *.document.updated if there’s customer demand.What’s New?
We’ve added two new webhook event types to the Public API:load.status.changed and trip.status.changed. Whenever a load or trip transitions from one status to another (for example, Covered → Dispatched or Dispatched → InTransit), Alvys now pushes a real-time webhook to every active subscription that selected those events.What Changed?
Previously, the Public API exposed webhooks only for tender lifecycle events. Detecting load- and trip-level status transitions required pollingGET /loads and GET /trips on a schedule.Now, the following event types are available alongside the existing tender.* events and can be selected when creating or editing a webhook subscription:Event Envelope
All webhook deliveries share the standard Alvys envelope. The new event types reuse it without changes:id is unique per event and should be used as the idempotency key on the consumer side.load.status.changed
Triggered when a load transitions from one status to another. The payload carries the prior + current status delta and a full Public-API load snapshot — the same shape returned by GET /p/v1.0/loads/{loadNumber}.trip.status.changed
Triggered when a trip transitions from one status to another. The payload carries the prior + current status delta and a full Public-API trip snapshot — the same shape returned by GET /p/v1.0/trips/{tripId}.Behavior
- Events are emitted only on actual transitions — when
statusdiffers frompreviousStatus. No-op writes do not generate deliveries. load/tripmay benullif the snapshot read fails or if the payload exceeded the size limit and was stripped. ThepreviousStatusandstatusfields are always present so consumers can still react to the transition and refetch viaGET /loads/{id}orGET /trips/{id}if needed.- Deliveries are signed (
X-Alvys-Signature), retried with exponential backoff, and auto-disable subscriptions after sustained failures — identical to existingtender.*events.
Endpoints Affected
GET /p/v1.0/webhooks/event-types— now returnsload.status.changedandtrip.status.changedPOST /p/v1.0/webhooks/PUT /p/v1.0/webhooks/{id}— accept the new event type values in theeventTypesarray
Why?
These events let API partners and integrations:- React to load and trip status changes in real time, without polling
- Reduce overall API call volume on
/loadsand/trips - Drive downstream automations (factoring, tracking, billing) the moment an operational state changes
- Keep audit trails consistent through the existing webhook Delivery Logs UI
What’s New?
We’ve introduced new Public API capabilities for carrier payments, customer payments, and financing transactions. These additions make it easier for external payment platforms, factoring providers, and finance systems to sync financial activity directly with Alvys.What Changed?
Previously, the Public API did not provide dedicated endpoints for recording these financial transactions.Now, the API includes the following new endpoints:Carrier Payments
Records a payment made to a carrier for a trip.Example:carrierPaidAt.Customer Payments
Records a payment received from a customer for a load.Example:paidAttotalPaidpayments[]
Financing
Records financing activity such as reserve or escrow amounts for a load.Example:Endpoints Affected:
POST /p/v1.0/invoices/carrier-paymentsPOST /p/v1.0/invoices/customer-paymentsPOST /p/v1.0/invoices/financing
Why?
These enhancements provide:- Faster integration with payment and finance platforms
- Better automation for receivables and payables
- Support for factoring and escrow workflows
- Reduced manual entry of financial transactions
- Improved accounting visibility across loads and trips
What’s New?
We’ve updated Trip Search behavior for invisible trips created by split, re-split, and unsplit flows whenincludeDeleted: true is used. This improves sync reliability for integrations that poll trips using updatedSince or updatedAtRange.What Changed?
The default behavior is unchanged:- when
includeDeletedis omitted, Trip Search returns only visible, non-deleted trips - when
includeDeleted=false, Trip Search also returns only visible, non-deleted trips
includeDeleted=true.Previously, when a load was split, superseded or hidden trips could silently disappear from API results, even when includeDeleted=true. This made it difficult for integrations to detect lifecycle transitions and could leave stale records in downstream systems.Now, when includeDeleted=true, Trip Search returns invisible trip records as tombstones by surfacing them with isDeleted: true. This includes:- superseded base trips
- hidden child legs from chained splits
- hidden child legs from split-cancel / unsplit / restore scenarios
updatedAt is updated when trip visibility changes, so polling by updatedSince or updatedAtRange can reliably capture these events.What isDeleted Means
When includeDeleted=true:isDeleted=truemeans the trip is deleted or no longer visible and should be treated as inactive for syncisDeleted=falsemeans the trip is a current visible leg
Common Scenarios
Example
For a load with chained split behavior such as1110758:Endpoint Affected
Why?
This enhancement provides:- reliable tombstone detection for invisible and superseded trips
- better support for
updatedSinceandupdatedAtRangepolling - more consistent synchronization for split, re-split, cancel-split, and restore scenarios
AddedWebhooks
Public API Webhook Enhancements: Delivery Attempts, Status Reason, and Delivery Log Export
What’s New?
We’ve expanded the Public API webhook capabilities with new delivery metadata, richer event payloads, and export support for webhook delivery logs. These updates make webhook integrations easier to monitor, debug, and process safely.What Changed?
Previously, webhook consumers did not receive a delivery-attempt header, visibility/status webhook payloads did not include a human-readable status reason, and there was no dedicated delivery-log export endpoint in the published schema. In addition, delivery log filters previously accepted single string values.Now, the Public API includes the following webhook changes:Delivery Attempt Header
Alvys now includes anX-Alvys-Attempt header on every outbound webhook delivery request. The value represents the delivery attempt number as an integer string.This can be used to support idempotent processing, suppress duplicate warnings, and track retry behavior.
statusReason Added to Webhook Payloads
Outbound webhook payloads for visibility and status events now include a statusReason field. This field provides the human-readable reason description, distinct from the reason code.Example:Delivery Logs Export
A new webhook delivery log export endpoint is now available in the new schema:GET /p/v{version}/webhooks/{webhookId}/delivery-logs/export. It supports CSV and JSON export and uses the same filters as the delivery logs list endpoint. The schema description also confirms the export supports up to 25,000 rows total.Query Parameters
Export Behavior
The new schema documents the following format resolution behavior for the export endpoint:Format=csvorFormat=jsonin the query string takes precedence when provided.- Otherwise, the
Acceptheader is used. - Otherwise, the response defaults to JSON.
Breaking Change: Delivery Log Filters Now Accept Arrays
The delivery logs list endpoint changed its filter shape between the old and new schema. Previously, bothStatus and EventType were single strings. In the new schema, both are arrays of strings.Before
After
Status and EventType are defined as arrays.Endpoints Affected
GET /p/v{version}/webhooks/{webhookId}/delivery-logsGET /p/v{version}/webhooks/{webhookId}/delivery-logs/export
Why?
These enhancements provide:- better retry visibility for webhook consumers
- clearer status context in outbound payloads
- easier export and audit of webhook delivery history
- more flexible filtering for delivery log queries and exports
ImprovedTendersCarriers
Public API Enhancements for Loads, Trips, Carriers, Tenders, and Core Response Schemas
What’s New?
We’ve delivered additional Public API improvements across loads, trips, carriers, tenders, and several existing response schemas. These changes improve sync reliability, expose more operational data, and make related endpoints more consistent.What Changed?
Previously, several important fields and behaviors were either missing from the published schema, inconsistent between related endpoints, or not fully exposed to integrations.Now, the Public API includes the following confirmed changes:Loads
Load responses now include:- orphaned loads are now treated as non-existent
- load search totals exclude abandoned loads with no trips
- load document and note operations now return
404for orphaned loads
Trips
Trip responses now include:- split or invisible trips can now be returned as
isDeleted: truewhenincludeDeleted=true GET /p/v{version}/tripsnow supportsincludeDeletedPOST /p/v{version}/trips/searchnow allowsupdatedAtRangeas the only filter- load references of type
service_exceptionare now exposed - carrier payloads are aligned between single-trip retrieval and trip search
Carriers
Carrier search results now include carriers inDoNotLoad status, which were previously omitted even when they were referenced by trips.Tenders
Tender requestreferences[] objects now support a type field, enabling typed reference routing.Additional response schema updates
The new schema also confirms additional response-model changes outside the payment-posting flows:-
CarrierResponsenow includes:PaymentMethodExternalIdsFactoringCompany
-
DriverResponse,TruckResponse, andTrailerResponsenow include:LicenseCountry
-
FuelResponsenow includes:Description
-
FuelResponsePumpLocationnow includes:State
Trip rate schema updates
The trip rate-related schemas were expanded with additional structures and fields:-
DriverRatePolicyResponsenow includes:CustomerLineHaulDeductionRatePerMileRatePerMileDeductionRate
-
PerLoadRatenow uses a dedicatedPerLoadRateDto -
MileageRateDtonow includes:UseHighestTier
-
PerTripRateDtonow includes:TiersMileageType
-
PerTripRateDto.Rateis now marked as deprecated in the schema
Error-response documentation updates
The new schema also adds broader error-response documentation across many existing non-webhook endpoints:401 Unauthorized403 Forbidden429 Too Many Requests
Why?
These enhancements provide:- better load and trip sync reliability for polling integrations
- clearer identification of tender-originated loads
- better visibility into order linkage at the trip level
- more complete carrier search results
- stronger consistency between related trip endpoints
- richer master-data payloads for carriers, drivers, trucks, trailers, and fuel records
- more expressive trip rate schemas
What’s New?
The Public API now supports full stop-level trip execution: read a trip’s stops, record (or clear) arrivals, record departures, and manage stop appointments — so dispatch events can flow into Alvys from your own systems in real time.What Changed?
Previously, stop arrivals, departures, and appointment changes could only be recorded inside the Alvys platform.Now, the Public API includes the following endpoints:- Record stop arrival — body takes a required
arrivedAttimestamp; returns the updated stop. - Clear stop arrival — removes a previously recorded arrival.
- Record stop departure — body takes a required
departedAttimestamp; returns422if the stop is not in a state that can be departed. - Set stop appointment — update the stop’s
scheduleType,loadingType, and appointment window.
StopResponse, so callers get fresh state without a follow-up read.Why?
EDI providers, driver apps, and dispatch systems generate arrival/departure events outside Alvys. These endpoints let those events land directly on the trip’s stops, keeping statuses, timestamps, and downstream billing (e.g. detention) accurate.Release Date: March 2, 2026 (endpoints), April 30, 2026 (
CreatedById)What’s New?
You can now list, create, and delete load notes through the Public API — keeping operational commentary in sync between Alvys and your external systems.What Changed?
Previously, load notes were only accessible inside the Alvys platform.Now, the Public API includes:- List load notes — returns all notes on the load.
- Create load note — body takes
description,noteType, and an optional client-suppliedid; returns201with the created note. - Delete load note — returns
204on success.
Response Body Includes
Id,Description,NoteTypeCreatedAt,CreatedByCreatedById— the unique identifier of the user who created the note (added April 2026), so integrations can attribute notes to a user by id instead of parsing display names.
404.Why?
Notes carry dispatch context — special instructions, exception history, customer commitments. Exposing them via the API lets integrations read that context and write their own, without double entry in two systems.What’s New?
Alvys now supports Webhooks — a secure way to receive real-time event notifications directly from Alvys to your system.Instead of polling the API for updates, your system can now subscribe to events and receive them automatically via secure HTTPS calls.In this initial release, Webhooks support tender-related events only. Additional event domains (such as loads or trips) will be introduced in future releases.This version establishes the foundation layer for real-time event distribution in Alvys.What You Can Do
With Webhooks, you can:- Receive real-time tender lifecycle events
- Automatically trigger workflows in your system
- Improve integration speed and responsiveness
Included in This Release
Event Delivery
Alvys sends HTTPSPOST requests to your configured endpoint whenever a subscribed tender event occurs.Each delivery includes:- Event type
- Unique event ID
- Timestamp
- Secure HMAC signature
Automatic Retries
If your endpoint is temporarily unavailable, Alvys will retry delivery automatically.Each event can be attempted up to four times.Retries occur when:- Your endpoint returns a server error (5xx)
- A timeout occurs
- A temporary network failure happens
Security & Verification
Webhooks include:- HMAC-SHA256 signature verification
- Replay protection using timestamps
- HTTPS-only delivery
- Endpoint ownership verification during setup
Why This Matters
Webhooks enable real-time, event-driven integrations between Alvys and your systems.This release lays the foundation for:- EDI over API integrations
- Automated tender workflows
- Faster operational response
- Secure third-party integrations
Documentation
For full implementation details, please refer to:These guides cover subscription setup, retry behavior, auto-disable rules, signature validation, and best practices for building robust integrations.What’s New?
We’ve added two new fields to the Trips endpoints in the Public API: Temperature and RequiredEquipment. These fields provide visibility into temperature requirements and equipment specifications for each trip.What Changed?
Previously, temperature requirements and normalized equipment requirements were not exposed in the Public API.Now, the response includes the following new properties:Temperature
TheTemperature object represents the required temperature settings for temperature-controlled trips.- SetpointTemperature – The required target temperature.
- SetpointTemperatureMax – Optional maximum temperature when a range is defined.
- ControlMode – Expected operational mode (
ContinuousorStart/Stop).
null.RequiredEquipment
TheRequiredEquipment field is now returned as an array of equipment types required for the trip.Examples:null.Endpoints Affected:
POST /api/p/{version}/trips/searchGET /api/p/{version}/trips/{id}
Why?
These additions provide:- Improved visibility into temperature-controlled trip requirements
- Structured equipment data for easier validation and integration
- Better support for compliance workflows and custom tracking applications
What’s New?
Custom references — tenant-defined key/value identifiers configured in your Alvys company profile — are now exposed in the Public API on trips, drivers, trucks, and trailers.What Changed?
Previously, custom references were only visible inside the Alvys platform.Now, the corresponding get-by-id and search responses include areferences collection:Endpoints Affected
GET /api/p/v{version}/trips/{id}andPOST /api/p/v{version}/trips/searchGET /api/p/v{version}/drivers/{id}andPOST /api/p/v{version}/drivers/searchGET /api/p/v{version}/trucks/{id}andPOST /api/p/v{version}/trucks/searchGET /api/p/v{version}/trailers/{id}andPOST /api/p/v{version}/trailers/search
Why?
Most fleets track external identifiers that don’t fit standard fields — payroll ids, ELD ids, insurance policy numbers, legacy system keys. Custom references let you model those in Alvys, and this change makes them available to every integration that needs to join Alvys records to outside systems.What’s New?
We’ve introduced the new RatesV2 structure for drivers and owner-operators in the Trips Public API. This structure provides a detailed breakdown of how each driver’s pay was calculated based on applied rate rules and policies.What Changed?
Previously, driver payment data underDriver1, Driver2, and OwnerOperator included only simple Rates[] arrays with limited fields (e.g., rate, rateType, source).Now, the response includes a RatesV2 array, containing all applied rules, their types, amounts, and computed line items.Each RatesV2[] entry contains a unique PolicyId, PolicyName, and one or more detailed rate components such as:Endpoints Affected
GET /api/p/{version}/tripsPOST /api/p/{version}/trips/search
Why?
This change exposes driver rate calculation logic used in the Alvys UI, allowing integrators to:- Understand which rules and policies were applied to determine each payout.
- Align backend integrations with the new internal pay policy engine for consistent reporting and reconciliation.
What’s New?
A new Deductions module has been added to the Alvys Public API. These endpoints allow integrations to create, search, retrieve, and delete deduction records associated with drivers or trucks. A deduction represents an asset-specific financial adjustment (e.g., drug test fees, fuel advances, or reimbursements) and is always linked to a specific DriverId or TruckId, but never both.At this stage, only one-time (Once) deductions are supported.What Changed?
New endpoints:Validation rules:
- A deduction must include either
DriverIdorTruckId— one of them is required. OwnerOperatorIdis optional and may be used only to override the current owner of the asset. It is never the primary deduction subject.- If
DriverIdis provided → the deduction appears in that driver’s deduction list. - If
TruckIdis provided → the deduction appears in that truck’s deduction list. - For creating a deduction, the amount must be negative and less than - 1.00.
- Only
"Once"frequency is supported. - Requires a valid Bearer token with the appropriate scope (
deduction:read,deduction:create, ordeduction:delete).
Why?
This release introduces a consistent and secure way to manage one-time deductions through the Public API. It enables automated synchronization of deduction data across financial and payroll systems while maintaining full ownership and asset context within Alvys.We’ve added new Documents retrieval endpoints to the Public API. These endpoints allow you to retrieve uploaded documents for carriers, drivers, loads, trips, trucks, and trailers.
What Changed?
Previously, documents were only available through internal UI and were not exposed in the Public API.Now, the following new endpoints are available for retrieving documents associated with each entity type:Endpoints Added:GET /api/p/{version}/carriers/{carrierId}/documentsGET /api/p/{version}/drivers/{driverId}/documentsGET /api/p/{version}/loads/{loadNumber}/documentsGET /api/p/{version}/trips/{tripId}/documentsGET /api/p/{version}/trucks/{truckId}/documentsGET /api/p/{version}/trailers/{trailerId}/documentsResponse Example
Each endpoint returns an array of document objects, providing all documents linked to the specified entity. Each document includes details such as type, size, uploader, and upload time, along with a secure download link. TheDownloadUrl is valid for 10 minutes and includes an ExpiresAt timestamp.Why?
This enhancement improves transparency and flexibility by making documents accessible through the Public API. It supports broader use cases, enabling external systems to integrate seamlessly with Alvys data and workflows.What’s New?
We’ve added the Load Office field to the Public API. This field is now returned under the Loads endpoint, giving you visibility into which office a load belongs to.What Changed?
Previously, the Load’s office information was not exposed in the Public API.Now, the response includes the following new property:Endpoints Affected:
POST /api/p/{version}/loads/searchGET /api/p/{version}/loads/{id}
Why?
This change provides transparency into load ownership by office, supporting office-level reporting and integrations that require filtering or grouping loads by their assigned office.What’s New?
We added a new set of document upload endpoints that allow attaching files directly to Carriers, Drivers, Loads, Trailers, Trips, and Trucks. Each endpoint supportsmultipart/form-data uploads with validation on file size and document type.📂File uploads up to 25 MB (PDF, JPEG, PNG)🧾 Entity-specific validation → Each entity supports only its own DocumentType list (e.g., Carrier Agreement, Driver License, Proof of Deliver)🗂️ Standardized metadata → Every upload returns AttachmentPath, AttachmentType, AttachmentSize, UploadedAt, and parent entity reference🔑 Authentication & scopes → Requires valid Bearer token with read/update scope for the target entityWhat Changed?
-
New endpoints:
POST /api/p/v{version}/carriers/{carrierId}/documentPOST /api/p/v{version}/drivers/{driverId}/documentPOST /api/p/v{version}/loads/{loadNumber}/documentPOST /api/p/v{version}/trailers/{trailerId}/documentPOST /api/p/v{version}/trips/{tripId}/documentPOST /api/p/v{version}/trucks/{truckId}/document
-
Validation by entity:
- Carrier→ Carrier Agreement, Carrier Application, Carrier Authority, Carrier Onboarding, Other Documents
- Driver→ License, Drug Test, Medical (suggested rename: Medical Card), W9 Form, Operating Authority, Other Documents
- Truck/Trailer → Motor Vehicle Record, Vehicle Image, Inspection Certificate, Certificate of Insurance (COI), Insurance Certificate, Other Documents
- Loads→ Customer Rate and Load Confirmation, Customer Load Confirmation, Customer Rate Confirmation, Signed Customer Rate Confirmation, Proof of Delivery, Proof of Pickup, Bill of Lading, Shipping Labels
- Trips → Proof of Delivery (POD), Bill of Lading (BOL), Carrier Rate Confirmation, Load Manifest, Trip Report, Temperature Log, Proof of Pickup, Scale Ticket, Notice of Assignment (NOA), Shipping Labels
-
Error handling standardized:
400invalidDocumentTypeor file too large401invalid/expired token403missing scopes404parent not found/deleted415unsupported content type429rate limit exceeded
Example — Upload Document to Load
Why?
This enhancement provides a standardized and secure way to upload and manage documents across all core entities. By enforcing file size and type validation, plus entity-specificDocumentType rules, we improve compliance and data integrity. These endpoints also unlock automation use cases, such as auto-attaching Proof of Delivery, Insurance Certificates, or Rate Confirmations during operational workflows.What’s New?
We added a new Locations Controller to the Public API. This lets you fetch and search company location details (e.g., Terminals, Shippers/Consignees, Cold Warehouses, Dry Warehouses).- Lookup by ID or Company Number: Retrieve a single location by unique
idorcompanyNumber. - Flexible search: Filter by
Statuses,LocationIds, orCreatedDateRange. - Richer details: Get company name, type, address, contacts, and notes directly in the response.
What Changed?
-
New endpoints:
GET /api/p/v{version}/locations→ Single location lookup byidorcompanyNumber.POST /api/p/v{version}/locations/search→ Search and paginate results.
-
Response body includes:
- Core:
Id,Name,CompanyNumber,Type,Status - Address:
PhysicalAddress { Street, City, State, ZipCode } - Contacts:
Email[],Phone[],Fax - Metadata:
DateCreated,ExternalId - Notes:
[ { Id, Description, NoteType, Time, User } ]
- Core:
-
Backward compatibility: No changes to existing load/trip stop payloads. Stops continue to expose
companyId, but now customers can resolve those IDs via the Locations Controller for more context.
New Endpoints
GET /api/p/v{version}/locationsPOST /api/p/v{version}/locations/search
Why?
Stops in loads and trips previously only included a companyId, making it difficult to identify the company behind each stop. With this release, customers can resolve those IDs into names, addresses, and full details. This improves reporting precision, operational visibility, and overall usability — without breaking existing integrations.What’s New?
We enhanced the Fuel API endpoints with additional fields to provide more complete transaction details:- TransactionDate → Now included in all fuel transactions.
- Quantity → Each transaction includes the purchased quantity with value and unit of measure:
Release Date: August 21, 2025
What’s New?
We added detailed accessorial breakdowns to the/loads and /trips endpoints. Instead of only totals, each accessorial is now returned as its own record, giving you full visibility into charges.- Multi-entity support: Accessorials are now tracked for Customers, Carriers, Drivers, and OwnerOperators.
- EChecks integration: Driver and OwnerOperator accessorials can include linked eCheck numbers and amounts.
- Updated settlement logic:
TotalPayablenow calculates asLinehaul + Accessorials – EChecks.
What Changed?
-
/loads→CustomerAccessorialsDetails[]added. -
/trips→ New detail arrays for:Carrier.AccessorialsDetails[]Driver1.AccessorialsDetails[]for Driver and OwnerOperator.
-
Each accessorial includes:
- Default:
Id,Type,Total { Amount, Currency },Rate { Amount, Currency },RateType,Uom,Quantity - Optional:
IsPaid,ECheckNumber,StopId - Audit:
CreatedAt,UpdatedAt,CreatedBy,UpdatedBy
- Default:
- EChecks are now returned as part of trip data when relevant.
- Cancelled loads/trips → No accessorial details returned.
-
Backward compatibility → Legacy totals remain available (
CustomerAccessorials,Carrier.Accessorials,Linehaul, etc.), so this is a non-breaking change.
Example — Accessorials
Endpoints Affected
GET /api/p/v{version}/loadsPOST /api/p/v{version}/loads/searchGET /api/p/v{version}/tripsPOST /api/p/v{version}/trips/search
Why?
This enhancement provides granular billing data for all parties involved in a load or trip, including customer charges, carrier costs, driver pay, and owner-operator expenses. With eCheck tracking and updatedTotalPayable logic, you can reconcile payments more accurately while maintaining full backward compatibility for existing integrations.AddedLoads
Introducing new response field, LoadType, to distinguish between revenue- and non-revenue loads
Release Date: August 7, 2025What’s New?We’ve added a new response field,
LoadType, to distinguish between revenue- and non-revenue loads.What Changed?LoadTypenow appears on load objects.- Returned values:
"Revenue"or"Non-Revenue"
GET /api/p/{version}/loadsPOST /api/p/{version}/loads/search
Release Date: August 7, 2025What’s New?We’ve added an optional request parameter,
IncludeDeleted, so you can control whether deleted loads and trips appear in API responses.What Changed?- Previously, deleted loads and trips were never returned.
-
You can now include
IncludeDeleted(boolean, optional) in your request body:true→ returns both active and deleted records.- omitted or
false→ returns only active records.
-
When
IncludeDeleted: true, every returned record includes anIsDeletedflag:"IsDeleted": truefor deleted items"IsDeleted": falsefor active items
-
When
IncludeDeletedis omitted orfalse, noIsDeletedflags appear (all records are active by definition).
POST /api/p/{version}/loads/searchPOST /api/p/{version}/trips/search
Release date: June 2025
If you have questions or need help migrating, see the included instructions or contact your support team.
🔐 New Authentication
- Now get access token via
auth.alvys.com/oauth/tokenfor improved security and compliance. - Old authentication method will soon be disabled—update your credentials using the new setup instructions.
🔄 Automated Pagination
- All queries now handle paging automatically.
- Large datasets load completely, with no missing records or manual adjustments.
- A built-in delay mechanism helps prevent hitting API rate limits during refreshes, improving reliability for large data pulls.
↔️ Nested Data Expansion
- Data queries now automatically expand up to 3 levels of nested fields.
- All relevant API data is accessible without extra manual steps.
🗓️ Automatic Field Type Conversion
- Key fields such as dates and numbers are now automatically converted to the correct data types during import (e.g., date columns to datetime, amounts to numbers).
- Ensures correct filtering, calculations, and visualization in your reports without manual adjustments.
📦 Loads Data Improvements
-
Loads are imported through two queries:
- Full Import
- Incremental Updates
- Automatic deduplication ensures only the most recent update for each load is kept.
🧰 Consistent Query Structure
- All endpoints (Loads, Trips, Users, etc.) now use a unified paging and expansion pattern.
- Makes the model easier to understand, troubleshoot, and extend.
📊 New DAX & Reporting Features
- Added several basic DAX formulas (e.g., simple sums, counts, or averages) to help users quickly analyze and familiarize themselves with their data.
- Created a sample weekly summary report table—aggregates core metrics by week, making it easy to spot trends over time.
- These examples are intended as a starting point for your own analysis—feel free to adjust or build on them as needed.
📘 Improved Onboarding
- Step-by-step setup instructions are included to guide you through credential updates and data loading. You can find the link to the latest file and a quick onboarding guide here.
If you have questions or need help migrating, see the included instructions or contact your support team.
Release Date: June 17, 2025What’s New?To improve clarity and eliminate confusion in trip reporting, we’ve updated the behavior of the Trips endpoints when handling split loads.What Changed?When a load is split into sub-trips, the original (parent) trip is no longer returned via the API. Only the active sub-trips are included in the response.If a load has not been split, the original trip is returned as usual.Endpoints Affected:
With this update, only sub-trips are returned when a load is split — allowing customers to calculate totals (like mileage or carrier amounts) by simply summing all trips returned. This change improves accuracy in any report that relies on trip-level data.
GET /api/p/version/tripsPOST /api/p/version/trips/searchWhy?Previously, both the original (parent) trip and its sub-trips were returned via the API. This could lead to duplicated mileage, carrier amounts, and other values in reports unless the parent trip was manually excluded.With this update, only sub-trips are returned when a load is split — allowing customers to calculate totals (like mileage or carrier amounts) by simply summing all trips returned. This change improves accuracy in any report that relies on trip-level data.
❗️ Important Note This change may impact metrics in your current reports — such as total trips, total mileage, total carrier rate, and others — starting today. If your reporting logic includes custom filters or scripts to automatically exclude the original (dispatched) trip when a load is split, those filters may now be obsolete. Since the original trip is no longer returned, continuing to exclude it may result in underreporting. Please review and update any custom reporting logic accordingly to ensure accurate totals going forward.
Release Date: June 13, 2025
What’s New?
We’ve introduced improvements to how API access is authorized to enhance security and give customers more precise control over what data and actions their integrations can access.What Changed?
- A new token endpoint must now be used to generate access tokens:
POST https://auth.alvys.com/oauth/token - Tokens now include permission scopes (e.g.
load:read, trip:create) that define which resources and actions the client is allowed to access - Scope-based access enforcement is enabled for tokens generated via the new endpoint — requests without the proper scope will return 403 Forbidden
- The legacy
{tenant_id}token endpoint is deprecated and will be shut down on July 31, 2025
(tokens from this endpoint do not include scopes and are treated as read-only for now)
How to Request a Token
To request a token, send aPOST request to the new endpoint with this JSON body:Endpoints Affected:
- ✅ New (required):
POST https://auth.alvys.com/oauth/token - 🛑 Later Deprecated:
POST /authentication/{tenant_id}/token(to be removed on July 31, 2025)
❗️ Important:
The legacy POST /authentication/{tenant_id}/token token endpoint will be permanently shut down on July 31, 2025. All integrations using this authentication flow must be updated to use the new token endpoint before this date to avoid disruption.
Release Date: June 3, 2025What’s New?The Carrier object in the Trips endpoints now includes additional payment breakdown fields:
These additional fields provide a more detailed view of carrier payments, helping customers with more accurate reconciliation and reporting. It ensures consistency with the financial data seen in the Alvys UI and improves financial transparency in reporting.
Linehaul— Base transportation cost.Accessorials— Additional charges (e.g., fuel surcharges, detention).TotalPayable— Full amount payable to the carrier.
GET /api/p/v1/tripsPOST /api/p/v1/trips/searchWhy?These additional fields provide a more detailed view of carrier payments, helping customers with more accurate reconciliation and reporting. It ensures consistency with the financial data seen in the Alvys UI and improves financial transparency in reporting.
❗️ Important: The Rate field in the Carrier object will be deprecated in a future release. We recommend updating reports and integrations to use the newLinehaul,Accessorials, andTotalPayablefields. This change will not happen immediately — there will be a transition period, and we will provide advance notice before the field is removed. Please review your current usage and plan updates accordingly to ensure a smooth transition.
Release Date: June 3, 2025What’s New?Two new endpoints have been added to the Public API for Carriers and Subsidiaries:
These new endpoints improve data accessibility and precision, allowing customers to retrieve only the carrier data they need. This enhancement supports better performance, eliminates unnecessary large data pulls, and aligns the Public API with customer operational needs.
GET /api/p/v1/carriers/'{id}' — Retrieve detailed carrier or subsidiary information by ID.POST /api/p/v1/carriers/search — Search carriers or subsidiaries using filters such as Status, MC numbers, DOT numbers, or specific IDs.Why?These new endpoints improve data accessibility and precision, allowing customers to retrieve only the carrier data they need. This enhancement supports better performance, eliminates unnecessary large data pulls, and aligns the Public API with customer operational needs.
Release Date: May 22, 2025What’s Improved?We’ve updated the Driver endpoints in the Public API to include an
isActive field, helping external systems easily determine whether a driver is currently active based on their operational status.Added Field:isActive – Indicates whether the driver is currently active.The value of isActive is:- ✅
truefor active - ❌
falsefor inactive.
Release Date: May 14, 2025We’ve fixed an issue where actual pickup and delivery timestamps were incorrectly showing the values in the Public API.✅ What’s Fixed
ScheduledPickupAt and ScheduledDeliveryAt reflect the planned schedulePickupDate and DeliveryDate displays actual pickup and delivery timestampAffected EndpointsGET /api/p/v{version}/loadsPOST /api/p/v{version}/loads/searchNote: No action is required, your integrations will now return the correct values automatically.What’s New?
Asset maintenance records are now readable through the Public API, enabling fleet maintenance platforms (e.g. FleetRock) and reporting tools to sync maintenance history for trucks and trailers.What Changed?
Previously, maintenance records were only visible inside the Alvys platform.Now, the Public API includes:- Get maintenance record — retrieve a single record by id.
- Search maintenance records — search and paginate records.
Response Body Includes
- Core:
Id,PO,Reference,Description,Comments - Classification:
Category - Asset:
RelatedAsset(the truck or trailer the record belongs to) - Financial:
Amount(value + currency) - Shop:
RepairShopdetails - Scheduling:
Reminders - Audit:
CreatedAt,CreatedBy,ModifiedAt,ModifiedBy
Why?
Maintenance spend and history live at the intersection of operations and accounting. Exposing these records lets maintenance vendors and analytics tools stay in sync with Alvys without manual exports.AddedAuthentication
🔐 Token Endpoint Enhancement – JSON Support Added & Stricter Validation Enforced
Release Date: April 16, 2025What’s New?
The
Supporting JSON-formatted requests improves developer experience by aligning with modern integration standards. It allows clients to choose the format that best fits their architecture and ensures consistency across API calls.
The
/token authentication endpoint now supports requests with Content-Type: application/json, in addition to the existing application/x-www-form-urlencoded support.This change applies to:POST /api/authentication/{tenant_id}/tokenWhy?Supporting JSON-formatted requests improves developer experience by aligning with modern integration standards. It allows clients to choose the format that best fits their architecture and ensures consistency across API calls.
Release Date: March 27, 2025What’s New?
Added the
Exposing the
Added the
ReleasedAt field to the following Public API Trips endpoints:GET /api/p/v{version}/tripsPOST /api/p/v{version}/trips/searchThis field indicates the timestamp when the load was marked as “Released”.Why?Exposing the
ReleasedAt field allows customers to build more customizable and accurate reports. It ensures consistency with internal data and provides better visibility into load release timelines.Release Date: March 25, 2025What’s New?Exposed the
CarrierPaymentOnHold field in the following Public API Trips endpoints:GET /api/p/v1/tripsPOST /api/p/v1/trips/searchThis field indicates whether a carrier’s payment is currently on hold.Why?Previously, API users couldn’t determine if a carrier’s payment was on hold when retrieving trip data, which created a gap in visibility. By exposing the CarrierPaymentOnHold field in the Trips endpoints, users can now programmatically access this critical status to support automation, financial workflows, and operational decisions.Release Date: February 28, 2025What’s New?Added a new endpoint
/api/p/v{version}/dispatchpreferences/search to retrieve dispatch preferences based on filters such as dispatcher, driver, truck, and trailer or dates range.Why?This endpoint was introduced to improve tracking and management of dispatch preferences, enabling more efficient operations.Release Date: February 01, 2025What’s Improved?We’ve updated the Load endpoint to include additional financial breakdowns, making rate calculations more transparent and detailed.Added Fields:
linehaul– Base transportation cost.fuelSurcharge– Fuel cost adjustments.customerAccessorials– Extra charges like detention or lumper fees.
Release Date: February 01, 2025What’s New?We’ve added three new endpoints to the Public API to provide events updates on truck, driver, and trailer, improving tracking and operational visibility.POST /api/p/v{version}/drivers/events/search – Retrieve driver-related event history.POST /api/p/v{version}/trailers/events/search – Fetch events related to trailers.POST /api/p/v{version}/trucks/events/search – Access historical events for trucks.Why?These changes enhance the API’s ability to automate asset event tracking, improve data accuracy, and streamline workflows for better resource management.
Release Date: December 16, 2024What’s New?:
- Increased Limit: The maximum number of loads allowed in the search request body has been increased from 50 to 150.
- Impact: Users can now include more load IDs in a single search request operation.
- Error Handling: Requests exceeding 150 load IDs will return an error message.
Release Date: December 13, 2024What’s New?:
- DispatcherId Field: The
DispatcherIdfield is now included in the response body for all trips endpoints.- Purpose: Provides the unique identifier of the dispatcher assigned to the trip for improved data tracking and integration.
- Benefits: Enhances trip management and reporting by making dispatcher data more accessible through the API.
Release Date: November 11, 2024
What’s New?
-
Visibility Public API Endpoints:
- Introduces endpoints for tracking asset locations and receiving real-time event updates.
-
Endpoints Overview:
-
Inbound Visibility:
- GET
/api/p/v{version}/visibility/inbound/{loadNumber}/history: Retrieve location update history for a specific load number.
- GET
-
Outbound Visibility:
- GET
/api/p/v{version}/visibility/outbound/{loadNumber}/history: Retrieve event update history sent for a specific load number. - POST
/api/p/v{version}/visibility/outbound/errors: Search for and manually resend failed updates using a time range filter.
- GET
-
Inbound Visibility:
Usage
Inbound Visibility Example
Outbound Visibility Examples
Search Failed Updates:
Additional Resources
Important Notes
⚠️ Settings for EDI Integration:- All EDI-related configurations must be done within the platform. Contact the support team if assistance is required.
Release Date: November 08, 2024
What’s New?
-
Update to
customerRate.amountField:- Change: The
customerRate.amountfield now includes the following:CustomerLineHaulFuelSurchargeCustomerAccessorials
- Impact: This ensures alignment with the total customer billable displayed in the UI, improving accuracy for billing and revenue reporting.
- Change: The
-
Purpose:
- Enhances the clarity and precision of customer rate charges.
Usage
- The
customerRate.amountfield now reflects the total customer rate, incorporating: Linehaul, Fuel Surcharge, Accessorials).
Endpoints Impacted
- GET
/api/p/v{version}/loads: View Documentation - POST
/api/p/v{version}/loads/search: View Documentation
Important Note
⚠️ If you relied on the previouscustomerRate.amount value for revenue reporting, please review your integration. This change corrects the calculation to include Customer Accessorials, which were previously excluded.Release Date: November 11, 2024
What’s New?
-
New GET and POST Endpoints Introduced:
-
GET Endpoint:
/api/p/v{version}/customers: Retrieves detailed customer profiles, including contact information and associated data, byidorcompanyNumber.
-
POST Endpoint:
/api/p/v{version}/customers/search: Supports advanced filtered searches for customer records by status, or date range. Includes pagination for optimized data access.
-
GET Endpoint:
Purpose
- Provides flexibility for retrieving and searching customer data.
- Enables streamlined workflows for integration, automation, and reporting.
Additional Resources:
What’s New?
-
New Fields Added to Load Endpoints response body:
customerServiceRepId: Customer Service Representative assigned to the load.customerSalesAgentId: Customer Sales Agent responsible for the load.customerSalesManagerId: Customer Sales Manager assigned to the load.customerLoadPlannerId: Customer Sales Manager assigned to the load.carrierSalesAgentId: Carrier Sales Agent assigned to the load, enabling customers to attribute credit and calculate commissions for securing the carrier.
-
Purpose:
- Enhances transparency in load assignments.
- Streamlines tender management and load tracking processes.
Release Date: October 18, 2024
What’s New?
-
New Fields Added to Load and Trip Endpoints:
UpdatedAt: Timestamp of the last modification.UpdatedBy: User ID responsible for the last update.
-
New Parameters Added to Load and Trip Search body:
UpdatedAtRange: Search by update timestamps usingstartorenddate.UpdatedBy: Search by the user who made updates.
- Conditionally Mandatory Parameters
At least one search parameter from the list of conditionally mandatory parameters must be provided. If no parameter is included, the following error message will be returned:
We’re excited to announce the initial offering of the Alvys Public API! This release marks a new era of integration and customization for our platform.Highlights:
- Public API Launch: Our Public API is now available, providing developers with secure and flexible access to Alvys’ core functionalities.
- Comprehensive Documentation: Extensive guides and resources are available to facilitate smooth integration and implementation.
- Key Features: The API includes endpoints for users, trucks, trailers, drivers, loads and trips, and more, designed to allow for easy extraction of data from Alvys.