<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://docs.motiontools.io/announcements/feed.xml" rel="self" type="application/atom+xml" /><link href="https://docs.motiontools.io/announcements/" rel="alternate" type="text/html" /><updated>2026-04-15T08:56:49+00:00</updated><id>https://docs.motiontools.io/announcements/feed.xml</id><title type="html">MotionTools API Announcements</title><subtitle>This site provides updates about MotionTools API changes and related new features as well as upcoming and past deprecations.</subtitle><entry><title type="html">Configurable labels for the active tour screen</title><link href="https://docs.motiontools.io/announcements/changelog/2026/04/15/active-tour-labels-configuration.html" rel="alternate" type="text/html" title="Configurable labels for the active tour screen" /><published>2026-04-15T00:00:00+00:00</published><updated>2026-04-15T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2026/04/15/active-tour-labels-configuration</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2026/04/15/active-tour-labels-configuration.html"><![CDATA[<p>Following the <a href="/announcements/changelog/2025/08/13/driver-off-route-tour-display.html">configurable off-route tour display</a>
we introduced last year, we are now extending the same configurability to the <strong>active tour screen</strong> — the view
drivers see while they are actively working on a tour. The configuration is available now via the admin API, and
our mobile apps will receive updates in the upcoming weeks to fully utilize these new options.</p>

<p>The new <code class="language-plaintext highlighter-rouge">active_tour_labels</code> and <code class="language-plaintext highlighter-rouge">active_stop_labels</code> configuration options allow you to control which labels
are shown to drivers during an active tour, using the same label types available for the off-route display:</p>

<ul>
  <li>Priority indicators</li>
  <li>Tour name</li>
  <li>Driver earnings</li>
  <li>Total tour distance</li>
  <li>Custom metadata on tours and stops</li>
  <li>Expected arrival time windows on stops</li>
</ul>

<p>The <code class="language-plaintext highlighter-rouge">scheduled_at</code> label and the <code class="language-plaintext highlighter-rouge">distance_to_first_stop</code> distance variant are not available for active tours,
as they are not relevant once a driver is already en-route.</p>

<p>Configuration is available via the existing tour display admin APIs:</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminShowTourDisplay" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/admin/driver_experience/tour_display</span>
      </div>
      <div><span class="name">Show Tour Display Configuration</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminUpdateTourDisplay" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/admin/driver_experience/tour_display</span>
      </div>
      <div><span class="name">Update Tour Display Configuration</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[Following the configurable off-route tour display we introduced last year, we are now extending the same configurability to the active tour screen — the view drivers see while they are actively working on a tour. The configuration is available now via the admin API, and our mobile apps will receive updates in the upcoming weeks to fully utilize these new options.]]></summary></entry><entry><title type="html">Introducing the return stop type</title><link href="https://docs.motiontools.io/announcements/changelog/2026/04/15/return-stop-type.html" rel="alternate" type="text/html" title="Introducing the return stop type" /><published>2026-04-15T00:00:00+00:00</published><updated>2026-04-15T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2026/04/15/return-stop-type</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2026/04/15/return-stop-type.html"><![CDATA[<p>We have introduced <code class="language-plaintext highlighter-rouge">return</code> as a new stop type, enabling return-flow booking patterns where
items are brought back to a designated location after delivery. This extends the existing
stop types (<code class="language-plaintext highlighter-rouge">pickup</code>, <code class="language-plaintext highlighter-rouge">dropoff</code>, <code class="language-plaintext highlighter-rouge">task</code>) with a fourth option that can be used on bookings
and tours.</p>

<h2 id="webhook-events">Webhook events</h2>

<p>The following webhook events now include <code class="language-plaintext highlighter-rouge">stop_type: "return"</code> as a possible value in their
payload. If your integration inspects the <code class="language-plaintext highlighter-rouge">stop_type</code> field, make sure your webhook handlers
accept this new value:</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.stop_arrived" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.stop_arrived</span>
      </div>
      <div><span class="name">Published when the driver arrives at the stop. It's driven by the state of the dispatched stop.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.stop_completed" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.stop_completed</span>
      </div>
      <div><span class="name">Published when the driver completes the stop. It's driven by the state of the dispatched stop.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.stop_failed" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.stop_failed</span>
      </div>
      <div><span class="name">Published when the driver fails the stop. It's driven by the state of the dispatched stop.</span></div>
    </div>
  </a>
</div>

<h2 id="service-configuration">Service configuration</h2>

<p>Services can now be configured with return stop settings through the admin API. When <code class="language-plaintext highlighter-rouge">return</code>
is included in a service’s <code class="language-plaintext highlighter-rouge">stop_types</code> array, the following configuration fields become
available:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">return_stop_duration_seconds</code> — expected duration at the return location (default: 300 seconds)</li>
  <li><code class="language-plaintext highlighter-rouge">return_label_translations</code> — customizable label for the return stop in multiple languages</li>
  <li><code class="language-plaintext highlighter-rouge">return_stop_default_maximum_driver_distance_meters</code> — geofencing distance for the return location</li>
  <li><code class="language-plaintext highlighter-rouge">return_stop_default_auto_arrival_distance_meters</code> — distance for automatic arrival marking</li>
</ul>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminHailingServices" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/admin/hailing/services</span>
      </div>
      <div><span class="name">List Services</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminShowHailingService" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/admin/hailing/services/{id}</span>
      </div>
      <div><span class="name">Show a service</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminCreateHailingService" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/admin/hailing/services</span>
      </div>
      <div><span class="name">Create a service</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminUpdateHailingService" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/admin/hailing/services/{id}</span>
      </div>
      <div><span class="name">Update a service</span></div>
    </div>
  </a>
</div>

<h2 id="creating-and-managing-return-stops">Creating and managing return stops</h2>

<p>Return stops can be included when creating bookings or inserted into existing tours and bookings.
The stop type on existing stops can also be changed to or from <code class="language-plaintext highlighter-rouge">return</code> via the update stop
properties endpoint.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/CreateHailingBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/bookings</span>
      </div>
      <div><span class="name">Create a Booking</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/InsertCustomStopIntoExistingBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/bookings/{booking_id}/stops</span>
      </div>
      <div><span class="name">Insert custom stop into existing booking</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/InsertCustomStopIntoExistingTour" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/tours/{tour_id}/stops</span>
      </div>
      <div><span class="name">Insert custom stop into existing tour</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdateStopProperties" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/stops/{stop_id}/properties</span>
      </div>
      <div><span class="name">Update Stop Properties</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>The public service listing also reflects whether <code class="language-plaintext highlighter-rouge">return</code> is enabled as a stop type:</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/HailingServices" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/hailing/services</span>
      </div>
      <div><span class="name">Services configuration</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced return as a new stop type, enabling return-flow booking patterns where items are brought back to a designated location after delivery. This extends the existing stop types (pickup, dropoff, task) with a fourth option that can be used on bookings and tours.]]></summary></entry><entry><title type="html">Simplifying service selection with service_key</title><link href="https://docs.motiontools.io/announcements/changelog/2026/04/09/service-key-as-alternative-to-service-id.html" rel="alternate" type="text/html" title="Simplifying service selection with service_key" /><published>2026-04-09T00:00:00+00:00</published><updated>2026-04-09T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2026/04/09/service-key-as-alternative-to-service-id</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2026/04/09/service-key-as-alternative-to-service-id.html"><![CDATA[<p>All booking and tour creation endpoints now accept an optional <code class="language-plaintext highlighter-rouge">service_key</code> parameter as a
more stable, human-readable alternative to <code class="language-plaintext highlighter-rouge">service_id</code> for selecting a hailing service.</p>

<p>Unlike UUIDs, service keys are immutable, descriptive identifiers (e.g., <code class="language-plaintext highlighter-rouge">default</code>, <code class="language-plaintext highlighter-rouge">express</code>)
that stay stable across different tenants and between test and production environments —
no need to look up the exact UUID for a specific service on each tenant. We recommend
using <code class="language-plaintext highlighter-rouge">service_key</code> for new integrations where possible.</p>

<p>The <code class="language-plaintext highlighter-rouge">service</code> object in booking responses now includes a <code class="language-plaintext highlighter-rouge">key</code> field alongside the existing <code class="language-plaintext highlighter-rouge">id</code>,
and you can discover all available service keys via the Services configuration endpoint.</p>

<p><strong>Important:</strong> <code class="language-plaintext highlighter-rouge">service_id</code> and <code class="language-plaintext highlighter-rouge">service_key</code> cannot be combined in the same request. If both
are provided, a validation error will be returned. When neither is given, the tenant’s default
service is used — this behavior is unchanged.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/CreateHailingBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/bookings</span>
      </div>
      <div><span class="name">Create a Booking</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/HailingPriceQuery" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/hailing/price</span>
      </div>
      <div><span class="name">Price Query</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/HailingConfig" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/hailing/config</span>
      </div>
      <div><span class="name">Bookings configuration</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/CreateEmptyTour" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/tours</span>
      </div>
      <div><span class="name">Create Empty Tour</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/DispatchStopsIntoTour" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/bookings/merge</span>
      </div>
      <div><span class="name">Dispatch stops into a tour</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/CreatePackagePickupTour" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/package_tours/pickup</span>
      </div>
      <div><span class="name">Create package pickup tour</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/CreatePackageDropoffTour" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/package_tours/dropoff</span>
      </div>
      <div><span class="name">Create package dropoff tour</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/PackageDropoffToursAutoPlan" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/package_tours/dropoff/automatic_plan</span>
      </div>
      <div><span class="name">Automatically plan package dropoff tours</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ShowHailingBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/hailing/bookings/{id}</span>
      </div>
      <div><span class="name">Show Booking</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/HailingServices" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/hailing/services</span>
      </div>
      <div><span class="name">Services configuration</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[All booking and tour creation endpoints now accept an optional service_key parameter as a more stable, human-readable alternative to service_id for selecting a hailing service.]]></summary></entry><entry><title type="html">Aligning fields and codes terminology for bookings and tours</title><link href="https://docs.motiontools.io/announcements/changelog/2026/03/11/aligning-fields-and-codes-terminology-for-bookings-and-tours.html" rel="alternate" type="text/html" title="Aligning fields and codes terminology for bookings and tours" /><published>2026-03-11T00:00:00+00:00</published><updated>2026-03-11T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2026/03/11/aligning-fields-and-codes-terminology-for-bookings-and-tours</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2026/03/11/aligning-fields-and-codes-terminology-for-bookings-and-tours.html"><![CDATA[<p>As part of the ongoing transition from booking to tour terminology, the following changes have been made:</p>

<p><strong>New <code class="language-plaintext highlighter-rouge">active_tour_id</code> field</strong></p>

<p>A new <code class="language-plaintext highlighter-rouge">active_tour_id</code> field is now available on the Users endpoint when the returned user is a driver. It’s a nullable field representing the driver’s current active tour and it’s a replacement for the <code class="language-plaintext highlighter-rouge">active_hailing_booking_ids</code> array field, which is now deprecated.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ListUsers" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/users</span>
      </div>
      <div><span class="name">List Users</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ShowUser" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/users/{id}</span>
      </div>
      <div><span class="name">Show a user</span></div>
    </div>
  </a>
</div>

<hr />

<p><strong>⚠️ Breaking Change - Failure code renames ⚠️</strong></p>

<p>The following failure codes have been renamed:</p>

<ul>
  <li>The <code class="language-plaintext highlighter-rouge">active_driver_on_a_booking</code> failure code returned by the Block User endpoint has been renamed to <code class="language-plaintext highlighter-rouge">active_driver_on_a_tour</code>.</li>
  <li>The <code class="language-plaintext highlighter-rouge">on_active_booking</code> failure code returned by Send Driver Offline endpoint has been renamed to <code class="language-plaintext highlighter-rouge">on_active_tour</code>.</li>
</ul>

<p>If your integration handles these specific failure codes, please update accordingly.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/BlockUser" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/users/{id}/block</span>
      </div>
      <div><span class="name">Block user</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/SendDriverOffline" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">delete</span>
        <span class="path">/api/users/{id}/online_status</span>
      </div>
      <div><span class="name">Send Driver offline</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[As part of the ongoing transition from booking to tour terminology, the following changes have been made:]]></summary></entry><entry><title type="html">New verification content type for stops</title><link href="https://docs.motiontools.io/announcements/changelog/2026/03/11/verification-stop-content.html" rel="alternate" type="text/html" title="New verification content type for stops" /><published>2026-03-11T00:00:00+00:00</published><updated>2026-03-11T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2026/03/11/verification-stop-content</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2026/03/11/verification-stop-content.html"><![CDATA[<p>We have introduced a new <code class="language-plaintext highlighter-rouge">verification</code> content type for stops that enables client-side
verification workflows, such as verifying a recipient’s date of birth or entering a PIN code.</p>

<p>The verification value is provided as an <a href="https://datatracker.ietf.org/doc/html/rfc9106">argon2id</a>
hash. The backend only validates that the value is a structurally valid argon2id hash — it never
sees the plaintext. The driver app collects input from the recipient and verifies it locally
against the hash.</p>

<p><strong>Important:</strong> While hashing obscures the plain text, it does <strong>not</strong> keep the value secret.
Values with small problem spaces — such as birth dates (~37,000 possible values in the last
100 years) or short numeric PIN codes — can still be brute-forced. Argon2id makes this
computationally harder, but these values should not be considered secret.</p>

<p>The choice of argon2id parameters is up to the requestor. The
<a href="https://www.rfc-editor.org/rfc/rfc9106.html#section-4-6.1">RFC 9106 “first recommended” configuration</a>
is a good starting point.</p>

<p>When using the <code class="language-plaintext highlighter-rouge">date</code> value type, the date must be formatted as <code class="language-plaintext highlighter-rouge">YYYY-MM-DD</code>
(<a href="https://en.wikipedia.org/wiki/ISO_8601">ISO 8601</a> calendar date) before hashing with argon2id.</p>

<p>This new content type can be used when creating or updating stops:</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/CreateHailingBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/bookings</span>
      </div>
      <div><span class="name">Create a Booking</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/InsertCustomStopIntoExistingBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/bookings/{booking_id}/stops</span>
      </div>
      <div><span class="name">Insert custom stop into existing booking</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/InsertCustomStopIntoExistingTour" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/tours/{tour_id}/stops</span>
      </div>
      <div><span class="name">Insert custom stop into existing tour</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdateHailingStopContent" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/stops/{stop_id}/content</span>
      </div>
      <div><span class="name">Update Custom Content</span></div>
    </div>
  </a>
</div>

<p><strong>Data retention:</strong> Once a booking or tour is operationally completed (reaches <code class="language-plaintext highlighter-rouge">done</code>, <code class="language-plaintext highlighter-rouge">paid</code>,
or <code class="language-plaintext highlighter-rouge">cancelled</code> state), all verification content values are automatically anonymized. The
<code class="language-plaintext highlighter-rouge">value</code> field is replaced with a random argon2id hash. The content item itself is preserved as
a record that verification was requested.</p>

<h2 id="instruction-templates-with-variables">Instruction templates with variables</h2>

<p><a href="/announcements/changelog/2025/09/10/stop-instructions.html">Stop instructions</a> provide a convenient way to add
common tasks at stops without having to provide the full custom content schema payload. You can see
available instruction templates via the dedicated endpoint:</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ListAvailableInstructions" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/stops/available_instructions</span>
      </div>
      <div><span class="name">List available stop instructions</span></div>
    </div>
  </a>
</div>

<p>Two new instruction templates are now available that use verification content with dynamic variables:</p>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">birthday_verification</code></strong> — requires a <code class="language-plaintext highlighter-rouge">birthdate_argon2id</code> variable (the recipient’s date of birth, hashed with argon2id)</li>
  <li><strong><code class="language-plaintext highlighter-rouge">pin_code_verification</code></strong> — requires a <code class="language-plaintext highlighter-rouge">code_argon2id</code> variable (a delivery PIN code, hashed with argon2id)</li>
</ul>

<p>Instructions can now be passed as objects with a <code class="language-plaintext highlighter-rouge">key</code> and <code class="language-plaintext highlighter-rouge">variables</code> field, in addition to the existing
plain string format. Existing plain-string instructions continue to work unchanged.</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"instructions"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w"> </span><span class="nl">"key"</span><span class="p">:</span><span class="w"> </span><span class="s2">"birthday_verification"</span><span class="p">,</span><span class="w"> </span><span class="nl">"variables"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"birthdate_argon2id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"$argon2id$..."</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>Each template’s required variables and their schemas can be introspected via the <code class="language-plaintext highlighter-rouge">variables_schema</code> field
on the list available instructions endpoint shown above.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced a new verification content type for stops that enables client-side verification workflows, such as verifying a recipient’s date of birth or entering a PIN code.]]></summary></entry><entry><title type="html">Deprecation of active_hailing_booking_ids user field</title><link href="https://docs.motiontools.io/announcements/deprecations/2026/03/11/deprecation-of-active-hailing-booking-ids.html" rel="alternate" type="text/html" title="Deprecation of active_hailing_booking_ids user field" /><published>2026-03-11T00:00:00+00:00</published><updated>2026-03-11T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/deprecations/2026/03/11/deprecation-of-active-hailing-booking-ids</id><content type="html" xml:base="https://docs.motiontools.io/announcements/deprecations/2026/03/11/deprecation-of-active-hailing-booking-ids.html"><![CDATA[<p>The <code class="language-plaintext highlighter-rouge">active_hailing_booking_ids</code> field on the User resource is now deprecated and will be removed in a future release. This only affects List Users and Show User endpoints.</p>

<p>As part of the ongoing transition from booking to tour terminology, this field has been replaced by <code class="language-plaintext highlighter-rouge">active_tour_id</code>, which returns the ID of the driver’s currently active tour as a single value (or null when idle).</p>

<p><strong>Changes:</strong></p>
<ul>
  <li>A new <code class="language-plaintext highlighter-rouge">active_tour_id</code> field is now available on the User resource when the resource is a driver</li>
  <li>The existing <code class="language-plaintext highlighter-rouge">active_hailing_booking_ids</code> array field continues to work but is deprecated</li>
  <li><code class="language-plaintext highlighter-rouge">active_tour_id</code> returns a single UUID or null, replacing the array which only ever contained zero or one element</li>
</ul>

<p><strong>Migration:</strong>
Replace usage of <code class="language-plaintext highlighter-rouge">active_hailing_booking_ids</code> with <code class="language-plaintext highlighter-rouge">active_tour_id</code>:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Before (active_hailing_booking_ids — array, always 0 or 1 elements)</span>
<span class="p">{</span> <span class="dl">"</span><span class="s2">active_hailing_booking_ids</span><span class="dl">"</span><span class="p">:</span> <span class="p">[</span><span class="dl">"</span><span class="s2">550e8400-e29b-41d4-a716-446655440000</span><span class="dl">"</span><span class="p">]</span> <span class="p">}</span>

<span class="c1">// After (active_tour_id — single value or null)</span>
<span class="p">{</span> <span class="dl">"</span><span class="s2">active_tour_id</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">550e8400-e29b-41d4-a716-446655440000</span><span class="dl">"</span> <span class="p">}</span>
</code></pre></div></div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ListUsers" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/users</span>
      </div>
      <div><span class="name">List Users</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ShowUser" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/users/{id}</span>
      </div>
      <div><span class="name">Show a user</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Deprecations" /><summary type="html"><![CDATA[The active_hailing_booking_ids field on the User resource is now deprecated and will be removed in a future release. This only affects List Users and Show User endpoints.]]></summary></entry><entry><title type="html">Deprecation of on_active_hailing_booking users filter</title><link href="https://docs.motiontools.io/announcements/deprecations/2026/02/24/deprecation-of-on-active-hailing-booking-filter.html" rel="alternate" type="text/html" title="Deprecation of on_active_hailing_booking users filter" /><published>2026-02-24T00:00:00+00:00</published><updated>2026-02-24T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/deprecations/2026/02/24/deprecation-of-on-active-hailing-booking-filter</id><content type="html" xml:base="https://docs.motiontools.io/announcements/deprecations/2026/02/24/deprecation-of-on-active-hailing-booking-filter.html"><![CDATA[<p>The <code class="language-plaintext highlighter-rouge">on_active_hailing_booking</code> filter parameter on the List Users endpoint is now deprecated and will be removed in a future release.</p>

<p>As part of the ongoing split between bookings and tours as distinct concepts, this filter has been replaced by <code class="language-plaintext highlighter-rouge">on_active_tour</code>, which provides the same functionality with naming that better reflects the underlying domain model.</p>

<p><strong>Changes:</strong></p>
<ul>
  <li>A new <code class="language-plaintext highlighter-rouge">on_active_tour</code> boolean filter is now available on the List Users endpoint</li>
  <li>The existing <code class="language-plaintext highlighter-rouge">on_active_hailing_booking</code> filter continues to work but is deprecated</li>
  <li>Both filters behave identically — filtering drivers by whether they currently have an active tour</li>
</ul>

<p><strong>Migration:</strong>
Replace <code class="language-plaintext highlighter-rouge">on_active_hailing_booking</code> with <code class="language-plaintext highlighter-rouge">on_active_tour</code> in your API calls:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Before
GET /api/users?filters[on_active_hailing_booking]=true

# After
GET /api/users?filters[on_active_tour]=true
</code></pre></div></div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ListUsers" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/users</span>
      </div>
      <div><span class="name">List Users</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Deprecations" /><summary type="html"><![CDATA[The on_active_hailing_booking filter parameter on the List Users endpoint is now deprecated and will be removed in a future release.]]></summary></entry><entry><title type="html">Organization managers can now specify target organization for invitations</title><link href="https://docs.motiontools.io/announcements/changelog/2026/02/12/org-manager-organization-selection.html" rel="alternate" type="text/html" title="Organization managers can now specify target organization for invitations" /><published>2026-02-12T00:00:00+00:00</published><updated>2026-02-12T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2026/02/12/org-manager-organization-selection</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2026/02/12/org-manager-organization-selection.html"><![CDATA[<p>Organization managers with multiple managed organizations can now specify which organization to invite drivers to by providing the <code class="language-plaintext highlighter-rouge">organization_id</code> parameter in the invitation request.</p>

<p>Previously, invited users were always assigned to the organization manager’s first managed organization. Now, organization managers can choose the target organization from their managed organizations list.</p>

<p>If no <code class="language-plaintext highlighter-rouge">organization_id</code> is provided, the behavior remains unchanged—the invited user defaults to the organization manager’s first managed organization.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/InviteUsers" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/users/invite</span>
      </div>
      <div><span class="name">Invite users</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[Organization managers with multiple managed organizations can now specify which organization to invite drivers to by providing the organization_id parameter in the invitation request.]]></summary></entry><entry><title type="html">booking.in_progress now fires when dispatching into en route tours</title><link href="https://docs.motiontools.io/announcements/changelog/2026/02/04/booking-in-progress-for-mid-tour-dispatch.html" rel="alternate" type="text/html" title="booking.in_progress now fires when dispatching into en route tours" /><published>2026-02-04T00:00:00+00:00</published><updated>2026-02-04T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2026/02/04/booking-in-progress-for-mid-tour-dispatch</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2026/02/04/booking-in-progress-for-mid-tour-dispatch.html"><![CDATA[<p>We have enhanced the <code class="language-plaintext highlighter-rouge">booking.in_progress</code> webhook to fire not only when a tour
initially transitions to <code class="language-plaintext highlighter-rouge">en_route</code>, but also when bookings are dispatched into
a tour that is already in progress via the DispatchStopsIntoExistingTour
endpoint.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/DispatchStopsIntoExistingTour" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/tours/{tour_id}/stops/insert</span>
      </div>
      <div><span class="name">Dispatch or move stops into existing tour</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.in_progress" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.in_progress</span>
      </div>
      <div><span class="name">Published when a tour that the booking's stops are dispatched to is started. Beware that in rare cases, the driver_location may be unavailable and therefore null.</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>This ensures that integrations relying on this webhook receive consistent
notifications for all bookings, regardless of whether they were part of the
tour from the start or were added mid-route.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have enhanced the booking.in_progress webhook to fire not only when a tour initially transitions to en_route, but also when bookings are dispatched into a tour that is already in progress via the DispatchStopsIntoExistingTour endpoint.]]></summary></entry><entry><title type="html">Deprecation of gradual_rollout_frequency_seconds</title><link href="https://docs.motiontools.io/announcements/deprecations/2026/01/28/deprecation-of-gradual-rollout-frequency-seconds.html" rel="alternate" type="text/html" title="Deprecation of gradual_rollout_frequency_seconds" /><published>2026-01-28T00:00:00+00:00</published><updated>2026-01-28T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/deprecations/2026/01/28/deprecation-of-gradual-rollout-frequency-seconds</id><content type="html" xml:base="https://docs.motiontools.io/announcements/deprecations/2026/01/28/deprecation-of-gradual-rollout-frequency-seconds.html"><![CDATA[<p>The <code class="language-plaintext highlighter-rouge">gradual_rollout_frequency_seconds</code> field on scheduling configs is now deprecated and will be removed in a future release.</p>

<p>This field was previously used to configure the frequency at which the next driver would be looked up for marking as preferred during gradual rollout. With the removal of the <code class="language-plaintext highlighter-rouge">per_tour</code> gradual rollout mode, this configuration is no longer used - the frequency is now controlled by an environment variable.</p>

<p><strong>Changes:</strong></p>
<ul>
  <li>The field now always returns <code class="language-plaintext highlighter-rouge">null</code> regardless of the stored value</li>
  <li>Providing this field in create/update requests is still accepted but has no effect</li>
</ul>

<p><strong>Migration:</strong>
No action is required. The field will continue to be returned in API responses (with the value <code class="language-plaintext highlighter-rouge">null</code>) until it is removed.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ShowSchedulingConfig" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/admin/hailing/scheduling_configs/{id}</span>
      </div>
      <div><span class="name">Show a scheduling config</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdateSchedulingConfig" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/admin/hailing/scheduling_configs/{id}</span>
      </div>
      <div><span class="name">Update a scheduling config</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Deprecations" /><summary type="html"><![CDATA[The gradual_rollout_frequency_seconds field on scheduling configs is now deprecated and will be removed in a future release.]]></summary></entry><entry><title type="html">Updated error response for User Invites endpoint</title><link href="https://docs.motiontools.io/announcements/changelog/2026/01/14/user-invites-update-error-response.html" rel="alternate" type="text/html" title="Updated error response for User Invites endpoint" /><published>2026-01-14T00:00:00+00:00</published><updated>2026-01-14T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2026/01/14/user-invites-update-error-response</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2026/01/14/user-invites-update-error-response.html"><![CDATA[<p>An adjustment has been made to the User Invites endpoint’s validation error response: when an invitation that specifies
components for the SSO setup (<code class="language-plaintext highlighter-rouge">external_id</code> and <code class="language-plaintext highlighter-rouge">auth_provider_key</code>) fails, the returned error messages for the index
for which they failed won’t be wrapped in the array anymore:</p>

<ul>
  <li>Old response: <code class="language-plaintext highlighter-rouge">collection_errors: { "2": [{ external_id: ["has already been taken"] }] }</code></li>
  <li>New response: <code class="language-plaintext highlighter-rouge">collection_errors: { "2": { external_id: ["has already been taken"] } }</code></li>
</ul>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/InviteUsers" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/users/invite</span>
      </div>
      <div><span class="name">Invite users</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[An adjustment has been made to the User Invites endpoint’s validation error response: when an invitation that specifies components for the SSO setup (external_id and auth_provider_key) fails, the returned error messages for the index for which they failed won’t be wrapped in the array anymore:]]></summary></entry><entry><title type="html">Dedicated preferred drivers endpoints</title><link href="https://docs.motiontools.io/announcements/changelog/2025/11/19/dedicated-preferred-drivers-endpoints.html" rel="alternate" type="text/html" title="Dedicated preferred drivers endpoints" /><published>2025-11-19T00:00:00+00:00</published><updated>2025-11-19T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/11/19/dedicated-preferred-drivers-endpoints</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/11/19/dedicated-preferred-drivers-endpoints.html"><![CDATA[<p>In an effort to further minimize the <code class="language-plaintext highlighter-rouge">minimal</code> tour/booking view, we have introduced dedicated endpoints for fetching
preferred drivers and related flags for tours/bookings.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/TourPreferredDrivers" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/tours/{id}/preferred_drivers</span>
      </div>
      <div><span class="name">Get preferred drivers info</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/BookingPreferredDrivers" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/bookings/{id}/preferred_drivers</span>
      </div>
      <div><span class="name">Get preferred drivers info</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>To keep things consistent, we’ve moved the endpoint for setting preferred drivers to be in the <code class="language-plaintext highlighter-rouge">tours</code> and <code class="language-plaintext highlighter-rouge">bookings</code>
namespace, deprecating the existing endpoint that is under the <code class="language-plaintext highlighter-rouge">hailing_bookings</code> namespace.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/TourAddPreferredDrivers" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/tours/{id}/preferred_drivers</span>
      </div>
      <div><span class="name">Set preferred drivers</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/BookingAddPreferredDrivers" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/bookings/{id}/preferred_drivers</span>
      </div>
      <div><span class="name">Set preferred drivers</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[In an effort to further minimize the minimal tour/booking view, we have introduced dedicated endpoints for fetching preferred drivers and related flags for tours/bookings.]]></summary></entry><entry><title type="html">Removal of hailing_booking/preferred_drivers endpoint</title><link href="https://docs.motiontools.io/announcements/deprecations/2025/11/19/removal-of-hailing-bookings-preferred-drivers-endpoint.html" rel="alternate" type="text/html" title="Removal of hailing_booking/preferred_drivers endpoint" /><published>2025-11-19T00:00:00+00:00</published><updated>2025-11-19T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/deprecations/2025/11/19/removal-of-hailing-bookings-preferred-drivers-endpoint</id><content type="html" xml:base="https://docs.motiontools.io/announcements/deprecations/2025/11/19/removal-of-hailing-bookings-preferred-drivers-endpoint.html"><![CDATA[<p>To align the existing endpoints with our new naming conventions,
we are removing the <code class="language-plaintext highlighter-rouge">/api/hailing_bookings/:id/preferred_drivers</code> endpoint.</p>

<p>Instead, you should switch to the dedicated endpoint for tours or bookings.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/TourAddPreferredDrivers" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/tours/{id}/preferred_drivers</span>
      </div>
      <div><span class="name">Set preferred drivers</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/BookingAddPreferredDrivers" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/bookings/{id}/preferred_drivers</span>
      </div>
      <div><span class="name">Set preferred drivers</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Deprecations" /><summary type="html"><![CDATA[To align the existing endpoints with our new naming conventions, we are removing the /api/hailing_bookings/:id/preferred_drivers endpoint.]]></summary></entry><entry><title type="html">Simplified organization manager booking &amp;amp; tour visibility rules</title><link href="https://docs.motiontools.io/announcements/changelog/2025/11/12/org-managers-visibility-scope-changed.html" rel="alternate" type="text/html" title="Simplified organization manager booking &amp;amp; tour visibility rules" /><published>2025-11-12T00:00:00+00:00</published><updated>2025-11-12T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/11/12/org-managers-visibility-scope-changed</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/11/12/org-managers-visibility-scope-changed.html"><![CDATA[<p>We have simplified the rules regarding visibility of bookings and tours
for the <code class="language-plaintext highlighter-rouge">org_manager</code> role and completely base it off the managing organizations
that are set on the bookings/tours from now on.</p>

<p>Before, this was a combination of preferred drivers on a tour, managing organizations
and a driver from an organization having accepted a tour. This was a bit hard to see through
in different operational scenarios and hence was leading to confusion, which we intend
to address by having just one, simple and transparent rule for the visibility going forward.</p>

<p>This means that if you want to show a booking or a tour to a certain organization,
you will have to set that organization as one of the managing organization.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/HailingBookingUpdateManagingOrganizations" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/hailing/bookings/{booking_id}/managing_organizations</span>
      </div>
      <div><span class="name">Update managing organizations</span></div>
    </div>
  </a>
</div>

<p>Previously, we would base the visibility rule also off the pending driver requests,
as well as off the current tour’s driver’s organization.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have simplified the rules regarding visibility of bookings and tours for the org_manager role and completely base it off the managing organizations that are set on the bookings/tours from now on.]]></summary></entry><entry><title type="html">Easier integration of Places with external systems</title><link href="https://docs.motiontools.io/announcements/changelog/2025/10/29/easier-place-integration-with-external-systems.html" rel="alternate" type="text/html" title="Easier integration of Places with external systems" /><published>2025-10-29T00:00:00+00:00</published><updated>2025-10-29T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/10/29/easier-place-integration-with-external-systems</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/10/29/easier-place-integration-with-external-systems.html"><![CDATA[<p>We have introduced an optional <code class="language-plaintext highlighter-rouge">external_id</code> attribute on places.
This gives you additional capabilities in synchronizing another, 
leading system with the booking and places data in MotionTools.</p>

<p>When creating a place, you can now pass an optional <code class="language-plaintext highlighter-rouge">external_id</code> 
string. You would normally set this to the ID of that location in 
your source system.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/CreatePlace" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/places</span>
      </div>
      <div><span class="name">Create a new place</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>In contrast to other, location-specific attributes that require to 
fork a place instead of updating in place to avoid impacting 
historical transactional data, you can update the <code class="language-plaintext highlighter-rouge">external_id</code> in 
place (and also via Fork)</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdatePlace" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/places/{id}</span>
      </div>
      <div><span class="name">Update a place</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ForkPlace" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/places/{id}/fork</span>
      </div>
      <div><span class="name">Fork a place</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>The <code class="language-plaintext highlighter-rouge">external_id</code> becomes indexed by our search index so you can
search by it, and you can also use it as a filter on the list 
endpoint.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ListPlaces" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/places</span>
      </div>
      <div><span class="name">List all places</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>This functionality becomes particularily useful if you combine it
with the <strong>newly extended corresponding <code class="language-plaintext highlighter-rouge">external_id</code> functionality 
when creating bookings</strong>.</p>

<p>When you <strong>create a booking</strong>, you can pass an <code class="language-plaintext highlighter-rouge">external_id</code> 
alongside each stop’s attributes. When given, we will <strong>look up the 
most recently created, non-archived place that belongs to the same 
customer and assign that to the stop</strong>.</p>

<p>When such a place <strong>does not yet exist</strong>, we will <strong>automatically 
create it instead</strong> using the address data given, and on the next 
booking creation it will be re-used as described above.</p>

<p>Please note that we <strong>do not update a previously created, matching
place</strong>. If you want to update the location address data of a place,
in our system that is handled as a new place via the fork mechanism,
to keep historical transactional records correct.</p>

<p>You have <strong>three options if you want to ensure changed location data
get propagated into a place</strong>:</p>

<ul>
  <li>Change the <code class="language-plaintext highlighter-rouge">external_id</code> on your side based on the new location</li>
  <li>Remove the <code class="language-plaintext highlighter-rouge">external_id</code> on existing places with old location data</li>
  <li>Archive existing places with the same <code class="language-plaintext highlighter-rouge">external_id</code></li>
</ul>

<p><strong>Any of these will trigger a new place to be created on the next
booking creation event</strong> based on the location data given on the 
stop at the time. You can also omit latitude &amp; longitude if you want
to utilize our Geocoding features when you do not have GPS 
coordinates for your location in your system.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/CreateHailingBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/bookings</span>
      </div>
      <div><span class="name">Create a Booking</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>The same functionality is also available on the endpoints for
adding individual stops into existing bookings and tours:</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/InsertCustomStopIntoExistingBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/bookings/{booking_id}/stops</span>
      </div>
      <div><span class="name">Insert custom stop into existing booking</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/InsertCustomStopIntoExistingTour" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/tours/{tour_id}/stops</span>
      </div>
      <div><span class="name">Insert custom stop into existing tour</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced an optional external_id attribute on places. This gives you additional capabilities in synchronizing another, leading system with the booking and places data in MotionTools.]]></summary></entry><entry><title type="html">New booking lifecycle webhooks</title><link href="https://docs.motiontools.io/announcements/changelog/2025/10/29/new-booking-lifecycle-webhooks.html" rel="alternate" type="text/html" title="New booking lifecycle webhooks" /><published>2025-10-29T00:00:00+00:00</published><updated>2025-10-29T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/10/29/new-booking-lifecycle-webhooks</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/10/29/new-booking-lifecycle-webhooks.html"><![CDATA[<p>We have introduced new booking lifecycle webhooks to gain more transparency into their execution via the tours.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.in_progress" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.in_progress</span>
      </div>
      <div><span class="name">Published when a tour that the booking's stops are dispatched to is started. Beware that in rare cases, the driver_location may be unavailable and therefore null.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.driver_location_updated" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.driver_location_updated</span>
      </div>
      <div><span class="name">Published when the location of the tour's driver, that the booking's stops are dispatched to, is updated.
Requires a `customer_id` filter on the webhook subscription — webhooks without this filter will not
receive any events.</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>Together with the new booking lifecycle events, we’ve added new booking’s stop lifecycle event webhooks.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.stop_arrived" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.stop_arrived</span>
      </div>
      <div><span class="name">Published when the driver arrives at the stop. It's driven by the state of the dispatched stop.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.stop_completed" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.stop_completed</span>
      </div>
      <div><span class="name">Published when the driver completes the stop. It's driven by the state of the dispatched stop.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.stop_failed" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.stop_failed</span>
      </div>
      <div><span class="name">Published when the driver fails the stop. It's driven by the state of the dispatched stop.</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>Additionally, we’ve enriched the existing <code class="language-plaintext highlighter-rouge">booking.etas_recalculated</code> webhook with the customer ID property, as well
as the ETA info regarding the next 10 unfinished stops.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.etas_recalculated" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.etas_recalculated</span>
      </div>
      <div><span class="name">Published when the ETAs for the booking's stops have been recalculated.</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>The publication of these webhooks is based off on the lifecycle of the underlying tour(s) and their stops
used to complete the booking.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced new booking lifecycle webhooks to gain more transparency into their execution via the tours.]]></summary></entry><entry><title type="html">Booking and tour notifications now contain the service_area_id</title><link href="https://docs.motiontools.io/announcements/changelog/2025/10/29/service_area_id-in-booking-and-tour-notifications.html" rel="alternate" type="text/html" title="Booking and tour notifications now contain the service_area_id" /><published>2025-10-29T00:00:00+00:00</published><updated>2025-10-29T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/10/29/service_area_id-in-booking-and-tour-notifications</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/10/29/service_area_id-in-booking-and-tour-notifications.html"><![CDATA[<p>We have extended our existing booking and tour webhook 
notifications to always include the related <code class="language-plaintext highlighter-rouge">service_area_id</code> as 
well.</p>

<p>This can also be used with our webhook filtering feature to
narrow down certain notifications to specific service areas, for 
example if you want to roll out an integration only gradually
across certain service areas.</p>

<p>The updated messages are the following:</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.driver_location_updated" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.driver_location_updated</span>
      </div>
      <div><span class="name">Published when the location of the tour's driver, that the booking's stops are dispatched to, is updated.
Requires a `customer_id` filter on the webhook subscription — webhooks without this filter will not
receive any events.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.etas_recalculated" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.etas_recalculated</span>
      </div>
      <div><span class="name">Published when the ETAs for the booking's stops have been recalculated.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.in_progress" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.in_progress</span>
      </div>
      <div><span class="name">Published when a tour that the booking's stops are dispatched to is started. Beware that in rare cases, the driver_location may be unavailable and therefore null.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.modified" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.modified</span>
      </div>
      <div><span class="name">Published when some part of booking is modified, e.g. when stops are changed.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.route_changed" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.route_changed</span>
      </div>
      <div><span class="name">Published when the route of a booking has changed, i.e. by adding or removing stops, changing
their locations, changing their order and so on.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.stop_arrived" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.stop_arrived</span>
      </div>
      <div><span class="name">Published when the driver arrives at the stop. It's driven by the state of the dispatched stop.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.stop_completed" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.stop_completed</span>
      </div>
      <div><span class="name">Published when the driver completes the stop. It's driven by the state of the dispatched stop.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.stop_failed" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.stop_failed</span>
      </div>
      <div><span class="name">Published when the driver fails the stop. It's driven by the state of the dispatched stop.</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.active_status_changed" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.active_status_changed</span>
      </div>
      <div><span class="name">Notifies drivers about change of active status of a tour.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.earnings_updated" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.earnings_updated</span>
      </div>
      <div><span class="name">Published when the tour's earnings are updated.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.etas_recalculated" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.etas_recalculated</span>
      </div>
      <div><span class="name">Published when the ETAs for the tour's stops have been recalculated.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.force_assigned" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.force_assigned</span>
      </div>
      <div><span class="name">Notifies about a tour being forcefully assigned to a driver.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.force_unassigned" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.force_unassigned</span>
      </div>
      <div><span class="name">Notifies about tour being forcefully un-assigned from a driver.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.modified" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.modified</span>
      </div>
      <div><span class="name">Published when some part of the tour is modified, e.g. when stops are changed.

For **drivers** it's only published while the booking is in `en_route` state.

When the tour doesn't have a driver yet, then it's published to the service area drivers channel.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.route_changed" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.route_changed</span>
      </div>
      <div><span class="name">Published when the route of a tour has changed, i.e. by adding or removing stops, changing
their locations, changing their order and so on.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.stop_transition" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.stop_transition</span>
      </div>
      <div><span class="name">Indicates a change of status for a specific stop of a tour.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.transition" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.transition</span>
      </div>
      <div><span class="name">Indicates a change of status of a tour.</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have extended our existing booking and tour webhook notifications to always include the related service_area_id as well.]]></summary></entry><entry><title type="html">Support for external IDs on bookings</title><link href="https://docs.motiontools.io/announcements/changelog/2025/09/24/booking-external-id.html" rel="alternate" type="text/html" title="Support for external IDs on bookings" /><published>2025-09-24T00:00:00+00:00</published><updated>2025-09-24T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/09/24/booking-external-id</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/09/24/booking-external-id.html"><![CDATA[<p>We have introduced support for passing external IDs on the booking creation that will be stored in our system
and becomes visible in API responses and booking-related webhook notifications.</p>

<p>This feature allows easier integration of external systems for booking management with MotionTools, by allowing
you to correlate a booking ID on the other system with booking data stored and published via MotionTools, as the
booking procedes through it’s lifecycle.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/CreateHailingBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/bookings</span>
      </div>
      <div><span class="name">Create a Booking</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>This property will be returned <strong>only</strong> on bookings fetched via <code class="language-plaintext highlighter-rouge">standard</code> and <code class="language-plaintext highlighter-rouge">compact</code> views. You can also filter
by the <code class="language-plaintext highlighter-rouge">external_id</code> on the bookings list.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ListHailingBookings" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/hailing/bookings</span>
      </div>
      <div><span class="name">All Bookings</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ShowHailingBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/hailing/bookings/{id}</span>
      </div>
      <div><span class="name">Show Booking</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>The property is also included in the CSV export of the bookings.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ExportHailingBookings" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/bookings/export</span>
      </div>
      <div><span class="name">Export Bookings as CSV</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>We have also extended all our booking-related webhooks to contain the <code class="language-plaintext highlighter-rouge">external_id</code> when present. This allows you to more easily
reference the booking on your side against your own identifier without having to store our booking ID alongside it and match them.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.created" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.created</span>
      </div>
      <div><span class="name">Published when a new booking has been created</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.etas_recalculated" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.etas_recalculated</span>
      </div>
      <div><span class="name">Published when the ETAs for the booking's stops have been recalculated.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.modified" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.modified</span>
      </div>
      <div><span class="name">Published when some part of booking is modified, e.g. when stops are changed.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.route_changed" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.route_changed</span>
      </div>
      <div><span class="name">Published when the route of a booking has changed, i.e. by adding or removing stops, changing
their locations, changing their order and so on.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.transition" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.transition</span>
      </div>
      <div><span class="name">Indicates a change of status of a booking.</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced support for passing external IDs on the booking creation that will be stored in our system and becomes visible in API responses and booking-related webhook notifications.]]></summary></entry><entry><title type="html">Customer cancellation policies for bookings</title><link href="https://docs.motiontools.io/announcements/changelog/2025/09/18/booking-service-cancellation-policy.html" rel="alternate" type="text/html" title="Customer cancellation policies for bookings" /><published>2025-09-18T00:00:00+00:00</published><updated>2025-09-18T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/09/18/booking-service-cancellation-policy</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/09/18/booking-service-cancellation-policy.html"><![CDATA[<p>We have introduced configurable cancellation policies for booking services. The new policies allow you to configure until which point customers can cancel their bookings per booking service:</p>

<ol>
  <li><strong>Never</strong> – Customers cannot cancel their bookings.</li>
  <li><strong>Before dispatch</strong> – Customers can cancel if none of the stops have been dispatched into a tour - <strong>this is the default</strong>.</li>
  <li><strong>Before approaching</strong> – Customers can cancel if none of the dispatched stops have reached the “approaching” status.</li>
  <li><strong>Before arrival</strong> – Customers can cancel if none of the dispatched stops have reached the “arrived” status.</li>
</ol>

<p>This new functionality gives you more control over the booking services you offer to your customers.</p>

<p>You can configure the <code class="language-plaintext highlighter-rouge">cancellation_policy</code> via our usual service admin API endpoints:</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminHailingServices" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/admin/hailing/services</span>
      </div>
      <div><span class="name">List Services</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminCreateHailingService" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/admin/hailing/services</span>
      </div>
      <div><span class="name">Create a service</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminShowHailingService" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/admin/hailing/services/{id}</span>
      </div>
      <div><span class="name">Show a service</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminUpdateHailingService" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/admin/hailing/services/{id}</span>
      </div>
      <div><span class="name">Update a service</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>The ability to cancel a specific booking in its current configuration and status is always indicated via the <code class="language-plaintext highlighter-rouge">available_transitions</code> property of our bookings payload.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ListHailingBookings" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/hailing/bookings</span>
      </div>
      <div><span class="name">All Bookings</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ShowHailingBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/hailing/bookings/{id}</span>
      </div>
      <div><span class="name">Show Booking</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>Configuring this via our admin dashboard is also coming soon.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced configurable cancellation policies for booking services. The new policies allow you to configure until which point customers can cancel their bookings per booking service:]]></summary></entry><entry><title type="html">Dedicated webhook for notifying about tour earnings update</title><link href="https://docs.motiontools.io/announcements/changelog/2025/09/18/tour-earnings-updated-webhook.html" rel="alternate" type="text/html" title="Dedicated webhook for notifying about tour earnings update" /><published>2025-09-18T00:00:00+00:00</published><updated>2025-09-18T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/09/18/tour-earnings-updated-webhook</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/09/18/tour-earnings-updated-webhook.html"><![CDATA[<p>We have introduced a dedicated webhook for notifying about tour earnings update.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.earnings_updated" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.earnings_updated</span>
      </div>
      <div><span class="name">Published when the tour's earnings are updated.</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>The new webhook is supposed to replace the usage of the very broad <code class="language-plaintext highlighter-rouge">tour.modified</code> webhook for cases when you’re interested
in getting notified about tour earnings update.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced a dedicated webhook for notifying about tour earnings update.]]></summary></entry><entry><title type="html">Cancellation of dispatched bookings for admins</title><link href="https://docs.motiontools.io/announcements/changelog/2025/09/10/admin-dispatched-booking-cancellation.html" rel="alternate" type="text/html" title="Cancellation of dispatched bookings for admins" /><published>2025-09-10T00:00:00+00:00</published><updated>2025-09-10T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/09/10/admin-dispatched-booking-cancellation</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/09/10/admin-dispatched-booking-cancellation.html"><![CDATA[<p>We now also allow admins to cancel bookings that are fully <code class="language-plaintext highlighter-rouge">dispatched</code> more easily - meaning all their stops are dispatched into one or more tours.</p>

<p>This complements the <a href="/announcements/changelog/2025/05/21/cancellation-of-partially-dispatched-bookings.html">corresponding feature we’ve announced back in May</a> where this was already made possible more easily for <code class="language-plaintext highlighter-rouge">partially_dispatched</code> bookings.</p>

<hr />

<p>Let’s go through some examples to outline some of the different scenarios. We’ll consider a booking with stops A and B, which are dispatched into a single tour:</p>

<p><strong>Admin cancels before driver arrives at one of the stops</strong></p>

<ul>
  <li>The dispatched stops get removed from the tour</li>
  <li>The tour is empty and <code class="language-plaintext highlighter-rouge">cancelled</code></li>
  <li>The original booking stops are <code class="language-plaintext highlighter-rouge">cancelled</code></li>
  <li>The original booking is <code class="language-plaintext highlighter-rouge">cancelled</code></li>
</ul>

<p><strong>Admin cancels after a driver arrived at a stop</strong></p>

<ul>
  <li>The arrived tour stop A will be marked as failed</li>
  <li>We detach the tour stop A from the booking stop A</li>
  <li>The tour stop B is removed from the tour</li>
  <li>The tour is completed and in <code class="language-plaintext highlighter-rouge">paid</code> status</li>
  <li>The original booking is <code class="language-plaintext highlighter-rouge">cancelled</code></li>
</ul>

<p><strong>Admin cancels after a driver completed or failed a stop</strong></p>

<p>Assuming the driver already completed the tour stop A and is now approaching the tour stop B</p>

<ul>
  <li>The already completed tour stop A remains <code class="language-plaintext highlighter-rouge">done</code> and on the tour</li>
  <li>The corresponding booking stop A remains <code class="language-plaintext highlighter-rouge">done</code></li>
  <li>The second, approaching stop B is removed from the tour and is <code class="language-plaintext highlighter-rouge">cancelled</code> on the booking</li>
  <li>The tour is completed and in <code class="language-plaintext highlighter-rouge">paid</code> status</li>
  <li>The original booking is <code class="language-plaintext highlighter-rouge">cancelled</code></li>
</ul>

<p>When the driver fails stop A the behaviour is the same except that of course the stop will now be in <code class="language-plaintext highlighter-rouge">failed</code> status both on the tour and booking, instead of <code class="language-plaintext highlighter-rouge">done</code></p>

<p>Overall, the behaviour is the same as for <code class="language-plaintext highlighter-rouge">partially_dispatched</code> bookings or bookings
that have their stops dispatched into multiple tours - but the rules will accordingly apply
to all related tours and stops.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/TransitionHailingBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/hailing/bookings/{id}/transition</span>
      </div>
      <div><span class="name">Perform a transition on a booking or tour</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We now also allow admins to cancel bookings that are fully dispatched more easily - meaning all their stops are dispatched into one or more tours.]]></summary></entry><entry><title type="html">Adding stop instructions</title><link href="https://docs.motiontools.io/announcements/changelog/2025/09/10/stop-instructions.html" rel="alternate" type="text/html" title="Adding stop instructions" /><published>2025-09-10T00:00:00+00:00</published><updated>2025-09-10T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/09/10/stop-instructions</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/09/10/stop-instructions.html"><![CDATA[<p>We have introduced the ability to add additional instructions for the driver as custom content
on stops using pre-defined templates as admin and regular customer, both on booking creation and
when inserting a custom stop into a booking or a tour.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/CreateHailingBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/bookings</span>
      </div>
      <div><span class="name">Create a Booking</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/InsertCustomStopIntoExistingBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/bookings/{booking_id}/stops</span>
      </div>
      <div><span class="name">Insert custom stop into existing booking</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/InsertCustomStopIntoExistingTour" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/tours/{tour_id}/stops</span>
      </div>
      <div><span class="name">Insert custom stop into existing tour</span></div>
    </div>
  </a>
</div>

<p>Instructions are pre-defined content that is attached to the stop, providing additional details about things
to do for the driver at the stop - for example verifying the recipient’s age.
You can see available instructions through the dedicated endpoint:</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ListAvailableInstructions" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/stops/available_instructions</span>
      </div>
      <div><span class="name">List available stop instructions</span></div>
    </div>
  </a>
</div>

<p>You can still provide your own content for the stops, alongside instructions.
In such a case, the content for the instruction will be appended to the provided content.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced the ability to add additional instructions for the driver as custom content on stops using pre-defined templates as admin and regular customer, both on booking creation and when inserting a custom stop into a booking or a tour.]]></summary></entry><entry><title type="html">Assigning drivers to specific service areas</title><link href="https://docs.motiontools.io/announcements/changelog/2025/08/27/driver-service-area-assignment.html" rel="alternate" type="text/html" title="Assigning drivers to specific service areas" /><published>2025-08-27T00:00:00+00:00</published><updated>2025-08-27T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/08/27/driver-service-area-assignment</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/08/27/driver-service-area-assignment.html"><![CDATA[<p>We have introduced the ability to assign drivers to specific service areas.</p>

<p>In MotionTools when a driver goes online in the driver app as well as while they update their location while they’re online
we constantly check their location against the service areas defined for the corresponding tenant.</p>

<p>When the driver moves between service areas we will assign them to the new area automatically. This leads to them showing
up in the operations page of a service area in our dashboard as well as giving them the ability to see pickable and scheduled
tours for the corresponding service areas.</p>

<p>We have now introduced the ability to assign drivers to one or more specific service areas. If a driver is assigned like this
we won’t change their service area in the way described above anymore if the service area matching their current location 
is not assigned to them.</p>

<p>When a driver is not assigned to any specific service areas, the behaviour remains as it was before - a driver can enter any
service area available on the tenant.</p>

<p>The corresponding API endpoints for managing assigned driver service areas that were introduced are:</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AssignDriverToServiceArea" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/drivers/{id}/assigned_service_areas</span>
      </div>
      <div><span class="name">Assign a driver to a service area</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AssignedDriverServiceAreas" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/drivers/{id}/assigned_service_areas</span>
      </div>
      <div><span class="name">Assigned service areas</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UnassignDriverFromServiceArea" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">delete</span>
        <span class="path">/api/drivers/{id}/assigned_service_areas/{service_area_id}</span>
      </div>
      <div><span class="name">Un-assign a driver from a service area</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>The feature will soon also be available on our admin dashboard.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced the ability to assign drivers to specific service areas.]]></summary></entry><entry><title type="html">Support for declaring tips</title><link href="https://docs.motiontools.io/announcements/changelog/2025/08/27/driver-tip.html" rel="alternate" type="text/html" title="Support for declaring tips" /><published>2025-08-27T00:00:00+00:00</published><updated>2025-08-27T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/08/27/driver-tip</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/08/27/driver-tip.html"><![CDATA[<p>We have introduced the ability to declare an optional tip amount and currency to send to a driver upon booking creation.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/CreateHailingBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/bookings</span>
      </div>
      <div><span class="name">Create a Booking</span></div>
    </div>
  </a>
</div>

<p>Upon regular booking creation we now allow customers and admins to pass an optional <code class="language-plaintext highlighter-rouge">tip</code> request payload. The
contained fractional amount and currency code will be persisted on the booking.</p>

<p>We also indicate this value on the <code class="language-plaintext highlighter-rouge">standard</code> booking response when present.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ShowHailingBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/hailing/bookings/{id}</span>
      </div>
      <div><span class="name">Show Booking</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>At this time this value is simply being stored and returned, no further features are available on our platform
for further usage - similar to our tour earnings mechanism, this feature simply provides a way to provide and store
the data, and further processing needs to be implemented as needed via our API and other integrations.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced the ability to declare an optional tip amount and currency to send to a driver upon booking creation.]]></summary></entry><entry><title type="html">Updating capabilities on bookings &amp;amp; tours</title><link href="https://docs.motiontools.io/announcements/changelog/2025/08/27/update-capabilities.html" rel="alternate" type="text/html" title="Updating capabilities on bookings &amp;amp; tours" /><published>2025-08-27T00:00:00+00:00</published><updated>2025-08-27T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/08/27/update-capabilities</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/08/27/update-capabilities.html"><![CDATA[<p>We now allow updating the <code class="language-plaintext highlighter-rouge">requested_capabilities</code> on bookings and tours.</p>

<p>So far, changing the requested capabilities wasn’t allowed after initial creation of a booking or tour.</p>

<p>Especially in the case of tours this was a bit limiting as a tour might be modified and extended during planning
before being given to drivers the required capabilities for doing the tour might change - for example,
a simple tour might suffice a <code class="language-plaintext highlighter-rouge">bike</code> vehicle, but dispatching more stops from other bookings into the
same tour might make a <code class="language-plaintext highlighter-rouge">car</code> necessary.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdateBookingRequestedCapabilities" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/bookings/{id}/requested_capabilities</span>
      </div>
      <div><span class="name">Update booking's requested capabilities</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdateTourRequestedCapabilities" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/tours/{id}/requested_capabilities</span>
      </div>
      <div><span class="name">Update tour's requested capabilities</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>Support for updating those is also soon coming to our web dashboard.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We now allow updating the requested_capabilities on bookings and tours.]]></summary></entry><entry><title type="html">Customers can also request booking CSV exports</title><link href="https://docs.motiontools.io/announcements/changelog/2025/08/20/customer-booking-csv.html" rel="alternate" type="text/html" title="Customers can also request booking CSV exports" /><published>2025-08-20T00:00:00+00:00</published><updated>2025-08-20T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/08/20/customer-booking-csv</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/08/20/customer-booking-csv.html"><![CDATA[<p>Customers can now also request a CSV export of their bookings.</p>

<p>So far the booking CSV export feature was available only to the admin and organization manager roles - 
we have now also made this availble to customers.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ExportHailingBookings" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/bookings/export</span>
      </div>
      <div><span class="name">Export Bookings as CSV</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>Support for this has also been added to our dashboard.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[Customers can now also request a CSV export of their bookings.]]></summary></entry><entry><title type="html">Assign organizations to service areas</title><link href="https://docs.motiontools.io/announcements/changelog/2025/08/20/organization-service-area-assignment.html" rel="alternate" type="text/html" title="Assign organizations to service areas" /><published>2025-08-20T00:00:00+00:00</published><updated>2025-08-20T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/08/20/organization-service-area-assignment</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/08/20/organization-service-area-assignment.html"><![CDATA[<p>We have introduced the ability to link organizations and service areas to each other, allowing to automate
visibility of tours.</p>

<p>Our existing managing organizations feature allows scoping the visiblity of bookings and tours to certain organizations - only
drivers and organization managers on these organizations (in addition to explicitly added preferred drivers) will be able to see such bookings
and tours.</p>

<p>This functionality is useful to scope access and operations to certain operational sub-units or subcontractors.</p>

<p>We have now extended this functionality with a built-in automation. You can now link certain organizations to specific service areas.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminListOrganizationServiceAreaLinks" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/admin/organization_service_area_links</span>
      </div>
      <div><span class="name">List organization and service area links</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminLinkOrganizationAndServiceArea" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/admin/organization_service_area_links</span>
      </div>
      <div><span class="name">Link organization and service area</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminUnlinkOrganizationAndServiceArea" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">delete</span>
        <span class="path">/api/admin/organization_service_area_links/{id}</span>
      </div>
      <div><span class="name">Unlink organization and service area</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>When organizations are assigned to the corresponding service area, we will now automatically set all related organizations
as managing organizations when creating an empty tour or creating a tour by dispatching booking stops via these endpoints:</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/CreateEmptyTour" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/tours</span>
      </div>
      <div><span class="name">Create Empty Tour</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/DispatchStopsIntoTour" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/bookings/merge</span>
      </div>
      <div><span class="name">Dispatch stops into a tour</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>Consistent with our previously existing behaviour about managing organization inheritance, operations like dispatching 
booking stops into an existing tour do not further modify the managing organizations.</p>

<p>Support for managing this is also coming soon to our admin dashboard.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced the ability to link organizations and service areas to each other, allowing to automate visibility of tours.]]></summary></entry><entry><title type="html">Extended configurabilty of off-route driver tour display</title><link href="https://docs.motiontools.io/announcements/changelog/2025/08/13/driver-off-route-tour-display.html" rel="alternate" type="text/html" title="Extended configurabilty of off-route driver tour display" /><published>2025-08-13T00:00:00+00:00</published><updated>2025-08-13T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/08/13/driver-off-route-tour-display</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/08/13/driver-off-route-tour-display.html"><![CDATA[<p>We are reworking the way pickable, scheduled, claimed, completed and cancelled tours are being displayed in our driver apps.</p>

<p>We want to make our platform even more adaptable to the specific needs of your business and use case, and therefore are
introducing sophisticated new possibilities for configuring the way tours are shown to drivers.</p>

<p>In addition to already existing features like configuring the sorting order and algorithm of the pickable tours list and more,
among the new configurable features you can:</p>

<ul>
  <li>Configure how tour stops are being displayed in overview maps of lists</li>
  <li>Decide whether you only want to show the details of the first or first and last stop in lists</li>
</ul>

<p>We are also introducing highly configurable labels, on both tours and stops. This allows you to choose and configure
which details should be shown, and in what order, including:</p>

<ul>
  <li>The distance to the first stop from the driver’s location</li>
  <li>The total tour distance</li>
  <li>Any metadata on the tour or any of it’s stops</li>
  <li>Driver Earnings</li>
  <li>Expected arrival time windows</li>
</ul>

<p>You can freely add and remove these options and configure localized prefix and suffix values. For this, please use the new
tour display admin APIs:</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminShowTourDisplay" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/admin/driver_experience/tour_display</span>
      </div>
      <div><span class="name">Show Tour Display Configuration</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminUpdateTourDisplay" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/admin/driver_experience/tour_display</span>
      </div>
      <div><span class="name">Update Tour Display Configuration</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>Additional driver experience related configuration options remain available via:</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminShowDriverExperience" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/admin/driver_experience</span>
      </div>
      <div><span class="name">Show Driver Experience Configuration</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminUpdateDriverExperience" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/admin/driver_experience</span>
      </div>
      <div><span class="name">Update Driver Experience Configuration</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>Support for configuring these interactively is coming soon to our admin dashboard as well, and our driver apps will receive updates
in the next weeks that fully utilize these new configuration options for tour display.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We are reworking the way pickable, scheduled, claimed, completed and cancelled tours are being displayed in our driver apps.]]></summary></entry><entry><title type="html">Linking places to service areas</title><link href="https://docs.motiontools.io/announcements/changelog/2025/08/13/linking-places-to-service-areas.html" rel="alternate" type="text/html" title="Linking places to service areas" /><published>2025-08-13T00:00:00+00:00</published><updated>2025-08-13T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/08/13/linking-places-to-service-areas</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/08/13/linking-places-to-service-areas.html"><![CDATA[<p>We will now create links between service areas and places based on their location.</p>

<p>Most notably, this gives you the ability to filter places based on their service area(s). Please note that
service area coordinates can overlap, and hence a single place can be inside multiple service areas.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ListPlaces" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/places</span>
      </div>
      <div><span class="name">List all places</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We will now create links between service areas and places based on their location.]]></summary></entry><entry><title type="html">New option to display customer places in driver app</title><link href="https://docs.motiontools.io/announcements/changelog/2025/08/13/show-customer-places-in-driver-app.html" rel="alternate" type="text/html" title="New option to display customer places in driver app" /><published>2025-08-13T00:00:00+00:00</published><updated>2025-08-13T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/08/13/show-customer-places-in-driver-app</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/08/13/show-customer-places-in-driver-app.html"><![CDATA[<p>We have introduced the optional ability to display nearby customer places in the driver app’s map.</p>

<p>If your use case revolves around tasks at repeating customer locations, for example picking up goods
at shops or meals at restaurants, it can be useful for drivers to be aware of where these locations are
around them.</p>

<p>For this, we have introduced a new <code class="language-plaintext highlighter-rouge">show_customer_places</code> flag on our driver experience configuration API,
which defaults to <code class="language-plaintext highlighter-rouge">false</code>. When enabled, drivers will be able to see the locations and names of the up to
100 non-archived customer places closest to their current location and inside their service area while online.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminShowDriverExperience" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/admin/driver_experience</span>
      </div>
      <div><span class="name">Show Driver Experience Configuration</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminUpdateDriverExperience" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/admin/driver_experience</span>
      </div>
      <div><span class="name">Update Driver Experience Configuration</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>Support for configuring this is also available in the admin dashboard and the driver apps will soon start
fetching and displaying these.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced the optional ability to display nearby customer places in the driver app’s map.]]></summary></entry><entry><title type="html">Export packages via CSV</title><link href="https://docs.motiontools.io/announcements/changelog/2025/07/23/packages-csv-export.html" rel="alternate" type="text/html" title="Export packages via CSV" /><published>2025-07-23T00:00:00+00:00</published><updated>2025-07-23T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/07/23/packages-csv-export</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/07/23/packages-csv-export.html"><![CDATA[<p>We have introduced the ability to export package information in a CSV file.</p>

<p>The endpoint supports the common filters also avaible on the regular package listing endpoint.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/CsvExportPackages" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/packages/export</span>
      </div>
      <div><span class="name">Generate CSV export</span></div>
    </div>
  </a>
</div>

<p>Support for creating these exports is also coming soon to our web dashboard for customers and admins.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced the ability to export package information in a CSV file.]]></summary></entry><entry><title type="html">Harmonized distance for route distance and price calculation</title><link href="https://docs.motiontools.io/announcements/changelog/2025/07/09/price-calculation-distance-source.html" rel="alternate" type="text/html" title="Harmonized distance for route distance and price calculation" /><published>2025-07-09T00:00:00+00:00</published><updated>2025-07-09T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/07/09/price-calculation-distance-source</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/07/09/price-calculation-distance-source.html"><![CDATA[<p>We will now use the same source for calculating the distance of a booking for statistics as well as for calculating the price
from the price matrix.</p>

<p>If you’re using our booking pricing module on your tenant in certain scenarios you could have a difference in the overage distance
calculated for the price and the booking distance shown in the web dashboard. The reason for this was that different sources
where used for these before - now, this uses the same source for both.</p>

<p>Which source is being used depends on the route accuracy plan that you have purchased with us, either being straight line calculation
or an actual maps-based route calculation.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We will now use the same source for calculating the distance of a booking for statistics as well as for calculating the price from the price matrix.]]></summary></entry><entry><title type="html">User search now also takes company name into account</title><link href="https://docs.motiontools.io/announcements/changelog/2025/07/09/search-includes-customer-company-name.html" rel="alternate" type="text/html" title="User search now also takes company name into account" /><published>2025-07-09T00:00:00+00:00</published><updated>2025-07-09T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/07/09/search-includes-customer-company-name</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/07/09/search-includes-customer-company-name.html"><![CDATA[<p>Our user search will now also consider the company name listed on customer profiles, if present.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ListUsers" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/users</span>
      </div>
      <div><span class="name">List Users</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[Our user search will now also consider the company name listed on customer profiles, if present.]]></summary></entry><entry><title type="html">Restrict driver profile updates</title><link href="https://docs.motiontools.io/announcements/changelog/2025/07/02/restricted-driver-profile-update.html" rel="alternate" type="text/html" title="Restrict driver profile updates" /><published>2025-07-02T00:00:00+00:00</published><updated>2025-07-02T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/07/02/restricted-driver-profile-update</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/07/02/restricted-driver-profile-update.html"><![CDATA[<p>We have introduced the ability to restrict updates to driver profiles.</p>

<p>Depending on your onboarding process for new drivers it can be helpful to restrict further editing
of a driver’s profile details after initial onboarding. To facilitate this we have introduced a new option 
to restrict self-serving updates to a driver’s profile details after a successful initial onboarding.</p>

<p>This option is available to you upon request by reaching out to our customer success team.</p>

<p>Regardless of this setting admins and organization managers remain able to update a driver’s profile details using
our web dashboard and the corresponding API endpoint.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdateUserProfileAsManagingUser" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/users/{id}/profile</span>
      </div>
      <div><span class="name">Update Profile as Admin/Org. Manager</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced the ability to restrict updates to driver profiles.]]></summary></entry><entry><title type="html">Managed mode for driver’s capabilities</title><link href="https://docs.motiontools.io/announcements/changelog/2025/06/24/managed-driver-capabilities.html" rel="alternate" type="text/html" title="Managed mode for driver’s capabilities" /><published>2025-06-24T00:00:00+00:00</published><updated>2025-06-24T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/06/24/managed-driver-capabilities</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/06/24/managed-driver-capabilities.html"><![CDATA[<p>We have introduced a managed mode for driver’s capabilities, where admins and optionally
organization managers and drivers themselves can update them.</p>

<p>When a driver is going online in the driver app we ask them about their current capabilities, which are
subsequently used for selecting suitable tours.</p>

<p>Depending on your onboarding flow it can be necessary to do additional verifications like driver license checks
during onboarding. In such situations it can be desirable to restrict the drivers ability to choose different
capabilities after the initial onboarding. For this, we have extended our product with a corresponding
optional configuration, allowing to restrict such updates so for example an onboarded driver always has a <code class="language-plaintext highlighter-rouge">bike</code>
capability and cannot switch to a <code class="language-plaintext highlighter-rouge">car</code> without reaching out to your internal support team.</p>

<p>This option is available to you upon request by reaching out to our customer success team. It’s configurable
whether drivers and/or org_managers can update these each, and the default remains as before that all
of admins, org_managers and drivers can manage them.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdateDriverCapabilities" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/drivers/{id}/capabilities</span>
      </div>
      <div><span class="name">Update driver's matching capabilities</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>Our driver apps will accordingly adapt to this setting and not offer the ability to choose corresponding
capabilities that affect matching when going online.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced a managed mode for driver’s capabilities, where admins and optionally organization managers and drivers themselves can update them.]]></summary></entry><entry><title type="html">Removal of return_to_hub property on tour response</title><link href="https://docs.motiontools.io/announcements/deprecations/2025/06/19/removal-of-tour-return_to_hub-property.html" rel="alternate" type="text/html" title="Removal of return_to_hub property on tour response" /><published>2025-06-19T00:00:00+00:00</published><updated>2025-06-19T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/deprecations/2025/06/19/removal-of-tour-return_to_hub-property</id><content type="html" xml:base="https://docs.motiontools.io/announcements/deprecations/2025/06/19/removal-of-tour-return_to_hub-property.html"><![CDATA[<p>We are removing the <code class="language-plaintext highlighter-rouge">return_to_hub</code> property returned on the standard response for bookings &amp; tours.</p>

<p>This property has become obsolete in early 2024 with the introduction of our flexible package tours product,
allowing any tour to have arbitrary stops as desired, and hasn’t been used for some time. We are now fully
removing it from our API responses.</p>]]></content><author><name></name></author><category term="Deprecations" /><summary type="html"><![CDATA[We are removing the return_to_hub property returned on the standard response for bookings &amp; tours.]]></summary></entry><entry><title type="html">Enhanced Vehicle Type Profiles: More Accurate Route Calculations for Every Vehicle</title><link href="https://docs.motiontools.io/announcements/changelog/2025/06/11/enhanced-vehicle-type-profile-usage.html" rel="alternate" type="text/html" title="Enhanced Vehicle Type Profiles: More Accurate Route Calculations for Every Vehicle" /><published>2025-06-11T00:00:00+00:00</published><updated>2025-06-11T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/06/11/enhanced-vehicle-type-profile-usage</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/06/11/enhanced-vehicle-type-profile-usage.html"><![CDATA[<p>We’re excited to announce significant improvements to our vehicle type profile system, giving you more 
granular control over route calculations and estimates based on your actual fleet composition.</p>

<h4 id="whats-new">What’s new</h4>

<p>Previously, our platform used a single, global vehicle type profile per tenant for all route calculations, 
regardless of the actual vehicle being used. This meant that whether your driver was using a bike, car, 
or truck, the system would calculate routes and estimates using the same parameters.</p>

<p>Now, you can configure unique vehicle type profiles for each vehicle capability value, enabling more 
accurate and realistic route planning that reflects the true capabilities and constraints of different vehicle types.</p>

<h4 id="why-this-matters">Why This Matters</h4>

<p>Different vehicles have vastly different operational characteristics:</p>

<ul>
  <li>Bikes can take shortcuts through parks and bike lanes but move slower on longer routes</li>
  <li>Cars balance speed and accessibility across most road types</li>
  <li>Trucks can require specific routes that accommodate size and weight restrictions</li>
</ul>

<p>With vehicle-specific profiles, your route estimates and statistics will now accurately reflect these 
differences, leading to:</p>

<ul>
  <li>More realistic delivery time estimates</li>
  <li>Improved customer expectations and satisfaction</li>
</ul>

<h4 id="how-it-works">How It Works</h4>

<h5 id="configure-vehicle-specific-profiles">Configure Vehicle-Specific Profiles</h5>

<p>You can now assign distinct vehicle type profiles to each vehicle capability value through our admin APIs:</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminCreateCapability" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/admin/capabilities</span>
      </div>
      <div><span class="name">Create Capability</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminUpdateCapability" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/admin/capabilities/{capability_key}</span>
      </div>
      <div><span class="name">Update Capability</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminCapabilities" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/admin/capabilities</span>
      </div>
      <div><span class="name">List Capabilities</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminCapabilityValues" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/admin/capabilities/{capability_key}/values</span>
      </div>
      <div><span class="name">List Capability Values</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminCreateCapabilityValue" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/admin/capabilities/{capability_key}/values</span>
      </div>
      <div><span class="name">Create Capability Value</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminUpdateCapabilityValue" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/admin/capabilities/{capability_key}/values/{key}</span>
      </div>
      <div><span class="name">Update Capability Value</span></div>
    </div>
  </a>
</div>

<h5 id="automatic-profile-assignment">Automatic Profile Assignment</h5>

<p>When drivers go online in the driver app and select a vehicle capability the system automatically assigns 
the corresponding vehicle type profile to their account. This ensures that all subsequent tour calculations 
use the appropriate profile for their specific vehicle and means that estimated distances and times of arrival
can change once a driver starts a tour if their vehicle type profile differs from the one requested on the tour.</p>

<h5 id="enhanced-route-calculations">Enhanced Route Calculations</h5>

<p>The improved system now uses vehicle-specific profiles for:</p>

<ul>
  <li>Arrival time estimates</li>
  <li>Tour statistics</li>
</ul>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/StatsForTours" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/tour/stats</span>
      </div>
      <div><span class="name">Fetch stats for tours</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/EstimateBookingsStopsArrivals" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/bookings/estimates</span>
      </div>
      <div><span class="name">Fetch estimated arrival times for multiple bookings at once</span></div>
    </div>
  </a>
</div>

<h4 id="getting-started">Getting Started</h4>

<p>If you’re already using our capability system with vehicle types, these improvements are automatically available. 
Simply configure vehicle type profiles for your existing vehicle capability values to start seeing more accurate 
route calculations.</p>

<p>For new implementations, the <code class="language-plaintext highlighter-rouge">vehicle_type</code> capability we create by default for new tenants will serve as your 
starting point for vehicle-specific configuration, and already comes with pre-configured <code class="language-plaintext highlighter-rouge">vehicle_type_profile</code> defaults.</p>

<p><em>Need help setting up vehicle type profiles for your fleet? Contact our support team or check out our API documentation 
for detailed implementation guidance.</em></p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We’re excited to announce significant improvements to our vehicle type profile system, giving you more granular control over route calculations and estimates based on your actual fleet composition.]]></summary></entry><entry><title type="html">Collection of proofs for off-tour package delivery</title><link href="https://docs.motiontools.io/announcements/changelog/2025/06/03/off-tour-package-proofs.html" rel="alternate" type="text/html" title="Collection of proofs for off-tour package delivery" /><published>2025-06-03T00:00:00+00:00</published><updated>2025-06-03T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/06/03/off-tour-package-proofs</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/06/03/off-tour-package-proofs.html"><![CDATA[<p>We now allow configuring and collecting proofs of delivery for packages that are force-delivered or marked as collected.</p>

<p>Since the configuration of required proofs of delivery on tours is configured per tour service it cannot apply to off-tour
package delivery &amp; collection - therefore, a new dedicated configuration for off-tour package delivery proofs has been
added to our packages configuration admin API. The available options depend on your plan at MotionTools, and specifically
the purchase of the granular proofs configuration extension.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminUpdatePackageConfig" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/admin/packages</span>
      </div>
      <div><span class="name">Update Package Configuration</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>When marking a package as collected or force delivered the corresponding proofs will be collected based on this configuration
in a similar way it would when delivering packages the regular way via a tour.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/CollectHailingPackage" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/packages/{id}/collect</span>
      </div>
      <div><span class="name">Mark package as collected</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ForceDeliverHailingPackage" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/packages/{id}/force_delivery</span>
      </div>
      <div><span class="name">Mark package as delivered</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We now allow configuring and collecting proofs of delivery for packages that are force-delivered or marked as collected.]]></summary></entry><entry><title type="html">Optional pricing detail links for booking services</title><link href="https://docs.motiontools.io/announcements/changelog/2025/05/28/booking-service-price-details-urls.html" rel="alternate" type="text/html" title="Optional pricing detail links for booking services" /><published>2025-05-28T00:00:00+00:00</published><updated>2025-05-28T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/05/28/booking-service-price-details-urls</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/05/28/booking-service-price-details-urls.html"><![CDATA[<p>You can now define optional, localized <code class="language-plaintext highlighter-rouge">pricing_details_url_translations</code> on booking services which will be used
to show localized links for further pricing information in your web booking portal for customers.</p>

<p>In addition to the API this functionality is also configurable from our booking service management in the admin dashboard.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminCreateHailingService" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/admin/hailing/services</span>
      </div>
      <div><span class="name">Create a service</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminHailingServices" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/admin/hailing/services</span>
      </div>
      <div><span class="name">List Services</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminShowHailingService" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/admin/hailing/services/{id}</span>
      </div>
      <div><span class="name">Show a service</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminUpdateHailingService" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/admin/hailing/services/{id}</span>
      </div>
      <div><span class="name">Update a service</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[You can now define optional, localized pricing_details_url_translations on booking services which will be used to show localized links for further pricing information in your web booking portal for customers.]]></summary></entry><entry><title type="html">Package recovery to pickup place</title><link href="https://docs.motiontools.io/announcements/changelog/2025/05/28/recover-packages-to-pickup.html" rel="alternate" type="text/html" title="Package recovery to pickup place" /><published>2025-05-28T00:00:00+00:00</published><updated>2025-05-28T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/05/28/recover-packages-to-pickup</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/05/28/recover-packages-to-pickup.html"><![CDATA[<p>We now allow recovering a failed package to its original pickup place.</p>

<p>When a package fails to be picked up or dropped of at a corresponding stop we move it
into the <code class="language-plaintext highlighter-rouge">failed</code> status.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/RecoverHailingPackage" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/packages/{id}/recover</span>
      </div>
      <div><span class="name">Recover failed package</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>So far we only allowed to recover packages to one of your tenant hub places. To make resolving situations
where the actual pickup of the package at its origin fails (i.e. because it wasn’t ready in time) easier
we now additionally allow recovering packages to their pickup place. This makes it easier to re-attempt pickup
of a package without having to do a cancel &amp; recreate cycle.</p>

<p>This functionality is also available from our package management tools in the admin dashboard.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We now allow recovering a failed package to its original pickup place.]]></summary></entry><entry><title type="html">Removal of generic force_delivery package transition</title><link href="https://docs.motiontools.io/announcements/deprecations/2025/05/22/removal-of-generic-force_delivery.html" rel="alternate" type="text/html" title="Removal of generic force_delivery package transition" /><published>2025-05-22T00:00:00+00:00</published><updated>2025-05-22T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/deprecations/2025/05/22/removal-of-generic-force_delivery</id><content type="html" xml:base="https://docs.motiontools.io/announcements/deprecations/2025/05/22/removal-of-generic-force_delivery.html"><![CDATA[<p>Due to the introduction of configurable off-tour package delivery proofs we are replacing the generic <code class="language-plaintext highlighter-rouge">force_delivery</code> 
transition with a dedicated endpoint.</p>

<p>This change became necessary since depending on the configuration a forced delivery now requires additional
data for proofs to be provided, which wasn’t possible with the generic transition.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ForceDeliverHailingPackage" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/packages/{id}/force_delivery</span>
      </div>
      <div><span class="name">Mark package as delivered</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Deprecations" /><summary type="html"><![CDATA[Due to the introduction of configurable off-tour package delivery proofs we are replacing the generic force_delivery transition with a dedicated endpoint.]]></summary></entry><entry><title type="html">Cancellation of partially dispatched bookings</title><link href="https://docs.motiontools.io/announcements/changelog/2025/05/21/cancellation-of-partially-dispatched-bookings.html" rel="alternate" type="text/html" title="Cancellation of partially dispatched bookings" /><published>2025-05-21T00:00:00+00:00</published><updated>2025-05-21T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/05/21/cancellation-of-partially-dispatched-bookings</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/05/21/cancellation-of-partially-dispatched-bookings.html"><![CDATA[<p>We have made it easier for admins to cancel partially dispatched bookings in a single API call.</p>

<p>This functionality was already available before in our web dashboard and via our API, but on the API
it required taking a few individual calls to reach the desired state - you had to first undispatch the
corresponding stops from a tour before you could move on to cancelling the booking.</p>

<p>With the new change the <code class="language-plaintext highlighter-rouge">cancel</code> transition will also appear for <code class="language-plaintext highlighter-rouge">partially_dispatched</code> bookings
in their <code class="language-plaintext highlighter-rouge">available_transitions</code> via the API, and can then be cancelled using our generic
booking transition endpoint.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/TransitionHailingBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/hailing/bookings/{id}/transition</span>
      </div>
      <div><span class="name">Perform a transition on a booking or tour</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have made it easier for admins to cancel partially dispatched bookings in a single API call.]]></summary></entry><entry><title type="html">Package delivery re-attempts</title><link href="https://docs.motiontools.io/announcements/changelog/2025/05/13/package-delivery-reattempts.html" rel="alternate" type="text/html" title="Package delivery re-attempts" /><published>2025-05-13T00:00:00+00:00</published><updated>2025-05-13T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/05/13/package-delivery-reattempts</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/05/13/package-delivery-reattempts.html"><![CDATA[<p>We have introduced the ability to append delivery reattempts for failed package deliveries
on the same tour via a corresponding failure reason.</p>

<p>Our package failure reason configuration already enables you to define specific failure reasons
for your package pickups and deliveries in a self-serving way via the API as well as our admin
dashboard.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminListHailingFailureReasons" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/admin/hailing/failure_reasons</span>
      </div>
      <div><span class="name">List Failure Reasons</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminCreateHailingFailureReasons" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/admin/hailing/failure_reasons</span>
      </div>
      <div><span class="name">Create Failure Reason</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminUpdateHailingFailureReason" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/admin/hailing/failure_reasons/{id}</span>
      </div>
      <div><span class="name">Update Failure Reason</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>We have now introduced an optional <code class="language-plaintext highlighter-rouge">triggers_reattempt</code> flag on failure reasons. When this flag
is set and a package delivery is marked as failed in the driver app using a corresponding failure
reason with this flag we will automatically append another delivery attempt stop at the end of the current
tour. The driver can then move the stop into a reasonable position in the order using our familiar
stop reordering feature in the driver app.</p>

<p>This new feature is intended to help in situations where upon delivery the driver becomes aware
that a recipient might be able to be reached for delivery at a later point during the tour.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced the ability to append delivery reattempts for failed package deliveries on the same tour via a corresponding failure reason.]]></summary></entry><entry><title type="html">External labels in package transition webhook</title><link href="https://docs.motiontools.io/announcements/changelog/2025/04/30/external-labels-in-package-transition-webhook.html" rel="alternate" type="text/html" title="External labels in package transition webhook" /><published>2025-04-30T00:00:00+00:00</published><updated>2025-04-30T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/04/30/external-labels-in-package-transition-webhook</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/04/30/external-labels-in-package-transition-webhook.html"><![CDATA[<p>Our package transition webhook notification now also contains the external labels of the package</p>

<p>This can be helpful for integrating our packages with external systems as you can now more easily
close the loop between passing the <code class="language-plaintext highlighter-rouge">external_labels</code> upon package creation and then listening for corresponding
updates without having to store our own package ID or looking it up via API for identification.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.hailing_package.transition" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">hailing_package.transition</span>
      </div>
      <div><span class="name">Indicates a change of status for a package</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/CreateHailingPackage" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/packages</span>
      </div>
      <div><span class="name">Create a Package</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[Our package transition webhook notification now also contains the external labels of the package]]></summary></entry><entry><title type="html">Gradual rollout for pickable tours</title><link href="https://docs.motiontools.io/announcements/changelog/2025/04/23/gradual-rollout-for-pickable-tours.html" rel="alternate" type="text/html" title="Gradual rollout for pickable tours" /><published>2025-04-23T00:00:00+00:00</published><updated>2025-04-23T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/04/23/gradual-rollout-for-pickable-tours</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/04/23/gradual-rollout-for-pickable-tours.html"><![CDATA[<p>We have introduced an extension giving you the ability to roll out pickable tours gradually to available drivers 
based on their distance from the first stop.</p>

<p>This optional extension works by looking up the next closest available driver and marking them as preferred, instead
of the default behaviour of pickable tours becoming immediately visible to all suitable drivers. It can help you
in optimize the approach time on your tours by ensuring the closest drivers see and ideally pick tours, 
avoiding longer approach distances and thus driving times.</p>

<p>This feature is available as a paid extension via our customer success team - please reach
out to us in case you are interested.</p>

<p>Once enabled you can configure this feature per operations configuration, so you can either have one central configuration
for all of your service areas or go as detailed as having one individual per service area.</p>

<p>You can configure whether:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">driver_ranking</code> is enabled</li>
  <li><code class="language-plaintext highlighter-rouge">gradual_rollout</code> is enabled</li>
  <li>How long we should wait before rolling out to the next available driver via <code class="language-plaintext highlighter-rouge">gradual_rollout_frequency_seconds</code></li>
</ul>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ListSchedulingConfigs" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/admin/hailing/scheduling_configs</span>
      </div>
      <div><span class="name">List scheduling configss</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/CreateSchedulingConfigs" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/admin/hailing/scheduling_configs</span>
      </div>
      <div><span class="name">Create new scheduling config</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdateSchedulingConfig" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/admin/hailing/scheduling_configs/{id}</span>
      </div>
      <div><span class="name">Update a scheduling config</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>We also introduced an endpoint that allows inspecting the current ranking for drivers for a given tour:</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/TourDriverRanking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/tours/{id}/ranked_drivers</span>
      </div>
      <div><span class="name">Driver Ranking</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>Once the extension is enabled you can also configure it interactively through our admin dashboard.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced an extension giving you the ability to roll out pickable tours gradually to available drivers based on their distance from the first stop.]]></summary></entry><entry><title type="html">Preferred drivers on tours can be modified while en route</title><link href="https://docs.motiontools.io/announcements/changelog/2025/04/16/update-preferred-drivers-en-route.html" rel="alternate" type="text/html" title="Preferred drivers on tours can be modified while en route" /><published>2025-04-16T00:00:00+00:00</published><updated>2025-04-16T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/04/16/update-preferred-drivers-en-route</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/04/16/update-preferred-drivers-en-route.html"><![CDATA[<p>We now allow updating the list of preferred drivers on tours that are already en route.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/TourAddPreferredDrivers" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/tours/{id}/preferred_drivers</span>
      </div>
      <div><span class="name">Set preferred drivers</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We now allow updating the list of preferred drivers on tours that are already en route.]]></summary></entry><entry><title type="html">Collecting packages from a hub</title><link href="https://docs.motiontools.io/announcements/changelog/2025/04/10/collect-packages-from-hub.html" rel="alternate" type="text/html" title="Collecting packages from a hub" /><published>2025-04-10T00:00:00+00:00</published><updated>2025-04-10T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/04/10/collect-packages-from-hub</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/04/10/collect-packages-from-hub.html"><![CDATA[<p>We have introduced a new package flow for picking them up from a hub, skipping delivery via a tour.</p>

<p>If you offer self-pickup of packages at one of your hubs you can now facilitate this process through
our packages product.</p>

<p>You can initiate the flow on packages that are <code class="language-plaintext highlighter-rouge">at_hub</code> or <code class="language-plaintext highlighter-rouge">scheduled_for_delivery</code> by triggering the corresponding
<code class="language-plaintext highlighter-rouge">request_collection</code> transition:</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/TransitionHailingPackage" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/hailing/packages/{id}/transition</span>
      </div>
      <div><span class="name">Perform a transition on a package</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>An eligible package can then be marked as collected using the corresponding endpoint:</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/CollectHailingPackage" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/packages/{id}/collect</span>
      </div>
      <div><span class="name">Mark package as collected</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>Our driver apps were updated accordingly, allowing to utilize this new feature from the package scanner.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced a new package flow for picking them up from a hub, skipping delivery via a tour.]]></summary></entry><entry><title type="html">Package journey now also contains location type</title><link href="https://docs.motiontools.io/announcements/changelog/2025/04/10/location-type-on-package-journey.html" rel="alternate" type="text/html" title="Package journey now also contains location type" /><published>2025-04-10T00:00:00+00:00</published><updated>2025-04-10T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/04/10/location-type-on-package-journey</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/04/10/location-type-on-package-journey.html"><![CDATA[<p>We now include the <code class="language-plaintext highlighter-rouge">location_type</code> on package interaction based properties on the package journey.</p>

<p>This makes it easier to interpret whether a certain event listed is for example a pickup at the origin or at a hub.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ShowPackageJourney" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/hailing/packages/{id}/journey</span>
      </div>
      <div><span class="name">Show package journey</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We now include the location_type on package interaction based properties on the package journey.]]></summary></entry><entry><title type="html">Expanded package tracking details</title><link href="https://docs.motiontools.io/announcements/changelog/2025/04/02/expanded-package-tracking-details.html" rel="alternate" type="text/html" title="Expanded package tracking details" /><published>2025-04-02T00:00:00+00:00</published><updated>2025-04-02T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/04/02/expanded-package-tracking-details</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/04/02/expanded-package-tracking-details.html"><![CDATA[<p>We have extended the information available on the public package tracking API.</p>

<ul>
  <li>When a package is <code class="language-plaintext highlighter-rouge">scheduled_for_delivery</code> or <code class="language-plaintext highlighter-rouge">out_for_delivery</code> we will now include the latest estimated time of arrival for the package dropoff stop at the destination</li>
  <li>We will provide the driver’s approximate current location when they are approaching the package destination dropoff stop and the package is therefore <code class="language-plaintext highlighter-rouge">out_for_delivery</code></li>
  <li>For packages that are <code class="language-plaintext highlighter-rouge">out_for_delivery</code> we will also provide the approximate number of stops for them to reach the package’s destination stop on the tour</li>
</ul>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/TrackPackage" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/hailing/packages/{tracking_code}/tracking</span>
      </div>
      <div><span class="name">Track package</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>Our public package tracking page was adjusted accordingly to reflect this additional information.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have extended the information available on the public package tracking API.]]></summary></entry><entry><title type="html">Custom pickable list sorting algorithms</title><link href="https://docs.motiontools.io/announcements/changelog/2025/03/19/custom-pickable-sorting-algorithm.html" rel="alternate" type="text/html" title="Custom pickable list sorting algorithms" /><published>2025-03-19T00:00:00+00:00</published><updated>2025-03-19T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/03/19/custom-pickable-sorting-algorithm</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/03/19/custom-pickable-sorting-algorithm.html"><![CDATA[<p>We have introduced an extension for providing a custom sorting algorithm to determine
the order pickable tours appear in on the driver app.</p>

<p>When chosen we provide the following variables for the custom algorithm:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">scheduled_in_seconds</code> - How many seconds from now the tour is scheduled</li>
  <li><code class="language-plaintext highlighter-rouge">driver_distance_meters</code> - How far away the viewing driver is from the first stop location</li>
  <li><code class="language-plaintext highlighter-rouge">tour_distance_meters</code> - How long the estimated tour is in meters</li>
</ul>

<p>Using these variables in the custom sorting algorithm can help optimize your operational efficiency
significantly by increasing the likeliness drivers that pick a tour are close to the first stop,
prioritize longer tours or those that are late, or any combination of these, depending on your operational
requirements and optimization targets.</p>

<p>This feature is available as a paid extension via our customer success team - please reach
out to us in case you are interested.</p>

<p>The configuration of the custom sorting algorithm itself can only be changed via our customer success team at 
this time upon your request, however once enabled you can switch it’s usage off and on using the corresponding driver experience
admin API or in our web dashboard.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminShowDriverExperience" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/admin/driver_experience</span>
      </div>
      <div><span class="name">Show Driver Experience Configuration</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminUpdateDriverExperience" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/admin/driver_experience</span>
      </div>
      <div><span class="name">Update Driver Experience Configuration</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced an extension for providing a custom sorting algorithm to determine the order pickable tours appear in on the driver app.]]></summary></entry><entry><title type="html">Unified stop completion timestamps and clock skew compensation</title><link href="https://docs.motiontools.io/announcements/changelog/2025/02/26/clock-skew-and-stop-timestamps.html" rel="alternate" type="text/html" title="Unified stop completion timestamps and clock skew compensation" /><published>2025-02-26T00:00:00+00:00</published><updated>2025-02-26T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/02/26/clock-skew-and-stop-timestamps</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/02/26/clock-skew-and-stop-timestamps.html"><![CDATA[<p>We have made adjustments to unify the stop arrival, completion and failure timestamps, as well as the events history. We have also
adjusted our apps to compensate client-side clock skew.</p>

<p>We are tracking <code class="language-plaintext highlighter-rouge">arrived_at</code>, <code class="language-plaintext highlighter-rouge">completed_at</code>, and <code class="language-plaintext highlighter-rouge">failed_at</code> timestamps on stops, as well as keeping a separate events history.
So far, there could be discrepancies between the individual timestamps of these events between the events history and the dedicated
timestamps - we have adjusted our stop completion logic to keep those aligned so the timestamps will always match.</p>

<p>We have also made adjustments to the completion of grouped stops, where we now ensure the corresponding grouped stops will also
have the same timestamps throughout, matching those on the initial completed grouped stop.</p>

<p>Additionally our driver apps now handle clock skew in a better way - if the clock on the device of a driver is
incorrect, so far the resulting stop timestamps could be wrong from the actual time the corresponding arrival or completion events occured, 
both in offline as well as online stop completion. We will now adjust those timestamps according to the real time based on the delta of
the driver’s device clock to the actual time.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have made adjustments to unify the stop arrival, completion and failure timestamps, as well as the events history. We have also adjusted our apps to compensate client-side clock skew.]]></summary></entry><entry><title type="html">Permission indication for removing packages from a tour</title><link href="https://docs.motiontools.io/announcements/changelog/2025/02/26/permission-indication-for-removing-packages-from-tour.html" rel="alternate" type="text/html" title="Permission indication for removing packages from a tour" /><published>2025-02-26T00:00:00+00:00</published><updated>2025-02-26T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/02/26/permission-indication-for-removing-packages-from-tour</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/02/26/permission-indication-for-removing-packages-from-tour.html"><![CDATA[<p>We now indicate the permission to remove a package from a tour on the package payload.</p>

<p>You can find the flag in <code class="language-plaintext highlighter-rouge">permissions.removable</code> on the package response payload, making it easier to figure
out whether the operation to remove a package can be succesfully called.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ListHailingPackages" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/hailing/packages</span>
      </div>
      <div><span class="name">List packages</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/RemovePackagesFromExistingTour" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">delete</span>
        <span class="path">/api/hailing/tours/{tour_id}/packages</span>
      </div>
      <div><span class="name">Remove packages from a tour</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We now indicate the permission to remove a package from a tour on the package payload.]]></summary></entry><entry><title type="html">Adjusted indication for ability to remove package from tour</title><link href="https://docs.motiontools.io/announcements/deprecations/2025/02/26/package-lookup-removal-permissions.html" rel="alternate" type="text/html" title="Adjusted indication for ability to remove package from tour" /><published>2025-02-26T00:00:00+00:00</published><updated>2025-02-26T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/deprecations/2025/02/26/package-lookup-removal-permissions</id><content type="html" xml:base="https://docs.motiontools.io/announcements/deprecations/2025/02/26/package-lookup-removal-permissions.html"><![CDATA[<p>On the package lookup endpoint we are renaming the <code class="language-plaintext highlighter-rouge">removable_from_dropoff_tour</code> permission indicator
to the standardized <code class="language-plaintext highlighter-rouge">permissions.removable</code> property.</p>

<p>We normally indicate granular permissions for specific interactions in the <code class="language-plaintext highlighter-rouge">permissions</code> object on responses. While
the permission to remove a certain package was already indicated, it doesn’t only apply to dropoff tours, and wasn’t
in the right namespace to ease API consumption, therefore we are replacing it with this new standardized property.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/LookupPackage" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/packages/lookup</span>
      </div>
      <div><span class="name">Lookup package by shortcode or external label</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Deprecations" /><summary type="html"><![CDATA[On the package lookup endpoint we are renaming the removable_from_dropoff_tour permission indicator to the standardized permissions.removable property.]]></summary></entry><entry><title type="html">Force-ending a tour marks packages as delivered</title><link href="https://docs.motiontools.io/announcements/changelog/2025/02/20/package-status-after-tour-force-end.html" rel="alternate" type="text/html" title="Force-ending a tour marks packages as delivered" /><published>2025-02-20T00:00:00+00:00</published><updated>2025-02-20T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/02/20/package-status-after-tour-force-end</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/02/20/package-status-after-tour-force-end.html"><![CDATA[<p>When force-ending a tour a package is currently on in the status <code class="language-plaintext highlighter-rouge">scheduled_for_delivery</code> we will now mark this package as <code class="language-plaintext highlighter-rouge">delivered</code>.</p>

<p>Before, such packages were being moved back into <code class="language-plaintext highlighter-rouge">at_hub</code> status the tour was originating from but this behaviour didn’t make
sense in case of the force-ending of a tour as it is meant for <strong>completing</strong> the tour without the driver’s interaction.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ForceEndBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/bookings/{booking_id}/force_end</span>
      </div>
      <div><span class="name">Force end a booking or a tour</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[When force-ending a tour a package is currently on in the status scheduled_for_delivery we will now mark this package as delivered.]]></summary></entry><entry><title type="html">Introducing phone number masking</title><link href="https://docs.motiontools.io/announcements/changelog/2025/02/12/masked-communication.html" rel="alternate" type="text/html" title="Introducing phone number masking" /><published>2025-02-12T00:00:00+00:00</published><updated>2025-02-12T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/02/12/masked-communication</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/02/12/masked-communication.html"><![CDATA[<p>We have introduced the masked communication extension, which allows drivers to call
customers without revealing the real customer or driver phone number to either party.</p>

<p>The feature relies solely on the phone number attached to the currently active stop
of a tour, which can be set either on booking or individual stop creation or by 
updating the stop contact details via the dedicated API endpoint or from our web dashboard.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdateStopContact" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/stops/{stop_id}/contact</span>
      </div>
      <div><span class="name">Update Contact Details</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>When a driver chooses to call the stored stop phone number and the feature is enabled
they will instead call a dedicated phone number specific to your tenant, and we will proxy
the call to the final destination defined on the stop. The customer will see the call coming in from your 
tenant-wide phone number, and once connected the driver and customer are able to discuss
delivery details via phone without revealing each other’s real phone numbers.</p>

<p>We have also included additional phone number sanitization and normalization rules
which fix many common errors in the phone numbers provided by users, increasing successful phone
connection percentages, and therefore speed to reach the stop, significantly.</p>

<p>These features are available as a paid extension via our customer success team - please reach
out to us in case you are interested.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced the masked communication extension, which allows drivers to call customers without revealing the real customer or driver phone number to either party.]]></summary></entry><entry><title type="html">Improvements to places filtering</title><link href="https://docs.motiontools.io/announcements/changelog/2025/01/30/improved-place-filters.html" rel="alternate" type="text/html" title="Improvements to places filtering" /><published>2025-01-30T00:00:00+00:00</published><updated>2025-01-30T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/01/30/improved-place-filters</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/01/30/improved-place-filters.html"><![CDATA[<p>We have introduced the ability to request customer and admin / tenant places together
in the places list.</p>

<p>So far, you were only able to either retrieve tenant-wide places or places for specific
customer IDs. We have now introduced additional options to this filter:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">customers_only</code> - will list only customer places, but for any customer</li>
  <li><code class="language-plaintext highlighter-rouge">include_customers</code> - will list tenant-wide places alongside customer-specific places</li>
</ul>

<p>Additionally, when making requests as an admin we will now show some details about
the customer user account for customer places in the corresponding API responses.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ListPlaces" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/places</span>
      </div>
      <div><span class="name">List all places</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ShowPlace" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/places/{id}</span>
      </div>
      <div><span class="name">Show a place</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>Our web dashboard has been adjusted accordingly to support these new options.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced the ability to request customer and admin / tenant places together in the places list.]]></summary></entry><entry><title type="html">Introducing driver experience configuration</title><link href="https://docs.motiontools.io/announcements/changelog/2025/01/15/introducing-driver-experience-configuration.html" rel="alternate" type="text/html" title="Introducing driver experience configuration" /><published>2025-01-15T00:00:00+00:00</published><updated>2025-01-15T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/01/15/introducing-driver-experience-configuration</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/01/15/introducing-driver-experience-configuration.html"><![CDATA[<p>We are extending the self-serving configurability of the driver experience in our apps.</p>

<p>To facilitate this we have introduced a new driver experience API. The new API allows you
to adjust the following behaviour in our driver app:</p>

<ul>
  <li>The field to sort pickable tours by - either by <code class="language-plaintext highlighter-rouge">scheduled_at</code> or by the distance from the driver’s location</li>
  <li>The sorting direction of the pickable tours list</li>
  <li>The maximum number of results to show in the pickable tours list</li>
  <li>The maximum distance a driver can have from their current location to the first stop of a tour in the pickable list</li>
</ul>

<p>You can use these new features to optimize the way tours are shown to drivers in a way best suitable to your
business model, operations and driver availability.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminShowDriverExperience" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/admin/driver_experience</span>
      </div>
      <div><span class="name">Show Driver Experience Configuration</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminUpdateDriverExperience" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/admin/driver_experience</span>
      </div>
      <div><span class="name">Update Driver Experience Configuration</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>A corresponding UI based configuration is also available in our admin dashboard.</p>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We are extending the self-serving configurability of the driver experience in our apps.]]></summary></entry><entry><title type="html">Removal of hailing_booking.* webhooks</title><link href="https://docs.motiontools.io/announcements/deprecations/2025/01/15/removal-of-hailing_booking-webhook-namespace.html" rel="alternate" type="text/html" title="Removal of hailing_booking.* webhooks" /><published>2025-01-15T00:00:00+00:00</published><updated>2025-01-15T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/deprecations/2025/01/15/removal-of-hailing_booking-webhook-namespace</id><content type="html" xml:base="https://docs.motiontools.io/announcements/deprecations/2025/01/15/removal-of-hailing_booking-webhook-namespace.html"><![CDATA[<p>Due to the ongoing split between bookings and tours, we are deprecating a wide range of webhook events that were shared between
both bookings and tours in the past, replacing them with booking and tour specific replacements where suitable.</p>

<p>In early 2024 we have changed the behaviour of our platform to make the distinction between bookings and tours clearer - bookings represent
customer demand, while tours are responsible for the (optionally optimized) execution of such bookings by drivers. As a consequence of this,
since then drivers cannot directly accept regular bookings anymore, with wide-ranging consequences to the events and flow a booking and a tour
can have.</p>

<p>So far, many of our webhook events were shared between bookings and tours however, in the <code class="language-plaintext highlighter-rouge">hailing_booking.*</code> namespace. We are replacing these
with dedicated events that more closely reflect the actual possibilities and lifecycles of their corresponding data models.</p>

<p>Please update all your webhook receiving endpoints and configurations accordingly to utilize the new events instead:</p>

<h4 id="booking-events">Booking events</h4>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.created" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.created</span>
      </div>
      <div><span class="name">Published when a new booking has been created</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.etas_recalculated" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.etas_recalculated</span>
      </div>
      <div><span class="name">Published when the ETAs for the booking's stops have been recalculated.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.modified" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.modified</span>
      </div>
      <div><span class="name">Published when some part of booking is modified, e.g. when stops are changed.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.route_changed" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.route_changed</span>
      </div>
      <div><span class="name">Published when the route of a booking has changed, i.e. by adding or removing stops, changing
their locations, changing their order and so on.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.booking.transition" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">booking.transition</span>
      </div>
      <div><span class="name">Indicates a change of status of a booking.</span></div>
    </div>
  </a>
</div>

<h4 id="tour-events">Tour events</h4>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.active_status_changed" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.active_status_changed</span>
      </div>
      <div><span class="name">Notifies drivers about change of active status of a tour.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.created" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.created</span>
      </div>
      <div><span class="name">Published when a new tour has been created</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.driver_location_updated" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.driver_location_updated</span>
      </div>
      <div><span class="name">Published when a driver sent an updated GPS location that affects an ongoing tour.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.etas_recalculated" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.etas_recalculated</span>
      </div>
      <div><span class="name">Published when the ETAs for the tour's stops have been recalculated.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.force_assigned" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.force_assigned</span>
      </div>
      <div><span class="name">Notifies about a tour being forcefully assigned to a driver.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.force_unassigned" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.force_unassigned</span>
      </div>
      <div><span class="name">Notifies about tour being forcefully un-assigned from a driver.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.modified" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.modified</span>
      </div>
      <div><span class="name">Published when some part of the tour is modified, e.g. when stops are changed.

For **drivers** it's only published while the booking is in `en_route` state.

When the tour doesn't have a driver yet, then it's published to the service area drivers channel.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.route_changed" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.route_changed</span>
      </div>
      <div><span class="name">Published when the route of a tour has changed, i.e. by adding or removing stops, changing
their locations, changing their order and so on.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.stats_updated" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.stats_updated</span>
      </div>
      <div><span class="name">Published when the tour's statistic or the route estimate gets changed.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.stop_transition" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.stop_transition</span>
      </div>
      <div><span class="name">Indicates a change of status for a specific stop of a tour.</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/webhook.tour.transition" data-tooltip="Open webhook documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">Webhook</span>
        <span class="path">tour.transition</span>
      </div>
      <div><span class="name">Indicates a change of status of a tour.</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Deprecations" /><summary type="html"><![CDATA[Due to the ongoing split between bookings and tours, we are deprecating a wide range of webhook events that were shared between both bookings and tours in the past, replacing them with booking and tour specific replacements where suitable.]]></summary></entry><entry><title type="html">Automatic arrival and geofencing configuration enhancements</title><link href="https://docs.motiontools.io/announcements/changelog/2025/01/08/geofencing-enhancements-and-auto-arrival.html" rel="alternate" type="text/html" title="Automatic arrival and geofencing configuration enhancements" /><published>2025-01-08T00:00:00+00:00</published><updated>2025-01-08T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/01/08/geofencing-enhancements-and-auto-arrival</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/01/08/geofencing-enhancements-and-auto-arrival.html"><![CDATA[<p>We have extended our geofencing capabilities around the arrival at stops.</p>

<p>So far admins already had the ability to set an optional <code class="language-plaintext highlighter-rouge">maximum_driver_distance_meters</code> on stops when
creating bookings, inserting custom stops into bookings or tours, or by updating them. When set a driver
is prohibited to mark a stop as arrived when outside of the specified aerial distance from the stop location.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/CreateHailingBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/bookings</span>
      </div>
      <div><span class="name">Create a Booking</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/InsertCustomStopIntoExistingBooking" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/bookings/{booking_id}/stops</span>
      </div>
      <div><span class="name">Insert custom stop into existing booking</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/InsertCustomStopIntoExistingTour" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/hailing/tours/{tour_id}/stops</span>
      </div>
      <div><span class="name">Insert custom stop into existing tour</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdateStopProperties" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/stops/{stop_id}/properties</span>
      </div>
      <div><span class="name">Update Stop Properties</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>We have extended these functionalities with additional features:</p>

<h4 id="automatic-arrival-at-stop">Automatic arrival at stop</h4>

<p>In addition to the <code class="language-plaintext highlighter-rouge">maximum_driver_distance_meters</code> we now also allow defining an <code class="language-plaintext highlighter-rouge">auto_arrival_distance_meters</code>
on the same endpoints. When set the driver app will automatically mark the stop as arrived when the driver enters
the given radius from the stop location.</p>

<h4 id="defaults-from-booking-and-tour-services">Defaults from booking and tour services</h4>

<p>Additionally to the manual passing or setting of these values via the API we now also allow defining defaults
for both <code class="language-plaintext highlighter-rouge">maximum_driver_distance_meters</code> as well as <code class="language-plaintext highlighter-rouge">auto_arrival_distance_meters</code> on the booking and tour services
for each stop type.</p>

<p>When configured stops where the corresponding service applies will automatically be created with these defaults applied.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminCreateHailingService" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/admin/hailing/services</span>
      </div>
      <div><span class="name">Create a service</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/AdminUpdateHailingService" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/admin/hailing/services/{id}</span>
      </div>
      <div><span class="name">Update a service</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have extended our geofencing capabilities around the arrival at stops.]]></summary></entry><entry><title type="html">Support for dedicated billing e-mail in invoice address</title><link href="https://docs.motiontools.io/announcements/changelog/2025/01/08/invoice-address-billing-email.html" rel="alternate" type="text/html" title="Support for dedicated billing e-mail in invoice address" /><published>2025-01-08T00:00:00+00:00</published><updated>2025-01-08T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/01/08/invoice-address-billing-email</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/01/08/invoice-address-billing-email.html"><![CDATA[<p>We have introduced a new, optional <code class="language-plaintext highlighter-rouge">billing_email</code> field on our invoice address account feature.</p>

<p>When provided booking receipt e-mails sent by our platform will instead be delivered to this dedicated address
instead of the user’s default account e-mail.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/ShowInvoiceAddress" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">get</span>
        <span class="path">/api/user/invoice_address</span>
      </div>
      <div><span class="name">Show Invoice Address</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdateInvoiceAddress" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/user/invoice_address</span>
      </div>
      <div><span class="name">Update Invoice Address</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdateInvoiceAddressAsManagingUser" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/users/{id}/invoice_address</span>
      </div>
      <div><span class="name">Update Invoice Address as Admin/Org. Manager</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have introduced a new, optional billing_email field on our invoice address account feature.]]></summary></entry><entry><title type="html">Loosened restrictions for updating additional booking, tour and stop information</title><link href="https://docs.motiontools.io/announcements/changelog/2025/01/08/loosened-additional-information-editing-restrictions.html" rel="alternate" type="text/html" title="Loosened restrictions for updating additional booking, tour and stop information" /><published>2025-01-08T00:00:00+00:00</published><updated>2025-01-08T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/changelog/2025/01/08/loosened-additional-information-editing-restrictions</id><content type="html" xml:base="https://docs.motiontools.io/announcements/changelog/2025/01/08/loosened-additional-information-editing-restrictions.html"><![CDATA[<p>We have loosened the restrictions for updating the additional information of bookings, tours and stops
and now also allow updates even after they are completed.</p>

<p>The corresponding endpoints allow for providing additional information to drivers, changing the tour name 
as well as attaching order images and documents. Especially the latter can be particularily helpful
when additional order documentation is prepared after completion and hence can now be easily attached
to the corresponding stop, booking or tour.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/EditBookingAdditionalInformation" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/hailing/bookings/{booking_id}/additional_information</span>
      </div>
      <div><span class="name">Edit booking's additional information</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdateStopAdditionalInformation" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/stops/{stop_id}/additional_information</span>
      </div>
      <div><span class="name">Update Additional Information</span></div>
    </div>
  </a>
</div>]]></content><author><name></name></author><category term="Changelog" /><summary type="html"><![CDATA[We have loosened the restrictions for updating the additional information of bookings, tours and stops and now also allow updates even after they are completed.]]></summary></entry><entry><title type="html">Simplified stop update routes</title><link href="https://docs.motiontools.io/announcements/deprecations/2024/08/13/simplified-stop-update-routes.html" rel="alternate" type="text/html" title="Simplified stop update routes" /><published>2024-08-13T00:00:00+00:00</published><updated>2024-08-13T00:00:00+00:00</updated><id>https://docs.motiontools.io/announcements/deprecations/2024/08/13/simplified-stop-update-routes</id><content type="html" xml:base="https://docs.motiontools.io/announcements/deprecations/2024/08/13/simplified-stop-update-routes.html"><![CDATA[<p>We have added simplified routes for granular stop data editing endpoints.</p>

<p>Historically, to update a stop’s information you had to also supply the corresponding booking ID, for example
at <code class="language-plaintext highlighter-rouge">/api/hailing/bookings/:booking_id/stops/:stop_id/metadata</code>. Due to the ongoing split between bookings and tours 
you would also in the future have needed to call different endpoints depending on whether it’s a tour or booking stop.</p>

<p>To simplify this, we have removed the booking and tour namespacing from endpoints related to editing stop data, linked below.
All of the endpoints now follow the route schema <code class="language-plaintext highlighter-rouge">/api/stops/:id/[endpoint]</code>.</p>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdateStopAdditionalInformation" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/stops/{stop_id}/additional_information</span>
      </div>
      <div><span class="name">Update Additional Information</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdateStopArrivalTimes" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/stops/{stop_id}/arrival_times</span>
      </div>
      <div><span class="name">Update Arrival Times</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdateStopContact" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/stops/{stop_id}/contact</span>
      </div>
      <div><span class="name">Update Contact Details</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdateHailingStopContent" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/stops/{stop_id}/content</span>
      </div>
      <div><span class="name">Update Custom Content</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/HailingCompleteStop" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/stops/{stop_id}/complete</span>
      </div>
      <div><span class="name">Complete stop</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/HailingFailStop" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">post</span>
        <span class="path">/api/stops/{stop_id}/fail</span>
      </div>
      <div><span class="name">Fail stop</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdateStopLocation" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/stops/{stop_id}/location</span>
      </div>
      <div><span class="name">Update Location</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/OverwriteStopMetadata" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/stops/{stop_id}/metadata</span>
      </div>
      <div><span class="name">Update Stop's Metadata</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/PatchStopMetadata" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/stops/{stop_id}/metadata</span>
      </div>
      <div><span class="name">Partially Update Stop's Metadata</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/UpdateStopProperties" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">patch</span>
        <span class="path">/api/stops/{stop_id}/properties</span>
      </div>
      <div><span class="name">Update Stop Properties</span></div>
    </div>
  </a>
</div>

<div class="openapi-endpoint">
  <a href="https://docs.motiontools.io/#operation/TransitionHailingBookingStop" data-tooltip="Open endpoint documentation in OpenAPI">
    <div class="grid">
      <div>
        <span class="request-method">put</span>
        <span class="path">/api/stops/{stop_id}/transition</span>
      </div>
      <div><span class="name">Perform Stop Transition</span></div>
    </div>
  </a>
</div>

<p><br /></p>

<p>The old routes remain supported for the time being but will be removed in the future.</p>]]></content><author><name></name></author><category term="Deprecations" /><summary type="html"><![CDATA[We have added simplified routes for granular stop data editing endpoints.]]></summary></entry></feed>