Skip to main content

How to update a partner appointment with trip

This document explains how to update an existing appointment and its pickup/dropoff trips using the Partner v2 endpoint.

Use this endpoint when the request includes a pickup or dropoff trip operation. If you only need to update appointment fields and do not want to create, update, or delete a trip, use the standard appointment update API instead.

To update an appointment with trip, you first need your credentials. If you don't already have one, head over to the Authentication and Authorization page to see how you can request credentials from us.

Request

HTTP request

PUT  https://api.mykaarma.com/appointment/v2/dealers/{dealerUuid}/partner-appointments-with-trip/{sarUUID}
?enforcePreferences={enforcePreferences}

Parameters

Path parameters

Parameter NameValueDescriptionRequired
dealerUuidStringUnique identifier of the dealerYes
sarUUIDStringUUID of the service appointment request to updateYes

Query parameters

Parameter NameValueDescriptionRequired
enforcePreferencesBooleanWhether to enforce dealer appointment preferences during updateNo

Authorization

ScopeLevelDescription
appointment.createDealerAuthorises client to update appointment and trip data for the provided dealer

Request Body

The request body is an UpdateAppointmentWithTripPartnerRequest. It uses the same flat partner contract as create, with trip UUIDs carried inside the trip objects:

Property NameValueDescriptionRequired
customerUUIDStringUnique token assigned to the customer in myKaarmaYes
appointmentDateTimeStringAppointment date-time in ISO-8601 format with timezone offsetYes
dealerDepartmentUUIDStringUUID of the dealer departmentYes
appointmentInformationObjectAppointment details to saveYes
vehicleInformationObjectVehicle details for the appointmentNo
pickupTripInformationObjectPickup trip create/update/delete instruction. The pickup trip UUID is sent as pickupTripInformation.eventUUID.Conditional
dropTripInformationObjectDropoff trip create/update/delete instruction. The dropoff trip UUID is sent as dropTripInformation.eventUUID.Conditional
pickupDeliveryTripMetadataObjectMetadata such as subTransportOptionRequest. Do not send trip UUIDs in this object for partner update.No
requesterUserUUIDStringUUID of the user making the request. Passed to the downstream PnD service, which requires it whenever source is not WEB.Conditional — required unless source is WEB
sourceStringPlatform source of the request. If WEB, downstream validations (including the requesterUserUUID requirement) are relaxed. Common values: WEB, DEALER_APP.No
appointmentMetaDataObjectMetadata of the appointmentNo
localeStringCustomer's language preference, for example en-US or fr-CANo

At least one trip operation must be present. Appointment-only updates are not supported by this endpoint.

To find the current pickup and dropoff trip UUIDs for an appointment, call get partner trips for an appointment before update.

For the full appointment, vehicle, and sub-transport field descriptions, see create a partner appointment with trip. The update endpoint uses the same field names.

appointmentDateTime

Send the updated appointment date and time as a single top-level value with timezone offset, for example:

2026-06-03T11:00:00-0700

The API uses this value to update the appointment and to derive trip appointment timing where required.

How Trip Operations Are Decided

For update, eventUUID is the trip identifier. A trip object with only eventUUID is treated as a delete marker.

Trip objecteventUUIDOther trip fieldsOperation
AbsentNoNoNo operation
PresentNoYesCreate trip
PresentYesNoDelete trip
PresentYesYesUpdate trip

For pickup, use:

pickupTripInformation.eventUUID

For dropoff, use:

dropTripInformation.eventUUID

Do not send top-level tripUUID or dropoffTripUUID in partner requests.

Other trip fields include values such as rideType, rideTime, mustStartBy, address, location, driver, loaner, and optional field data. For delete, send only the relevant eventUUID.

pickupTripInformation

Use pickupTripInformation for the pickup trip.

Property NameValueDescriptionRequired
eventUUIDStringExisting pickup trip UUID. Required for pickup update and pickup delete. Omit for pickup create.Conditional
rideTypeStringMust be PICKUP_VEHICLE when a pickup body is sent. If omitted during pickup create/update, the API defaults it to PICKUP_VEHICLE.No
mustStartByStringLatest start time for the pickup trip in ISO-8601 format with timezone offsetNo
originAddressStringPickup origin addressNo
originLocationLatDoubleLatitude of the pickup originNo
originLocationLonDoubleLongitude of the pickup originNo
destinationAddressStringPickup destination addressNo
destLocationLatDoubleLatitude of the pickup destinationNo
destLocationLonDoubleLongitude of the pickup destinationNo
optionalFieldsMap<String, String>Additional optional key-value pairsNo

For pickup delete, send:

{
"pickupTripInformation": {
"eventUUID": "{{pickup_trip_uuid}}"
}
}

dropTripInformation

Use dropTripInformation for the linked dropoff trip.

Property NameValueDescriptionRequired
eventUUIDStringExisting dropoff trip UUID. Required for dropoff update and dropoff delete. Omit for dropoff create.Conditional
rideTypeStringMust be DROPOFF_VEHICLE when a dropoff body is sent. If omitted during dropoff create/update, the API defaults it to DROPOFF_VEHICLE.No
rideTimeStringScheduled time for the dropoff trip in ISO-8601 format with timezone offsetYes, when creating or updating dropoff
mustStartByStringLatest start time for the dropoff trip in ISO-8601 format with timezone offsetNo
originAddressStringDropoff origin addressNo
originLocationLatDoubleLatitude of the dropoff originNo
originLocationLonDoubleLongitude of the dropoff originNo
optionalFieldsMap<String, String>Additional optional key-value pairsNo

For dropoff delete, send:

{
"dropTripInformation": {
"eventUUID": "{{dropoff_trip_uuid}}"
}
}

Operation Case Table

In the table below:

  • Pickup UUID means pickupTripInformation.eventUUID.
  • Pickup Body means pickupTripInformation contains operational fields other than eventUUID.
  • Dropoff UUID means dropTripInformation.eventUUID.
  • Dropoff Body means dropTripInformation contains operational fields other than eventUUID.
#Pickup UUIDPickup BodyDropoff UUIDDropoff BodyResult
1NoNoNoNoInvalid. No trip operation specified.
2NoNoNoYesCreate dropoff for the pickup already mapped to the appointment. Invalid if no mapped pickup exists or a dropoff already exists.
3NoNoYesNoDelete dropoff if it is linked to the appointment's mapped pickup.
4NoNoYesYesUpdate dropoff if it is linked to the appointment's mapped pickup.
5YesNoNoNoDelete pickup and cascade delete any linked dropoff.
6YesNoNoYesProcessed as pickup delete. Linked dropoff is cascade deleted; dropoff body is ignored. Prefer not to send this shape.
7YesNoYesNoDelete pickup and delete the linked dropoff.
8YesNoYesYesProcessed as pickup delete. Linked dropoff is cascade deleted; dropoff body is ignored. Prefer not to send this shape.
9NoYesNoNoCreate pickup. Valid only if the appointment does not already have a mapped pickup.
10NoYesNoYesCreate pickup and create linked dropoff. Valid only if the appointment does not already have a mapped pickup.
11NoYesYesNoInvalid. Cannot reference an existing dropoff while creating a new pickup.
12NoYesYesYesInvalid. Cannot update an existing dropoff while creating a new pickup.
13YesYesNoNoUpdate pickup.
14YesYesNoYesUpdate pickup and create linked dropoff.
15YesYesYesNoUpdate pickup and delete linked dropoff.
16YesYesYesYesUpdate pickup and update linked dropoff.

Validation Rules

  • Existing pickup eventUUID must match the pickup trip mapped to the appointment.
  • Existing dropoff eventUUID must be linked to the same pickup trip.
  • Creating a dropoff fails if a dropoff is already linked to that pickup.
  • Creating a pickup fails if the appointment already has a mapped pickup.
  • If pickup is deleted, the linked dropoff is deleted as part of the same operation.
  • pickupTripInformation.rideType must be PICKUP_VEHICLE when a pickup body is sent.
  • dropTripInformation.rideType must be DROPOFF_VEHICLE when a dropoff body is sent.
  • dropTripInformation.rideTime is required when dropTripInformation represents a dropoff create or update.
  • If pickup or dropoff trip data is present, the appointment transport option must be Pickup and Delivery. When the transport option is omitted, the API normalizes it to Pickup and Delivery.

Common Payload Patterns

Update pickup only

{
"customerUUID": "{{customer_uuid}}",
"appointmentDateTime": "2026-06-03T11:00:00-0700",
"dealerDepartmentUUID": "{{department_uuid}}",
"source": "WEB",
"pickupTripInformation": {
"eventUUID": "{{pickup_trip_uuid}}",
"rideType": "PICKUP_VEHICLE",
"mustStartBy": "2026-06-03T10:30:00-0700",
"originAddress": "123 Customer Street, Long Beach, CA"
},
"appointmentInformation": {
"customerAppointmentPreference": {
"emailConfirmation": true,
"textConfirmation": true
}
}
}

Update pickup and create dropoff

{
"customerUUID": "{{customer_uuid}}",
"appointmentDateTime": "2026-06-03T11:00:00-0700",
"dealerDepartmentUUID": "{{department_uuid}}",
"source": "WEB",
"pickupTripInformation": {
"eventUUID": "{{pickup_trip_uuid}}",
"rideType": "PICKUP_VEHICLE",
"mustStartBy": "2026-06-03T10:30:00-0700"
},
"dropTripInformation": {
"rideType": "DROPOFF_VEHICLE",
"rideTime": "2026-06-06T15:00:00-0700",
"mustStartBy": "2026-06-06T14:45:00-0700",
"originAddress": "100 W Broadway Suite 300, Long Beach, CA 90802, USA",
"originLocationLat": 33.7689325,
"originLocationLon": -118.1930229
},
"appointmentInformation": {
"customerAppointmentPreference": {
"emailConfirmation": true,
"textConfirmation": true
}
}
}

Update pickup and update dropoff

Send both pickupTripInformation and dropTripInformation with their existing eventUUIDs plus at least one operational field on each side.

{
"customerUUID": "{{customer_uuid}}",
"appointmentDateTime": "2026-06-03T11:00:00-0700",
"dealerDepartmentUUID": "{{department_uuid}}",
"source": "WEB",
"pickupTripInformation": {
"eventUUID": "{{pickup_trip_uuid}}",
"rideType": "PICKUP_VEHICLE",
"mustStartBy": "2026-06-03T10:30:00-0700"
},
"dropTripInformation": {
"eventUUID": "{{dropoff_trip_uuid}}",
"rideType": "DROPOFF_VEHICLE",
"rideTime": "2026-06-06T16:00:00-0700",
"mustStartBy": "2026-06-06T15:45:00-0700"
},
"appointmentInformation": {
"customerAppointmentPreference": {
"emailConfirmation": true,
"textConfirmation": true
}
}
}

Dropoff-only update

Use this when the appointment already has a mapped pickup and only the dropoff is changing.

{
"customerUUID": "{{customer_uuid}}",
"appointmentDateTime": "2026-06-03T11:00:00-0700",
"dealerDepartmentUUID": "{{department_uuid}}",
"source": "WEB",
"dropTripInformation": {
"eventUUID": "{{dropoff_trip_uuid}}",
"rideType": "DROPOFF_VEHICLE",
"rideTime": "2026-06-06T16:00:00-0700",
"mustStartBy": "2026-06-06T15:45:00-0700"
},
"appointmentInformation": {
"customerAppointmentPreference": {
"emailConfirmation": true,
"textConfirmation": true
}
}
}

Dropoff-only create

Use this when the appointment already has a mapped pickup and you want to add a linked dropoff.

{
"customerUUID": "{{customer_uuid}}",
"appointmentDateTime": "2026-06-03T11:00:00-0700",
"dealerDepartmentUUID": "{{department_uuid}}",
"source": "WEB",
"dropTripInformation": {
"rideType": "DROPOFF_VEHICLE",
"rideTime": "2026-06-06T15:00:00-0700",
"mustStartBy": "2026-06-06T14:45:00-0700"
},
"appointmentInformation": {
"customerAppointmentPreference": {
"emailConfirmation": true,
"textConfirmation": true
}
}
}

Create pickup and create dropoff

Use this when the appointment has no mapped pickup yet and you want to create both a new pickup and a linked dropoff in a single call. Neither side sends an eventUUID.

{
"customerUUID": "{{customer_uuid}}",
"appointmentDateTime": "2026-06-03T11:00:00-0700",
"dealerDepartmentUUID": "{{department_uuid}}",
"source": "WEB",
"pickupTripInformation": {
"rideType": "PICKUP_VEHICLE",
"mustStartBy": "2026-06-03T10:30:00-0700",
"originAddress": "123 Customer Street, Long Beach, CA"
},
"dropTripInformation": {
"rideType": "DROPOFF_VEHICLE",
"rideTime": "2026-06-06T15:00:00-0700",
"mustStartBy": "2026-06-06T14:45:00-0700"
},
"appointmentInformation": {
"customerAppointmentPreference": {
"emailConfirmation": true,
"textConfirmation": true
}
}
}

Delete dropoff only

Send dropTripInformation with only eventUUID.

{
"customerUUID": "{{customer_uuid}}",
"appointmentDateTime": "2026-06-03T11:00:00-0700",
"dealerDepartmentUUID": "{{department_uuid}}",
"source": "WEB",
"dropTripInformation": {
"eventUUID": "{{dropoff_trip_uuid}}"
},
"appointmentInformation": {
"customerAppointmentPreference": {
"emailConfirmation": true,
"textConfirmation": true
}
}
}

Delete pickup and linked dropoff

Send pickupTripInformation with only the pickup eventUUID. The linked dropoff, if present, is deleted automatically.

{
"customerUUID": "{{customer_uuid}}",
"appointmentDateTime": "2026-06-03T11:00:00-0700",
"dealerDepartmentUUID": "{{department_uuid}}",
"source": "WEB",
"pickupTripInformation": {
"eventUUID": "{{pickup_trip_uuid}}"
},
"appointmentInformation": {
"customerAppointmentPreference": {
"emailConfirmation": true,
"textConfirmation": true
}
}
}

Curl Example

curl --location --request PUT 'https://api.mykaarma.com/appointment/v2/dealers/{{dealer_uuid}}/partner-appointments-with-trip/{{sar_uuid}}' \
--header 'Authorization: Basic {{basic_auth_token}}' \
--header 'Content-Type: application/json' \
--data-raw '{
"customerUUID": "{{customer_uuid}}",
"appointmentDateTime": "2026-06-03T11:00:00-0700",
"dealerDepartmentUUID": "{{department_uuid}}",
"source": "WEB",
"pickupTripInformation": {
"eventUUID": "{{pickup_trip_uuid}}",
"rideType": "PICKUP_VEHICLE",
"mustStartBy": "2026-06-03T10:30:00-0700"
},
"dropTripInformation": {
"rideType": "DROPOFF_VEHICLE",
"rideTime": "2026-06-06T15:00:00-0700",
"mustStartBy": "2026-06-06T14:45:00-0700"
},
"appointmentInformation": {
"customerAppointmentPreference": {
"emailConfirmation": true,
"textConfirmation": true
},
"comments": "",
"internalNotes": "",
"recall": false
}
}'

Response

The response is a SaveAppointmentWithTripResponse object:

Property NameValueDescription
eventUUIDStringUUID of the pickup trip affected by the request
pickupEventUUIDStringAlias for eventUUID, returned for newer partner integrations
dropoffEventUUIDStringUUID of the dropoff trip affected by the request, when applicable
appointmentUUIDStringUUID of the updated appointment
statusCodeIntegerHTTP status code of the response
errorsList<Object>List of errors, if any
warningsList<Object>List of warnings, if any

Response Example

{
"eventUUID": "{{pickup_trip_uuid}}",
"pickupEventUUID": "{{pickup_trip_uuid}}",
"dropoffEventUUID": "{{dropoff_trip_uuid}}",
"appointmentUUID": "{{appointment_uuid}}",
"statusCode": 200,
"errors": null,
"warnings": null
}

Possible Errors

The update API can fail at the authentication layer, the partner request validation layer, the trip-operation validation layer, or the downstream pickup/delivery and appointment-update layers.

Authentication and authorization errors

HTTP StatusError CodeWhen it happens
401UNAUTHORIZEDThe Basic Auth credentials are missing or invalid.
403FORBIDDENThe client does not have the required appointment.create scope at the dealer level for the requested dealer.

Partner request validation errors

These are the explicit validation errors enforced by the partner update endpoint before the downstream update flow runs.

HTTP StatusError CodeError DescriptionWhen it happens
400INVALID_DEALER_UUIDInvalid dealer UUID is provided in the requestdealerUuid path param is blank or invalid.
400INVALID_DEPT_UUIDInvalid dealer department UUID is provided in the requestdealerDepartmentUUID is missing from the request body.
400CUSTOMER_INFO_MISSINGminimum info required to match customer: (FirstName OR LastName) AND At least any one Customer Communication (phone/email) OR (FirstName AND LastName) OR VIN(FirstName OR LastName)customerUUID is missing from the partner request.
400PARTNER_APPOINTMENT_DATETIME_REQUIREDappointmentDateTime is required in the partner appointment requestappointmentDateTime is missing.
400INVALID_APPOINTMENT_INFORMATIONInvalid request. appointmentInformation is blank.appointmentInformation is missing.
400PICKUP_AND_DELIVERY_TRANSPORT_OPTION_REQUIREDPickup and Delivery transport option is required when pickupTripInformation or dropTripInformation is presentappointmentInformation.transportOption is present but not set to PICKUP_AND_DELIVERY.
400PICKUP_RIDE_TYPE_MUST_BE_PICKUP_VEHICLEPickup trip rideType must be PICKUP_VEHICLEpickupTripInformation.rideType is sent with any non-pickup ride type.
400DROPOFF_RIDE_TYPE_MUST_BE_DROPOFF_VEHICLEDropoff trip rideType must be DROPOFF_VEHICLEdropTripInformation.rideType is sent with any non-dropoff ride type.
400DROPOFF_RIDE_TIME_REQUIREDdropTripInformation.rideTime is required for dropoff ride typesdropTripInformation represents a dropoff create or update, but rideTime is missing.
400VALID_CREATOR_USER_UUID_REQUIREDappointmentInformation.creatorUser.uuid is required when source is not WEBsource is not WEB (or is null) and appointmentInformation.creatorUser.uuid is missing or blank.
400LOANER_AND_DROP_CAR_CANNOT_BOTH_BE_TRUEloanerVehicleRequired and isDropCar cannot both be trueAn operational pickupTripInformation or dropTripInformation payload has both loanerVehicleRequired=true and isDropCar=true.
400PRIMARY_AND_SECONDARY_DRIVER_CANNOT_BE_SAMEprimaryDriverUUID and secondaryDriverUUID cannot be the sameAn operational pickupTripInformation or dropTripInformation payload has the same UUID set for primaryDriverUUID and secondaryDriverUUID.

Trip-operation validation errors

After partner request validation passes, the update flow validates whether the pickup and dropoff operation mix is legal for the current appointment.

HTTP StatusError CodeError DescriptionWhen it happens
400NO_OPERATION_SPECIFIEDAt least one trip operation must be specifiedNeither pickup nor dropoff create/update/delete data is present. Appointment-only updates are not supported by this endpoint.
400TRIP_ALREADY_EXISTSTrip already exists for given appointmentThe request tries to create a new pickup trip for an appointment that already has a mapped pickup trip.
400INVALID_DROPOFF_WITH_NEW_PICKUPCannot reference an existing dropoff trip when creating a new pickup tripThe request tries to create a new pickup while referencing an existing dropoff eventUUID.
400DROPOFF_ALREADY_EXISTSDropoff trip already exists for given pickup tripThe request tries to create a new dropoff for a pickup that already has a linked dropoff trip.
400PICKUP_TRIP_NOT_LINKED_TO_APPOINTMENTPickup trip is not linked to the given appointmentThe supplied pickup eventUUID does not match the pickup trip currently mapped to the appointment.
400DROPOFF_TRIP_NOT_LINKED_TO_APPOINTMENTDropoff trip is not linked to the given appointmentThe supplied dropoff eventUUID is not linked to the appointment's mapped pickup trip.

Downstream pickup, dropoff, and appointment-update errors

After the operation shape is validated, the endpoint may still fail while updating the pickup trip, creating/updating/deleting the linked dropoff trip, or updating the appointment itself.

HTTP StatusError CodeWhen it happens
400USER_TOKEN_IS_BLANKsource is not WEB (or is null) and the top-level requesterUserUUID is missing. The downstream PnD service requires requesterUserUUID for non-WEB sources. Typically the partner endpoint also blocks the request upfront with VALID_CREATOR_USER_UUID_REQUIRED when appointmentInformation.creatorUser.uuid is missing — both identity fields must be sent for non-WEB updates.
400MISSING_ASSIGNED_BY_DEALER_ASSOCIATE_UUIDsource is not WEB and appointmentInformation.creatorUser.uuid is missing. The partner endpoint normally catches this upfront with VALID_CREATOR_USER_UUID_REQUIRED; this code surfaces only when the partner-gate check is bypassed.
4xx or 5xxdownstream pickup/delivery service error codeThe pickup/dropoff service rejects the request or fails during the requested create, update, or delete operation.
4xx or 5xxdownstream appointment service error codeThe appointment update succeeds through trip processing but fails when saving the appointment changes.
500INTERNAL_ERROR or INTERNAL_SERVER_ERRORAn unexpected server-side failure occurs while processing the request.

Error response example

{
"eventUUID": null,
"pickupEventUUID": null,
"dropoffEventUUID": null,
"appointmentUUID": null,
"statusCode": 400,
"errors": [
{
"errorCode": "NO_OPERATION_SPECIFIED",
"errorDescription": "At least one trip operation must be specified"
}
],
"warnings": null
}