---
title: "Complete an action item"
method: POST
path: "/orders/{order}/vehicles/{vehicle}/action-items/{action}"
tags: ["Orders"]
---

# Complete an action item

`POST /orders/{order}/vehicles/{vehicle}/action-items/{action}`

## Request

- Base URL: `https://api.ekho.com`
- URL: `https://api.ekho.com/orders/{order}/vehicles/{vehicle}/action-items/{action}`
- Auth: HTTP bearer

Completes one action item on a vehicle and returns the resulting vehicle. The body carries only the fields that action needs, and an action that needs none takes an empty object; there is no partial success.

## Path parameters

- `order` string, required
- `vehicle` string, required
- `action` 'assign-vin' | 'assign-motorcycle-engine-number' | 'mark-production-complete' | 'mark-in-transit-to-buyer' | 'mark-pickup-scheduled' | 'mark-pickup-fulfilled', required: The action item to complete.

## Request body

- CompleteActionItemRequest
  - `vin` string: Vehicle identification number.
  - `engine_number` string: Motorcycle engine number.
  - `estimated_delivery_date` integer: Epoch ms the vehicle is expected to reach the buyer.
  - `vehicle_tracking_reference` string: Carrier tracking number or link.
  - `contact_number` string: A number the buyer can call about the shipment.
  - `company_name` string: Name of the fulfillment company.

## Response `200`

The vehicle as it stands after the action.

- object
  - `data` PurchasedVehicle, required
    - `id` string, required
    - `order_id` string, required: The placed order this vehicle belongs to.
    - `preorder_id` string, nullable, required: The preorder this vehicle was converted from; null when the order was placed directly.
    - `created_at` integer, required: Epoch ms the vehicle was purchased.
    - `updated_at` integer, required: Epoch ms of the last update.
    - `status` 'pending' | 'sales_processing' | 'kick_off_fulfillment' | 'in_fulfillment' | 'fulfilled' | 'canceled', required: Where the order stands, from sales processing through fulfillment.
    - `vin` string, nullable, required
    - `engine_number` string, nullable, required
    - `mco_number` string, nullable, required: Identifier on the Manufacturer's Certificate of Origin. Always null in this version.
    - `catalog_vehicle` CatalogVehicle, required
      - `manufacturer_id` string, nullable, required: Catalog id of the manufacturer that makes the vehicle, and the namespace the other ids are unique beneath.
      - `model_id` string, nullable, required: Catalog id of the model the trim belongs to, carrying the make, model, and year. Null while the vehicle sits outside the catalog.
      - `variant_id` string, nullable, required: Catalog id of the trim. Pass it with `style_id` to name this vehicle on `POST /carts/build-to-order`. Null while the vehicle sits outside the catalog.
      - `style_id` string, nullable, required: Catalog id of the colour style. Pass it with `variant_id` to name this vehicle on `POST /carts/build-to-order`. Null while the vehicle sits outside the catalog.
      - `name` string, required
      - `img_url` string, nullable, required
      - `base_price` number, required: Base price USD of the build, before specs and PG&A.
      - `specs` Spec[], required: The build-defining items configured onto this vehicle.
        - `name` string, required
        - `category` string, nullable, required
        - `sku` string, nullable, required
        - `price` number, required: Price USD as sold. 0 for items included in the base price.
        - `description` string, nullable, required
        - `img_url` string, nullable, required
    - `fulfillment_details` FulfillmentDetails, nullable, required
      - `method` 'pickup' | 'delivery', required
      - `assigned_account_id` string, required: The account performing the handoff (pickup host or shipper).
      - `assigned_account_name` string, nullable, required: Business name of that account. Null when the account is unavailable, and on webhook deliveries.
      - `address` object, nullable, required: Pickup location for pickup, buyer destination for delivery.
        - `line1` string, required
        - `line2` string, nullable, required
        - `city` string, required
        - `state` string, required: Two-letter state code.
        - `zip` string, required
        - `country` string, nullable, required: ISO 3166-1 alpha-2; null implies US.
      - `estimated_delivery_date` integer, nullable, required: Epoch ms the vehicle is expected to reach the buyer.
      - `vehicle_tracking_reference` string, nullable, required: Carrier tracking number or link; null until dispatched.
    - `buyer` VehicleBuyer: Buyer with PII. Present only when requested via `?expand[]=buyer`.
      - `id` string, required: Buyer id, the same handle on every resource.
      - `full_name` string, required
      - `email` string, nullable, required
      - `phone` string, nullable, required
      - `address` BuyerAddress, nullable, required: Buyer address; null when none is on file.
        - `line1` string, required
        - `line2` string, nullable, required
        - `city` string, required
        - `state` string, required: Two-letter state code.
        - `zip` string, required
        - `country` string, nullable, required: ISO 3166-1 alpha-2; null implies US.
      - `consents` Consent[], required: Consent events for this buyer, oldest first. Read the newest row per channel and purpose. An absent pair means do not send, except email + transactional, which needs no consent.
        - `channel` 'sms' | 'email' | 'voice', required
        - `purpose` 'transactional' | 'marketing', required
        - `status` 'granted' | 'revoked', required
        - `occurred_at` integer, required: Epoch ms the buyer granted or withdrew.
        - `disclosure_text` string, nullable, required: The disclosure verbatim, as rendered. Null on a revocation.
        - `source_url` string, nullable, required: Page it was captured on. Null on a revocation.
    - `payments` Payments: Buyer payments. Present only via `?expand[]=payments`, and requires `payments:read`.
      - `status` 'no_payments' | 'reservation_initiated' | 'reservation_paid' | 'downpayment_processing' | 'downpayment_paid' | 'financing_guaranteed' | 'fully_paid' | 'lost_dispute', required: Where the vehicle stands on money collected. `no_payments` also covers a vehicle whose status is not set yet.
      - `paid` number, required: Total the buyer has paid, USD.
      - `balance` number, required: Outstanding buyer balance, USD.
      - `receipt` Receipt, nullable, required
        - `grand_total` number, required
        - `vehicles` object[], required
          - `label` string, required
          - `amount` number, required
          - `specs` object[], required
            - `label` string, required
            - `amount` number, required
          - `discounts` object[], required
            - `label` string, required
            - `amount` number, required
        - `pga` object[], required: Parts, garments, and accessories (PG&A).
          - `label` string, required
          - `amount` number, required
        - `taxes` object[], required
          - `label` string, required
          - `amount` number, required
        - `fees` object[], required
          - `label` string, required
          - `amount` number, required
      - `transactions` unknown[], required: Declared for forward compatibility; always empty in this version.
        - unknown
    - `payouts` Payouts: The caller's own payouts. Present only via `?expand[]=payouts`, and requires `payouts:read`.
      - `paid` number, required: Total paid to the caller's account, USD.
      - `balance` number, required: Outstanding payout balance, USD.
      - `summary` PayoutSummary, required
        - `total_expected_buyer_payment` number, required
        - `ekho_deductions` object, required
          - `total` number, required
          - `items` object[], required
            - `service` string, required
            - `amount` number, required
        - `other_deductions` object, required
          - `total` number, required
          - `items` object[], required
            - `service` string, required
            - `amount` number, required
        - `lender_incentives` object, required
          - `total` number, required
          - `items` object[], required
            - `service` string, required
            - `amount` number, required
        - `net_credits_deducted` number, required: A credit count, not an amount; excluded from the net.
        - `net_total_expected` number, required
    - `metadata` object, required: Free-form metadata carried on the vehicle, including whatever was attached at cart creation. Published exactly as written, so objects and arrays round-trip with their structure intact. Always present, empty when unset.

## Other responses

- `400`: The request was malformed or failed validation. `errors` itemizes every field at fault, so one response names them all; the fields in the example stand in for this request's own.
- `401`: Authentication is missing or invalid.
- `403`: The token lacks `orders:write`.
- `404`: No vehicle matches that id under that order.
- `409`: The action item is not completable in the vehicle's current state.
- `429`: The rate limit has been exceeded.
- `500`: An unexpected error occurred.

## Changes

- **2026-10-20** `819b111dc3bc`: 1 breaking
  - the `data/buyer/consents/items/occurred_at` response's property type changed from `string` to `integer` for status `200`
- **2026-10-19** `87f98453866f`: 1 info
  - added the required property `data/buyer/consents` to the response with the `200` status
- **2026-09-18** `78c545d96a34`: 21 warning
  - added the new `external_id_in_use` enum value to the `code` response property for the response status `400`
  - added the new `external_id_in_use` enum value to the `code` response property for the response status `401`
  - added the new `external_id_in_use` enum value to the `code` response property for the response status `403`
  - added the new `external_id_in_use` enum value to the `code` response property for the response status `404`
  - …17 more

[Operation history](https://skmtc.dev/ekho/apis/ekho-api/changes/orders/:order/vehicles/:vehicle/action-items/:action/post.md)

---

[API](https://skmtc.dev/ekho/apis/ekho-api.md) · [All operations](https://skmtc.dev/ekho/apis/ekho-api/llms.txt) · [OpenAPI document](https://skmtc.dev/ekho/apis/ekho-api/revisions/efe485119dd7?raw)
