MVMNT Locations API

Location management operations

OpenAPI Specification

mvmnt-locations-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: MVMNT Bill Payments Locations API
  version: 1.0.0
  description: "The MVMNT API enables you to automate freight brokerage workflows by integrating\ndirectly with our Transportation Management System.\n\n## Authentication\n\nOAuth 2.0 client credentials flow. See [Authentication Guide](/getting-started/authentication)\nfor details.\n\n### Token Endpoint\n\n```\nPOST https://api.mvmnt.io/oauth2/token\n```\n\n#### Request\n\n**Headers:**\n```http\nContent-Type: application/x-www-form-urlencoded\n```\n\n**Body Parameters:**\n```\ngrant_type=client_credentials\nclient_id=YOUR_CLIENT_ID\nclient_secret=YOUR_CLIENT_SECRET\n```\n\n#### Example Request\n\n```bash\ncurl -X POST https://api.mvmnt.io/oauth2/token \\\n  -H \"Content-Type: application/x-www-form-urlencoded\" \\\n  -d \"grant_type=client_credentials\" \\\n  -d \"client_id=YOUR_CLIENT_ID\" \\\n  -d \"client_secret=YOUR_CLIENT_SECRET\"\n```\n\n#### Success Response\n\n**Status:** `200 OK`\n\n```json\n{\n  \"access_token\": \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\",\n  \"token_type\": \"Bearer\",\n  \"expires_in\": 3600\n}\n```\n\n**Response Fields:**\n- `access_token`: JWT Bearer token to use for API requests\n- `token_type`: Always `Bearer`\n- `expires_in`: Token lifetime in seconds (3600 = 1 hour)\n"
  contact:
    name: MVMNT Support
    email: support@mvmnt.io
    url: https://docs.mvmnt.io
  license:
    name: Proprietary
    url: https://mvmnt.io/legal/terms
  x-parsed-md-description:
    result:
    - $$mdtype: Node
      errors: []
      lines:
      - 0
      - 2
      inline: false
      attributes: {}
      children:
      - $$mdtype: Node
        errors: []
        lines:
        - 0
        - 2
        inline: false
        attributes: {}
        children:
        - $$mdtype: Node
          errors: []
          lines:
          - 0
          - 2
          inline: true
          attributes:
            content: The MVMNT API enables you to automate freight brokerage workflows by integrating
          children: []
          type: text
          annotations: []
          slots: {}
        - $$mdtype: Node
          errors: []
          lines:
          - 0
          - 2
          inline: true
          attributes: {}
          children: []
          type: softbreak
          annotations: []
          slots: {}
        - $$mdtype: Node
          errors: []
          lines:
          - 0
          - 2
          inline: true
          attributes:
            content: directly with our Transportation Management System.
          children: []
          type: text
          annotations: []
          slots: {}
        type: inline
        annotations: []
        slots: {}
      type: paragraph
      annotations: []
      slots: {}
    - $$mdtype: Node
      errors: []
      lines:
      - 3
      - 4
      inline: false
      attributes:
        level: 2
      children:
      - $$mdtype: Node
        errors: []
        lines:
        - 3
        - 4
        inline: false
        attributes: {}
        children:
        - $$mdtype: Node
          errors: []
          lines:
          - 3
          - 4
          inline: true
          attributes:
            content: Authentication
          children: []
          type: text
          annotations: []
          slots: {}
        type: inline
        annotations: []
        slots: {}
      type: heading
      annotations: []
      slots: {}
    - $$mdtype: Node
      errors: []
      lines:
      - 5
      - 6
      inline: false
      attributes: {}
      children:
      - $$mdtype: Node
        errors: []
        lines:
        - 5
        - 6
        inline: false
        attributes: {}
        children:
        - $$mdtype: Node
          errors: []
          lines:
          - 5
          - 6
          inline: true
          attributes:
            content: 'OAuth 2.0 client credentials flow. See '
          children: []
          type: text
          annotations: []
          slots: {}
        - $$mdtype: Node
          errors: []
          lines:
          - 5
          - 6
          inline: true
          attributes:
            href: /getting-started/authentication
          children:
          - $$mdtype: Node
            errors: []
            lines:
            - 5
            - 6
            inline: true
            attributes:
              content: Authentication Guide
            children: []
            type: text
            annotations: []
            slots: {}
          type: link
          annotations: []
          slots: {}
          redocly:::linkOriginal:href: /getting-started/authentication
        - $$mdtype: Node
          errors: []
          lines:
          - 5
          - 6
          inline: true
          attributes:
            content: ' for details.'
          children: []
          type: text
          annotations: []
          slots: {}
        type: inline
        annotations: []
        slots: {}
      type: paragraph
      annotations: []
      slots: {}
servers:
- url: https://api.mvmnt.io/v1
  description: Production
security:
- BearerAuth: []
tags:
- name: Locations
  description: Location management operations
paths:
  /locations/filter:
    post:
      tags:
      - Locations
      summary: Filter locations
      description: 'Query locations using flexible filter criteria with AND/OR logic.


        By default, only non-deleted locations are returned (deletedAt: { isNull: true }).

        Override this by explicitly setting deletedAt filter criteria.

        '
      operationId: filterLocations
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LocationFilterRequest'
      responses:
        '200':
          description: Filtered locations with pagination
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                - pageInfo
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Location'
                  pageInfo:
                    $ref: '#/components/schemas/PaginationInfo'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /locations:
    post:
      tags:
      - Locations
      summary: Create a new location
      description: 'Create a new location for a customer.


        Locations represent pickup or delivery points (warehouses, distribution centers, etc.).

        '
      operationId: createLocation
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LocationInput'
            examples:
              warehouse:
                summary: Warehouse location
                value:
                  customerId: 550e8400-e29b-41d4-a716-446655440000
                  name: ABC Warehouse - Dallas
                  key: ERP-LOC-DALLAS-01
                  type: SHIPPER
                  isAppointmentRequired: true
                  notes: Call 24 hours ahead for appointment
              distribution_center:
                summary: Distribution center
                value:
                  customerId: 550e8400-e29b-41d4-a716-446655440000
                  name: XYZ Distribution Center
                  type: BOTH
                  isAppointmentRequired: false
      responses:
        '201':
          description: Location created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Location'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '409':
          $ref: '#/components/responses/ConflictError'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /locations/{id}:
    get:
      tags:
      - Locations
      summary: Get a location by ID
      description: 'Retrieve a single location by its unique identifier.

        '
      operationId: getLocationById
      parameters:
      - $ref: '#/components/parameters/IdOrClientKey'
      responses:
        '200':
          description: Location found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Location'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'
    patch:
      tags:
      - Locations
      summary: Update a location
      description: 'Partially update a location. Only provided fields will be updated.


        - **Omitted fields**: Not modified (current value preserved)

        - **Provided fields**: Updated to the new value

        - **Null values**: Clear the field (set to null) where applicable

        '
      operationId: updateLocation
      parameters:
      - $ref: '#/components/parameters/IdOrClientKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LocationPatch'
            examples:
              updateNotes:
                summary: Update notes
                value:
                  notes: Updated appointment requirements
              updateType:
                summary: Update location type
                value:
                  type: BOTH
      responses:
        '200':
          description: Location updated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Location'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '409':
          $ref: '#/components/responses/ConflictError'
        '500':
          $ref: '#/components/responses/InternalServerError'
    delete:
      tags:
      - Locations
      summary: Delete a location
      description: 'Soft delete a location (sets deletedAt timestamp).


        The location will no longer appear in default queries but can be retrieved

        by explicitly filtering for deleted records.

        '
      operationId: deleteLocation
      parameters:
      - $ref: '#/components/parameters/IdOrClientKey'
      responses:
        '204':
          description: Location deleted successfully
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /locations/search:
    post:
      summary: Search locations
      description: 'Search locations using OpenSearch-powered full-text and field-specific search.


        This endpoint provides fast, indexed search across location data with support for:

        - Full-text search across multiple fields

        - Field-specific filtering with various operators

        - Geographic search capabilities

        - Sorting and pagination

        - Saved search preferences


        **Note:** Only active (non-deleted) locations are searchable. Soft-deleted records are automatically excluded from all search results.


        **Response Formats:**

        - `flat` (default): Returns indexed fields only for faster performance

        - `full`: Returns complete location objects with all relationships

        '
      operationId: searchLocations
      tags:
      - Locations
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LocationSearchRequest'
      responses:
        '200':
          description: Successful search results
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationSearchResponse'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '422':
          $ref: '#/components/responses/ValidationError'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
components:
  schemas:
    CustomerTransportationMode:
      type: string
      enum:
      - FTL
      - LTL
      - AIR
      - OCEAN
      - RAIL
      - INTERMODAL
      - DRAYAGE
      - EXPEDITED_GROUND
      - EXPEDITED_AIR
      - AUTO
      - PTL
      description: Transportation mode type
    ContactInfo:
      type: object
      description: 'Contact information details (nested, without id).


        This is an embedded object representing a Contact record. The id is managed

        internally and not exposed in the API.

        '
      required:
      - name
      properties:
        name:
          type: string
          description: Contact person's full name
          example: John Smith
        email:
          type:
          - string
          - 'null'
          format: email
          description: Email address
          example: john.smith@example.com
        phoneNumber:
          type:
          - string
          - 'null'
          description: Phone number
          example: +1-555-0100
        title:
          type:
          - string
          - 'null'
          description: Job title or position
          example: Operations Manager
    LocationSearchRow:
      type: object
      description: 'Flattened location data from search index.

        Note: This represents only active locations. Soft-deleted records are never returned.

        '
      properties:
        object:
          type: string
          enum:
          - LOCATION_SEARCH_ROW
          description: Object type identifier for discriminating between flat and full response formats
        id:
          type: string
          format: uuid
        customerId:
          type: string
          format: uuid
          description: Customer ID (maps from shipperProfileId)
        customerName:
          type: string
          description: Customer name (maps from shipperProfileName)
        customerFriendlyId:
          type: string
          description: Customer company ID (maps from shipperProfileFriendlyId)
        type:
          type: string
          enum:
          - SHIPPER
          - RECEIVER
          - BOTH
          description: Location type
        name:
          type: string
          description: Location name
        externalId:
          type:
          - string
          - 'null'
          description: External reference ID
        line1:
          type:
          - string
          - 'null'
        line2:
          type:
          - string
          - 'null'
        city:
          type:
          - string
          - 'null'
        state:
          type:
          - string
          - 'null'
        postalCode:
          type:
          - string
          - 'null'
        country:
          type:
          - string
          - 'null'
        market:
          type:
          - string
          - 'null'
          description: DAT market
        zone:
          type:
          - string
          - 'null'
          description: DAT zone
        point:
          type:
          - object
          - 'null'
          properties:
            lat:
              type: number
              format: float
            lon:
              type: number
              format: float
          description: Geographic coordinates
        phoneNumber:
          type:
          - string
          - 'null'
          description: Primary contact phone
        appointmentRequired:
          type:
          - boolean
          - 'null'
          description: Whether appointments are required (maps from apptReq)
        stopsCount:
          type:
          - integer
          - 'null'
          description: Number of stops
        createdAt:
          type: string
          format: date-time
      required:
      - object
      - id
      - customerId
      - customerName
      - name
      - createdAt
    ShowNotes:
      type: string
      enum:
      - ALL
      - SPLIT
      description: 'Controls whether external notes are shown on all documents or split from carrier-facing notes.

        - `ALL`: Use external notes on customer-facing and carrier-facing documents

        - `SPLIT`: Use external notes on customer-facing documents and carrier notes on carrier-facing documents

        '
    CustomerAnnualSpend:
      type: string
      enum:
      - _0_TO_25K
      - _25_TO_150K
      - _150K_TO_300K
      - _300K_TO_1M
      - _1_TO_5M
      - _5M_TO_25M
      - _25M_TO_75M
      - _75M_PLUS
      description: Annual freight spend estimate range
    CustomerServiceTier:
      type: string
      enum:
      - TIER_1
      - TIER_2
      - TIER_3
      description: Service tier level for the customer
    DatetimeSearchCriteria:
      type: object
      required:
      - operator
      description: 'Search criteria for datetime fields.

        Supports both absolute datetime values and relative time expressions.

        '
      properties:
        operator:
          type: string
          enum:
          - EQUALS
          - NOT_EQUALS
          - BEFORE
          - AFTER
          - BETWEEN
          - NOT_BETWEEN
          - EXISTS
          - DOES_NOT_EXIST
          description: 'Search operator:

            - `EQUALS`: Exact match

            - `NOT_EQUALS`: Not equal to

            - `BEFORE`: Before datetime

            - `AFTER`: After datetime

            - `BETWEEN`: Between min and max (inclusive)

            - `NOT_BETWEEN`: Not between min and max

            - `EXISTS`: Field has a value (not null)

            - `DOES_NOT_EXIST`: Field is null

            '
        value:
          type: string
          format: date-time
          description: Absolute datetime for EQUALS, NOT_EQUALS
          example: '2025-01-15T10:00:00Z'
        min:
          type: string
          format: date-time
          description: Minimum datetime for BETWEEN or NOT_BETWEEN
          example: '2025-01-01T00:00:00Z'
        max:
          type: string
          format: date-time
          description: Maximum datetime for BETWEEN or NOT_BETWEEN
          example: '2025-12-31T23:59:59Z'
        valueRelative:
          type: integer
          description: 'Relative time from now (negative for past, positive for future).

            Example: -7 with WEEK unit means 7 weeks ago.

            '
        valueRelativeUnit:
          $ref: '#/components/schemas/RelativeTimeUnit'
        minRelative:
          type: integer
          description: Relative time for min boundary
        minRelativeUnit:
          $ref: '#/components/schemas/RelativeTimeUnit'
        maxRelative:
          type: integer
          description: Relative time for max boundary
        maxRelativeUnit:
          $ref: '#/components/schemas/RelativeTimeUnit'
      example:
        operator: AFTER
        value: '2025-01-01T00:00:00Z'
    TextSearchCriteria:
      type: object
      required:
      - operator
      description: Search criteria for text fields (supports wildcards and partial matching)
      properties:
        operator:
          type: string
          enum:
          - EQUALS
          - NOT_EQUALS
          - STARTS_WITH
          - ENDS_WITH
          - INCLUDES
          - ONE_OF
          - NOT_ONE_OF
          - EXISTS
          - DOES_NOT_EXIST
          description: 'Search operator:

            - `EQUALS`: Exact match

            - `NOT_EQUALS`: Not equal to

            - `STARTS_WITH`: Begins with prefix

            - `ENDS_WITH`: Ends with suffix

            - `INCLUDES`: Contains substring

            - `ONE_OF`: Matches any value in array

            - `NOT_ONE_OF`: Does not match any value in array

            - `EXISTS`: Field has a value (not null)

            - `DOES_NOT_EXIST`: Field is null

            '
        values:
          type: array
          items:
            type: string
          description: Array of values for ONE_OF or NOT_ONE_OF operators
          example:
          - value1
          - value2
      example:
        operator: INCLUDES
        values:
        - search term
    ValidationError:
      type: object
      required:
      - error
      - message
      - details
      properties:
        error:
          type: string
          description: Error code
          example: validation_error
        message:
          type: string
          description: Human-readable error message
        details:
          type: array
          description: Validation error details
          items:
            type: object
            required:
            - field
            - message
            properties:
              field:
                type: string
                description: Field name that failed validation
              message:
                type: string
                description: Validation error message
    Address:
      type: object
      description: 'Physical address/location details (nested, without id).


        This is an embedded object representing a Location record. The id is managed

        internally and not exposed in the API.

        '
      required:
      - line1
      - city
      - country
      - market
      - isAirportOrAirbase
      - isConstructionOrUtilitySite
      - isSmartyValidated
      - obeysDst
      properties:
        line1:
          type: string
          description: Primary street address line
          example: 123 Main St
        line2:
          type:
          - string
          - 'null'
          description: Secondary address line (suite, floor, etc.)
          example: Suite 400
        city:
          type: string
          description: City name
          example: Chicago
        country:
          type: string
          description: Country name or code
          example: USA
        market:
          type: string
          description: Market or region identifier
          example: CHI
        latitude:
          type:
          - string
          - 'null'
          description: Latitude coordinate
          example: '41.8781'
        longitude:
          type:
          - string
          - 'null'
          description: Longitude coordinate
          example: '-87.6298'
        isAirportOrAirbase:
          type: boolean
          description: Whether this location is an airport or airbase
          example: false
        isConstructionOrUtilitySite:
          type: boolean
          description: Whether this location is a construction or utility site
          example: false
        isSmartyValidated:
          type: boolean
          description: Whether address has been validated by SmartyStreets
          example: true
        obeysDst:
          type: boolean
          description: Whether this location observes daylight saving time
          example: true
        cityId:
          type:
          - string
          - 'null'
          format: uuid
          description: Reference to standardized city record (internal use)
          example: null
    Error:
      type: object
      required:
      - error
      - message
      properties:
        error:
          type: string
          description: Error code
        message:
          type: string
          description: Human-readable error message
    LocationFilterRequest:
      type: object
      description: Request body for filtering locations
      properties:
        filter:
          $ref: '#/components/schemas/LocationFilter'
          description: 'Filter criteria (optional - omit to return all locations).


            Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden.

            '
        pageSize:
          type: integer
          minimum: 1
          maximum: 250
          default: 50
          description: Number of results per page
        cursor:
          type: string
          description: Pagination cursor for next page
      example:
        filter:
          and:
          - customerId:
              equalTo: 550e8400-e29b-41d4-a716-446655440000
          - type:
              equalTo: SHIPPER
        pageSize: 50
    KeywordSearchCriteria:
      type: object
      required:
      - operator
      description: Search criteria for keyword fields (exact match, no partial matching)
      properties:
        operator:
          type: string
          enum:
          - EQUALS
          - NOT_EQUALS
          - ONE_OF
          - NOT_ONE_OF
          - EXISTS
          - DOES_NOT_EXIST
          description: 'Search operator:

            - `EQUALS`: Exact match

            - `NOT_EQUALS`: Not equal to

            - `ONE_OF`: Matches any value in array

            - `NOT_ONE_OF`: Does not match any value in array

            - `EXISTS`: Field has a value (not null)

            - `DOES_NOT_EXIST`: Field is null

            '
        values:
          type: array
          items:
            type: string
          description: Array of values for ONE_OF or NOT_ONE_OF operators
          example:
          - ACTIVE
          - PENDING
      example:
        operator: ONE_OF
        values:
        - ACTIVE
        - PENDING
    ClientKeyFilter:
      type: object
      description: Filter options for client key fields (limited operations - exact match only)
      properties:
        equalTo:
          type: string
          description: Exact match
        in:
          type: array
          description: Matches any value in the array
          items:
            type: string
        isNull:
          type: boolean
          description: Field is null (true) or not null (false)
    SearchPaginationInput:
      type: object
      description: Pagination options for search requests
      properties:
        pageNumber:
          type: integer
          minimum: 1
          default: 1
          description: Page number (1-based)
          example: 1
        pageSize:
          type: integer
          minimum: 1
          maximum: 250
          default: 50
          description: Number of results per page (max 250)
          example: 50
      example:
        pageNumber: 1
        pageSize: 50
    BooleanFilter:
      type: object
      description: Filter options for boolean fields
      properties:
        equalTo:
          type: boolean
          description: Exact match
        notEqualTo:
          type: boolean
          description: Not equal to
        isNull:
          type: boolean
          description: Field is null (true) or not null (false)
    CustomerCurrency:
      type: string
      enum:
      - USD
      - CAD
      - MXN
      - EUR
      - GBP
      - JPY
      - CNY
      - AUD
      - BRL
      - INR
      - KRW
      - RUB
      - SAR
      - TRY
      - IDR
      - ARS
      - ZAR
      description: Preferred currency for transactions
    IntSearchCriteria:
      type: object
      required:
      - operator
      description: Search criteria for integer fields
      properties:
        operator:
          type: string
          enum:
          - EQUALS
          - NOT_EQUALS
          - GREATER_THAN
          - LESS_THAN
          - BETWEEN
          - NOT_BETWEEN
          - EXISTS
          - DOES_NOT_EXIST
          description: 'Search operator:

            - `EQUALS`: Exact match

            - `NOT_EQUALS`: Not equal to

            - `GREATER_THAN`: Greater than value

            - `LESS_THAN`: Less than value

            - `BETWEEN`: Between min and max (inclusive)

            - `NOT_BETWEEN`: Not between min and max

            - `EXISTS`: Field has a value (not null)

            - `DOES_NOT_EXIST`: Field is null

            '
        value:
          type: integer
          description: Single value for EQUALS, NOT_EQUALS, GREATER_THAN, LESS_THAN
        min:
          type: integer
          description: Minimum value for BETWEEN or NOT_BETWEEN
        max:
          type: integer
          description: Maximum value for BETWEEN or NOT_BETWEEN
      example:
        operator: BETWEEN
        min: 10
        max: 100
    BooleanSearchCriteria:
      type: object
      required:
      - operator
      description: Search criteria for boolean fields
      properties:
        operator:
          type: string
          enum:
          - 'TRUE'
          - 'FALSE'
          description: 'Search operator:

            - `TRUE`: Field is true

            - `FALSE`: Field is false

            '
      example:
        operator: 'TRUE'
    PaginationInfo:
      type: object
      required:
      - pageSize
      - hasNextPage
      properties:
        pageSize:
          type: integer
          description: Number of items per page
          example: 50
        hasNextPage:
          type: boolean
          description: Whether there are more pages
          example: true
        hasPreviousPage:
          type: boolean
          description: Whether there are previous pages
          example: false
        endCursor:
          type:
          - string
          - 'null'
          description: Cursor for the next page (null if no next page)
          example: eyJpZCI6IjU1MGU4NDAwLWUyOWItNDFkNC1hNzE2LTQ0NjY1NTQ0MDAwMCJ9
    CustomerAnnualRevenue:
      type: string
      enum:
      - _0_TO_500K
      - _500K_TO_3M
      - _3M_TO_10M
      - _10M_TO_25M
      - _25M_TO_50M
      - _50M_TO_100M
      - _100M_TO_500M
      - _500M_PLUS
      description: Annual revenue range
    Location:
      type: object
      required:
      - id
      - customerId
      - name
      - isAppointmentRequired
      - createdAt
      - updatedAt
      properties:
        object:
          type: string
          enum:
          - LOCATION
          readOnly: true
          description: Object type identifier
          example: LOCATION
        id:
          type: string
          format: uuid
          readOnly: true
          description: Unique location identifier
          example: 770e8400-e29b-41d4-a716-446655440000
        customerId:
          type: string
          format: uuid
          description: Customer (shipper profile) this location belongs to
          example: 550e8400-e29b-41d4-a716-446655440000
        customer:
          $ref: '#/components/schemas/Customer'
          readOnly: true
          description: The customer this location belongs to
        name:
          type: string
          description: Location name
          example: ABC Warehouse - Dallas
        key:
          type:
          - string
          - 'null'
          maxLength: 512
          description: Client-defined reference identifier for this location
          example: ERP-LOC-DALLAS-01
        type:
          $ref: '#/components/schemas/LocationType'
          description: Type of location (SHIPPER, RECEIVER, or BOTH)
          example: SHIPPER
        isAppointmentRequired:
          type: boolean
          description: Whether appointments are required for this location
          example: true
        notes:
          type:
          - string
          - 'null'
          description: External notes visible to carriers
          example: Call 24 hours ahead for appointment
        internalNotes:
          type:
          - string
          - 'null'
          description: Internal notes (not visible to carriers)
          example: Use dock door 5 for expedited shipments
        contacts:
          type: array
          description: Contacts for this location
          items:
            $ref: '#/components/schemas/LocationContactReference'
        createdAt:
          type: string
          format: date-time
          readOnly: true
          description: Timestamp when location was created
          example: '2025-01-15T10:00:00Z'
        updatedAt:
          type: string
          format: date-time
          readOnly: true
          description: Timestamp when location was last updated
          example: '2025-01-15T14:30:00Z'
        deletedAt:
          type:
          - string
          - 'null'
          format: date-time
          readOnly: true
          description: Timestamp when l

# --- truncated at 32 KB (101 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/mvmnt/refs/heads/main/openapi/mvmnt-locations-api-openapi.yml